{"diffoscope-json-version": 1, "source1": "/srv/reproducible-results/rbuild-debian/r-b-build.yePQOmFW/b1/dune-istl_2.10.0-1_amd64.changes", "source2": "/srv/reproducible-results/rbuild-debian/r-b-build.yePQOmFW/b2/dune-istl_2.10.0-1_amd64.changes", "unified_diff": null, "details": [{"source1": "Files", "source2": "Files", "unified_diff": "@@ -1,3 +1,3 @@\n \n c3849c75e93dbec85d0e272d1b707679 218528 libdevel optional libdune-istl-dev_2.10.0-1_amd64.deb\n- 0e20c6709fad65022a4bfe4dac069382 3926140 doc optional libdune-istl-doc_2.10.0-1_all.deb\n+ dd0c0d1916eff2822ae13e3598f8788b 3928240 doc optional libdune-istl-doc_2.10.0-1_all.deb\n"}, {"source1": "libdune-istl-doc_2.10.0-1_all.deb", "source2": "libdune-istl-doc_2.10.0-1_all.deb", "unified_diff": null, "details": [{"source1": "file list", "source2": "file list", "unified_diff": "@@ -1,3 +1,3 @@\n -rw-r--r-- 0 0 0 4 2024-11-14 17:49:43.000000 debian-binary\n--rw-r--r-- 0 0 0 27252 2024-11-14 17:49:43.000000 control.tar.xz\n--rw-r--r-- 0 0 0 3898696 2024-11-14 17:49:43.000000 data.tar.xz\n+-rw-r--r-- 0 0 0 27268 2024-11-14 17:49:43.000000 control.tar.xz\n+-rw-r--r-- 0 0 0 3900780 2024-11-14 17:49:43.000000 data.tar.xz\n"}, {"source1": "control.tar.xz", "source2": "control.tar.xz", "unified_diff": null, "details": [{"source1": "control.tar", "source2": "control.tar", "unified_diff": null, "details": [{"source1": "./md5sums", "source2": "./md5sums", "unified_diff": null, "details": [{"source1": "./md5sums", "source2": "./md5sums", "comments": ["Files differ"], "unified_diff": null}]}]}]}, {"source1": "data.tar.xz", "source2": "data.tar.xz", "unified_diff": null, "details": [{"source1": "data.tar", "source2": "data.tar", "unified_diff": null, "details": [{"source1": "file list", "source2": "file list", "unified_diff": "@@ -5,164 +5,164 @@\n drwxr-xr-x 0 root (0) root (0) 0 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/\n -rw-r--r-- 0 root (0) root (0) 1418 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/changelog.Debian.gz\n -rw-r--r-- 0 root (0) root (0) 4857 2024-10-23 08:25:03.000000 ./usr/share/doc/libdune-istl-doc/changelog.gz\n -rw-r--r-- 0 root (0) root (0) 3254 2023-01-12 15:07:31.000000 ./usr/share/doc/libdune-istl-doc/copyright\n drwxr-xr-x 0 root (0) root (0) 0 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/\n -rw-r--r-- 0 root (0) root (0) 3040 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00002.html\n -rw-r--r-- 0 root (0) root (0) 3038 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00005.html\n--rw-r--r-- 0 root (0) root (0) 10513 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00008.html\n--rw-r--r-- 0 root (0) root (0) 147915 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00008_source.html\n--rw-r--r-- 0 root (0) root (0) 7149 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00011.html\n--rw-r--r-- 0 root (0) root (0) 57750 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00011_source.html\n--rw-r--r-- 0 root (0) root (0) 9224 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00014.html\n--rw-r--r-- 0 root (0) root (0) 74486 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00014_source.html\n--rw-r--r-- 0 root (0) root (0) 33563 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00017.html\n--rw-r--r-- 0 root (0) root (0) 145688 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00017_source.html\n--rw-r--r-- 0 root (0) root (0) 18633 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00020.html\n--rw-r--r-- 0 root (0) root (0) 131214 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00020_source.html\n--rw-r--r-- 0 root (0) root (0) 6810 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00023.html\n--rw-r--r-- 0 root (0) root (0) 74340 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00023_source.html\n--rw-r--r-- 0 root (0) root (0) 4549 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00026.html\n--rw-r--r-- 0 root (0) root (0) 55275 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00026_source.html\n--rw-r--r-- 0 root (0) root (0) 16525 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00029.html\n--rw-r--r-- 0 root (0) root (0) 174385 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00029_source.html\n--rw-r--r-- 0 root (0) root (0) 7795 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00032.html\n--rw-r--r-- 0 root (0) root (0) 34252 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00032_source.html\n--rw-r--r-- 0 root (0) root (0) 4384 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00035.html\n--rw-r--r-- 0 root (0) root (0) 18369 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00035_source.html\n--rw-r--r-- 0 root (0) root (0) 12156 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00038.html\n--rw-r--r-- 0 root (0) root (0) 21371 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00038_source.html\n--rw-r--r-- 0 root (0) root (0) 9765 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00041.html\n--rw-r--r-- 0 root (0) root (0) 42294 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00041_source.html\n--rw-r--r-- 0 root (0) root (0) 9092 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00044.html\n--rw-r--r-- 0 root (0) root (0) 159845 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00044_source.html\n--rw-r--r-- 0 root (0) root (0) 7690 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00047.html\n--rw-r--r-- 0 root (0) root (0) 219591 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00047_source.html\n--rw-r--r-- 0 root (0) root (0) 6498 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00050.html\n--rw-r--r-- 0 root (0) root (0) 44113 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00050_source.html\n--rw-r--r-- 0 root (0) root (0) 6449 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00053.html\n--rw-r--r-- 0 root (0) root (0) 23236 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00053_source.html\n--rw-r--r-- 0 root (0) root (0) 4921 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00056.html\n--rw-r--r-- 0 root (0) root (0) 14274 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00056_source.html\n--rw-r--r-- 0 root (0) root (0) 6798 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00059.html\n--rw-r--r-- 0 root (0) root (0) 11405 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00059_source.html\n--rw-r--r-- 0 root (0) root (0) 13202 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00062.html\n--rw-r--r-- 0 root (0) root (0) 131099 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00062_source.html\n--rw-r--r-- 0 root (0) root (0) 7349 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00065.html\n--rw-r--r-- 0 root (0) root (0) 90025 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00065_source.html\n--rw-r--r-- 0 root (0) root (0) 12507 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00068.html\n--rw-r--r-- 0 root (0) root (0) 121273 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00068_source.html\n--rw-r--r-- 0 root (0) root (0) 8890 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00071.html\n--rw-r--r-- 0 root (0) root (0) 416273 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00071_source.html\n--rw-r--r-- 0 root (0) root (0) 17509 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00074.html\n--rw-r--r-- 0 root (0) root (0) 315402 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00074_source.html\n--rw-r--r-- 0 root (0) root (0) 7083 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00077.html\n--rw-r--r-- 0 root (0) root (0) 14006 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00077_source.html\n--rw-r--r-- 0 root (0) root (0) 4840 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00080.html\n--rw-r--r-- 0 root (0) root (0) 15098 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00080_source.html\n--rw-r--r-- 0 root (0) root (0) 8770 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00083.html\n--rw-r--r-- 0 root (0) root (0) 72546 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00083_source.html\n--rw-r--r-- 0 root (0) root (0) 5869 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00086.html\n--rw-r--r-- 0 root (0) root (0) 20988 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00086_source.html\n--rw-r--r-- 0 root (0) root (0) 8900 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00089.html\n--rw-r--r-- 0 root (0) root (0) 47365 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00089_source.html\n--rw-r--r-- 0 root (0) root (0) 7253 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00092.html\n--rw-r--r-- 0 root (0) root (0) 76536 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00092_source.html\n--rw-r--r-- 0 root (0) root (0) 6664 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00095.html\n--rw-r--r-- 0 root (0) root (0) 52580 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00095_source.html\n--rw-r--r-- 0 root (0) root (0) 5436 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00098.html\n--rw-r--r-- 0 root (0) root (0) 14293 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00098_source.html\n--rw-r--r-- 0 root (0) root (0) 10969 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00101.html\n--rw-r--r-- 0 root (0) root (0) 187632 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00101_source.html\n--rw-r--r-- 0 root (0) root (0) 18718 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00104.html\n--rw-r--r-- 0 root (0) root (0) 208522 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00104_source.html\n--rw-r--r-- 0 root (0) root (0) 5185 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00107.html\n--rw-r--r-- 0 root (0) root (0) 22057 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00107_source.html\n--rw-r--r-- 0 root (0) root (0) 15752 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00110.html\n--rw-r--r-- 0 root (0) root (0) 410561 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00110_source.html\n--rw-r--r-- 0 root (0) root (0) 13572 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00113.html\n--rw-r--r-- 0 root (0) root (0) 345511 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00113_source.html\n--rw-r--r-- 0 root (0) root (0) 9428 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00116.html\n--rw-r--r-- 0 root (0) root (0) 133061 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00116_source.html\n--rw-r--r-- 0 root (0) root (0) 6561 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00119.html\n--rw-r--r-- 0 root (0) root (0) 69283 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00119_source.html\n--rw-r--r-- 0 root (0) root (0) 5396 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00122.html\n--rw-r--r-- 0 root (0) root (0) 29427 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00122_source.html\n--rw-r--r-- 0 root (0) root (0) 8179 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00125.html\n--rw-r--r-- 0 root (0) root (0) 124664 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00125_source.html\n--rw-r--r-- 0 root (0) root (0) 5678 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00128.html\n--rw-r--r-- 0 root (0) root (0) 30671 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00128_source.html\n--rw-r--r-- 0 root (0) root (0) 7519 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00131.html\n--rw-r--r-- 0 root (0) root (0) 98130 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00131_source.html\n--rw-r--r-- 0 root (0) root (0) 6347 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00134.html\n--rw-r--r-- 0 root (0) root (0) 17312 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00134_source.html\n--rw-r--r-- 0 root (0) root (0) 7900 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00137.html\n--rw-r--r-- 0 root (0) root (0) 66197 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00137_source.html\n--rw-r--r-- 0 root (0) root (0) 6402 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00140.html\n--rw-r--r-- 0 root (0) root (0) 65780 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00140_source.html\n--rw-r--r-- 0 root (0) root (0) 9508 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00143.html\n--rw-r--r-- 0 root (0) root (0) 87699 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00143_source.html\n--rw-r--r-- 0 root (0) root (0) 9427 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00146.html\n--rw-r--r-- 0 root (0) root (0) 237782 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00146_source.html\n--rw-r--r-- 0 root (0) root (0) 4929 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00149.html\n--rw-r--r-- 0 root (0) root (0) 36955 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00149_source.html\n--rw-r--r-- 0 root (0) root (0) 10104 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00152.html\n--rw-r--r-- 0 root (0) root (0) 125204 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00152_source.html\n--rw-r--r-- 0 root (0) root (0) 4753 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00155.html\n--rw-r--r-- 0 root (0) root (0) 24274 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00155_source.html\n--rw-r--r-- 0 root (0) root (0) 19505 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00158.html\n--rw-r--r-- 0 root (0) root (0) 312900 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00158_source.html\n--rw-r--r-- 0 root (0) root (0) 8601 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00161.html\n--rw-r--r-- 0 root (0) root (0) 40908 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00161_source.html\n--rw-r--r-- 0 root (0) root (0) 5569 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00164.html\n--rw-r--r-- 0 root (0) root (0) 35007 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00164_source.html\n--rw-r--r-- 0 root (0) root (0) 10169 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00167.html\n--rw-r--r-- 0 root (0) root (0) 12123 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00167_source.html\n--rw-r--r-- 0 root (0) root (0) 7777 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00170.html\n--rw-r--r-- 0 root (0) root (0) 17436 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00170_source.html\n--rw-r--r-- 0 root (0) root (0) 10120 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00173.html\n--rw-r--r-- 0 root (0) root (0) 108266 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00173_source.html\n--rw-r--r-- 0 root (0) root (0) 8726 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00176.html\n--rw-r--r-- 0 root (0) root (0) 34915 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00176_source.html\n--rw-r--r-- 0 root (0) root (0) 44338 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00179.html\n--rw-r--r-- 0 root (0) root (0) 253735 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00179_source.html\n--rw-r--r-- 0 root (0) root (0) 16829 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00182.html\n--rw-r--r-- 0 root (0) root (0) 47493 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00182_source.html\n--rw-r--r-- 0 root (0) root (0) 5596 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00185.html\n--rw-r--r-- 0 root (0) root (0) 43628 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00185_source.html\n--rw-r--r-- 0 root (0) root (0) 12194 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00188.html\n--rw-r--r-- 0 root (0) root (0) 79102 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00188_source.html\n--rw-r--r-- 0 root (0) root (0) 8190 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00191.html\n--rw-r--r-- 0 root (0) root (0) 62252 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00191_source.html\n--rw-r--r-- 0 root (0) root (0) 8609 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00194.html\n--rw-r--r-- 0 root (0) root (0) 79450 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00194_source.html\n--rw-r--r-- 0 root (0) root (0) 6623 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00197.html\n--rw-r--r-- 0 root (0) root (0) 33547 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00197_source.html\n--rw-r--r-- 0 root (0) root (0) 8584 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00200.html\n--rw-r--r-- 0 root (0) root (0) 75168 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00200_source.html\n--rw-r--r-- 0 root (0) root (0) 4543 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00203.html\n--rw-r--r-- 0 root (0) root (0) 53929 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00203_source.html\n--rw-r--r-- 0 root (0) root (0) 6296 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00206.html\n--rw-r--r-- 0 root (0) root (0) 101642 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00206_source.html\n--rw-r--r-- 0 root (0) root (0) 6043 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00209.html\n--rw-r--r-- 0 root (0) root (0) 113921 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00209_source.html\n--rw-r--r-- 0 root (0) root (0) 13275 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00212.html\n--rw-r--r-- 0 root (0) root (0) 299656 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00212_source.html\n--rw-r--r-- 0 root (0) root (0) 9761 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00215.html\n--rw-r--r-- 0 root (0) root (0) 132501 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00215_source.html\n--rw-r--r-- 0 root (0) root (0) 7563 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00218.html\n--rw-r--r-- 0 root (0) root (0) 139768 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00218_source.html\n--rw-r--r-- 0 root (0) root (0) 4949 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00221.html\n--rw-r--r-- 0 root (0) root (0) 9479 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00221_source.html\n--rw-r--r-- 0 root (0) root (0) 5929 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00224.html\n--rw-r--r-- 0 root (0) root (0) 162670 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00224_source.html\n--rw-r--r-- 0 root (0) root (0) 5445 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00227.html\n--rw-r--r-- 0 root (0) root (0) 165177 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00227_source.html\n--rw-r--r-- 0 root (0) root (0) 13396 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00230.html\n--rw-r--r-- 0 root (0) root (0) 185805 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00230_source.html\n+-rw-r--r-- 0 root (0) root (0) 18633 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00008.html\n+-rw-r--r-- 0 root (0) root (0) 131214 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00008_source.html\n+-rw-r--r-- 0 root (0) root (0) 8890 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00011.html\n+-rw-r--r-- 0 root (0) root (0) 416273 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00011_source.html\n+-rw-r--r-- 0 root (0) root (0) 6798 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00014.html\n+-rw-r--r-- 0 root (0) root (0) 11405 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00014_source.html\n+-rw-r--r-- 0 root (0) root (0) 10104 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00017.html\n+-rw-r--r-- 0 root (0) root (0) 125204 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00017_source.html\n+-rw-r--r-- 0 root (0) root (0) 8190 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00020.html\n+-rw-r--r-- 0 root (0) root (0) 62252 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00020_source.html\n+-rw-r--r-- 0 root (0) root (0) 9761 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00023.html\n+-rw-r--r-- 0 root (0) root (0) 132501 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00023_source.html\n+-rw-r--r-- 0 root (0) root (0) 9092 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00026.html\n+-rw-r--r-- 0 root (0) root (0) 159845 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00026_source.html\n+-rw-r--r-- 0 root (0) root (0) 13275 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00029.html\n+-rw-r--r-- 0 root (0) root (0) 299656 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00029_source.html\n+-rw-r--r-- 0 root (0) root (0) 12194 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00032.html\n+-rw-r--r-- 0 root (0) root (0) 79102 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00032_source.html\n+-rw-r--r-- 0 root (0) root (0) 12507 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00035.html\n+-rw-r--r-- 0 root (0) root (0) 121273 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00035_source.html\n+-rw-r--r-- 0 root (0) root (0) 6043 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00038.html\n+-rw-r--r-- 0 root (0) root (0) 113921 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00038_source.html\n+-rw-r--r-- 0 root (0) root (0) 7149 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00041.html\n+-rw-r--r-- 0 root (0) root (0) 57750 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00041_source.html\n+-rw-r--r-- 0 root (0) root (0) 4549 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00044.html\n+-rw-r--r-- 0 root (0) root (0) 55275 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00044_source.html\n+-rw-r--r-- 0 root (0) root (0) 10513 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00047.html\n+-rw-r--r-- 0 root (0) root (0) 147915 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00047_source.html\n+-rw-r--r-- 0 root (0) root (0) 7777 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00050.html\n+-rw-r--r-- 0 root (0) root (0) 17436 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00050_source.html\n+-rw-r--r-- 0 root (0) root (0) 10169 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00053.html\n+-rw-r--r-- 0 root (0) root (0) 12123 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00053_source.html\n+-rw-r--r-- 0 root (0) root (0) 8601 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00056.html\n+-rw-r--r-- 0 root (0) root (0) 40908 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00056_source.html\n+-rw-r--r-- 0 root (0) root (0) 19505 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00059.html\n+-rw-r--r-- 0 root (0) root (0) 312900 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00059_source.html\n+-rw-r--r-- 0 root (0) root (0) 4543 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00062.html\n+-rw-r--r-- 0 root (0) root (0) 53929 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00062_source.html\n+-rw-r--r-- 0 root (0) root (0) 9765 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00065.html\n+-rw-r--r-- 0 root (0) root (0) 42294 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00065_source.html\n+-rw-r--r-- 0 root (0) root (0) 17509 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00068.html\n+-rw-r--r-- 0 root (0) root (0) 315402 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00068_source.html\n+-rw-r--r-- 0 root (0) root (0) 16525 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00071.html\n+-rw-r--r-- 0 root (0) root (0) 174385 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00071_source.html\n+-rw-r--r-- 0 root (0) root (0) 7083 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00074.html\n+-rw-r--r-- 0 root (0) root (0) 14006 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00074_source.html\n+-rw-r--r-- 0 root (0) root (0) 8584 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00077.html\n+-rw-r--r-- 0 root (0) root (0) 75168 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00077_source.html\n+-rw-r--r-- 0 root (0) root (0) 7795 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00080.html\n+-rw-r--r-- 0 root (0) root (0) 34252 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00080_source.html\n+-rw-r--r-- 0 root (0) root (0) 4921 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00083.html\n+-rw-r--r-- 0 root (0) root (0) 14274 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00083_source.html\n+-rw-r--r-- 0 root (0) root (0) 16829 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00086.html\n+-rw-r--r-- 0 root (0) root (0) 47493 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00086_source.html\n+-rw-r--r-- 0 root (0) root (0) 4929 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00089.html\n+-rw-r--r-- 0 root (0) root (0) 36955 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00089_source.html\n+-rw-r--r-- 0 root (0) root (0) 6498 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00092.html\n+-rw-r--r-- 0 root (0) root (0) 44113 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00092_source.html\n+-rw-r--r-- 0 root (0) root (0) 4840 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00095.html\n+-rw-r--r-- 0 root (0) root (0) 15098 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00095_source.html\n+-rw-r--r-- 0 root (0) root (0) 33563 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00098.html\n+-rw-r--r-- 0 root (0) root (0) 145688 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00098_source.html\n+-rw-r--r-- 0 root (0) root (0) 6296 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00101.html\n+-rw-r--r-- 0 root (0) root (0) 101642 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00101_source.html\n+-rw-r--r-- 0 root (0) root (0) 7349 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00104.html\n+-rw-r--r-- 0 root (0) root (0) 90025 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00104_source.html\n+-rw-r--r-- 0 root (0) root (0) 6810 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00107.html\n+-rw-r--r-- 0 root (0) root (0) 74340 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00107_source.html\n+-rw-r--r-- 0 root (0) root (0) 7690 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00110.html\n+-rw-r--r-- 0 root (0) root (0) 219591 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00110_source.html\n+-rw-r--r-- 0 root (0) root (0) 6449 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00113.html\n+-rw-r--r-- 0 root (0) root (0) 23236 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00113_source.html\n+-rw-r--r-- 0 root (0) root (0) 4949 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00116.html\n+-rw-r--r-- 0 root (0) root (0) 9479 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00116_source.html\n+-rw-r--r-- 0 root (0) root (0) 12156 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00119.html\n+-rw-r--r-- 0 root (0) root (0) 21371 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00119_source.html\n+-rw-r--r-- 0 root (0) root (0) 6623 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00122.html\n+-rw-r--r-- 0 root (0) root (0) 33547 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00122_source.html\n+-rw-r--r-- 0 root (0) root (0) 4384 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00125.html\n+-rw-r--r-- 0 root (0) root (0) 18369 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00125_source.html\n+-rw-r--r-- 0 root (0) root (0) 7563 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00128.html\n+-rw-r--r-- 0 root (0) root (0) 139768 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00128_source.html\n+-rw-r--r-- 0 root (0) root (0) 5596 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00131.html\n+-rw-r--r-- 0 root (0) root (0) 43628 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00131_source.html\n+-rw-r--r-- 0 root (0) root (0) 10120 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00134.html\n+-rw-r--r-- 0 root (0) root (0) 108266 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00134_source.html\n+-rw-r--r-- 0 root (0) root (0) 44338 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00137.html\n+-rw-r--r-- 0 root (0) root (0) 253735 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00137_source.html\n+-rw-r--r-- 0 root (0) root (0) 13396 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00140.html\n+-rw-r--r-- 0 root (0) root (0) 185805 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00140_source.html\n+-rw-r--r-- 0 root (0) root (0) 5569 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00143.html\n+-rw-r--r-- 0 root (0) root (0) 35007 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00143_source.html\n+-rw-r--r-- 0 root (0) root (0) 8609 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00146.html\n+-rw-r--r-- 0 root (0) root (0) 79450 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00146_source.html\n+-rw-r--r-- 0 root (0) root (0) 4753 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00149.html\n+-rw-r--r-- 0 root (0) root (0) 24274 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00149_source.html\n+-rw-r--r-- 0 root (0) root (0) 9224 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00152.html\n+-rw-r--r-- 0 root (0) root (0) 74486 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00152_source.html\n+-rw-r--r-- 0 root (0) root (0) 13572 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00155.html\n+-rw-r--r-- 0 root (0) root (0) 345511 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00155_source.html\n+-rw-r--r-- 0 root (0) root (0) 10969 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00158.html\n+-rw-r--r-- 0 root (0) root (0) 187632 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00158_source.html\n+-rw-r--r-- 0 root (0) root (0) 6561 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00161.html\n+-rw-r--r-- 0 root (0) root (0) 69283 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00161_source.html\n+-rw-r--r-- 0 root (0) root (0) 6664 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00164.html\n+-rw-r--r-- 0 root (0) root (0) 52580 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00164_source.html\n+-rw-r--r-- 0 root (0) root (0) 8900 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00167.html\n+-rw-r--r-- 0 root (0) root (0) 47365 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00167_source.html\n+-rw-r--r-- 0 root (0) root (0) 8179 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00170.html\n+-rw-r--r-- 0 root (0) root (0) 124664 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00170_source.html\n+-rw-r--r-- 0 root (0) root (0) 9508 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00173.html\n+-rw-r--r-- 0 root (0) root (0) 87699 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00173_source.html\n+-rw-r--r-- 0 root (0) root (0) 5869 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00176.html\n+-rw-r--r-- 0 root (0) root (0) 20988 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00176_source.html\n+-rw-r--r-- 0 root (0) root (0) 5678 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00179.html\n+-rw-r--r-- 0 root (0) root (0) 30671 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00179_source.html\n+-rw-r--r-- 0 root (0) root (0) 9428 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00182.html\n+-rw-r--r-- 0 root (0) root (0) 133061 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00182_source.html\n+-rw-r--r-- 0 root (0) root (0) 6347 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00185.html\n+-rw-r--r-- 0 root (0) root (0) 17312 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00185_source.html\n+-rw-r--r-- 0 root (0) root (0) 8770 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00188.html\n+-rw-r--r-- 0 root (0) root (0) 72546 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00188_source.html\n+-rw-r--r-- 0 root (0) root (0) 9427 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00191.html\n+-rw-r--r-- 0 root (0) root (0) 237782 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00191_source.html\n+-rw-r--r-- 0 root (0) root (0) 7900 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00194.html\n+-rw-r--r-- 0 root (0) root (0) 66197 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00194_source.html\n+-rw-r--r-- 0 root (0) root (0) 5436 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00197.html\n+-rw-r--r-- 0 root (0) root (0) 14293 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00197_source.html\n+-rw-r--r-- 0 root (0) root (0) 5185 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00200.html\n+-rw-r--r-- 0 root (0) root (0) 22057 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00200_source.html\n+-rw-r--r-- 0 root (0) root (0) 7519 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00203.html\n+-rw-r--r-- 0 root (0) root (0) 98130 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00203_source.html\n+-rw-r--r-- 0 root (0) root (0) 18718 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00206.html\n+-rw-r--r-- 0 root (0) root (0) 208522 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00206_source.html\n+-rw-r--r-- 0 root (0) root (0) 15752 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00209.html\n+-rw-r--r-- 0 root (0) root (0) 410561 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00209_source.html\n+-rw-r--r-- 0 root (0) root (0) 5396 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00212.html\n+-rw-r--r-- 0 root (0) root (0) 29427 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00212_source.html\n+-rw-r--r-- 0 root (0) root (0) 7253 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00215.html\n+-rw-r--r-- 0 root (0) root (0) 76536 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00215_source.html\n+-rw-r--r-- 0 root (0) root (0) 6402 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00218.html\n+-rw-r--r-- 0 root (0) root (0) 65780 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00218_source.html\n+-rw-r--r-- 0 root (0) root (0) 5929 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00221.html\n+-rw-r--r-- 0 root (0) root (0) 162670 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00221_source.html\n+-rw-r--r-- 0 root (0) root (0) 5445 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00224.html\n+-rw-r--r-- 0 root (0) root (0) 165177 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00224_source.html\n+-rw-r--r-- 0 root (0) root (0) 13202 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00227.html\n+-rw-r--r-- 0 root (0) root (0) 131099 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00227_source.html\n+-rw-r--r-- 0 root (0) root (0) 8726 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00230.html\n+-rw-r--r-- 0 root (0) root (0) 34915 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00230_source.html\n -rw-r--r-- 0 root (0) root (0) 5516 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00233.html\n -rw-r--r-- 0 root (0) root (0) 3415 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00234.html\n -rw-r--r-- 0 root (0) root (0) 3466 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00235.html\n -rw-r--r-- 0 root (0) root (0) 278681 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00236.html\n -rw-r--r-- 0 root (0) root (0) 23094 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00236.png\n -rw-r--r-- 0 root (0) root (0) 32148 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00237.html\n -rw-r--r-- 0 root (0) root (0) 19073 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/a00237.png\n@@ -1106,15 +1106,15 @@\n -rw-r--r-- 0 root (0) root (0) 8035 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_5e12c67a8fe12cf8b78c94f3b4cb9926_dep.png\n -rw-r--r-- 0 root (0) root (0) 4246 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_5e69be5995c9f5d42bf491ae6f29600e.html\n -rw-r--r-- 0 root (0) root (0) 1620 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_5e69be5995c9f5d42bf491ae6f29600e_dep.png\n -rw-r--r-- 0 root (0) root (0) 14064 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_667edbdb0a8210232217f5e7df6d52d4.html\n -rw-r--r-- 0 root (0) root (0) 1878 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_667edbdb0a8210232217f5e7df6d52d4_dep.png\n -rw-r--r-- 0 root (0) root (0) 3664 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html\n -rw-r--r-- 0 root (0) root (0) 45631 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/doxygen.css\n--rw-r--r-- 0 root (0) root (0) 177499 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dune-istl.tag.gz\n+-rw-r--r-- 0 root (0) root (0) 177480 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dune-istl.tag.gz\n -rw-r--r-- 0 root (0) root (0) 7704 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/dynsections.js\n -rw-r--r-- 0 root (0) root (0) 29311 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/files.html\n -rw-r--r-- 0 root (0) root (0) 549 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/form_0.png\n -rw-r--r-- 0 root (0) root (0) 572 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/form_0_dark.png\n -rw-r--r-- 0 root (0) root (0) 531 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/form_1.png\n -rw-r--r-- 0 root (0) root (0) 860 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/form_10.png\n -rw-r--r-- 0 root (0) root (0) 909 2024-11-14 17:49:43.000000 ./usr/share/doc/libdune-istl-doc/doxygen/form_10_dark.png\n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00008.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00008.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: superlu.hh File Reference\n+dune-istl: io.hh File Reference\n \n \n \n \n \n \n \n@@ -73,79 +73,108 @@\n \n \n
\n
\n Classes |\n Namespaces |\n Functions
\n-
\n+
\n
\n
\n \n-

Classes for using SuperLU with ISTL matrices. \n+

Some generic functions for pretty printing vectors and matrices. \n More...

\n-
#include "superlufunctions.hh"
\n-#include "solvers.hh"
\n-#include "supermatrix.hh"
\n-#include <algorithm>
\n-#include <functional>
\n-#include "bcrsmatrix.hh"
\n-#include "bvector.hh"
\n-#include "istlexception.hh"
\n-#include <dune/common/fmatrix.hh>
\n+
#include <cmath>
\n+#include <complex>
\n+#include <limits>
\n+#include <ios>
\n+#include <iomanip>
\n+#include <fstream>
\n+#include <string>
\n+#include "matrixutils.hh"
\n+#include "istlexception.hh"
\n #include <dune/common/fvector.hh>
\n-#include <dune/common/stdstreams.hh>
\n-#include <dune/istl/solvertype.hh>
\n-#include <dune/istl/solverfactory.hh>
\n+#include <dune/common/fmatrix.hh>
\n+#include <dune/common/hybridutilities.hh>
\n+#include <dune/common/reservedvector.hh>
\n+#include <dune/istl/bcrsmatrix.hh>
\n+#include <dune/istl/blocklevel.hh>
\n
\n

Go to the source code of this file.

\n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

\n 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 > >
struct  Dune::DefaultSVGMatrixOptions
 Default options class to write SVG matrices. More...
 
\n \n \n \n

\n Namespaces

namespace  Dune
 
\n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

\n Functions

 Dune::DUNE_REGISTER_DIRECT_SOLVER ("superlu", SuperLUCreator())
 
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 , std::enable_if_t< Dune::IsNumber< K >::value, int > = 0>
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)
 Print one row of a matrix, specialization for number types.
 
template<class M , std::enable_if_t< not Dune::IsNumber< M >::value, int > = 0>
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)
 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 A , class InnerMatrixType >
void Dune::printSparseMatrix (std::ostream &s, const BCRSMatrix< InnerMatrixType, A > &mat, std::string title, std::string rowtext, int width=3, int precision=2)
 Prints a BCRSMatrix with fixed sized blocks.
 
template<class FieldType , std::enable_if_t< Dune::IsNumber< FieldType >::value, int > = 0>
void Dune::writeMatrixToMatlabHelper (const FieldType &value, int rowOffset, int colOffset, std::ostream &s)
 Helper method for the writeMatrixToMatlab routine.
 
template<class MatrixType , std::enable_if_t< not Dune::IsNumber< MatrixType >::value, int > = 0>
void Dune::writeMatrixToMatlabHelper (const MatrixType &matrix, int externalRowOffset, int externalColOffset, std::ostream &s)
 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 (std::ostream &out, const Mat &mat, SVGOptions opts={})
 Writes the visualization of matrix in the SVG 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.
 
\n

Detailed Description

\n-

Classes for using SuperLU with ISTL matrices.

\n-
Author
Markus Blatt
\n+

Some generic functions for pretty printing vectors and matrices.

\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,65 +1,111 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-superlu.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b)\n-Classes for using SuperLU with ISTL matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\n-#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n-#include \"_\bs_\bu_\bp_\be_\br_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-#include \n-#include \n-#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+io.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bS_\bp_\ba_\br_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bc_\bl_\ba_\bs_\bs_\be_\bs \u00bb\n+_\bI_\bO_\b _\bf_\bo_\br_\b _\bm_\ba_\bt_\br_\bi_\bc_\be_\bs_\b _\ba_\bn_\bd_\b _\bv_\be_\bc_\bt_\bo_\br_\bs_\b.\n+Some generic functions for pretty printing vectors and matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\"\n #include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-#include \n #include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bQ_\bu_\be_\br_\by_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bQ_\bu_\be_\br_\by_\bS_\bp_\ba_\bc_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\b _\bM_\b _\b>\n-\u00a0 SuperLu Solver. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\b _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b,_\b _\bk_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<\n- _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b,_\b _\bk_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs\n+\u00a0 Default options class to write SVG matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"superlu\", _\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br())\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b__\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br (std::ostream &s, const V &v, std::string\n+ rowtext, int &counter, int columns, int width)\n+\u00a0 Recursively print a vector.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br (std::ostream &s, const V &v, std::string title, std::\n+ string rowtext, int columns=1, int width=10, int precision=2)\n+\u00a0 Print an _\bI_\bS_\bT_\bL vector.\n+\u00a0\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\bl_\bl_\b__\br_\bo_\bw (std::ostream &s, int m, int width, int precision)\n+\u00a0 Print a row of zeros for a non-existing block.\n+\u00a0\n+template::value, int > = 0>\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw (std::ostream &s, const K &value, typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx<\n+ K, 1, 1 >::size_type I, typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 1, 1 >::size_type J,\n+ typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 1, 1 >::size_type therow, int width, int\n+ precision)\n+\u00a0 Print one row of a matrix, specialization for number types.\n+\u00a0\n+template::value, int > = 0>\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw (std::ostream &s, const M &A, typename M::size_type I,\n+ typename M::size_type J, typename M::size_type therow, int width, int\n+ precision)\n+\u00a0 Print one row of a matrix.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bm_\ba_\bt_\br_\bi_\bx (std::ostream &s, const M &A, std::string title, std::\n+ string rowtext, int width=10, int precision=2)\n+\u00a0 Print a generic block matrix.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx (std::ostream &s, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<\n+ InnerMatrixType, A > &_\bm_\ba_\bt, std::string title, std::string rowtext, int\n+ width=3, int precision=2)\n+\u00a0 Prints a _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx with fixed sized blocks.\n+\u00a0\n+template::\n+value, int > = 0>\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br (const FieldType &value, int rowOffset,\n+ int colOffset, std::ostream &s)\n+\u00a0 Helper method for the writeMatrixToMatlab routine.\n+\u00a0\n+template::value, int > = 0>\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br (const MatrixType &matrix, int\n+ externalRowOffset, int externalColOffset, std::ostream &s)\n+\u00a0 Helper method for the writeMatrixToMatlab routine.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb (const MatrixType &matrix, const std::string\n+ &filename, int outputPrecision=18)\n+\u00a0 Writes sparse matrix in a Matlab-readable format.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br (const V &v, std::ostream &stream)\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb (const VectorType &vector, const std::string\n+ &filename, int outputPrecision=18)\n+\u00a0 Writes vectors in a Matlab-readable format.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx (std::ostream &out, const Mat &_\bm_\ba_\bt, SVGOptions opts=\n+ {})\n+\u00a0 Writes the visualization of matrix in the SVG format.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx (const Mat &_\bm_\ba_\bt, std::ostream &out, SVGOptions opts=\n+ {})\n+\u00a0 Writes the visualization of matrix in the SVG format.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Classes for using SuperLU with ISTL matrices.\n- Author\n- Markus Blatt\n+Some generic functions for pretty printing vectors and matrices.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00008_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00008_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: superlu.hh Source File\n+dune-istl: io.hh Source File\n \n \n \n \n \n \n \n@@ -74,833 +74,749 @@\n \n
\n \n
\n
\n
\n-
superlu.hh
\n+
io.hh
\n
\n
\n Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
\n
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
\n
3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
\n
4// vi: set et ts=4 sw=2 sts=2:
\n-
5#ifndef DUNE_ISTL_SUPERLU_HH
\n-
6#define DUNE_ISTL_SUPERLU_HH
\n+
5#ifndef DUNE_ISTL_IO_HH
\n+
6#define DUNE_ISTL_IO_HH
\n
7
\n-
8#if HAVE_SUPERLU
\n-
9
\n-
10#include "superlufunctions.hh"
\n-
11#include "solvers.hh"
\n-
12#include "supermatrix.hh"
\n-
13#include <algorithm>
\n-
14#include <functional>
\n-
15#include "bcrsmatrix.hh"
\n-
16#include "bvector.hh"
\n-
17#include "istlexception.hh"
\n-
18#include <dune/common/fmatrix.hh>
\n-
19#include <dune/common/fvector.hh>
\n-
20#include <dune/common/stdstreams.hh>
\n-\n-\n-
23
\n-
24namespace Dune
\n-
25{
\n-
26
\n-
37 template<class M, class T, class TM, class TD, class TA>
\n-
38 class SeqOverlappingSchwarz;
\n-
39
\n-
40 template<class T, bool tag>
\n-
41 struct SeqOverlappingSchwarzAssemblerHelper;
\n-
42
\n-
43 template<class T>
\n-
\n-\n-
45 {};
\n-
\n-
46
\n-
47 template<class T>
\n-
\n-\n-
49 {};
\n-
\n-
50
\n-
51 template<class T>
\n-
\n-\n-
53 {};
\n-
\n-
54
\n-
55 template<class T>
\n-
\n-\n-
57 {};
\n-
\n-
58
\n-
59#if __has_include("slu_sdefs.h")
\n-
60 template<>
\n-
61 struct SuperLUDenseMatChooser<float>
\n-
62 {
\n-
63 static void create(SuperMatrix *mat, int n, int m, float *dat, int n1,
\n-
64 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
\n-
65 {
\n-
66 sCreate_Dense_Matrix(mat, n, m, dat, n1, stype, dtype, mtype);
\n-
67
\n-
68 }
\n-
69
\n-
70 static void destroy(SuperMatrix*)
\n-
71 {}
\n-
72
\n-
73 };
\n-
74 template<>
\n-
75 struct SuperLUSolveChooser<float>
\n-
76 {
\n-
77 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
\n-
78 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,
\n-
79 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
\n-
80 float *rpg, float *rcond, float *ferr, float *berr,
\n-
81 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
\n-
82 {
\n-
83 GlobalLU_t gLU;
\n-
84 sgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
\n-
85 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
\n-
86 &gLU, memusage, stat, info);
\n-
87 }
\n-
88 };
\n-
89
\n-
90 template<>
\n-
91 struct QuerySpaceChooser<float>
\n+
8#include <cmath>
\n+
9#include <complex>
\n+
10#include <limits>
\n+
11#include <ios>
\n+
12#include <iomanip>
\n+
13#include <fstream>
\n+
14#include <string>
\n+
15
\n+
16#include "matrixutils.hh"
\n+
17#include "istlexception.hh"
\n+
18#include <dune/common/fvector.hh>
\n+
19#include <dune/common/fmatrix.hh>
\n+
20#include <dune/common/hybridutilities.hh>
\n+
21#include <dune/common/reservedvector.hh>
\n+
22
\n+\n+\n+
25
\n+
26namespace Dune {
\n+
27
\n+
40 //
\n+
41 // pretty printing of vectors
\n+
42 //
\n+
43
\n+
51 template<class V>
\n+
\n+
52 void recursive_printvector (std::ostream& s, const V& v, std::string rowtext,
\n+
53 int& counter, int columns, int width)
\n+
54 {
\n+
55 if constexpr (IsNumber<V>())
\n+
56 {
\n+
57 // Print one number
\n+
58 if (counter%columns==0)
\n+
59 {
\n+
60 s << rowtext; // start a new row
\n+
61 s << " "; // space in front of each entry
\n+
62 s.width(4); // set width for counter
\n+
63 s << counter; // number of first entry in a line
\n+
64 }
\n+
65 s << " "; // space in front of each entry
\n+
66 s.width(width); // set width for each entry anew
\n+
67 s << v; // yeah, the number !
\n+
68 counter++; // increment the counter
\n+
69 if (counter%columns==0)
\n+
70 s << std::endl; // start a new line
\n+
71 }
\n+
72 else
\n+
73 {
\n+
74 // Recursively print a vector
\n+
75 for (const auto& entry : v)
\n+
76 recursive_printvector(s,entry,rowtext,counter,columns,width);
\n+
77 }
\n+
78 }
\n+
\n+
79
\n+
80
\n+
88 template<class V>
\n+
\n+
89 void printvector (std::ostream& s, const V& v, std::string title,
\n+
90 std::string rowtext, int columns=1, int width=10,
\n+
91 int precision=2)
\n
92 {
\n-
93 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
\n-
94 {
\n-
95 sQuerySpace(L,U,memusage);
\n-
96 }
\n-
97 };
\n+
93 // count the numbers printed to make columns
\n+
94 int counter=0;
\n+
95
\n+
96 // remember old flags
\n+
97 std::ios_base::fmtflags oldflags = s.flags();
\n
98
\n-
99#endif
\n-
100
\n-
101#if __has_include("slu_ddefs.h")
\n-
102
\n-
103 template<>
\n-
104 struct SuperLUDenseMatChooser<double>
\n-
105 {
\n-
106 static void create(SuperMatrix *mat, int n, int m, double *dat, int n1,
\n-
107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
\n-
108 {
\n-
109 dCreate_Dense_Matrix(mat, n, m, dat, n1, stype, dtype, mtype);
\n+
99 // set the output format
\n+
100 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
\n+
101 int oldprec = s.precision();
\n+
102 s.precision(precision);
\n+
103
\n+
104 // print title
\n+
105 s << title << " [blocks=" << v.N() << ",dimension=" << v.dim() << "]"
\n+
106 << std::endl;
\n+
107
\n+
108 // print data from all blocks
\n+
109 recursive_printvector(s,v,rowtext,counter,columns,width);
\n
110
\n-
111 }
\n-
112
\n-
113 static void destroy(SuperMatrix * /* mat */)
\n-
114 {}
\n-
115 };
\n-
116 template<>
\n-
117 struct SuperLUSolveChooser<double>
\n-
118 {
\n-
119 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
\n-
120 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,
\n-
121 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
\n-
122 double *rpg, double *rcond, double *ferr, double *berr,
\n-
123 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
\n-
124 {
\n-
125 GlobalLU_t gLU;
\n-
126 dgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
\n-
127 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
\n-
128 &gLU, memusage, stat, info);
\n-
129 }
\n-
130 };
\n-
131
\n-
132 template<>
\n-
133 struct QuerySpaceChooser<double>
\n+
111 // check if new line is required
\n+
112 if (counter%columns!=0)
\n+
113 s << std::endl;
\n+
114
\n+
115 // reset the output format
\n+
116 s.flags(oldflags);
\n+
117 s.precision(oldprec);
\n+
118 }
\n+
\n+
119
\n+
120
\n+
122 //
\n+
123 // pretty printing of matrices
\n+
124 //
\n+
125
\n+
\n+
133 inline void fill_row (std::ostream& s, int m, int width, [[maybe_unused]] int precision)
\n
134 {
\n-
135 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
\n+
135 for (int j=0; j<m; j++)
\n
136 {
\n-
137 dQuerySpace(L,U,memusage);
\n-
138 }
\n-
139 };
\n-
140#endif
\n-
141
\n-
142#if __has_include("slu_zdefs.h")
\n-
143 template<>
\n-
144 struct SuperLUDenseMatChooser<std::complex<double> >
\n-
145 {
\n-
146 static void create(SuperMatrix *mat, int n, int m, std::complex<double> *dat, int n1,
\n-
147 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
\n-
148 {
\n-
149 zCreate_Dense_Matrix(mat, n, m, reinterpret_cast<doublecomplex*>(dat), n1, stype, dtype, mtype);
\n-
150
\n-
151 }
\n-
152
\n-
153 static void destroy(SuperMatrix*)
\n-
154 {}
\n-
155 };
\n-
156
\n-
157 template<>
\n-
158 struct SuperLUSolveChooser<std::complex<double> >
\n-
159 {
\n-
160 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
\n-
161 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,
\n-
162 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
\n-
163 double *rpg, double *rcond, double *ferr, double *berr,
\n-
164 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
\n-
165 {
\n-
166 GlobalLU_t gLU;
\n-
167 zgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
\n-
168 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
\n-
169 &gLU, memusage, stat, info);
\n-
170 }
\n-
171 };
\n-
172
\n-
173 template<>
\n-
174 struct QuerySpaceChooser<std::complex<double> >
\n-
175 {
\n-
176 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
\n-
177 {
\n-
178 zQuerySpace(L,U,memusage);
\n-
179 }
\n-
180 };
\n-
181#endif
\n-
182
\n-
183#if __has_include("slu_cdefs.h")
\n-
184 template<>
\n-
185 struct SuperLUDenseMatChooser<std::complex<float> >
\n-
186 {
\n-
187 static void create(SuperMatrix *mat, int n, int m, std::complex<float> *dat, int n1,
\n-
188 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
\n-
189 {
\n-
190 cCreate_Dense_Matrix(mat, n, m, reinterpret_cast< ::complex*>(dat), n1, stype, dtype, mtype);
\n-
191
\n-
192 }
\n-
193
\n-
194 static void destroy(SuperMatrix* /* mat */)
\n-
195 {}
\n-
196 };
\n-
197
\n-
198 template<>
\n-
199 struct SuperLUSolveChooser<std::complex<float> >
\n-
200 {
\n-
201 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
\n-
202 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,
\n-
203 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
\n-
204 float *rpg, float *rcond, float *ferr, float *berr,
\n-
205 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
\n-
206 {
\n-
207 GlobalLU_t gLU;
\n-
208 cgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
\n-
209 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
\n-
210 &gLU, memusage, stat, info);
\n-
211 }
\n-
212 };
\n-
213
\n-
214 template<>
\n-
215 struct QuerySpaceChooser<std::complex<float> >
\n-
216 {
\n-
217 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
\n-
218 {
\n-
219 cQuerySpace(L,U,memusage);
\n-
220 }
\n-
221 };
\n-
222#endif
\n-
223
\n-
224 namespace Impl
\n-
225 {
\n-
226 template<class M>
\n-
227 struct SuperLUVectorChooser
\n-
228 {};
\n-
229
\n-
230 template<typename T, typename A, int n, int m>
\n-
231 struct SuperLUVectorChooser<BCRSMatrix<FieldMatrix<T,n,m>,A > >
\n-
232 {
\n-
234 using domain_type = BlockVector<
\n-
235 FieldVector<T,m>,
\n-
236 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > >;
\n-
238 using range_type = BlockVector<
\n-
239 FieldVector<T,n>,
\n-
240 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > >;
\n-
241 };
\n-
242
\n-
243 template<typename T, typename A>
\n-
244 struct SuperLUVectorChooser<BCRSMatrix<T,A> >
\n-
245 {
\n-
247 using domain_type = BlockVector<T, A>;
\n-
249 using range_type = BlockVector<T, A>;
\n-
250 };
\n-
251 }
\n-
252
\n-
266 template<typename M>
\n-
\n-\n-
268 : public InverseOperator<
\n-
269 typename Impl::SuperLUVectorChooser<M>::domain_type,
\n-
270 typename Impl::SuperLUVectorChooser<M>::range_type >
\n-
271 {
\n-
272 using T = typename M::field_type;
\n-
273 public:
\n-
275 using Matrix = M;
\n-
276 using matrix_type = M;
\n-\n-\n-
282 using domain_type = typename Impl::SuperLUVectorChooser<M>::domain_type;
\n-
284 using range_type = typename Impl::SuperLUVectorChooser<M>::range_type;
\n-
285
\n-
\n-\n-
288 {
\n-\n-
290 }
\n-
\n-
291
\n-
306 explicit SuperLU(const Matrix& mat, bool verbose=false,
\n-
307 bool reusevector=true);
\n-
308
\n-
309
\n-
\n-
320 SuperLU(const Matrix& mat, const ParameterTree& config)
\n-
321 : SuperLU(mat, config.get<bool>("verbose", false), config.get<bool>("reuseVector", true))
\n-
322 {}
\n-
\n-
323
\n-
330 SuperLU();
\n-
331
\n-
332 ~SuperLU();
\n-
333
\n-\n-
338
\n-
\n-
342 void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
\n-
343 {
\n-
344 apply(x,b,res);
\n-
345 }
\n-
\n-
346
\n-
350 void apply(T* x, T* b);
\n-
351
\n-
353 void setMatrix(const Matrix& mat);
\n-
354
\n-
\n-
355 typename SuperLUMatrix::size_type nnz() const
\n-
356 {
\n-
357 return mat.nonzeroes();
\n-
358 }
\n-
\n-
359
\n-
360 template<class S>
\n-
361 void setSubMatrix(const Matrix& mat, const S& rowIndexSet);
\n-
362
\n-
363 void setVerbosity(bool v);
\n-
364
\n-
369 void free();
\n-
370
\n-
371 const char* name() { return "SuperLU"; }
\n-
372 private:
\n-
373 template<class Mat,class X, class TM, class TD, class T1>
\n-\n-\n-
376
\n-
377 SuperLUMatrix& getInternalMatrix() { return mat; }
\n+
137 s << " "; // space in front of each entry
\n+
138 s.width(width); // set width for each entry anew
\n+
139 s << "."; // yeah, the number !
\n+
140 }
\n+
141 }
\n+
\n+
142
\n+
150 template<class K,
\n+
151 std::enable_if_t<Dune::IsNumber<K>::value, int> = 0>
\n+
\n+
152 void print_row (std::ostream& s, const K& value,
\n+
153 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type I,
\n+
154 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type J,
\n+
155 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type therow,
\n+
156 int width,
\n+
157 [[maybe_unused]] int precision)
\n+
158 {
\n+
159 s << " "; // space in front of each entry
\n+
160 s.width(width); // set width for each entry anew
\n+
161 s << value;
\n+
162 }
\n+
\n+
163
\n+
171 template<class M,
\n+
172 std::enable_if_t<not Dune::IsNumber<M>::value, int> = 0>
\n+
\n+
173 void print_row (std::ostream& s, const M& A, typename M::size_type I,
\n+
174 typename M::size_type J, typename M::size_type therow,
\n+
175 int width, int precision)
\n+
176 {
\n+
177 typename M::size_type i0=I;
\n+
178 for (typename M::size_type i=0; i<A.N(); i++)
\n+
179 {
\n+
180 if (therow>=i0 && therow<i0+MatrixDimension<M>::rowdim(A,i))
\n+
181 {
\n+
182 // the row is in this block row !
\n+
183 typename M::size_type j0=J;
\n+
184 for (typename M::size_type j=0; j<A.M(); j++)
\n+
185 {
\n+
186 // find this block
\n+
187 typename M::ConstColIterator it = A[i].find(j);
\n+
188
\n+
189 // print row or filler
\n+
190 if (it!=A[i].end())
\n+
191 print_row(s,*it,i0,j0,therow,width,precision);
\n+
192 else
\n+
193 fill_row(s,MatrixDimension<M>::coldim(A,j),width,precision);
\n+
194
\n+
195 // advance columns
\n+\n+
197 }
\n+
198 }
\n+
199 // advance rows
\n+\n+
201 }
\n+
202 }
\n+
\n+
203
\n+
212 template<class M>
\n+
\n+
213 void printmatrix (std::ostream& s, const M& A, std::string title,
\n+
214 std::string rowtext, int width=10, int precision=2)
\n+
215 {
\n+
216
\n+
217 // remember old flags
\n+
218 std::ios_base::fmtflags oldflags = s.flags();
\n+
219
\n+
220 // set the output format
\n+
221 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
\n+
222 int oldprec = s.precision();
\n+
223 s.precision(precision);
\n+
224
\n+
225 // print title
\n+
226 s << title
\n+
227 << " [n=" << A.N()
\n+
228 << ",m=" << A.M()
\n+
229 << ",rowdim=" << MatrixDimension<M>::rowdim(A)
\n+
230 << ",coldim=" << MatrixDimension<M>::coldim(A)
\n+
231 << "]" << std::endl;
\n+
232
\n+
233 // print all rows
\n+
234 for (typename M::size_type i=0; i<MatrixDimension<M>::rowdim(A); i++)
\n+
235 {
\n+
236 s << rowtext; // start a new row
\n+
237 s << " "; // space in front of each entry
\n+
238 s.width(4); // set width for counter
\n+
239 s << i; // number of first entry in a line
\n+
240 print_row(s,A,0,0,i,width,precision); // generic print
\n+
241 s << std::endl; // start a new line
\n+
242 }
\n+
243
\n+
244 // reset the output format
\n+
245 s.flags(oldflags);
\n+
246 s.precision(oldprec);
\n+
247 }
\n+
\n+
248
\n+
249 namespace Impl
\n+
250 {
\n+
251 template<class B>
\n+
252 void printInnerMatrixElement(std::ostream& s,
\n+
253 const B& innerMatrixElement,
\n+
254 int innerrow, int innercol)
\n+
255 {
\n+
256 s<<innerMatrixElement<<" ";
\n+
257 }
\n+
258
\n+
259 template<class B, int n>
\n+
260 void printInnerMatrixElement(std::ostream& s,
\n+
261 const ScaledIdentityMatrix<B,n> innerMatrixElement,
\n+
262 int innerrow, int innercol)
\n+
263 {
\n+
264 if (innerrow == innercol)
\n+
265 s<<innerMatrixElement.scalar()<<" ";
\n+
266 else
\n+
267 s<<"-";
\n+
268 }
\n+
269
\n+
270 template<class B, int n, int m>
\n+
271 void printInnerMatrixElement(std::ostream& s,
\n+
272 const FieldMatrix<B,n,m> innerMatrixElement,
\n+
273 int innerrow, int innercol)
\n+
274 {
\n+
275 s<<innerMatrixElement[innerrow][innercol]<<" ";
\n+
276 }
\n+
277 }
\n+
278
\n+
300 template<class A, class InnerMatrixType>
\n+
\n+
301 void printSparseMatrix(std::ostream& s,
\n+\n+
303 std::string title, std::string rowtext,
\n+
304 int width=3, int precision=2)
\n+
305 {
\n+\n+
307 // remember old flags
\n+
308 std::ios_base::fmtflags oldflags = s.flags();
\n+
309 // set the output format
\n+
310 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
\n+
311 int oldprec = s.precision();
\n+
312 s.precision(precision);
\n+
313 // print title
\n+
314 s << title
\n+
315 << " [n=" << mat.N()
\n+
316 << ",m=" << mat.M()
\n+
317 << ",rowdim=" << MatrixDimension<Matrix>::rowdim(mat)
\n+
318 << ",coldim=" << MatrixDimension<Matrix>::coldim(mat)
\n+
319 << "]" << std::endl;
\n+
320
\n+
321 typedef typename Matrix::ConstRowIterator Row;
\n+
322
\n+
323 constexpr int n = std::decay_t<decltype(Impl::asMatrix(std::declval<InnerMatrixType>()))>::rows;
\n+
324 constexpr int m = std::decay_t<decltype(Impl::asMatrix(std::declval<InnerMatrixType>()))>::cols;
\n+
325 for(Row row=mat.begin(); row != mat.end(); ++row) {
\n+
326 int skipcols=0;
\n+
327 bool reachedEnd=false;
\n+
328
\n+
329 while(!reachedEnd) {
\n+
330 for(int innerrow=0; innerrow<n; ++innerrow) {
\n+
331 int count=0;
\n+
332 typedef typename Matrix::ConstColIterator Col;
\n+
333 Col col=row->begin();
\n+
334 for(; col != row->end(); ++col,++count) {
\n+
335 if(count<skipcols)
\n+
336 continue;
\n+
337 if(count>=skipcols+width)
\n+
338 break;
\n+
339 if(innerrow==0) {
\n+
340 if(count==skipcols) {
\n+
341 s << rowtext; // start a new row
\n+
342 s << " "; // space in front of each entry
\n+
343 s.width(4); // set width for counter
\n+
344 s << row.index()<<": "; // number of first entry in a line
\n+
345 }
\n+
346 s.width(4);
\n+
347 s<<col.index()<<": |";
\n+
348 } else {
\n+
349 if(count==skipcols) {
\n+
350 for(typename std::string::size_type i=0; i < rowtext.length(); i++)
\n+
351 s<<" ";
\n+
352 s<<" ";
\n+
353 }
\n+
354 s<<" |";
\n+
355 }
\n+
356 for(int innercol=0; innercol < m; ++innercol) {
\n+
357 s.width(9);
\n+
358 Impl::printInnerMatrixElement(s,*col,innerrow,innercol);
\n+
359 }
\n+
360
\n+
361 s<<"|";
\n+
362 }
\n+
363 if(innerrow==n-1 && col==row->end())
\n+
364 reachedEnd = true;
\n+
365 else
\n+
366 s << std::endl;
\n+
367 }
\n+
368 skipcols += width;
\n+
369 s << std::endl;
\n+
370 }
\n+
371 s << std::endl;
\n+
372 }
\n+
373
\n+
374 // reset the output format
\n+
375 s.flags(oldflags);
\n+
376 s.precision(oldprec);
\n+
377 }
\n+
\n
378
\n-
380 void decompose();
\n-
381
\n-\n-
383 SuperMatrix L, U, B, X;
\n-
384 int *perm_c, *perm_r, *etree;
\n-
385 typename GetSuperLUType<T>::float_type *R, *C;
\n-
386 T *bstore;
\n-
387 superlu_options_t options;
\n-
388 char equed;
\n-
389 void *work;
\n-
390 int lwork;
\n-
391 bool first, verbose, reusevector;
\n-
392 };
\n-
\n-
393
\n-
394 template<typename M>
\n-
395 SuperLU<M>
\n-
\n-
396 ::~SuperLU()
\n-
397 {
\n-
398 if(mat.N()+mat.M()>0)
\n-
399 free();
\n-
400 }
\n-
\n-
401
\n-
402 template<typename M>
\n-
\n-\n-
404 {
\n-
405 delete[] perm_c;
\n-
406 delete[] perm_r;
\n-
407 delete[] etree;
\n-
408 delete[] R;
\n-
409 delete[] C;
\n-
410 if(lwork>=0) {
\n-
411 Destroy_SuperNode_Matrix(&L);
\n-
412 Destroy_CompCol_Matrix(&U);
\n-
413 }
\n-
414 lwork=0;
\n-
415 if(!first && reusevector) {
\n-
416 SUPERLU_FREE(B.Store);
\n-
417 SUPERLU_FREE(X.Store);
\n-
418 }
\n-
419 mat.free();
\n-
420 }
\n-
\n-
421
\n-
422 template<typename M>
\n-\n-
\n-
424 ::SuperLU(const Matrix& mat_, bool verbose_, bool reusevector_)
\n-
425 : work(0), lwork(0), first(true), verbose(verbose_),
\n-
426 reusevector(reusevector_)
\n-
427 {
\n-
428 setMatrix(mat_);
\n-
429
\n-
430 }
\n-
\n-
431 template<typename M>
\n-
\n-\n-
433 : work(0), lwork(0),verbose(false),
\n-
434 reusevector(false)
\n-
435 {}
\n-
\n-
436 template<typename M>
\n-
\n-\n-
438 {
\n-
439 verbose=v;
\n-
440 }
\n-
\n-
441
\n-
442 template<typename M>
\n-
\n-\n-
444 {
\n-
445 if(mat.N()+mat.M()>0) {
\n-
446 free();
\n-
447 }
\n-
448 lwork=0;
\n-
449 work=0;
\n-
450 //a=&mat_;
\n-
451 mat=mat_;
\n-
452 decompose();
\n-
453 }
\n-
\n-
454
\n-
455 template<typename M>
\n-
456 template<class S>
\n-
\n-\n-
458 const S& mrs)
\n-
459 {
\n-
460 if(mat.N()+mat.M()>0) {
\n-
461 free();
\n-
462 }
\n-
463 lwork=0;
\n-
464 work=0;
\n-
465 //a=&mat_;
\n-
466 mat.setMatrix(mat_,mrs);
\n-
467 decompose();
\n-
468 }
\n-
\n-
469
\n-
470 template<typename M>
\n-\n-
472 {
\n-
473
\n-
474 first = true;
\n-
475 perm_c = new int[mat.M()];
\n-
476 perm_r = new int[mat.N()];
\n-
477 etree = new int[mat.M()];
\n-
478 R = new typename GetSuperLUType<T>::float_type[mat.N()];
\n-
479 C = new typename GetSuperLUType<T>::float_type[mat.M()];
\n-
480
\n-
481 set_default_options(&options);
\n-
482 // Do the factorization
\n-
483 B.ncol=0;
\n-
484 B.Stype=SLU_DN;
\n-\n-
486 B.Mtype= SLU_GE;
\n-
487 DNformat fakeFormat;
\n-
488 fakeFormat.lda=mat.N();
\n-
489 B.Store=&fakeFormat;
\n-
490 X.Stype=SLU_DN;
\n-\n-
492 X.Mtype= SLU_GE;
\n-
493 X.ncol=0;
\n-
494 X.Store=&fakeFormat;
\n-
495
\n-
496 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr=1e10;
\n-
497 int info;
\n-
498 mem_usage_t memusage;
\n-
499 SuperLUStat_t stat;
\n-
500
\n-
501 StatInit(&stat);
\n-
502 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
\n-
503 &L, &U, work, lwork, &B, &X, &rpg, &rcond, &ferr,
\n-
504 &berr, &memusage, &stat, &info);
\n+
379 namespace
\n+
380 {
\n+
381 template<typename T>
\n+
382 struct MatlabPODWriter
\n+
383 {
\n+
384 static std::ostream& write(const T& t, std::ostream& s)
\n+
385 {
\n+
386 s << t;
\n+
387 return s;
\n+
388 }
\n+
389 };
\n+
390 template<typename T>
\n+
391 struct MatlabPODWriter<std::complex<T> >
\n+
392 {
\n+
393 static std::ostream& write(const std::complex<T>& t, std::ostream& s)
\n+
394 {
\n+
395 s << t.real() << " " << t.imag();
\n+
396 return s;
\n+
397 }
\n+
398 };
\n+
399 } // anonymous namespace
\n+
400
\n+
410 template <class FieldType,
\n+
411 std::enable_if_t<Dune::IsNumber<FieldType>::value, int> = 0>
\n+
\n+
412 void writeMatrixToMatlabHelper(const FieldType& value,
\n+
413 int rowOffset, int colOffset,
\n+
414 std::ostream& s)
\n+
415 {
\n+
416 //+1 for Matlab numbering
\n+
417 s << rowOffset + 1 << " " << colOffset + 1 << " ";
\n+
418 MatlabPODWriter<FieldType>::write(value, s)<< std::endl;
\n+
419 }
\n+
\n+
420
\n+
428 template <class MatrixType,
\n+
429 std::enable_if_t<not Dune::IsNumber<MatrixType>::value, int> = 0>
\n+
\n+
430 void writeMatrixToMatlabHelper(const MatrixType& matrix,
\n+
431 int externalRowOffset, int externalColOffset,
\n+
432 std::ostream& s)
\n+
433 {
\n+
434 // Precompute the accumulated sizes of the columns
\n+
435 std::vector<typename MatrixType::size_type> colOffset(matrix.M());
\n+
436 if (colOffset.size() > 0)
\n+
437 colOffset[0] = 0;
\n+
438
\n+
439 for (typename MatrixType::size_type i=0; i<matrix.M()-1; i++)
\n+
440 colOffset[i+1] = colOffset[i] +
\n+\n+
442
\n+
443 typename MatrixType::size_type rowOffset = 0;
\n+
444
\n+
445 // Loop over all matrix rows
\n+
446 for (typename MatrixType::size_type rowIdx=0; rowIdx<matrix.N(); rowIdx++)
\n+
447 {
\n+
448 auto cIt = matrix[rowIdx].begin();
\n+
449 auto cEndIt = matrix[rowIdx].end();
\n+
450
\n+
451 // Loop over all columns in this row
\n+
452 for (; cIt!=cEndIt; ++cIt)
\n+\n+
454 externalRowOffset+rowOffset,
\n+
455 externalColOffset + colOffset[cIt.index()],
\n+
456 s);
\n+
457
\n+
458 rowOffset += MatrixDimension<MatrixType>::rowdim(matrix, rowIdx);
\n+
459 }
\n+
460
\n+
461 }
\n+
\n+
462
\n+
482 template <class MatrixType>
\n+
\n+
483 void writeMatrixToMatlab(const MatrixType& matrix,
\n+
484 const std::string& filename, int outputPrecision = 18)
\n+
485 {
\n+
486 std::ofstream outStream(filename.c_str());
\n+
487 int oldPrecision = outStream.precision();
\n+
488 outStream.precision(outputPrecision);
\n+
489
\n+
490 writeMatrixToMatlabHelper(matrix, 0, 0, outStream);
\n+
491 outStream.precision(oldPrecision);
\n+
492 }
\n+
\n+
493
\n+
494 // Recursively write vector entries to a stream
\n+
495 template<class V>
\n+
\n+
496 void writeVectorToMatlabHelper (const V& v, std::ostream& stream)
\n+
497 {
\n+
498 if constexpr (IsNumber<V>()) {
\n+
499 stream << v << std::endl;
\n+
500 } else {
\n+
501 for (const auto& entry : v)
\n+
502 writeVectorToMatlabHelper(entry, stream);
\n+
503 }
\n+
504 }
\n+
\n
505
\n-
506 if(verbose) {
\n-
507 dinfo<<"LU factorization: dgssvx() returns info "<< info<<std::endl;
\n-
508
\n-
509 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
\n-
510
\n-
511 if ( info == 0 || info == nSuperLUCol+1 ) {
\n-
512
\n-
513 if ( options.PivotGrowth )
\n-
514 dinfo<<"Recip. pivot growth = "<<rpg<<std::endl;
\n-
515 if ( options.ConditionNumber )
\n-
516 dinfo<<"Recip. condition number = %e\\n"<< rcond<<std::endl;
\n-
517 SCformat* Lstore = (SCformat *) L.Store;
\n-
518 NCformat* Ustore = (NCformat *) U.Store;
\n-
519 dinfo<<"No of nonzeros in factor L = "<< Lstore->nnz<<std::endl;
\n-
520 dinfo<<"No of nonzeros in factor U = "<< Ustore->nnz<<std::endl;
\n-
521 dinfo<<"No of nonzeros in L+U = "<< Lstore->nnz + Ustore->nnz - nSuperLUCol<<std::endl;
\n-
522 QuerySpaceChooser<T>::querySpace(&L, &U, &memusage);
\n-
523 dinfo<<"L\\\\U MB "<<memusage.for_lu/1e6<<" \\ttotal MB needed "<<memusage.total_needed/1e6
\n-
524 <<" \\texpansions ";
\n-
525 std::cout<<stat.expansions<<std::endl;
\n-
526
\n-
527 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
\n-
528 dinfo<<"** Estimated memory: "<< info - nSuperLUCol<<std::endl;
\n-
529 }
\n-
530 if ( options.PrintStat ) StatPrint(&stat);
\n-
531 }
\n-
532 StatFree(&stat);
\n-
533 /*
\n-
534 NCformat* Ustore = (NCformat *) U.Store;
\n-
535 int k=0;
\n-
536 dPrint_CompCol_Matrix("U", &U);
\n-
537 for(int i=0; i < U.ncol; ++i, ++k){
\n-
538 std::cout<<i<<": ";
\n-
539 for(int c=Ustore->colptr[i]; c < Ustore->colptr[i+1]; ++c)
\n-
540 //if(Ustore->rowind[c]==i)
\n-
541 std::cout<<Ustore->rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" ";
\n-
542 if(k==0){
\n-
543 //
\n-
544 k=-1;
\n-
545 }std::cout<<std::endl;
\n-
546 }
\n-
547 dPrint_SuperNode_Matrix("L", &L);
\n-
548 for(int i=0; i < U.ncol; ++i, ++k){
\n-
549 std::cout<<i<<": ";
\n-
550 for(int c=Ustore->colptr[i]; c < Ustore->colptr[i+1]; ++c)
\n-
551 //if(Ustore->rowind[c]==i)
\n-
552 std::cout<<Ustore->rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" ";
\n-
553 if(k==0){
\n-
554 //
\n-
555 k=-1;
\n-
556 }std::cout<<std::endl;
\n-
557 } */
\n-
558 options.Fact = FACTORED;
\n-
559 }
\n+
523 template <class VectorType>
\n+
\n+
524 void writeVectorToMatlab(const VectorType& vector,
\n+
525 const std::string& filename, int outputPrecision = 18)
\n+
526 {
\n+
527 std::ofstream outStream(filename.c_str());
\n+
528 int oldPrecision = outStream.precision();
\n+
529 outStream.precision(outputPrecision);
\n+
530
\n+
531 writeVectorToMatlabHelper(vector, outStream);
\n+
532 outStream.precision(oldPrecision);
\n+
533 }
\n+
\n+
534
\n+
535 namespace Impl {
\n+
536
\n+
538 struct NullStream {
\n+
539 template <class Any>
\n+
540 friend NullStream &operator<<(NullStream &dev0, Any &&) {
\n+
541 return dev0;
\n+
542 }
\n+
543 };
\n+
544
\n+
546 // svg shall be closed with a group and an svg. i.e. "</g></svg>"
\n+
547 template <class Stream, class SVGMatrixOptions>
\n+
548 void writeSVGMatrixHeader(Stream &out, const SVGMatrixOptions &opts,
\n+
549 std::pair<std::size_t, size_t> offsets) {
\n+
550 auto [col_offset, row_offset] = offsets;
\n+
551 double width = opts.width;
\n+
552 double height = opts.height;
\n+
553 // if empty, we try to figure out a sensible value of width and height
\n+
554 if (opts.width == 0 and opts.height == 0)
\n+
555 width = height = 500;
\n+
556 if (opts.width == 0)
\n+
557 width = opts.height * (double(col_offset) / row_offset);
\n+
558 if (opts.height == 0)
\n+
559 height = opts.width * (double(row_offset) / col_offset);
\n
560
\n-
561 template<typename M>
\n-
562 void SuperLU<M>
\n-
\n-\n-
564 {
\n-
565 if (mat.N() != b.dim())
\n-
566 DUNE_THROW(ISTLError, "Size of right-hand-side vector b does not match the number of matrix rows!");
\n-
567 if (mat.M() != x.dim())
\n-
568 DUNE_THROW(ISTLError, "Size of solution vector x does not match the number of matrix columns!");
\n-
569 if (mat.M()+mat.N()==0)
\n-
570 DUNE_THROW(ISTLError, "Matrix of SuperLU is null!");
\n-
571
\n-
572 SuperMatrix* mB = &B;
\n-
573 SuperMatrix* mX = &X;
\n-
574 SuperMatrix rB, rX;
\n-
575 if (reusevector) {
\n-
576 if(first) {
\n-
577 SuperLUDenseMatChooser<T>::create(&B, (int)mat.N(), 1, reinterpret_cast<T*>(&b[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
\n-
578 SuperLUDenseMatChooser<T>::create(&X, (int)mat.N(), 1, reinterpret_cast<T*>(&x[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
\n-
579 first=false;
\n-
580 }else{
\n-
581 ((DNformat*)B.Store)->nzval=&b[0];
\n-
582 ((DNformat*)X.Store)->nzval=&x[0];
\n-
583 }
\n-
584 } else {
\n-
585 SuperLUDenseMatChooser<T>::create(&rB, (int)mat.N(), 1, reinterpret_cast<T*>(&b[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
\n-
586 SuperLUDenseMatChooser<T>::create(&rX, (int)mat.N(), 1, reinterpret_cast<T*>(&x[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
\n-
587 mB = &rB;
\n-
588 mX = &rX;
\n-
589 }
\n-
590 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr;
\n-
591 int info;
\n-
592 mem_usage_t memusage;
\n-
593 SuperLUStat_t stat;
\n-
594 /* Initialize the statistics variables. */
\n-
595 StatInit(&stat);
\n-
596 /*
\n-
597 range_type d=b;
\n-
598 a->usmv(-1, x, d);
\n-
599
\n-
600 double def0=d.two_norm();
\n-
601 */
\n-
602 options.IterRefine=SLU_DOUBLE;
\n+
561 // scale group w.r.t final offsets
\n+
562 double scale_width = width / col_offset;
\n+
563 double scale_height = height / row_offset;
\n+
564
\n+
565 // write the header text
\n+
566 out << "<svg xmlns='http://www.w3.org/2000/svg' width='" << std::ceil(width)
\n+
567 << "' height='" << std::ceil(height) << "' version='1.1'>\\n"
\n+
568 << "<style>\\n"
\n+
569 << opts.style << "</style>\\n"
\n+
570 << "<g transform='scale(" << scale_width << " " << scale_height
\n+
571 << ")'>\\n";
\n+
572 }
\n+
573
\n+
575 template <class Stream, class Mat, class SVGMatrixOptions,
\n+
576 class RowPrefix, class ColPrefix>
\n+
577 std::pair<std::size_t, size_t>
\n+
578 writeSVGMatrix(Stream &out, const Mat &mat, SVGMatrixOptions opts,
\n+
579 RowPrefix row_prefix, ColPrefix col_prefix) {
\n+
580 // get values to fill the offsets
\n+
581 const auto& block_size = opts.block_size;
\n+
582 const auto& interspace = opts.interspace;
\n+
583
\n+
584 const std::size_t rows = mat.N();
\n+
585 const std::size_t cols = mat.M();
\n+
586
\n+
587 // disable header write for recursive calls
\n+
588 const bool write_header = opts.write_header;
\n+
589 opts.write_header = false;
\n+
590
\n+
591 // counter of offsets for every block
\n+
592 std::size_t row_offset = interspace;
\n+
593 std::size_t col_offset = interspace;
\n+
594
\n+
595 // lambda helper: for-each value
\n+
596 auto for_each_entry = [&mat](const auto &call_back) {
\n+
597 for (auto row_it = mat.begin(); row_it != mat.end(); ++row_it) {
\n+
598 for (auto col_it = row_it->begin(); col_it != row_it->end(); ++col_it) {
\n+
599 call_back(row_it.index(), col_it.index(), *col_it);
\n+
600 }
\n+
601 }
\n+
602 };
\n
603
\n-
604 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
\n-
605 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,
\n-
606 &memusage, &stat, &info);
\n-
607
\n-
608 res.iterations=1;
\n-
609
\n-
610 /*
\n-
611 if(options.Equil==YES)
\n-
612 // undo scaling of right hand side
\n-
613 std::transform(reinterpret_cast<T*>(&b[0]),reinterpret_cast<T*>(&b[0])+mat.M(),
\n-
614 C, reinterpret_cast<T*>(&d[0]), std::divides<T>());
\n-
615 else
\n-
616 d=b;
\n-
617 a->usmv(-1, x, d);
\n-
618 res.reduction=d.two_norm()/def0;
\n-
619 res.conv_rate = res.reduction;
\n-
620 res.converged=(res.reduction<1e-10||d.two_norm()<1e-18);
\n-
621 */
\n-
622 res.converged=true;
\n-
623
\n-
624 if(verbose) {
\n-
625
\n-
626 dinfo<<"Triangular solve: dgssvx() returns info "<< info<<std::endl;
\n-
627
\n-
628 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
\n-
629
\n-
630 if ( info == 0 || info == nSuperLUCol+1 ) {
\n-
631
\n-
632 if ( options.IterRefine ) {
\n-
633 std::cout<<"Iterative Refinement: steps="
\n-
634 <<stat.RefineSteps<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
\n-
635 }else
\n-
636 std::cout<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
\n-
637 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
\n-
638 std::cout<<"** Estimated memory: "<< info - nSuperLUCol<<" bytes"<<std::endl;
\n-
639 }
\n-
640
\n-
641 if ( options.PrintStat ) StatPrint(&stat);
\n-
642 }
\n-
643 StatFree(&stat);
\n-
644 if (!reusevector) {
\n-
645 SUPERLU_FREE(rB.Store);
\n-
646 SUPERLU_FREE(rX.Store);
\n-
647 }
\n-
648 }
\n-
\n-
649
\n-
650 template<typename M>
\n-
651 void SuperLU<M>
\n-
\n-
652 ::apply(T* x, T* b)
\n-
653 {
\n-
654 if(mat.N()+mat.M()==0)
\n-
655 DUNE_THROW(ISTLError, "Matrix of SuperLU is null!");
\n-
656
\n-
657 SuperMatrix* mB = &B;
\n-
658 SuperMatrix* mX = &X;
\n-
659 SuperMatrix rB, rX;
\n-
660 if (reusevector) {
\n-
661 if(first) {
\n-
662 SuperLUDenseMatChooser<T>::create(&B, mat.N(), 1, b, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
\n-
663 SuperLUDenseMatChooser<T>::create(&X, mat.N(), 1, x, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
\n-
664 first=false;
\n-
665 }else{
\n-
666 ((DNformat*) B.Store)->nzval=b;
\n-
667 ((DNformat*)X.Store)->nzval=x;
\n-
668 }
\n-
669 } else {
\n-
670 SuperLUDenseMatChooser<T>::create(&rB, mat.N(), 1, b, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
\n-
671 SuperLUDenseMatChooser<T>::create(&rX, mat.N(), 1, x, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
\n-
672 mB = &rB;
\n-
673 mX = &rX;
\n-
674 }
\n-
675
\n-
676 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr;
\n-
677 int info;
\n-
678 mem_usage_t memusage;
\n-
679 SuperLUStat_t stat;
\n-
680 /* Initialize the statistics variables. */
\n-
681 StatInit(&stat);
\n+
604 // accumulate content in another stream so that we write in correct order
\n+
605 std::stringstream ss;
\n+
606
\n+
607 // we need to append current row and col values to the prefixes
\n+
608 row_prefix.push_back(0);
\n+
609 col_prefix.push_back(0);
\n+
610
\n+
611 // do we need to write nested matrix blocks?
\n+
612 if constexpr (Dune::blockLevel<typename Mat::block_type>() == 0) {
\n+
613 // simple case: write svg block content to stream for each value
\n+
614 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
\n+
615 std::size_t x_off = interspace + col * (interspace + block_size);
\n+
616 std::size_t y_off = interspace + row * (interspace + block_size);
\n+
617 row_prefix.back() = row;
\n+
618 col_prefix.back() = col;
\n+
619 opts.writeSVGBlock(ss, row_prefix, col_prefix, val,
\n+
620 {x_off, y_off, block_size, block_size});
\n+
621 });
\n+
622 col_offset += cols * (block_size + interspace);
\n+
623 row_offset += rows * (block_size + interspace);
\n+
624 } else {
\n+
625 // before we write anything, we need to calculate the
\n+
626 // offset for every {row,col} index
\n+
627 const auto null_offset = std::numeric_limits<std::size_t>::max();
\n+
628 std::vector<std::size_t> col_offsets(cols + 1, null_offset);
\n+
629 std::vector<std::size_t> row_offsets(rows + 1, null_offset);
\n+
630 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
\n+
631 NullStream dev0;
\n+
632 // get size of sub-block
\n+
633 auto sub_size =
\n+
634 writeSVGMatrix(dev0, val, opts, row_prefix, col_prefix);
\n+
635
\n+
636 // if we didn't see col size before
\n+
637 if (col_offsets[col + 1] == null_offset) // write it in the offset vector
\n+
638 col_offsets[col + 1] = sub_size.first;
\n+
639
\n+
640 // repeat process for row sizes
\n+
641 if (row_offsets[row + 1] == null_offset)
\n+
642 row_offsets[row + 1] = sub_size.second;
\n+
643 });
\n+
644
\n+
645 // if some rows/cols were not visited, make an educated guess with the minimum offset
\n+
646 auto min_row_offset = *std::min_element(begin(row_offsets), end(row_offsets));
\n+
647 std::replace(begin(row_offsets), end(row_offsets), null_offset, min_row_offset);
\n+
648 auto min_col_offset = *std::min_element(begin(col_offsets), end(col_offsets));
\n+
649 std::replace(begin(col_offsets), end(col_offsets), null_offset, min_col_offset);
\n+
650
\n+
651 // we have sizes for every block: to get offsets we make a partial sum
\n+
652 col_offsets[0] = interspace;
\n+
653 row_offsets[0] = interspace;
\n+
654 for (std::size_t i = 1; i < col_offsets.size(); i++)
\n+
655 col_offsets[i] += col_offsets[i - 1] + interspace;
\n+
656 for (std::size_t i = 1; i < row_offsets.size(); i++)
\n+
657 row_offsets[i] += row_offsets[i - 1] + interspace;
\n+
658
\n+
659 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
\n+
660 // calculate svg view from offsets
\n+
661 std::size_t width =
\n+
662 col_offsets[col + 1] - col_offsets[col] - interspace;
\n+
663 std::size_t height =
\n+
664 row_offsets[row + 1] - row_offsets[row] - interspace;
\n+
665 row_prefix.back() = row;
\n+
666 col_prefix.back() = col;
\n+
667 // content of the sub-block has origin at {0,0}: shift it to the correct place
\n+
668 ss << "<svg x='" << col_offsets[col] << "' y='" << row_offsets[row]
\n+
669 << "' width='" << width << "' height='" << height << "'>\\n";
\n+
670 // write a nested svg with the contents of the sub-block
\n+
671 writeSVGMatrix(ss, val, opts, row_prefix, col_prefix);
\n+
672 ss << "</svg>\\n";
\n+
673 });
\n+
674 col_offset = col_offsets.back();
\n+
675 row_offset = row_offsets.back();
\n+
676 }
\n+
677
\n+
678 // write content in order!
\n+
679 // (i) if required, first header
\n+
680 if (write_header)
\n+
681 writeSVGMatrixHeader(out, opts, {col_offset, row_offset});
\n
682
\n-
683 options.IterRefine=SLU_DOUBLE;
\n-
684
\n-
685 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
\n-
686 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,
\n-
687 &memusage, &stat, &info);
\n-
688
\n-
689 if(verbose) {
\n-
690 dinfo<<"Triangular solve: dgssvx() returns info "<< info<<std::endl;
\n-
691
\n-
692 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
\n+
683 col_prefix.pop_back();
\n+
684 row_prefix.pop_back();
\n+
685 // (ii) an svg block for this level
\n+
686 opts.writeSVGBlock(out, row_prefix, col_prefix, mat,
\n+
687 {0, 0, col_offset, row_offset});
\n+
688 // (iii) the content of the matrix
\n+
689 out << ss.str();
\n+
690 // (iv) if required, close the header
\n+
691 if (write_header)
\n+
692 out << "</g>\\n</svg>\\n";
\n
693
\n-
694 if ( info == 0 || info == nSuperLUCol+1 ) { // Factorization has succeeded
\n-
695
\n-
696 if ( options.IterRefine ) {
\n-
697 dinfo<<"Iterative Refinement: steps="
\n-
698 <<stat.RefineSteps<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
\n-
699 }else
\n-
700 dinfo<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
\n-
701 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
\n-
702 dinfo<<"** Estimated memory: "<< info - nSuperLUCol<<" bytes"<<std::endl;
\n-
703 }
\n-
704 if ( options.PrintStat ) StatPrint(&stat);
\n-
705 }
\n-
706
\n-
707 StatFree(&stat);
\n-
708 if (!reusevector) {
\n-
709 SUPERLU_FREE(rB.Store);
\n-
710 SUPERLU_FREE(rX.Store);
\n-
711 }
\n-
712 }
\n-
\n-
715 template<typename T, typename A>
\n-
\n-\n-
717 {
\n-
718 enum { value=true};
\n-
719 };
\n-
\n-
720
\n-
721 template<typename T, typename A>
\n-
\n-\n-
723 {
\n-
724 enum { value = true };
\n-
725 };
\n-
\n-
726
\n-
\n-\n-
728 template<class> struct isValidBlock : std::false_type{};
\n-
729 template<int k> struct isValidBlock<Dune::FieldVector<double,k>> : std::true_type{};
\n-
730 template<int k> struct isValidBlock<Dune::FieldVector<std::complex<double>,k>> : std::true_type{};
\n-
731 template<typename TL, typename M>
\n-
732 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
\n-
733 typename Dune::TypeListElement<2, TL>::type>>
\n-
\n-
734 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
\n-
735 std::enable_if_t<isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
\n-
736 {
\n-
737 int verbose = config.get("verbose", 0);
\n-
738 return std::make_shared<Dune::SuperLU<M>>(mat,verbose);
\n-
739 }
\n-
\n-
740
\n-
741 // second version with SFINAE to validate the template parameters of SuperLU
\n-
742 template<typename TL, typename M>
\n-
743 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
\n-
744 typename Dune::TypeListElement<2, TL>::type>>
\n-
\n-
745 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
\n-
746 std::enable_if_t<!isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
\n-
747 {
\n-
748 DUNE_THROW(UnsupportedType,
\n-
749 "Unsupported Type in SuperLU (only double and std::complex<double> supported)");
\n-
750 }
\n-
\n-
751 };
\n-
\n-
752 template<> struct SuperLUCreator::isValidBlock<double> : std::true_type{};
\n-
753 template<> struct SuperLUCreator::isValidBlock<std::complex<double>> : std::true_type{};
\n-
754
\n-\n-
756} // end namespace DUNE
\n-
757
\n-
758// undefine macros from SuperLU's slu_util.h
\n-
759#undef FIRSTCOL_OF_SNODE
\n-
760#undef NO_MARKER
\n-
761#undef NUM_TEMPV
\n-
762#undef USER_ABORT
\n-
763#undef USER_MALLOC
\n-
764#undef SUPERLU_MALLOC
\n-
765#undef USER_FREE
\n-
766#undef SUPERLU_FREE
\n-
767#undef CHECK_MALLOC
\n-
768#undef SUPERLU_MAX
\n-
769#undef SUPERLU_MIN
\n-
770#undef L_SUB_START
\n-
771#undef L_SUB
\n-
772#undef L_NZ_START
\n-
773#undef L_FST_SUPC
\n-
774#undef U_NZ_START
\n-
775#undef U_SUB
\n-
776#undef TRUE
\n-
777#undef FALSE
\n-
778#undef EMPTY
\n-
779#undef NODROP
\n-
780#undef DROP_BASIC
\n-
781#undef DROP_PROWS
\n-
782#undef DROP_COLUMN
\n-
783#undef DROP_AREA
\n-
784#undef DROP_SECONDARY
\n-
785#undef DROP_DYNAMIC
\n-
786#undef DROP_INTERP
\n-
787#undef MILU_ALPHA
\n-
788
\n-
789#endif // HAVE_SUPERLU
\n-
790#endif // DUNE_SUPERLU_HH
\n-\n-
#define DUNE_REGISTER_DIRECT_SOLVER(name,...)
Definition solverregistry.hh:13
\n-\n-
Implementation of the BCRSMatrix class.
\n-
Implementations of the inverse operator interface.
\n-\n-\n-
This file implements a vector space as a tensor product of a given vector space. The number of compon...
\n-
Templates characterizing the type of a solver.
\n-
void setSubMatrix(const Matrix &mat, const S &rowIndexSet)
Definition superlu.hh:457
\n-
void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
Apply inverse operator,.
Definition superlu.hh:563
\n-
void setVerbosity(bool v)
Definition superlu.hh:437
\n-
void free()
free allocated space.
Definition superlu.hh:403
\n-
~SuperLU()
Definition superlu.hh:396
\n-
SuperLU()
Empty default constructor.
Definition superlu.hh:432
\n-
void setMatrix(const Matrix &mat)
Initialize data from given matrix.
Definition superlu.hh:443
\n+
694 // return the total required for this block
\n+
695 return {col_offset, row_offset};
\n+
696 }
\n+
697 } // namespace Impl
\n+
698
\n+
699
\n+
\n+\n+
708 std::size_t block_size = 10;
\n+
710 std::size_t interspace = 5;
\n+
712 std::size_t width = 500;
\n+
714 std::size_t height = 0;
\n+
716 bool write_header = true;
\n+
718 std::string style = " .matrix-block {\\n"
\n+
719 " fill: cornflowerblue;\\n"
\n+
720 " fill-opacity: 0.4;\\n"
\n+
721 " stroke-width: 2;\\n"
\n+
722 " stroke: black;\\n"
\n+
723 " stroke-opacity: 0.5;\\n"
\n+
724 " }\\n"
\n+
725 " .matrix-block:hover {\\n"
\n+
726 " fill: lightcoral;\\n"
\n+
727 " fill-opacity: 0.4;\\n"
\n+
728 " stroke-opacity: 1;\\n"
\n+
729 " }\\n";
\n+
730
\n+
742 std::function<std::string(const double&)> color_fill;
\n+
743
\n+
749 template <class RowPrefix, class ColPrefix>
\n+
\n+
750 std::string blockStyleClass(const RowPrefix &row_prefix,
\n+
751 const ColPrefix &col_prefix) const {
\n+
752 // here, you can potentially give a different style to each block
\n+
753 return "matrix-block";
\n+
754 }
\n+
\n+
755
\n+
757 bool write_block_title = true;
\n+
758
\n+
764 template <class Stream, class RowPrefix, class ColPrefix, class Block>
\n+
\n+
765 void writeBlockTitle(Stream& out, const RowPrefix &row_prefix,
\n+
766 const ColPrefix &col_prefix,
\n+
767 const Block &block) const {
\n+
768 if (this->write_block_title) {
\n+
769 out << "<title>";
\n+
770 assert(row_prefix.size() == col_prefix.size());
\n+
771 for (std::size_t i = 0; i < row_prefix.size(); ++i)
\n+
772 out << "[" << row_prefix[i] << ", "<< col_prefix[i] << "]";
\n+
773 if constexpr (Dune::blockLevel<Block>() == 0)
\n+
774 out << ": " << block;
\n+
775 out << "</title>\\n";
\n+
776 }
\n+
777 }
\n+
\n+
778
\n+
800 template <class Stream, class RowPrefix, class ColPrefix, class Block>
\n+
\n+
801 void writeSVGBlock(Stream &out,
\n+
802 const RowPrefix &row_prefix,
\n+
803 const ColPrefix &col_prefix, const Block block,
\n+
804 const std::array<std::size_t, 4> &svg_box) const {
\n+
805 // get bounding box values
\n+
806 auto &[x_off, y_off, width, height] = svg_box;
\n+
807 // get style class
\n+
808 std::string block_class = this->blockStyleClass(row_prefix, col_prefix);
\n+
809 // write a rectangle on the bounding box
\n+
810 out << "<rect class='" << block_class << "' x='" << x_off << "' y='"
\n+
811 << y_off << "' width='" << width << "' height='" << height << "'";
\n+
812 if constexpr (Dune::blockLevel<Block>() == 0 and std::is_convertible<Block,double>{})
\n+
813 if (color_fill)
\n+
814 out << " style='fill-opacity: 1;fill:" << color_fill(double(block)) << "'";
\n+
815
\n+
816 out << ">\\n";
\n+
817 // give the rectangle a title (in html this shows info about the block)
\n+
818 this->writeBlockTitle(out,row_prefix, col_prefix, block);
\n+
819 // close rectangle
\n+
820 out << "</rect>\\n";
\n+
821 }
\n+
\n+
822 };
\n+
\n+
823
\n+
838 template <class Mat, class SVGOptions = DefaultSVGMatrixOptions>
\n+
\n+
839 void writeSVGMatrix(std::ostream &out, const Mat &mat, SVGOptions opts = {}) {
\n+
840 // We need a vector that can fit all the multi-indices for rows and columns
\n+
841 using IndexPrefix = Dune::ReservedVector<std::size_t, blockLevel<Mat>()>;
\n+
842 // Call overload for Mat type
\n+
843 Impl::writeSVGMatrix(out, mat, opts, IndexPrefix{}, IndexPrefix{});
\n+
844 }
\n+
\n+
845
\n+
863 template <class Mat, class SVGOptions = DefaultSVGMatrixOptions>
\n+
864 [[deprecated("Use signature where std::stream is the first argument. This will be removed after Dune 2.10.")]]
\n+
\n+
865 void writeSVGMatrix(const Mat &mat, std::ostream &out, SVGOptions opts = {}) {
\n+
866 writeSVGMatrix(out, mat, opts);
\n+
867 }
\n+
\n+
868
\n+
871} // namespace Dune
\n+
872
\n+
873#endif
\n+
Implementation of the BCRSMatrix class.
\n+\n+
Helper functions for determining the vector/matrix block level.
\n+
Some handy generic functions for ISTL matrices.
\n+
Col col
Definition matrixmatrix.hh:351
\n
Matrix & mat
Definition matrixmatrix.hh:347
\n+
void writeMatrixToMatlab(const MatrixType &matrix, const std::string &filename, int outputPrecision=18)
Writes sparse matrix in a Matlab-readable format.
Definition io.hh:483
\n+
void writeMatrixToMatlabHelper(const FieldType &value, int rowOffset, int colOffset, std::ostream &s)
Helper method for the writeMatrixToMatlab routine.
Definition io.hh:412
\n+
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)
Print one row of a matrix, specialization for number types.
Definition io.hh:152
\n+
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
\n+
void printSparseMatrix(std::ostream &s, const BCRSMatrix< InnerMatrixType, A > &mat, std::string title, std::string rowtext, int width=3, int precision=2)
Prints a BCRSMatrix with fixed sized blocks.
Definition io.hh:301
\n+
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
\n+
void writeVectorToMatlabHelper(const V &v, std::ostream &stream)
Definition io.hh:496
\n+
void writeSVGMatrix(std::ostream &out, const Mat &mat, SVGOptions opts={})
Writes the visualization of matrix in the SVG format.
Definition io.hh:839
\n+
void writeVectorToMatlab(const VectorType &vector, const std::string &filename, int outputPrecision=18)
Writes vectors in a Matlab-readable format.
Definition io.hh:524
\n+
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
\n+
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
\n
STL namespace.
\n
Definition allocator.hh:11
\n-
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
\n+
Definition matrixutils.hh:211
\n+
static auto coldim(const M &A)
Definition matrixutils.hh:219
\n+
static auto rowdim(const M &A)
Definition matrixutils.hh:214
\n
A sparse block matrix with compressed row storage.
Definition bcrsmatrix.hh:466
\n-
derive error class from the base class in common
Definition istlexception.hh:19
\n-
Sequential overlapping Schwarz preconditioner.
Definition overlappingschwarz.hh:755
\n-
Definition overlappingschwarz.hh:694
\n+
Default options class to write SVG matrices.
Definition io.hh:706
\n+
std::string style
CSS style block to write in header.
Definition io.hh:718
\n+
std::size_t width
Final width size (pixels) of the SVG header. If 0, size is automatic.
Definition io.hh:712
\n+
std::function< std::string(const double &)> color_fill
Color fill for default options.
Definition io.hh:742
\n+
std::size_t block_size
size (pixels) of the deepst block/value of the matrix
Definition io.hh:708
\n+
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:801
\n+
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:765
\n+
std::size_t interspace
size (pixels) of the interspace between blocks
Definition io.hh:710
\n+
bool write_block_title
(Helper) Whether to write a title on the rectangle value
Definition io.hh:757
\n+
std::size_t height
Final height size (pixels) of the SVG header. If 0, size is automatic.
Definition io.hh:714
\n+
bool write_header
Whether to write the SVG header.
Definition io.hh:716
\n+
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:750
\n+
ConstIterator class for sequential access.
Definition matrix.hh:404
\n
A generic dynamic dense matrix.
Definition matrix.hh:561
\n+
RowIterator end()
Get iterator to one beyond last row.
Definition matrix.hh:616
\n+
RowIterator begin()
Get iterator to first row.
Definition matrix.hh:610
\n+
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition matrix.hh:589
\n
size_type M() const
Return the number of columns.
Definition matrix.hh:696
\n
size_type N() const
Return the number of rows.
Definition matrix.hh:691
\n-
Statistics about the application of an inverse operator.
Definition solver.hh:50
\n-
int iterations
Number of iterations.
Definition solver.hh:69
\n-
bool converged
True if convergence criterion has been met.
Definition solver.hh:75
\n-
Abstract base class for all solvers.
Definition solver.hh:101
\n-
Category
Definition solvercategory.hh:23
\n-
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
\n-
Definition solverregistry.hh:77
\n-
Definition solvertype.hh:16
\n-
@ value
Whether this is a direct solver.
Definition solvertype.hh:24
\n-
Definition solvertype.hh:30
\n-
@ value
whether the solver internally uses column compressed storage
Definition solvertype.hh:36
\n-
Definition superlu.hh:45
\n-
Definition superlu.hh:49
\n-
Definition superlu.hh:53
\n-
Definition superlu.hh:57
\n-
SuperLu Solver.
Definition superlu.hh:271
\n-
SuperLUMatrix::size_type nnz() const
Definition superlu.hh:355
\n-
void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
apply inverse operator, with given convergence criteria.
Definition superlu.hh:342
\n-
typename Impl::SuperLUVectorChooser< M >::range_type range_type
The type of the range of the solver.
Definition superlu.hh:284
\n-
M matrix_type
Definition superlu.hh:276
\n-
SuperMatrixInitializer< Matrix > MatrixInitializer
Type of an associated initializer class.
Definition superlu.hh:280
\n-
M Matrix
The matrix type.
Definition superlu.hh:275
\n-
typename Impl::SuperLUVectorChooser< M >::domain_type domain_type
The type of the domain of the solver.
Definition superlu.hh:282
\n-
const char * name()
Definition superlu.hh:371
\n-
virtual SolverCategory::Category category() const
Category of the solver (see SolverCategory::Category)
Definition superlu.hh:287
\n-
Dune::SuperLUMatrix< Matrix > SuperLUMatrix
The corresponding SuperLU Matrix type.
Definition superlu.hh:278
\n-
SuperLU(const Matrix &mat, const ParameterTree &config)
Constructs the SuperLU solver.
Definition superlu.hh:320
\n-
Definition superlu.hh:727
\n-
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
\n-
Definition superlu.hh:728
\n-
Definition supermatrix.hh:132
\n-
Utility class for converting an ISTL Matrix into a SuperLU Matrix.
Definition supermatrix.hh:175
\n-
Definition supermatrix.hh:179
\n+
Definition matrixutils.hh:27
\n
\n \n
\n Generated by \"doxygen\"/ 1.9.8\n
\n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,947 +1,838 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-superlu.hh\n+io.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_SUPERLU_HH\n-6#define DUNE_ISTL_SUPERLU_HH\n+5#ifndef DUNE_ISTL_IO_HH\n+6#define DUNE_ISTL_IO_HH\n 7\n-8#if HAVE_SUPERLU\n-9\n-10#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\n-11#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n-12#include \"_\bs_\bu_\bp_\be_\br_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-13#include \n-14#include \n-15#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-16#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15\n+16#include \"_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\"\n 17#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-18#include \n-19#include \n-20#include \n-21#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-22#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n-23\n-24namespace _\bD_\bu_\bn_\be\n-25{\n-26\n-37 template\n-38 class SeqOverlappingSchwarz;\n-39\n-40 template\n-41 struct SeqOverlappingSchwarzAssemblerHelper;\n-42\n-43 template\n-_\b4_\b4 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n-45 {};\n-46\n-47 template\n-_\b4_\b8 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br\n-49 {};\n-50\n-51 template\n-_\b5_\b2 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bQ_\bu_\be_\br_\by_\bC_\bh_\bo_\bo_\bs_\be_\br\n-53 {};\n-54\n-55 template\n-_\b5_\b6 struct _\bQ_\bu_\be_\br_\by_\bS_\bp_\ba_\bc_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n-57 {};\n-58\n-59#if __has_include(\"slu_sdefs.h\")\n-60 template<>\n-61 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br\n-62 {\n-63 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, float *dat, int n1,\n-64 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n-65 {\n-66 sCreate_Dense_Matrix(_\bm_\ba_\bt, n, m, dat, n1, stype, dtype, mtype);\n-67\n-68 }\n-69\n-70 static void destroy(SuperMatrix*)\n-71 {}\n-72\n-73 };\n-74 template<>\n-75 struct SuperLUSolveChooser\n-76 {\n-77 static void solve(superlu_options_t *options, SuperMatrix *_\bm_\ba_\bt, int *perm_c,\n-int *perm_r, int *etree,\n-78 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,\n-79 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,\n-80 float *rpg, float *rcond, float *ferr, float *berr,\n-81 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)\n-82 {\n-83 GlobalLU_t gLU;\n-84 sgssvx(options, _\bm_\ba_\bt, perm_c, perm_r, etree, equed, R, C,\n-85 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,\n-86 &gLU, memusage, stat, info);\n-87 }\n-88 };\n-89\n-90 template<>\n-91 struct QuerySpaceChooser\n+18#include \n+19#include \n+20#include \n+21#include \n+22\n+23#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+24#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+25\n+26namespace _\bD_\bu_\bn_\be {\n+27\n+40 //\n+41 // pretty printing of vectors\n+42 //\n+43\n+51 template\n+_\b5_\b2 void _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b__\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br (std::ostream& s, const V& v, std::string\n+rowtext,\n+53 int& counter, int columns, int width)\n+54 {\n+55 if constexpr (IsNumber())\n+56 {\n+57 // Print one number\n+58 if (counter%columns==0)\n+59 {\n+60 s << rowtext; // start a new row\n+61 s << \" \"; // space in front of each entry\n+62 s.width(4); // set width for counter\n+63 s << counter; // number of first entry in a line\n+64 }\n+65 s << \" \"; // space in front of each entry\n+66 s.width(width); // set width for each entry anew\n+67 s << v; // yeah, the number !\n+68 counter++; // increment the counter\n+69 if (counter%columns==0)\n+70 s << std::endl; // start a new line\n+71 }\n+72 else\n+73 {\n+74 // Recursively print a vector\n+75 for (const auto& entry : v)\n+76 _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b__\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(s,entry,rowtext,counter,columns,width);\n+77 }\n+78 }\n+79\n+80\n+88 template\n+_\b8_\b9 void _\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br (std::ostream& s, const V& v, std::string title,\n+90 std::string rowtext, int columns=1, int width=10,\n+91 int precision=2)\n 92 {\n-93 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t*\n-memusage)\n-94 {\n-95 sQuerySpace(L,U,memusage);\n-96 }\n-97 };\n+93 // count the numbers printed to make columns\n+94 int counter=0;\n+95\n+96 // remember old flags\n+97 std::ios_base::fmtflags oldflags = s.flags();\n 98\n-99#endif\n-100\n-101#if __has_include(\"slu_ddefs.h\")\n-102\n-103 template<>\n-104 struct SuperLUDenseMatChooser\n-105 {\n-106 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, double *dat, int n1,\n-107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n-108 {\n-109 dCreate_Dense_Matrix(_\bm_\ba_\bt, n, m, dat, n1, stype, dtype, mtype);\n+99 // set the output format\n+100 s.setf(std::ios_base::scientific, std::ios_base::floatfield);\n+101 int oldprec = s.precision();\n+102 s.precision(precision);\n+103\n+104 // print title\n+105 s << title << \" [blocks=\" << v.N() << \",dimension=\" << v.dim() << \"]\"\n+106 << std::endl;\n+107\n+108 // print data from all blocks\n+109 _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b__\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(s,v,rowtext,counter,columns,width);\n 110\n-111 }\n-112\n-113 static void destroy(SuperMatrix * /* mat */)\n-114 {}\n-115 };\n-116 template<>\n-117 struct SuperLUSolveChooser\n-118 {\n-119 static void solve(superlu_options_t *options, SuperMatrix *_\bm_\ba_\bt, int\n-*perm_c, int *perm_r, int *etree,\n-120 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,\n-121 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,\n-122 double *rpg, double *rcond, double *ferr, double *berr,\n-123 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)\n-124 {\n-125 GlobalLU_t gLU;\n-126 dgssvx(options, _\bm_\ba_\bt, perm_c, perm_r, etree, equed, R, C,\n-127 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,\n-128 &gLU, memusage, stat, info);\n-129 }\n-130 };\n-131\n-132 template<>\n-133 struct QuerySpaceChooser\n+111 // check if new line is required\n+112 if (counter%columns!=0)\n+113 s << std::endl;\n+114\n+115 // reset the output format\n+116 s.flags(oldflags);\n+117 s.precision(oldprec);\n+118 }\n+119\n+120\n+122 //\n+123 // pretty printing of matrices\n+124 //\n+125\n+_\b1_\b3_\b3 inline void _\bf_\bi_\bl_\bl_\b__\br_\bo_\bw (std::ostream& s, int m, int width, [[maybe_unused]]\n+int precision)\n 134 {\n-135 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t*\n-memusage)\n+135 for (int j=0; j\n-144 struct SuperLUDenseMatChooser<_\bs_\bt_\bd::complex >\n-145 {\n-146 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, std::complex\n-*dat, int n1,\n-147 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n-148 {\n-149 zCreate_Dense_Matrix(_\bm_\ba_\bt, n, m, reinterpret_cast(dat), n1,\n-stype, dtype, mtype);\n-150\n-151 }\n-152\n-153 static void destroy(SuperMatrix*)\n-154 {}\n-155 };\n-156\n-157 template<>\n-158 struct SuperLUSolveChooser<_\bs_\bt_\bd::complex >\n-159 {\n-160 static void solve(superlu_options_t *options, SuperMatrix *_\bm_\ba_\bt, int\n-*perm_c, int *perm_r, int *etree,\n-161 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,\n-162 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,\n-163 double *rpg, double *rcond, double *ferr, double *berr,\n-164 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)\n-165 {\n-166 GlobalLU_t gLU;\n-167 zgssvx(options, _\bm_\ba_\bt, perm_c, perm_r, etree, equed, R, C,\n-168 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,\n-169 &gLU, memusage, stat, info);\n-170 }\n-171 };\n-172\n-173 template<>\n-174 struct QuerySpaceChooser<_\bs_\bt_\bd::complex >\n-175 {\n-176 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t*\n-memusage)\n-177 {\n-178 zQuerySpace(L,U,memusage);\n-179 }\n-180 };\n-181#endif\n-182\n-183#if __has_include(\"slu_cdefs.h\")\n-184 template<>\n-185 struct SuperLUDenseMatChooser<_\bs_\bt_\bd::complex >\n-186 {\n-187 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, std::complex\n-*dat, int n1,\n-188 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n-189 {\n-190 cCreate_Dense_Matrix(_\bm_\ba_\bt, n, m, reinterpret_cast< ::complex*>(dat), n1,\n-stype, dtype, mtype);\n-191\n-192 }\n-193\n-194 static void destroy(SuperMatrix* /* mat */)\n-195 {}\n-196 };\n-197\n-198 template<>\n-199 struct SuperLUSolveChooser<_\bs_\bt_\bd::complex >\n-200 {\n-201 static void solve(superlu_options_t *options, SuperMatrix *_\bm_\ba_\bt, int\n-*perm_c, int *perm_r, int *etree,\n-202 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,\n-203 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,\n-204 float *rpg, float *rcond, float *ferr, float *berr,\n-205 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)\n-206 {\n-207 GlobalLU_t gLU;\n-208 cgssvx(options, _\bm_\ba_\bt, perm_c, perm_r, etree, equed, R, C,\n-209 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,\n-210 &gLU, memusage, stat, info);\n-211 }\n-212 };\n-213\n-214 template<>\n-215 struct QuerySpaceChooser<_\bs_\bt_\bd::complex >\n-216 {\n-217 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t*\n-memusage)\n-218 {\n-219 cQuerySpace(L,U,memusage);\n-220 }\n-221 };\n-222#endif\n-223\n-224 namespace Impl\n-225 {\n-226 template\n-227 struct SuperLUVectorChooser\n-228 {};\n-229\n-230 template\n-231 struct SuperLUVectorChooser,A > >\n-232 {\n-234 using domain_type = BlockVector<\n-235 FieldVector,\n-236 typename std::allocator_traits::template rebind_alloc >\n->;\n-238 using range_type = BlockVector<\n-239 FieldVector,\n-240 typename std::allocator_traits::template rebind_alloc >\n->;\n-241 };\n-242\n-243 template\n-244 struct SuperLUVectorChooser >\n-245 {\n-247 using domain_type = BlockVector;\n-249 using range_type = BlockVector;\n-250 };\n-251 }\n-252\n-266 template\n-_\b2_\b6_\b7 class _\bS_\bu_\bp_\be_\br_\bL_\bU\n-268 : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br<\n-269 typename Impl::SuperLUVectorChooser::domain_type,\n-270 typename Impl::SuperLUVectorChooser::range_type >\n-271 {\n-272 using T = typename M::field_type;\n-273 public:\n-_\b2_\b7_\b5 using _\bM_\ba_\bt_\br_\bi_\bx = M;\n-_\b2_\b7_\b6 using _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be = M;\n-_\b2_\b7_\b8 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx;\n-_\b2_\b8_\b0 typedef _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n-_\b2_\b8_\b2 using _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be = typename Impl::SuperLUVectorChooser::domain_type;\n-_\b2_\b8_\b4 using _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be = typename Impl::SuperLUVectorChooser::range_type;\n-285\n-_\b2_\b8_\b7 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-288 {\n-289 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-290 }\n-291\n-306 explicit _\bS_\bu_\bp_\be_\br_\bL_\bU(const _\bM_\ba_\bt_\br_\bi_\bx& mat, bool verbose=false,\n-307 bool reusevector=true);\n-308\n-309\n-_\b3_\b2_\b0 _\bS_\bu_\bp_\be_\br_\bL_\bU(const _\bM_\ba_\bt_\br_\bi_\bx& mat, const ParameterTree& config)\n-321 : _\bS_\bu_\bp_\be_\br_\bL_\bU(_\bm_\ba_\bt, config._\bg_\be_\bt(\"verbose\", false), config._\bg_\be_\bt\n-(\"reuseVector\", true))\n-322 {}\n-323\n-330 _\bS_\bu_\bp_\be_\br_\bL_\bU();\n-331\n-332 _\b~_\bS_\bu_\bp_\be_\br_\bL_\bU();\n-333\n-337 void _\ba_\bp_\bp_\bl_\by(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res);\n-338\n-_\b3_\b4_\b2 void _\ba_\bp_\bp_\bl_\by (_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, [[maybe_unused]] double\n-reduction, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n-343 {\n-344 _\ba_\bp_\bp_\bl_\by(x,b,res);\n+137 s << \" \"; // space in front of each entry\n+138 s.width(width); // set width for each entry anew\n+139 s << \".\"; // yeah, the number !\n+140 }\n+141 }\n+142\n+150 template::value, int> = 0>\n+_\b1_\b5_\b2 void _\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw (std::ostream& s, const K& value,\n+153 [[maybe_unused]] typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be I,\n+154 [[maybe_unused]] typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be J,\n+155 [[maybe_unused]] typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be therow,\n+156 int width,\n+157 [[maybe_unused]] int precision)\n+158 {\n+159 s << \" \"; // space in front of each entry\n+160 s.width(width); // set width for each entry anew\n+161 s << value;\n+162 }\n+163\n+171 template::value, int> = 0>\n+_\b1_\b7_\b3 void _\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw (std::ostream& s, const M& A, typename M::size_type I,\n+174 typename M::size_type J, typename M::size_type therow,\n+175 int width, int precision)\n+176 {\n+177 typename M::size_type i0=I;\n+178 for (typename M::size_type i=0; i=i0 && therow_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(A,i))\n+181 {\n+182 // the row is in this block row !\n+183 typename M::size_type j0=J;\n+184 for (typename M::size_type j=0; j_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(A,j),width,precision);\n+194\n+195 // advance columns\n+196 j0 += _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(A,j);\n+197 }\n+198 }\n+199 // advance rows\n+200 i0 += _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(A,i);\n+201 }\n+202 }\n+203\n+212 template\n+_\b2_\b1_\b3 void _\bp_\br_\bi_\bn_\bt_\bm_\ba_\bt_\br_\bi_\bx (std::ostream& s, const M& A, std::string title,\n+214 std::string rowtext, int width=10, int precision=2)\n+215 {\n+216\n+217 // remember old flags\n+218 std::ios_base::fmtflags oldflags = s.flags();\n+219\n+220 // set the output format\n+221 s.setf(std::ios_base::scientific, std::ios_base::floatfield);\n+222 int oldprec = s.precision();\n+223 s.precision(precision);\n+224\n+225 // print title\n+226 s << title\n+227 << \" [n=\" << A._\bN()\n+228 << \",m=\" << A._\bM()\n+229 << \",rowdim=\" << _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(A)\n+230 << \",coldim=\" << _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(A)\n+231 << \"]\" << std::endl;\n+232\n+233 // print all rows\n+234 for (typename M::size_type i=0; i::rowdim(A); i++)\n+235 {\n+236 s << rowtext; // start a new row\n+237 s << \" \"; // space in front of each entry\n+238 s.width(4); // set width for counter\n+239 s << i; // number of first entry in a line\n+240 _\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw(s,A,0,0,i,width,precision); // generic print\n+241 s << std::endl; // start a new line\n+242 }\n+243\n+244 // reset the output format\n+245 s.flags(oldflags);\n+246 s.precision(oldprec);\n+247 }\n+248\n+249 namespace Impl\n+250 {\n+251 template\n+252 void printInnerMatrixElement(std::ostream& s,\n+253 const B& innerMatrixElement,\n+254 int innerrow, int innercol)\n+255 {\n+256 s<\n+260 void printInnerMatrixElement(std::ostream& s,\n+261 const ScaledIdentityMatrix innerMatrixElement,\n+262 int innerrow, int innercol)\n+263 {\n+264 if (innerrow == innercol)\n+265 s<\n+271 void printInnerMatrixElement(std::ostream& s,\n+272 const FieldMatrix innerMatrixElement,\n+273 int innerrow, int innercol)\n+274 {\n+275 s<\n+_\b3_\b0_\b1 void _\bp_\br_\bi_\bn_\bt_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx(std::ostream& s,\n+302 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bI_\bn_\bn_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be_\b,_\bA_\b>& _\bm_\ba_\bt,\n+303 std::string title, std::string rowtext,\n+304 int width=3, int precision=2)\n+305 {\n+306 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bI_\bn_\bn_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be_\b,_\bA_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n+307 // remember old flags\n+308 std::ios_base::fmtflags oldflags = s.flags();\n+309 // set the output format\n+310 s.setf(std::ios_base::scientific, std::ios_base::floatfield);\n+311 int oldprec = s.precision();\n+312 s.precision(precision);\n+313 // print title\n+314 s << title\n+315 << \" [n=\" << _\bm_\ba_\bt._\bN()\n+316 << \",m=\" << _\bm_\ba_\bt._\bM()\n+317 << \",rowdim=\" << _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(_\bm_\ba_\bt)\n+318 << \",coldim=\" << _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(_\bm_\ba_\bt)\n+319 << \"]\" << std::endl;\n+320\n+321 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Row;\n+322\n+323 constexpr int n = std::decay_t()))>::rows;\n+324 constexpr int m = std::decay_t()))>::cols;\n+325 for(Row row=_\bm_\ba_\bt._\bb_\be_\bg_\bi_\bn(); row != _\bm_\ba_\bt._\be_\bn_\bd(); ++row) {\n+326 int skipcols=0;\n+327 bool reachedEnd=false;\n+328\n+329 while(!reachedEnd) {\n+330 for(int innerrow=0; innerrowbegin();\n+334 for(; _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl,++count) {\n+335 if(count=skipcols+width)\n+338 break;\n+339 if(innerrow==0) {\n+340 if(count==skipcols) {\n+341 s << rowtext; // start a new row\n+342 s << \" \"; // space in front of each entry\n+343 s.width(4); // set width for counter\n+344 s << row.index()<<\": \"; // number of first entry in a line\n 345 }\n-346\n-350 void _\ba_\bp_\bp_\bl_\by(T* x, T* b);\n-351\n-353 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& mat);\n-354\n-_\b3_\b5_\b5 typename SuperLUMatrix::size_type _\bn_\bn_\bz() const\n-356 {\n-357 return mat.nonzeroes();\n-358 }\n-359\n-360 template\n-361 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& mat, const S& rowIndexSet);\n-362\n-363 void _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(bool v);\n-364\n-369 void _\bf_\br_\be_\be();\n-370\n-_\b3_\b7_\b1 const char* _\bn_\ba_\bm_\be() { return \"SuperLU\"; }\n-372 private:\n-373 template\n-_\b3_\b7_\b4 friend class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n-375 friend struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bS_\bu_\bp_\be_\br_\bL_\bU<_\bM_\ba_\bt_\br_\bi_\bx>,true>;\n-376\n-377 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx& getInternalMatrix() { return _\bm_\ba_\bt; }\n+346 s.width(4);\n+347 s<<_\bc_\bo_\bl.index()<<\": |\";\n+348 } else {\n+349 if(count==skipcols) {\n+350 for(typename std::string::size_type i=0; i < rowtext.length(); i++)\n+351 s<<\" \";\n+352 s<<\" \";\n+353 }\n+354 s<<\" |\";\n+355 }\n+356 for(int innercol=0; innercol < m; ++innercol) {\n+357 s.width(9);\n+358 Impl::printInnerMatrixElement(s,*_\bc_\bo_\bl,innerrow,innercol);\n+359 }\n+360\n+361 s<<\"|\";\n+362 }\n+363 if(innerrow==n-1 && _\bc_\bo_\bl==row->end())\n+364 reachedEnd = true;\n+365 else\n+366 s << std::endl;\n+367 }\n+368 skipcols += width;\n+369 s << std::endl;\n+370 }\n+371 s << std::endl;\n+372 }\n+373\n+374 // reset the output format\n+375 s.flags(oldflags);\n+376 s.precision(oldprec);\n+377 }\n 378\n-380 void decompose();\n-381\n-382 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx _\bm_\ba_\bt;\n-383 SuperMatrix L, U, B, X;\n-384 int *perm_c, *perm_r, *etree;\n-385 typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be *R, *C;\n-386 T *bstore;\n-387 superlu_options_t options;\n-388 char equed;\n-389 void *work;\n-390 int lwork;\n-391 bool first, verbose, reusevector;\n-392 };\n-393\n-394 template\n-395 SuperLU\n-_\b3_\b9_\b6 ::~SuperLU()\n-397 {\n-398 if(_\bm_\ba_\bt._\bN()+_\bm_\ba_\bt._\bM()>0)\n-399 free();\n-400 }\n-401\n-402 template\n-_\b4_\b0_\b3 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bf_\br_\be_\be()\n-404 {\n-405 delete[] perm_c;\n-406 delete[] perm_r;\n-407 delete[] etree;\n-408 delete[] R;\n-409 delete[] C;\n-410 if(lwork>=0) {\n-411 Destroy_SuperNode_Matrix(&L);\n-412 Destroy_CompCol_Matrix(&U);\n-413 }\n-414 lwork=0;\n-415 if(!first && reusevector) {\n-416 SUPERLU_FREE(B.Store);\n-417 SUPERLU_FREE(X.Store);\n-418 }\n-419 _\bm_\ba_\bt.free();\n-420 }\n-421\n-422 template\n-423 _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>\n-_\b4_\b2_\b4_\b _\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU(const _\bM_\ba_\bt_\br_\bi_\bx& mat_, bool verbose_, bool reusevector_)\n-425 : work(0), lwork(0), first(true), verbose(verbose_),\n-426 reusevector(reusevector_)\n-427 {\n-428 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(mat_);\n-429\n-430 }\n-431 template\n-_\b4_\b3_\b2 _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU()\n-433 : work(0), lwork(0),verbose(false),\n-434 reusevector(false)\n-435 {}\n-436 template\n-_\b4_\b3_\b7 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(bool v)\n-438 {\n-439 verbose=v;\n-440 }\n-441\n-442 template\n-_\b4_\b4_\b3 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& mat_)\n-444 {\n-445 if(_\bm_\ba_\bt._\bN()+_\bm_\ba_\bt._\bM()>0) {\n-446 free();\n-447 }\n-448 lwork=0;\n-449 work=0;\n-450 //a=&mat_;\n-451 _\bm_\ba_\bt=mat_;\n-452 decompose();\n-453 }\n-454\n-455 template\n-456 template\n-_\b4_\b5_\b7 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& mat_,\n-458 const S& mrs)\n-459 {\n-460 if(_\bm_\ba_\bt._\bN()+_\bm_\ba_\bt._\bM()>0) {\n-461 free();\n-462 }\n-463 lwork=0;\n-464 work=0;\n-465 //a=&mat_;\n-466 _\bm_\ba_\bt.setMatrix(mat_,mrs);\n-467 decompose();\n-468 }\n-469\n-470 template\n-471 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bd_\be_\bc_\bo_\bm_\bp_\bo_\bs_\be()\n-472 {\n-473\n-474 first = true;\n-475 perm_c = new int[_\bm_\ba_\bt._\bM()];\n-476 perm_r = new int[_\bm_\ba_\bt._\bN()];\n-477 etree = new int[_\bm_\ba_\bt._\bM()];\n-478 R = new typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be[_\bm_\ba_\bt._\bN()];\n-479 C = new typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be[_\bm_\ba_\bt._\bM()];\n-480\n-481 set_default_options(&options);\n-482 // Do the factorization\n-483 B.ncol=0;\n-484 B.Stype=SLU_DN;\n-485 B.Dtype=_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be;\n-486 B.Mtype= SLU_GE;\n-487 DNformat fakeFormat;\n-488 fakeFormat.lda=_\bm_\ba_\bt._\bN();\n-489 B.Store=&fakeFormat;\n-490 X.Stype=SLU_DN;\n-491 X.Dtype=_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be;\n-492 X.Mtype= SLU_GE;\n-493 X.ncol=0;\n-494 X.Store=&fakeFormat;\n-495\n-496 typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be rpg, rcond, ferr=1e10, berr=1e10;\n-497 int info;\n-498 mem_usage_t memusage;\n-499 SuperLUStat_t stat;\n-500\n-501 StatInit(&stat);\n-502 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be(&options, &static_cast(_\bm_\ba_\bt),\n-perm_c, perm_r, etree, &equed, R, C,\n-503 &L, &U, work, lwork, &B, &X, &rpg, &rcond, &ferr,\n-504 &berr, &memusage, &stat, &info);\n+379 namespace\n+380 {\n+381 template\n+382 struct MatlabPODWriter\n+383 {\n+384 static std::ostream& write(const T& t, std::ostream& s)\n+385 {\n+386 s << t;\n+387 return s;\n+388 }\n+389 };\n+390 template\n+391 struct MatlabPODWriter<_\bs_\bt_\bd::complex >\n+392 {\n+393 static std::ostream& write(const std::complex& t, std::ostream& s)\n+394 {\n+395 s << t.real() << \" \" << t.imag();\n+396 return s;\n+397 }\n+398 };\n+399 } // anonymous namespace\n+400\n+410 template ::value, int> = 0>\n+_\b4_\b1_\b2 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br(const FieldType& value,\n+413 int rowOffset, int colOffset,\n+414 std::ostream& s)\n+415 {\n+416 //+1 for Matlab numbering\n+417 s << rowOffset + 1 << \" \" << colOffset + 1 << \" \";\n+418 MatlabPODWriter::write(value, s)<< std::endl;\n+419 }\n+420\n+428 template ::value, int> = 0>\n+_\b4_\b3_\b0 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br(const MatrixType& matrix,\n+431 int externalRowOffset, int externalColOffset,\n+432 std::ostream& s)\n+433 {\n+434 // Precompute the accumulated sizes of the columns\n+435 std::vector colOffset(matrix.M());\n+436 if (colOffset.size() > 0)\n+437 colOffset[0] = 0;\n+438\n+439 for (typename MatrixType::size_type i=0; i_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(matrix,i);\n+442\n+443 typename MatrixType::size_type rowOffset = 0;\n+444\n+445 // Loop over all matrix rows\n+446 for (typename MatrixType::size_type rowIdx=0; rowIdx_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(matrix, rowIdx);\n+459 }\n+460\n+461 }\n+462\n+482 template \n+_\b4_\b8_\b3 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb(const MatrixType& matrix,\n+484 const std::string& filename, int outputPrecision = 18)\n+485 {\n+486 std::ofstream outStream(filename.c_str());\n+487 int oldPrecision = outStream.precision();\n+488 outStream.precision(outputPrecision);\n+489\n+490 _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br(matrix, 0, 0, outStream);\n+491 outStream.precision(oldPrecision);\n+492 }\n+493\n+494 // Recursively write vector entries to a stream\n+495 template\n+_\b4_\b9_\b6 void _\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br (const V& v, std::ostream& stream)\n+497 {\n+498 if constexpr (IsNumber()) {\n+499 stream << v << std::endl;\n+500 } else {\n+501 for (const auto& entry : v)\n+502 _\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br(entry, stream);\n+503 }\n+504 }\n 505\n-506 if(verbose) {\n-507 dinfo<<\"LU factorization: dgssvx() returns info \"<< info<(_\bm_\ba_\bt).ncol;\n-510\n-511 if ( info == 0 || info == nSuperLUCol+1 ) {\n-512\n-513 if ( options.PivotGrowth )\n-514 dinfo<<\"Recip. pivot growth = \"<nnz<nnz<nnz + Ustore->nnz -\n-nSuperLUCol<_\b:_\b:_\bq_\bu_\be_\br_\by_\bS_\bp_\ba_\bc_\be(&L, &U, &memusage);\n-523 dinfo<<\"L\\\\U MB \"< 0 && lwork == -1 ) { // Memory allocation failed\n-528 dinfo<<\"** Estimated memory: \"<< info - nSuperLUCol<colptr[i]; c < Ustore->colptr[i+1]; ++c)\n-540 //if(Ustore->rowind[c]==i)\n-541 std::cout<rowind[c]<<\"->\"<<((double*)Ustore->nzval)[c]<<\" \";\n-542 if(k==0){\n-543 //\n-544 k=-1;\n-545 }std::cout<colptr[i]; c < Ustore->colptr[i+1]; ++c)\n-551 //if(Ustore->rowind[c]==i)\n-552 std::cout<rowind[c]<<\"->\"<<((double*)Ustore->nzval)[c]<<\" \";\n-553 if(k==0){\n-554 //\n-555 k=-1;\n-556 }std::cout<\n+_\b5_\b2_\b4 void _\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb(const VectorType& vector,\n+525 const std::string& filename, int outputPrecision = 18)\n+526 {\n+527 std::ofstream outStream(filename.c_str());\n+528 int oldPrecision = outStream.precision();\n+529 outStream.precision(outputPrecision);\n+530\n+531 _\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br(vector, outStream);\n+532 outStream.precision(oldPrecision);\n+533 }\n+534\n+535 namespace Impl {\n+536\n+538 struct NullStream {\n+539 template \n+540 friend NullStream &operator<<(NullStream &dev0, Any &&) {\n+541 return dev0;\n+542 }\n+543 };\n+544\n+546 // svg shall be closed with a group and an svg. i.e. \"\"\n+547 template \n+548 void writeSVGMatrixHeader(Stream &out, const SVGMatrixOptions &opts,\n+549 std::pair offsets) {\n+550 auto [col_offset, row_offset] = offsets;\n+551 double width = opts.width;\n+552 double height = opts.height;\n+553 // if empty, we try to figure out a sensible value of width and height\n+554 if (opts.width == 0 and opts.height == 0)\n+555 width = height = 500;\n+556 if (opts.width == 0)\n+557 width = opts.height * (double(col_offset) / row_offset);\n+558 if (opts.height == 0)\n+559 height = opts.width * (double(row_offset) / col_offset);\n 560\n-561 template\n-562 void SuperLU\n-_\b5_\b6_\b3 ::apply(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n-564 {\n-565 if (_\bm_\ba_\bt._\bN() != b.dim())\n-566 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Size of right-hand-side vector b does not match the\n-number of matrix rows!\");\n-567 if (_\bm_\ba_\bt._\bM() != x.dim())\n-568 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Size of solution vector x does not match the number\n-of matrix columns!\");\n-569 if (_\bm_\ba_\bt._\bM()+_\bm_\ba_\bt._\bN()==0)\n-570 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Matrix of SuperLU is null!\");\n-571\n-572 SuperMatrix* mB = &B;\n-573 SuperMatrix* mX = &X;\n-574 SuperMatrix rB, rX;\n-575 if (reusevector) {\n-576 if(first) {\n-577 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&B, (int)_\bm_\ba_\bt._\bN(), 1, reinterpret_cast\n-(&b[0]), (int)_\bm_\ba_\bt._\bN(), SLU_DN, _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n-578 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&X, (int)_\bm_\ba_\bt._\bN(), 1, reinterpret_cast\n-(&x[0]), (int)_\bm_\ba_\bt._\bN(), SLU_DN, _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n-579 first=false;\n-580 }else{\n-581 ((DNformat*)B.Store)->nzval=&b[0];\n-582 ((DNformat*)X.Store)->nzval=&x[0];\n-583 }\n-584 } else {\n-585 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&rB, (int)_\bm_\ba_\bt._\bN(), 1,\n-reinterpret_cast(&b[0]), (int)_\bm_\ba_\bt._\bN(), SLU_DN, _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be,\n-SLU_GE);\n-586 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&rX, (int)_\bm_\ba_\bt._\bN(), 1,\n-reinterpret_cast(&x[0]), (int)_\bm_\ba_\bt._\bN(), SLU_DN, _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be,\n-SLU_GE);\n-587 mB = &rB;\n-588 mX = &rX;\n-589 }\n-590 typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be rpg, rcond, ferr=1e10, berr;\n-591 int info;\n-592 mem_usage_t memusage;\n-593 SuperLUStat_t stat;\n-594 /* Initialize the statistics variables. */\n-595 StatInit(&stat);\n-596 /*\n-597 range_type d=b;\n-598 a->usmv(-1, x, d);\n-599\n-600 double def0=d.two_norm();\n-601 */\n-602 options.IterRefine=SLU_DOUBLE;\n+561 // scale group w.r.t final offsets\n+562 double scale_width = width / col_offset;\n+563 double scale_height = height / row_offset;\n+564\n+565 // write the header text\n+566 out << \"\\n\"\n+568 << \"\\n\"\n+570 << \"\\n\";\n+572 }\n+573\n+575 template \n+577 std::pair\n+578 writeSVGMatrix(Stream &out, const Mat &_\bm_\ba_\bt, SVGMatrixOptions opts,\n+579 RowPrefix row_prefix, ColPrefix col_prefix) {\n+580 // get values to fill the offsets\n+581 const auto& block_size = opts.block_size;\n+582 const auto& interspace = opts.interspace;\n+583\n+584 const std::size_t rows = _\bm_\ba_\bt.N();\n+585 const std::size_t cols = _\bm_\ba_\bt.M();\n+586\n+587 // disable header write for recursive calls\n+588 const bool write_header = opts.write_header;\n+589 opts.write_header = false;\n+590\n+591 // counter of offsets for every block\n+592 std::size_t row_offset = interspace;\n+593 std::size_t col_offset = interspace;\n+594\n+595 // lambda helper: for-each value\n+596 auto for_each_entry = [&_\bm_\ba_\bt](const auto &call_back) {\n+597 for (auto row_it = _\bm_\ba_\bt.begin(); row_it != _\bm_\ba_\bt.end(); ++row_it) {\n+598 for (auto col_it = row_it->begin(); col_it != row_it->end(); ++col_it) {\n+599 call_back(row_it.index(), col_it.index(), *col_it);\n+600 }\n+601 }\n+602 };\n 603\n-604 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be(&options, &static_cast(_\bm_\ba_\bt),\n-perm_c, perm_r, etree, &equed, R, C,\n-605 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,\n-606 &memusage, &stat, &info);\n-607\n-608 res._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs=1;\n-609\n-610 /*\n-611 if(options.Equil==YES)\n-612 // undo scaling of right hand side\n-613 std::transform(reinterpret_cast(&b[0]),reinterpret_cast(&b\n-[0])+mat.M(),\n-614 C, reinterpret_cast(&d[0]), std::divides());\n-615 else\n-616 d=b;\n-617 a->usmv(-1, x, d);\n-618 res.reduction=d.two_norm()/def0;\n-619 res.conv_rate = res.reduction;\n-620 res.converged=(res.reduction<1e-10||d.two_norm()<1e-18);\n-621 */\n-622 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd=true;\n-623\n-624 if(verbose) {\n-625\n-626 dinfo<<\"Triangular solve: dgssvx() returns info \"<< info<(_\bm_\ba_\bt).ncol;\n-629\n-630 if ( info == 0 || info == nSuperLUCol+1 ) {\n-631\n-632 if ( options.IterRefine ) {\n-633 std::cout<<\"Iterative Refinement: steps=\"\n-634 < 0 && lwork == -1 ) { // Memory allocation failed\n-638 std::cout<<\"** Estimated memory: \"<< info - nSuperLUCol<<\" bytes\"<\n-651 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>\n-_\b6_\b5_\b2_\b _\b:_\b:_\ba_\bp_\bp_\bl_\by(T* x, T* b)\n-653 {\n-654 if(_\bm_\ba_\bt._\bN()+_\bm_\ba_\bt._\bM()==0)\n-655 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Matrix of SuperLU is null!\");\n-656\n-657 SuperMatrix* mB = &B;\n-658 SuperMatrix* mX = &X;\n-659 SuperMatrix rB, rX;\n-660 if (reusevector) {\n-661 if(first) {\n-662 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&B, _\bm_\ba_\bt._\bN(), 1, b, _\bm_\ba_\bt._\bN(), SLU_DN,\n-_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n-663 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&X, _\bm_\ba_\bt._\bN(), 1, x, _\bm_\ba_\bt._\bN(), SLU_DN,\n-_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n-664 first=false;\n-665 }else{\n-666 ((DNformat*) B.Store)->nzval=b;\n-667 ((DNformat*)X.Store)->nzval=x;\n-668 }\n-669 } else {\n-670 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&rB, _\bm_\ba_\bt._\bN(), 1, b, _\bm_\ba_\bt._\bN(), SLU_DN,\n-_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n-671 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&rX, _\bm_\ba_\bt._\bN(), 1, x, _\bm_\ba_\bt._\bN(), SLU_DN,\n-_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n-672 mB = &rB;\n-673 mX = &rX;\n-674 }\n-675\n-676 typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be rpg, rcond, ferr=1e10, berr;\n-677 int info;\n-678 mem_usage_t memusage;\n-679 SuperLUStat_t stat;\n-680 /* Initialize the statistics variables. */\n-681 StatInit(&stat);\n+604 // accumulate content in another stream so that we write in correct order\n+605 std::stringstream ss;\n+606\n+607 // we need to append current row and col values to the prefixes\n+608 row_prefix.push_back(0);\n+609 col_prefix.push_back(0);\n+610\n+611 // do we need to write nested matrix blocks?\n+612 if constexpr (Dune::blockLevel() == 0) {\n+613 // simple case: write svg block content to stream for each value\n+614 for_each_entry([&](const auto &row, const auto &_\bc_\bo_\bl, const auto &val) {\n+615 std::size_t x_off = interspace + _\bc_\bo_\bl * (interspace + block_size);\n+616 std::size_t y_off = interspace + row * (interspace + block_size);\n+617 row_prefix.back() = row;\n+618 col_prefix.back() = _\bc_\bo_\bl;\n+619 opts.writeSVGBlock(ss, row_prefix, col_prefix, val,\n+620 {x_off, y_off, block_size, block_size});\n+621 });\n+622 col_offset += cols * (block_size + interspace);\n+623 row_offset += rows * (block_size + interspace);\n+624 } else {\n+625 // before we write anything, we need to calculate the\n+626 // offset for every {row,col} index\n+627 const auto null_offset = std::numeric_limits::max();\n+628 std::vector col_offsets(cols + 1, null_offset);\n+629 std::vector row_offsets(rows + 1, null_offset);\n+630 for_each_entry([&](const auto &row, const auto &_\bc_\bo_\bl, const auto &val) {\n+631 NullStream dev0;\n+632 // get size of sub-block\n+633 auto sub_size =\n+634 writeSVGMatrix(dev0, val, opts, row_prefix, col_prefix);\n+635\n+636 // if we didn't see col size before\n+637 if (col_offsets[_\bc_\bo_\bl + 1] == null_offset) // write it in the offset vector\n+638 col_offsets[_\bc_\bo_\bl + 1] = sub_size.first;\n+639\n+640 // repeat process for row sizes\n+641 if (row_offsets[row + 1] == null_offset)\n+642 row_offsets[row + 1] = sub_size.second;\n+643 });\n+644\n+645 // if some rows/cols were not visited, make an educated guess with the\n+minimum offset\n+646 auto min_row_offset = *std::min_element(begin(row_offsets), end\n+(row_offsets));\n+647 std::replace(begin(row_offsets), end(row_offsets), null_offset,\n+min_row_offset);\n+648 auto min_col_offset = *std::min_element(begin(col_offsets), end\n+(col_offsets));\n+649 std::replace(begin(col_offsets), end(col_offsets), null_offset,\n+min_col_offset);\n+650\n+651 // we have sizes for every block: to get offsets we make a partial sum\n+652 col_offsets[0] = interspace;\n+653 row_offsets[0] = interspace;\n+654 for (std::size_t i = 1; i < col_offsets.size(); i++)\n+655 col_offsets[i] += col_offsets[i - 1] + interspace;\n+656 for (std::size_t i = 1; i < row_offsets.size(); i++)\n+657 row_offsets[i] += row_offsets[i - 1] + interspace;\n+658\n+659 for_each_entry([&](const auto &row, const auto &_\bc_\bo_\bl, const auto &val) {\n+660 // calculate svg view from offsets\n+661 std::size_t width =\n+662 col_offsets[_\bc_\bo_\bl + 1] - col_offsets[_\bc_\bo_\bl] - interspace;\n+663 std::size_t height =\n+664 row_offsets[row + 1] - row_offsets[row] - interspace;\n+665 row_prefix.back() = row;\n+666 col_prefix.back() = _\bc_\bo_\bl;\n+667 // content of the sub-block has origin at {0,0}: shift it to the correct\n+place\n+668 ss << \"\\n\";\n+670 // write a nested svg with the contents of the sub-block\n+671 writeSVGMatrix(ss, val, opts, row_prefix, col_prefix);\n+672 ss << \"\\n\";\n+673 });\n+674 col_offset = col_offsets.back();\n+675 row_offset = row_offsets.back();\n+676 }\n+677\n+678 // write content in order!\n+679 // (i) if required, first header\n+680 if (write_header)\n+681 writeSVGMatrixHeader(out, opts, {col_offset, row_offset});\n 682\n-683 options.IterRefine=SLU_DOUBLE;\n-684\n-685 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be(&options, &static_cast(_\bm_\ba_\bt),\n-perm_c, perm_r, etree, &equed, R, C,\n-686 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,\n-687 &memusage, &stat, &info);\n-688\n-689 if(verbose) {\n-690 dinfo<<\"Triangular solve: dgssvx() returns info \"<< info<(_\bm_\ba_\bt).ncol;\n+683 col_prefix.pop_back();\n+684 row_prefix.pop_back();\n+685 // (ii) an svg block for this level\n+686 opts.writeSVGBlock(out, row_prefix, col_prefix, _\bm_\ba_\bt,\n+687 {0, 0, col_offset, row_offset});\n+688 // (iii) the content of the matrix\n+689 out << ss.str();\n+690 // (iv) if required, close the header\n+691 if (write_header)\n+692 out << \"\\n\\n\";\n 693\n-694 if ( info == 0 || info == nSuperLUCol+1 ) { // Factorization has succeeded\n-695\n-696 if ( options.IterRefine ) {\n-697 dinfo<<\"Iterative Refinement: steps=\"\n-698 < 0 && lwork == -1 ) { // Memory allocation failed\n-702 dinfo<<\"** Estimated memory: \"<< info - nSuperLUCol<<\" bytes\"<\n-_\b7_\b1_\b6 struct _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br<_\bS_\bu_\bp_\be_\br_\bL_\bU<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx > >\n-717 {\n-_\b7_\b1_\b8 enum { _\bv_\ba_\bl_\bu_\be=true};\n-719 };\n-720\n-721 template\n-_\b7_\b2_\b2 struct _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd<_\bS_\bu_\bp_\be_\br_\bL_\bU<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx > >\n-723 {\n-_\b7_\b2_\b4 enum { _\bv_\ba_\bl_\bu_\be = true };\n-725 };\n-726\n-_\b7_\b2_\b7 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br {\n-_\b7_\b2_\b8 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::false_type{};\n-_\b7_\b2_\b9 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk<_\bD_\bu_\bn_\be::FieldVector> : std::\n-true_type{};\n-_\b7_\b3_\b0 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk<_\bD_\bu_\bn_\be::FieldVector,k>> : std::true_type{};\n-731 template\n-732 std::shared_ptr::type,\n-733 typename Dune::TypeListElement<2, TL>::type>>\n-_\b7_\b3_\b4 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& _\bm_\ba_\bt, const Dune::ParameterTree& config,\n-735 std::enable_if_t<_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk::type::\n-block_type>::value,int> = 0) const\n-736 {\n-737 int verbose = config.get(\"verbose\", 0);\n-738 return std::make_shared>(_\bm_\ba_\bt,verbose);\n-739 }\n-740\n-741 // second version with SFINAE to validate the template parameters of\n-SuperLU\n-742 template\n-743 std::shared_ptr::type,\n-744 typename Dune::TypeListElement<2, TL>::type>>\n-_\b7_\b4_\b5 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /\n-*config*/,\n-746 std::enable_if_t::\n-type::block_type>::value,int> = 0) const\n-747 {\n-748 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be,\n-749 \"Unsupported Type in SuperLU (only double and std::complex\n-supported)\");\n-750 }\n-751 };\n-_\b7_\b5_\b2 template<> struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::true_type{};\n-_\b7_\b5_\b3 template<> struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk<_\bs_\bt_\bd::complex> :\n-std::true_type{};\n-754\n-_\b7_\b5_\b5 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"superlu\", _\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br());\n-756} // end namespace DUNE\n-757\n-758// undefine macros from SuperLU's slu_util.h\n-759#undef FIRSTCOL_OF_SNODE\n-760#undef NO_MARKER\n-761#undef NUM_TEMPV\n-762#undef USER_ABORT\n-763#undef USER_MALLOC\n-764#undef SUPERLU_MALLOC\n-765#undef USER_FREE\n-766#undef SUPERLU_FREE\n-767#undef CHECK_MALLOC\n-768#undef SUPERLU_MAX\n-769#undef SUPERLU_MIN\n-770#undef L_SUB_START\n-771#undef L_SUB\n-772#undef L_NZ_START\n-773#undef L_FST_SUPC\n-774#undef U_NZ_START\n-775#undef U_SUB\n-776#undef TRUE\n-777#undef FALSE\n-778#undef EMPTY\n-779#undef NODROP\n-780#undef DROP_BASIC\n-781#undef DROP_PROWS\n-782#undef DROP_COLUMN\n-783#undef DROP_AREA\n-784#undef DROP_SECONDARY\n-785#undef DROP_DYNAMIC\n-786#undef DROP_INTERP\n-787#undef MILU_ALPHA\n-788\n-789#endif // HAVE_SUPERLU\n-790#endif // DUNE_SUPERLU_HH\n-_\bs_\bu_\bp_\be_\br_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR\n-#define DUNE_REGISTER_DIRECT_SOLVER(name,...)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:13\n-_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+694 // return the total required for this block\n+695 return {col_offset, row_offset};\n+696 }\n+697 } // namespace Impl\n+698\n+699\n+_\b7_\b0_\b6 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs {\n+_\b7_\b0_\b8 std::size_t _\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be = 10;\n+_\b7_\b1_\b0 std::size_t _\bi_\bn_\bt_\be_\br_\bs_\bp_\ba_\bc_\be = 5;\n+_\b7_\b1_\b2 std::size_t _\bw_\bi_\bd_\bt_\bh = 500;\n+_\b7_\b1_\b4 std::size_t _\bh_\be_\bi_\bg_\bh_\bt = 0;\n+_\b7_\b1_\b6 bool _\bw_\br_\bi_\bt_\be_\b__\bh_\be_\ba_\bd_\be_\br = true;\n+_\b7_\b1_\b8 std::string _\bs_\bt_\by_\bl_\be = \" .matrix-block {\\n\"\n+719 \" fill: cornflowerblue;\\n\"\n+720 \" fill-opacity: 0.4;\\n\"\n+721 \" stroke-width: 2;\\n\"\n+722 \" stroke: black;\\n\"\n+723 \" stroke-opacity: 0.5;\\n\"\n+724 \" }\\n\"\n+725 \" .matrix-block:hover {\\n\"\n+726 \" fill: lightcoral;\\n\"\n+727 \" fill-opacity: 0.4;\\n\"\n+728 \" stroke-opacity: 1;\\n\"\n+729 \" }\\n\";\n+730\n+_\b7_\b4_\b2 std::function _\bc_\bo_\bl_\bo_\br_\b__\bf_\bi_\bl_\bl;\n+743\n+749 template \n+_\b7_\b5_\b0 std::string _\bb_\bl_\bo_\bc_\bk_\bS_\bt_\by_\bl_\be_\bC_\bl_\ba_\bs_\bs(const RowPrefix &row_prefix,\n+751 const ColPrefix &col_prefix) const {\n+752 // here, you can potentially give a different style to each block\n+753 return \"matrix-block\";\n+754 }\n+755\n+_\b7_\b5_\b7 bool _\bw_\br_\bi_\bt_\be_\b__\bb_\bl_\bo_\bc_\bk_\b__\bt_\bi_\bt_\bl_\be = true;\n+758\n+764 template \n+_\b7_\b6_\b5 void _\bw_\br_\bi_\bt_\be_\bB_\bl_\bo_\bc_\bk_\bT_\bi_\bt_\bl_\be(Stream& out, const RowPrefix &row_prefix,\n+766 const ColPrefix &col_prefix,\n+767 const Block &block) const {\n+768 if (this->write_block_title) {\n+769 out << \"\";\n+770 assert(row_prefix.size() == col_prefix.size());\n+771 for (std::size_t i = 0; i < row_prefix.size(); ++i)\n+772 out << \"[\" << row_prefix[i] << \", \"<< col_prefix[i] << \"]\";\n+773 if constexpr (Dune::blockLevel<Block>() == 0)\n+774 out << \": \" << block;\n+775 out << \"\\n\";\n+776 }\n+777 }\n+778\n+800 template \n+_\b8_\b0_\b1 void _\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bB_\bl_\bo_\bc_\bk(Stream &out,\n+802 const RowPrefix &row_prefix,\n+803 const ColPrefix &col_prefix, const Block block,\n+804 const std::array &svg_box) const {\n+805 // get bounding box values\n+806 auto &[x_off, y_off, _\bw_\bi_\bd_\bt_\bh, _\bh_\be_\bi_\bg_\bh_\bt] = svg_box;\n+807 // get style class\n+808 std::string block_class = this->_\bb_\bl_\bo_\bc_\bk_\bS_\bt_\by_\bl_\be_\bC_\bl_\ba_\bs_\bs(row_prefix, col_prefix);\n+809 // write a rectangle on the bounding box\n+810 out << \"() == 0 and std::\n+is_convertible{})\n+813 if (_\bc_\bo_\bl_\bo_\br_\b__\bf_\bi_\bl_\bl)\n+814 out << \" style='fill-opacity: 1;fill:\" << _\bc_\bo_\bl_\bo_\br_\b__\bf_\bi_\bl_\bl(double(block)) << \"'\";\n+815\n+816 out << \">\\n\";\n+817 // give the rectangle a title (in html this shows info about the block)\n+818 this->_\bw_\br_\bi_\bt_\be_\bB_\bl_\bo_\bc_\bk_\bT_\bi_\bt_\bl_\be(out,row_prefix, col_prefix, block);\n+819 // close rectangle\n+820 out << \"\\n\";\n+821 }\n+822 };\n+823\n+838 template \n+_\b8_\b3_\b9 void _\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx(std::ostream &out, const Mat &_\bm_\ba_\bt, SVGOptions opts =\n+{}) {\n+840 // We need a vector that can fit all the multi-indices for rows and columns\n+841 using IndexPrefix = Dune::ReservedVector()>;\n+842 // Call overload for Mat type\n+843 Impl::writeSVGMatrix(out, _\bm_\ba_\bt, opts, IndexPrefix{}, IndexPrefix{});\n+844 }\n+845\n+863 template \n+864 [[deprecated(\"Use signature where std::stream is the first argument. This\n+will be removed after Dune 2.10.\")]]\n+_\b8_\b6_\b5 void _\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx(const Mat &_\bm_\ba_\bt, std::ostream &out, SVGOptions opts =\n+{}) {\n+866 _\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx(out, _\bm_\ba_\bt, opts);\n+867 }\n+868\n+871} // namespace Dune\n+872\n+873#endif\n _\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n Implementation of the BCRSMatrix class.\n-_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n-Implementations of the inverse operator interface.\n-_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh\n-_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-This file implements a vector space as a tensor product of a given vector\n-space. The number of compon...\n-_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n-Templates characterizing the type of a solver.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n-void setSubMatrix(const Matrix &mat, const S &rowIndexSet)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:457\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(domain_type &x, range_type &b, InverseOperatorResult &res)\n-Apply inverse operator,.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:563\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by\n-void setVerbosity(bool v)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:437\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bf_\br_\be_\be\n-void free()\n-free allocated space.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:403\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\b~_\bS_\bu_\bp_\be_\br_\bL_\bU\n-~SuperLU()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:396\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU\n-SuperLU()\n-Empty default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:432\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-void setMatrix(const Matrix &mat)\n-Initialize data from given matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:443\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n+Helper functions for determining the vector/matrix block level.\n+_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\n+Some handy generic functions for ISTL matrices.\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n _\bm_\ba_\bt\n Matrix & mat\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb\n+void writeMatrixToMatlab(const MatrixType &matrix, const std::string &filename,\n+int outputPrecision=18)\n+Writes sparse matrix in a Matlab-readable format.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:483\n+_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br\n+void writeMatrixToMatlabHelper(const FieldType &value, int rowOffset, int\n+colOffset, std::ostream &s)\n+Helper method for the writeMatrixToMatlab routine.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:412\n+_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw\n+void print_row(std::ostream &s, const K &value, typename FieldMatrix< K, 1, 1\n+>::size_type I, typename FieldMatrix< K, 1, 1 >::size_type J, typename\n+FieldMatrix< K, 1, 1 >::size_type therow, int width, int precision)\n+Print one row of a matrix, specialization for number types.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:152\n+_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bm_\ba_\bt_\br_\bi_\bx\n+void printmatrix(std::ostream &s, const M &A, std::string title, std::string\n+rowtext, int width=10, int precision=2)\n+Print a generic block matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:213\n+_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n+void printSparseMatrix(std::ostream &s, const BCRSMatrix< InnerMatrixType, A >\n+&mat, std::string title, std::string rowtext, int width=3, int precision=2)\n+Prints a BCRSMatrix with fixed sized blocks.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br\n+void printvector(std::ostream &s, const V &v, std::string title, std::string\n+rowtext, int columns=1, int width=10, int precision=2)\n+Print an ISTL vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br\n+void writeVectorToMatlabHelper(const V &v, std::ostream &stream)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:496\n+_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx\n+void writeSVGMatrix(std::ostream &out, const Mat &mat, SVGOptions opts={})\n+Writes the visualization of matrix in the SVG format.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:839\n+_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb\n+void writeVectorToMatlab(const VectorType &vector, const std::string &filename,\n+int outputPrecision=18)\n+Writes vectors in a Matlab-readable format.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:524\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b__\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br\n+void recursive_printvector(std::ostream &s, const V &v, std::string rowtext,\n+int &counter, int columns, int width)\n+Recursively print a vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\bl_\bl_\b__\br_\bo_\bw\n+void fill_row(std::ostream &s, int m, int width, int precision)\n+Print a row of zeros for a non-existing block.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:133\n _\bs_\bt_\bd\n STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static auto coldim(const M &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static auto rowdim(const M &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:214\n _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n A sparse block matrix with compressed row storage.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-derive error class from the base class in common\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n-Sequential overlapping Schwarz preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs\n+Default options class to write SVG matrices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:706\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bs_\bt_\by_\bl_\be\n+std::string style\n+CSS style block to write in header.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:718\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bw_\bi_\bd_\bt_\bh\n+std::size_t width\n+Final width size (pixels) of the SVG header. If 0, size is automatic.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:712\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bc_\bo_\bl_\bo_\br_\b__\bf_\bi_\bl_\bl\n+std::function< std::string(const double &)> color_fill\n+Color fill for default options.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:742\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be\n+std::size_t block_size\n+size (pixels) of the deepst block/value of the matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:708\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bB_\bl_\bo_\bc_\bk\n+void writeSVGBlock(Stream &out, const RowPrefix &row_prefix, const ColPrefix\n+&col_prefix, const Block block, const std::array< std::size_t, 4 > &svg_box)\n+const\n+Write an SVG object for a given block/value in the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:801\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bw_\br_\bi_\bt_\be_\bB_\bl_\bo_\bc_\bk_\bT_\bi_\bt_\bl_\be\n+void writeBlockTitle(Stream &out, const RowPrefix &row_prefix, const ColPrefix\n+&col_prefix, const Block &block) const\n+Helper function writes a title for a given block and prefix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:765\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bi_\bn_\bt_\be_\br_\bs_\bp_\ba_\bc_\be\n+std::size_t interspace\n+size (pixels) of the interspace between blocks\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:710\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bw_\br_\bi_\bt_\be_\b__\bb_\bl_\bo_\bc_\bk_\b__\bt_\bi_\bt_\bl_\be\n+bool write_block_title\n+(Helper) Whether to write a title on the rectangle value\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:757\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bh_\be_\bi_\bg_\bh_\bt\n+std::size_t height\n+Final height size (pixels) of the SVG header. If 0, size is automatic.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:714\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bw_\br_\bi_\bt_\be_\b__\bh_\be_\ba_\bd_\be_\br\n+bool write_header\n+Whether to write the SVG header.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:716\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bS_\bt_\by_\bl_\be_\bC_\bl_\ba_\bs_\bs\n+std::string blockStyleClass(const RowPrefix &row_prefix, const ColPrefix\n+&col_prefix) const\n+Helper function that returns an style class for a given prefix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:750\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:404\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n A generic dynamic dense matrix.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+RowIterator end()\n+Get iterator to one beyond last row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:616\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+RowIterator begin()\n+Get iterator to first row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:610\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::const_iterator ConstColIterator\n+Const iterator for the entries of each row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:589\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n size_type M() const\n Return the number of columns.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:696\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n size_type N() const\n Return the number of rows.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:691\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-Statistics about the application of an inverse operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n-int iterations\n-Number of iterations.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n-bool converged\n-True if convergence criterion has been met.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Abstract base class for all solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-@ value\n-Whether this is a direct solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-@ value\n-whether the solver internally uses column compressed storage\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:45\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bQ_\bu_\be_\br_\by_\bC_\bh_\bo_\bo_\bs_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bQ_\bu_\be_\br_\by_\bS_\bp_\ba_\bc_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU\n-SuperLu Solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:271\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bn_\bn_\bz\n-SuperLUMatrix::size_type nnz() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:355\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(domain_type &x, range_type &b, double reduction,\n-InverseOperatorResult &res)\n-apply inverse operator, with given convergence criteria.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:342\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-typename Impl::SuperLUVectorChooser< M >::range_type range_type\n-The type of the range of the solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:284\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:276\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-SuperMatrixInitializer< Matrix > MatrixInitializer\n-Type of an associated initializer class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:280\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-M Matrix\n-The matrix type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:275\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-typename Impl::SuperLUVectorChooser< M >::domain_type domain_type\n-The type of the domain of the solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:282\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bn_\ba_\bm_\be\n-const char * name()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:371\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the solver (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:287\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n-Dune::SuperLUMatrix< Matrix > SuperLUMatrix\n-The corresponding SuperLU Matrix type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:278\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU\n-SuperLU(const Matrix &mat, const ParameterTree &config)\n-Constructs the SuperLU solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:320\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:727\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL\n->::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const\n-M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock<\n-typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0)\n-const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:734\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:728\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n-Utility class for converting an ISTL Matrix into a SuperLU Matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:175\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:179\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00011.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00011.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: schwarz.hh File Reference\n+dune-istl: bcrsmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -72,56 +72,72 @@\n
  • dune
  • istl
  • \n
    \n \n
    \n
    \n Classes |\n Namespaces
    \n-
    schwarz.hh File Reference
    \n+
    bcrsmatrix.hh File Reference
    \n
    \n
    \n-
    #include <iostream>
    \n-#include <fstream>
    \n+\n+

    Implementation of the BCRSMatrix class. \n+More...

    \n+
    #include <cmath>
    \n+#include <complex>
    \n+#include <set>
    \n+#include <iostream>
    \n+#include <algorithm>
    \n+#include <numeric>
    \n #include <vector>
    \n-#include <sstream>
    \n-#include <cmath>
    \n-#include <dune/common/timer.hh>
    \n-#include "io.hh"
    \n-#include "bvector.hh"
    \n-#include "vbvector.hh"
    \n-#include "bcrsmatrix.hh"
    \n-#include "gsetc.hh"
    \n-#include "ilu.hh"
    \n-#include "operators.hh"
    \n-#include "solvers.hh"
    \n-#include "preconditioners.hh"
    \n-#include "scalarproducts.hh"
    \n-#include "owneroverlapcopy.hh"
    \n+#include <map>
    \n+#include <memory>
    \n+#include "istlexception.hh"
    \n+#include "bvector.hh"
    \n+#include "matrixutils.hh"
    \n+#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/iteratorfacades.hh>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/ftraits.hh>
    \n+#include <dune/common/scalarvectorview.hh>
    \n+#include <dune/common/scalarmatrixview.hh>
    \n+#include <dune/istl/blocklevel.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::OverlappingSchwarzOperator< M, X, Y, C >
     An overlapping Schwarz operator. More...
    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::ParSSOR< M, X, Y, C >
     A parallel SSOR preconditioner. More...
    class  Dune::BCRSMatrix< B, A >
     A sparse block matrix with compressed row storage. More...
     
    class  Dune::BlockPreconditioner< X, Y, C, P >
     Block parallel preconditioner. 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 > >
     
    \n \n \n \n-\n-\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n-
    \n+

    Detailed Description

    \n+

    Implementation of the BCRSMatrix class.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,43 +1,58 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-schwarz.hh File Reference\n+bcrsmatrix.hh File Reference\n+Implementation of the BCRSMatrix class. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n #include \n-#include \n+#include \n+#include \n #include \n-#include \n-#include \n-#include \n-#include \"_\bi_\bo_\b._\bh_\bh\"\n+#include \n+#include \n+#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n #include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-#include \"_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n-#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n-#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n-#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n-#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n-#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n-#include \"_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\"\n+#include \"_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\"\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>\n-\u00a0 An overlapping Schwarz operator. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs_\b<_\b _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b _\b>\n+\u00a0 Statistics about compression achieved in implicit mode. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\b _\bM_\b__\b _\b>\n+\u00a0 A wrapper for uniform access to the _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx during and after the\n+ build stage in implicit build mode. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\b _\bM_\b__\b _\b>_\b:_\b:_\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt\n+\u00a0 Proxy row object for entry access. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>\n-\u00a0 A parallel SSOR preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n+\u00a0 A sparse block matrix with compressed row storage. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bP_\b _\b>\n-\u00a0 Block parallel preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n+\u00a0 Iterator access to matrix rows _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+\u00a0 Iterator class for sequential creation of blocks _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Implementation of the BCRSMatrix class.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00011_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00011_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: schwarz.hh Source File\n+dune-istl: bcrsmatrix.hh Source File\n \n \n \n \n \n \n \n@@ -74,298 +74,2094 @@\n \n
    \n \n
    \n \n
    \n-
    schwarz.hh
    \n+
    bcrsmatrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_SCHWARZ_HH
    \n-
    6#define DUNE_ISTL_SCHWARZ_HH
    \n-
    7
    \n-
    8#include <iostream> // for input/output to shell
    \n-
    9#include <fstream> // for input/output to files
    \n-
    10#include <vector> // STL vector class
    \n-
    11#include <sstream>
    \n-
    12
    \n-
    13#include <cmath> // Yes, we do some math here
    \n-
    14
    \n-
    15#include <dune/common/timer.hh>
    \n-
    16
    \n-
    17#include "io.hh"
    \n-
    18#include "bvector.hh"
    \n-
    19#include "vbvector.hh"
    \n-
    20#include "bcrsmatrix.hh"
    \n-
    21#include "io.hh"
    \n-
    22#include "gsetc.hh"
    \n-
    23#include "ilu.hh"
    \n-
    24#include "operators.hh"
    \n-
    25#include "solvers.hh"
    \n-
    26#include "preconditioners.hh"
    \n-
    27#include "scalarproducts.hh"
    \n-
    28#include "owneroverlapcopy.hh"
    \n-
    29
    \n-
    30namespace Dune {
    \n-
    31
    \n-
    73 template<class M, class X, class Y, class C>
    \n-
    \n-\n-
    75 {
    \n-
    76 public:
    \n-
    81 typedef M matrix_type;
    \n-
    86 typedef X domain_type;
    \n-
    91 typedef Y range_type;
    \n-
    93 typedef typename X::field_type field_type;
    \n-\n-
    99
    \n-
    \n-\n-
    108 : _A_(stackobject_to_shared_ptr(A)), communication(com)
    \n-
    109 {}
    \n-
    \n-
    110
    \n-
    \n-
    111 OverlappingSchwarzOperator (const std::shared_ptr<matrix_type> A, const communication_type& com)
    \n-
    112 : _A_(A), communication(com)
    \n-
    113 {}
    \n-
    \n-
    114
    \n-
    \n-
    116 virtual void apply (const X& x, Y& y) const
    \n-
    117 {
    \n-
    118 y = 0;
    \n-
    119 _A_->umv(x,y); // result is consistent on interior+border
    \n-
    120 communication.project(y); // we want this here to avoid it before the preconditioner
    \n-
    121 // since there d is const!
    \n-
    122 }
    \n-
    \n+
    5
    \n+
    6#ifndef DUNE_ISTL_BCRSMATRIX_HH
    \n+
    7#define DUNE_ISTL_BCRSMATRIX_HH
    \n+
    8
    \n+
    9#include <cmath>
    \n+
    10#include <complex>
    \n+
    11#include <set>
    \n+
    12#include <iostream>
    \n+
    13#include <algorithm>
    \n+
    14#include <numeric>
    \n+
    15#include <vector>
    \n+
    16#include <map>
    \n+
    17#include <memory>
    \n+
    18
    \n+
    19#include "istlexception.hh"
    \n+
    20#include "bvector.hh"
    \n+
    21#include "matrixutils.hh"
    \n+
    22#include <dune/common/stdstreams.hh>
    \n+
    23#include <dune/common/iteratorfacades.hh>
    \n+
    24#include <dune/common/typetraits.hh>
    \n+
    25#include <dune/common/ftraits.hh>
    \n+
    26#include <dune/common/scalarvectorview.hh>
    \n+
    27#include <dune/common/scalarmatrixview.hh>
    \n+
    28
    \n+\n+
    30
    \n+
    35namespace Dune {
    \n+
    36
    \n+
    76 template<typename M>
    \n+
    77 struct MatrixDimension;
    \n+
    78
    \n+
    80
    \n+
    86 template<typename size_type>
    \n+
    \n+\n+
    88 {
    \n+
    90 double avg;
    \n+
    92 size_type maximum;
    \n+
    94 size_type overflow_total;
    \n+
    96
    \n+
    99 double mem_ratio;
    \n+
    100 };
    \n+
    \n+
    101
    \n+
    103
    \n+
    115 template<class M_>
    \n+
    \n+\n+
    117 {
    \n+
    118
    \n+
    119 public:
    \n+
    120
    \n+
    122 typedef M_ Matrix;
    \n
    123
    \n-
    \n-
    125 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
    \n-
    126 {
    \n-
    127 _A_->usmv(alpha,x,y); // result is consistent on interior+border
    \n-
    128 communication.project(y); // we want this here to avoid it before the preconditioner
    \n-
    129 // since there d is const!
    \n-
    130 }
    \n-
    \n+\n+
    126
    \n+
    128 typedef typename Matrix::size_type size_type;
    \n+
    129
    \n
    131
    \n-
    \n-
    133 virtual const matrix_type& getmat () const
    \n-
    134 {
    \n-
    135 return *_A_;
    \n-
    136 }
    \n-
    \n-
    137
    \n-
    \n-\n-
    140 {
    \n-\n-
    142 }
    \n-
    \n-
    143
    \n-
    144
    \n-
    \n-\n-
    147 {
    \n-
    148 return communication;
    \n-
    149 }
    \n-
    \n-
    150 private:
    \n-
    151 const std::shared_ptr<const matrix_type>_A_;
    \n-
    152 const communication_type& communication;
    \n-
    153 };
    \n-
    \n-
    154
    \n-
    174 template<class M, class X, class Y, class C>
    \n-
    \n-
    175 class ParSSOR : public Preconditioner<X,Y> {
    \n-
    176 public:
    \n-
    178 typedef M matrix_type;
    \n-
    180 typedef X domain_type;
    \n-
    182 typedef Y range_type;
    \n-
    184 typedef typename X::field_type field_type;
    \n-\n-
    187
    \n-
    \n-
    197 ParSSOR (const matrix_type& A, int n, field_type w, const communication_type& c)
    \n-
    198 : _A_(A), _n(n), _w(w), communication(c)
    \n-
    199 { }
    \n-
    \n-
    200
    \n-
    \n-
    206 virtual void pre (X& x, [[maybe_unused]] Y& b)
    \n-
    207 {
    \n-
    208 communication.copyOwnerToAll(x,x); // make dirichlet values consistent
    \n-
    209 }
    \n-
    \n-
    210
    \n-
    \n-
    216 virtual void apply (X& v, const Y& d)
    \n-
    217 {
    \n-
    218 for (int i=0; i<_n; i++) {
    \n-
    219 bsorf(_A_,v,d,_w);
    \n-
    220 bsorb(_A_,v,d,_w);
    \n-
    221 }
    \n-
    222 communication.copyOwnerToAll(v,v);
    \n-
    223 }
    \n-
    \n-
    224
    \n-
    230 virtual void post ([[maybe_unused]] X& x) {}
    \n-
    231
    \n-
    \n-\n-
    234 {
    \n-\n-
    236 }
    \n-
    \n-
    237
    \n-
    238 private:
    \n-
    240 const matrix_type& _A_;
    \n-
    242 int _n;
    \n-
    244 field_type _w;
    \n-
    246 const communication_type& communication;
    \n-
    247 };
    \n-
    \n-
    248
    \n-
    249 namespace Amg
    \n-
    250 {
    \n-
    251 template<class T> struct ConstructionTraits;
    \n-
    252 }
    \n-
    253
    \n-
    277 template<class X, class Y, class C, class P=Preconditioner<X,Y> >
    \n-
    \n-\n-
    279 friend struct Amg::ConstructionTraits<BlockPreconditioner<X,Y,C,P> >;
    \n-
    280 public:
    \n-
    285 typedef X domain_type;
    \n-
    290 typedef Y range_type;
    \n-
    292 typedef typename X::field_type field_type;
    \n-\n-
    298
    \n-
    \n-\n-
    307 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)
    \n-
    308 { }
    \n-
    \n-
    309
    \n-
    \n-
    317 BlockPreconditioner (const std::shared_ptr<P>& p, const communication_type& c)
    \n-
    318 : _preconditioner(p), _communication(c)
    \n-
    319 { }
    \n-
    \n-
    320
    \n-
    \n-
    326 virtual void pre (X& x, Y& b)
    \n-
    327 {
    \n-
    328 _communication.copyOwnerToAll(x,x); // make dirichlet values consistent
    \n-
    329 _preconditioner->pre(x,b);
    \n-
    330 }
    \n-
    \n-
    331
    \n-
    \n-
    337 virtual void apply (X& v, const Y& d)
    \n-
    338 {
    \n-
    339 _preconditioner->apply(v,d);
    \n-
    340 _communication.copyOwnerToAll(v,v);
    \n-
    341 }
    \n-
    \n-
    342
    \n-
    343 template<bool forward>
    \n-
    \n-
    344 void apply (X& v, const Y& d)
    \n-
    345 {
    \n-
    346 _preconditioner->template apply<forward>(v,d);
    \n-
    347 _communication.copyOwnerToAll(v,v);
    \n-
    348 }
    \n-
    \n-
    349
    \n-
    \n-
    355 virtual void post (X& x)
    \n-
    356 {
    \n-
    357 _preconditioner->post(x);
    \n-
    358 }
    \n-
    \n-
    359
    \n-
    \n-\n-
    362 {
    \n-\n-
    364 }
    \n-
    \n-
    365
    \n-
    366 private:
    \n-
    368 std::shared_ptr<P> _preconditioner;
    \n-
    369
    \n-
    371 const communication_type& _communication;
    \n-
    372 };
    \n-
    \n-
    373
    \n-
    376} // end namespace
    \n-
    377
    \n-
    378#endif
    \n-
    Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
    \n-
    Some generic functions for pretty printing vectors and matrices.
    \n-
    Define general preconditioner interface.
    \n-
    Define base class for scalar product and norm.
    \n-
    Implementation of the BCRSMatrix class.
    \n-
    Implementations of the inverse operator interface.
    \n-
    The incomplete LU factorization kernels.
    \n-
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n-\n-
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n-
    void bsorb(const M &A, X &x, const Y &b, const K &w)
    SSOR step.
    Definition gsetc.hh:646
    \n-
    void bsorf(const M &A, X &x, const Y &b, const K &w)
    SOR step.
    Definition gsetc.hh:634
    \n+
    \n+\n+
    137 {
    \n+
    138
    \n+
    139 public:
    \n+
    140
    \n+
    \n+\n+
    143 {
    \n+
    144 return _m.entry(_i,j);
    \n+
    145 }
    \n+
    \n+
    146
    \n+
    147#ifndef DOXYGEN
    \n+
    148
    \n+\n+
    150 : _m(m)
    \n+
    151 , _i(i)
    \n+
    152 {}
    \n+
    153
    \n+
    154#endif
    \n+
    155
    \n+
    156 private:
    \n+
    157
    \n+
    158 Matrix& _m;
    \n+\n+
    160
    \n+
    161 };
    \n+
    \n+
    162
    \n+
    164
    \n+
    \n+\n+
    171 : _m(m)
    \n+
    172 {
    \n+
    173 if (m.buildMode() != Matrix::implicit)
    \n+
    174 DUNE_THROW(BCRSMatrixError,"You can only create an ImplicitBuilder for a matrix in implicit build mode");
    \n+
    175 if (m.buildStage() != Matrix::building)
    \n+
    176 DUNE_THROW(BCRSMatrixError,"You can only create an ImplicitBuilder for a matrix with set size that has not been compressed() yet");
    \n+
    177 }
    \n+
    \n+
    178
    \n+
    180
    \n+
    \n+
    194 ImplicitMatrixBuilder(Matrix& m, size_type rows, size_type cols, size_type avg_cols_per_row, double overflow_fraction)
    \n+
    195 : _m(m)
    \n+
    196 {
    \n+
    197 if (m.buildStage() != Matrix::notAllocated)
    \n+
    198 DUNE_THROW(BCRSMatrixError,"You can only set up a matrix for this ImplicitBuilder if it has no memory allocated yet");
    \n+
    199 m.setBuildMode(Matrix::implicit);
    \n+
    200 m.setImplicitBuildModeParameters(avg_cols_per_row,overflow_fraction);
    \n+
    201 m.setSize(rows,cols);
    \n+
    202 }
    \n+
    \n+
    203
    \n+
    \n+\n+
    206 {
    \n+
    207 return row_object(_m,i);
    \n+
    208 }
    \n+
    \n+
    209
    \n+
    \n+
    211 size_type N() const
    \n+
    212 {
    \n+
    213 return _m.N();
    \n+
    214 }
    \n+
    \n+
    215
    \n+
    \n+
    217 size_type M() const
    \n+
    218 {
    \n+
    219 return _m.M();
    \n+
    220 }
    \n+
    \n+
    221
    \n+
    222 private:
    \n+
    223
    \n+
    224 Matrix& _m;
    \n+
    225
    \n+
    226 };
    \n+
    \n+
    227
    \n+
    464 template<class B, class A=std::allocator<B> >
    \n+
    \n+\n+
    466 {
    \n+
    467 friend struct MatrixDimension<BCRSMatrix>;
    \n+
    468 public:
    \n+
    \n+\n+\n+\n+\n+\n+
    482 built=3
    \n+
    483 };
    \n+
    \n+
    484
    \n+
    485 //===== type definitions and constants
    \n+
    486
    \n+
    488 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n+
    489
    \n+
    491 typedef B block_type;
    \n+
    492
    \n+
    494 typedef A allocator_type;
    \n+
    495
    \n+
    497 typedef typename A::size_type size_type;
    \n+
    498
    \n+
    500 typedef Imp::CompressedBlockVectorWindow<B,size_type> row_type;
    \n+
    501
    \n+
    503 typedef ::Dune::CompressionStatistics<size_type> CompressionStatistics;
    \n+
    504
    \n+
    \n+\n+\n+\n+\n+
    539 unknown
    \n+
    540 };
    \n+
    \n+
    541
    \n+
    542 //===== random access interface to rows of the matrix
    \n+
    543
    \n+
    \n+\n+
    546 {
    \n+
    547#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    548 if (build_mode == implicit && ready != built)
    \n+
    549 DUNE_THROW(BCRSMatrixError,"You cannot use operator[] in implicit build mode before calling compress()");
    \n+
    550 if (r==0) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
    \n+
    551 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    552#endif
    \n+
    553 return r[i];
    \n+
    554 }
    \n+
    \n+
    555
    \n+
    \n+\n+
    558 {
    \n+
    559#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    560 if (build_mode == implicit && ready != built)
    \n+
    561 DUNE_THROW(BCRSMatrixError,"You cannot use operator[] in implicit build mode before calling compress()");
    \n+
    562 if (built!=ready) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
    \n+
    563 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    564#endif
    \n+
    565 return r[i];
    \n+
    566 }
    \n+
    \n+
    567
    \n+
    568
    \n+
    569 //===== iterator interface to rows of the matrix
    \n+
    570
    \n+
    572 template<class T>
    \n+
    \n+\n+
    574 : public RandomAccessIteratorFacade<RealRowIterator<T>, T>
    \n+
    575 {
    \n+
    576
    \n+
    577 public:
    \n+
    579 typedef typename std::remove_const<T>::type ValueType;
    \n+
    580
    \n+
    581 friend class RandomAccessIteratorFacade<RealRowIterator<const ValueType>, const ValueType>;
    \n+
    582 friend class RandomAccessIteratorFacade<RealRowIterator<ValueType>, ValueType>;
    \n+
    583 friend class RealRowIterator<const ValueType>;
    \n+
    584 friend class RealRowIterator<ValueType>;
    \n+
    585
    \n+
    \n+\n+
    588 : p(_p), i(_i)
    \n+
    589 {}
    \n+
    \n+
    590
    \n+
    \n+\n+
    593 : p(0), i(0)
    \n+
    594 {}
    \n+
    \n+
    595
    \n+
    \n+\n+
    597 : p(it.p), i(it.i)
    \n+
    598 {}
    \n+
    \n+
    599
    \n+
    600
    \n+
    \n+\n+
    603 {
    \n+
    604 return i;
    \n+
    605 }
    \n+
    \n+
    606
    \n+
    \n+
    607 std::ptrdiff_t distanceTo(const RealRowIterator<ValueType>& other) const
    \n+
    608 {
    \n+
    609 assert(other.p==p);
    \n+
    610 return (other.i-i);
    \n+
    611 }
    \n+
    \n+
    612
    \n+
    \n+
    613 std::ptrdiff_t distanceTo(const RealRowIterator<const ValueType>& other) const
    \n+
    614 {
    \n+
    615 assert(other.p==p);
    \n+
    616 return (other.i-i);
    \n+
    617 }
    \n+
    \n+
    618
    \n+
    \n+
    620 bool equals (const RealRowIterator<ValueType>& other) const
    \n+
    621 {
    \n+
    622 assert(other.p==p);
    \n+
    623 return i==other.i;
    \n+
    624 }
    \n+
    \n+
    625
    \n+
    \n+
    627 bool equals (const RealRowIterator<const ValueType>& other) const
    \n+
    628 {
    \n+
    629 assert(other.p==p);
    \n+
    630 return i==other.i;
    \n+
    631 }
    \n+
    \n+
    632
    \n+
    633 private:
    \n+
    635 void increment()
    \n+
    636 {
    \n+
    637 ++i;
    \n+
    638 }
    \n+
    639
    \n+
    641 void decrement()
    \n+
    642 {
    \n+
    643 --i;
    \n+
    644 }
    \n+
    645
    \n+
    646 void advance(std::ptrdiff_t diff)
    \n+
    647 {
    \n+
    648 i+=diff;
    \n+
    649 }
    \n+
    650
    \n+
    651 T& elementAt(std::ptrdiff_t diff) const
    \n+
    652 {
    \n+
    653 return p[i+diff];
    \n+
    654 }
    \n+
    655
    \n+
    657 row_type& dereference () const
    \n+
    658 {
    \n+
    659 return p[i];
    \n+
    660 }
    \n+
    661
    \n+
    662 row_type* p;
    \n+
    663 size_type i;
    \n+
    664 };
    \n+
    \n+
    665
    \n+\n+\n+
    669
    \n+
    \n+\n+
    672 {
    \n+
    673 return Iterator(r,0);
    \n+
    674 }
    \n+
    \n+
    675
    \n+
    \n+\n+
    678 {
    \n+
    679 return Iterator(r,n);
    \n+
    680 }
    \n+
    \n+
    681
    \n+
    \n+\n+
    685 {
    \n+
    686 return Iterator(r,n-1);
    \n+
    687 }
    \n+
    \n+
    688
    \n+
    \n+\n+
    692 {
    \n+
    693 return Iterator(r,-1);
    \n+
    694 }
    \n+
    \n+
    695
    \n+\n+
    698
    \n+
    700 typedef typename row_type::Iterator ColIterator;
    \n+
    701
    \n+\n+\n+
    705
    \n+
    706
    \n+
    \n+\n+
    709 {
    \n+
    710 return ConstIterator(r,0);
    \n+
    711 }
    \n+
    \n+
    712
    \n+
    \n+\n+
    715 {
    \n+
    716 return ConstIterator(r,n);
    \n+
    717 }
    \n+
    \n+
    718
    \n+
    \n+\n+
    722 {
    \n+
    723 return ConstIterator(r,n-1);
    \n+
    724 }
    \n+
    \n+
    725
    \n+
    \n+\n+
    729 {
    \n+
    730 return ConstIterator(r,-1);
    \n+
    731 }
    \n+
    \n+
    732
    \n+\n+
    735
    \n+
    737 typedef typename row_type::ConstIterator ConstColIterator;
    \n+
    738
    \n+
    739 //===== constructors & resizers
    \n+
    740
    \n+
    741 // we use a negative compressionBufferSize to indicate that the implicit
    \n+
    742 // mode parameters have not been set yet
    \n+
    743
    \n+
    \n+\n+
    746 : build_mode(unknown), ready(notAllocated), n(0), m(0), nnz_(0),
    \n+
    747 allocationSize_(0), r(0), a(0),
    \n+\n+
    749 {}
    \n+
    \n+
    750
    \n+
    \n+\n+
    753 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
    \n+
    754 allocationSize_(0), r(0), a(0),
    \n+\n+
    756 {
    \n+
    757 allocate(_n, _m, _nnz,true,false);
    \n+
    758 }
    \n+
    \n+
    759
    \n+
    \n+\n+
    762 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
    \n+
    763 allocationSize_(0), r(0), a(0),
    \n+\n+
    765 {
    \n+
    766 allocate(_n, _m,0,true,false);
    \n+
    767 }
    \n+
    \n+
    768
    \n+
    770
    \n+
    \n+
    781 BCRSMatrix (size_type _n, size_type _m, size_type _avg, double compressionBufferSize, BuildMode bm)
    \n+
    782 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
    \n+
    783 allocationSize_(0), r(0), a(0),
    \n+
    784 avg(_avg), compressionBufferSize_(compressionBufferSize)
    \n+
    785 {
    \n+
    786 if (bm != implicit)
    \n+
    787 DUNE_THROW(BCRSMatrixError,"Only call this constructor when using the implicit build mode");
    \n+
    788 // Prevent user from setting a negative compression buffer size:
    \n+
    789 // 1) It doesn't make sense
    \n+
    790 // 2) We use a negative value to indicate that the parameters
    \n+
    791 // have not been set yet
    \n+
    792 if (compressionBufferSize_ < 0.0)
    \n+
    793 DUNE_THROW(BCRSMatrixError,"You cannot set a negative overflow fraction");
    \n+
    794 implicit_allocate(_n,_m);
    \n+
    795 }
    \n+
    \n+
    796
    \n+
    \n+\n+
    803 : build_mode(Mat.build_mode), ready(notAllocated), n(0), m(0), nnz_(0),
    \n+
    804 allocationSize_(0), r(0), a(0),
    \n+\n+
    806 {
    \n+
    807 if (!(Mat.ready == notAllocated || Mat.ready == built))
    \n+
    808 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copy-constructed when source matrix is completely empty (size not set) or fully built)");
    \n+
    809
    \n+
    810 // deep copy in global array
    \n+
    811 size_type _nnz = Mat.nonzeroes();
    \n+
    812
    \n+
    813 j_ = Mat.j_; // enable column index sharing, release array in case of row-wise allocation
    \n+
    814 allocate(Mat.n, Mat.m, _nnz, true, true);
    \n+
    815
    \n+
    816 // build window structure
    \n+\n+
    818 }
    \n+
    \n+
    819
    \n+
    \n+\n+
    822 {
    \n+
    823 deallocate();
    \n+
    824 }
    \n+
    \n+
    825
    \n+
    \n+\n+
    831 {
    \n+
    832 if (ready == notAllocated)
    \n+
    833 {
    \n+
    834 build_mode = bm;
    \n+
    835 return;
    \n+
    836 }
    \n+
    837 if (ready == building && (build_mode == unknown || build_mode == random || build_mode == row_wise) && (bm == row_wise || bm == random))
    \n+
    838 build_mode = bm;
    \n+
    839 else
    \n+
    840 DUNE_THROW(InvalidStateException, "Matrix structure cannot be changed at this stage anymore (ready == "<<ready<<").");
    \n+
    841 }
    \n+
    \n+
    842
    \n+
    \n+
    858 void setSize(size_type rows, size_type columns, size_type nnz=0)
    \n+
    859 {
    \n+
    860 // deallocate already setup memory
    \n+
    861 deallocate();
    \n+
    862
    \n+
    863 if (build_mode == implicit)
    \n+
    864 {
    \n+
    865 if (nnz>0)
    \n+
    866 DUNE_THROW(Dune::BCRSMatrixError,"number of non-zeroes may not be set in implicit mode, use setImplicitBuildModeParameters() instead");
    \n+
    867
    \n+
    868 // implicit allocates differently
    \n+
    869 implicit_allocate(rows,columns);
    \n+
    870 }
    \n+
    871 else
    \n+
    872 {
    \n+
    873 // allocate matrix memory
    \n+
    874 allocate(rows, columns, nnz, true, false);
    \n+
    875 }
    \n+
    876 }
    \n+
    \n+
    877
    \n+
    \n+
    886 void setImplicitBuildModeParameters(size_type _avg, double compressionBufferSize)
    \n+
    887 {
    \n+
    888 // Prevent user from setting a negative compression buffer size:
    \n+
    889 // 1) It doesn't make sense
    \n+
    890 // 2) We use a negative value to indicate that the parameters
    \n+
    891 // have not been set yet
    \n+
    892 if (compressionBufferSize < 0.0)
    \n+
    893 DUNE_THROW(BCRSMatrixError,"You cannot set a negative compressionBufferSize value");
    \n+
    894
    \n+
    895 // make sure the parameters aren't changed after memory has been allocated
    \n+
    896 if (ready != notAllocated)
    \n+
    897 DUNE_THROW(InvalidStateException,"You cannot modify build mode parameters at this stage anymore");
    \n+
    898 avg = _avg;
    \n+
    899 compressionBufferSize_ = compressionBufferSize;
    \n+
    900 }
    \n+
    \n+
    901
    \n+
    \n+\n+
    909 {
    \n+
    910 // return immediately when self-assignment
    \n+
    911 if (&Mat==this) return *this;
    \n+
    912
    \n+
    913 if (!((ready == notAllocated || ready == built) && (Mat.ready == notAllocated || Mat.ready == built)))
    \n+
    914 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copied when both target and source are empty or fully built)");
    \n+
    915
    \n+
    916 // make it simple: ALWAYS throw away memory for a and j_
    \n+
    917 // and deallocate rows only if n != Mat.n
    \n+
    918 deallocate(n!=Mat.n);
    \n+
    919
    \n+
    920 // reallocate the rows if required
    \n+
    921 if (n>0 && n!=Mat.n) {
    \n+
    922 // free rows
    \n+
    923 for(row_type *riter=r+(n-1), *rend=r-1; riter!=rend; --riter)
    \n+
    924 std::allocator_traits<decltype(rowAllocator_)>::destroy(rowAllocator_, riter);
    \n+
    925 rowAllocator_.deallocate(r,n);
    \n+
    926 }
    \n+
    927
    \n+
    928 nnz_ = Mat.nonzeroes();
    \n+
    929
    \n+
    930 // allocate a, share j_
    \n+
    931 j_ = Mat.j_;
    \n+
    932 allocate(Mat.n, Mat.m, nnz_, n!=Mat.n, true);
    \n+
    933
    \n+
    934 // build window structure
    \n+\n+
    936 return *this;
    \n+
    937 }
    \n+
    \n+
    938
    \n+
    \n+\n+
    941 {
    \n+
    942
    \n+
    943 if (!(ready == notAllocated || ready == built))
    \n+
    944 DUNE_THROW(InvalidStateException,"Scalar assignment only works on fully built BCRSMatrix)");
    \n+
    945
    \n+
    946 for (size_type i=0; i<n; i++) r[i] = k;
    \n+
    947 return *this;
    \n+
    948 }
    \n+
    \n+
    949
    \n+
    950 //===== row-wise creation interface
    \n+
    951
    \n+
    \n+\n+
    954 {
    \n+
    955 public:
    \n+
    \n+\n+
    958 : Mat(_Mat), i(_i), nnz(0), current_row(nullptr, Mat.j_.get(), 0)
    \n+
    959 {
    \n+
    960 if (Mat.build_mode == unknown && Mat.ready == building)
    \n+
    961 {
    \n+
    962 Mat.build_mode = row_wise;
    \n+
    963 }
    \n+
    964 if (i==0 && Mat.ready != building)
    \n+
    965 DUNE_THROW(BCRSMatrixError,"creation only allowed for uninitialized matrix");
    \n+
    966 if(Mat.build_mode!=row_wise)
    \n+
    967 DUNE_THROW(BCRSMatrixError,"creation only allowed if row wise allocation was requested in the constructor");
    \n+
    968 if(i==0 && _Mat.N()==0)
    \n+
    969 // empty Matrix is always built.
    \n+
    970 Mat.ready = built;
    \n+
    971 }
    \n+
    \n+
    972
    \n+
    \n+\n+
    975 {
    \n+
    976 // this should only be called if matrix is in creation
    \n+
    977 if (Mat.ready != building)
    \n+
    978 DUNE_THROW(BCRSMatrixError,"matrix already built up");
    \n+
    979
    \n+
    980 // row i is defined through the pattern
    \n+
    981 // get memory for the row and initialize the j_ array
    \n+
    982 // this depends on the allocation mode
    \n+
    983
    \n+
    984 // compute size of the row
    \n+
    985 size_type s = pattern.size();
    \n+
    986
    \n+
    987 if(s>0) {
    \n+
    988 // update number of nonzeroes including this row
    \n+
    989 nnz += s;
    \n+
    990
    \n+
    991 // alloc memory / set window
    \n+
    992 if (Mat.nnz_ > 0)
    \n+
    993 {
    \n+
    994 // memory is allocated in one long array
    \n+
    995
    \n+
    996 // check if that memory is sufficient
    \n+
    997 if (nnz > Mat.nnz_)
    \n+
    998 DUNE_THROW(BCRSMatrixError,"allocated nnz too small");
    \n+
    999
    \n+
    1000 // set row i
    \n+
    1001 Mat.r[i].set(s,nullptr,current_row.getindexptr());
    \n+
    1002 current_row.setindexptr(current_row.getindexptr()+s);
    \n+
    1003 }else{
    \n+
    1004 // memory is allocated individually per row
    \n+
    1005 // allocate and set row i
    \n+
    1006 B* b = Mat.allocator_.allocate(s);
    \n+
    1007 // use placement new to call constructor that allocates
    \n+
    1008 // additional memory.
    \n+
    1009 new (b) B[s];
    \n+
    1010 size_type* j = Mat.sizeAllocator_.allocate(s);
    \n+
    1011 Mat.r[i].set(s,b,j);
    \n+
    1012 }
    \n+
    1013 }else
    \n+
    1014 // setup empty row
    \n+
    1015 Mat.r[i].set(0,nullptr,nullptr);
    \n+
    1016
    \n+
    1017 // initialize the j array for row i from pattern
    \n+
    1018 std::copy(pattern.cbegin(), pattern.cend(), Mat.r[i].getindexptr());
    \n+
    1019
    \n+
    1020 // now go to next row
    \n+
    1021 i++;
    \n+
    1022 pattern.clear();
    \n+
    1023
    \n+
    1024 // check if this was last row
    \n+
    1025 if (i==Mat.n)
    \n+
    1026 {
    \n+
    1027 Mat.ready = built;
    \n+
    1028 if(Mat.nnz_ > 0)
    \n+
    1029 {
    \n+
    1030 // Set nnz to the exact number of nonzero blocks inserted
    \n+
    1031 // as some methods rely on it
    \n+
    1032 Mat.nnz_ = nnz;
    \n+
    1033 // allocate data array
    \n+
    1034 Mat.allocateData();
    \n+
    1035 Mat.setDataPointers();
    \n+
    1036 }
    \n+
    1037 }
    \n+
    1038 // done
    \n+
    1039 return *this;
    \n+
    1040 }
    \n+
    \n+
    1041
    \n+
    \n+
    1043 bool operator!= (const CreateIterator& it) const
    \n+
    1044 {
    \n+
    1045 return (i!=it.i) || (&Mat!=&it.Mat);
    \n+
    1046 }
    \n+
    \n+
    1047
    \n+
    \n+
    1049 bool operator== (const CreateIterator& it) const
    \n+
    1050 {
    \n+
    1051 return (i==it.i) && (&Mat==&it.Mat);
    \n+
    1052 }
    \n+
    \n+
    1053
    \n+
    \n+\n+
    1056 {
    \n+
    1057 return i;
    \n+
    1058 }
    \n+
    \n+
    1059
    \n+
    \n+\n+
    1062 {
    \n+
    1063 pattern.insert(j);
    \n+
    1064 }
    \n+
    \n+
    1065
    \n+
    \n+\n+
    1068 {
    \n+
    1069 return pattern.find(j) != pattern.end();
    \n+
    1070 }
    \n+
    \n+
    \n+\n+
    1077 {
    \n+
    1078 return pattern.size();
    \n+
    1079 }
    \n+
    \n+
    1080
    \n+
    1081 private:
    \n+
    1082 BCRSMatrix& Mat; // the matrix we are defining
    \n+
    1083 size_type i; // current row to be defined
    \n+
    1084 size_type nnz; // count total number of nonzeros
    \n+
    1085 typedef std::set<size_type,std::less<size_type> > PatternType;
    \n+
    1086 PatternType pattern; // used to compile entries in a row
    \n+
    1087 row_type current_row; // row pointing to the current row to setup
    \n+
    1088 };
    \n+
    \n+
    1089
    \n+
    1091 friend class CreateIterator;
    \n+
    1092
    \n+
    \n+\n+
    1095 {
    \n+
    1096 return CreateIterator(*this,0);
    \n+
    1097 }
    \n+
    \n+
    1098
    \n+
    \n+\n+
    1101 {
    \n+
    1102 return CreateIterator(*this,n);
    \n+
    1103 }
    \n+
    \n+
    1104
    \n+
    1105
    \n+
    1106 //===== random creation interface
    \n+
    1107
    \n+
    \n+\n+
    1115 {
    \n+
    1116 if (build_mode!=random)
    \n+
    1117 DUNE_THROW(BCRSMatrixError,"requires random build mode");
    \n+
    1118 if (ready != building)
    \n+
    1119 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
    \n+
    1120
    \n+
    1121 r[i].setsize(s);
    \n+
    1122 }
    \n+
    \n+
    1123
    \n+
    \n+\n+
    1126 {
    \n+
    1127#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1128 if (r==0) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
    \n+
    1129 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1130#endif
    \n+
    1131 return r[i].getsize();
    \n+
    1132 }
    \n+
    \n+
    1133
    \n+
    \n+\n+
    1136 {
    \n+
    1137 if (build_mode!=random)
    \n+
    1138 DUNE_THROW(BCRSMatrixError,"requires random build mode");
    \n+
    1139 if (ready != building)
    \n+
    1140 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
    \n+
    1141
    \n+
    1142 r[i].setsize(r[i].getsize()+s);
    \n+
    1143 }
    \n+
    \n+
    1144
    \n+
    \n+\n+
    1147 {
    \n+
    1148 if (build_mode!=random)
    \n+
    1149 DUNE_THROW(BCRSMatrixError,"requires random build mode");
    \n+
    1150 if (ready != building)
    \n+
    1151 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
    \n+
    1152
    \n+
    1153 // compute total size, check positivity
    \n+
    1154 size_type total=0;
    \n+
    1155 for (size_type i=0; i<n; i++)
    \n+
    1156 {
    \n+
    1157 total += r[i].getsize();
    \n+
    1158 }
    \n+
    1159
    \n+
    1160 if(nnz_ == 0)
    \n+
    1161 // allocate/check memory
    \n+
    1162 allocate(n,m,total,false,false);
    \n+
    1163 else if(nnz_ < total)
    \n+
    1164 DUNE_THROW(BCRSMatrixError,"Specified number of nonzeros ("<<nnz_<<") not "
    \n+
    1165 <<"sufficient for calculated nonzeros ("<<total<<"! ");
    \n+
    1166
    \n+
    1167 // set the window pointers correctly
    \n+\n+
    1169
    \n+
    1170 // initialize j_ array with m (an invalid column index)
    \n+
    1171 // this indicates an unused entry
    \n+
    1172 for (size_type k=0; k<nnz_; k++)
    \n+
    1173 j_.get()[k] = m;
    \n+\n+
    1175 }
    \n+
    \n+
    1176
    \n+
    1178
    \n+
    \n+\n+
    1189 {
    \n+
    1190 if (build_mode!=random)
    \n+
    1191 DUNE_THROW(BCRSMatrixError,"requires random build mode");
    \n+
    1192 if (ready==built)
    \n+
    1193 DUNE_THROW(BCRSMatrixError,"matrix already built up");
    \n+
    1194 if (ready==building)
    \n+
    1195 DUNE_THROW(BCRSMatrixError,"matrix row sizes not built up yet");
    \n+
    1196 if (ready==notAllocated)
    \n+
    1197 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
    \n+
    1198
    \n+
    1199 if (col >= m)
    \n+
    1200 DUNE_THROW(BCRSMatrixError,"column index exceeds matrix size");
    \n+
    1201
    \n+
    1202 // get row range
    \n+
    1203 size_type* const first = r[row].getindexptr();
    \n+
    1204 size_type* const last = first + r[row].getsize();
    \n+
    1205
    \n+
    1206 // find correct insertion position for new column index
    \n+
    1207 size_type* pos = std::lower_bound(first,last,col);
    \n+
    1208
    \n+
    1209 // check if index is already in row
    \n+
    1210 if (pos!=last && *pos == col) return;
    \n+
    1211
    \n+
    1212 // find end of already inserted column indices
    \n+
    1213 size_type* end = std::lower_bound(pos,last,m);
    \n+
    1214 if (end==last)
    \n+
    1215 DUNE_THROW(BCRSMatrixError,"row is too small");
    \n+
    1216
    \n+
    1217 // insert new column index at correct position
    \n+
    1218 std::copy_backward(pos,end,end+1);
    \n+
    1219 *pos = col;
    \n+
    1220 }
    \n+
    \n+
    1221
    \n+
    1223
    \n+
    1231 template<typename It>
    \n+
    \n+\n+
    1233 {
    \n+
    1234 size_type row_size = r[row].size();
    \n+
    1235 size_type* col_begin = r[row].getindexptr();
    \n+
    1236 size_type* col_end;
    \n+
    1237 // consistency check between allocated row size and number of passed column indices
    \n+
    1238 if ((col_end = std::copy(begin,end,r[row].getindexptr())) != col_begin + row_size)
    \n+
    1239 DUNE_THROW(BCRSMatrixError,"Given size of row " << row
    \n+
    1240 << " (" << row_size
    \n+
    1241 << ") does not match number of passed entries (" << (col_end - col_begin) << ")");
    \n+
    1242 }
    \n+
    \n+
    1243
    \n+
    1244
    \n+
    1246
    \n+
    1254 template<typename It>
    \n+
    \n+
    1255 void setIndices(size_type row, It begin, It end)
    \n+
    1256 {
    \n+
    1257 size_type row_size = r[row].size();
    \n+
    1258 size_type* col_begin = r[row].getindexptr();
    \n+
    1259 size_type* col_end;
    \n+
    1260 // consistency check between allocated row size and number of passed column indices
    \n+
    1261 if ((col_end = std::copy(begin,end,r[row].getindexptr())) != col_begin + row_size)
    \n+
    1262 DUNE_THROW(BCRSMatrixError,"Given size of row " << row
    \n+
    1263 << " (" << row_size
    \n+
    1264 << ") does not match number of passed entries (" << (col_end - col_begin) << ")");
    \n+
    1265 std::sort(col_begin,col_end);
    \n+
    1266 }
    \n+
    \n+
    1267
    \n+
    \n+\n+
    1270 {
    \n+
    1271 if (build_mode!=random)
    \n+
    1272 DUNE_THROW(BCRSMatrixError,"requires random build mode");
    \n+
    1273 if (ready==built)
    \n+
    1274 DUNE_THROW(BCRSMatrixError,"matrix already built up");
    \n+
    1275 if (ready==building)
    \n+
    1276 DUNE_THROW(BCRSMatrixError,"row sizes are not built up yet");
    \n+
    1277 if (ready==notAllocated)
    \n+
    1278 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
    \n+
    1279
    \n+
    1280 // check if there are undefined indices
    \n+
    1281 RowIterator endi=end();
    \n+
    1282 for (RowIterator i=begin(); i!=endi; ++i)
    \n+
    1283 {
    \n+
    1284 ColIterator endj = (*i).end();
    \n+
    1285 for (ColIterator j=(*i).begin(); j!=endj; ++j) {
    \n+
    1286 if (j.index() >= m) {
    \n+
    1287 dwarn << "WARNING: size of row "<< i.index()<<" is "<<j.offset()<<". But was specified as being "<< (*i).end().offset()
    \n+
    1288 <<". This means you are wasting valuable space and creating additional cache misses!"<<std::endl;
    \n+
    1289 nnz_ -= ((*i).end().offset() - j.offset());
    \n+
    1290 r[i.index()].setsize(j.offset());
    \n+
    1291 break;
    \n+
    1292 }
    \n+
    1293 }
    \n+
    1294 }
    \n+
    1295
    \n+
    1296 allocateData();
    \n+\n+
    1298
    \n+
    1299 // if not, set matrix to built
    \n+
    1300 ready = built;
    \n+
    1301 }
    \n+
    \n+
    1302
    \n+
    1303 //===== implicit creation interface
    \n+
    1304
    \n+
    1306
    \n+
    \n+\n+
    1318 {
    \n+
    1319#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1320 if (build_mode!=implicit)
    \n+
    1321 DUNE_THROW(BCRSMatrixError,"requires implicit build mode");
    \n+
    1322 if (ready==built)
    \n+
    1323 DUNE_THROW(BCRSMatrixError,"matrix already built up, use operator[] for entry access now");
    \n+
    1324 if (ready==notAllocated)
    \n+
    1325 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
    \n+
    1326 if (ready!=building)
    \n+
    1327 DUNE_THROW(InvalidStateException,"You may only use entry() during the 'building' stage");
    \n+
    1328
    \n+
    1329 if (row >= n)
    \n+
    1330 DUNE_THROW(BCRSMatrixError,"row index exceeds matrix size");
    \n+
    1331 if (col >= m)
    \n+
    1332 DUNE_THROW(BCRSMatrixError,"column index exceeds matrix size");
    \n+
    1333#endif
    \n+
    1334
    \n+
    1335 size_type* begin = r[row].getindexptr();
    \n+
    1336 size_type* end = begin + r[row].getsize();
    \n+
    1337
    \n+
    1338 size_type* pos = std::find(begin, end, col);
    \n+
    1339
    \n+
    1340 //treat the case that there was a match in the array
    \n+
    1341 if (pos != end)
    \n+
    1342 if (*pos == col)
    \n+
    1343 {
    \n+
    1344 std::ptrdiff_t offset = pos - r[row].getindexptr();
    \n+
    1345 B* aptr = r[row].getptr() + offset;
    \n+
    1346
    \n+
    1347 return *aptr;
    \n+
    1348 }
    \n+
    1349
    \n+
    1350 //determine whether overflow has to be taken into account or not
    \n+
    1351 if (r[row].getsize() == avg)
    \n+
    1352 return overflow[std::make_pair(row,col)];
    \n+
    1353 else
    \n+
    1354 {
    \n+
    1355 //modify index array
    \n+
    1356 *end = col;
    \n+
    1357
    \n+
    1358 //do simultaneous operations on data array a
    \n+
    1359 std::ptrdiff_t offset = end - r[row].getindexptr();
    \n+
    1360 B* apos = r[row].getptr() + offset;
    \n+
    1361
    \n+
    1362 //increase rowsize
    \n+
    1363 r[row].setsize(r[row].getsize()+1);
    \n+
    1364
    \n+
    1365 //return reference to the newly created entry
    \n+
    1366 return *apos;
    \n+
    1367 }
    \n+
    1368 }
    \n+
    \n+
    1369
    \n+
    1371
    \n+
    \n+\n+
    1382 {
    \n+
    1383 if (build_mode!=implicit)
    \n+
    1384 DUNE_THROW(BCRSMatrixError,"requires implicit build mode");
    \n+
    1385 if (ready==built)
    \n+
    1386 DUNE_THROW(BCRSMatrixError,"matrix already built up, no more need for compression");
    \n+
    1387 if (ready==notAllocated)
    \n+
    1388 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
    \n+
    1389 if (ready!=building)
    \n+
    1390 DUNE_THROW(InvalidStateException,"You may only call compress() at the end of the 'building' stage");
    \n+
    1391
    \n+
    1392 //calculate statistics
    \n+\n+
    1394 stats.overflow_total = overflow.size();
    \n+
    1395 stats.maximum = 0;
    \n+
    1396
    \n+
    1397 //get insertion iterators pointing to one before start (for later use of ++it)
    \n+
    1398 size_type* jiit = j_.get();
    \n+
    1399 B* aiit = a;
    \n+
    1400
    \n+
    1401 //get iterator to the smallest overflow element
    \n+
    1402 typename OverflowType::iterator oit = overflow.begin();
    \n+
    1403
    \n+
    1404 //store a copy of index pointers on which to perform sorting
    \n+
    1405 std::vector<size_type*> perm;
    \n+
    1406
    \n+
    1407 //iterate over all rows and copy elements into their position in the compressed array
    \n+
    1408 for (size_type i=0; i<n; i++)
    \n+
    1409 {
    \n+
    1410 //get old pointers into a and j and size without overflow changes
    \n+
    1411 size_type* begin = r[i].getindexptr();
    \n+
    1412 //B* apos = r[i].getptr();
    \n+
    1413 size_type size = r[i].getsize();
    \n+
    1414
    \n+
    1415 perm.resize(size);
    \n+
    1416
    \n+
    1417 typename std::vector<size_type*>::iterator it = perm.begin();
    \n+
    1418 for (size_type* iit = begin; iit < begin + size; ++iit, ++it)
    \n+
    1419 *it = iit;
    \n+
    1420
    \n+
    1421 //sort permutation array
    \n+
    1422 std::sort(perm.begin(),perm.end(),PointerCompare<size_type>());
    \n+
    1423
    \n+
    1424 //change row window pointer to their new positions
    \n+
    1425 r[i].setindexptr(jiit);
    \n+
    1426 r[i].setptr(aiit);
    \n+
    1427
    \n+
    1428 for (it = perm.begin(); it != perm.end(); ++it)
    \n+
    1429 {
    \n+
    1430 //check whether there are elements in the overflow area which take precedence
    \n+
    1431 while ((oit!=overflow.end()) && (oit->first < std::make_pair(i,**it)))
    \n+
    1432 {
    \n+
    1433 //check whether there is enough memory to write to
    \n+
    1434 if (jiit > begin)
    \n+\n+
    1436 "Allocated memory for BCRSMatrix exhausted during compress()!"
    \n+
    1437 "Please increase either the average number of entries per row or the compressionBufferSize value."
    \n+
    1438 );
    \n+
    1439 //copy an element from the overflow area to the insertion position in a and j
    \n+
    1440 *jiit = oit->first.second;
    \n+
    1441 ++jiit;
    \n+
    1442 *aiit = oit->second;
    \n+
    1443 ++aiit;
    \n+
    1444 ++oit;
    \n+
    1445 r[i].setsize(r[i].getsize()+1);
    \n+
    1446 }
    \n+
    1447
    \n+
    1448 //check whether there is enough memory to write to
    \n+
    1449 if (jiit > begin)
    \n+\n+
    1451 "Allocated memory for BCRSMatrix exhausted during compress()!"
    \n+
    1452 "Please increase either the average number of entries per row or the compressionBufferSize value."
    \n+
    1453 );
    \n+
    1454
    \n+
    1455 //copy element from array
    \n+
    1456 *jiit = **it;
    \n+
    1457 ++jiit;
    \n+
    1458 B* apos = *it - j_.get() + a;
    \n+
    1459 *aiit = *apos;
    \n+
    1460 ++aiit;
    \n+
    1461 }
    \n+
    1462
    \n+
    1463 //copy remaining elements from the overflow area
    \n+
    1464 while ((oit!=overflow.end()) && (oit->first.first == i))
    \n+
    1465 {
    \n+
    1466 //check whether there is enough memory to write to
    \n+
    1467 if (jiit > begin)
    \n+\n+
    1469 "Allocated memory for BCRSMatrix exhausted during compress()!"
    \n+
    1470 "Please increase either the average number of entries per row or the compressionBufferSize value."
    \n+
    1471 );
    \n+
    1472
    \n+
    1473 //copy and element from the overflow area to the insertion position in a and j
    \n+
    1474 *jiit = oit->first.second;
    \n+
    1475 ++jiit;
    \n+
    1476 *aiit = oit->second;
    \n+
    1477 ++aiit;
    \n+
    1478 ++oit;
    \n+
    1479 r[i].setsize(r[i].getsize()+1);
    \n+
    1480 }
    \n+
    1481
    \n+
    1482 // update maximum row size
    \n+
    1483 if (r[i].getsize()>stats.maximum)
    \n+
    1484 stats.maximum = r[i].getsize();
    \n+
    1485 }
    \n+
    1486
    \n+
    1487 // overflow area may be cleared
    \n+
    1488 overflow.clear();
    \n+
    1489
    \n+
    1490 //determine average number of entries and memory usage
    \n+
    1491 if ( n == 0)
    \n+
    1492 {
    \n+
    1493 stats.avg = 0;
    \n+
    1494 stats.mem_ratio = 1;
    \n+
    1495 }
    \n+
    1496 else
    \n+
    1497 {
    \n+
    1498 std::ptrdiff_t diff = (r[n-1].getindexptr() + r[n-1].getsize() - j_.get());
    \n+
    1499 nnz_ = diff;
    \n+
    1500 stats.avg = (double) (nnz_) / (double) n;
    \n+
    1501 stats.mem_ratio = (double) (nnz_) / (double) allocationSize_;
    \n+
    1502 }
    \n+
    1503
    \n+
    1504 //matrix is now built
    \n+
    1505 ready = built;
    \n+
    1506
    \n+
    1507 return stats;
    \n+
    1508 }
    \n+
    \n+
    1509
    \n+
    1510 //===== vector space arithmetic
    \n+
    1511
    \n+
    \n+\n+
    1514 {
    \n+
    1515#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1516 if (ready != built)
    \n+
    1517 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1518#endif
    \n+
    1519
    \n+
    1520 if (nnz_ > 0)
    \n+
    1521 {
    \n+
    1522 // process 1D array
    \n+
    1523 for (size_type i=0; i<nnz_; i++)
    \n+
    1524 a[i] *= k;
    \n+
    1525 }
    \n+
    1526 else
    \n+
    1527 {
    \n+
    1528 RowIterator endi=end();
    \n+
    1529 for (RowIterator i=begin(); i!=endi; ++i)
    \n+
    1530 {
    \n+
    1531 ColIterator endj = (*i).end();
    \n+
    1532 for (ColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1533 (*j) *= k;
    \n+
    1534 }
    \n+
    1535 }
    \n+
    1536
    \n+
    1537 return *this;
    \n+
    1538 }
    \n+
    \n+
    1539
    \n+
    \n+\n+
    1542 {
    \n+
    1543#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1544 if (ready != built)
    \n+
    1545 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1546#endif
    \n+
    1547
    \n+
    1548 if (nnz_ > 0)
    \n+
    1549 {
    \n+
    1550 // process 1D array
    \n+
    1551 for (size_type i=0; i<nnz_; i++)
    \n+
    1552 a[i] /= k;
    \n+
    1553 }
    \n+
    1554 else
    \n+
    1555 {
    \n+
    1556 RowIterator endi=end();
    \n+
    1557 for (RowIterator i=begin(); i!=endi; ++i)
    \n+
    1558 {
    \n+
    1559 ColIterator endj = (*i).end();
    \n+
    1560 for (ColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1561 (*j) /= k;
    \n+
    1562 }
    \n+
    1563 }
    \n+
    1564
    \n+
    1565 return *this;
    \n+
    1566 }
    \n+
    \n+
    1567
    \n+
    1568
    \n+
    \n+\n+
    1575 {
    \n+
    1576#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1577 if (ready != built || b.ready != built)
    \n+
    1578 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1579 if(N()!=b.N() || M() != b.M())
    \n+
    1580 DUNE_THROW(RangeError, "Matrix sizes do not match!");
    \n+
    1581#endif
    \n+
    1582 RowIterator endi=end();
    \n+
    1583 ConstRowIterator j=b.begin();
    \n+
    1584 for (RowIterator i=begin(); i!=endi; ++i, ++j) {
    \n+
    1585 i->operator+=(*j);
    \n+
    1586 }
    \n+
    1587
    \n+
    1588 return *this;
    \n+
    1589 }
    \n+
    \n+
    1590
    \n+
    \n+\n+
    1597 {
    \n+
    1598#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1599 if (ready != built || b.ready != built)
    \n+
    1600 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1601 if(N()!=b.N() || M() != b.M())
    \n+
    1602 DUNE_THROW(RangeError, "Matrix sizes do not match!");
    \n+
    1603#endif
    \n+
    1604 RowIterator endi=end();
    \n+
    1605 ConstRowIterator j=b.begin();
    \n+
    1606 for (RowIterator i=begin(); i!=endi; ++i, ++j) {
    \n+
    1607 i->operator-=(*j);
    \n+
    1608 }
    \n+
    1609
    \n+
    1610 return *this;
    \n+
    1611 }
    \n+
    \n+
    1612
    \n+
    \n+\n+
    1622 {
    \n+
    1623#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1624 if (ready != built || b.ready != built)
    \n+
    1625 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1626 if(N()!=b.N() || M() != b.M())
    \n+
    1627 DUNE_THROW(RangeError, "Matrix sizes do not match!");
    \n+
    1628#endif
    \n+
    1629 RowIterator endi=end();
    \n+
    1630 ConstRowIterator j=b.begin();
    \n+
    1631 for(RowIterator i=begin(); i!=endi; ++i, ++j)
    \n+
    1632 i->axpy(alpha, *j);
    \n+
    1633
    \n+
    1634 return *this;
    \n+
    1635 }
    \n+
    \n+
    1636
    \n+
    1637 //===== linear maps
    \n+
    1638
    \n+
    1640 template<class X, class Y>
    \n+
    \n+
    1641 void mv (const X& x, Y& y) const
    \n+
    1642 {
    \n+
    1643#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1644 if (ready != built)
    \n+
    1645 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1646 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,
    \n+
    1647 "Size mismatch: M: " << N() << "x" << M() << " x: " << x.N());
    \n+
    1648 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,
    \n+
    1649 "Size mismatch: M: " << N() << "x" << M() << " y: " << y.N());
    \n+
    1650#endif
    \n+
    1651 ConstRowIterator endi=end();
    \n+
    1652 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n+
    1653 {
    \n+
    1654 y[i.index()]=0;
    \n+
    1655 ConstColIterator endj = (*i).end();
    \n+
    1656 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1657 {
    \n+
    1658 auto&& xj = Impl::asVector(x[j.index()]);
    \n+
    1659 auto&& yi = Impl::asVector(y[i.index()]);
    \n+
    1660 Impl::asMatrix(*j).umv(xj, yi);
    \n+
    1661 }
    \n+
    1662 }
    \n+
    1663 }
    \n+
    \n+
    1664
    \n+
    1666 template<class X, class Y>
    \n+
    \n+
    1667 void umv (const X& x, Y& y) const
    \n+
    1668 {
    \n+
    1669#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1670 if (ready != built)
    \n+
    1671 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1672 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1673 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1674#endif
    \n+
    1675 ConstRowIterator endi=end();
    \n+
    1676 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n+
    1677 {
    \n+
    1678 ConstColIterator endj = (*i).end();
    \n+
    1679 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1680 {
    \n+
    1681 auto&& xj = Impl::asVector(x[j.index()]);
    \n+
    1682 auto&& yi = Impl::asVector(y[i.index()]);
    \n+
    1683 Impl::asMatrix(*j).umv(xj,yi);
    \n+
    1684 }
    \n+
    1685 }
    \n+
    1686 }
    \n+
    \n+
    1687
    \n+
    1689 template<class X, class Y>
    \n+
    \n+
    1690 void mmv (const X& x, Y& y) const
    \n+
    1691 {
    \n+
    1692#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1693 if (ready != built)
    \n+
    1694 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1695 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1696 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1697#endif
    \n+
    1698 ConstRowIterator endi=end();
    \n+
    1699 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n+
    1700 {
    \n+
    1701 ConstColIterator endj = (*i).end();
    \n+
    1702 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1703 {
    \n+
    1704 auto&& xj = Impl::asVector(x[j.index()]);
    \n+
    1705 auto&& yi = Impl::asVector(y[i.index()]);
    \n+
    1706 Impl::asMatrix(*j).mmv(xj,yi);
    \n+
    1707 }
    \n+
    1708 }
    \n+
    1709 }
    \n+
    \n+
    1710
    \n+
    1712 template<class X, class Y, class F>
    \n+
    \n+
    1713 void usmv (F&& alpha, const X& x, Y& y) const
    \n+
    1714 {
    \n+
    1715#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1716 if (ready != built)
    \n+
    1717 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1718 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1719 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1720#endif
    \n+
    1721 ConstRowIterator endi=end();
    \n+
    1722 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n+
    1723 {
    \n+
    1724 ConstColIterator endj = (*i).end();
    \n+
    1725 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1726 {
    \n+
    1727 auto&& xj = Impl::asVector(x[j.index()]);
    \n+
    1728 auto&& yi = Impl::asVector(y[i.index()]);
    \n+
    1729 Impl::asMatrix(*j).usmv(alpha,xj,yi);
    \n+
    1730 }
    \n+
    1731 }
    \n+
    1732 }
    \n+
    \n+
    1733
    \n+
    1735 template<class X, class Y>
    \n+
    \n+
    1736 void mtv (const X& x, Y& y) const
    \n+
    1737 {
    \n+
    1738#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1739 if (ready != built)
    \n+
    1740 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1741 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1742 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1743#endif
    \n+
    1744 for(size_type i=0; i<y.N(); ++i)
    \n+
    1745 y[i]=0;
    \n+
    1746 umtv(x,y);
    \n+
    1747 }
    \n+
    \n+
    1748
    \n+
    1750 template<class X, class Y>
    \n+
    \n+
    1751 void umtv (const X& x, Y& y) const
    \n+
    1752 {
    \n+
    1753#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1754 if (ready != built)
    \n+
    1755 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1756 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1757 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1758#endif
    \n+
    1759 ConstRowIterator endi=end();
    \n+
    1760 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n+
    1761 {
    \n+
    1762 ConstColIterator endj = (*i).end();
    \n+
    1763 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1764 {
    \n+
    1765 auto&& xi = Impl::asVector(x[i.index()]);
    \n+
    1766 auto&& yj = Impl::asVector(y[j.index()]);
    \n+
    1767 Impl::asMatrix(*j).umtv(xi,yj);
    \n+
    1768 }
    \n+
    1769 }
    \n+
    1770 }
    \n+
    \n+
    1771
    \n+
    1773 template<class X, class Y>
    \n+
    \n+
    1774 void mmtv (const X& x, Y& y) const
    \n+
    1775 {
    \n+
    1776#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1777 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1778 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1779#endif
    \n+
    1780 ConstRowIterator endi=end();
    \n+
    1781 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n+
    1782 {
    \n+
    1783 ConstColIterator endj = (*i).end();
    \n+
    1784 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1785 {
    \n+
    1786 auto&& xi = Impl::asVector(x[i.index()]);
    \n+
    1787 auto&& yj = Impl::asVector(y[j.index()]);
    \n+
    1788 Impl::asMatrix(*j).mmtv(xi,yj);
    \n+
    1789 }
    \n+
    1790 }
    \n+
    1791 }
    \n+
    \n+
    1792
    \n+
    1794 template<class X, class Y>
    \n+
    \n+
    1795 void usmtv (const field_type& alpha, const X& x, Y& y) const
    \n+
    1796 {
    \n+
    1797#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1798 if (ready != built)
    \n+
    1799 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1800 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1801 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1802#endif
    \n+
    1803 ConstRowIterator endi=end();
    \n+
    1804 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n+
    1805 {
    \n+
    1806 ConstColIterator endj = (*i).end();
    \n+
    1807 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1808 {
    \n+
    1809 auto&& xi = Impl::asVector(x[i.index()]);
    \n+
    1810 auto&& yj = Impl::asVector(y[j.index()]);
    \n+
    1811 Impl::asMatrix(*j).usmtv(alpha,xi,yj);
    \n+
    1812 }
    \n+
    1813 }
    \n+
    1814 }
    \n+
    \n+
    1815
    \n+
    1817 template<class X, class Y>
    \n+
    \n+
    1818 void umhv (const X& x, Y& y) const
    \n+
    1819 {
    \n+
    1820#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1821 if (ready != built)
    \n+
    1822 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1823 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1824 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1825#endif
    \n+
    1826 ConstRowIterator endi=end();
    \n+
    1827 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n+
    1828 {
    \n+
    1829 ConstColIterator endj = (*i).end();
    \n+
    1830 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1831 {
    \n+
    1832 auto&& xi = Impl::asVector(x[i.index()]);
    \n+
    1833 auto&& yj = Impl::asVector(y[j.index()]);
    \n+
    1834 Impl::asMatrix(*j).umhv(xi,yj);
    \n+
    1835 }
    \n+
    1836 }
    \n+
    1837 }
    \n+
    \n+
    1838
    \n+
    1840 template<class X, class Y>
    \n+
    \n+
    1841 void mmhv (const X& x, Y& y) const
    \n+
    1842 {
    \n+
    1843#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1844 if (ready != built)
    \n+
    1845 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1846 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1847 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1848#endif
    \n+
    1849 ConstRowIterator endi=end();
    \n+
    1850 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n+
    1851 {
    \n+
    1852 ConstColIterator endj = (*i).end();
    \n+
    1853 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1854 {
    \n+
    1855 auto&& xi = Impl::asVector(x[i.index()]);
    \n+
    1856 auto&& yj = Impl::asVector(y[j.index()]);
    \n+
    1857 Impl::asMatrix(*j).mmhv(xi,yj);
    \n+
    1858 }
    \n+
    1859 }
    \n+
    1860 }
    \n+
    \n+
    1861
    \n+
    1863 template<class X, class Y>
    \n+
    \n+
    1864 void usmhv (const field_type& alpha, const X& x, Y& y) const
    \n+
    1865 {
    \n+
    1866#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1867 if (ready != built)
    \n+
    1868 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1869 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1870 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n+
    1871#endif
    \n+
    1872 ConstRowIterator endi=end();
    \n+
    1873 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n+
    1874 {
    \n+
    1875 ConstColIterator endj = (*i).end();
    \n+
    1876 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n+
    1877 {
    \n+
    1878 auto&& xi = Impl::asVector(x[i.index()]);
    \n+
    1879 auto&& yj = Impl::asVector(y[j.index()]);
    \n+
    1880 Impl::asMatrix(*j).usmhv(alpha,xi,yj);
    \n+
    1881 }
    \n+
    1882 }
    \n+
    1883 }
    \n+
    \n+
    1884
    \n+
    1885
    \n+
    1886 //===== norms
    \n+
    1887
    \n+
    \n+
    1889 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
    \n+
    1890 {
    \n+
    1891#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1892 if (ready != built)
    \n+
    1893 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1894#endif
    \n+
    1895
    \n+
    1896 typename FieldTraits<field_type>::real_type sum=0;
    \n+
    1897
    \n+
    1898 for (auto&& row : (*this))
    \n+
    1899 for (auto&& entry : row)
    \n+
    1900 sum += Impl::asMatrix(entry).frobenius_norm2();
    \n+
    1901
    \n+
    1902 return sum;
    \n+
    1903 }
    \n+
    \n+
    1904
    \n+
    \n+
    1906 typename FieldTraits<field_type>::real_type frobenius_norm () const
    \n+
    1907 {
    \n+
    1908 return sqrt(frobenius_norm2());
    \n+
    1909 }
    \n+
    \n+
    1910
    \n+
    1912 template <typename ft = field_type,
    \n+
    1913 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n+
    \n+
    1914 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n+
    1915 if (ready != built)
    \n+
    1916 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1917
    \n+
    1918 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    1919 using std::max;
    \n+
    1920
    \n+
    1921 real_type norm = 0;
    \n+
    1922 for (auto const &x : *this) {
    \n+
    1923 real_type sum = 0;
    \n+
    1924 for (auto const &y : x)
    \n+
    1925 sum += Impl::asMatrix(y).infinity_norm();
    \n+
    1926 norm = max(sum, norm);
    \n+
    1927 }
    \n+
    1928 return norm;
    \n+
    1929 }
    \n+
    \n+
    1930
    \n+
    1932 template <typename ft = field_type,
    \n+
    1933 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n+
    \n+
    1934 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n+
    1935 if (ready != built)
    \n+
    1936 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1937
    \n+
    1938 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    1939 using std::max;
    \n+
    1940
    \n+
    1941 real_type norm = 0;
    \n+
    1942 for (auto const &x : *this) {
    \n+
    1943 real_type sum = 0;
    \n+
    1944 for (auto const &y : x)
    \n+
    1945 sum += Impl::asMatrix(y).infinity_norm_real();
    \n+
    1946 norm = max(sum, norm);
    \n+
    1947 }
    \n+
    1948 return norm;
    \n+
    1949 }
    \n+
    \n+
    1950
    \n+
    1952 template <typename ft = field_type,
    \n+
    1953 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n+
    \n+
    1954 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n+
    1955 if (ready != built)
    \n+
    1956 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1957
    \n+
    1958 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    1959 using std::max;
    \n+
    1960
    \n+
    1961 real_type norm = 0;
    \n+
    1962 real_type isNaN = 1;
    \n+
    1963 for (auto const &x : *this) {
    \n+
    1964 real_type sum = 0;
    \n+
    1965 for (auto const &y : x)
    \n+
    1966 sum += Impl::asMatrix(y).infinity_norm();
    \n+
    1967 norm = max(sum, norm);
    \n+
    1968 isNaN += sum;
    \n+
    1969 }
    \n+
    1970
    \n+
    1971 return norm * (isNaN / isNaN);
    \n+
    1972 }
    \n+
    \n+
    1973
    \n+
    1975 template <typename ft = field_type,
    \n+
    1976 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n+
    \n+
    1977 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n+
    1978 if (ready != built)
    \n+
    1979 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n+
    1980
    \n+
    1981 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    1982 using std::max;
    \n+
    1983
    \n+
    1984 real_type norm = 0;
    \n+
    1985 real_type isNaN = 1;
    \n+
    1986
    \n+
    1987 for (auto const &x : *this) {
    \n+
    1988 real_type sum = 0;
    \n+
    1989 for (auto const &y : x)
    \n+
    1990 sum += Impl::asMatrix(y).infinity_norm_real();
    \n+
    1991 norm = max(sum, norm);
    \n+
    1992 isNaN += sum;
    \n+
    1993 }
    \n+
    1994
    \n+
    1995 return norm * (isNaN / isNaN);
    \n+
    1996 }
    \n+
    \n+
    1997
    \n+
    1998 //===== sizes
    \n+
    1999
    \n+
    \n+
    2001 size_type N () const
    \n+
    2002 {
    \n+
    2003 return n;
    \n+
    2004 }
    \n+
    \n+
    2005
    \n+
    \n+
    2007 size_type M () const
    \n+
    2008 {
    \n+
    2009 return m;
    \n+
    2010 }
    \n+
    \n+
    2011
    \n+
    \n+\n+
    2014 {
    \n+
    2015 // in case of row-wise allocation
    \n+
    2016 if( nnz_ <= 0 )
    \n+
    2017 nnz_ = std::accumulate( begin(), end(), size_type( 0 ), [] ( size_type s, const row_type &row ) { return s+row.getsize(); } );
    \n+
    2018 return nnz_;
    \n+
    2019 }
    \n+
    \n+
    2020
    \n+
    \n+\n+
    2023 {
    \n+
    2024 return ready;
    \n+
    2025 }
    \n+
    \n+
    2026
    \n+
    \n+\n+
    2029 {
    \n+
    2030 return build_mode;
    \n+
    2031 }
    \n+
    \n+
    2032
    \n+
    2033 //===== query
    \n+
    2034
    \n+
    \n+
    2036 bool exists (size_type i, size_type j) const
    \n+
    2037 {
    \n+
    2038#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    2039 if (i<0 || i>=n) DUNE_THROW(BCRSMatrixError,"row index out of range");
    \n+
    2040 if (j<0 || j>=m) DUNE_THROW(BCRSMatrixError,"column index out of range");
    \n+
    2041#endif
    \n+
    2042 return (r[i].size() && r[i].find(j) != r[i].end());
    \n+
    2043 }
    \n+
    \n+
    2044
    \n+
    2045
    \n+
    2046 protected:
    \n+
    2047 // state information
    \n+
    2048 BuildMode build_mode; // row wise or whole matrix
    \n+
    2049 BuildStage ready; // indicate the stage the matrix building is in
    \n+
    2050
    \n+
    2051 // The allocator used for memory management
    \n+
    2052 typename std::allocator_traits<A>::template rebind_alloc<B> allocator_;
    \n+
    2053
    \n+
    2054 typename std::allocator_traits<A>::template rebind_alloc<row_type> rowAllocator_;
    \n+
    2055
    \n+
    2056 typename std::allocator_traits<A>::template rebind_alloc<size_type> sizeAllocator_;
    \n+
    2057
    \n+
    2058 // size of the matrix
    \n+
    2059 size_type n; // number of rows
    \n+
    2060 size_type m; // number of columns
    \n+
    2061 mutable size_type nnz_; // number of nonzeroes contained in the matrix
    \n+
    2062 size_type allocationSize_; //allocated size of a and j arrays, except in implicit mode: nnz_==allocationsSize_
    \n+
    2063 // zero means that memory is allocated separately for each row.
    \n+
    2064
    \n+
    2065 // the rows are dynamically allocated
    \n+
    2066 row_type* r; // [n] the individual rows having pointers into a,j arrays
    \n+
    2067
    \n+
    2068 // dynamically allocated memory
    \n+
    2069 B* a; // [allocationSize] non-zero entries of the matrix in row-wise ordering
    \n+
    2070 // If a single array of column indices is used, it can be shared
    \n+
    2071 // between different matrices with the same sparsity pattern
    \n+
    2072 std::shared_ptr<size_type> j_; // [allocationSize] column indices of entries
    \n+
    2073
    \n+
    2074 // additional data is needed in implicit buildmode
    \n+\n+\n+
    2077
    \n+
    2078 typedef std::map<std::pair<size_type,size_type>, B> OverflowType;
    \n+\n+
    2080
    \n+
    \n+\n+
    2082 {
    \n+
    2083 row_type current_row(a,j_.get(),0); // Pointers to current row data
    \n+
    2084 for (size_type i=0; i<n; i++, ++row) {
    \n+
    2085 // set row i
    \n+
    2086 size_type s = row->getsize();
    \n+
    2087
    \n+
    2088 if (s>0) {
    \n+
    2089 // setup pointers and size
    \n+
    2090 r[i].set(s,current_row.getptr(), current_row.getindexptr());
    \n+
    2091 // update pointer for next row
    \n+
    2092 current_row.setptr(current_row.getptr()+s);
    \n+
    2093 current_row.setindexptr(current_row.getindexptr()+s);
    \n+
    2094 } else{
    \n+
    2095 // empty row
    \n+
    2096 r[i].set(0,nullptr,nullptr);
    \n+
    2097 }
    \n+
    2098 }
    \n+
    2099 }
    \n+
    \n+
    2100
    \n+
    2102
    \n+
    \n+\n+
    2107 {
    \n+
    2108 size_type* jptr = j_.get();
    \n+
    2109 for (size_type i=0; i<n; ++i, ++row) {
    \n+
    2110 // set row i
    \n+
    2111 size_type s = row->getsize();
    \n+
    2112
    \n+
    2113 if (s>0) {
    \n+
    2114 // setup pointers and size
    \n+
    2115 r[i].setsize(s);
    \n+
    2116 r[i].setindexptr(jptr);
    \n+
    2117 } else{
    \n+
    2118 // empty row
    \n+
    2119 r[i].set(0,nullptr,nullptr);
    \n+
    2120 }
    \n+
    2121
    \n+
    2122 // advance position in global array
    \n+
    2123 jptr += s;
    \n+
    2124 }
    \n+
    2125 }
    \n+
    \n+
    2126
    \n+
    2128
    \n+
    \n+\n+
    2133 {
    \n+
    2134 B* aptr = a;
    \n+
    2135 for (size_type i=0; i<n; ++i) {
    \n+
    2136 // set row i
    \n+
    2137 if (r[i].getsize() > 0) {
    \n+
    2138 // setup pointers and size
    \n+
    2139 r[i].setptr(aptr);
    \n+
    2140 } else{
    \n+
    2141 // empty row
    \n+
    2142 r[i].set(0,nullptr,nullptr);
    \n+
    2143 }
    \n+
    2144
    \n+
    2145 // advance position in global array
    \n+
    2146 aptr += r[i].getsize();
    \n+
    2147 }
    \n+
    2148 }
    \n+
    \n+
    2149
    \n+
    \n+\n+
    2152 {
    \n+
    2153 setWindowPointers(Mat.begin());
    \n+
    2154
    \n+
    2155 // copy data
    \n+
    2156 for (size_type i=0; i<n; i++) r[i] = Mat.r[i];
    \n+
    2157
    \n+
    2158 // finish off
    \n+
    2159 build_mode = row_wise; // dummy
    \n+
    2160 ready = built;
    \n+
    2161 }
    \n+
    \n+
    2162
    \n+
    \n+
    2168 void deallocate(bool deallocateRows=true)
    \n+
    2169 {
    \n+
    2170
    \n+
    2171 if (notAllocated)
    \n+
    2172 return;
    \n+
    2173
    \n+
    2174 if (allocationSize_>0)
    \n+
    2175 {
    \n+
    2176 // a,j_ have been allocated as one long vector
    \n+
    2177 j_.reset();
    \n+
    2178 if (a)
    \n+
    2179 {
    \n+
    2180 for(B *aiter=a+(allocationSize_-1), *aend=a-1; aiter!=aend; --aiter)
    \n+
    2181 std::allocator_traits<decltype(allocator_)>::destroy(allocator_, aiter);
    \n+
    2182 allocator_.deallocate(a,allocationSize_);
    \n+
    2183 a = nullptr;
    \n+
    2184 }
    \n+
    2185 }
    \n+
    2186 else if (r)
    \n+
    2187 {
    \n+
    2188 // check if memory for rows have been allocated individually
    \n+
    2189 for (size_type i=0; i<n; i++)
    \n+
    2190 if (r[i].getsize()>0)
    \n+
    2191 {
    \n+
    2192 for (B *col=r[i].getptr()+(r[i].getsize()-1),
    \n+
    2193 *colend = r[i].getptr()-1; col!=colend; --col) {
    \n+
    2194 std::allocator_traits<decltype(allocator_)>::destroy(allocator_, col);
    \n+
    2195 }
    \n+
    2196 sizeAllocator_.deallocate(r[i].getindexptr(),1);
    \n+
    2197 allocator_.deallocate(r[i].getptr(),1);
    \n+
    2198 // clear out row data in case we don't want to deallocate the rows
    \n+
    2199 // otherwise we might run into a double free problem here later
    \n+
    2200 r[i].set(0,nullptr,nullptr);
    \n+
    2201 }
    \n+
    2202 }
    \n+
    2203
    \n+
    2204 // deallocate the rows
    \n+
    2205 if (n>0 && deallocateRows && r) {
    \n+
    2206 for(row_type *riter=r+(n-1), *rend=r-1; riter!=rend; --riter)
    \n+
    2207 std::allocator_traits<decltype(rowAllocator_)>::destroy(rowAllocator_, riter);
    \n+
    2208 rowAllocator_.deallocate(r,n);
    \n+
    2209 r = nullptr;
    \n+
    2210 }
    \n+
    2211
    \n+
    2212 // Mark matrix as not built at all.
    \n+\n+
    2214
    \n+
    2215 }
    \n+
    \n+
    2216
    \n+
    \n+
    2235 void allocate(size_type rows, size_type columns, size_type allocationSize, bool allocateRows, bool allocate_data)
    \n+
    2236 {
    \n+
    2237 // Store size
    \n+
    2238 n = rows;
    \n+
    2239 m = columns;
    \n+
    2240 nnz_ = allocationSize;
    \n+
    2241 allocationSize_ = allocationSize;
    \n+
    2242
    \n+
    2243 // allocate rows
    \n+
    2244 if(allocateRows) {
    \n+
    2245 if (n>0) {
    \n+
    2246 if (r)
    \n+
    2247 DUNE_THROW(InvalidStateException,"Rows have already been allocated, cannot allocate a second time");
    \n+
    2248 r = rowAllocator_.allocate(rows);
    \n+
    2249 // initialize row entries
    \n+
    2250 for(row_type* ri=r; ri!=r+rows; ++ri)
    \n+
    2251 std::allocator_traits<decltype(rowAllocator_)>::construct(rowAllocator_, ri, row_type());
    \n+
    2252 }else{
    \n+
    2253 r = 0;
    \n+
    2254 }
    \n+
    2255 }
    \n+
    2256
    \n+
    2257 // allocate a and j_ array
    \n+
    2258 if (allocate_data)
    \n+
    2259 allocateData();
    \n+
    2260 // allocate column indices only if not yet present (enable sharing)
    \n+
    2261 if (allocationSize_>0) {
    \n+
    2262 // we copy allocator and size to the deleter since _j may outlive this class
    \n+
    2263 if (!j_.get())
    \n+
    2264 j_.reset(sizeAllocator_.allocate(allocationSize_),
    \n+
    2265 [alloc = sizeAllocator_, size = allocationSize_](auto ptr) mutable {
    \n+
    2266 alloc.deallocate(ptr, size);
    \n+
    2267 });
    \n+
    2268 }else{
    \n+
    2269 j_.reset();
    \n+
    2270 }
    \n+
    2271
    \n+
    2272 // Mark the matrix as not built.
    \n+
    2273 ready = building;
    \n+
    2274 }
    \n+
    \n+
    2275
    \n+
    \n+\n+
    2277 {
    \n+
    2278 if (a)
    \n+
    2279 DUNE_THROW(InvalidStateException,"Cannot allocate data array (already allocated)");
    \n+
    2280 if (allocationSize_>0) {
    \n+
    2281 a = allocator_.allocate(allocationSize_);
    \n+
    2282 // use placement new to call constructor that allocates
    \n+
    2283 // additional memory.
    \n+
    2284 new (a) B[allocationSize_];
    \n+
    2285 } else {
    \n+
    2286 a = nullptr;
    \n+
    2287 }
    \n+
    2288 }
    \n+
    \n+
    2289
    \n+
    \n+\n+
    2296 {
    \n+
    2297 if (build_mode != implicit)
    \n+
    2298 DUNE_THROW(InvalidStateException,"implicit_allocate() may only be called in implicit build mode");
    \n+
    2299 if (ready != notAllocated)
    \n+
    2300 DUNE_THROW(InvalidStateException,"memory has already been allocated");
    \n+
    2301
    \n+
    2302 // check to make sure the user has actually set the parameters
    \n+
    2303 if (compressionBufferSize_ < 0)
    \n+
    2304 DUNE_THROW(InvalidStateException,"You have to set the implicit build mode parameters before starting to build the matrix");
    \n+
    2305 //calculate size of overflow region, add buffer for row sort!
    \n+\n+
    2307 allocationSize_ = _n*avg + osize;
    \n+
    2308
    \n+
    2309 allocate(_n, _m, allocationSize_,true,true);
    \n+
    2310
    \n+
    2311 //set row pointers correctly
    \n+
    2312 size_type* jptr = j_.get() + osize;
    \n+
    2313 B* aptr = a + osize;
    \n+
    2314 for (size_type i=0; i<n; i++)
    \n+
    2315 {
    \n+
    2316 r[i].set(0,aptr,jptr);
    \n+
    2317 jptr = jptr + avg;
    \n+
    2318 aptr = aptr + avg;
    \n+
    2319 }
    \n+
    2320
    \n+
    2321 ready = building;
    \n+
    2322 }
    \n+
    \n+
    2323 };
    \n+
    \n+
    2324
    \n+
    2325
    \n+
    2326 template<class B, class A>
    \n+
    \n+
    2327 struct FieldTraits< BCRSMatrix<B, A> >
    \n+
    2328 {
    \n+\n+
    2330 using real_type = typename FieldTraits<field_type>::real_type;
    \n+
    2331 };
    \n+
    \n+
    2332
    \n+
    2335} // end namespace
    \n+
    2336
    \n+
    2337#endif
    \n+\n+
    Helper functions for determining the vector/matrix block level.
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+
    Some handy generic functions for ISTL matrices.
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n
    Definition allocator.hh:11
    \n-
    A linear operator exporting itself in matrix form.
    Definition operators.hh:111
    \n-
    An overlapping Schwarz operator.
    Definition schwarz.hh:75
    \n-
    const communication_type & getCommunication() const
    Get the object responsible for communication.
    Definition schwarz.hh:146
    \n-
    virtual const matrix_type & getmat() const
    get the sequential assembled linear operator.
    Definition schwarz.hh:133
    \n-
    virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const
    apply operator to x, scale and add:
    Definition schwarz.hh:125
    \n-
    virtual void apply(const X &x, Y &y) const
    apply operator to x:
    Definition schwarz.hh:116
    \n-
    C communication_type
    The type of the communication object.
    Definition schwarz.hh:98
    \n-
    X domain_type
    The type of the domain.
    Definition schwarz.hh:86
    \n-
    M matrix_type
    The type of the matrix we operate on.
    Definition schwarz.hh:81
    \n-
    Y range_type
    The type of the range.
    Definition schwarz.hh:91
    \n-
    X::field_type field_type
    The field type of the range.
    Definition schwarz.hh:93
    \n-
    OverlappingSchwarzOperator(const matrix_type &A, const communication_type &com)
    constructor: just store a reference to a matrix.
    Definition schwarz.hh:107
    \n-
    OverlappingSchwarzOperator(const std::shared_ptr< matrix_type > A, const communication_type &com)
    Definition schwarz.hh:111
    \n-
    virtual SolverCategory::Category category() const
    Category of the linear operator (see SolverCategory::Category)
    Definition schwarz.hh:139
    \n-
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n-
    A parallel SSOR preconditioner.
    Definition schwarz.hh:175
    \n-
    X::field_type field_type
    The field type of the preconditioner.
    Definition schwarz.hh:184
    \n-
    C communication_type
    The type of the communication object.
    Definition schwarz.hh:186
    \n-
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition schwarz.hh:233
    \n-
    ParSSOR(const matrix_type &A, int n, field_type w, const communication_type &c)
    Constructor.
    Definition schwarz.hh:197
    \n-
    virtual void post(X &x)
    Clean up.
    Definition schwarz.hh:230
    \n-
    X domain_type
    The domain type of the preconditioner.
    Definition schwarz.hh:180
    \n-
    Y range_type
    The range type of the preconditioner.
    Definition schwarz.hh:182
    \n-
    M matrix_type
    The matrix type the preconditioner is for.
    Definition schwarz.hh:178
    \n-
    virtual void apply(X &v, const Y &d)
    Apply the preconditioner.
    Definition schwarz.hh:216
    \n-
    virtual void pre(X &x, Y &b)
    Prepare the preconditioner.
    Definition schwarz.hh:206
    \n-
    Block parallel preconditioner.
    Definition schwarz.hh:278
    \n-
    virtual void pre(X &x, Y &b)
    Prepare the preconditioner.
    Definition schwarz.hh:326
    \n-
    X domain_type
    The domain type of the preconditioner.
    Definition schwarz.hh:285
    \n-
    BlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c)
    Constructor.
    Definition schwarz.hh:317
    \n-
    virtual void apply(X &v, const Y &d)
    Apply the preconditioner.
    Definition schwarz.hh:337
    \n-
    BlockPreconditioner(P &p, const communication_type &c)
    Constructor.
    Definition schwarz.hh:306
    \n-
    void apply(X &v, const Y &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition schwarz.hh:344
    \n-
    C communication_type
    The type of the communication object..
    Definition schwarz.hh:297
    \n-
    X::field_type field_type
    The field type of the preconditioner.
    Definition schwarz.hh:292
    \n-
    virtual void post(X &x)
    Clean up.
    Definition schwarz.hh:355
    \n-
    Y range_type
    The range type of the preconditioner.
    Definition schwarz.hh:290
    \n-
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition schwarz.hh:361
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ overlapping
    Category for overlapping solvers.
    Definition solvercategory.hh:29
    \n+
    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
    \n+
    Definition matrixutils.hh:211
    \n+
    Statistics about compression achieved in implicit mode.
    Definition bcrsmatrix.hh:88
    \n+
    size_type overflow_total
    total number of elements written to the overflow area during construction.
    Definition bcrsmatrix.hh:94
    \n+
    size_type maximum
    maximum number of non-zeroes per row.
    Definition bcrsmatrix.hh:92
    \n+
    double avg
    average number of non-zeroes per row.
    Definition bcrsmatrix.hh:90
    \n+
    double mem_ratio
    fraction of wasted memory resulting from non-used overflow area.
    Definition bcrsmatrix.hh:99
    \n+
    A wrapper for uniform access to the BCRSMatrix during and after the build stage in implicit build mod...
    Definition bcrsmatrix.hh:117
    \n+
    Matrix::block_type block_type
    The block_type of the underlying matrix.
    Definition bcrsmatrix.hh:125
    \n+
    ImplicitMatrixBuilder(Matrix &m)
    Creates an ImplicitMatrixBuilder for matrix m.
    Definition bcrsmatrix.hh:170
    \n+
    M_ Matrix
    The underlying matrix.
    Definition bcrsmatrix.hh:122
    \n+
    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
    \n+
    size_type M() const
    The number of columns in the matrix.
    Definition bcrsmatrix.hh:217
    \n+
    Matrix::size_type size_type
    The size_type of the underlying matrix.
    Definition bcrsmatrix.hh:128
    \n+
    row_object operator[](size_type i) const
    Returns a proxy for entries in row i.
    Definition bcrsmatrix.hh:205
    \n+
    size_type N() const
    The number of rows in the matrix.
    Definition bcrsmatrix.hh:211
    \n+
    Proxy row object for entry access.
    Definition bcrsmatrix.hh:137
    \n+
    block_type & operator[](size_type j) const
    Returns entry in column j.
    Definition bcrsmatrix.hh:142
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bcrsmatrix.hh:488
    \n+
    std::allocator_traits< A >::template rebind_alloc< row_type > rowAllocator_
    Definition bcrsmatrix.hh:2054
    \n+
    bool exists(size_type i, size_type j) const
    return true if (i,j) is in pattern
    Definition bcrsmatrix.hh:2036
    \n+
    BuildStage buildStage() const
    The current build stage of the matrix.
    Definition bcrsmatrix.hh:2022
    \n+
    Iterator begin()
    Get iterator to first row.
    Definition bcrsmatrix.hh:671
    \n+
    void copyWindowStructure(const BCRSMatrix &Mat)
    Copy the window structure from another matrix.
    Definition bcrsmatrix.hh:2151
    \n+
    B & entry(size_type row, size_type col)
    Returns reference to entry (row,col) of the matrix.
    Definition bcrsmatrix.hh:1317
    \n+
    void mmhv(const X &x, Y &y) const
    y -= A^H x
    Definition bcrsmatrix.hh:1841
    \n+
    void usmhv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^H x
    Definition bcrsmatrix.hh:1864
    \n+
    void umtv(const X &x, Y &y) const
    y += A^T x
    Definition bcrsmatrix.hh:1751
    \n+
    double compressionBufferSize_
    Definition bcrsmatrix.hh:2076
    \n+
    size_type m
    Definition bcrsmatrix.hh:2060
    \n+
    RealRowIterator< const row_type > const_iterator
    The const iterator over the matrix rows.
    Definition bcrsmatrix.hh:703
    \n+
    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:2235
    \n+
    BCRSMatrix & axpy(field_type alpha, const BCRSMatrix &b)
    Add the scaled entries of another matrix to this one.
    Definition bcrsmatrix.hh:1621
    \n+
    FieldTraits< ft >::real_type infinity_norm_real() const
    simplified infinity norm (uses Manhattan norm for complex values)
    Definition bcrsmatrix.hh:1934
    \n+
    ~BCRSMatrix()
    destructor
    Definition bcrsmatrix.hh:821
    \n+
    void allocateData()
    Definition bcrsmatrix.hh:2276
    \n+
    void deallocate(bool deallocateRows=true)
    deallocate memory of the matrix.
    Definition bcrsmatrix.hh:2168
    \n+
    Iterator RowIterator
    rename the iterators for easier access
    Definition bcrsmatrix.hh:697
    \n+
    row_type & operator[](size_type i)
    random access to the rows
    Definition bcrsmatrix.hh:545
    \n+
    BCRSMatrix()
    an empty matrix
    Definition bcrsmatrix.hh:745
    \n+
    void endrowsizes()
    indicate that size of all rows is defined
    Definition bcrsmatrix.hh:1146
    \n+
    void incrementrowsize(size_type i, size_type s=1)
    increment size of row i by s (1 by default)
    Definition bcrsmatrix.hh:1135
    \n+
    void mtv(const X &x, Y &y) const
    y = A^T x
    Definition bcrsmatrix.hh:1736
    \n+
    void umhv(const X &x, Y &y) const
    y += A^H x
    Definition bcrsmatrix.hh:1818
    \n+
    size_type nonzeroes() const
    number of blocks that are stored (the number of blocks that possibly are nonzero)
    Definition bcrsmatrix.hh:2013
    \n+
    size_type allocationSize_
    Definition bcrsmatrix.hh:2062
    \n+
    ConstIterator ConstRowIterator
    rename the const row iterator for easier access
    Definition bcrsmatrix.hh:734
    \n+
    BuildStage ready
    Definition bcrsmatrix.hh:2049
    \n+
    void setIndicesNoSort(size_type row, It begin, It end)
    Set all column indices for row from the given iterator range.
    Definition bcrsmatrix.hh:1232
    \n+
    BuildMode build_mode
    Definition bcrsmatrix.hh:2048
    \n+
    void setrowsize(size_type i, size_type s)
    Set number of indices in row i to s.
    Definition bcrsmatrix.hh:1114
    \n+
    RealRowIterator< row_type > Iterator
    Definition bcrsmatrix.hh:668
    \n+
    size_type nnz_
    Definition bcrsmatrix.hh:2061
    \n+
    BCRSMatrix & operator*=(const field_type &k)
    vector space multiplication with scalar
    Definition bcrsmatrix.hh:1513
    \n+
    std::allocator_traits< A >::template rebind_alloc< size_type > sizeAllocator_
    Definition bcrsmatrix.hh:2056
    \n+
    RealRowIterator< row_type > iterator
    The iterator over the (mutable matrix rows.
    Definition bcrsmatrix.hh:667
    \n+
    void usmtv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^T x
    Definition bcrsmatrix.hh:1795
    \n+
    ConstIterator beforeBegin() const
    Definition bcrsmatrix.hh:728
    \n+
    RealRowIterator< const row_type > ConstIterator
    Definition bcrsmatrix.hh:704
    \n+
    Iterator beforeBegin()
    Definition bcrsmatrix.hh:691
    \n+
    B * a
    Definition bcrsmatrix.hh:2069
    \n+
    BuildMode
    we support two modes
    Definition bcrsmatrix.hh:506
    \n+
    @ implicit
    Build entries randomly with an educated guess for the number of entries per row.
    Definition bcrsmatrix.hh:535
    \n+
    @ unknown
    Build mode not set!
    Definition bcrsmatrix.hh:539
    \n+
    @ random
    Build entries randomly.
    Definition bcrsmatrix.hh:526
    \n+
    @ row_wise
    Build in a row-wise manner.
    Definition bcrsmatrix.hh:517
    \n+
    BCRSMatrix(size_type _n, size_type _m, size_type _nnz, BuildMode bm)
    matrix with known number of nonzeroes
    Definition bcrsmatrix.hh:752
    \n+
    Imp::CompressedBlockVectorWindow< B, size_type > row_type
    implement row_type with compressed vector
    Definition bcrsmatrix.hh:500
    \n+
    ::Dune::CompressionStatistics< size_type > CompressionStatistics
    The type for the statistics object returned by compress()
    Definition bcrsmatrix.hh:503
    \n+
    BCRSMatrix & operator-=(const BCRSMatrix &b)
    Subtract the entries of another matrix from this one.
    Definition bcrsmatrix.hh:1596
    \n+
    BCRSMatrix(const BCRSMatrix &Mat)
    copy constructor
    Definition bcrsmatrix.hh:802
    \n+
    Iterator end()
    Get iterator to one beyond last row.
    Definition bcrsmatrix.hh:677
    \n+
    row_type * r
    Definition bcrsmatrix.hh:2066
    \n+
    void setIndices(size_type row, It begin, It end)
    Set all column indices for row from the given iterator range.
    Definition bcrsmatrix.hh:1255
    \n+
    void addindex(size_type row, size_type col)
    add index (row,col) to the matrix
    Definition bcrsmatrix.hh:1188
    \n+
    std::map< std::pair< size_type, size_type >, B > OverflowType
    Definition bcrsmatrix.hh:2078
    \n+
    row_type::Iterator ColIterator
    Iterator for the entries of each row.
    Definition bcrsmatrix.hh:700
    \n+
    FieldTraits< field_type >::real_type frobenius_norm() const
    frobenius norm: sqrt(sum over squared values of entries)
    Definition bcrsmatrix.hh:1906
    \n+
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n+
    BCRSMatrix & operator/=(const field_type &k)
    vector space division by scalar
    Definition bcrsmatrix.hh:1541
    \n+
    OverflowType overflow
    Definition bcrsmatrix.hh:2079
    \n+
    BCRSMatrix & operator+=(const BCRSMatrix &b)
    Add the entries of another matrix to this one.
    Definition bcrsmatrix.hh:1574
    \n+
    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:781
    \n+
    CreateIterator createend()
    get create iterator pointing to one after the last block
    Definition bcrsmatrix.hh:1100
    \n+
    FieldTraits< field_type >::real_type frobenius_norm2() const
    square of frobenius norm, need for block recursion
    Definition bcrsmatrix.hh:1889
    \n+
    Iterator beforeEnd()
    Definition bcrsmatrix.hh:684
    \n+
    row_type::ConstIterator ConstColIterator
    Const iterator to the entries of a row.
    Definition bcrsmatrix.hh:737
    \n+
    void usmv(F &&alpha, const X &x, Y &y) const
    y += alpha A x
    Definition bcrsmatrix.hh:1713
    \n+
    size_type getrowsize(size_type i) const
    get current number of indices in row i
    Definition bcrsmatrix.hh:1125
    \n+
    size_type M() const
    number of columns (counted in blocks)
    Definition bcrsmatrix.hh:2007
    \n+
    size_type n
    Definition bcrsmatrix.hh:2059
    \n+
    CreateIterator createbegin()
    get initial create iterator
    Definition bcrsmatrix.hh:1094
    \n+
    BuildStage
    Definition bcrsmatrix.hh:469
    \n+
    @ rowSizesBuilt
    The row sizes of the matrix are known.
    Definition bcrsmatrix.hh:480
    \n+
    @ built
    The matrix structure is fully built.
    Definition bcrsmatrix.hh:482
    \n+
    @ notbuilt
    Matrix is not built at all, no memory has been allocated, build mode and size can still be set.
    Definition bcrsmatrix.hh:471
    \n+
    @ notAllocated
    Matrix is not built at all, no memory has been allocated, build mode and size can still be set.
    Definition bcrsmatrix.hh:473
    \n+
    @ building
    Matrix is currently being built, some memory has been allocated, build mode and size are fixed.
    Definition bcrsmatrix.hh:475
    \n+
    BuildMode buildMode() const
    The currently selected build mode of the matrix.
    Definition bcrsmatrix.hh:2028
    \n+
    void mmv(const X &x, Y &y) const
    y -= A x
    Definition bcrsmatrix.hh:1690
    \n+
    FieldTraits< ft >::real_type infinity_norm() const
    infinity norm (row sum norm, how to generalize for blocks?)
    Definition bcrsmatrix.hh:1914
    \n+
    void mv(const X &x, Y &y) const
    y = A x
    Definition bcrsmatrix.hh:1641
    \n+
    B block_type
    export the type representing the components
    Definition bcrsmatrix.hh:491
    \n+
    void mmtv(const X &x, Y &y) const
    y -= A^T x
    Definition bcrsmatrix.hh:1774
    \n+
    size_type avg
    Definition bcrsmatrix.hh:2075
    \n+
    void umv(const X &x, Y &y) const
    y += A x
    Definition bcrsmatrix.hh:1667
    \n+
    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:2295
    \n+
    void setImplicitBuildModeParameters(size_type _avg, double compressionBufferSize)
    Set parameters needed for creation in implicit build mode.
    Definition bcrsmatrix.hh:886
    \n+
    BCRSMatrix(size_type _n, size_type _m, BuildMode bm)
    matrix with unknown number of nonzeroes
    Definition bcrsmatrix.hh:761
    \n+
    void endindices()
    indicate that all indices are defined, check consistency
    Definition bcrsmatrix.hh:1269
    \n+
    CompressionStatistics compress()
    Finishes the buildstage in implicit mode.
    Definition bcrsmatrix.hh:1381
    \n+
    void setDataPointers()
    Set data pointers for all rows.
    Definition bcrsmatrix.hh:2132
    \n+
    std::allocator_traits< A >::template rebind_alloc< B > allocator_
    Definition bcrsmatrix.hh:2052
    \n+
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n+
    void setBuildMode(BuildMode bm)
    Sets the build mode of the matrix.
    Definition bcrsmatrix.hh:830
    \n+
    void setSize(size_type rows, size_type columns, size_type nnz=0)
    Set the size of the matrix.
    Definition bcrsmatrix.hh:858
    \n+
    std::shared_ptr< size_type > j_
    Definition bcrsmatrix.hh:2072
    \n+
    void setWindowPointers(ConstRowIterator row)
    Definition bcrsmatrix.hh:2081
    \n+
    BCRSMatrix & operator=(const BCRSMatrix &Mat)
    assignment
    Definition bcrsmatrix.hh:908
    \n+
    void setColumnPointers(ConstRowIterator row)
    Copy row sizes from iterator range starting at row and set column index pointers for all rows.
    Definition bcrsmatrix.hh:2106
    \n+
    ConstIterator end() const
    Get const iterator to one beyond last row.
    Definition bcrsmatrix.hh:714
    \n+
    ConstIterator begin() const
    Get const iterator to first row.
    Definition bcrsmatrix.hh:708
    \n+
    A allocator_type
    export the allocator type
    Definition bcrsmatrix.hh:494
    \n+
    ConstIterator beforeEnd() const
    Definition bcrsmatrix.hh:721
    \n+
    Iterator access to matrix rows
    Definition bcrsmatrix.hh:575
    \n+
    RealRowIterator()
    empty constructor, use with care!
    Definition bcrsmatrix.hh:592
    \n+
    bool equals(const RealRowIterator< ValueType > &other) const
    equality
    Definition bcrsmatrix.hh:620
    \n+
    std::remove_const< T >::type ValueType
    The unqualified value type.
    Definition bcrsmatrix.hh:579
    \n+
    RealRowIterator(const RealRowIterator< ValueType > &it)
    Definition bcrsmatrix.hh:596
    \n+
    bool equals(const RealRowIterator< const ValueType > &other) const
    equality
    Definition bcrsmatrix.hh:627
    \n+
    RealRowIterator(row_type *_p, size_type _i)
    constructor
    Definition bcrsmatrix.hh:587
    \n+
    std::ptrdiff_t distanceTo(const RealRowIterator< const ValueType > &other) const
    Definition bcrsmatrix.hh:613
    \n+
    size_type index() const
    return index
    Definition bcrsmatrix.hh:602
    \n+
    std::ptrdiff_t distanceTo(const RealRowIterator< ValueType > &other) const
    Definition bcrsmatrix.hh:607
    \n+
    Iterator class for sequential creation of blocks
    Definition bcrsmatrix.hh:954
    \n+
    bool operator==(const CreateIterator &it) const
    equality
    Definition bcrsmatrix.hh:1049
    \n+
    CreateIterator & operator++()
    prefix increment
    Definition bcrsmatrix.hh:974
    \n+
    size_type index() const
    The number of the row that the iterator currently points to.
    Definition bcrsmatrix.hh:1055
    \n+
    bool operator!=(const CreateIterator &it) const
    inequality
    Definition bcrsmatrix.hh:1043
    \n+
    CreateIterator(BCRSMatrix &_Mat, size_type _i)
    constructor
    Definition bcrsmatrix.hh:957
    \n+
    void insert(size_type j)
    put column index in row
    Definition bcrsmatrix.hh:1061
    \n+
    bool contains(size_type j)
    return true if column index is in row
    Definition bcrsmatrix.hh:1067
    \n+
    size_type size() const
    Get the current row size.
    Definition bcrsmatrix.hh:1076
    \n+
    typename BCRSMatrix< B, A >::field_type field_type
    Definition bcrsmatrix.hh:2329
    \n+
    typename FieldTraits< field_type >::real_type real_type
    Definition bcrsmatrix.hh:2330
    \n+
    Error specific to BCRSMatrix.
    Definition istlexception.hh:24
    \n+
    Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted.
    Definition istlexception.hh:37
    \n+
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    A::size_type size_type
    Type for indices and sizes.
    Definition matrix.hh:577
    \n+
    T block_type
    Export the type representing the components.
    Definition matrix.hh:568
    \n+
    Definition matrixutils.hh:538
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,391 +1,2409 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-schwarz.hh\n+bcrsmatrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_SCHWARZ_HH\n-6#define DUNE_ISTL_SCHWARZ_HH\n-7\n-8#include // for input/output to shell\n-9#include // for input/output to files\n-10#include // STL vector class\n-11#include \n-12\n-13#include // Yes, we do some math here\n-14\n-15#include \n-16\n-17#include \"_\bi_\bo_\b._\bh_\bh\"\n-18#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-19#include \"_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-20#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-21#include \"_\bi_\bo_\b._\bh_\bh\"\n-22#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n-23#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n-24#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n-25#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n-26#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n-27#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n-28#include \"_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\"\n-29\n-30namespace _\bD_\bu_\bn_\be {\n-31\n-73 template\n-_\b7_\b4 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br : public _\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-75 {\n-76 public:\n-_\b8_\b1 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b8_\b6 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b9_\b1 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b9_\b3 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b9_\b8 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n-99\n-_\b1_\b0_\b7 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br (const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& A, const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be&\n-com)\n-108 : _A_(stackobject_to_shared_ptr(A)), communication(com)\n-109 {}\n-110\n-_\b1_\b1_\b1 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br (const std::shared_ptr A, const\n-_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& com)\n-112 : _A_(A), communication(com)\n-113 {}\n-114\n-_\b1_\b1_\b6 virtual void _\ba_\bp_\bp_\bl_\by (const X& x, Y& y) const\n+5\n+6#ifndef DUNE_ISTL_BCRSMATRIX_HH\n+7#define DUNE_ISTL_BCRSMATRIX_HH\n+8\n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \n+17#include \n+18\n+19#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+20#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+21#include \"_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\"\n+22#include \n+23#include \n+24#include \n+25#include \n+26#include \n+27#include \n+28\n+29#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+30\n+35namespace _\bD_\bu_\bn_\be {\n+36\n+76 template\n+77 struct MatrixDimension;\n+78\n+80\n+86 template\n+_\b8_\b7 struct _\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs\n+88 {\n+_\b9_\b0 double _\ba_\bv_\bg;\n+_\b9_\b2 size_type _\bm_\ba_\bx_\bi_\bm_\bu_\bm;\n+_\b9_\b4 size_type _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw_\b__\bt_\bo_\bt_\ba_\bl;\n+96\n+_\b9_\b9 double _\bm_\be_\bm_\b__\br_\ba_\bt_\bi_\bo;\n+100 };\n+101\n+103\n+115 template\n+_\b1_\b1_\b6 class _\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br\n 117 {\n-118 y = 0;\n-119 _A_->umv(x,y); // result is consistent on interior+border\n-120 communication.project(y); // we want this here to avoid it before the\n-preconditioner\n-121 // since there d is const!\n-122 }\n+118\n+119 public:\n+120\n+_\b1_\b2_\b2 typedef M_ _\bM_\ba_\bt_\br_\bi_\bx;\n 123\n-_\b1_\b2_\b5 virtual void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha, const X& x, Y& y) const\n-126 {\n-127 _A_->usmv(alpha,x,y); // result is consistent on interior+border\n-128 communication.project(y); // we want this here to avoid it before the\n-preconditioner\n-129 // since there d is const!\n-130 }\n+_\b1_\b2_\b5 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+126\n+_\b1_\b2_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+129\n 131\n-_\b1_\b3_\b3 virtual const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bg_\be_\bt_\bm_\ba_\bt () const\n-134 {\n-135 return *_A_;\n-136 }\n-137\n-_\b1_\b3_\b9 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-140 {\n-141 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg;\n-142 }\n-143\n-144\n-_\b1_\b4_\b6 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn() const\n-147 {\n-148 return communication;\n-149 }\n-150 private:\n-151 const std::shared_ptr_A_;\n-152 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& communication;\n-153 };\n-154\n-174 template\n-_\b1_\b7_\b5 class _\bP_\ba_\br_\bS_\bS_\bO_\bR : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n-176 public:\n-_\b1_\b7_\b8 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b1_\b8_\b0 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b1_\b8_\b2 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b1_\b8_\b4 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b1_\b8_\b6 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n-187\n-_\b1_\b9_\b7 _\bP_\ba_\br_\bS_\bS_\bO_\bR (const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& A, int n, _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be w, const\n-_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& c)\n-198 : _A_(A), _n(n), _w(w), communication(c)\n-199 { }\n-200\n-_\b2_\b0_\b6 virtual void _\bp_\br_\be (X& x, [[maybe_unused]] Y& b)\n-207 {\n-208 communication.copyOwnerToAll(x,x); // make dirichlet values consistent\n-209 }\n-210\n-_\b2_\b1_\b6 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n-217 {\n-218 for (int i=0; i<_n; i++) {\n-219 _\bb_\bs_\bo_\br_\bf(_A_,v,d,_w);\n-220 _\bb_\bs_\bo_\br_\bb(_A_,v,d,_w);\n-221 }\n-222 communication.copyOwnerToAll(v,v);\n-223 }\n-224\n-_\b2_\b3_\b0 virtual void _\bp_\bo_\bs_\bt ([[maybe_unused]] X& x) {}\n-231\n-_\b2_\b3_\b3 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-234 {\n-235 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg;\n-236 }\n-237\n-238 private:\n-240 const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _A_;\n-242 int _n;\n-244 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _w;\n-_\b2_\b4_\b6 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& communication;\n-247 };\n-248\n-249 namespace Amg\n-250 {\n-251 template struct ConstructionTraits;\n-252 }\n-253\n-277 template >\n-_\b2_\b7_\b8 class _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n-279 friend struct Amg::ConstructionTraits<_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >;\n-280 public:\n-_\b2_\b8_\b5 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b2_\b9_\b0 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b2_\b9_\b2 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b2_\b9_\b7 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n-298\n-_\b3_\b0_\b6 _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br (P& p, const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& c)\n-307 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)\n-308 { }\n-309\n-_\b3_\b1_\b7 _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br (const std::shared_ptr

    & p, const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be&\n-c)\n-318 : _preconditioner(p), _communication(c)\n-319 { }\n-320\n-_\b3_\b2_\b6 virtual void _\bp_\br_\be (X& x, Y& b)\n-327 {\n-328 _communication.copyOwnerToAll(x,x); // make dirichlet values consistent\n-329 _preconditioner->pre(x,b);\n-330 }\n-331\n-_\b3_\b3_\b7 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n-338 {\n-339 _preconditioner->apply(v,d);\n-340 _communication.copyOwnerToAll(v,v);\n-341 }\n-342\n-343 template\n-_\b3_\b4_\b4 void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n-345 {\n-346 _preconditioner->template apply(v,d);\n-347 _communication.copyOwnerToAll(v,v);\n-348 }\n-349\n-_\b3_\b5_\b5 virtual void _\bp_\bo_\bs_\bt (X& x)\n-356 {\n-357 _preconditioner->post(x);\n-358 }\n-359\n-_\b3_\b6_\b1 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-362 {\n-363 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg;\n-364 }\n-365\n-366 private:\n-368 std::shared_ptr

    _preconditioner;\n-369\n-371 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& _communication;\n-372 };\n-373\n-376} // end namespace\n-377\n-378#endif\n-_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\n-Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n-generic way.\n-_\bi_\bo_\b._\bh_\bh\n-Some generic functions for pretty printing vectors and matrices.\n-_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n-Define general preconditioner interface.\n-_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\n-Define base class for scalar product and norm.\n-_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implementation of the BCRSMatrix class.\n-_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n-Implementations of the inverse operator interface.\n-_\bi_\bl_\bu_\b._\bh_\bh\n-The incomplete LU factorization kernels.\n-_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n-Define general, extensible interface for operators. The available\n-implementation wraps a matrix.\n-_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-???\n-_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n-Classes providing communication interfaces for overlapping Schwarz methods.\n+_\b1_\b3_\b6 class _\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt\n+137 {\n+138\n+139 public:\n+140\n+_\b1_\b4_\b2 _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j) const\n+143 {\n+144 return _m.entry(_i,j);\n+145 }\n+146\n+147#ifndef DOXYGEN\n+148\n+149 _\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt(_\bM_\ba_\bt_\br_\bi_\bx& m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+150 : _m(m)\n+151 , _i(i)\n+152 {}\n+153\n+154#endif\n+155\n+156 private:\n+157\n+158 _\bM_\ba_\bt_\br_\bi_\bx& _m;\n+_\b1_\b5_\b9 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _i;\n+160\n+161 };\n+162\n+164\n+_\b1_\b7_\b0 _\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br(_\bM_\ba_\bt_\br_\bi_\bx& m)\n+171 : _m(m)\n+172 {\n+173 if (m.buildMode() != Matrix::implicit)\n+174 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only create an ImplicitBuilder for a\n+matrix in implicit build mode\");\n+175 if (m.buildStage() != Matrix::building)\n+176 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only create an ImplicitBuilder for a\n+matrix with set size that has not been compressed() yet\");\n+177 }\n+178\n+180\n+_\b1_\b9_\b4 _\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br(_\bM_\ba_\bt_\br_\bi_\bx& m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be cols, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+avg_cols_per_row, double overflow_fraction)\n+195 : _m(m)\n+196 {\n+197 if (m.buildStage() != Matrix::notAllocated)\n+198 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only set up a matrix for this\n+ImplicitBuilder if it has no memory allocated yet\");\n+199 m.setBuildMode(Matrix::implicit);\n+200 m.setImplicitBuildModeParameters(avg_cols_per_row,overflow_fraction);\n+201 m.setSize(rows,cols);\n+202 }\n+203\n+_\b2_\b0_\b5 _\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+206 {\n+207 return _\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt(_m,i);\n+208 }\n+209\n+_\b2_\b1_\b1 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN() const\n+212 {\n+213 return _m.N();\n+214 }\n+215\n+_\b2_\b1_\b7 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bM() const\n+218 {\n+219 return _m.M();\n+220 }\n+221\n+222 private:\n+223\n+224 _\bM_\ba_\bt_\br_\bi_\bx& _m;\n+225\n+226 };\n+227\n+464 template >\n+_\b4_\b6_\b5 class _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+466 {\n+467 friend struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx>;\n+468 public:\n+_\b4_\b6_\b9 enum _\bB_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be {\n+_\b4_\b7_\b1 _\bn_\bo_\bt_\bb_\bu_\bi_\bl_\bt=0,\n+_\b4_\b7_\b3 _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd=0,\n+_\b4_\b7_\b5 _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg=1,\n+_\b4_\b8_\b0 _\br_\bo_\bw_\bS_\bi_\bz_\be_\bs_\bB_\bu_\bi_\bl_\bt=2,\n+482 _\bb_\bu_\bi_\bl_\bt=3\n+_\b4_\b8_\b3 };\n+484\n+485 //===== type definitions and constants\n+486\n+_\b4_\b8_\b8 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n+489\n+_\b4_\b9_\b1 typedef B _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+492\n+_\b4_\b9_\b4 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n+495\n+_\b4_\b9_\b7 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+498\n+_\b5_\b0_\b0 typedef Imp::CompressedBlockVectorWindow _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+501\n+_\b5_\b0_\b3 typedef ::Dune::CompressionStatistics _\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs;\n+504\n+_\b5_\b0_\b6 enum _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be {\n+_\b5_\b1_\b7 _\br_\bo_\bw_\b__\bw_\bi_\bs_\be,\n+_\b5_\b2_\b6 _\br_\ba_\bn_\bd_\bo_\bm,\n+_\b5_\b3_\b5 _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt,\n+539 _\bu_\bn_\bk_\bn_\bo_\bw_\bn\n+_\b5_\b4_\b0 };\n+541\n+542 //===== random access interface to rows of the matrix\n+543\n+_\b5_\b4_\b5 _\br_\bo_\bw_\b__\bt_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+546 {\n+547#ifdef DUNE_ISTL_WITH_CHECKING\n+548 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt && _\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+549 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You cannot use operator[] in implicit build\n+mode before calling compress()\");\n+550 if (_\br==0) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row not initialized yet\");\n+551 if (i>=_\bn) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+552#endif\n+553 return _\br[i];\n+554 }\n+555\n+_\b5_\b5_\b7 const _\br_\bo_\bw_\b__\bt_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+558 {\n+559#ifdef DUNE_ISTL_WITH_CHECKING\n+560 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt && _\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+561 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You cannot use operator[] in implicit build\n+mode before calling compress()\");\n+562 if (_\bb_\bu_\bi_\bl_\bt!=_\br_\be_\ba_\bd_\by) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row not initialized yet\");\n+563 if (i>=_\bn) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+564#endif\n+565 return _\br[i];\n+566 }\n+567\n+568\n+569 //===== iterator interface to rows of the matrix\n+570\n+572 template\n+_\b5_\b7_\b3 class _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+574 : public RandomAccessIteratorFacade, T>\n+575 {\n+576\n+577 public:\n+_\b5_\b7_\b9 typedef typename std::remove_const::type _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be;\n+580\n+581 friend class RandomAccessIteratorFacade<_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br,\n+const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be>;\n+582 friend class RandomAccessIteratorFacade<_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br<_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be>,\n+_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be>;\n+583 friend class _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+584 friend class _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br<_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be>;\n+585\n+_\b5_\b8_\b7 _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br (_\br_\bo_\bw_\b__\bt_\by_\bp_\be* _p, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _i)\n+588 : p(_p), i(_i)\n+589 {}\n+590\n+_\b5_\b9_\b2 _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ()\n+593 : p(0), i(0)\n+594 {}\n+595\n+_\b5_\b9_\b6 _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b>& it)\n+597 : p(it.p), i(it.i)\n+598 {}\n+599\n+600\n+_\b6_\b0_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bi_\bn_\bd_\be_\bx () const\n+603 {\n+604 return i;\n+605 }\n+606\n+_\b6_\b0_\b7 std::ptrdiff_t _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b>& other) const\n+608 {\n+609 assert(other.p==p);\n+610 return (other.i-i);\n+611 }\n+612\n+_\b6_\b1_\b3 std::ptrdiff_t _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b>& other)\n+const\n+614 {\n+615 assert(other.p==p);\n+616 return (other.i-i);\n+617 }\n+618\n+_\b6_\b2_\b0 bool _\be_\bq_\bu_\ba_\bl_\bs (const _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b>& other) const\n+621 {\n+622 assert(other.p==p);\n+623 return i==other.i;\n+624 }\n+625\n+_\b6_\b2_\b7 bool _\be_\bq_\bu_\ba_\bl_\bs (const _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b>& other) const\n+628 {\n+629 assert(other.p==p);\n+630 return i==other.i;\n+631 }\n+632\n+633 private:\n+635 void increment()\n+636 {\n+637 ++i;\n+638 }\n+639\n+641 void decrement()\n+642 {\n+643 --i;\n+644 }\n+645\n+646 void advance(std::ptrdiff_t diff)\n+647 {\n+648 i+=diff;\n+649 }\n+650\n+651 T& elementAt(std::ptrdiff_t diff) const\n+652 {\n+653 return p[i+diff];\n+654 }\n+655\n+657 _\br_\bo_\bw_\b__\bt_\by_\bp_\be& dereference () const\n+658 {\n+659 return p[i];\n+660 }\n+661\n+662 _\br_\bo_\bw_\b__\bt_\by_\bp_\be* p;\n+663 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i;\n+664 };\n+665\n+_\b6_\b6_\b7 typedef _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b> _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b6_\b6_\b8 typedef _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b> _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+669\n+_\b6_\b7_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n+672 {\n+673 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,0);\n+674 }\n+675\n+_\b6_\b7_\b7 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n+678 {\n+679 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,_\bn);\n+680 }\n+681\n+_\b6_\b8_\b4 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n+685 {\n+686 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,_\bn-1);\n+687 }\n+688\n+_\b6_\b9_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n+692 {\n+693 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,-1);\n+694 }\n+695\n+_\b6_\b9_\b7 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+698\n+_\b7_\b0_\b0 typedef typename row_type::Iterator _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+701\n+_\b7_\b0_\b3 typedef _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b> _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b7_\b0_\b4 typedef _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b> _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+705\n+706\n+_\b7_\b0_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n+709 {\n+710 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,0);\n+711 }\n+712\n+_\b7_\b1_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n+715 {\n+716 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,_\bn);\n+717 }\n+718\n+_\b7_\b2_\b1 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd() const\n+722 {\n+723 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,_\bn-1);\n+724 }\n+725\n+_\b7_\b2_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n+729 {\n+730 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,-1);\n+731 }\n+732\n+_\b7_\b3_\b4 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+735\n+_\b7_\b3_\b7 typedef typename row_type::ConstIterator _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+738\n+739 //===== constructors & resizers\n+740\n+741 // we use a negative compressionBufferSize to indicate that the implicit\n+742 // mode parameters have not been set yet\n+743\n+_\b7_\b4_\b5 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx ()\n+746 : _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be(_\bu_\bn_\bk_\bn_\bo_\bw_\bn), _\br_\be_\ba_\bd_\by(_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd), _\bn(0), _\bm(0), _\bn_\bn_\bz_\b_(0),\n+747 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_(0), _\br(0), _\ba(0),\n+748 _\ba_\bv_\bg(0), _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_(-1.0)\n+749 {}\n+750\n+_\b7_\b5_\b2 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _nnz, _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be bm)\n+753 : _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be(bm), _\br_\be_\ba_\bd_\by(_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd), _\bn(0), _\bm(0), _\bn_\bn_\bz_\b_(0),\n+754 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_(0), _\br(0), _\ba(0),\n+755 _\ba_\bv_\bg(0), _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_(-1.0)\n+756 {\n+757 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_n, _m, _nnz,true,false);\n+758 }\n+759\n+_\b7_\b6_\b1 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _m, _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be bm)\n+762 : _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be(bm), _\br_\be_\ba_\bd_\by(_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd), _\bn(0), _\bm(0), _\bn_\bn_\bz_\b_(0),\n+763 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_(0), _\br(0), _\ba(0),\n+764 _\ba_\bv_\bg(0), _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_(-1.0)\n+765 {\n+766 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_n, _m,0,true,false);\n+767 }\n+768\n+770\n+_\b7_\b8_\b1 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _avg, double\n+compressionBufferSize, _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be bm)\n+782 : _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be(bm), _\br_\be_\ba_\bd_\by(_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd), _\bn(0), _\bm(0), _\bn_\bn_\bz_\b_(0),\n+783 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_(0), _\br(0), _\ba(0),\n+784 _\ba_\bv_\bg(_avg), _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_(compressionBufferSize)\n+785 {\n+786 if (bm != _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt)\n+787 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"Only call this constructor when using the\n+implicit build mode\");\n+788 // Prevent user from setting a negative compression buffer size:\n+789 // 1) It doesn't make sense\n+790 // 2) We use a negative value to indicate that the parameters\n+791 // have not been set yet\n+792 if (_\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_ < 0.0)\n+793 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You cannot set a negative overflow fraction\");\n+794 _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\b__\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_n,_m);\n+795 }\n+796\n+_\b8_\b0_\b2 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& Mat)\n+803 : _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be(Mat._\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be), _\br_\be_\ba_\bd_\by(_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd), _\bn(0), _\bm(0), _\bn_\bn_\bz_\b_(0),\n+804 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_(0), _\br(0), _\ba(0),\n+805 _\ba_\bv_\bg(Mat._\ba_\bv_\bg), _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_(Mat._\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_)\n+806 {\n+807 if (!(Mat._\br_\be_\ba_\bd_\by == _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd || Mat._\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bt))\n+808 DUNE_THROW(InvalidStateException,\"BCRSMatrix can only be copy-constructed\n+when source matrix is completely empty (size not set) or fully built)\");\n+809\n+810 // deep copy in global array\n+811 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _nnz = Mat._\bn_\bo_\bn_\bz_\be_\br_\bo_\be_\bs();\n+812\n+813 _\bj_\b_ = Mat._\bj_\b_; // enable column index sharing, release array in case of row-\n+wise allocation\n+814 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(Mat._\bn, Mat._\bm, _nnz, true, true);\n+815\n+816 // build window structure\n+817 _\bc_\bo_\bp_\by_\bW_\bi_\bn_\bd_\bo_\bw_\bS_\bt_\br_\bu_\bc_\bt_\bu_\br_\be(Mat);\n+818 }\n+819\n+_\b8_\b2_\b1 _\b~_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx ()\n+822 {\n+823 _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be();\n+824 }\n+825\n+_\b8_\b3_\b0 void _\bs_\be_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be(_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be bm)\n+831 {\n+832 if (_\br_\be_\ba_\bd_\by == _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n+833 {\n+834 _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be = bm;\n+835 return;\n+836 }\n+837 if (_\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg && (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\bu_\bn_\bk_\bn_\bo_\bw_\bn || _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\br_\ba_\bn_\bd_\bo_\bm ||\n+_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\br_\bo_\bw_\b__\bw_\bi_\bs_\be) && (bm == _\br_\bo_\bw_\b__\bw_\bi_\bs_\be || bm == _\br_\ba_\bn_\bd_\bo_\bm))\n+838 _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be = bm;\n+839 else\n+840 DUNE_THROW(InvalidStateException, \"Matrix structure cannot be changed at\n+this stage anymore (ready == \"<<_\br_\be_\ba_\bd_\by<<\").\");\n+841 }\n+842\n+_\b8_\b5_\b8 void _\bs_\be_\bt_\bS_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nnz=0)\n+859 {\n+860 // deallocate already setup memory\n+861 _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be();\n+862\n+863 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt)\n+864 {\n+865 if (nnz>0)\n+866 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"number of non-zeroes may not be set in\n+implicit mode, use setImplicitBuildModeParameters() instead\");\n+867\n+868 // implicit allocates differently\n+869 _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\b__\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(rows,columns);\n+870 }\n+871 else\n+872 {\n+873 // allocate matrix memory\n+874 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(rows, columns, nnz, true, false);\n+875 }\n+876 }\n+877\n+_\b8_\b8_\b6 void _\bs_\be_\bt_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _avg, double\n+compressionBufferSize)\n+887 {\n+888 // Prevent user from setting a negative compression buffer size:\n+889 // 1) It doesn't make sense\n+890 // 2) We use a negative value to indicate that the parameters\n+891 // have not been set yet\n+892 if (compressionBufferSize < 0.0)\n+893 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You cannot set a negative compressionBufferSize\n+value\");\n+894\n+895 // make sure the parameters aren't changed after memory has been allocated\n+896 if (_\br_\be_\ba_\bd_\by != _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n+897 DUNE_THROW(InvalidStateException,\"You cannot modify build mode parameters\n+at this stage anymore\");\n+898 _\ba_\bv_\bg = _avg;\n+899 _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_ = compressionBufferSize;\n+900 }\n+901\n+_\b9_\b0_\b8 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& Mat)\n+909 {\n+910 // return immediately when self-assignment\n+911 if (&Mat==this) return *this;\n+912\n+913 if (!((_\br_\be_\ba_\bd_\by == _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd || _\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bt) && (Mat._\br_\be_\ba_\bd_\by ==\n+_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd || Mat._\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bt)))\n+914 DUNE_THROW(InvalidStateException,\"BCRSMatrix can only be copied when both\n+target and source are empty or fully built)\");\n+915\n+916 // make it simple: ALWAYS throw away memory for a and j_\n+917 // and deallocate rows only if n != Mat.n\n+918 _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bn!=Mat._\bn);\n+919\n+920 // reallocate the rows if required\n+921 if (_\bn>0 && _\bn!=Mat._\bn) {\n+922 // free rows\n+923 for(_\br_\bo_\bw_\b__\bt_\by_\bp_\be *riter=_\br+(_\bn-1), *rend=_\br-1; riter!=rend; --riter)\n+924 std::allocator_traits::destroy(_\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_,\n+riter);\n+925 _\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.deallocate(_\br,_\bn);\n+926 }\n+927\n+928 _\bn_\bn_\bz_\b_ = Mat._\bn_\bo_\bn_\bz_\be_\br_\bo_\be_\bs();\n+929\n+930 // allocate a, share j_\n+931 _\bj_\b_ = Mat._\bj_\b_;\n+932 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(Mat._\bn, Mat._\bm, _\bn_\bn_\bz_\b_, _\bn!=Mat._\bn, true);\n+933\n+934 // build window structure\n+935 _\bc_\bo_\bp_\by_\bW_\bi_\bn_\bd_\bo_\bw_\bS_\bt_\br_\bu_\bc_\bt_\bu_\br_\be(Mat);\n+936 return *this;\n+937 }\n+938\n+_\b9_\b4_\b0 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n+941 {\n+942\n+943 if (!(_\br_\be_\ba_\bd_\by == _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd || _\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bt))\n+944 DUNE_THROW(InvalidStateException,\"Scalar assignment only works on fully\n+built BCRSMatrix)\");\n+945\n+946 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++) _\br[i] = k;\n+947 return *this;\n+948 }\n+949\n+950 //===== row-wise creation interface\n+951\n+_\b9_\b5_\b3 class _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+954 {\n+955 public:\n+_\b9_\b5_\b7 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br (_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _Mat, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _i)\n+958 : Mat(_Mat), i(_i), nnz(0), current_row(nullptr, Mat._\bj_\b_._\bg_\be_\bt(), 0)\n+959 {\n+960 if (Mat._\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\bu_\bn_\bk_\bn_\bo_\bw_\bn && Mat._\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n+961 {\n+962 Mat._\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be = _\br_\bo_\bw_\b__\bw_\bi_\bs_\be;\n+963 }\n+964 if (i==0 && Mat._\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n+965 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"creation only allowed for uninitialized\n+matrix\");\n+966 if(Mat._\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\br_\bo_\bw_\b__\bw_\bi_\bs_\be)\n+967 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"creation only allowed if row wise allocation\n+was requested in the constructor\");\n+968 if(i==0 && _Mat._\bN()==0)\n+969 // empty Matrix is always built.\n+970 Mat._\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bt;\n+971 }\n+972\n+_\b9_\b7_\b4 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+975 {\n+976 // this should only be called if matrix is in creation\n+977 if (Mat._\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n+978 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix already built up\");\n+979\n+980 // row i is defined through the pattern\n+981 // get memory for the row and initialize the j_ array\n+982 // this depends on the allocation mode\n+983\n+984 // compute size of the row\n+985 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s = pattern.size();\n+986\n+987 if(s>0) {\n+988 // update number of nonzeroes including this row\n+989 nnz += s;\n+990\n+991 // alloc memory / set window\n+992 if (Mat._\bn_\bn_\bz_\b_ > 0)\n+993 {\n+994 // memory is allocated in one long array\n+995\n+996 // check if that memory is sufficient\n+997 if (nnz > Mat._\bn_\bn_\bz_\b_)\n+998 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"allocated nnz too small\");\n+999\n+1000 // set row i\n+1001 Mat._\br[i].set(s,nullptr,current_row.getindexptr());\n+1002 current_row.setindexptr(current_row.getindexptr()+s);\n+1003 }else{\n+1004 // memory is allocated individually per row\n+1005 // allocate and set row i\n+1006 B* b = Mat._\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.allocate(s);\n+1007 // use placement new to call constructor that allocates\n+1008 // additional memory.\n+1009 new (b) B[s];\n+1010 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* j = Mat._\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.allocate(s);\n+1011 Mat._\br[i].set(s,b,j);\n+1012 }\n+1013 }else\n+1014 // setup empty row\n+1015 Mat._\br[i].set(0,nullptr,nullptr);\n+1016\n+1017 // initialize the j array for row i from pattern\n+1018 std::copy(pattern.cbegin(), pattern.cend(), Mat._\br[i].getindexptr());\n+1019\n+1020 // now go to next row\n+1021 i++;\n+1022 pattern.clear();\n+1023\n+1024 // check if this was last row\n+1025 if (i==Mat._\bn)\n+1026 {\n+1027 Mat._\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bt;\n+1028 if(Mat._\bn_\bn_\bz_\b_ > 0)\n+1029 {\n+1030 // Set nnz to the exact number of nonzero blocks inserted\n+1031 // as some methods rely on it\n+1032 Mat._\bn_\bn_\bz_\b_ = nnz;\n+1033 // allocate data array\n+1034 Mat._\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bD_\ba_\bt_\ba();\n+1035 Mat._\bs_\be_\bt_\bD_\ba_\bt_\ba_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs();\n+1036 }\n+1037 }\n+1038 // done\n+1039 return *this;\n+1040 }\n+1041\n+_\b1_\b0_\b4_\b3 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+1044 {\n+1045 return (i!=it.i) || (&Mat!=&it.Mat);\n+1046 }\n+1047\n+_\b1_\b0_\b4_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+1050 {\n+1051 return (i==it.i) && (&Mat==&it.Mat);\n+1052 }\n+1053\n+_\b1_\b0_\b5_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bi_\bn_\bd_\be_\bx () const\n+1056 {\n+1057 return i;\n+1058 }\n+1059\n+_\b1_\b0_\b6_\b1 void _\bi_\bn_\bs_\be_\br_\bt (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n+1062 {\n+1063 pattern.insert(j);\n+1064 }\n+1065\n+_\b1_\b0_\b6_\b7 bool _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\bs (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n+1068 {\n+1069 return pattern.find(j) != pattern.end();\n+1070 }\n+_\b1_\b0_\b7_\b6 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const\n+1077 {\n+1078 return pattern.size();\n+1079 }\n+1080\n+1081 private:\n+1082 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& Mat; // the matrix we are defining\n+1083 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i; // current row to be defined\n+1084 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nnz; // count total number of nonzeros\n+1085 typedef std::set > PatternType;\n+1086 PatternType pattern; // used to compile entries in a row\n+1087 _\br_\bo_\bw_\b__\bt_\by_\bp_\be current_row; // row pointing to the current row to setup\n+1088 };\n+1089\n+_\b1_\b0_\b9_\b1 friend class _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+1092\n+_\b1_\b0_\b9_\b4 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn ()\n+1095 {\n+1096 return _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,0);\n+1097 }\n+1098\n+_\b1_\b1_\b0_\b0 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd ()\n+1101 {\n+1102 return _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\bn);\n+1103 }\n+1104\n+1105\n+1106 //===== random creation interface\n+1107\n+_\b1_\b1_\b1_\b4 void _\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s)\n+1115 {\n+1116 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\br_\ba_\bn_\bd_\bo_\bm)\n+1117 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"requires random build mode\");\n+1118 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n+1119 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix row sizes already built up\");\n+1120\n+1121 _\br[i].setsize(s);\n+1122 }\n+1123\n+_\b1_\b1_\b2_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bg_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+1126 {\n+1127#ifdef DUNE_ISTL_WITH_CHECKING\n+1128 if (_\br==0) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row not initialized yet\");\n+1129 if (i>=_\bn) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1130#endif\n+1131 return _\br[i].getsize();\n+1132 }\n+1133\n+_\b1_\b1_\b3_\b5 void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s = 1)\n+1136 {\n+1137 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\br_\ba_\bn_\bd_\bo_\bm)\n+1138 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"requires random build mode\");\n+1139 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n+1140 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix row sizes already built up\");\n+1141\n+1142 _\br[i].setsize(_\br[i].getsize()+s);\n+1143 }\n+1144\n+_\b1_\b1_\b4_\b6 void _\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs ()\n+1147 {\n+1148 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\br_\ba_\bn_\bd_\bo_\bm)\n+1149 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"requires random build mode\");\n+1150 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n+1151 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix row sizes already built up\");\n+1152\n+1153 // compute total size, check positivity\n+1154 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be total=0;\n+1155 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++)\n+1156 {\n+1157 total += _\br[i].getsize();\n+1158 }\n+1159\n+1160 if(_\bn_\bn_\bz_\b_ == 0)\n+1161 // allocate/check memory\n+1162 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bn,_\bm,total,false,false);\n+1163 else if(_\bn_\bn_\bz_\b_ < total)\n+1164 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"Specified number of nonzeros (\"<<_\bn_\bn_\bz_\b_<<\") not\n+\"\n+1165 <<\"sufficient for calculated nonzeros (\"<= _\bm)\n+1200 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"column index exceeds matrix size\");\n+1201\n+1202 // get row range\n+1203 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* const first = _\br[row].getindexptr();\n+1204 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* const last = first + _\br[row].getsize();\n+1205\n+1206 // find correct insertion position for new column index\n+1207 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* pos = std::lower_bound(first,last,_\bc_\bo_\bl);\n+1208\n+1209 // check if index is already in row\n+1210 if (pos!=last && *pos == _\bc_\bo_\bl) return;\n+1211\n+1212 // find end of already inserted column indices\n+1213 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* _\be_\bn_\bd = std::lower_bound(pos,last,_\bm);\n+1214 if (_\be_\bn_\bd==last)\n+1215 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row is too small\");\n+1216\n+1217 // insert new column index at correct position\n+1218 std::copy_backward(pos,_\be_\bn_\bd,_\be_\bn_\bd+1);\n+1219 *pos = _\bc_\bo_\bl;\n+1220 }\n+1221\n+1223\n+1231 template\n+_\b1_\b2_\b3_\b2 void _\bs_\be_\bt_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bN_\bo_\bS_\bo_\br_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row, It _\bb_\be_\bg_\bi_\bn, It _\be_\bn_\bd)\n+1233 {\n+1234 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row_size = _\br[row].size();\n+1235 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* col_begin = _\br[row].getindexptr();\n+1236 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* col_end;\n+1237 // consistency check between allocated row size and number of passed\n+column indices\n+1238 if ((col_end = std::copy(_\bb_\be_\bg_\bi_\bn,_\be_\bn_\bd,_\br[row].getindexptr())) != col_begin +\n+row_size)\n+1239 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"Given size of row \" << row\n+1240 << \" (\" << row_size\n+1241 << \") does not match number of passed entries (\" << (col_end - col_begin)\n+<< \")\");\n+1242 }\n+1243\n+1244\n+1246\n+1254 template\n+_\b1_\b2_\b5_\b5 void _\bs_\be_\bt_\bI_\bn_\bd_\bi_\bc_\be_\bs(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row, It _\bb_\be_\bg_\bi_\bn, It _\be_\bn_\bd)\n+1256 {\n+1257 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row_size = _\br[row].size();\n+1258 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* col_begin = _\br[row].getindexptr();\n+1259 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* col_end;\n+1260 // consistency check between allocated row size and number of passed\n+column indices\n+1261 if ((col_end = std::copy(_\bb_\be_\bg_\bi_\bn,_\be_\bn_\bd,_\br[row].getindexptr())) != col_begin +\n+row_size)\n+1262 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"Given size of row \" << row\n+1263 << \" (\" << row_size\n+1264 << \") does not match number of passed entries (\" << (col_end - col_begin)\n+<< \")\");\n+1265 std::sort(col_begin,col_end);\n+1266 }\n+1267\n+_\b1_\b2_\b6_\b9 void _\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs ()\n+1270 {\n+1271 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\br_\ba_\bn_\bd_\bo_\bm)\n+1272 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"requires random build mode\");\n+1273 if (_\br_\be_\ba_\bd_\by==_\bb_\bu_\bi_\bl_\bt)\n+1274 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix already built up\");\n+1275 if (_\br_\be_\ba_\bd_\by==_\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n+1276 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row sizes are not built up yet\");\n+1277 if (_\br_\be_\ba_\bd_\by==_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n+1278 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix size not set and no memory allocated\n+yet\");\n+1279\n+1280 // check if there are undefined indices\n+1281 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1282 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1283 {\n+1284 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1285 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j) {\n+1286 if (j.index() >= _\bm) {\n+1287 dwarn << \"WARNING: size of row \"<< i.index()<<\" is \"<= _\bn)\n+1330 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row index exceeds matrix size\");\n+1331 if (_\bc_\bo_\bl >= _\bm)\n+1332 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"column index exceeds matrix size\");\n+1333#endif\n+1334\n+1335 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* _\bb_\be_\bg_\bi_\bn = _\br[row].getindexptr();\n+1336 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* _\be_\bn_\bd = _\bb_\be_\bg_\bi_\bn + _\br[row].getsize();\n+1337\n+1338 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* pos = std::find(_\bb_\be_\bg_\bi_\bn, _\be_\bn_\bd, _\bc_\bo_\bl);\n+1339\n+1340 //treat the case that there was a match in the array\n+1341 if (pos != _\be_\bn_\bd)\n+1342 if (*pos == _\bc_\bo_\bl)\n+1343 {\n+1344 std::ptrdiff_t offset = pos - _\br[row].getindexptr();\n+1345 B* aptr = _\br[row].getptr() + offset;\n+1346\n+1347 return *aptr;\n+1348 }\n+1349\n+1350 //determine whether overflow has to be taken into account or not\n+1351 if (_\br[row].getsize() == _\ba_\bv_\bg)\n+1352 return _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw[std::make_pair(row,_\bc_\bo_\bl)];\n+1353 else\n+1354 {\n+1355 //modify index array\n+1356 *_\be_\bn_\bd = _\bc_\bo_\bl;\n+1357\n+1358 //do simultaneous operations on data array a\n+1359 std::ptrdiff_t offset = _\be_\bn_\bd - _\br[row].getindexptr();\n+1360 B* apos = _\br[row].getptr() + offset;\n+1361\n+1362 //increase rowsize\n+1363 _\br[row].setsize(_\br[row].getsize()+1);\n+1364\n+1365 //return reference to the newly created entry\n+1366 return *apos;\n+1367 }\n+1368 }\n+1369\n+1371\n+_\b1_\b3_\b8_\b1 _\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs()\n+1382 {\n+1383 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt)\n+1384 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"requires implicit build mode\");\n+1385 if (_\br_\be_\ba_\bd_\by==_\bb_\bu_\bi_\bl_\bt)\n+1386 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix already built up, no more need for\n+compression\");\n+1387 if (_\br_\be_\ba_\bd_\by==_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n+1388 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix size not set and no memory allocated\n+yet\");\n+1389 if (_\br_\be_\ba_\bd_\by!=_\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n+1390 DUNE_THROW(InvalidStateException,\"You may only call compress() at the end\n+of the 'building' stage\");\n+1391\n+1392 //calculate statistics\n+1393 _\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs stats;\n+1394 stats._\bo_\bv_\be_\br_\bf_\bl_\bo_\bw_\b__\bt_\bo_\bt_\ba_\bl = _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw.size();\n+1395 stats._\bm_\ba_\bx_\bi_\bm_\bu_\bm = 0;\n+1396\n+1397 //get insertion iterators pointing to one before start (for later use of\n+++it)\n+1398 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* jiit = _\bj_\b_.get();\n+1399 B* aiit = _\ba;\n+1400\n+1401 //get iterator to the smallest overflow element\n+1402 typename OverflowType::iterator oit = _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw.begin();\n+1403\n+1404 //store a copy of index pointers on which to perform sorting\n+1405 std::vector perm;\n+1406\n+1407 //iterate over all rows and copy elements into their position in the\n+compressed array\n+1408 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++)\n+1409 {\n+1410 //get old pointers into a and j and size without overflow changes\n+1411 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* _\bb_\be_\bg_\bi_\bn = _\br[i].getindexptr();\n+1412 //B* apos = r[i].getptr();\n+1413 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size = _\br[i].getsize();\n+1414\n+1415 perm.resize(size);\n+1416\n+1417 typename std::vector::iterator it = perm.begin();\n+1418 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* iit = _\bb_\be_\bg_\bi_\bn; iit < _\bb_\be_\bg_\bi_\bn + size; ++iit, ++it)\n+1419 *it = iit;\n+1420\n+1421 //sort permutation array\n+1422 std::sort(perm.begin(),perm.end(),_\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be_\b<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b>());\n+1423\n+1424 //change row window pointer to their new positions\n+1425 _\br[i].setindexptr(jiit);\n+1426 _\br[i].setptr(aiit);\n+1427\n+1428 for (it = perm.begin(); it != perm.end(); ++it)\n+1429 {\n+1430 //check whether there are elements in the overflow area which take\n+precedence\n+1431 while ((oit!=_\bo_\bv_\be_\br_\bf_\bl_\bo_\bw.end()) && (oit->first < std::make_pair(i,**it)))\n+1432 {\n+1433 //check whether there is enough memory to write to\n+1434 if (jiit > _\bb_\be_\bg_\bi_\bn)\n+1435 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd,\n+1436 \"Allocated memory for BCRSMatrix exhausted during compress()!\"\n+1437 \"Please increase either the average number of entries per row or the\n+compressionBufferSize value.\"\n+1438 );\n+1439 //copy an element from the overflow area to the insertion position in a\n+and j\n+1440 *jiit = oit->first.second;\n+1441 ++jiit;\n+1442 *aiit = oit->second;\n+1443 ++aiit;\n+1444 ++oit;\n+1445 _\br[i].setsize(_\br[i].getsize()+1);\n+1446 }\n+1447\n+1448 //check whether there is enough memory to write to\n+1449 if (jiit > _\bb_\be_\bg_\bi_\bn)\n+1450 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd,\n+1451 \"Allocated memory for BCRSMatrix exhausted during compress()!\"\n+1452 \"Please increase either the average number of entries per row or the\n+compressionBufferSize value.\"\n+1453 );\n+1454\n+1455 //copy element from array\n+1456 *jiit = **it;\n+1457 ++jiit;\n+1458 B* apos = *it - _\bj_\b_.get() + _\ba;\n+1459 *aiit = *apos;\n+1460 ++aiit;\n+1461 }\n+1462\n+1463 //copy remaining elements from the overflow area\n+1464 while ((oit!=_\bo_\bv_\be_\br_\bf_\bl_\bo_\bw.end()) && (oit->first.first == i))\n+1465 {\n+1466 //check whether there is enough memory to write to\n+1467 if (jiit > _\bb_\be_\bg_\bi_\bn)\n+1468 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd,\n+1469 \"Allocated memory for BCRSMatrix exhausted during compress()!\"\n+1470 \"Please increase either the average number of entries per row or the\n+compressionBufferSize value.\"\n+1471 );\n+1472\n+1473 //copy and element from the overflow area to the insertion position in a\n+and j\n+1474 *jiit = oit->first.second;\n+1475 ++jiit;\n+1476 *aiit = oit->second;\n+1477 ++aiit;\n+1478 ++oit;\n+1479 _\br[i].setsize(_\br[i].getsize()+1);\n+1480 }\n+1481\n+1482 // update maximum row size\n+1483 if (_\br[i].getsize()>stats._\bm_\ba_\bx_\bi_\bm_\bu_\bm)\n+1484 stats._\bm_\ba_\bx_\bi_\bm_\bu_\bm = _\br[i].getsize();\n+1485 }\n+1486\n+1487 // overflow area may be cleared\n+1488 _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw.clear();\n+1489\n+1490 //determine average number of entries and memory usage\n+1491 if ( _\bn == 0)\n+1492 {\n+1493 stats._\ba_\bv_\bg = 0;\n+1494 stats._\bm_\be_\bm_\b__\br_\ba_\bt_\bi_\bo = 1;\n+1495 }\n+1496 else\n+1497 {\n+1498 std::ptrdiff_t diff = (_\br[_\bn-1].getindexptr() + _\br[_\bn-1].getsize() - _\bj_\b_.get\n+());\n+1499 _\bn_\bn_\bz_\b_ = diff;\n+1500 stats._\ba_\bv_\bg = (double) (_\bn_\bn_\bz_\b_) / (double) _\bn;\n+1501 stats._\bm_\be_\bm_\b__\br_\ba_\bt_\bi_\bo = (double) (_\bn_\bn_\bz_\b_) / (double) _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_;\n+1502 }\n+1503\n+1504 //matrix is now built\n+1505 _\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bt;\n+1506\n+1507 return stats;\n+1508 }\n+1509\n+1510 //===== vector space arithmetic\n+1511\n+_\b1_\b5_\b1_\b3 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n+1514 {\n+1515#ifdef DUNE_ISTL_WITH_CHECKING\n+1516 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1517 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1518#endif\n+1519\n+1520 if (_\bn_\bn_\bz_\b_ > 0)\n+1521 {\n+1522 // process 1D array\n+1523 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn_\bn_\bz_\b_; i++)\n+1524 _\ba[i] *= k;\n+1525 }\n+1526 else\n+1527 {\n+1528 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1529 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1530 {\n+1531 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1532 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1533 (*j) *= k;\n+1534 }\n+1535 }\n+1536\n+1537 return *this;\n+1538 }\n+1539\n+_\b1_\b5_\b4_\b1 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n+1542 {\n+1543#ifdef DUNE_ISTL_WITH_CHECKING\n+1544 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1545 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1546#endif\n+1547\n+1548 if (_\bn_\bn_\bz_\b_ > 0)\n+1549 {\n+1550 // process 1D array\n+1551 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn_\bn_\bz_\b_; i++)\n+1552 _\ba[i] /= k;\n+1553 }\n+1554 else\n+1555 {\n+1556 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1557 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1558 {\n+1559 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1560 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1561 (*j) /= k;\n+1562 }\n+1563 }\n+1564\n+1565 return *this;\n+1566 }\n+1567\n+1568\n+_\b1_\b5_\b7_\b4 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& b)\n+1575 {\n+1576#ifdef DUNE_ISTL_WITH_CHECKING\n+1577 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt || b._\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1578 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1579 if(_\bN()!=b._\bN() || _\bM() != b._\bM())\n+1580 DUNE_THROW(RangeError, \"Matrix sizes do not match!\");\n+1581#endif\n+1582 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1583 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=b._\bb_\be_\bg_\bi_\bn();\n+1584 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i, ++j) {\n+1585 i->operator+=(*j);\n+1586 }\n+1587\n+1588 return *this;\n+1589 }\n+1590\n+_\b1_\b5_\b9_\b6 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& b)\n+1597 {\n+1598#ifdef DUNE_ISTL_WITH_CHECKING\n+1599 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt || b._\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1600 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1601 if(_\bN()!=b._\bN() || _\bM() != b._\bM())\n+1602 DUNE_THROW(RangeError, \"Matrix sizes do not match!\");\n+1603#endif\n+1604 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1605 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=b._\bb_\be_\bg_\bi_\bn();\n+1606 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i, ++j) {\n+1607 i->operator-=(*j);\n+1608 }\n+1609\n+1610 return *this;\n+1611 }\n+1612\n+_\b1_\b6_\b2_\b1 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\ba_\bx_\bp_\by(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& b)\n+1622 {\n+1623#ifdef DUNE_ISTL_WITH_CHECKING\n+1624 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt || b._\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1625 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1626 if(_\bN()!=b._\bN() || _\bM() != b._\bM())\n+1627 DUNE_THROW(RangeError, \"Matrix sizes do not match!\");\n+1628#endif\n+1629 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1630 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=b._\bb_\be_\bg_\bi_\bn();\n+1631 for(_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i, ++j)\n+1632 i->axpy(alpha, *j);\n+1633\n+1634 return *this;\n+1635 }\n+1636\n+1637 //===== linear maps\n+1638\n+1640 template\n+_\b1_\b6_\b4_\b1 void _\bm_\bv (const X& x, Y& y) const\n+1642 {\n+1643#ifdef DUNE_ISTL_WITH_CHECKING\n+1644 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1645 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1646 if (x.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\n+1647 \"Size mismatch: M: \" << _\bN() << \"x\" << _\bM() << \" x: \" << x.N());\n+1648 if (y.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\n+1649 \"Size mismatch: M: \" << _\bN() << \"x\" << _\bM() << \" y: \" << y.N());\n+1650#endif\n+1651 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1652 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1653 {\n+1654 y[i.index()]=0;\n+1655 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1656 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1657 {\n+1658 auto&& xj = Impl::asVector(x[j.index()]);\n+1659 auto&& yi = Impl::asVector(y[i.index()]);\n+1660 Impl::asMatrix(*j).umv(xj, yi);\n+1661 }\n+1662 }\n+1663 }\n+1664\n+1666 template\n+_\b1_\b6_\b6_\b7 void _\bu_\bm_\bv (const X& x, Y& y) const\n+1668 {\n+1669#ifdef DUNE_ISTL_WITH_CHECKING\n+1670 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1671 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1672 if (x.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1673 if (y.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1674#endif\n+1675 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1676 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1677 {\n+1678 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1679 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1680 {\n+1681 auto&& xj = Impl::asVector(x[j.index()]);\n+1682 auto&& yi = Impl::asVector(y[i.index()]);\n+1683 Impl::asMatrix(*j).umv(xj,yi);\n+1684 }\n+1685 }\n+1686 }\n+1687\n+1689 template\n+_\b1_\b6_\b9_\b0 void _\bm_\bm_\bv (const X& x, Y& y) const\n+1691 {\n+1692#ifdef DUNE_ISTL_WITH_CHECKING\n+1693 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1694 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1695 if (x.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1696 if (y.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1697#endif\n+1698 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1699 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1700 {\n+1701 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1702 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1703 {\n+1704 auto&& xj = Impl::asVector(x[j.index()]);\n+1705 auto&& yi = Impl::asVector(y[i.index()]);\n+1706 Impl::asMatrix(*j).mmv(xj,yi);\n+1707 }\n+1708 }\n+1709 }\n+1710\n+1712 template\n+_\b1_\b7_\b1_\b3 void _\bu_\bs_\bm_\bv (F&& alpha, const X& x, Y& y) const\n+1714 {\n+1715#ifdef DUNE_ISTL_WITH_CHECKING\n+1716 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1717 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1718 if (x.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1719 if (y.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1720#endif\n+1721 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1722 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1723 {\n+1724 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1725 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1726 {\n+1727 auto&& xj = Impl::asVector(x[j.index()]);\n+1728 auto&& yi = Impl::asVector(y[i.index()]);\n+1729 Impl::asMatrix(*j).usmv(alpha,xj,yi);\n+1730 }\n+1731 }\n+1732 }\n+1733\n+1735 template\n+_\b1_\b7_\b3_\b6 void _\bm_\bt_\bv (const X& x, Y& y) const\n+1737 {\n+1738#ifdef DUNE_ISTL_WITH_CHECKING\n+1739 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1740 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1741 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1742 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1743#endif\n+1744 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b1_\b7_\b5_\b1 void _\bu_\bm_\bt_\bv (const X& x, Y& y) const\n+1752 {\n+1753#ifdef DUNE_ISTL_WITH_CHECKING\n+1754 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1755 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1756 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1757 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1758#endif\n+1759 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1760 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1761 {\n+1762 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1763 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1764 {\n+1765 auto&& xi = Impl::asVector(x[i.index()]);\n+1766 auto&& yj = Impl::asVector(y[j.index()]);\n+1767 Impl::asMatrix(*j).umtv(xi,yj);\n+1768 }\n+1769 }\n+1770 }\n+1771\n+1773 template\n+_\b1_\b7_\b7_\b4 void _\bm_\bm_\bt_\bv (const X& x, Y& y) const\n+1775 {\n+1776#ifdef DUNE_ISTL_WITH_CHECKING\n+1777 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1778 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1779#endif\n+1780 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1781 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1782 {\n+1783 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1784 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1785 {\n+1786 auto&& xi = Impl::asVector(x[i.index()]);\n+1787 auto&& yj = Impl::asVector(y[j.index()]);\n+1788 Impl::asMatrix(*j).mmtv(xi,yj);\n+1789 }\n+1790 }\n+1791 }\n+1792\n+1794 template\n+_\b1_\b7_\b9_\b5 void _\bu_\bs_\bm_\bt_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const\n+1796 {\n+1797#ifdef DUNE_ISTL_WITH_CHECKING\n+1798 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1799 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1800 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1801 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1802#endif\n+1803 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1804 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1805 {\n+1806 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1807 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1808 {\n+1809 auto&& xi = Impl::asVector(x[i.index()]);\n+1810 auto&& yj = Impl::asVector(y[j.index()]);\n+1811 Impl::asMatrix(*j).usmtv(alpha,xi,yj);\n+1812 }\n+1813 }\n+1814 }\n+1815\n+1817 template\n+_\b1_\b8_\b1_\b8 void _\bu_\bm_\bh_\bv (const X& x, Y& y) const\n+1819 {\n+1820#ifdef DUNE_ISTL_WITH_CHECKING\n+1821 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1822 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1823 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1824 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1825#endif\n+1826 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1827 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1828 {\n+1829 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1830 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1831 {\n+1832 auto&& xi = Impl::asVector(x[i.index()]);\n+1833 auto&& yj = Impl::asVector(y[j.index()]);\n+1834 Impl::asMatrix(*j).umhv(xi,yj);\n+1835 }\n+1836 }\n+1837 }\n+1838\n+1840 template\n+_\b1_\b8_\b4_\b1 void _\bm_\bm_\bh_\bv (const X& x, Y& y) const\n+1842 {\n+1843#ifdef DUNE_ISTL_WITH_CHECKING\n+1844 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1845 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1846 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1847 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1848#endif\n+1849 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1850 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1851 {\n+1852 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1853 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1854 {\n+1855 auto&& xi = Impl::asVector(x[i.index()]);\n+1856 auto&& yj = Impl::asVector(y[j.index()]);\n+1857 Impl::asMatrix(*j).mmhv(xi,yj);\n+1858 }\n+1859 }\n+1860 }\n+1861\n+1863 template\n+_\b1_\b8_\b6_\b4 void _\bu_\bs_\bm_\bh_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const\n+1865 {\n+1866#ifdef DUNE_ISTL_WITH_CHECKING\n+1867 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1868 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1869 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1870 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n+1871#endif\n+1872 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n+1873 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n+1874 {\n+1875 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n+1876 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n+1877 {\n+1878 auto&& xi = Impl::asVector(x[i.index()]);\n+1879 auto&& yj = Impl::asVector(y[j.index()]);\n+1880 Impl::asMatrix(*j).usmhv(alpha,xi,yj);\n+1881 }\n+1882 }\n+1883 }\n+1884\n+1885\n+1886 //===== norms\n+1887\n+_\b1_\b8_\b8_\b9 typename FieldTraits::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2 () const\n+1890 {\n+1891#ifdef DUNE_ISTL_WITH_CHECKING\n+1892 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1893 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1894#endif\n+1895\n+1896 typename FieldTraits::real_type sum=0;\n+1897\n+1898 for (auto&& row : (*this))\n+1899 for (auto&& _\be_\bn_\bt_\br_\by : row)\n+1900 sum += Impl::asMatrix(_\be_\bn_\bt_\br_\by).frobenius_norm2();\n+1901\n+1902 return sum;\n+1903 }\n+1904\n+_\b1_\b9_\b0_\b6 typename FieldTraits::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm () const\n+1907 {\n+1908 return sqrt(_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2());\n+1909 }\n+1910\n+1912 template ::value, int>::type = 0>\n+_\b1_\b9_\b1_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n+1915 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1916 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1917\n+1918 using real_type = typename FieldTraits::real_type;\n+1919 using std::max;\n+1920\n+1921 real_type norm = 0;\n+1922 for (auto const &x : *this) {\n+1923 real_type sum = 0;\n+1924 for (auto const &y : x)\n+1925 sum += Impl::asMatrix(y).infinity_norm();\n+1926 norm = max(sum, norm);\n+1927 }\n+1928 return norm;\n+1929 }\n+1930\n+1932 template ::value, int>::type = 0>\n+_\b1_\b9_\b3_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n+1935 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1936 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1937\n+1938 using real_type = typename FieldTraits::real_type;\n+1939 using std::max;\n+1940\n+1941 real_type norm = 0;\n+1942 for (auto const &x : *this) {\n+1943 real_type sum = 0;\n+1944 for (auto const &y : x)\n+1945 sum += Impl::asMatrix(y).infinity_norm_real();\n+1946 norm = max(sum, norm);\n+1947 }\n+1948 return norm;\n+1949 }\n+1950\n+1952 template ::value, int>::type = 0>\n+_\b1_\b9_\b5_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n+1955 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1956 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1957\n+1958 using real_type = typename FieldTraits::real_type;\n+1959 using std::max;\n+1960\n+1961 real_type norm = 0;\n+1962 real_type isNaN = 1;\n+1963 for (auto const &x : *this) {\n+1964 real_type sum = 0;\n+1965 for (auto const &y : x)\n+1966 sum += Impl::asMatrix(y).infinity_norm();\n+1967 norm = max(sum, norm);\n+1968 isNaN += sum;\n+1969 }\n+1970\n+1971 return norm * (isNaN / isNaN);\n+1972 }\n+1973\n+1975 template ::value, int>::type = 0>\n+_\b1_\b9_\b7_\b7 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n+1978 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n+1979 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n+fully built BCRSMatrix instances\");\n+1980\n+1981 using real_type = typename FieldTraits::real_type;\n+1982 using std::max;\n+1983\n+1984 real_type norm = 0;\n+1985 real_type isNaN = 1;\n+1986\n+1987 for (auto const &x : *this) {\n+1988 real_type sum = 0;\n+1989 for (auto const &y : x)\n+1990 sum += Impl::asMatrix(y).infinity_norm_real();\n+1991 norm = max(sum, norm);\n+1992 isNaN += sum;\n+1993 }\n+1994\n+1995 return norm * (isNaN / isNaN);\n+1996 }\n+1997\n+1998 //===== sizes\n+1999\n+_\b2_\b0_\b0_\b1 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN () const\n+2002 {\n+2003 return _\bn;\n+2004 }\n+2005\n+_\b2_\b0_\b0_\b7 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bM () const\n+2008 {\n+2009 return _\bm;\n+2010 }\n+2011\n+_\b2_\b0_\b1_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn_\bo_\bn_\bz_\be_\br_\bo_\be_\bs () const\n+2014 {\n+2015 // in case of row-wise allocation\n+2016 if( _\bn_\bn_\bz_\b_ <= 0 )\n+2017 _\bn_\bn_\bz_\b_ = std::accumulate( _\bb_\be_\bg_\bi_\bn(), _\be_\bn_\bd(), _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be( 0 ), [] ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s,\n+const _\br_\bo_\bw_\b__\bt_\by_\bp_\be &row ) { return s+row.getsize(); } );\n+2018 return _\bn_\bn_\bz_\b_;\n+2019 }\n+2020\n+_\b2_\b0_\b2_\b2 _\bB_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be _\bb_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be() const\n+2023 {\n+2024 return _\br_\be_\ba_\bd_\by;\n+2025 }\n+2026\n+_\b2_\b0_\b2_\b8 _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be _\bb_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be() const\n+2029 {\n+2030 return _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be;\n+2031 }\n+2032\n+2033 //===== query\n+2034\n+_\b2_\b0_\b3_\b6 bool _\be_\bx_\bi_\bs_\bt_\bs (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j) const\n+2037 {\n+2038#ifdef DUNE_ISTL_WITH_CHECKING\n+2039 if (i<0 || i>=_\bn) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row index out of range\");\n+2040 if (j<0 || j>=_\bm) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"column index out of range\");\n+2041#endif\n+2042 return (_\br[i].size() && _\br[i].find(j) != _\br[i]._\be_\bn_\bd());\n+2043 }\n+2044\n+2045\n+2046 protected:\n+2047 // state information\n+_\b2_\b0_\b4_\b8 _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be; // row wise or whole matrix\n+_\b2_\b0_\b4_\b9 _\bB_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be _\br_\be_\ba_\bd_\by; // indicate the stage the matrix building is in\n+2050\n+2051 // The allocator used for memory management\n+_\b2_\b0_\b5_\b2 typename std::allocator_traits::template rebind_alloc _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_;\n+2053\n+_\b2_\b0_\b5_\b4 typename std::allocator_traits::template rebind_alloc\n+_\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_;\n+2055\n+_\b2_\b0_\b5_\b6 typename std::allocator_traits::template rebind_alloc\n+_\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_;\n+2057\n+2058 // size of the matrix\n+_\b2_\b0_\b5_\b9 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn; // number of rows\n+_\b2_\b0_\b6_\b0 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm; // number of columns\n+_\b2_\b0_\b6_\b1 mutable _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn_\bn_\bz_\b_; // number of nonzeroes contained in the matrix\n+_\b2_\b0_\b6_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_; //allocated size of a and j arrays, except in\n+implicit mode: nnz_==allocationsSize_\n+2063 // zero means that memory is allocated separately for each row.\n+2064\n+2065 // the rows are dynamically allocated\n+_\b2_\b0_\b6_\b6 _\br_\bo_\bw_\b__\bt_\by_\bp_\be* _\br; // [n] the individual rows having pointers into a,j arrays\n+2067\n+2068 // dynamically allocated memory\n+_\b2_\b0_\b6_\b9 B* _\ba; // [allocationSize] non-zero entries of the matrix in row-wise\n+ordering\n+2070 // If a single array of column indices is used, it can be shared\n+2071 // between different matrices with the same sparsity pattern\n+_\b2_\b0_\b7_\b2 std::shared_ptr _\bj_\b_; // [allocationSize] column indices of\n+entries\n+2073\n+2074 // additional data is needed in implicit buildmode\n+_\b2_\b0_\b7_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\ba_\bv_\bg;\n+_\b2_\b0_\b7_\b6 double _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_;\n+2077\n+_\b2_\b0_\b7_\b8 typedef std::map, B> _\bO_\bv_\be_\br_\bf_\bl_\bo_\bw_\bT_\by_\bp_\be;\n+_\b2_\b0_\b7_\b9 _\bO_\bv_\be_\br_\bf_\bl_\bo_\bw_\bT_\by_\bp_\be _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw;\n+2080\n+_\b2_\b0_\b8_\b1 void _\bs_\be_\bt_\bW_\bi_\bn_\bd_\bo_\bw_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br row)\n+2082 {\n+2083 _\br_\bo_\bw_\b__\bt_\by_\bp_\be current_row(_\ba,_\bj_\b_.get(),0); // Pointers to current row data\n+2084 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++, ++row) {\n+2085 // set row i\n+2086 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s = row->getsize();\n+2087\n+2088 if (s>0) {\n+2089 // setup pointers and size\n+2090 _\br[i].set(s,current_row.getptr(), current_row.getindexptr());\n+2091 // update pointer for next row\n+2092 current_row.setptr(current_row.getptr()+s);\n+2093 current_row.setindexptr(current_row.getindexptr()+s);\n+2094 } else{\n+2095 // empty row\n+2096 _\br[i].set(0,nullptr,nullptr);\n+2097 }\n+2098 }\n+2099 }\n+2100\n+2102\n+_\b2_\b1_\b0_\b6 void _\bs_\be_\bt_\bC_\bo_\bl_\bu_\bm_\bn_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br row)\n+2107 {\n+2108 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* jptr = _\bj_\b_.get();\n+2109 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; ++i, ++row) {\n+2110 // set row i\n+2111 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s = row->getsize();\n+2112\n+2113 if (s>0) {\n+2114 // setup pointers and size\n+2115 _\br[i].setsize(s);\n+2116 _\br[i].setindexptr(jptr);\n+2117 } else{\n+2118 // empty row\n+2119 _\br[i].set(0,nullptr,nullptr);\n+2120 }\n+2121\n+2122 // advance position in global array\n+2123 jptr += s;\n+2124 }\n+2125 }\n+2126\n+2128\n+_\b2_\b1_\b3_\b2 void _\bs_\be_\bt_\bD_\ba_\bt_\ba_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs()\n+2133 {\n+2134 B* aptr = _\ba;\n+2135 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; ++i) {\n+2136 // set row i\n+2137 if (_\br[i].getsize() > 0) {\n+2138 // setup pointers and size\n+2139 _\br[i].setptr(aptr);\n+2140 } else{\n+2141 // empty row\n+2142 _\br[i].set(0,nullptr,nullptr);\n+2143 }\n+2144\n+2145 // advance position in global array\n+2146 aptr += _\br[i].getsize();\n+2147 }\n+2148 }\n+2149\n+_\b2_\b1_\b5_\b1 void _\bc_\bo_\bp_\by_\bW_\bi_\bn_\bd_\bo_\bw_\bS_\bt_\br_\bu_\bc_\bt_\bu_\br_\be(const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& Mat)\n+2152 {\n+2153 _\bs_\be_\bt_\bW_\bi_\bn_\bd_\bo_\bw_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(Mat._\bb_\be_\bg_\bi_\bn());\n+2154\n+2155 // copy data\n+2156 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++) _\br[i] = Mat._\br[i];\n+2157\n+2158 // finish off\n+2159 _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be = _\br_\bo_\bw_\b__\bw_\bi_\bs_\be; // dummy\n+2160 _\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bt;\n+2161 }\n+2162\n+_\b2_\b1_\b6_\b8 void _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(bool deallocateRows=true)\n+2169 {\n+2170\n+2171 if (_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n+2172 return;\n+2173\n+2174 if (_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_>0)\n+2175 {\n+2176 // a,j_ have been allocated as one long vector\n+2177 _\bj_\b_.reset();\n+2178 if (_\ba)\n+2179 {\n+2180 for(B *aiter=_\ba+(_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_-1), *aend=_\ba-1; aiter!=aend; --aiter)\n+2181 std::allocator_traits::destroy(_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_, aiter);\n+2182 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.deallocate(_\ba,_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_);\n+2183 _\ba = nullptr;\n+2184 }\n+2185 }\n+2186 else if (_\br)\n+2187 {\n+2188 // check if memory for rows have been allocated individually\n+2189 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++)\n+2190 if (_\br[i].getsize()>0)\n+2191 {\n+2192 for (B *_\bc_\bo_\bl=_\br[i].getptr()+(_\br[i].getsize()-1),\n+2193 *colend = _\br[i].getptr()-1; _\bc_\bo_\bl!=colend; --_\bc_\bo_\bl) {\n+2194 std::allocator_traits::destroy(_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_, _\bc_\bo_\bl);\n+2195 }\n+2196 _\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.deallocate(_\br[i].getindexptr(),1);\n+2197 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.deallocate(_\br[i].getptr(),1);\n+2198 // clear out row data in case we don't want to deallocate the rows\n+2199 // otherwise we might run into a double free problem here later\n+2200 _\br[i].set(0,nullptr,nullptr);\n+2201 }\n+2202 }\n+2203\n+2204 // deallocate the rows\n+2205 if (_\bn>0 && deallocateRows && _\br) {\n+2206 for(_\br_\bo_\bw_\b__\bt_\by_\bp_\be *riter=_\br+(_\bn-1), *rend=_\br-1; riter!=rend; --riter)\n+2207 std::allocator_traits::destroy(_\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_,\n+riter);\n+2208 _\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.deallocate(_\br,_\bn);\n+2209 _\br = nullptr;\n+2210 }\n+2211\n+2212 // Mark matrix as not built at all.\n+2213 _\br_\be_\ba_\bd_\by=_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd;\n+2214\n+2215 }\n+2216\n+_\b2_\b2_\b3_\b5 void _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be allocationSize,\n+bool allocateRows, bool allocate_data)\n+2236 {\n+2237 // Store size\n+2238 _\bn = rows;\n+2239 _\bm = columns;\n+2240 _\bn_\bn_\bz_\b_ = allocationSize;\n+2241 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_ = allocationSize;\n+2242\n+2243 // allocate rows\n+2244 if(allocateRows) {\n+2245 if (_\bn>0) {\n+2246 if (_\br)\n+2247 DUNE_THROW(InvalidStateException,\"Rows have already been allocated, cannot\n+allocate a second time\");\n+2248 _\br = _\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.allocate(rows);\n+2249 // initialize row entries\n+2250 for(_\br_\bo_\bw_\b__\bt_\by_\bp_\be* ri=_\br; ri!=_\br+rows; ++ri)\n+2251 std::allocator_traits::construct(_\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_,\n+ri, _\br_\bo_\bw_\b__\bt_\by_\bp_\be());\n+2252 }else{\n+2253 _\br = 0;\n+2254 }\n+2255 }\n+2256\n+2257 // allocate a and j_ array\n+2258 if (allocate_data)\n+2259 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bD_\ba_\bt_\ba();\n+2260 // allocate column indices only if not yet present (enable sharing)\n+2261 if (_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_>0) {\n+2262 // we copy allocator and size to the deleter since _j may outlive this\n+class\n+2263 if (!_\bj_\b_.get())\n+2264 _\bj_\b_.reset(_\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.allocate(_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_),\n+2265 [alloc = _\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_, size = _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_](auto ptr) mutable {\n+2266 alloc.deallocate(ptr, size);\n+2267 });\n+2268 }else{\n+2269 _\bj_\b_.reset();\n+2270 }\n+2271\n+2272 // Mark the matrix as not built.\n+2273 _\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg;\n+2274 }\n+2275\n+_\b2_\b2_\b7_\b6 void _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bD_\ba_\bt_\ba()\n+2277 {\n+2278 if (_\ba)\n+2279 DUNE_THROW(InvalidStateException,\"Cannot allocate data array (already\n+allocated)\");\n+2280 if (_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_>0) {\n+2281 _\ba = _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.allocate(_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_);\n+2282 // use placement new to call constructor that allocates\n+2283 // additional memory.\n+2284 new (_\ba) B[_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_];\n+2285 } else {\n+2286 _\ba = nullptr;\n+2287 }\n+2288 }\n+2289\n+_\b2_\b2_\b9_\b5 void _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\b__\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _m)\n+2296 {\n+2297 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be != _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt)\n+2298 DUNE_THROW(InvalidStateException,\"implicit_allocate() may only be called\n+in implicit build mode\");\n+2299 if (_\br_\be_\ba_\bd_\by != _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n+2300 DUNE_THROW(InvalidStateException,\"memory has already been allocated\");\n+2301\n+2302 // check to make sure the user has actually set the parameters\n+2303 if (_\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_ < 0)\n+2304 DUNE_THROW(InvalidStateException,\"You have to set the implicit build mode\n+parameters before starting to build the matrix\");\n+2305 //calculate size of overflow region, add buffer for row sort!\n+2306 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be osize = (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be) (_n*_\ba_\bv_\bg)*_\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_ + 4*_\ba_\bv_\bg;\n+2307 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_ = _n*_\ba_\bv_\bg + osize;\n+2308\n+2309 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_n, _m, _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_,true,true);\n+2310\n+2311 //set row pointers correctly\n+2312 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* jptr = _\bj_\b_.get() + osize;\n+2313 B* aptr = _\ba + osize;\n+2314 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++)\n+2315 {\n+2316 _\br[i].set(0,aptr,jptr);\n+2317 jptr = jptr + _\ba_\bv_\bg;\n+2318 aptr = aptr + _\ba_\bv_\bg;\n+2319 }\n+2320\n+2321 _\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg;\n+2322 }\n+2323 };\n+2324\n+2325\n+2326 template\n+_\b2_\b3_\b2_\b7 struct FieldTraits< _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n+2328 {\n+_\b2_\b3_\b2_\b9 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\b _\bA_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b2_\b3_\b3_\b0 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename FieldTraits::real_type;\n+2331 };\n+2332\n+2335} // end namespace\n+2336\n+2337#endif\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n+Helper functions for determining the vector/matrix block level.\n _\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n This file implements a vector space as a tensor product of a given vector\n space. The number of compon...\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bb\n-void bsorb(const M &A, X &x, const Y &b, const K &w)\n-SSOR step.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:646\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bf\n-void bsorf(const M &A, X &x, const Y &b, const K &w)\n-SOR step.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:634\n+_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\n+Some handy generic functions for ISTL matrices.\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-A linear operator exporting itself in matrix form.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-An overlapping Schwarz operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-const communication_type & getCommunication() const\n-Get the object responsible for communication.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:146\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bm_\ba_\bt\n-virtual const matrix_type & getmat() const\n-get the sequential assembled linear operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:133\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd\n-virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const\n-apply operator to x, scale and add:\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(const X &x, Y &y) const\n-apply operator to x:\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n-C communication_type\n-The type of the communication object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:98\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The type of the domain.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-The type of the matrix we operate on.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The type of the range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-OverlappingSchwarzOperator(const matrix_type &A, const communication_type &com)\n-constructor: just store a reference to a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-OverlappingSchwarzOperator(const std::shared_ptr< matrix_type > A, const\n-communication_type &com)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the linear operator (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:139\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Base class for matrix free definition of preconditioners.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR\n-A parallel SSOR preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:175\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:184\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n-C communication_type\n-The type of the communication object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:186\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:233\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR\n-ParSSOR(const matrix_type &A, int n, field_type w, const communication_type &c)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:197\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(X &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:180\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-The matrix type the preconditioner is for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:178\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &v, const Y &d)\n-Apply the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bp_\br_\be\n-virtual void pre(X &x, Y &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:206\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Block parallel preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:278\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\br_\be\n-virtual void pre(X &x, Y &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:326\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:285\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-BlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:317\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &v, const Y &d)\n-Apply the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:337\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-BlockPreconditioner(P &p, const communication_type &c)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:306\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(X &v, const Y &d)\n-Apply one step of the preconditioner to the system A(v)=d.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:344\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n-C communication_type\n-The type of the communication object..\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:297\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:292\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(X &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:355\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:290\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:361\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n-@ overlapping\n-Category for overlapping solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs\n+Statistics about compression achieved in implicit mode.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:88\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs_\b:_\b:_\bo_\bv_\be_\br_\bf_\bl_\bo_\bw_\b__\bt_\bo_\bt_\ba_\bl\n+size_type overflow_total\n+total number of elements written to the overflow area during construction.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:94\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs_\b:_\b:_\bm_\ba_\bx_\bi_\bm_\bu_\bm\n+size_type maximum\n+maximum number of non-zeroes per row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:92\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs_\b:_\b:_\ba_\bv_\bg\n+double avg\n+average number of non-zeroes per row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:90\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs_\b:_\b:_\bm_\be_\bm_\b__\br_\ba_\bt_\bi_\bo\n+double mem_ratio\n+fraction of wasted memory resulting from non-used overflow area.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:99\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br\n+A wrapper for uniform access to the BCRSMatrix during and after the build stage\n+in implicit build mod...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+Matrix::block_type block_type\n+The block_type of the underlying matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br\n+ImplicitMatrixBuilder(Matrix &m)\n+Creates an ImplicitMatrixBuilder for matrix m.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:170\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+M_ Matrix\n+The underlying matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:122\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br\n+ImplicitMatrixBuilder(Matrix &m, size_type rows, size_type cols, size_type\n+avg_cols_per_row, double overflow_fraction)\n+Sets up matrix m for implicit construction using the given parameters and\n+creates an ImplicitBmatrixu...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bM\n+size_type M() const\n+The number of columns in the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:217\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+The size_type of the underlying matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+row_object operator[](size_type i) const\n+Returns a proxy for entries in row i.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:205\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bN\n+size_type N() const\n+The number of rows in the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt\n+Proxy row object for entry access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:137\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+block_type & operator[](size_type j) const\n+Returns entry in column j.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< B >::field_type field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:488\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_\n+std::allocator_traits< A >::template rebind_alloc< row_type > rowAllocator_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2054\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n+bool exists(size_type i, size_type j) const\n+return true if (i,j) is in pattern\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2036\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be\n+BuildStage buildStage() const\n+The current build stage of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2022\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+Iterator begin()\n+Get iterator to first row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:671\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bp_\by_\bW_\bi_\bn_\bd_\bo_\bw_\bS_\bt_\br_\bu_\bc_\bt_\bu_\br_\be\n+void copyWindowStructure(const BCRSMatrix &Mat)\n+Copy the window structure from another matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bt_\br_\by\n+B & entry(size_type row, size_type col)\n+Returns reference to entry (row,col) of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1317\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bh_\bv\n+void mmhv(const X &x, Y &y) const\n+y -= A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1841\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bh_\bv\n+void usmhv(const field_type &alpha, const X &x, Y &y) const\n+y += alpha A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1864\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bt_\bv\n+void umtv(const X &x, Y &y) const\n+y += A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1751\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_\n+double compressionBufferSize_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2076\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm\n+size_type m\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2060\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+RealRowIterator< const row_type > const_iterator\n+The const iterator over the matrix rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:703\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n+void allocate(size_type rows, size_type columns, size_type allocationSize, bool\n+allocateRows, bool allocate_data)\n+Allocate memory for the matrix structure.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2235\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bx_\bp_\by\n+BCRSMatrix & axpy(field_type alpha, const BCRSMatrix &b)\n+Add the scaled entries of another matrix to this one.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1621\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n+FieldTraits< ft >::real_type infinity_norm_real() const\n+simplified infinity norm (uses Manhattan norm for complex values)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1934\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\b~_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+~BCRSMatrix()\n+destructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:821\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bD_\ba_\bt_\ba\n+void allocateData()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2276\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n+void deallocate(bool deallocateRows=true)\n+deallocate memory of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2168\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator RowIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:697\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+row_type & operator[](size_type i)\n+random access to the rows\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:545\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix()\n+an empty matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:745\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs\n+void endrowsizes()\n+indicate that size of all rows is defined\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1146\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be\n+void incrementrowsize(size_type i, size_type s=1)\n+increment size of row i by s (1 by default)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1135\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bt_\bv\n+void mtv(const X &x, Y &y) const\n+y = A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1736\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bh_\bv\n+void umhv(const X &x, Y &y) const\n+y += A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1818\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bn_\bo_\bn_\bz_\be_\br_\bo_\be_\bs\n+size_type nonzeroes() const\n+number of blocks that are stored (the number of blocks that possibly are\n+nonzero)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2013\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_\n+size_type allocationSize_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2062\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator ConstRowIterator\n+rename the const row iterator for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:734\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\be_\ba_\bd_\by\n+BuildStage ready\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2049\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bN_\bo_\bS_\bo_\br_\bt\n+void setIndicesNoSort(size_type row, It begin, It end)\n+Set all column indices for row from the given iterator range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1232\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be\n+BuildMode build_mode\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2048\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be\n+void setrowsize(size_type i, size_type s)\n+Set number of indices in row i to s.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1114\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+RealRowIterator< row_type > Iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:668\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bn_\bn_\bz_\b_\n+size_type nnz_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2061\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n+BCRSMatrix & operator*=(const field_type &k)\n+vector space multiplication with scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1513\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_\n+std::allocator_traits< A >::template rebind_alloc< size_type > sizeAllocator_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2056\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+RealRowIterator< row_type > iterator\n+The iterator over the (mutable matrix rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:667\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bt_\bv\n+void usmtv(const field_type &alpha, const X &x, Y &y) const\n+y += alpha A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1795\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+ConstIterator beforeBegin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:728\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+RealRowIterator< const row_type > ConstIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:704\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+Iterator beforeBegin()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:691\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba\n+B * a\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2069\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be\n+BuildMode\n+we support two modes\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:506\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt\n+@ implicit\n+Build entries randomly with an educated guess for the number of entries per\n+row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:535\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn\n+@ unknown\n+Build mode not set!\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:539\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\ba_\bn_\bd_\bo_\bm\n+@ random\n+Build entries randomly.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:526\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bw_\bi_\bs_\be\n+@ row_wise\n+Build in a row-wise manner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:517\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix(size_type _n, size_type _m, size_type _nnz, BuildMode bm)\n+matrix with known number of nonzeroes\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:752\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+Imp::CompressedBlockVectorWindow< B, size_type > row_type\n+implement row_type with compressed vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:500\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs\n+::Dune::CompressionStatistics< size_type > CompressionStatistics\n+The type for the statistics object returned by compress()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:503\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n+BCRSMatrix & operator-=(const BCRSMatrix &b)\n+Subtract the entries of another matrix from this one.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1596\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix(const BCRSMatrix &Mat)\n+copy constructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:802\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+Iterator end()\n+Get iterator to one beyond last row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:677\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br\n+row_type * r\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2066\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+void setIndices(size_type row, It begin, It end)\n+Set all column indices for row from the given iterator range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1255\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx\n+void addindex(size_type row, size_type col)\n+add index (row,col) to the matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bO_\bv_\be_\br_\bf_\bl_\bo_\bw_\bT_\by_\bp_\be\n+std::map< std::pair< size_type, size_type >, B > OverflowType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2078\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::Iterator ColIterator\n+Iterator for the entries of each row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:700\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm\n+FieldTraits< field_type >::real_type frobenius_norm() const\n+frobenius norm: sqrt(sum over squared values of entries)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1906\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+The type for the index access and the size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n+BCRSMatrix & operator/=(const field_type &k)\n+vector space division by scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1541\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bv_\be_\br_\bf_\bl_\bo_\bw\n+OverflowType overflow\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2079\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n+BCRSMatrix & operator+=(const BCRSMatrix &b)\n+Add the entries of another matrix to this one.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1574\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix(size_type _n, size_type _m, size_type _avg, double\n+compressionBufferSize, BuildMode bm)\n+construct matrix with a known average number of entries per row\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:781\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd\n+CreateIterator createend()\n+get create iterator pointing to one after the last block\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2\n+FieldTraits< field_type >::real_type frobenius_norm2() const\n+square of frobenius norm, need for block recursion\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1889\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+Iterator beforeEnd()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:684\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::ConstIterator ConstColIterator\n+Const iterator to the entries of a row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:737\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bv\n+void usmv(F &&alpha, const X &x, Y &y) const\n+y += alpha A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1713\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bg_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be\n+size_type getrowsize(size_type i) const\n+get current number of indices in row i\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+size_type M() const\n+number of columns (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2007\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bn\n+size_type n\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2059\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn\n+CreateIterator createbegin()\n+get initial create iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1094\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be\n+BuildStage\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:469\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bS_\bi_\bz_\be_\bs_\bB_\bu_\bi_\bl_\bt\n+@ rowSizesBuilt\n+The row sizes of the matrix are known.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:480\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bu_\bi_\bl_\bt\n+@ built\n+The matrix structure is fully built.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:482\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bn_\bo_\bt_\bb_\bu_\bi_\bl_\bt\n+@ notbuilt\n+Matrix is not built at all, no memory has been allocated, build mode and size\n+can still be set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:471\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd\n+@ notAllocated\n+Matrix is not built at all, no memory has been allocated, build mode and size\n+can still be set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:473\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg\n+@ building\n+Matrix is currently being built, some memory has been allocated, build mode and\n+size are fixed.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:475\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be\n+BuildMode buildMode() const\n+The currently selected build mode of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2028\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bv\n+void mmv(const X &x, Y &y) const\n+y -= A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1690\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n+FieldTraits< ft >::real_type infinity_norm() const\n+infinity norm (row sum norm, how to generalize for blocks?)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1914\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n+void mv(const X &x, Y &y) const\n+y = A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1641\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+B block_type\n+export the type representing the components\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:491\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bt_\bv\n+void mmtv(const X &x, Y &y) const\n+y -= A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1774\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bv_\bg\n+size_type avg\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2075\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bv\n+void umv(const X &x, Y &y) const\n+y += A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1667\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\b__\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n+void implicit_allocate(size_type _n, size_type _m)\n+organizes allocation implicit mode calculates correct array size to be\n+allocated and sets the the win...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2295\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+void setImplicitBuildModeParameters(size_type _avg, double\n+compressionBufferSize)\n+Set parameters needed for creation in implicit build mode.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:886\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix(size_type _n, size_type _m, BuildMode bm)\n+matrix with unknown number of nonzeroes\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:761\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs\n+void endindices()\n+indicate that all indices are defined, check consistency\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1269\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bm_\bp_\br_\be_\bs_\bs\n+CompressionStatistics compress()\n+Finishes the buildstage in implicit mode.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1381\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bD_\ba_\bt_\ba_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n+void setDataPointers()\n+Set data pointers for all rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_\n+std::allocator_traits< A >::template rebind_alloc< B > allocator_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2052\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+size_type N() const\n+number of rows (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be\n+void setBuildMode(BuildMode bm)\n+Sets the build mode of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:830\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n+void setSize(size_type rows, size_type columns, size_type nnz=0)\n+Set the size of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:858\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bj_\b_\n+std::shared_ptr< size_type > j_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2072\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bW_\bi_\bn_\bd_\bo_\bw_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n+void setWindowPointers(ConstRowIterator row)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2081\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+BCRSMatrix & operator=(const BCRSMatrix &Mat)\n+assignment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:908\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bC_\bo_\bl_\bu_\bm_\bn_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n+void setColumnPointers(ConstRowIterator row)\n+Copy row sizes from iterator range starting at row and set column index\n+pointers for all rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+ConstIterator end() const\n+Get const iterator to one beyond last row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:714\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+ConstIterator begin() const\n+Get const iterator to first row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:708\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n+A allocator_type\n+export the allocator type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:494\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+ConstIterator beforeEnd() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:721\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator access to matrix rows\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:575\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+RealRowIterator()\n+empty constructor, use with care!\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:592\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n+bool equals(const RealRowIterator< ValueType > &other) const\n+equality\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:620\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n+std::remove_const< T >::type ValueType\n+The unqualified value type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:579\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+RealRowIterator(const RealRowIterator< ValueType > &it)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:596\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n+bool equals(const RealRowIterator< const ValueType > &other) const\n+equality\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:627\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+RealRowIterator(row_type *_p, size_type _i)\n+constructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:587\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n+std::ptrdiff_t distanceTo(const RealRowIterator< const ValueType > &other)\n+const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:613\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n+size_type index() const\n+return index\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:602\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n+std::ptrdiff_t distanceTo(const RealRowIterator< ValueType > &other) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:607\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator class for sequential creation of blocks\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:954\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const CreateIterator &it) const\n+equality\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1049\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+CreateIterator & operator++()\n+prefix increment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:974\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n+size_type index() const\n+The number of the row that the iterator currently points to.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1055\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const CreateIterator &it) const\n+inequality\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1043\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+CreateIterator(BCRSMatrix &_Mat, size_type _i)\n+constructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:957\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n+void insert(size_type j)\n+put column index in row\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1061\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\bs\n+bool contains(size_type j)\n+return true if column index is in row\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1067\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n+size_type size() const\n+Get the current row size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1076\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename BCRSMatrix< B, A >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2329\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+typename FieldTraits< field_type >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2330\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n+Error specific to BCRSMatrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd\n+Thrown when the compression buffer used by the implicit BCRSMatrix construction\n+is exhausted.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+A generic dynamic dense matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+Type for indices and sizes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:577\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+T block_type\n+Export the type representing the components.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:568\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:538\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00014.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00014.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: supermatrix.hh File Reference\n+dune-istl: istlexception.hh File Reference\n \n \n \n \n \n \n \n@@ -72,55 +72,38 @@\n

  • dune
  • istl
  • \n \n \n
    \n \n-
    supermatrix.hh File Reference
    \n+
    istlexception.hh File Reference
    \n
    \n
    \n-
    #include "bcrsmatrix.hh"
    \n-#include "bvector.hh"
    \n+
    #include <dune/common/exceptions.hh>
    \n #include <dune/common/fmatrix.hh>
    \n-#include <dune/common/fvector.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <limits>
    \n-#include <dune/istl/bccsmatrixinitializer.hh>
    \n-#include "superlufunctions.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::SuperMatrixCreateSparseChooser< T >
    class  Dune::ISTLError
     derive error class from the base class in common More...
     
    struct  Dune::SuperMatrixPrinter< T >
    class  Dune::BCRSMatrixError
     Error specific to BCRSMatrix. More...
     
    struct  Dune::BaseGetSuperLUType< T >
    class  Dune::ImplicitModeCompressionBufferExhausted
     Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted. More...
     
    struct  Dune::GetSuperLUType< T >
    class  Dune::SolverAbort
     Thrown when a solver aborts due to some problem. More...
     
    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::MatrixBlockError
     Error when performing an operation on a matrix block. More...
     
    \n \n \n \n

    \n Namespaces

    namespace  Dune
     
    \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,50 +1,33 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-supermatrix.hh File Reference\n-#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+istlexception.hh File Reference\n+#include \n #include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n-#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+\u00a0 derive error class from the base class in common _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bT_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n+\u00a0 Error specific to _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bT_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd\n+\u00a0 Thrown when the compression buffer used by the implicit _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+ construction is exhausted. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bT_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt\n+\u00a0 Thrown when a solver aborts due to some problem. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bM_\b _\b>\n-\u00a0 Utility class for converting an _\bI_\bS_\bT_\bL _\bM_\ba_\bt_\br_\bi_\bx into a _\bS_\bu_\bp_\be_\br_\bL_\bU _\bM_\ba_\bt_\br_\bi_\bx.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bM_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n-\u00a0 Converter for _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx to _\bS_\bu_\bp_\be_\br_\bL_\bU _\bM_\ba_\bt_\br_\bi_\bx. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br\n+\u00a0 Error when performing an operation on a matrix block. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00014_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00014_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: supermatrix.hh Source File\n+dune-istl: istlexception.hh Source File\n \n \n \n \n \n \n \n@@ -74,427 +74,65 @@\n \n
    \n \n
    \n
    \n
    \n-
    supermatrix.hh
    \n+
    istlexception.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_SUPERMATRIX_HH
    \n-
    6#define DUNE_ISTL_SUPERMATRIX_HH
    \n+
    5#ifndef DUNE_ISTL_ISTLEXCEPTION_HH
    \n+
    6#define DUNE_ISTL_ISTLEXCEPTION_HH
    \n
    7
    \n-
    8#if HAVE_SUPERLU
    \n-
    9
    \n-
    10#include "bcrsmatrix.hh"
    \n-
    11#include "bvector.hh"
    \n-
    12#include <dune/common/fmatrix.hh>
    \n-
    13#include <dune/common/fvector.hh>
    \n-
    14#include <dune/common/typetraits.hh>
    \n-
    15#include <limits>
    \n-
    16
    \n-\n-
    18
    \n-
    19#include "superlufunctions.hh"
    \n+
    8#include <dune/common/exceptions.hh>
    \n+
    9#include <dune/common/fmatrix.hh>
    \n+
    10
    \n+
    11namespace Dune {
    \n+
    12
    \n+
    19 class ISTLError : public Dune::MathError {};
    \n
    20
    \n-
    21namespace Dune
    \n-
    22{
    \n-
    23
    \n-
    24 template<class T>
    \n-
    \n-\n-
    26 {};
    \n-
    \n-
    27
    \n-
    28 template<class T>
    \n-
    \n-\n-
    30 {};
    \n-
    \n-
    31
    \n-
    32#if __has_include("slu_sdefs.h")
    \n-
    33 template<>
    \n-\n-
    35 {
    \n-
    36 static void create(SuperMatrix *mat, int n, int m, int offset,
    \n-
    37 float *values, int *rowindex, int* colindex,
    \n-
    38 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n-
    39 {
    \n-
    40 sCreate_CompCol_Matrix(mat, n, m, offset, values, rowindex, colindex,
    \n-
    41 stype, dtype, mtype);
    \n-
    42 }
    \n-
    43 };
    \n-
    44
    \n-
    45 template<>
    \n-
    46 struct SuperMatrixPrinter<float>
    \n-
    47 {
    \n-
    48 static void print(char* name, SuperMatrix* mat)
    \n-
    49 {
    \n-
    50 sPrint_CompCol_Matrix(name, mat);
    \n-
    51 }
    \n-
    52 };
    \n-
    53#endif
    \n-
    54
    \n-
    55#if __has_include("slu_ddefs.h")
    \n-
    56 template<>
    \n-
    57 struct SuperMatrixCreateSparseChooser<double>
    \n-
    58 {
    \n-
    59 static void create(SuperMatrix *mat, int n, int m, int offset,
    \n-
    60 double *values, int *rowindex, int* colindex,
    \n-
    61 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n-
    62 {
    \n-
    63 dCreate_CompCol_Matrix(mat, n, m, offset, values, rowindex, colindex,
    \n-
    64 stype, dtype, mtype);
    \n-
    65 }
    \n-
    66 };
    \n-
    67
    \n-
    68 template<>
    \n-
    69 struct SuperMatrixPrinter<double>
    \n-
    70 {
    \n-
    71 static void print(char* name, SuperMatrix* mat)
    \n-
    72 {
    \n-
    73 dPrint_CompCol_Matrix(name, mat);
    \n-
    74 }
    \n-
    75 };
    \n-
    76#endif
    \n-
    77
    \n-
    78#if __has_include("slu_cdefs.h")
    \n-
    79 template<>
    \n-
    80 struct SuperMatrixCreateSparseChooser<std::complex<float> >
    \n-
    81 {
    \n-
    82 static void create(SuperMatrix *mat, int n, int m, int offset,
    \n-
    83 std::complex<float> *values, int *rowindex, int* colindex,
    \n-
    84 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n-
    85 {
    \n-
    86 cCreate_CompCol_Matrix(mat, n, m, offset, reinterpret_cast< ::complex*>(values),
    \n-
    87 rowindex, colindex, stype, dtype, mtype);
    \n-
    88 }
    \n-
    89 };
    \n-
    90
    \n-
    91 template<>
    \n-
    92 struct SuperMatrixPrinter<std::complex<float> >
    \n-
    93 {
    \n-
    94 static void print(char* name, SuperMatrix* mat)
    \n-
    95 {
    \n-
    96 cPrint_CompCol_Matrix(name, mat);
    \n-
    97 }
    \n-
    98 };
    \n-
    99#endif
    \n-
    100
    \n-
    101#if __has_include("slu_zdefs.h")
    \n-
    102 template<>
    \n-
    103 struct SuperMatrixCreateSparseChooser<std::complex<double> >
    \n-
    104 {
    \n-
    105 static void create(SuperMatrix *mat, int n, int m, int offset,
    \n-
    106 std::complex<double> *values, int *rowindex, int* colindex,
    \n-
    107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n-
    108 {
    \n-
    109 zCreate_CompCol_Matrix(mat, n, m, offset, reinterpret_cast<doublecomplex*>(values),
    \n-
    110 rowindex, colindex, stype, dtype, mtype);
    \n-
    111 }
    \n-
    112 };
    \n-
    113
    \n-
    114 template<>
    \n-
    115 struct SuperMatrixPrinter<std::complex<double> >
    \n-
    116 {
    \n-
    117 static void print(char* name, SuperMatrix* mat)
    \n-
    118 {
    \n-
    119 zPrint_CompCol_Matrix(name, mat);
    \n-
    120 }
    \n-
    121 };
    \n-
    122#endif
    \n-
    123
    \n-
    124 template<class T>
    \n-
    \n-\n-
    126 {
    \n-
    127 static const Dtype_t type;
    \n-
    128 };
    \n-
    \n-
    129
    \n-
    130 template<class T>
    \n-
    \n-\n-
    132 {};
    \n-
    \n-
    133
    \n-
    134 template<class T>
    \n-
    135 const Dtype_t BaseGetSuperLUType<T>::type =
    \n-
    136 std::is_same<T,float>::value ? SLU_S :
    \n-
    137 ( std::is_same<T,std::complex<double> >::value ? SLU_Z :
    \n-
    138 ( std::is_same<T,std::complex<float> >::value ? SLU_C : SLU_D ));
    \n-
    139
    \n-
    140 template<>
    \n-
    \n-
    141 struct GetSuperLUType<double>
    \n-
    142 : public BaseGetSuperLUType<double>
    \n-
    143 {
    \n-
    144 typedef double float_type;
    \n-
    145 };
    \n-
    \n-
    146
    \n-
    147 template<>
    \n-
    \n-
    148 struct GetSuperLUType<float>
    \n-
    149 : public BaseGetSuperLUType<float>
    \n-
    150 {
    \n-
    151 typedef float float_type;
    \n-
    152 };
    \n-
    \n-
    153
    \n-
    154 template<>
    \n-
    \n-
    155 struct GetSuperLUType<std::complex<double> >
    \n-
    156 : public BaseGetSuperLUType<std::complex<double> >
    \n-
    157 {
    \n-
    158 typedef double float_type;
    \n-
    159 };
    \n-
    \n-
    160
    \n-
    161 template<>
    \n-
    \n-
    162 struct GetSuperLUType<std::complex<float> >
    \n-
    163 : public BaseGetSuperLUType<std::complex<float> >
    \n-
    164 {
    \n-
    165 typedef float float_type;
    \n-
    166
    \n-
    167 };
    \n-
    \n-
    168
    \n-
    173 template<class M>
    \n-
    \n-\n-
    175 {};
    \n-
    \n-
    176
    \n-
    177 template<class M>
    \n-
    \n-\n-
    179 {};
    \n-
    \n-
    180
    \n-
    181 template<class T>
    \n-
    182 class SuperLU;
    \n-
    183
    \n-
    184 template<class M, class X, class TM, class TD, class T1>
    \n-\n-
    186
    \n-
    187 template<class T, bool flag>
    \n-\n-
    189
    \n-
    193 template<class B, class TA>
    \n-
    \n-\n-
    195 : public ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>
    \n-
    196 {
    \n-
    197 template<class M, class X, class TM, class TD, class T1>
    \n-\n-
    199 friend struct SuperMatrixInitializer<BCRSMatrix<B,TA> >;
    \n-
    200 public:
    \n-\n-
    203
    \n-\n-
    205
    \n-
    206 typedef typename Matrix::size_type size_type;
    \n-
    207
    \n-
    \n-
    212 explicit SuperLUMatrix(const Matrix& mat) : ISTL::Impl::BCCSMatrix<BCRSMatrix<B,TA>, int>(mat)
    \n-
    213 {}
    \n-
    \n-
    214
    \n-
    \n-
    215 SuperLUMatrix() : ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>()
    \n-
    216 {}
    \n-
    \n-
    217
    \n-
    \n-\n-
    220 {
    \n-
    221 if (this->N_+this->M_*this->Nnz_ != 0)
    \n-
    222 free();
    \n-
    223 }
    \n-
    \n-
    224
    \n-
    \n-
    226 operator SuperMatrix&()
    \n-
    227 {
    \n-
    228 return A;
    \n-
    229 }
    \n-
    \n-
    230
    \n-
    \n-
    232 operator const SuperMatrix&() const
    \n-
    233 {
    \n-
    234 return A;
    \n-
    235 }
    \n-
    \n-
    236
    \n-
    \n-\n-
    238 {
    \n-
    239 if (this->N_ + this->M_ + this->Nnz_!=0)
    \n-
    240 free();
    \n-
    241
    \n-
    242 using Matrix = BCRSMatrix<B,TA>;
    \n-\n-\n-
    245 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(*this);
    \n-
    246
    \n-
    247 copyToBCCSMatrix(initializer, mat);
    \n-
    248
    \n-\n-
    250 ::create(&A, this->N_, this->M_, this->colstart[this->N_],
    \n-
    251 this->values,this->rowindex, this->colstart, SLU_NC,
    \n-
    252 static_cast<Dtype_t>(GetSuperLUType<typename Matrix::field_type>::type), SLU_GE);
    \n-
    253 return *this;
    \n-
    254 }
    \n-
    \n-
    255
    \n-
    \n-\n-
    257 {
    \n-
    258 if (this->N_ + this->M_ + this->Nnz_!=0)
    \n-
    259 free();
    \n-
    260
    \n-
    261 using Matrix = BCRSMatrix<B,TA>;
    \n-\n-\n-
    264 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(*this);
    \n-
    265
    \n-
    266 copyToBCCSMatrix(initializer, mat);
    \n-
    267
    \n-\n-
    269 ::create(&A, this->N_, this->M_, this->colstart[this->N_],
    \n-
    270 this->values,this->rowindex, this->colstart, SLU_NC,
    \n-
    271 static_cast<Dtype_t>(GetSuperLUType<B>::type), SLU_GE);
    \n-
    272 return *this;
    \n-
    273 }
    \n-
    \n-
    274
    \n-
    \n-
    281 virtual void setMatrix(const Matrix& mat, const std::set<std::size_t>& mrs)
    \n-
    282 {
    \n-
    283 if(this->N_+this->M_+this->Nnz_!=0)
    \n-
    284 free();
    \n-
    285 this->N_=mrs.size()*MatrixDimension<typename Matrix::block_type>::rowdim(*(mat[0].begin()));
    \n-
    286 this->M_=mrs.size()*MatrixDimension<typename Matrix::block_type>::coldim(*(mat[0].begin()));
    \n-
    287 SuperMatrixInitializer<Matrix> initializer(*this);
    \n-
    288
    \n-
    289 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(mat,mrs));
    \n-
    290 }
    \n-
    \n-
    291
    \n-
    \n-
    293 virtual void setMatrix(const Matrix& mat)
    \n-
    294 {
    \n-\n-\n-
    297 SuperMatrixInitializer<Matrix> initializer(*this);
    \n-
    298
    \n-
    299 copyToBCCSMatrix(initializer, mat);
    \n-
    300 }
    \n-
    \n-
    301
    \n-
    \n-
    303 virtual void free()
    \n-
    304 {
    \n-
    305 ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>::free();
    \n-
    306 SUPERLU_FREE(A.Store);
    \n-
    307 }
    \n-
    \n-
    308 private:
    \n-
    309 SuperMatrix A;
    \n-
    310 };
    \n-
    \n-
    311
    \n-
    312 template<class B, class A>
    \n-
    \n-\n-
    314 : public ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>
    \n-
    315 {
    \n-
    316 template<class I, class S, class D>
    \n-\n-
    318 public:
    \n-\n-\n-
    321
    \n-
    \n-
    322 SuperMatrixInitializer(SuperLUMatrix& lum) : ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>(lum)
    \n-
    323 ,slumat(&lum)
    \n-
    324 {}
    \n-
    \n-
    325
    \n-
    \n-
    326 SuperMatrixInitializer() : ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>()
    \n-
    327 {}
    \n-
    \n-
    328
    \n-
    \n-
    329 virtual void createMatrix() const
    \n-
    330 {
    \n-
    331 ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>::createMatrix();
    \n-\n-
    333 ::create(&slumat->A, slumat->N_, slumat->M_, slumat->colstart[this->cols],
    \n-
    334 slumat->values,slumat->rowindex, slumat->colstart, SLU_NC,
    \n-
    335 static_cast<Dtype_t>(GetSuperLUType<typename Matrix::field_type>::type), SLU_GE);
    \n-
    336 }
    \n-
    \n-
    337 private:
    \n-
    338 SuperLUMatrix* slumat;
    \n-
    339 };
    \n-
    \n-
    340}
    \n-
    341#endif // HAVE_SUPERLU
    \n-
    342#endif
    \n-
    Implementation of the BCRSMatrix class.
    \n-\n-\n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n-
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n-
    STL namespace.
    \n+
    \n+\n+
    23 : public ISTLError
    \n+
    24 {};
    \n+
    \n+
    25
    \n+
    \n+\n+
    36 : public BCRSMatrixError
    \n+
    37 {};
    \n+
    \n+
    38
    \n+
    40
    \n+
    46 class SolverAbort : public ISTLError {};
    \n+
    47
    \n+
    49
    \n+
    \n+
    52 class MatrixBlockError : public virtual Dune::FMatrixError {
    \n+
    53 public:
    \n+
    54 int r, c; // row and column index of the entry from which the error resulted
    \n+
    55 };
    \n+
    \n+
    56
    \n+
    59} // end namespace
    \n+
    60
    \n+
    61#endif
    \n
    Definition allocator.hh:11
    \n-
    Initializer for SuperLU Matrices representing the subdomains.
    Definition overlappingschwarz.hh:47
    \n-
    static auto coldim(const M &A)
    Definition matrixutils.hh:219
    \n-
    static auto rowdim(const M &A)
    Definition matrixutils.hh:214
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n-
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n-
    Definition overlappingschwarz.hh:694
    \n-
    SuperLu Solver.
    Definition superlu.hh:271
    \n-
    Definition supermatrix.hh:26
    \n-
    Definition supermatrix.hh:30
    \n-
    Definition supermatrix.hh:126
    \n-
    static const Dtype_t type
    Definition supermatrix.hh:127
    \n-
    Definition supermatrix.hh:132
    \n-
    double float_type
    Definition supermatrix.hh:144
    \n-
    float float_type
    Definition supermatrix.hh:151
    \n-
    double float_type
    Definition supermatrix.hh:158
    \n-
    float float_type
    Definition supermatrix.hh:165
    \n-
    Utility class for converting an ISTL Matrix into a SuperLU Matrix.
    Definition supermatrix.hh:175
    \n-
    Definition supermatrix.hh:179
    \n-
    virtual void free()
    free allocated space.
    Definition supermatrix.hh:303
    \n-
    SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const SuperLUMatrix< BCRSMatrix< B, TA > > &mat)
    Definition supermatrix.hh:256
    \n-
    SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const BCRSMatrix< B, TA > &mat)
    Definition supermatrix.hh:237
    \n-
    SuperLUMatrix(const Matrix &mat)
    Constructor that initializes the data.
    Definition supermatrix.hh:212
    \n-
    virtual void setMatrix(const Matrix &mat)
    Initialize data from given matrix.
    Definition supermatrix.hh:293
    \n-
    SuperLUMatrix()
    Definition supermatrix.hh:215
    \n-
    Matrix::size_type size_type
    Definition supermatrix.hh:206
    \n-
    BCRSMatrix< B, TA > Matrix
    The type of the matrix to convert.
    Definition supermatrix.hh:202
    \n-
    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
    \n-
    virtual ~SuperLUMatrix()
    Destructor.
    Definition supermatrix.hh:219
    \n-
    Dune::SuperLUMatrix< Matrix > SuperLUMatrix
    Definition supermatrix.hh:320
    \n-
    BCRSMatrix< B, A > Matrix
    Definition supermatrix.hh:319
    \n-
    SuperMatrixInitializer()
    Definition supermatrix.hh:326
    \n-
    virtual void createMatrix() const
    Definition supermatrix.hh:329
    \n-
    SuperMatrixInitializer(SuperLUMatrix &lum)
    Definition supermatrix.hh:322
    \n+
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    Error specific to BCRSMatrix.
    Definition istlexception.hh:24
    \n+
    Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted.
    Definition istlexception.hh:37
    \n+
    Thrown when a solver aborts due to some problem.
    Definition istlexception.hh:46
    \n+
    Error when performing an operation on a matrix block.
    Definition istlexception.hh:52
    \n+
    int c
    Definition istlexception.hh:54
    \n+
    int r
    Definition istlexception.hh:54
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,461 +1,69 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-supermatrix.hh\n+istlexception.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_SUPERMATRIX_HH\n-6#define DUNE_ISTL_SUPERMATRIX_HH\n+5#ifndef DUNE_ISTL_ISTLEXCEPTION_HH\n+6#define DUNE_ISTL_ISTLEXCEPTION_HH\n 7\n-8#if HAVE_SUPERLU\n-9\n-10#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-11#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-12#include \n-13#include \n-14#include \n-15#include \n-16\n-17#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n-18\n-19#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\n+8#include \n+9#include \n+10\n+11namespace _\bD_\bu_\bn_\be {\n+12\n+_\b1_\b9 class _\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br : public Dune::MathError {};\n 20\n-21namespace _\bD_\bu_\bn_\be\n-22{\n-23\n-24 template\n-_\b2_\b5 struct _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n-26 {};\n-27\n-28 template\n-_\b2_\b9 struct _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\bi_\bn_\bt_\be_\br\n-30 {};\n-31\n-32#if __has_include(\"slu_sdefs.h\")\n-33 template<>\n-34 struct _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n-35 {\n-36 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, int offset,\n-37 float *values, int *rowindex, int* colindex,\n-38 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n-39 {\n-40 sCreate_CompCol_Matrix(_\bm_\ba_\bt, n, m, offset, values, rowindex, colindex,\n-41 stype, dtype, mtype);\n-42 }\n-43 };\n-44\n-45 template<>\n-46 struct SuperMatrixPrinter\n-47 {\n-48 static void print(char* name, SuperMatrix* _\bm_\ba_\bt)\n-49 {\n-50 sPrint_CompCol_Matrix(name, _\bm_\ba_\bt);\n-51 }\n-52 };\n-53#endif\n-54\n-55#if __has_include(\"slu_ddefs.h\")\n-56 template<>\n-57 struct SuperMatrixCreateSparseChooser\n-58 {\n-59 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, int offset,\n-60 double *values, int *rowindex, int* colindex,\n-61 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n-62 {\n-63 dCreate_CompCol_Matrix(_\bm_\ba_\bt, n, m, offset, values, rowindex, colindex,\n-64 stype, dtype, mtype);\n-65 }\n-66 };\n-67\n-68 template<>\n-69 struct SuperMatrixPrinter\n-70 {\n-71 static void print(char* name, SuperMatrix* _\bm_\ba_\bt)\n-72 {\n-73 dPrint_CompCol_Matrix(name, _\bm_\ba_\bt);\n-74 }\n-75 };\n-76#endif\n-77\n-78#if __has_include(\"slu_cdefs.h\")\n-79 template<>\n-80 struct SuperMatrixCreateSparseChooser<_\bs_\bt_\bd::complex >\n-81 {\n-82 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, int offset,\n-83 std::complex *values, int *rowindex, int* colindex,\n-84 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n-85 {\n-86 cCreate_CompCol_Matrix(_\bm_\ba_\bt, n, m, offset, reinterpret_cast< ::complex*>\n-(values),\n-87 rowindex, colindex, stype, dtype, mtype);\n-88 }\n-89 };\n-90\n-91 template<>\n-92 struct SuperMatrixPrinter<_\bs_\bt_\bd::complex >\n-93 {\n-94 static void print(char* name, SuperMatrix* _\bm_\ba_\bt)\n-95 {\n-96 cPrint_CompCol_Matrix(name, _\bm_\ba_\bt);\n-97 }\n-98 };\n-99#endif\n-100\n-101#if __has_include(\"slu_zdefs.h\")\n-102 template<>\n-103 struct SuperMatrixCreateSparseChooser<_\bs_\bt_\bd::complex >\n-104 {\n-105 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, int offset,\n-106 std::complex *values, int *rowindex, int* colindex,\n-107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n-108 {\n-109 zCreate_CompCol_Matrix(_\bm_\ba_\bt, n, m, offset, reinterpret_cast\n-(values),\n-110 rowindex, colindex, stype, dtype, mtype);\n-111 }\n-112 };\n-113\n-114 template<>\n-115 struct SuperMatrixPrinter<_\bs_\bt_\bd::complex >\n-116 {\n-117 static void print(char* name, SuperMatrix* _\bm_\ba_\bt)\n-118 {\n-119 zPrint_CompCol_Matrix(name, _\bm_\ba_\bt);\n-120 }\n-121 };\n-122#endif\n-123\n-124 template\n-_\b1_\b2_\b5 struct _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n-126 {\n-_\b1_\b2_\b7 static const Dtype_t _\bt_\by_\bp_\be;\n-128 };\n-129\n-130 template\n-_\b1_\b3_\b1 struct _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n-132 {};\n-133\n-134 template\n-135 const Dtype_t _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be =\n-136 std::is_same::value ? SLU_S :\n-137 ( std::is_same >::value ? SLU_Z :\n-138 ( std::is_same >::value ? SLU_C : SLU_D ));\n-139\n-140 template<>\n-_\b1_\b4_\b1 struct _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n-142 : public _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n-143 {\n-_\b1_\b4_\b4 typedef double _\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be;\n-145 };\n-146\n-147 template<>\n-_\b1_\b4_\b8 struct _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n-149 : public _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n-150 {\n-_\b1_\b5_\b1 typedef float _\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be;\n-152 };\n-153\n-154 template<>\n-_\b1_\b5_\b5 struct _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be<_\bs_\bt_\bd::complex >\n-156 : public _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be >\n-157 {\n-_\b1_\b5_\b8 typedef double _\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be;\n-159 };\n-160\n-161 template<>\n-_\b1_\b6_\b2 struct _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be<_\bs_\bt_\bd::complex >\n-163 : public _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be >\n-164 {\n-_\b1_\b6_\b5 typedef float _\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be;\n-166\n-167 };\n-168\n-173 template\n-_\b1_\b7_\b4 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n-175 {};\n-176\n-177 template\n-_\b1_\b7_\b8 struct _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-179 {};\n-180\n-181 template\n-182 class _\bS_\bu_\bp_\be_\br_\bL_\bU;\n-183\n-184 template\n-185 class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n-186\n-187 template\n-188 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br;\n-189\n-193 template\n-_\b1_\b9_\b4 class _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n-195 : public ISTL::Impl::BCCSMatrix::field_type, int>\n-196 {\n-197 template\n-_\b1_\b9_\b8 friend class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n-199 friend struct _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >;\n-200 public:\n-_\b2_\b0_\b2 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n-203\n-204 friend struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bS_\bu_\bp_\be_\br_\bL_\bU<_\bM_\ba_\bt_\br_\bi_\bx>, true>;\n-205\n-_\b2_\b0_\b6 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-207\n-_\b2_\b1_\b2 explicit _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt) : ISTL::Impl::\n-BCCSMatrix<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx, int>(_\bm_\ba_\bt)\n-213 {}\n-214\n-_\b2_\b1_\b5 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx() : ISTL::Impl::BCCSMatrix::\n-field_type, int>()\n-216 {}\n-217\n-_\b2_\b1_\b9 virtual _\b~_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx()\n-220 {\n-221 if (this->N_+this->M_*this->Nnz_ != 0)\n-222 free();\n-223 }\n-224\n-_\b2_\b2_\b6 operator SuperMatrix&()\n-227 {\n-228 return A;\n-229 }\n-230\n-_\b2_\b3_\b2 operator const SuperMatrix&() const\n-233 {\n-234 return A;\n-235 }\n-236\n-_\b2_\b3_\b7 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b> >& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>& _\bm_\ba_\bt)\n-238 {\n-239 if (this->N_ + this->M_ + this->Nnz_!=0)\n-240 free();\n-241\n-242 using _\bM_\ba_\bt_\br_\bi_\bx = _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>;\n-243 this->N_ = _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(_\bm_\ba_\bt);\n-244 this->M_ = _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(_\bm_\ba_\bt);\n-245 ISTL::Impl::BCCSMatrixInitializer initializer(*this);\n-246\n-247 copyToBCCSMatrix(initializer, _\bm_\ba_\bt);\n-248\n-249 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>\n-250_\b _\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&A, this->N_, this->M_, this->colstart[this->N_],\n-251 this->values,this->rowindex, this->colstart, SLU_NC,\n-252 static_cast(_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bt_\by_\bp_\be),\n-SLU_GE);\n-253 return *this;\n-254 }\n-255\n-_\b2_\b5_\b6 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b> >& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n-<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b> >& _\bm_\ba_\bt)\n-257 {\n-258 if (this->N_ + this->M_ + this->Nnz_!=0)\n-259 free();\n-260\n-261 using _\bM_\ba_\bt_\br_\bi_\bx = _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>;\n-262 this->N_ = _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(_\bm_\ba_\bt);\n-263 this->M_ = _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(_\bm_\ba_\bt);\n-264 ISTL::Impl::BCCSMatrixInitializer initializer(*this);\n-265\n-266 copyToBCCSMatrix(initializer, _\bm_\ba_\bt);\n-267\n-268 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bB_\b>\n-269_\b _\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&A, this->N_, this->M_, this->colstart[this->N_],\n-270 this->values,this->rowindex, this->colstart, SLU_NC,\n-271 static_cast(_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bB_\b>_\b:_\b:_\bt_\by_\bp_\be), SLU_GE);\n-272 return *this;\n-273 }\n-274\n-_\b2_\b8_\b1 virtual void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt, const std::set& mrs)\n-282 {\n-283 if(this->N_+this->M_+this->Nnz_!=0)\n-284 free();\n-285 this->N_=mrs.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(*\n-(_\bm_\ba_\bt[0].begin()));\n-286 this->M_=mrs.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(*\n-(_\bm_\ba_\bt[0].begin()));\n-287 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> initializer(*this);\n-288\n-289 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_\bM_\ba_\bt_\br_\bi_\bx,std::\n-set >(_\bm_\ba_\bt,mrs));\n-290 }\n-291\n-_\b2_\b9_\b3 virtual void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt)\n-294 {\n-295 this->N_=_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(_\bm_\ba_\bt);\n-296 this->M_=_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(_\bm_\ba_\bt);\n-297 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> initializer(*this);\n-298\n-299 copyToBCCSMatrix(initializer, _\bm_\ba_\bt);\n-300 }\n-301\n-_\b3_\b0_\b3 virtual void _\bf_\br_\be_\be()\n-304 {\n-305 ISTL::Impl::BCCSMatrix::field_type, int>::free();\n-306 SUPERLU_FREE(A.Store);\n-307 }\n-308 private:\n-309 SuperMatrix A;\n-310 };\n-311\n-312 template\n-_\b3_\b1_\b3 class _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n-314 : public ISTL::Impl::BCCSMatrixInitializer, int>\n-315 {\n-316 template\n-_\b3_\b1_\b7 friend class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n-318 public:\n-_\b3_\b1_\b9 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b3_\b2_\b0 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx;\n-321\n-_\b3_\b2_\b2 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br(_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx& lum) : ISTL::Impl::\n-BCCSMatrixInitializer<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx, int>(lum)\n-323 ,slumat(&lum)\n-324 {}\n-325\n-_\b3_\b2_\b6 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br() : ISTL::Impl::\n-BCCSMatrixInitializer<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx, int>()\n-327 {}\n-328\n-_\b3_\b2_\b9 virtual void _\bc_\br_\be_\ba_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx() const\n-330 {\n-331 ISTL::Impl::BCCSMatrixInitializer, int>::createMatrix();\n-332 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>\n-333_\b _\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&slumat->A, slumat->N_, slumat->M_, slumat->colstart[this->cols],\n-334 slumat->values,slumat->rowindex, slumat->colstart, SLU_NC,\n-335 static_cast(_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bt_\by_\bp_\be),\n-SLU_GE);\n-336 }\n-337 private:\n-338 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx* slumat;\n-339 };\n-340}\n-341#endif // HAVE_SUPERLU\n-342#endif\n-_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implementation of the BCRSMatrix class.\n-_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n-_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh\n-_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-This file implements a vector space as a tensor product of a given vector\n-space. The number of compon...\n-_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n-_\bs_\bt_\bd\n-STL namespace.\n+_\b2_\b2 class _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n+23 : public _\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+24 {};\n+25\n+_\b3_\b5 class _\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd\n+36 : public _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n+37 {};\n+38\n+40\n+_\b4_\b6 class _\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt : public _\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br {};\n+47\n+49\n+_\b5_\b2 class _\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br : public virtual Dune::FMatrixError {\n+53 public:\n+_\b5_\b4 int _\br, _\bc; // row and column index of the entry from which the error resulted\n+55 };\n+56\n+59} // end namespace\n+60\n+61#endif\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-Initializer for SuperLU Matrices representing the subdomains.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static auto coldim(const M &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static auto rowdim(const M &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:214\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-The type for the index access and the size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n-Sequential overlapping Schwarz preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU\n-SuperLu Solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:271\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:26\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\bi_\bn_\bt_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b:_\b:_\bt_\by_\bp_\be\n-static const Dtype_t type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:127\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be\n-double float_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:144\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be\n-float float_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be\n-double float_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b _\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be\n-float float_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:165\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n-Utility class for converting an ISTL Matrix into a SuperLU Matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:175\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:179\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\br_\be_\be\n-virtual void free()\n-free allocated space.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:303\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const SuperLUMatrix<\n-BCRSMatrix< B, TA > > &mat)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:256\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const BCRSMatrix< B, TA >\n-&mat)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:237\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n-SuperLUMatrix(const Matrix &mat)\n-Constructor that initializes the data.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:212\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-virtual void setMatrix(const Matrix &mat)\n-Initialize data from given matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n-SuperLUMatrix()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:215\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:206\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix< B, TA > Matrix\n-The type of the matrix to convert.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:202\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-virtual void setMatrix(const Matrix &mat, const std::set< std::size_t > &mrs)\n-Initialize data from a given set of matrix rows and columns.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:281\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\b~_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n-virtual ~SuperLUMatrix()\n-Destructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n-Dune::SuperLUMatrix< Matrix > SuperLUMatrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:320\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix< B, A > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:319\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-SuperMatrixInitializer()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:326\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx\n-virtual void createMatrix() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:329\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-SuperMatrixInitializer(SuperLUMatrix &lum)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:322\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+derive error class from the base class in common\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n+Error specific to BCRSMatrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd\n+Thrown when the compression buffer used by the implicit BCRSMatrix construction\n+is exhausted.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt\n+Thrown when a solver aborts due to some problem.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br\n+Error when performing an operation on a matrix block.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br_\b:_\b:_\bc\n+int c\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br_\b:_\b:_\br\n+int r\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:54\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00017.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00017.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: gsetc.hh File Reference\n+dune-istl: multitypeblockmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -72,195 +72,66 @@\n
  • dune
  • istl
  • \n
    \n \n
    \n \n-
    gsetc.hh File Reference
    \n+
    multitypeblockmatrix.hh File Reference
    \n
    \n
    \n-\n-

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

    \n
    #include <cmath>
    \n-#include <complex>
    \n #include <iostream>
    \n-#include <iomanip>
    \n-#include <string>
    \n+#include <tuple>
    \n #include <dune/common/hybridutilities.hh>
    \n-#include "multitypeblockvector.hh"
    \n-#include "multitypeblockmatrix.hh"
    \n-#include "istlexception.hh"
    \n+#include "istlexception.hh"
    \n+#include "gsetc.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n-\n+\n \n-\n+\n+\n \n-\n+\n \n-\n+\n+\n \n-\n+\n \n-\n+\n+\n \n-\n-\n-\n+\n+\n \n

    \n Classes

    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 >
    class  Dune::MultiTypeBlockMatrix< FirstRow, Args >
     A Matrix class to support different block types. More...
     
    struct  Dune::algmeta_btsolve< 0, nodiag, withrelax >
    struct  Dune::FieldTraits< MultiTypeBlockMatrix< Rows... > >
     
    struct  Dune::algmeta_btsolve< 0, nodiag, norelax >
    class  Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, remain_col >
     part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types More...
     
    struct  Dune::algmeta_bdsolve< I, relax >
    class  Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, 0 >
     
    struct  Dune::algmeta_bdsolve< 0, withrelax >
    class  Dune::MultiTypeBlockMatrix_Solver< I, crow, remain_row >
     solver for MultiTypeBlockVector & MultiTypeBlockMatrix types More...
     
    struct  Dune::algmeta_bdsolve< 0, norelax >
    class  Dune::MultiTypeBlockMatrix_Solver< I, crow, 0 >
     
    struct  Dune::algmeta_itsteps< I, M >
    struct  std::tuple_element< i, Dune::MultiTypeBlockMatrix< Args... > >
     Make std::tuple_element work for MultiTypeBlockMatrix. More...
     
    struct  Dune::algmeta_itsteps< 0, M >
     
    struct  Dune::algmeta_itsteps< I, MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > >
    struct  std::tuple_size< Dune::MultiTypeBlockMatrix< Args... > >
     Make std::tuple_size work for MultiTypeBlockMatrix. More...
     
    \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n-\n-\n+\n+\n+\n

    \n-Enumerations

    enum  Dune::WithDiagType { Dune::withdiag =1\n-, Dune::nodiag =0\n- }
     
    enum  Dune::WithRelaxType { Dune::withrelax =1\n-, Dune::norelax =0\n- }
     
    namespace  std
     STL namespace.
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n

    \n 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.
     
    template<typename T1 , typename... Args>
    std::ostream & Dune::operator<< (std::ostream &s, const MultiTypeBlockMatrix< T1, Args... > &m)
     << operator for a MultiTypeBlockMatrix
     
    \n-

    Detailed Description

    \n-

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

    \n-
    \n+\n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,173 +1,52 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-gsetc.hh File Reference\n-Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n-generic way. _\bM_\bo_\br_\be_\b._\b._\b.\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+multitypeblockmatrix.hh File Reference\n #include \n-#include \n #include \n-#include \n-#include \n+#include \n #include \n-#include \"_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-#include \"_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n #include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bL_\b<_\b _\bl_\b _\b>\n-\u00a0 compile-time parameter for block recursion depth _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\br_\bs_\bt_\bR_\bo_\bw_\b,_\b _\bA_\br_\bg_\bs_\b _\b>\n+\u00a0 A _\bM_\ba_\bt_\br_\bi_\bx class to support different block types. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\bI_\b,_\b _\bd_\bi_\ba_\bg_\b,_\b _\br_\be_\bl_\ba_\bx_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bR_\bo_\bw_\bs_\b._\b._\b._\b _\b>_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\bc_\bc_\bo_\bl_\b,_\b _\br_\be_\bm_\ba_\bi_\bn_\b__\bc_\bo_\bl_\b _\b>\n+\u00a0 part of solvers for _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br & _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx types\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\bc_\bc_\bo_\bl_\b,_\b _\b0_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b _\b>\n+\u00a0 solver for _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br & _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx types _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\b0_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b _\bI_\b,_\b _\br_\be_\bl_\ba_\bx_\b _\b>\n+struct \u00a0 _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n+\u00a0 Make std::tuple_element work for MultiTypeBlockMatrix. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\b0_\b,_\b _\bM_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,\n- _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n+struct \u00a0 _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\bs_\bi_\bz_\be_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n+\u00a0 Make std::tuple_size work for MultiTypeBlockMatrix. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bW_\bi_\bt_\bh_\bD_\bi_\ba_\bg_\bT_\by_\bp_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg =1 , _\bD_\bu_\bn_\be_\b:_\b:_\bn_\bo_\bd_\bi_\ba_\bg =0 }\n-\u00a0\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bW_\bi_\bt_\bh_\bR_\be_\bl_\ba_\bx_\bT_\by_\bp_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx =1 , _\bD_\bu_\bn_\be_\b:_\b:_\bn_\bo_\br_\be_\bl_\ba_\bx =0 }\n+namespace \u00a0 _\bs_\bt_\bd\n+\u00a0 STL namespace.\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n-\u00a0 block lower triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w)\n-\u00a0 relaxed block lower triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n-\u00a0 unit block lower triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w)\n-\u00a0 relaxed unit block lower triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n-\u00a0 block upper triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w)\n-\u00a0 relaxed block upper triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n-\u00a0 unit block upper triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w)\n-\u00a0 relaxed unit block upper triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, _\bB_\bL< l >)\n-\u00a0 block lower triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w, _\bB_\bL< l >)\n-\u00a0 relaxed block lower triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, _\bB_\bL< l >)\n-\u00a0 unit block lower triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w, _\bB_\bL< l >)\n-\u00a0 relaxed unit block lower triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, _\bB_\bL< l > bl)\n-\u00a0 block upper triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w, _\bB_\bL< l > bl)\n-\u00a0 relaxed block upper triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, _\bB_\bL< l > bl)\n-\u00a0 unit block upper triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w, _\bB_\bL< l > bl)\n-\u00a0 relaxed unit block upper triangular solve\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n-\u00a0 block diagonal solve, no relaxation\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w)\n-\u00a0 block diagonal solve, with relaxation\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, _\bB_\bL< l >)\n-\u00a0 block diagonal solve, no relaxation\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w, _\bB_\bL< l >)\n-\u00a0 block diagonal solve, with relaxation\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bg_\bs (const M &A, X &x, const Y &b, const K &w)\n-\u00a0 GS step.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bg_\bs (const M &A, X &x, const Y &b, const K &w, _\bB_\bL< l >)\n-\u00a0 GS step.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bf (const M &A, X &x, const Y &b, const K &w)\n-\u00a0 SOR step.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bf (const M &A, X &x, const Y &b, const K &w, _\bB_\bL< l >)\n-\u00a0 SOR step.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bb (const M &A, X &x, const Y &b, const K &w)\n-\u00a0 SSOR step.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bb (const M &A, X &x, const Y &b, const K &w, _\bB_\bL< l >)\n-\u00a0 Backward SOR step.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bj_\ba_\bc (const M &A, X &x, const Y &b, const K &w)\n-\u00a0 Jacobi step.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bj_\ba_\bc (const M &A, X &x, const Y &b, const K &w, _\bB_\bL< l >)\n-\u00a0 Jacobi step.\n-\u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n-generic way.\n+template\n+std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &s, const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx<\n+ T1, Args... > &m)\n+\u00a0 << operator for a _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00017_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00017_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: gsetc.hh Source File\n+dune-istl: multitypeblockmatrix.hh Source File\n \n \n \n \n \n \n \n@@ -74,835 +74,683 @@\n \n
    \n \n
    \n \n
    \n-
    gsetc.hh
    \n+
    multitypeblockmatrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_GSETC_HH
    \n-
    6#define DUNE_ISTL_GSETC_HH
    \n+
    5#ifndef DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH
    \n+
    6#define DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH
    \n
    7
    \n
    8#include <cmath>
    \n-
    9#include <complex>
    \n-
    10#include <iostream>
    \n-
    11#include <iomanip>
    \n-
    12#include <string>
    \n+
    9#include <iostream>
    \n+
    10#include <tuple>
    \n+
    11
    \n+
    12#include <dune/common/hybridutilities.hh>
    \n
    13
    \n-
    14#include <dune/common/hybridutilities.hh>
    \n+
    14#include "istlexception.hh"
    \n
    15
    \n-\n-\n-
    18
    \n-
    19#include "istlexception.hh"
    \n-
    20
    \n+
    16// forward declaration
    \n+
    17namespace Dune
    \n+
    18{
    \n+
    19 template<typename FirstRow, typename... Args>
    \n+
    20 class MultiTypeBlockMatrix;
    \n
    21
    \n-
    27namespace Dune {
    \n-
    28
    \n-
    39 //============================================================
    \n-
    40 // parameter types
    \n-
    41 //============================================================
    \n-
    42
    \n-
    44 template<int l>
    \n-
    \n-
    45 struct BL {
    \n-
    46 enum {recursion_level = l};
    \n-
    47 };
    \n-
    \n-
    48
    \n-
    \n-\n-\n-
    51 nodiag=0
    \n-
    52 };
    \n-
    \n-
    53
    \n-
    \n-\n-\n-
    56 norelax=0
    \n-
    57 };
    \n-
    \n-
    58
    \n-
    59 //============================================================
    \n-
    60 // generic triangular solves
    \n-
    61 // consider block decomposition A = L + D + U
    \n-
    62 // we can invert L, L+D, U, U+D
    \n-
    63 // we can apply relaxation or not
    \n-
    64 // we can recurse over a fixed number of levels
    \n-
    65 //============================================================
    \n-
    66
    \n-
    67 // template meta program for triangular solves
    \n-
    68 template<int I, WithDiagType diag, WithRelaxType relax>
    \n-
    \n-\n-
    70 template<class M, class X, class Y, class K>
    \n-
    \n-
    71 static void bltsolve (const M& A, X& v, const Y& d, const K& w)
    \n-
    72 {
    \n-
    73 // iterator types
    \n-
    74 typedef typename M::ConstRowIterator rowiterator;
    \n-
    75 typedef typename M::ConstColIterator coliterator;
    \n-
    76 typedef typename Y::block_type bblock;
    \n-
    77
    \n-
    78 // local solve at each block and immediate update
    \n-
    79 rowiterator endi=A.end();
    \n-
    80 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n-
    81 {
    \n-
    82 bblock rhs(d[i.index()]);
    \n-
    83 coliterator j;
    \n-
    84 for (j=(*i).begin(); j.index()<i.index(); ++j)
    \n-
    85 (*j).mmv(v[j.index()],rhs);
    \n-
    86 algmeta_btsolve<I-1,diag,relax>::bltsolve(*j,v[i.index()],rhs,w);
    \n-
    87 }
    \n-
    88 }
    \n+
    22 template<int I, int crow, int remain_row>
    \n+
    23 class MultiTypeBlockMatrix_Solver;
    \n+
    24}
    \n+
    25
    \n+
    26#include "gsetc.hh"
    \n+
    27
    \n+
    28namespace Dune {
    \n+
    29
    \n+
    43 template<typename FirstRow, typename... Args>
    \n+
    \n+\n+
    45 : public std::tuple<FirstRow, Args...>
    \n+
    46 {
    \n+
    47 using ParentType = std::tuple<FirstRow, Args...>;
    \n+
    48 public:
    \n+
    49
    \n+
    51 using ParentType::ParentType;
    \n+
    52
    \n+
    56 typedef MultiTypeBlockMatrix<FirstRow, Args...> type;
    \n+
    57
    \n+
    59 using size_type = std::size_t;
    \n+
    60
    \n+
    66 using field_type = Std::detected_t<std::common_type_t,
    \n+
    67 typename FieldTraits<FirstRow>::field_type, typename FieldTraits<Args>::field_type...>;
    \n+
    68
    \n+
    74 using real_type = Std::detected_t<std::common_type_t,
    \n+
    75 typename FieldTraits<FirstRow>::real_type, typename FieldTraits<Args>::real_type...>;
    \n+
    76
    \n+
    77 // make sure that we have an std::common_type: using an assertion produces a more readable error message
    \n+
    78 // than a compiler template instantiation error
    \n+
    79 static_assert ( sizeof...(Args) == 0 or
    \n+
    80 not (std::is_same_v<field_type, Std::nonesuch> or std::is_same_v<real_type, Std::nonesuch>),
    \n+
    81 "No std::common_type implemented for the given field_type/real_type of the Args. Please provide an implementation and check that a FieldTraits class is present for your type.");
    \n+
    82
    \n+
    \n+
    84 static constexpr size_type N()
    \n+
    85 {
    \n+
    86 return 1+sizeof...(Args);
    \n+
    87 }
    \n
    \n-
    89 template<class M, class X, class Y, class K>
    \n+
    88
    \n
    \n-
    90 static void butsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    90 static constexpr size_type M()
    \n
    91 {
    \n-
    92 // iterator types
    \n-
    93 typedef typename M::ConstRowIterator rowiterator;
    \n-
    94 typedef typename M::ConstColIterator coliterator;
    \n-
    95 typedef typename Y::block_type bblock;
    \n-
    96
    \n-
    97 // local solve at each block and immediate update
    \n-
    98 rowiterator rendi=A.beforeBegin();
    \n-
    99 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
    \n-
    100 {
    \n-
    101 bblock rhs(d[i.index()]);
    \n-
    102 coliterator j;
    \n-
    103 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)
    \n-
    104 (*j).mmv(v[j.index()],rhs);
    \n-
    105 algmeta_btsolve<I-1,diag,relax>::butsolve(*j,v[i.index()],rhs,w);
    \n-
    106 }
    \n-
    107 }
    \n-
    \n-
    108 };
    \n-
    \n-
    109
    \n-
    110 // recursion end ...
    \n-
    111 template<>
    \n-
    \n-\n-
    113 template<class M, class X, class Y, class K>
    \n-
    \n-
    114 static void bltsolve (const M& A, X& v, const Y& d, const K& w)
    \n-
    115 {
    \n-
    116 A.solve(v,d);
    \n-
    117 v *= w;
    \n-
    118 }
    \n-
    \n-
    119 template<class M, class X, class Y, class K>
    \n-
    \n-
    120 static void butsolve (const M& A, X& v, const Y& d, const K& w)
    \n-
    121 {
    \n-
    122 A.solve(v,d);
    \n-
    123 v *= w;
    \n-
    124 }
    \n-
    \n-
    125 };
    \n-
    \n-
    126 template<>
    \n-
    \n-\n-
    128 template<class M, class X, class Y, class K>
    \n-
    \n-
    129 static void bltsolve (const M& A, X& v, const Y& d, const K& /*w*/)
    \n-
    130 {
    \n-
    131 A.solve(v,d);
    \n-
    132 }
    \n-
    \n-
    133 template<class M, class X, class Y, class K>
    \n-
    \n-
    134 static void butsolve (const M& A, X& v, const Y& d, const K& /*w*/)
    \n-
    135 {
    \n-
    136 A.solve(v,d);
    \n-
    137 }
    \n-
    \n-
    138 };
    \n-
    \n-
    139 template<>
    \n-
    \n-\n-
    141 template<class M, class X, class Y, class K>
    \n-
    \n-
    142 static void bltsolve (const M& /*A*/, X& v, const Y& d, const K& w)
    \n-
    143 {
    \n-
    144 v = d;
    \n-
    145 v *= w;
    \n-
    146 }
    \n-
    \n-
    147 template<class M, class X, class Y, class K>
    \n-
    \n-
    148 static void butsolve (const M& /*A*/, X& v, const Y& d, const K& w)
    \n-
    149 {
    \n-
    150 v = d;
    \n-
    151 v *= w;
    \n-
    152 }
    \n-
    \n-
    153 };
    \n-
    \n-
    154 template<>
    \n-
    \n-\n-
    156 template<class M, class X, class Y, class K>
    \n-
    \n-
    157 static void bltsolve (const M& /*A*/, X& v, const Y& d, const K& /*w*/)
    \n-
    158 {
    \n-
    159 v = d;
    \n-
    160 }
    \n-
    \n-
    161 template<class M, class X, class Y, class K>
    \n-
    \n-
    162 static void butsolve (const M& /*A*/, X& v, const Y& d, const K& /*w*/)
    \n-
    163 {
    \n-
    164 v = d;
    \n-
    165 }
    \n+
    92 return FirstRow::size();
    \n+
    93 }
    \n
    \n-
    166 };
    \n+
    94
    \n+
    111 template< size_type index >
    \n+
    112 auto
    \n+
    \n+
    113 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable)
    \n+
    114 -> decltype(std::get<index>(*this))
    \n+
    115 {
    \n+
    116 return std::get<index>(*this);
    \n+
    117 }
    \n
    \n+
    118
    \n+
    124 template< size_type index >
    \n+
    125 auto
    \n+
    \n+
    126 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable) const
    \n+
    127 -> decltype(std::get<index>(*this))
    \n+
    128 {
    \n+
    129 return std::get<index>(*this);
    \n+
    130 }
    \n+
    \n+
    131
    \n+
    135 template<typename T>
    \n+
    \n+
    136 void operator= (const T& newval) {
    \n+
    137 using namespace Dune::Hybrid;
    \n+
    138 auto size = index_constant<1+sizeof...(Args)>();
    \n+
    139 // Since Dune::Hybrid::size(MultiTypeBlockMatrix) is not implemented,
    \n+
    140 // we cannot use a plain forEach(*this, ...). This could be achieved,
    \n+
    141 // e.g., by implementing a static size() method.
    \n+
    142 forEach(integralRange(size), [&](auto&& i) {
    \n+
    143 (*this)[i] = newval;
    \n+
    144 });
    \n+
    145 }
    \n+
    \n+
    146
    \n+
    147 //===== vector space arithmetic
    \n+
    148
    \n+
    \n+\n+
    151 {
    \n+
    152 auto size = index_constant<N()>();
    \n+
    153 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
    \n+
    154 (*this)[i] *= k;
    \n+
    155 });
    \n+
    156
    \n+
    157 return *this;
    \n+
    158 }
    \n+
    \n+
    159
    \n+
    \n+\n+
    162 {
    \n+
    163 auto size = index_constant<N()>();
    \n+
    164 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
    \n+
    165 (*this)[i] /= k;
    \n+
    166 });
    \n
    167
    \n-
    168
    \n-
    169 // user calls
    \n+
    168 return *this;
    \n+
    169 }
    \n+
    \n
    170
    \n-
    171 // default block recursion level = 1
    \n-
    172
    \n-
    174 template<class M, class X, class Y>
    \n-
    \n-
    175 void bltsolve (const M& A, X& v, const Y& d)
    \n-
    176 {
    \n-
    177 typename X::field_type w=1;
    \n-\n-
    179 }
    \n-
    \n-
    181 template<class M, class X, class Y, class K>
    \n-
    \n-
    182 void bltsolve (const M& A, X& v, const Y& d, const K& w)
    \n-
    183 {
    \n-\n-
    185 }
    \n-
    \n-
    187 template<class M, class X, class Y>
    \n-
    \n-
    188 void ubltsolve (const M& A, X& v, const Y& d)
    \n-
    189 {
    \n-
    190 typename X::field_type w=1;
    \n-\n-
    192 }
    \n-
    \n-
    194 template<class M, class X, class Y, class K>
    \n-
    \n-
    195 void ubltsolve (const M& A, X& v, const Y& d, const K& w)
    \n-
    196 {
    \n-\n-
    198 }
    \n-
    \n-
    199
    \n-
    201 template<class M, class X, class Y>
    \n-
    \n-
    202 void butsolve (const M& A, X& v, const Y& d)
    \n-
    203 {
    \n-
    204 typename X::field_type w=1;
    \n-\n-
    206 }
    \n-
    \n-
    208 template<class M, class X, class Y, class K>
    \n-
    \n-
    209 void butsolve (const M& A, X& v, const Y& d, const K& w)
    \n-
    210 {
    \n-\n-
    212 }
    \n+
    171
    \n+
    \n+\n+
    178 {
    \n+
    179 auto size = index_constant<N()>();
    \n+
    180 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
    \n+
    181 (*this)[i] += b[i];
    \n+
    182 });
    \n+
    183
    \n+
    184 return *this;
    \n+
    185 }
    \n+
    \n+
    186
    \n+
    \n+\n+
    193 {
    \n+
    194 auto size = index_constant<N()>();
    \n+
    195 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
    \n+
    196 (*this)[i] -= b[i];
    \n+
    197 });
    \n+
    198
    \n+
    199 return *this;
    \n+
    200 }
    \n+
    \n+
    201
    \n+
    204 template<typename X, typename Y>
    \n+
    \n+
    205 void mv (const X& x, Y& y) const {
    \n+
    206 static_assert(X::size() == M(), "length of x does not match row length");
    \n+
    207 static_assert(Y::size() == N(), "length of y does not match row count");
    \n+
    208 y = 0; //reset y (for mv uses umv)
    \n+
    209 umv(x,y);
    \n+
    210 }
    \n
    \n-
    214 template<class M, class X, class Y>
    \n+
    211
    \n+
    214 template<typename X, typename Y>
    \n
    \n-
    215 void ubutsolve (const M& A, X& v, const Y& d)
    \n-
    216 {
    \n-
    217 typename X::field_type w=1;
    \n-\n-
    219 }
    \n-
    \n-
    221 template<class M, class X, class Y, class K>
    \n-
    \n-
    222 void ubutsolve (const M& A, X& v, const Y& d, const K& w)
    \n-
    223 {
    \n-\n-
    225 }
    \n+
    215 void umv (const X& x, Y& y) const {
    \n+
    216 static_assert(X::size() == M(), "length of x does not match row length");
    \n+
    217 static_assert(Y::size() == N(), "length of y does not match row count");
    \n+
    218 using namespace Dune::Hybrid;
    \n+
    219 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n+
    220 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    221 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n+
    222 (*this)[i][j].umv(x[j], y[i]);
    \n+
    223 });
    \n+
    224 });
    \n+
    225 }
    \n
    \n
    226
    \n-
    227 // general block recursion level >= 0
    \n-
    228
    \n-
    230 template<class M, class X, class Y, int l>
    \n-
    \n-
    231 void bltsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
    \n-
    232 {
    \n-
    233 typename X::field_type w=1;
    \n-\n-
    235 }
    \n-
    \n-
    237 template<class M, class X, class Y, class K, int l>
    \n-
    \n-
    238 void bltsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
    \n-
    239 {
    \n-\n-
    241 }
    \n-
    \n-
    243 template<class M, class X, class Y, int l>
    \n-
    \n-
    244 void ubltsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
    \n-
    245 {
    \n-
    246 typename X::field_type w=1;
    \n-\n-
    248 }
    \n-
    \n-
    250 template<class M, class X, class Y, class K, int l>
    \n-
    \n-
    251 void ubltsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
    \n-
    252 {
    \n-\n-
    254 }
    \n-
    \n-
    255
    \n-
    257 template<class M, class X, class Y, int l>
    \n-
    \n-
    258 void butsolve (const M& A, X& v, const Y& d, BL<l> bl)
    \n-
    259 {
    \n-
    260 typename X::field_type w=1;
    \n-\n-
    262 }
    \n-
    \n-
    264 template<class M, class X, class Y, class K, int l>
    \n-
    \n-
    265 void butsolve (const M& A, X& v, const Y& d, const K& w, BL<l> bl)
    \n-
    266 {
    \n-\n-
    268 }
    \n-
    \n-
    270 template<class M, class X, class Y, int l>
    \n-
    \n-
    271 void ubutsolve (const M& A, X& v, const Y& d, BL<l> bl)
    \n-
    272 {
    \n-
    273 typename X::field_type w=1;
    \n-\n-
    275 }
    \n-
    \n-
    277 template<class M, class X, class Y, class K, int l>
    \n-
    \n-
    278 void ubutsolve (const M& A, X& v, const Y& d, const K& w, BL<l> bl)
    \n-
    279 {
    \n-\n-
    281 }
    \n-
    \n-
    282
    \n-
    283
    \n-
    284
    \n-
    285 //============================================================
    \n-
    286 // generic block diagonal solves
    \n-
    287 // consider block decomposition A = L + D + U
    \n-
    288 // we can apply relaxation or not
    \n-
    289 // we can recurse over a fixed number of levels
    \n-
    290 //============================================================
    \n-
    291
    \n-
    292 // template meta program for diagonal solves
    \n-
    293 template<int I, WithRelaxType relax>
    \n-
    \n-\n-
    295 template<class M, class X, class Y, class K>
    \n-
    \n-
    296 static void bdsolve (const M& A, X& v, const Y& d, const K& w)
    \n-
    297 {
    \n-
    298 // iterator types
    \n-
    299 typedef typename M::ConstRowIterator rowiterator;
    \n-
    300 typedef typename M::ConstColIterator coliterator;
    \n-
    301
    \n-
    302 // local solve at each block and immediate update
    \n-
    303 rowiterator rendi=A.beforeBegin();
    \n-
    304 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
    \n-
    305 {
    \n-
    306 coliterator ii=(*i).find(i.index());
    \n-
    307 algmeta_bdsolve<I-1,relax>::bdsolve(*ii,v[i.index()],d[i.index()],w);
    \n-
    308 }
    \n-
    309 }
    \n-
    \n-
    310 };
    \n+
    229 template<typename X, typename Y>
    \n+
    \n+
    230 void mmv (const X& x, Y& y) const {
    \n+
    231 static_assert(X::size() == M(), "length of x does not match row length");
    \n+
    232 static_assert(Y::size() == N(), "length of y does not match row count");
    \n+
    233 using namespace Dune::Hybrid;
    \n+
    234 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n+
    235 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    236 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n+
    237 (*this)[i][j].mmv(x[j], y[i]);
    \n+
    238 });
    \n+
    239 });
    \n+
    240 }
    \n+
    \n+
    241
    \n+
    244 template<typename AlphaType, typename X, typename Y>
    \n+
    \n+
    245 void usmv (const AlphaType& alpha, const X& x, Y& y) const {
    \n+
    246 static_assert(X::size() == M(), "length of x does not match row length");
    \n+
    247 static_assert(Y::size() == N(), "length of y does not match row count");
    \n+
    248 using namespace Dune::Hybrid;
    \n+
    249 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n+
    250 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    251 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n+
    252 (*this)[i][j].usmv(alpha, x[j], y[i]);
    \n+
    253 });
    \n+
    254 });
    \n+
    255 }
    \n+
    \n+
    256
    \n+
    259 template<typename X, typename Y>
    \n+
    \n+
    260 void mtv (const X& x, Y& y) const {
    \n+
    261 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n+
    262 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n+
    263 y = 0;
    \n+
    264 umtv(x,y);
    \n+
    265 }
    \n+
    \n+
    266
    \n+
    269 template<typename X, typename Y>
    \n+
    \n+
    270 void umtv (const X& x, Y& y) const {
    \n+
    271 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n+
    272 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n+
    273 using namespace Dune::Hybrid;
    \n+
    274 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n+
    275 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    276 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n+
    277 (*this)[j][i].umtv(x[j], y[i]);
    \n+
    278 });
    \n+
    279 });
    \n+
    280 }
    \n+
    \n+
    281
    \n+
    284 template<typename X, typename Y>
    \n+
    \n+
    285 void mmtv (const X& x, Y& y) const {
    \n+
    286 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n+
    287 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n+
    288 using namespace Dune::Hybrid;
    \n+
    289 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n+
    290 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    291 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n+
    292 (*this)[j][i].mmtv(x[j], y[i]);
    \n+
    293 });
    \n+
    294 });
    \n+
    295 }
    \n+
    \n+
    296
    \n+
    299 template<typename X, typename Y>
    \n+
    \n+
    300 void usmtv (const field_type& alpha, const X& x, Y& y) const {
    \n+
    301 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n+
    302 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n+
    303 using namespace Dune::Hybrid;
    \n+
    304 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n+
    305 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    306 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n+
    307 (*this)[j][i].usmtv(alpha, x[j], y[i]);
    \n+
    308 });
    \n+
    309 });
    \n+
    310 }
    \n
    \n
    311
    \n-
    312 // recursion end ...
    \n-
    313 template<>
    \n-
    \n-\n-
    315 template<class M, class X, class Y, class K>
    \n-
    \n-
    316 static void bdsolve (const M& A, X& v, const Y& d, const K& w)
    \n-
    317 {
    \n-
    318 A.solve(v,d);
    \n-
    319 v *= w;
    \n-
    320 }
    \n-
    \n-
    321 };
    \n-
    \n-
    322 template<>
    \n-
    \n-\n-
    324 template<class M, class X, class Y, class K>
    \n-
    \n-
    325 static void bdsolve (const M& A, X& v, const Y& d, const K& /*w*/)
    \n-
    326 {
    \n-
    327 A.solve(v,d);
    \n-
    328 }
    \n-
    \n-
    329 };
    \n-
    \n-
    330
    \n-
    331 // user calls
    \n-
    332
    \n-
    333 // default block recursion level = 1
    \n-
    334
    \n-
    336 template<class M, class X, class Y>
    \n-
    \n-
    337 void bdsolve (const M& A, X& v, const Y& d)
    \n-
    338 {
    \n-
    339 typename X::field_type w=1;
    \n-\n-
    341 }
    \n-
    \n-
    343 template<class M, class X, class Y, class K>
    \n-
    \n-
    344 void bdsolve (const M& A, X& v, const Y& d, const K& w)
    \n-
    345 {
    \n-\n-
    347 }
    \n-
    \n-
    348
    \n-
    349 // general block recursion level >= 0
    \n-
    350
    \n-
    352 template<class M, class X, class Y, int l>
    \n-
    \n-
    353 void bdsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
    \n-
    354 {
    \n-
    355 typename X::field_type w=1;
    \n-\n-
    357 }
    \n-
    \n-
    359 template<class M, class X, class Y, class K, int l>
    \n-
    \n-
    360 void bdsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
    \n-
    361 {
    \n-\n-
    363 }
    \n-
    \n+
    314 template<typename X, typename Y>
    \n+
    \n+
    315 void umhv (const X& x, Y& y) const {
    \n+
    316 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n+
    317 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n+
    318 using namespace Dune::Hybrid;
    \n+
    319 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n+
    320 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    321 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n+
    322 (*this)[j][i].umhv(x[j], y[i]);
    \n+
    323 });
    \n+
    324 });
    \n+
    325 }
    \n+
    \n+
    326
    \n+
    329 template<typename X, typename Y>
    \n+
    \n+
    330 void mmhv (const X& x, Y& y) const {
    \n+
    331 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n+
    332 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n+
    333 using namespace Dune::Hybrid;
    \n+
    334 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n+
    335 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    336 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n+
    337 (*this)[j][i].mmhv(x[j], y[i]);
    \n+
    338 });
    \n+
    339 });
    \n+
    340 }
    \n+
    \n+
    341
    \n+
    344 template<typename X, typename Y>
    \n+
    \n+
    345 void usmhv (const field_type& alpha, const X& x, Y& y) const {
    \n+
    346 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n+
    347 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n+
    348 using namespace Dune::Hybrid;
    \n+
    349 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n+
    350 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    351 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n+
    352 (*this)[j][i].usmhv(alpha, x[j], y[i]);
    \n+
    353 });
    \n+
    354 });
    \n+
    355 }
    \n+
    \n+
    356
    \n+
    357
    \n+
    358 //===== norms
    \n+
    359
    \n+
    \n+\n+
    362 {
    \n+
    363 real_type sum=0;
    \n
    364
    \n-
    365
    \n-
    366 //============================================================
    \n-
    367 // generic steps of iteration methods
    \n-
    368 // Jacobi, Gauss-Seidel, SOR, SSOR
    \n-
    369 // work directly on Ax=b, ie solve M(x^{i+1}-x^i) = w (b-Ax^i)
    \n-
    370 // we can recurse over a fixed number of levels
    \n-
    371 //============================================================
    \n+
    365 auto rows = index_constant<N()>();
    \n+
    366 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
    \n+
    367 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
    \n+
    368 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
    \n+
    369 sum += (*this)[i][j].frobenius_norm2();
    \n+
    370 });
    \n+
    371 });
    \n
    372
    \n-
    373 // template meta program for iterative solver steps
    \n-
    374 template<int I, typename M>
    \n-
    \n-\n-
    376
    \n-
    377 template<class X, class Y, class K>
    \n-
    \n-
    378 static void dbgs (const M& A, X& x, const Y& b, const K& w)
    \n-
    379 {
    \n-
    380 typedef typename M::ConstRowIterator rowiterator;
    \n-
    381 typedef typename M::ConstColIterator coliterator;
    \n-
    382 typedef typename Y::block_type bblock;
    \n-
    383 bblock rhs;
    \n-
    384
    \n-
    385 X xold(x); // remember old x
    \n-
    386
    \n-
    387 rowiterator endi=A.end();
    \n-
    388 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n-
    389 {
    \n-
    390 rhs = b[i.index()]; // rhs = b_i
    \n-
    391 coliterator endj=(*i).end();
    \n-
    392 coliterator j=(*i).begin();
    \n-
    393 if constexpr (IsNumber<typename M::block_type>())
    \n-
    394 {
    \n-
    395 for (; j.index()<i.index(); ++j)
    \n-
    396 rhs -= (*j) * x[j.index()];
    \n-
    397 coliterator diag=j++; // *diag = a_ii and increment coliterator j from a_ii to a_i+1,i to skip diagonal
    \n-
    398 for (; j != endj; ++j)
    \n-
    399 rhs -= (*j) * x[j.index()];
    \n-
    400 x[i.index()] = rhs / (*diag);
    \n-
    401 }
    \n-
    402 else
    \n-
    403 {
    \n-
    404 for (; j.index()<i.index(); ++j) // iterate over a_ij with j < i
    \n-
    405 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
    \n-
    406 coliterator diag=j++; // *diag = a_ii and increment coliterator j from a_ii to a_i+1,i to skip diagonal
    \n-
    407 for (; j != endj; ++j) // iterate over a_ij with j > i
    \n-
    408 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j>i} a_ij * xold_j
    \n-
    409 algmeta_itsteps<I-1,typename M::block_type>::dbgs(*diag,x[i.index()],rhs,w); // if I==1: xnew_i = rhs/a_ii
    \n-
    410 }
    \n-
    411 }
    \n-
    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;
    \n-
    413 x *= w;
    \n-
    414 x.axpy(K(1)-w,xold);
    \n-
    415 }
    \n+
    373 return sum;
    \n+
    374 }
    \n
    \n+
    375
    \n+
    \n+\n+
    378 {
    \n+
    379 return sqrt(frobenius_norm2());
    \n+
    380 }
    \n+
    \n+
    381
    \n+
    \n+\n+
    384 {
    \n+
    385 using std::max;
    \n+
    386 real_type norm=0;
    \n+
    387
    \n+
    388 auto rows = index_constant<N()>();
    \n+
    389 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
    \n+
    390 real_type sum=0;
    \n+
    391 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
    \n+
    392 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
    \n+
    393 sum += (*this)[i][j].infinity_norm();
    \n+
    394 });
    \n+
    395 norm = max(sum, norm);
    \n+
    396 });
    \n+
    397
    \n+
    398 return norm;
    \n+
    399 }
    \n+
    \n+
    400
    \n+
    \n+\n+
    403 {
    \n+
    404 using std::max;
    \n+
    405 real_type norm=0;
    \n+
    406
    \n+
    407 auto rows = index_constant<N()>();
    \n+
    408 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
    \n+
    409 real_type sum=0;
    \n+
    410 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
    \n+
    411 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
    \n+
    412 sum += (*this)[i][j].infinity_norm_real();
    \n+
    413 });
    \n+
    414 norm = max(sum, norm);
    \n+
    415 });
    \n
    416
    \n-
    417 template<class X, class Y, class K>
    \n-
    \n-
    418 static void bsorf (const M& A, X& x, const Y& b, const K& w)
    \n-
    419 {
    \n-
    420 typedef typename M::ConstRowIterator rowiterator;
    \n-
    421 typedef typename M::ConstColIterator coliterator;
    \n-
    422 typedef typename Y::block_type bblock;
    \n-
    423 typedef typename X::block_type xblock;
    \n-
    424 bblock rhs;
    \n-
    425 xblock v;
    \n-
    426
    \n-
    427 // Initialize nested data structure if there are entries
    \n-
    428 if(A.begin()!=A.end())
    \n-
    429 v=x[0];
    \n-
    430
    \n-
    431 rowiterator endi=A.end();
    \n-
    432 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n-
    433 {
    \n-
    434 rhs = b[i.index()]; // rhs = b_i
    \n-
    435 coliterator endj=(*i).end(); // iterate over a_ij with j < i
    \n-
    436 coliterator j=(*i).begin();
    \n-
    437 if constexpr (IsNumber<typename M::block_type>())
    \n-
    438 {
    \n-
    439 for (; j.index()<i.index(); ++j)
    \n-
    440 rhs -= (*j) * x[j.index()]; // rhs -= sum_{j<i} a_ij * xnew_j
    \n-
    441 coliterator diag=j; // *diag = a_ii
    \n-
    442 for (; j!=endj; ++j)
    \n-
    443 rhs -= (*j) * x[j.index()]; // rhs -= sum_{j<i} a_ij * xnew_j
    \n-
    444 v = rhs / (*diag);
    \n-
    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)
    \n-
    446 }
    \n-
    447 else
    \n-
    448 {
    \n-
    449 for (; j.index()<i.index(); ++j)
    \n-
    450 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
    \n-
    451 coliterator diag=j; // *diag = a_ii
    \n-
    452 for (; j!=endj; ++j)
    \n-
    453 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
    \n-
    454 algmeta_itsteps<I-1,typename M::block_type>::bsorf(*diag,v,rhs,w); // if blocksize I==1: v = rhs/a_ii
    \n-
    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)
    \n-
    456 }
    \n-
    457 }
    \n-
    458 }
    \n-
    \n-
    459
    \n-
    460 template<class X, class Y, class K>
    \n-
    \n-
    461 static void bsorb (const M& A, X& x, const Y& b, const K& w)
    \n-
    462 {
    \n-
    463 typedef typename M::ConstRowIterator rowiterator;
    \n-
    464 typedef typename M::ConstColIterator coliterator;
    \n-
    465 typedef typename Y::block_type bblock;
    \n-
    466 typedef typename X::block_type xblock;
    \n-
    467 bblock rhs;
    \n-
    468 xblock v;
    \n-
    469
    \n-
    470 // Initialize nested data structure if there are entries
    \n-
    471 if(A.begin()!=A.end())
    \n-
    472 v=x[0];
    \n-
    473
    \n-
    474 rowiterator endi=A.beforeBegin();
    \n-
    475 for (rowiterator i=A.beforeEnd(); i!=endi; --i)
    \n-
    476 {
    \n-
    477 rhs = b[i.index()];
    \n-
    478 coliterator endj=(*i).end();
    \n-
    479 coliterator j=(*i).begin();
    \n-
    480 if constexpr (IsNumber<typename M::block_type>())
    \n-
    481 {
    \n-
    482 for (; j.index()<i.index(); ++j)
    \n-
    483 rhs -= (*j) * x[j.index()];
    \n-
    484 coliterator diag=j;
    \n-
    485 for (; j!=endj; ++j)
    \n-
    486 rhs -= (*j) * x[j.index()];
    \n-
    487 v = rhs / (*diag);
    \n-
    488 x[i.index()] += w*v;
    \n-
    489 }
    \n-
    490 else
    \n-
    491 {
    \n-
    492 for (; j.index()<i.index(); ++j)
    \n-
    493 j->mmv(x[j.index()],rhs);
    \n-
    494 coliterator diag=j;
    \n-
    495 for (; j!=endj; ++j)
    \n-
    496 j->mmv(x[j.index()],rhs);
    \n-\n-
    498 x[i.index()].axpy(w,v);
    \n-
    499 }
    \n-
    500 }
    \n-
    501 }
    \n-
    \n-
    502
    \n-
    503 template<class X, class Y, class K>
    \n-
    \n-
    504 static void dbjac (const M& A, X& x, const Y& b, const K& w)
    \n-
    505 {
    \n-
    506 typedef typename M::ConstRowIterator rowiterator;
    \n-
    507 typedef typename M::ConstColIterator coliterator;
    \n-
    508 typedef typename Y::block_type bblock;
    \n-
    509 bblock rhs;
    \n-
    510
    \n-
    511 X v(x); // allocate with same size
    \n-
    512
    \n-
    513 rowiterator endi=A.end();
    \n-
    514 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n-
    515 {
    \n-
    516 rhs = b[i.index()];
    \n-
    517 coliterator endj=(*i).end();
    \n-
    518 coliterator j=(*i).begin();
    \n-
    519 if constexpr (IsNumber<typename M::block_type>())
    \n-
    520 {
    \n-
    521 for (; j.index()<i.index(); ++j)
    \n-
    522 rhs -= (*j) * x[j.index()];
    \n-
    523 coliterator diag=j;
    \n-
    524 for (; j!=endj; ++j)
    \n-
    525 rhs -= (*j) * x[j.index()];
    \n-
    526 v[i.index()] = rhs / (*diag);
    \n-
    527 }
    \n-
    528 else
    \n-
    529 {
    \n-
    530 for (; j.index()<i.index(); ++j)
    \n-
    531 j->mmv(x[j.index()],rhs);
    \n-
    532 coliterator diag=j;
    \n-
    533 for (; j!=endj; ++j)
    \n-
    534 j->mmv(x[j.index()],rhs);
    \n-\n-
    536 }
    \n-
    537 }
    \n-
    538 x.axpy(w,v);
    \n-
    539 }
    \n-
    \n-
    540 };
    \n-
    \n-
    541 // end of recursion
    \n-
    542 template<typename M>
    \n-
    \n-
    543 struct algmeta_itsteps<0,M> {
    \n-
    544 template<class X, class Y, class K>
    \n-
    \n-
    545 static void dbgs (const M& A, X& x, const Y& b, const K& /*w*/)
    \n-
    546 {
    \n-
    547 A.solve(x,b);
    \n-
    548 }
    \n-
    \n-
    549 template<class X, class Y, class K>
    \n-
    \n-
    550 static void bsorf (const M& A, X& x, const Y& b, const K& /*w*/)
    \n-
    551 {
    \n-
    552 A.solve(x,b);
    \n-
    553 }
    \n-
    \n-
    554 template<class X, class Y, class K>
    \n-
    \n-
    555 static void bsorb (const M& A, X& x, const Y& b, const K& /*w*/)
    \n-
    556 {
    \n-
    557 A.solve(x,b);
    \n-
    558 }
    \n-
    \n-
    559 template<class X, class Y, class K>
    \n-
    \n-
    560 static void dbjac (const M& A, X& x, const Y& b, const K& /*w*/)
    \n-
    561 {
    \n-
    562 A.solve(x,b);
    \n-
    563 }
    \n+
    417 return norm;
    \n+
    418 }
    \n
    \n-
    564 };
    \n+
    419
    \n+
    420 };
    \n
    \n+
    421
    \n+
    422
    \n+
    426 template <typename... Rows>
    \n+
    \n+
    427 struct FieldTraits< MultiTypeBlockMatrix<Rows...> >
    \n+
    428 {
    \n+
    429 using field_type = typename MultiTypeBlockMatrix<Rows...>::field_type;
    \n+
    430 using real_type = typename MultiTypeBlockMatrix<Rows...>::real_type;
    \n+
    431 };
    \n+
    \n+
    432
    \n+
    433
    \n+
    439 template<typename T1, typename... Args>
    \n+
    \n+
    440 std::ostream& operator<< (std::ostream& s, const MultiTypeBlockMatrix<T1,Args...>& m) {
    \n+
    441 auto N = index_constant<MultiTypeBlockMatrix<T1,Args...>::N()>();
    \n+
    442 auto M = index_constant<MultiTypeBlockMatrix<T1,Args...>::M()>();
    \n+
    443 using namespace Dune::Hybrid;
    \n+
    444 forEach(integralRange(N), [&](auto&& i) {
    \n+
    445 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    446 forEach(integralRange(M), [&](auto&& j) {
    \n+
    447 s << "\\t(" << i << ", " << j << "): \\n" << m[i][j];
    \n+
    448 });
    \n+
    449 });
    \n+
    450 s << std::endl;
    \n+
    451 return s;
    \n+
    452 }
    \n+
    \n+
    453
    \n+
    454 //make algmeta_itsteps known
    \n+
    455 template<int I, typename M>
    \n+
    456 struct algmeta_itsteps;
    \n+
    457
    \n+
    464 template<int I, int crow, int ccol, int remain_col> //MultiTypeBlockMatrix_Solver_Col: iterating over one row
    \n+
    \n+
    465 class MultiTypeBlockMatrix_Solver_Col { //calculating b- A[i][j]*x[j]
    \n+
    466 public:
    \n+
    470 template <typename Trhs, typename TVector, typename TMatrix, typename K>
    \n+
    \n+
    471 static void calc_rhs(const TMatrix& A, TVector& x, TVector& v, Trhs& b, const K& w) {
    \n+
    472 std::get<ccol>( std::get<crow>(A) ).mmv( std::get<ccol>(x), b );
    \n+\n+
    474 }
    \n+
    \n+
    475
    \n+
    476 };
    \n+
    \n+
    477 template<int I, int crow, int ccol> //MultiTypeBlockMatrix_Solver_Col recursion end
    \n+
    \n+
    478 class MultiTypeBlockMatrix_Solver_Col<I,crow,ccol,0> {
    \n+
    479 public:
    \n+
    480 template <typename Trhs, typename TVector, typename TMatrix, typename K>
    \n+
    481 static void calc_rhs(const TMatrix&, TVector&, TVector&, Trhs&, const K&) {}
    \n+
    482 };
    \n+
    \n+
    483
    \n+
    484
    \n+
    485
    \n+
    492 template<int I, int crow, int remain_row>
    \n+
    \n+\n+
    494 public:
    \n+
    495
    \n+
    499 template <typename TVector, typename TMatrix, typename K>
    \n+
    \n+
    500 static void dbgs(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
    \n+
    501 TVector xold(x);
    \n+
    502 xold=x; //store old x values
    \n+\n+
    504 x *= w;
    \n+
    505 x.axpy(1-w,xold); //improve x
    \n+
    506 }
    \n+
    \n+
    507 template <typename TVector, typename TMatrix, typename K>
    \n+
    \n+
    508 static void dbgs(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
    \n+
    509 auto rhs = std::get<crow> (b);
    \n+
    510
    \n+
    511 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
    \n+
    512 //solve on blocklevel I-1
    \n+
    513 using M =
    \n+
    514 typename std::remove_cv<
    \n+
    515 typename std::remove_reference<
    \n+
    516 decltype(std::get<crow>( std::get<crow>(A)))
    \n+
    517 >::type
    \n+
    518 >::type;
    \n+
    519 algmeta_itsteps<I-1,M>::dbgs(std::get<crow>( std::get<crow>(A)), std::get<crow>(x),rhs,w);
    \n+\n+
    521 }
    \n+
    \n+
    522
    \n+
    523
    \n+
    524
    \n+
    528 template <typename TVector, typename TMatrix, typename K>
    \n+
    \n+
    529 static void bsorf(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
    \n+
    530 TVector v;
    \n+
    531 v=x; //use latest x values in right side calculation
    \n+\n+
    533
    \n+
    534 }
    \n+
    \n+
    535 template <typename TVector, typename TMatrix, typename K> //recursion over all matrix rows (A)
    \n+
    \n+
    536 static void bsorf(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
    \n+
    537 auto rhs = std::get<crow> (b);
    \n+
    538
    \n+
    539 MultiTypeBlockMatrix_Solver_Col<I,crow,0,TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
    \n+
    540 //solve on blocklevel I-1
    \n+
    541 using M =
    \n+
    542 typename std::remove_cv<
    \n+
    543 typename std::remove_reference<
    \n+
    544 decltype(std::get<crow>( std::get<crow>(A)))
    \n+
    545 >::type
    \n+
    546 >::type;
    \n+
    547 algmeta_itsteps<I-1,M>::bsorf(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
    \n+
    548 std::get<crow>(x).axpy(w,std::get<crow>(v));
    \n+\n+
    550 }
    \n+
    \n+
    551
    \n+
    555 template <typename TVector, typename TMatrix, typename K>
    \n+
    \n+
    556 static void bsorb(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
    \n+
    557 TVector v;
    \n+
    558 v=x; //use latest x values in right side calculation
    \n+\n+
    560
    \n+
    561 }
    \n+
    \n+
    562 template <typename TVector, typename TMatrix, typename K> //recursion over all matrix rows (A)
    \n+
    \n+
    563 static void bsorb(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
    \n+
    564 auto rhs = std::get<crow> (b);
    \n
    565
    \n-
    566 template<int I, typename T1, typename... MultiTypeMatrixArgs>
    \n-
    \n-
    567 struct algmeta_itsteps<I,MultiTypeBlockMatrix<T1, MultiTypeMatrixArgs...>> {
    \n-
    568 template<
    \n-
    569 typename... MultiTypeVectorArgs,
    \n-
    570 class K>
    \n-
    \n-\n-\n-\n-
    574 const K& w)
    \n-
    575 {
    \n-\n-\n-
    578 }
    \n+
    566 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
    \n+
    567 //solve on blocklevel I-1
    \n+
    568 using M =
    \n+
    569 typename std::remove_cv<
    \n+
    570 typename std::remove_reference<
    \n+
    571 decltype(std::get<crow>( std::get<crow>(A)))
    \n+
    572 >::type
    \n+
    573 >::type;
    \n+
    574 algmeta_itsteps<I-1,M>::bsorb(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
    \n+
    575 std::get<crow>(x).axpy(w,std::get<crow>(v));
    \n+\n+
    577 }
    \n
    \n+
    578
    \n
    579
    \n-
    580 template<
    \n-
    581 typename... MultiTypeVectorArgs,
    \n-
    582 class K>
    \n-\n-
    591
    \n-
    592 template<
    \n-
    593 typename... MultiTypeVectorArgs,
    \n-
    594 class K>
    \n-\n-
    603
    \n-
    604 template<
    \n-
    605 typename... MultiTypeVectorArgs,
    \n-
    606 class K
    \n-
    607 >
    \n-\n-
    616 };
    \n-
    \n-
    617
    \n-
    618 // user calls
    \n-
    619
    \n-
    621 template<class M, class X, class Y, class K>
    \n+
    583 template <typename TVector, typename TMatrix, typename K>
    \n+
    \n+
    584 static void dbjac(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
    \n+
    585 TVector v(x);
    \n+
    586 v=0; //calc new x in v
    \n+\n+
    588 x.axpy(w,v); //improve x
    \n+
    589 }
    \n+
    \n+
    590 template <typename TVector, typename TMatrix, typename K>
    \n+
    \n+
    591 static void dbjac(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
    \n+
    592 auto rhs = std::get<crow> (b);
    \n+
    593
    \n+
    594 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
    \n+
    595 //solve on blocklevel I-1
    \n+
    596 using M =
    \n+
    597 typename std::remove_cv<
    \n+
    598 typename std::remove_reference<
    \n+
    599 decltype(std::get<crow>( std::get<crow>(A)))
    \n+
    600 >::type
    \n+
    601 >::type;
    \n+
    602 algmeta_itsteps<I-1,M>::dbjac(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
    \n+\n+
    604 }
    \n+
    \n+
    605
    \n+
    606
    \n+
    607
    \n+
    608
    \n+
    609 };
    \n+
    \n+
    610 template<int I, int crow> //recursion end for remain_row = 0
    \n+
    \n+\n+
    612 public:
    \n+
    613 template <typename TVector, typename TMatrix, typename K>
    \n+
    \n+
    614 static void dbgs(const TMatrix&, TVector&, TVector&,
    \n+
    615 const TVector&, const K&) {}
    \n+
    \n+
    616
    \n+
    617 template <typename TVector, typename TMatrix, typename K>
    \n+
    \n+
    618 static void bsorf(const TMatrix&, TVector&, TVector&,
    \n+
    619 const TVector&, const K&) {}
    \n+
    \n+
    620
    \n+
    621 template <typename TVector, typename TMatrix, typename K>
    \n
    \n-
    622 void dbgs (const M& A, X& x, const Y& b, const K& w)
    \n-
    623 {
    \n-\n-
    625 }
    \n-
    \n-
    627 template<class M, class X, class Y, class K, int l>
    \n-
    \n-
    628 void dbgs (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
    \n-
    629 {
    \n-\n-
    631 }
    \n-
    \n-
    633 template<class M, class X, class Y, class K>
    \n-
    \n-
    634 void bsorf (const M& A, X& x, const Y& b, const K& w)
    \n-
    635 {
    \n-\n-
    637 }
    \n-
    \n-
    639 template<class M, class X, class Y, class K, int l>
    \n-
    \n-
    640 void bsorf (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
    \n-
    641 {
    \n-\n-
    643 }
    \n-
    \n-
    645 template<class M, class X, class Y, class K>
    \n-
    \n-
    646 void bsorb (const M& A, X& x, const Y& b, const K& w)
    \n-
    647 {
    \n-\n-
    649 }
    \n-
    \n-
    651 template<class M, class X, class Y, class K, int l>
    \n-
    \n-
    652 void bsorb (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
    \n-
    653 {
    \n-\n-
    655 }
    \n-
    \n-
    657 template<class M, class X, class Y, class K>
    \n-
    \n-
    658 void dbjac (const M& A, X& x, const Y& b, const K& w)
    \n-
    659 {
    \n-\n-
    661 }
    \n-
    \n-
    663 template<class M, class X, class Y, class K, int l>
    \n-
    \n-
    664 void dbjac (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
    \n-
    665 {
    \n-\n-
    667 }
    \n-
    \n-
    668
    \n-
    669
    \n-
    672} // end namespace
    \n-
    673
    \n-
    674#endif
    \n-\n-\n-\n+
    622 static void bsorb(const TMatrix&, TVector&, TVector&,
    \n+
    623 const TVector&, const K&) {}
    \n+
    \n+
    624
    \n+
    625 template <typename TVector, typename TMatrix, typename K>
    \n+
    \n+
    626 static void dbjac(const TMatrix&, TVector&, TVector&,
    \n+
    627 const TVector&, const K&) {}
    \n+
    \n+
    628 };
    \n+
    \n+
    629
    \n+
    630} // end namespace Dune
    \n+
    631
    \n+
    632namespace std
    \n+
    633{
    \n+
    638 template <size_t i, typename... Args>
    \n+
    \n+
    639 struct tuple_element<i,Dune::MultiTypeBlockMatrix<Args...> >
    \n+
    640 {
    \n+
    641 using type = typename std::tuple_element<i, std::tuple<Args...> >::type;
    \n+
    642 };
    \n+
    \n+
    643
    \n+
    648 template <typename... Args>
    \n+
    \n+
    649 struct tuple_size<Dune::MultiTypeBlockMatrix<Args...> >
    \n+
    650 : std::integral_constant<std::size_t, sizeof...(Args)>
    \n+
    651 {};
    \n+
    \n+
    652}
    \n+
    653#endif
    \n+\n+
    Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
    \n+
    typename MultiTypeBlockMatrix< Rows... >::field_type field_type
    Definition multitypeblockmatrix.hh:429
    \n+
    MultiTypeBlockMatrix< FirstRow, Args... > type
    Definition multitypeblockmatrix.hh:56
    \n
    static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:584
    \n+
    real_type infinity_norm_real() const
    Bastardized version of the infinity-norm / row-sum norm.
    Definition multitypeblockmatrix.hh:402
    \n+
    MultiTypeBlockMatrix & operator+=(const MultiTypeBlockMatrix &b)
    Add the entries of another matrix to this one.
    Definition multitypeblockmatrix.hh:177
    \n+
    void mv(const X &x, Y &y) const
    y = A x
    Definition multitypeblockmatrix.hh:205
    \n+
    void mmtv(const X &x, Y &y) const
    y -= A^T x
    Definition multitypeblockmatrix.hh:285
    \n+
    void mmhv(const X &x, Y &y) const
    y -= A^H x
    Definition multitypeblockmatrix.hh:330
    \n+
    Std::detected_t< std::common_type_t, typename FieldTraits< FirstRow >::real_type, typename FieldTraits< Args >::real_type... > real_type
    The type used for real values.
    Definition multitypeblockmatrix.hh:75
    \n+
    static void dbgs(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
    Definition multitypeblockmatrix.hh:614
    \n
    static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:500
    \n
    static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:556
    \n+
    void usmhv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^H x
    Definition multitypeblockmatrix.hh:345
    \n+
    void usmv(const AlphaType &alpha, const X &x, Y &y) const
    y += alpha A x
    Definition multitypeblockmatrix.hh:245
    \n+
    MultiTypeBlockMatrix & operator/=(const field_type &k)
    vector space division by scalar
    Definition multitypeblockmatrix.hh:161
    \n+
    real_type infinity_norm() const
    Bastardized version of the infinity-norm / row-sum norm.
    Definition multitypeblockmatrix.hh:383
    \n+
    typename std::tuple_element< i, std::tuple< Args... > >::type type
    Definition multitypeblockmatrix.hh:641
    \n+
    static void dbgs(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:508
    \n+
    static void bsorf(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:536
    \n+
    void umhv(const X &x, Y &y) const
    y += A^H x
    Definition multitypeblockmatrix.hh:315
    \n
    static constexpr size_type N()
    Return the number of matrix rows.
    Definition multitypeblockmatrix.hh:84
    \n+
    void usmtv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^T x
    Definition multitypeblockmatrix.hh:300
    \n+
    void operator=(const T &newval)
    Definition multitypeblockmatrix.hh:136
    \n+
    static void calc_rhs(const TMatrix &, TVector &, TVector &, Trhs &, const K &)
    Definition multitypeblockmatrix.hh:481
    \n+
    void umv(const X &x, Y &y) const
    y += A x
    Definition multitypeblockmatrix.hh:215
    \n+
    static void calc_rhs(const TMatrix &A, TVector &x, TVector &v, Trhs &b, const K &w)
    Definition multitypeblockmatrix.hh:471
    \n
    static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:529
    \n-
    void bltsolve(const M &A, X &v, const Y &d)
    block lower triangular solve
    Definition gsetc.hh:175
    \n-
    WithDiagType
    Definition gsetc.hh:49
    \n-
    void bsorb(const M &A, X &x, const Y &b, const K &w)
    SSOR step.
    Definition gsetc.hh:646
    \n-
    void ubltsolve(const M &A, X &v, const Y &d)
    unit block lower triangular solve
    Definition gsetc.hh:188
    \n-
    void dbjac(const M &A, X &x, const Y &b, const K &w)
    Jacobi step.
    Definition gsetc.hh:658
    \n-
    void dbgs(const M &A, X &x, const Y &b, const K &w)
    GS step.
    Definition gsetc.hh:622
    \n-
    WithRelaxType
    Definition gsetc.hh:54
    \n-
    void bdsolve(const M &A, X &v, const Y &d)
    block diagonal solve, no relaxation
    Definition gsetc.hh:337
    \n-
    void butsolve(const M &A, X &v, const Y &d)
    block upper triangular solve
    Definition gsetc.hh:202
    \n-
    void bsorf(const M &A, X &x, const Y &b, const K &w)
    SOR step.
    Definition gsetc.hh:634
    \n-
    void ubutsolve(const M &A, X &v, const Y &d)
    unit block upper triangular solve
    Definition gsetc.hh:215
    \n-
    @ nodiag
    Definition gsetc.hh:51
    \n-
    @ withdiag
    Definition gsetc.hh:50
    \n-
    @ norelax
    Definition gsetc.hh:56
    \n-
    @ withrelax
    Definition gsetc.hh:55
    \n+
    static void dbjac(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
    Definition multitypeblockmatrix.hh:626
    \n+
    std::size_t size_type
    Type used for sizes.
    Definition multitypeblockmatrix.hh:59
    \n+
    real_type frobenius_norm2() const
    square of frobenius norm, need for block recursion
    Definition multitypeblockmatrix.hh:361
    \n+
    real_type frobenius_norm() const
    frobenius norm: sqrt(sum over squared values of entries)
    Definition multitypeblockmatrix.hh:377
    \n+
    static void bsorb(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
    Definition multitypeblockmatrix.hh:622
    \n+
    MultiTypeBlockMatrix & operator-=(const MultiTypeBlockMatrix &b)
    Subtract the entries of another matrix from this one.
    Definition multitypeblockmatrix.hh:192
    \n+
    typename MultiTypeBlockMatrix< Rows... >::real_type real_type
    Definition multitypeblockmatrix.hh:430
    \n+
    auto operator[](const std::integral_constant< size_type, index > indexVariable) -> decltype(std::get< index >(*this))
    Random-access operator.
    Definition multitypeblockmatrix.hh:113
    \n+
    static void dbjac(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:591
    \n+
    static void bsorf(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
    Definition multitypeblockmatrix.hh:618
    \n+
    void mtv(const X &x, Y &y) const
    y = A^T x
    Definition multitypeblockmatrix.hh:260
    \n+
    static constexpr size_type M()
    Return the number of matrix columns.
    Definition multitypeblockmatrix.hh:90
    \n+
    void mmv(const X &x, Y &y) const
    y -= A x
    Definition multitypeblockmatrix.hh:230
    \n+
    Std::detected_t< std::common_type_t, typename FieldTraits< FirstRow >::field_type, typename FieldTraits< Args >::field_type... > field_type
    The type used for scalars.
    Definition multitypeblockmatrix.hh:67
    \n+
    void umtv(const X &x, Y &y) const
    y += A^T x
    Definition multitypeblockmatrix.hh:270
    \n+
    static void bsorb(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:563
    \n+
    MultiTypeBlockMatrix & operator*=(const field_type &k)
    vector space multiplication with scalar
    Definition multitypeblockmatrix.hh:150
    \n+
    STL namespace.
    \n
    Definition allocator.hh:11
    \n-
    A Vector class to support different block types.
    Definition multitypeblockvector.hh:59
    \n+
    std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
    Send BlockVector to an output stream.
    Definition bvector.hh:583
    \n
    A Matrix class to support different block types.
    Definition multitypeblockmatrix.hh:46
    \n-
    compile-time parameter for block recursion depth
    Definition gsetc.hh:45
    \n-
    @ recursion_level
    Definition gsetc.hh:46
    \n-
    Definition gsetc.hh:69
    \n-
    static void butsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:90
    \n-
    static void bltsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:71
    \n-
    static void bltsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:114
    \n-
    static void butsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:120
    \n-
    static void bltsolve(const M &A, X &v, const Y &d, const K &)
    Definition gsetc.hh:129
    \n-
    static void butsolve(const M &A, X &v, const Y &d, const K &)
    Definition gsetc.hh:134
    \n-
    static void bltsolve(const M &, X &v, const Y &d, const K &w)
    Definition gsetc.hh:142
    \n-
    static void butsolve(const M &, X &v, const Y &d, const K &w)
    Definition gsetc.hh:148
    \n-
    static void bltsolve(const M &, X &v, const Y &d, const K &)
    Definition gsetc.hh:157
    \n-
    static void butsolve(const M &, X &v, const Y &d, const K &)
    Definition gsetc.hh:162
    \n-
    Definition gsetc.hh:294
    \n-
    static void bdsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:296
    \n-
    static void bdsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:316
    \n-
    static void bdsolve(const M &A, X &v, const Y &d, const K &)
    Definition gsetc.hh:325
    \n-
    Definition gsetc.hh:375
    \n
    static void bsorb(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:461
    \n
    static void bsorf(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:418
    \n
    static void dbjac(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:504
    \n
    static void dbgs(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:378
    \n-
    static void dbgs(const M &A, X &x, const Y &b, const K &)
    Definition gsetc.hh:545
    \n-
    static void dbjac(const M &A, X &x, const Y &b, const K &)
    Definition gsetc.hh:560
    \n-
    static void bsorf(const M &A, X &x, const Y &b, const K &)
    Definition gsetc.hh:550
    \n-
    static void bsorb(const M &A, X &x, const Y &b, const K &)
    Definition gsetc.hh:555
    \n-
    static void dbgs(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
    Definition gsetc.hh:571
    \n-
    static void dbjac(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
    Definition gsetc.hh:608
    \n-
    static void bsorf(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
    Definition gsetc.hh:583
    \n-
    static void bsorb(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
    Definition gsetc.hh:595
    \n+
    solver for MultiTypeBlockVector & MultiTypeBlockMatrix types
    Definition multitypeblockmatrix.hh:493
    \n+
    part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types
    Definition multitypeblockmatrix.hh:465
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,832 +1,781 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-gsetc.hh\n+multitypeblockmatrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_GSETC_HH\n-6#define DUNE_ISTL_GSETC_HH\n+5#ifndef DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH\n+6#define DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH\n 7\n 8#include \n-9#include \n-10#include \n-11#include \n-12#include \n+9#include \n+10#include \n+11\n+12#include \n 13\n-14#include \n+14#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n 15\n-16#include \"_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-17#include \"_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-18\n-19#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-20\n+16// forward declaration\n+17namespace _\bD_\bu_\bn_\be\n+18{\n+19 template\n+20 class MultiTypeBlockMatrix;\n 21\n-27namespace _\bD_\bu_\bn_\be {\n-28\n-39 //============================================================\n-40 // parameter types\n-41 //============================================================\n-42\n-44 template\n-_\b4_\b5 struct _\bB_\bL {\n-_\b4_\b6 enum {_\br_\be_\bc_\bu_\br_\bs_\bi_\bo_\bn_\b__\bl_\be_\bv_\be_\bl = l};\n-47 };\n-48\n-_\b4_\b9 enum _\bW_\bi_\bt_\bh_\bD_\bi_\ba_\bg_\bT_\by_\bp_\be {\n-_\b5_\b0 _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg=1,\n-51 _\bn_\bo_\bd_\bi_\ba_\bg=0\n-_\b5_\b2 };\n-53\n-_\b5_\b4 enum _\bW_\bi_\bt_\bh_\bR_\be_\bl_\ba_\bx_\bT_\by_\bp_\be {\n-_\b5_\b5 _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx=1,\n-56 _\bn_\bo_\br_\be_\bl_\ba_\bx=0\n-_\b5_\b7 };\n-58\n-59 //============================================================\n-60 // generic triangular solves\n-61 // consider block decomposition A = L + D + U\n-62 // we can invert L, L+D, U, U+D\n-63 // we can apply relaxation or not\n-64 // we can recurse over a fixed number of levels\n-65 //============================================================\n-66\n-67 // template meta program for triangular solves\n-68 template\n-_\b6_\b9 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be {\n-70 template\n-_\b7_\b1 static void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n-72 {\n-73 // iterator types\n-74 typedef typename M::ConstRowIterator rowiterator;\n-75 typedef typename M::ConstColIterator coliterator;\n-76 typedef typename Y::block_type bblock;\n-77\n-78 // local solve at each block and immediate update\n-79 rowiterator endi=A.end();\n-80 for (rowiterator i=A.begin(); i!=endi; ++i)\n-81 {\n-82 bblock rhs(d[i.index()]);\n-83 coliterator j;\n-84 for (j=(*i).begin(); j.index()_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(*j,v[i.index()],rhs,w);\n+22 template\n+23 class MultiTypeBlockMatrix_Solver;\n+24}\n+25\n+26#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n+27\n+28namespace _\bD_\bu_\bn_\be {\n+29\n+43 template\n+_\b4_\b4 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx\n+45 : public std::tuple\n+46 {\n+47 using ParentType = std::tuple;\n+48 public:\n+49\n+51 using ParentType::ParentType;\n+52\n+_\b5_\b6 typedef _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx _\bt_\by_\bp_\be;\n+57\n+_\b5_\b9 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = std::size_t;\n+60\n+_\b6_\b6 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = Std::detected_t::field_type, typename FieldTraits::\n+field_type...>;\n+68\n+_\b7_\b4 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = Std::detected_t::real_type, typename FieldTraits::\n+real_type...>;\n+76\n+77 // make sure that we have an std::common_type: using an assertion produces a\n+more readable error message\n+78 // than a compiler template instantiation error\n+79 static_assert ( sizeof...(Args) == 0 or\n+80 not (std::is_same_v or std::is_same_v),\n+81 \"No std::common_type implemented for the given field_type/real_type of the\n+Args. Please provide an implementation and check that a FieldTraits class is\n+present for your type.\");\n+82\n+_\b8_\b4 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN()\n+85 {\n+86 return 1+sizeof...(Args);\n 87 }\n-88 }\n-89 template\n-_\b9_\b0 static void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+88\n+_\b9_\b0 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bM()\n 91 {\n-92 // iterator types\n-93 typedef typename M::ConstRowIterator rowiterator;\n-94 typedef typename M::ConstColIterator coliterator;\n-95 typedef typename Y::block_type bblock;\n-96\n-97 // local solve at each block and immediate update\n-98 rowiterator rendi=A.beforeBegin();\n-99 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)\n-100 {\n-101 bblock rhs(d[i.index()]);\n-102 coliterator j;\n-103 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)\n-104 (*j).mmv(v[j.index()],rhs);\n-105 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bI_\b-_\b1_\b,_\bd_\bi_\ba_\bg_\b,_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(*j,v[i.index()],rhs,w);\n-106 }\n-107 }\n-108 };\n-109\n-110 // recursion end ...\n-111 template<>\n-_\b1_\b1_\b2 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be<0,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx> {\n-113 template\n-_\b1_\b1_\b4 static void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+92 return FirstRow::size();\n+93 }\n+94\n+111 template< size_type index >\n+112 auto\n+_\b1_\b1_\b3 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ([[maybe_unused]] const std::integral_constant< size_type, index\n+> indexVariable)\n+114 -> decltype(std::get(*this))\n 115 {\n-116 A.solve(v,d);\n-117 v *= w;\n-118 }\n-119 template\n-_\b1_\b2_\b0 static void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n-121 {\n-122 A.solve(v,d);\n-123 v *= w;\n-124 }\n-125 };\n-126 template<>\n-_\b1_\b2_\b7 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be<0,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg,_\bn_\bo_\br_\be_\bl_\ba_\bx> {\n-128 template\n-_\b1_\b2_\b9 static void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& /*w*/)\n-130 {\n-131 A.solve(v,d);\n-132 }\n-133 template\n-_\b1_\b3_\b4 static void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& /*w*/)\n-135 {\n-136 A.solve(v,d);\n-137 }\n-138 };\n-139 template<>\n-_\b1_\b4_\b0 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be<0,_\bn_\bo_\bd_\bi_\ba_\bg,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx> {\n-141 template\n-_\b1_\b4_\b2 static void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& /*A*/, X& v, const Y& d, const K& w)\n-143 {\n-144 v = d;\n-145 v *= w;\n-146 }\n-147 template\n-_\b1_\b4_\b8 static void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& /*A*/, X& v, const Y& d, const K& w)\n-149 {\n-150 v = d;\n-151 v *= w;\n-152 }\n-153 };\n-154 template<>\n-_\b1_\b5_\b5 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be<0,_\bn_\bo_\bd_\bi_\ba_\bg,_\bn_\bo_\br_\be_\bl_\ba_\bx> {\n-156 template\n-_\b1_\b5_\b7 static void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& /*A*/, X& v, const Y& d, const K& /*w*/)\n-158 {\n-159 v = d;\n-160 }\n-161 template\n-_\b1_\b6_\b2 static void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& /*A*/, X& v, const Y& d, const K& /*w*/)\n-163 {\n-164 v = d;\n-165 }\n-166 };\n+116 return std::get(*this);\n+117 }\n+118\n+124 template< size_type index >\n+125 auto\n+_\b1_\b2_\b6 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ([[maybe_unused]] const std::integral_constant< size_type, index\n+> indexVariable) const\n+127 -> decltype(std::get(*this))\n+128 {\n+129 return std::get(*this);\n+130 }\n+131\n+135 template\n+_\b1_\b3_\b6 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const T& newval) {\n+137 using namespace Dune::Hybrid;\n+138 auto size = index_constant<1+sizeof...(Args)>();\n+139 // Since Dune::Hybrid::size(MultiTypeBlockMatrix) is not implemented,\n+140 // we cannot use a plain forEach(*this, ...). This could be achieved,\n+141 // e.g., by implementing a static size() method.\n+142 forEach(integralRange(size), [&](auto&& i) {\n+143 (*this)[i] = newval;\n+144 });\n+145 }\n+146\n+147 //===== vector space arithmetic\n+148\n+_\b1_\b5_\b0 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n+151 {\n+152 auto size = index_constant();\n+153 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {\n+154 (*this)[i] *= k;\n+155 });\n+156\n+157 return *this;\n+158 }\n+159\n+_\b1_\b6_\b1 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n+162 {\n+163 auto size = index_constant();\n+164 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {\n+165 (*this)[i] /= k;\n+166 });\n 167\n-168\n-169 // user calls\n+168 return *this;\n+169 }\n 170\n-171 // default block recursion level = 1\n-172\n-174 template\n-_\b1_\b7_\b5 void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n-176 {\n-177 typename X::field_type w=1;\n-178 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-179 }\n-181 template\n-_\b1_\b8_\b2 void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n-183 {\n-184 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+171\n+_\b1_\b7_\b7 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& b)\n+178 {\n+179 auto size = index_constant();\n+180 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {\n+181 (*this)[i] += b[i];\n+182 });\n+183\n+184 return *this;\n 185 }\n-187 template\n-_\b1_\b8_\b8 void _\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n-189 {\n-190 typename X::field_type w=1;\n-191 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-192 }\n-194 template\n-_\b1_\b9_\b5 void _\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n-196 {\n-197 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-198 }\n-199\n-201 template\n-_\b2_\b0_\b2 void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n-203 {\n-204 typename X::field_type w=1;\n-205 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-206 }\n-208 template\n-_\b2_\b0_\b9 void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n-210 {\n-211 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-212 }\n-214 template\n-_\b2_\b1_\b5 void _\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n-216 {\n-217 typename X::field_type w=1;\n-218 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-219 }\n-221 template\n-_\b2_\b2_\b2 void _\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n-223 {\n-224 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+186\n+_\b1_\b9_\b2 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& b)\n+193 {\n+194 auto size = index_constant();\n+195 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {\n+196 (*this)[i] -= b[i];\n+197 });\n+198\n+199 return *this;\n+200 }\n+201\n+204 template\n+_\b2_\b0_\b5 void _\bm_\bv (const X& x, Y& y) const {\n+206 static_assert(X::size() == _\bM(), \"length of x does not match row length\");\n+207 static_assert(Y::size() == _\bN(), \"length of y does not match row count\");\n+208 y = 0; //reset y (for mv uses umv)\n+209 _\bu_\bm_\bv(x,y);\n+210 }\n+211\n+214 template\n+_\b2_\b1_\b5 void _\bu_\bm_\bv (const X& x, Y& y) const {\n+216 static_assert(X::size() == _\bM(), \"length of x does not match row length\");\n+217 static_assert(Y::size() == _\bN(), \"length of y does not match row count\");\n+218 using namespace Dune::Hybrid;\n+219 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n+220 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+221 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n+222 (*this)[i][j].umv(x[j], y[i]);\n+223 });\n+224 });\n 225 }\n 226\n-227 // general block recursion level >= 0\n-228\n-230 template\n-_\b2_\b3_\b1 void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n-232 {\n-233 typename X::field_type w=1;\n-234 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-235 }\n-237 template\n-_\b2_\b3_\b8 void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n-239 {\n-240 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-241 }\n-243 template\n-_\b2_\b4_\b4 void _\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n-245 {\n-246 typename X::field_type w=1;\n-247 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-248 }\n-250 template\n-_\b2_\b5_\b1 void _\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n-252 {\n-253 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-254 }\n-255\n-257 template\n-_\b2_\b5_\b8 void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, _\bB_\bL_\b<_\bl_\b> bl)\n-259 {\n-260 typename X::field_type w=1;\n-261 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-262 }\n-264 template\n-_\b2_\b6_\b5 void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w, _\bB_\bL_\b<_\bl_\b> bl)\n-266 {\n-267 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-268 }\n-270 template\n-_\b2_\b7_\b1 void _\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, _\bB_\bL_\b<_\bl_\b> bl)\n-272 {\n-273 typename X::field_type w=1;\n-274 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-275 }\n-277 template\n-_\b2_\b7_\b8 void _\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w, _\bB_\bL_\b<_\bl_\b> bl)\n-279 {\n-280 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-281 }\n-282\n-283\n-284\n-285 //============================================================\n-286 // generic block diagonal solves\n-287 // consider block decomposition A = L + D + U\n-288 // we can apply relaxation or not\n-289 // we can recurse over a fixed number of levels\n-290 //============================================================\n-291\n-292 // template meta program for diagonal solves\n-293 template\n-_\b2_\b9_\b4 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be {\n-295 template\n-_\b2_\b9_\b6 static void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n-297 {\n-298 // iterator types\n-299 typedef typename M::ConstRowIterator rowiterator;\n-300 typedef typename M::ConstColIterator coliterator;\n-301\n-302 // local solve at each block and immediate update\n-303 rowiterator rendi=A.beforeBegin();\n-304 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)\n-305 {\n-306 coliterator ii=(*i).find(i.index());\n-307 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\bI_\b-_\b1_\b,_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be(*ii,v[i.index()],d[i.index()],w);\n-308 }\n-309 }\n-310 };\n+229 template\n+_\b2_\b3_\b0 void _\bm_\bm_\bv (const X& x, Y& y) const {\n+231 static_assert(X::size() == _\bM(), \"length of x does not match row length\");\n+232 static_assert(Y::size() == _\bN(), \"length of y does not match row count\");\n+233 using namespace Dune::Hybrid;\n+234 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n+235 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+236 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n+237 (*this)[i][j].mmv(x[j], y[i]);\n+238 });\n+239 });\n+240 }\n+241\n+244 template\n+_\b2_\b4_\b5 void _\bu_\bs_\bm_\bv (const AlphaType& alpha, const X& x, Y& y) const {\n+246 static_assert(X::size() == _\bM(), \"length of x does not match row length\");\n+247 static_assert(Y::size() == _\bN(), \"length of y does not match row count\");\n+248 using namespace Dune::Hybrid;\n+249 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n+250 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+251 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n+252 (*this)[i][j].usmv(alpha, x[j], y[i]);\n+253 });\n+254 });\n+255 }\n+256\n+259 template\n+_\b2_\b6_\b0 void _\bm_\bt_\bv (const X& x, Y& y) const {\n+261 static_assert(X::size() == _\bN(), \"length of x does not match number of\n+rows\");\n+262 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n+columns\");\n+263 y = 0;\n+264 _\bu_\bm_\bt_\bv(x,y);\n+265 }\n+266\n+269 template\n+_\b2_\b7_\b0 void _\bu_\bm_\bt_\bv (const X& x, Y& y) const {\n+271 static_assert(X::size() == _\bN(), \"length of x does not match number of\n+rows\");\n+272 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n+columns\");\n+273 using namespace Dune::Hybrid;\n+274 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n+275 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+276 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n+277 (*this)[j][i].umtv(x[j], y[i]);\n+278 });\n+279 });\n+280 }\n+281\n+284 template\n+_\b2_\b8_\b5 void _\bm_\bm_\bt_\bv (const X& x, Y& y) const {\n+286 static_assert(X::size() == _\bN(), \"length of x does not match number of\n+rows\");\n+287 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n+columns\");\n+288 using namespace Dune::Hybrid;\n+289 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n+290 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+291 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n+292 (*this)[j][i].mmtv(x[j], y[i]);\n+293 });\n+294 });\n+295 }\n+296\n+299 template\n+_\b3_\b0_\b0 void _\bu_\bs_\bm_\bt_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const {\n+301 static_assert(X::size() == _\bN(), \"length of x does not match number of\n+rows\");\n+302 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n+columns\");\n+303 using namespace Dune::Hybrid;\n+304 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n+305 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+306 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n+307 (*this)[j][i].usmtv(alpha, x[j], y[i]);\n+308 });\n+309 });\n+310 }\n 311\n-312 // recursion end ...\n-313 template<>\n-_\b3_\b1_\b4 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be<0,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx> {\n-315 template\n-_\b3_\b1_\b6 static void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n-317 {\n-318 A.solve(v,d);\n-319 v *= w;\n-320 }\n-321 };\n-322 template<>\n-_\b3_\b2_\b3 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be<0,_\bn_\bo_\br_\be_\bl_\ba_\bx> {\n-324 template\n-_\b3_\b2_\b5 static void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& /*w*/)\n-326 {\n-327 A.solve(v,d);\n-328 }\n-329 };\n-330\n-331 // user calls\n-332\n-333 // default block recursion level = 1\n-334\n-336 template\n-_\b3_\b3_\b7 void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n-338 {\n-339 typename X::field_type w=1;\n-340 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-341 }\n-343 template\n-_\b3_\b4_\b4 void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n-345 {\n-346 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-347 }\n-348\n-349 // general block recursion level >= 0\n-350\n-352 template\n-_\b3_\b5_\b3 void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n-354 {\n-355 typename X::field_type w=1;\n-356 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-357 }\n-359 template\n-_\b3_\b6_\b0 void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n-361 {\n-362 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n-363 }\n+314 template\n+_\b3_\b1_\b5 void _\bu_\bm_\bh_\bv (const X& x, Y& y) const {\n+316 static_assert(X::size() == _\bN(), \"length of x does not match number of\n+rows\");\n+317 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n+columns\");\n+318 using namespace Dune::Hybrid;\n+319 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n+320 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+321 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n+322 (*this)[j][i].umhv(x[j], y[i]);\n+323 });\n+324 });\n+325 }\n+326\n+329 template\n+_\b3_\b3_\b0 void _\bm_\bm_\bh_\bv (const X& x, Y& y) const {\n+331 static_assert(X::size() == _\bN(), \"length of x does not match number of\n+rows\");\n+332 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n+columns\");\n+333 using namespace Dune::Hybrid;\n+334 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n+335 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+336 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n+337 (*this)[j][i].mmhv(x[j], y[i]);\n+338 });\n+339 });\n+340 }\n+341\n+344 template\n+_\b3_\b4_\b5 void _\bu_\bs_\bm_\bh_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const {\n+346 static_assert(X::size() == _\bN(), \"length of x does not match number of\n+rows\");\n+347 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n+columns\");\n+348 using namespace Dune::Hybrid;\n+349 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n+350 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+351 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n+352 (*this)[j][i].usmhv(alpha, x[j], y[i]);\n+353 });\n+354 });\n+355 }\n+356\n+357\n+358 //===== norms\n+359\n+_\b3_\b6_\b1 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2 () const\n+362 {\n+363 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be sum=0;\n 364\n-365\n-366 //============================================================\n-367 // generic steps of iteration methods\n-368 // Jacobi, Gauss-Seidel, SOR, SSOR\n-369 // work directly on Ax=b, ie solve M(x^{i+1}-x^i) = w (b-Ax^i)\n-370 // we can recurse over a fixed number of levels\n-371 //============================================================\n+365 auto rows = index_constant();\n+366 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {\n+367 auto cols = index_constant::M()>();\n+368 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {\n+369 sum += (*this)[i][j].frobenius_norm2();\n+370 });\n+371 });\n 372\n-373 // template meta program for iterative solver steps\n-374 template\n-_\b3_\b7_\b5 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs {\n-376\n-377 template\n-_\b3_\b7_\b8 static void _\bd_\bb_\bg_\bs (const M& A, X& x, const Y& b, const K& w)\n-379 {\n-380 typedef typename M::ConstRowIterator rowiterator;\n-381 typedef typename M::ConstColIterator coliterator;\n-382 typedef typename Y::block_type bblock;\n-383 bblock rhs;\n-384\n-385 X xold(x); // remember old x\n-386\n-387 rowiterator endi=A.end();\n-388 for (rowiterator i=A.begin(); i!=endi; ++i)\n-389 {\n-390 rhs = b[i.index()]; // rhs = b_i\n-391 coliterator endj=(*i).end();\n-392 coliterator j=(*i).begin();\n-393 if constexpr (IsNumber())\n-394 {\n-395 for (; j.index()();\n+389 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {\n+390 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be sum=0;\n+391 auto cols = index_constant::M()>();\n+392 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {\n+393 sum += (*this)[i][j].infinity_norm();\n+394 });\n+395 norm = max(sum, norm);\n+396 });\n+397\n+398 return norm;\n+399 }\n+400\n+_\b4_\b0_\b2 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl () const\n 403 {\n-404 for (; j.index() i\n-408 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j>i} a_ij * xold_j\n-409 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bd_\bb_\bg_\bs(*diag,x[i.index\n-()],rhs,w); // if I==1: xnew_i = rhs/a_ii\n-410 }\n-411 }\n-412 // next two lines: xnew_i = w / a_ii * (b_i - sum_{j=i} a_ij * xold_j) + (1-w)*xold;\n-413 x *= w;\n-414 x.axpy(K(1)-w,xold);\n-415 }\n+404 using std::max;\n+405 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm=0;\n+406\n+407 auto rows = index_constant();\n+408 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {\n+409 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be sum=0;\n+410 auto cols = index_constant::M()>();\n+411 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {\n+412 sum += (*this)[i][j].infinity_norm_real();\n+413 });\n+414 norm = max(sum, norm);\n+415 });\n 416\n-417 template\n-_\b4_\b1_\b8 static void _\bb_\bs_\bo_\br_\bf (const M& A, X& x, const Y& b, const K& w)\n-419 {\n-420 typedef typename M::ConstRowIterator rowiterator;\n-421 typedef typename M::ConstColIterator coliterator;\n-422 typedef typename Y::block_type bblock;\n-423 typedef typename X::block_type xblock;\n-424 bblock rhs;\n-425 xblock v;\n-426\n-427 // Initialize nested data structure if there are entries\n-428 if(A.begin()!=A.end())\n-429 v=x[0];\n-430\n-431 rowiterator endi=A.end();\n-432 for (rowiterator i=A.begin(); i!=endi; ++i)\n-433 {\n-434 rhs = b[i.index()]; // rhs = b_i\n-435 coliterator endj=(*i).end(); // iterate over a_ij with j < i\n-436 coliterator j=(*i).begin();\n-437 if constexpr (IsNumber())\n-438 {\n-439 for (; j.index()=i} a_ij * xold_j)\n-446 }\n-447 else\n-448 {\n-449 for (; j.index()_\b:_\b:_\bb_\bs_\bo_\br_\bf(*diag,v,rhs,w); // if\n-blocksize I==1: v = rhs/a_ii\n-455 x[i.index()].axpy(w,v); // x_i = w / a_ii * (b_i - sum_{j=i} a_ij * xold_j)\n-456 }\n-457 }\n-458 }\n-459\n-460 template\n-_\b4_\b6_\b1 static void _\bb_\bs_\bo_\br_\bb (const M& A, X& x, const Y& b, const K& w)\n-462 {\n-463 typedef typename M::ConstRowIterator rowiterator;\n-464 typedef typename M::ConstColIterator coliterator;\n-465 typedef typename Y::block_type bblock;\n-466 typedef typename X::block_type xblock;\n-467 bblock rhs;\n-468 xblock v;\n-469\n-470 // Initialize nested data structure if there are entries\n-471 if(A.begin()!=A.end())\n-472 v=x[0];\n-473\n-474 rowiterator endi=A.beforeBegin();\n-475 for (rowiterator i=A.beforeEnd(); i!=endi; --i)\n-476 {\n-477 rhs = b[i.index()];\n-478 coliterator endj=(*i).end();\n-479 coliterator j=(*i).begin();\n-480 if constexpr (IsNumber())\n-481 {\n-482 for (; j.index()mmv(x[j.index()],rhs);\n-494 coliterator diag=j;\n-495 for (; j!=endj; ++j)\n-496 j->mmv(x[j.index()],rhs);\n-497 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(*diag,v,rhs,w);\n-498 x[i.index()].axpy(w,v);\n-499 }\n-500 }\n-501 }\n-502\n-503 template\n-_\b5_\b0_\b4 static void _\bd_\bb_\bj_\ba_\bc (const M& A, X& x, const Y& b, const K& w)\n-505 {\n-506 typedef typename M::ConstRowIterator rowiterator;\n-507 typedef typename M::ConstColIterator coliterator;\n-508 typedef typename Y::block_type bblock;\n-509 bblock rhs;\n+417 return norm;\n+418 }\n+419\n+420 };\n+421\n+422\n+426 template \n+_\b4_\b2_\b7 struct FieldTraits< _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx >\n+428 {\n+_\b4_\b2_\b9 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx::field_type;\n+_\b4_\b3_\b0 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx::real_type;\n+431 };\n+432\n+433\n+439 template\n+_\b4_\b4_\b0 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const\n+_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\bA_\br_\bg_\bs_\b._\b._\b._\b>& m) {\n+441 auto N = index_constant::N()>();\n+442 auto M = index_constant::M()>();\n+443 using namespace Dune::Hybrid;\n+444 forEach(integralRange(N), [&](auto&& i) {\n+445 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+446 forEach(integralRange(M), [&](auto&& j) {\n+447 s << \"\\t(\" << i << \", \" << j << \"): \\n\" << m[i][j];\n+448 });\n+449 });\n+450 s << std::endl;\n+451 return s;\n+452 }\n+453\n+454 //make algmeta_itsteps known\n+455 template\n+456 struct algmeta_itsteps;\n+457\n+464 template //\n+MultiTypeBlockMatrix_Solver_Col: iterating over one row\n+_\b4_\b6_\b5 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl { //calculating b- A[i][j]*x[j]\n+466 public:\n+470 template \n+_\b4_\b7_\b1 static void _\bc_\ba_\bl_\bc_\b__\br_\bh_\bs(const TMatrix& A, TVector& x, TVector& v, Trhs& b,\n+const K& w) {\n+472 std::get( std::get(A) ).mmv( std::get(x), b );\n+473 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl_\b<_\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\bc_\bc_\bo_\bl_\b+_\b1_\b,_\b _\br_\be_\bm_\ba_\bi_\bn_\b__\bc_\bo_\bl_\b-_\b1_\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b__\br_\bh_\bs\n+(A,x,v,b,w); //next column element\n+474 }\n+475\n+476 };\n+477 template //MultiTypeBlockMatrix_Solver_Col\n+recursion end\n+_\b4_\b7_\b8 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl {\n+479 public:\n+480 template \n+_\b4_\b8_\b1 static void _\bc_\ba_\bl_\bc_\b__\br_\bh_\bs(const TMatrix&, TVector&, TVector&, Trhs&, const K&)\n+{}\n+482 };\n+483\n+484\n+485\n+492 template\n+_\b4_\b9_\b3 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br {\n+494 public:\n+495\n+499 template \n+_\b5_\b0_\b0 static void _\bd_\bb_\bg_\bs(const TMatrix& A, TVector& x, const TVector& b, const K&\n+w) {\n+501 TVector xold(x);\n+502 xold=x; //store old x values\n+503 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b>_\b:_\b:_\bd_\bb_\bg_\bs(A,x,x,b,w);\n+504 x *= w;\n+505 x.axpy(1-w,xold); //improve x\n+506 }\n+507 template \n+_\b5_\b0_\b8 static void _\bd_\bb_\bg_\bs(const TMatrix& A, TVector& x, TVector& v, const TVector&\n+b, const K& w) {\n+509 auto rhs = std::get (b);\n 510\n-511 X v(x); // allocate with same size\n-512\n-513 rowiterator endi=A.end();\n-514 for (rowiterator i=A.begin(); i!=endi; ++i)\n-515 {\n-516 rhs = b[i.index()];\n-517 coliterator endj=(*i).end();\n-518 coliterator j=(*i).begin();\n-519 if constexpr (IsNumber())\n-520 {\n-521 for (; j.index()mmv(x[j.index()],rhs);\n-532 coliterator diag=j;\n-533 for (; j!=endj; ++j)\n-534 j->mmv(x[j.index()],rhs);\n-535 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(*diag,v[i.index\n-()],rhs,w);\n-536 }\n-537 }\n-538 x.axpy(w,v);\n-539 }\n-540 };\n-541 // end of recursion\n-542 template\n-_\b5_\b4_\b3 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs<0,M> {\n-544 template\n-_\b5_\b4_\b5 static void _\bd_\bb_\bg_\bs (const M& A, X& x, const Y& b, const K& /*w*/)\n-546 {\n-547 A.solve(x,b);\n-548 }\n-549 template\n-_\b5_\b5_\b0 static void _\bb_\bs_\bo_\br_\bf (const M& A, X& x, const Y& b, const K& /*w*/)\n-551 {\n-552 A.solve(x,b);\n-553 }\n-554 template\n-_\b5_\b5_\b5 static void _\bb_\bs_\bo_\br_\bb (const M& A, X& x, const Y& b, const K& /*w*/)\n-556 {\n-557 A.solve(x,b);\n-558 }\n-559 template\n-_\b5_\b6_\b0 static void _\bd_\bb_\bj_\ba_\bc (const M& A, X& x, const Y& b, const K& /*w*/)\n-561 {\n-562 A.solve(x,b);\n-563 }\n-564 };\n+511 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl::calc_rhs\n+(A,x,v,rhs,w); // calculate right side of equation\n+512 //solve on blocklevel I-1\n+513 using M =\n+514 typename std::remove_cv<\n+515 typename std::remove_reference<\n+516 decltype(std::get( std::get(A)))\n+517 >::type\n+518 >::type;\n+519 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bg_\bs(std::get( std::get(A)), std::\n+get(x),rhs,w);\n+520 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b+_\b1_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b-_\b1_\b>_\b:_\b:_\bd_\bb_\bg_\bs(A,x,v,b,w); //next\n+row\n+521 }\n+522\n+523\n+524\n+528 template \n+_\b5_\b2_\b9 static void _\bb_\bs_\bo_\br_\bf(const TMatrix& A, TVector& x, const TVector& b, const K&\n+w) {\n+530 TVector v;\n+531 v=x; //use latest x values in right side calculation\n+532 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(A,x,v,b,w);\n+533\n+534 }\n+535 template //recursion over\n+all matrix rows (A)\n+_\b5_\b3_\b6 static void _\bb_\bs_\bo_\br_\bf(const TMatrix& A, TVector& x, TVector& v, const TVector&\n+b, const K& w) {\n+537 auto rhs = std::get (b);\n+538\n+539 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl::calc_rhs\n+(A,x,v,rhs,w); // calculate right side of equation\n+540 //solve on blocklevel I-1\n+541 using M =\n+542 typename std::remove_cv<\n+543 typename std::remove_reference<\n+544 decltype(std::get( std::get(A)))\n+545 >::type\n+546 >::type;\n+547 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bM_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(std::get( std::get(A)), std::\n+get(v),rhs,w);\n+548 std::get(x).axpy(w,std::get(v));\n+549 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b+_\b1_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b-_\b1_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(A,x,v,b,w); //\n+next row\n+550 }\n+551\n+555 template \n+_\b5_\b5_\b6 static void _\bb_\bs_\bo_\br_\bb(const TMatrix& A, TVector& x, const TVector& b, const K&\n+w) {\n+557 TVector v;\n+558 v=x; //use latest x values in right side calculation\n+559 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(A,x,v,b,w);\n+560\n+561 }\n+562 template //recursion over\n+all matrix rows (A)\n+_\b5_\b6_\b3 static void _\bb_\bs_\bo_\br_\bb(const TMatrix& A, TVector& x, TVector& v, const TVector&\n+b, const K& w) {\n+564 auto rhs = std::get (b);\n 565\n-566 template\n-_\b5_\b6_\b7 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs>\n-{\n-568 template<\n-569 typename... MultiTypeVectorArgs,\n-570 class K>\n-_\b5_\b7_\b1 static void _\bd_\bb_\bg_\bs (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>&\n-A,\n-572 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& x,\n-573 const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& b,\n-574 const K& w)\n-575 {\n-576 static const int N = _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>_\b:_\b:_\bN();\n-577 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\b0_\b,_\bN_\b>_\b:_\b:_\bd_\bb_\bg_\bs(A, x, b, w);\n-578 }\n+566 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl::calc_rhs\n+(A,x,v,rhs,w); // calculate right side of equation\n+567 //solve on blocklevel I-1\n+568 using M =\n+569 typename std::remove_cv<\n+570 typename std::remove_reference<\n+571 decltype(std::get( std::get(A)))\n+572 >::type\n+573 >::type;\n+574 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bM_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(std::get( std::get(A)), std::\n+get(v),rhs,w);\n+575 std::get(x).axpy(w,std::get(v));\n+576 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b-_\b1_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b-_\b1_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(A,x,v,b,w); //\n+next row\n+577 }\n+578\n 579\n-580 template<\n-581 typename... MultiTypeVectorArgs,\n-582 class K>\n-_\b5_\b8_\b3 static void _\bb_\bs_\bo_\br_\bf (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>&\n-A,\n-584 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& x,\n-585 const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& b,\n-586 const K& w)\n-587 {\n-588 static const int N = _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>_\b:_\b:_\bN();\n-589 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\b0_\b,_\bN_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(A, x, b, w);\n-590 }\n-591\n-592 template<\n-593 typename... MultiTypeVectorArgs,\n-594 class K>\n-_\b5_\b9_\b5 static void _\bb_\bs_\bo_\br_\bb (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>&\n-A,\n-596 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& x,\n-597 const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& b,\n-598 const K& w)\n-599 {\n-600 static const int N = _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>_\b:_\b:_\bN();\n-601 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bN_\b-_\b1_\b,_\bN_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(A, x, b, w);\n-602 }\n-603\n-604 template<\n-605 typename... MultiTypeVectorArgs,\n-606 class K\n-607 >\n-_\b6_\b0_\b8 static void _\bd_\bb_\bj_\ba_\bc (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>&\n-A,\n-609 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& x,\n-610 const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& b,\n-611 const K& w)\n-612 {\n-613 static const int N = _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>_\b:_\b:_\bN();\n-614 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\b0_\b,_\bN_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(A, x, b, w);\n-615 }\n-616 };\n-617\n-618 // user calls\n-619\n-621 template\n-_\b6_\b2_\b2 void _\bd_\bb_\bg_\bs (const M& A, X& x, const Y& b, const K& w)\n-623 {\n-624 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b1_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bg_\bs(A,x,b,w);\n-625 }\n-627 template\n-_\b6_\b2_\b8 void _\bd_\bb_\bg_\bs (const M& A, X& x, const Y& b, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n-629 {\n-630 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bl_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bg_\bs(A,x,b,w);\n-631 }\n-633 template\n-_\b6_\b3_\b4 void _\bb_\bs_\bo_\br_\bf (const M& A, X& x, const Y& b, const K& w)\n-635 {\n-636 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b1_\b,_\bM_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(A,x,b,w);\n-637 }\n-639 template\n-_\b6_\b4_\b0 void _\bb_\bs_\bo_\br_\bf (const M& A, X& x, const Y& b, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n-641 {\n-642 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bl_\b,_\bM_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(A,x,b,w);\n-643 }\n-645 template\n-_\b6_\b4_\b6 void _\bb_\bs_\bo_\br_\bb (const M& A, X& x, const Y& b, const K& w)\n-647 {\n-648 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b1_\b,_\bM_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(A,x,b,w);\n-649 }\n-651 template\n-_\b6_\b5_\b2 void _\bb_\bs_\bo_\br_\bb (const M& A, X& x, const Y& b, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n-653 {\n-654 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bl_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bv_\b<_\bM_\b>_\b:_\b:_\bt_\by_\bp_\be>_\b:_\b:_\bb_\bs_\bo_\br_\bb(A,x,b,w);\n-655 }\n-657 template\n-_\b6_\b5_\b8 void _\bd_\bb_\bj_\ba_\bc (const M& A, X& x, const Y& b, const K& w)\n-659 {\n-660 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b1_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(A,x,b,w);\n-661 }\n-663 template\n-_\b6_\b6_\b4 void _\bd_\bb_\bj_\ba_\bc (const M& A, X& x, const Y& b, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n-665 {\n-666 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bl_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(A,x,b,w);\n-667 }\n-668\n-669\n-672} // end namespace\n-673\n-674#endif\n+583 template \n+_\b5_\b8_\b4 static void _\bd_\bb_\bj_\ba_\bc(const TMatrix& A, TVector& x, const TVector& b, const K&\n+w) {\n+585 TVector v(x);\n+586 v=0; //calc new x in v\n+587 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(A,x,v,b,w);\n+588 x.axpy(w,v); //improve x\n+589 }\n+590 template \n+_\b5_\b9_\b1 static void _\bd_\bb_\bj_\ba_\bc(const TMatrix& A, TVector& x, TVector& v, const TVector&\n+b, const K& w) {\n+592 auto rhs = std::get (b);\n+593\n+594 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl::calc_rhs\n+(A,x,v,rhs,w); // calculate right side of equation\n+595 //solve on blocklevel I-1\n+596 using M =\n+597 typename std::remove_cv<\n+598 typename std::remove_reference<\n+599 decltype(std::get( std::get(A)))\n+600 >::type\n+601 >::type;\n+602 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(std::get( std::get(A)), std::\n+get(v),rhs,w);\n+603 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b+_\b1_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b-_\b1_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(A,x,v,b,w); //\n+next row\n+604 }\n+605\n+606\n+607\n+608\n+609 };\n+610 template //recursion end for remain_row = 0\n+_\b6_\b1_\b1 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br {\n+612 public:\n+613 template \n+_\b6_\b1_\b4 static void _\bd_\bb_\bg_\bs(const TMatrix&, TVector&, TVector&,\n+615 const TVector&, const K&) {}\n+616\n+617 template \n+_\b6_\b1_\b8 static void _\bb_\bs_\bo_\br_\bf(const TMatrix&, TVector&, TVector&,\n+619 const TVector&, const K&) {}\n+620\n+621 template \n+_\b6_\b2_\b2 static void _\bb_\bs_\bo_\br_\bb(const TMatrix&, TVector&, TVector&,\n+623 const TVector&, const K&) {}\n+624\n+625 template \n+_\b6_\b2_\b6 static void _\bd_\bb_\bj_\ba_\bc(const TMatrix&, TVector&, TVector&,\n+627 const TVector&, const K&) {}\n+628 };\n+629\n+630} // end namespace Dune\n+631\n+632namespace _\bs_\bt_\bd\n+633{\n+638 template \n+_\b6_\b3_\b9 struct tuple_element >\n+640 {\n+_\b6_\b4_\b1 using _\bt_\by_\bp_\be = typename std::tuple_element >::type;\n+642 };\n+643\n+648 template \n+_\b6_\b4_\b9 struct tuple_size<_\bD_\bu_\bn_\be::MultiTypeBlockMatrix >\n+650 : std::integral_constant\n+651 {};\n+652}\n+653#endif\n _\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\n+Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n+generic way.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bR_\bo_\bw_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename MultiTypeBlockMatrix< Rows... >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:429\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bt_\by_\bp_\be\n+MultiTypeBlockMatrix< FirstRow, Args... > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:56\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:584\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n+real_type infinity_norm_real() const\n+Bastardized version of the infinity-norm / row-sum norm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:402\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n+MultiTypeBlockMatrix & operator+=(const MultiTypeBlockMatrix &b)\n+Add the entries of another matrix to this one.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:177\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n+void mv(const X &x, Y &y) const\n+y = A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:205\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bt_\bv\n+void mmtv(const X &x, Y &y) const\n+y -= A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:285\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bh_\bv\n+void mmhv(const X &x, Y &y) const\n+y -= A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:330\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+Std::detected_t< std::common_type_t, typename FieldTraits< FirstRow >::\n+real_type, typename FieldTraits< Args >::real_type... > real_type\n+The type used for real values.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\b0_\b _\b>_\b:_\b:_\bd_\bb_\bg_\bs\n+static void dbgs(const TMatrix &, TVector &, TVector &, const TVector &, const\n+K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:614\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bb_\bg_\bs\n static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:500\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bb_\bs_\bo_\br_\bb\n static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:556\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bh_\bv\n+void usmhv(const field_type &alpha, const X &x, Y &y) const\n+y += alpha A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:345\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bv\n+void usmv(const AlphaType &alpha, const X &x, Y &y) const\n+y += alpha A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:245\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n+MultiTypeBlockMatrix & operator/=(const field_type &k)\n+vector space division by scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:161\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n+real_type infinity_norm() const\n+Bastardized version of the infinity-norm / row-sum norm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:383\n+_\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+typename std::tuple_element< i, std::tuple< Args... > >::type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:641\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bb_\bg_\bs\n+static void dbgs(const TMatrix &A, TVector &x, TVector &v, const TVector &b,\n+const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:508\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bb_\bs_\bo_\br_\bf\n+static void bsorf(const TMatrix &A, TVector &x, TVector &v, const TVector &b,\n+const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:536\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bh_\bv\n+void umhv(const X &x, Y &y) const\n+y += A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:315\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n static constexpr size_type N()\n Return the number of matrix rows.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bt_\bv\n+void usmtv(const field_type &alpha, const X &x, Y &y) const\n+y += alpha A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:300\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+void operator=(const T &newval)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\bc_\bc_\bo_\bl_\b,_\b _\b0_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b__\br_\bh_\bs\n+static void calc_rhs(const TMatrix &, TVector &, TVector &, Trhs &, const K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:481\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bv\n+void umv(const X &x, Y &y) const\n+y += A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:215\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl_\b:_\b:_\bc_\ba_\bl_\bc_\b__\br_\bh_\bs\n+static void calc_rhs(const TMatrix &A, TVector &x, TVector &v, Trhs &b, const K\n+&w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:471\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bb_\bs_\bo_\br_\bf\n static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:529\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n-void bltsolve(const M &A, X &v, const Y &d)\n-block lower triangular solve\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:175\n-_\bD_\bu_\bn_\be_\b:_\b:_\bW_\bi_\bt_\bh_\bD_\bi_\ba_\bg_\bT_\by_\bp_\be\n-WithDiagType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bb\n-void bsorb(const M &A, X &x, const Y &b, const K &w)\n-SSOR step.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:646\n-_\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n-void ubltsolve(const M &A, X &v, const Y &d)\n-unit block lower triangular solve\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n-void dbjac(const M &A, X &x, const Y &b, const K &w)\n-Jacobi step.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:658\n-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bg_\bs\n-void dbgs(const M &A, X &x, const Y &b, const K &w)\n-GS step.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:622\n-_\bD_\bu_\bn_\be_\b:_\b:_\bW_\bi_\bt_\bh_\bR_\be_\bl_\ba_\bx_\bT_\by_\bp_\be\n-WithRelaxType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be\n-void bdsolve(const M &A, X &v, const Y &d)\n-block diagonal solve, no relaxation\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:337\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n-void butsolve(const M &A, X &v, const Y &d)\n-block upper triangular solve\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:202\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bf\n-void bsorf(const M &A, X &x, const Y &b, const K &w)\n-SOR step.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:634\n-_\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n-void ubutsolve(const M &A, X &v, const Y &d)\n-unit block upper triangular solve\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:215\n-_\bD_\bu_\bn_\be_\b:_\b:_\bn_\bo_\bd_\bi_\ba_\bg\n-@ nodiag\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg\n-@ withdiag\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bn_\bo_\br_\be_\bl_\ba_\bx\n-@ norelax\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx\n-@ withrelax\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\b0_\b _\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n+static void dbjac(const TMatrix &, TVector &, TVector &, const TVector &, const\n+K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:626\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::size_t size_type\n+Type used for sizes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2\n+real_type frobenius_norm2() const\n+square of frobenius norm, need for block recursion\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:361\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm\n+real_type frobenius_norm() const\n+frobenius norm: sqrt(sum over squared values of entries)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:377\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\b0_\b _\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb\n+static void bsorb(const TMatrix &, TVector &, TVector &, const TVector &, const\n+K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:622\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n+MultiTypeBlockMatrix & operator-=(const MultiTypeBlockMatrix &b)\n+Subtract the entries of another matrix from this one.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:192\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bR_\bo_\bw_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+typename MultiTypeBlockMatrix< Rows... >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:430\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+auto operator[](const std::integral_constant< size_type, index > indexVariable)\n+-> decltype(std::get< index >(*this))\n+Random-access operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n+static void dbjac(const TMatrix &A, TVector &x, TVector &v, const TVector &b,\n+const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:591\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\b0_\b _\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf\n+static void bsorf(const TMatrix &, TVector &, TVector &, const TVector &, const\n+K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:618\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bt_\bv\n+void mtv(const X &x, Y &y) const\n+y = A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:260\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+static constexpr size_type M()\n+Return the number of matrix columns.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:90\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bv\n+void mmv(const X &x, Y &y) const\n+y -= A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Std::detected_t< std::common_type_t, typename FieldTraits< FirstRow >::\n+field_type, typename FieldTraits< Args >::field_type... > field_type\n+The type used for scalars.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bt_\bv\n+void umtv(const X &x, Y &y) const\n+y += A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:270\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bb_\bs_\bo_\br_\bb\n+static void bsorb(const TMatrix &A, TVector &x, TVector &v, const TVector &b,\n+const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:563\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n+MultiTypeBlockMatrix & operator*=(const field_type &k)\n+vector space multiplication with scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:150\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-A Vector class to support different block types.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)\n+Send BlockVector to an output stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:583\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx\n A Matrix class to support different block types.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bL\n-compile-time parameter for block recursion depth\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:45\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bL_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bo_\bn_\b__\bl_\be_\bv_\be_\bl\n-@ recursion_level\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n-static void butsolve(const M &A, X &v, const Y &d, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:90\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n-static void bltsolve(const M &A, X &v, const Y &d, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n-static void bltsolve(const M &A, X &v, const Y &d, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n-static void butsolve(const M &A, X &v, const Y &d, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n-static void bltsolve(const M &A, X &v, const Y &d, const K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:129\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n-static void butsolve(const M &A, X &v, const Y &d, const K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:134\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n-static void bltsolve(const M &, X &v, const Y &d, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n-static void butsolve(const M &, X &v, const Y &d, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:148\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n-static void bltsolve(const M &, X &v, const Y &d, const K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:157\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n-static void butsolve(const M &, X &v, const Y &d, const K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:162\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:294\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be\n-static void bdsolve(const M &A, X &v, const Y &d, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be\n-static void bdsolve(const M &A, X &v, const Y &d, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:316\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be\n-static void bdsolve(const M &A, X &v, const Y &d, const K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:325\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:375\n _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bb_\bs_\bo_\br_\bb\n static void bsorb(const M &A, X &x, const Y &b, const K &w)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:461\n _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bb_\bs_\bo_\br_\bf\n static void bsorf(const M &A, X &x, const Y &b, const K &w)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:418\n _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n static void dbjac(const M &A, X &x, const Y &b, const K &w)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:504\n _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bd_\bb_\bg_\bs\n static void dbgs(const M &A, X &x, const Y &b, const K &w)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:378\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\b0_\b,_\b _\bM_\b _\b>_\b:_\b:_\bd_\bb_\bg_\bs\n-static void dbgs(const M &A, X &x, const Y &b, const K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:545\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\b0_\b,_\b _\bM_\b _\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n-static void dbjac(const M &A, X &x, const Y &b, const K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\b0_\b,_\b _\bM_\b _\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf\n-static void bsorf(const M &A, X &x, const Y &b, const K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:550\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\b0_\b,_\b _\bM_\b _\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb\n-static void bsorb(const M &A, X &x, const Y &b, const K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:555\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>\n-_\b>_\b:_\b:_\bd_\bb_\bg_\bs\n-static void dbgs(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A,\n-MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector<\n-MultiTypeVectorArgs... > &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:571\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>\n-_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n-static void dbjac(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A,\n-MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector<\n-MultiTypeVectorArgs... > &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:608\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>\n-_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf\n-static void bsorf(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A,\n-MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector<\n-MultiTypeVectorArgs... > &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:583\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>\n-_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb\n-static void bsorb(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A,\n-MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector<\n-MultiTypeVectorArgs... > &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:595\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br\n+solver for MultiTypeBlockVector & MultiTypeBlockMatrix types\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:493\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl\n+part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:465\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00020.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00020.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: io.hh File Reference\n+dune-istl: multitypeblockvector.hh File Reference\n \n \n \n \n \n \n \n@@ -73,108 +73,59 @@\n
    \n
    \n
    \n \n- \n+
    multitypeblockvector.hh File Reference
    \n
    \n
    \n-\n-

    Some generic functions for pretty printing vectors and matrices. \n-More...

    \n
    #include <cmath>
    \n-#include <complex>
    \n-#include <limits>
    \n-#include <ios>
    \n-#include <iomanip>
    \n-#include <fstream>
    \n-#include <string>
    \n-#include "matrixutils.hh"
    \n-#include "istlexception.hh"
    \n-#include <dune/common/fvector.hh>
    \n-#include <dune/common/fmatrix.hh>
    \n+#include <iostream>
    \n+#include <tuple>
    \n+#include <dune/common/dotproduct.hh>
    \n+#include <dune/common/ftraits.hh>
    \n #include <dune/common/hybridutilities.hh>
    \n-#include <dune/common/reservedvector.hh>
    \n-#include <dune/istl/bcrsmatrix.hh>
    \n-#include <dune/istl/blocklevel.hh>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/std/type_traits.hh>
    \n+#include "istlexception.hh"
    \n+#include "gsetc.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::DefaultSVGMatrixOptions
     Default options class to write SVG matrices. More...
    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...
     
    struct  std::tuple_size< Dune::MultiTypeBlockVector< Args... > >
     Make std::tuple_size work for MultiTypeBlockVector. More...
     
    \n \n \n \n+\n+\n+\n

    \n Namespaces

    namespace  Dune
     
    namespace  std
     STL namespace.
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n

    \n 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 , std::enable_if_t< Dune::IsNumber< K >::value, int > = 0>
    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)
     Print one row of a matrix, specialization for number types.
     
    template<class M , std::enable_if_t< not Dune::IsNumber< M >::value, int > = 0>
    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)
     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 A , class InnerMatrixType >
    void Dune::printSparseMatrix (std::ostream &s, const BCRSMatrix< InnerMatrixType, A > &mat, std::string title, std::string rowtext, int width=3, int precision=2)
     Prints a BCRSMatrix with fixed sized blocks.
     
    template<class FieldType , std::enable_if_t< Dune::IsNumber< FieldType >::value, int > = 0>
    void Dune::writeMatrixToMatlabHelper (const FieldType &value, int rowOffset, int colOffset, std::ostream &s)
     Helper method for the writeMatrixToMatlab routine.
     
    template<class MatrixType , std::enable_if_t< not Dune::IsNumber< MatrixType >::value, int > = 0>
    void Dune::writeMatrixToMatlabHelper (const MatrixType &matrix, int externalRowOffset, int externalColOffset, std::ostream &s)
     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 (std::ostream &out, const Mat &mat, SVGOptions opts={})
     Writes the visualization of matrix in the SVG 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<typename... Args>
    std::ostream & Dune::operator<< (std::ostream &s, const MultiTypeBlockVector< Args... > &v)
     Send MultiTypeBlockVector to an outstream.
     
    \n-

    Detailed Description

    \n-

    Some generic functions for pretty printing vectors and matrices.

    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,111 +1,45 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-io.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bS_\bp_\ba_\br_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bc_\bl_\ba_\bs_\bs_\be_\bs \u00bb\n-_\bI_\bO_\b _\bf_\bo_\br_\b _\bm_\ba_\bt_\br_\bi_\bc_\be_\bs_\b _\ba_\bn_\bd_\b _\bv_\be_\bc_\bt_\bo_\br_\bs_\b.\n-Some generic functions for pretty printing vectors and matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+multitypeblockvector.hh File Reference\n #include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \"_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\"\n-#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-#include \n-#include \n+#include \n+#include \n+#include \n+#include \n #include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+#include \n+#include \n+#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs\n-\u00a0 Default options class to write SVG matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b _\b>\n+\u00a0 A Vector class to support different block types. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n+\u00a0 Make std::tuple_element work for MultiTypeBlockVector. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\bs_\bi_\bz_\be_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n+\u00a0 Make std::tuple_size work for MultiTypeBlockVector. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+namespace \u00a0 _\bs_\bt_\bd\n+\u00a0 STL namespace.\n+\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b__\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br (std::ostream &s, const V &v, std::string\n- rowtext, int &counter, int columns, int width)\n-\u00a0 Recursively print a vector.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br (std::ostream &s, const V &v, std::string title, std::\n- string rowtext, int columns=1, int width=10, int precision=2)\n-\u00a0 Print an _\bI_\bS_\bT_\bL vector.\n-\u00a0\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\bl_\bl_\b__\br_\bo_\bw (std::ostream &s, int m, int width, int precision)\n-\u00a0 Print a row of zeros for a non-existing block.\n-\u00a0\n-template::value, int > = 0>\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw (std::ostream &s, const K &value, typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx<\n- K, 1, 1 >::size_type I, typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 1, 1 >::size_type J,\n- typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, 1, 1 >::size_type therow, int width, int\n- precision)\n-\u00a0 Print one row of a matrix, specialization for number types.\n-\u00a0\n-template::value, int > = 0>\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw (std::ostream &s, const M &A, typename M::size_type I,\n- typename M::size_type J, typename M::size_type therow, int width, int\n- precision)\n-\u00a0 Print one row of a matrix.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bm_\ba_\bt_\br_\bi_\bx (std::ostream &s, const M &A, std::string title, std::\n- string rowtext, int width=10, int precision=2)\n-\u00a0 Print a generic block matrix.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx (std::ostream &s, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<\n- InnerMatrixType, A > &_\bm_\ba_\bt, std::string title, std::string rowtext, int\n- width=3, int precision=2)\n-\u00a0 Prints a _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx with fixed sized blocks.\n-\u00a0\n-template::\n-value, int > = 0>\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br (const FieldType &value, int rowOffset,\n- int colOffset, std::ostream &s)\n-\u00a0 Helper method for the writeMatrixToMatlab routine.\n-\u00a0\n-template::value, int > = 0>\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br (const MatrixType &matrix, int\n- externalRowOffset, int externalColOffset, std::ostream &s)\n-\u00a0 Helper method for the writeMatrixToMatlab routine.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb (const MatrixType &matrix, const std::string\n- &filename, int outputPrecision=18)\n-\u00a0 Writes sparse matrix in a Matlab-readable format.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br (const V &v, std::ostream &stream)\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb (const VectorType &vector, const std::string\n- &filename, int outputPrecision=18)\n-\u00a0 Writes vectors in a Matlab-readable format.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx (std::ostream &out, const Mat &_\bm_\ba_\bt, SVGOptions opts=\n- {})\n-\u00a0 Writes the visualization of matrix in the SVG format.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx (const Mat &_\bm_\ba_\bt, std::ostream &out, SVGOptions opts=\n- {})\n-\u00a0 Writes the visualization of matrix in the SVG format.\n+template\n+std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &s, const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br<\n+ Args... > &v)\n+\u00a0 Send _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br to an outstream.\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Some generic functions for pretty printing vectors and matrices.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00020_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00020_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: io.hh Source File\n+dune-istl: multitypeblockvector.hh Source File\n \n \n \n \n \n \n \n@@ -74,749 +74,354 @@\n \n
    \n \n
    \n
    \n
    \n-
    io.hh
    \n+
    multitypeblockvector.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_IO_HH
    \n-
    6#define DUNE_ISTL_IO_HH
    \n+
    5#ifndef DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH
    \n+
    6#define DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH
    \n
    7
    \n
    8#include <cmath>
    \n-
    9#include <complex>
    \n-
    10#include <limits>
    \n-
    11#include <ios>
    \n-
    12#include <iomanip>
    \n-
    13#include <fstream>
    \n-
    14#include <string>
    \n-
    15
    \n-
    16#include "matrixutils.hh"
    \n-
    17#include "istlexception.hh"
    \n-
    18#include <dune/common/fvector.hh>
    \n-
    19#include <dune/common/fmatrix.hh>
    \n-
    20#include <dune/common/hybridutilities.hh>
    \n-
    21#include <dune/common/reservedvector.hh>
    \n-
    22
    \n-\n-\n+
    9#include <iostream>
    \n+
    10#include <tuple>
    \n+
    11
    \n+
    12#include <dune/common/dotproduct.hh>
    \n+
    13#include <dune/common/ftraits.hh>
    \n+
    14#include <dune/common/hybridutilities.hh>
    \n+
    15#include <dune/common/typetraits.hh>
    \n+
    16#include <dune/common/std/type_traits.hh>
    \n+
    17
    \n+
    18#include "istlexception.hh"
    \n+
    19
    \n+
    20// forward declaration
    \n+
    21namespace Dune {
    \n+
    22 template < typename... Args >
    \n+
    23 class MultiTypeBlockVector;
    \n+
    24}
    \n
    25
    \n-
    26namespace Dune {
    \n+
    26#include "gsetc.hh"
    \n
    27
    \n-
    40 //
    \n-
    41 // pretty printing of vectors
    \n-
    42 //
    \n-
    43
    \n-
    51 template<class V>
    \n-
    \n-
    52 void recursive_printvector (std::ostream& s, const V& v, std::string rowtext,
    \n-
    53 int& counter, int columns, int width)
    \n-
    54 {
    \n-
    55 if constexpr (IsNumber<V>())
    \n-
    56 {
    \n-
    57 // Print one number
    \n-
    58 if (counter%columns==0)
    \n-
    59 {
    \n-
    60 s << rowtext; // start a new row
    \n-
    61 s << " "; // space in front of each entry
    \n-
    62 s.width(4); // set width for counter
    \n-
    63 s << counter; // number of first entry in a line
    \n-
    64 }
    \n-
    65 s << " "; // space in front of each entry
    \n-
    66 s.width(width); // set width for each entry anew
    \n-
    67 s << v; // yeah, the number !
    \n-
    68 counter++; // increment the counter
    \n-
    69 if (counter%columns==0)
    \n-
    70 s << std::endl; // start a new line
    \n-
    71 }
    \n-
    72 else
    \n-
    73 {
    \n-
    74 // Recursively print a vector
    \n-
    75 for (const auto& entry : v)
    \n-
    76 recursive_printvector(s,entry,rowtext,counter,columns,width);
    \n-
    77 }
    \n-
    78 }
    \n-
    \n-
    79
    \n-
    80
    \n-
    88 template<class V>
    \n-
    \n-
    89 void printvector (std::ostream& s, const V& v, std::string title,
    \n-
    90 std::string rowtext, int columns=1, int width=10,
    \n-
    91 int precision=2)
    \n-
    92 {
    \n-
    93 // count the numbers printed to make columns
    \n-
    94 int counter=0;
    \n-
    95
    \n-
    96 // remember old flags
    \n-
    97 std::ios_base::fmtflags oldflags = s.flags();
    \n-
    98
    \n-
    99 // set the output format
    \n-
    100 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
    \n-
    101 int oldprec = s.precision();
    \n-
    102 s.precision(precision);
    \n-
    103
    \n-
    104 // print title
    \n-
    105 s << title << " [blocks=" << v.N() << ",dimension=" << v.dim() << "]"
    \n-
    106 << std::endl;
    \n+
    28namespace Dune {
    \n+
    29
    \n+
    41 template <typename... Args>
    \n+
    \n+
    42 struct FieldTraits< MultiTypeBlockVector<Args...> >
    \n+
    43 {
    \n+
    44 using field_type = typename MultiTypeBlockVector<Args...>::field_type;
    \n+
    45 using real_type = typename MultiTypeBlockVector<Args...>::real_type;
    \n+
    46 };
    \n+
    \n+
    56 template < typename... Args >
    \n+
    \n+\n+
    58 : public std::tuple<Args...>
    \n+
    59 {
    \n+
    61 typedef std::tuple<Args...> TupleType;
    \n+
    62 public:
    \n+
    63
    \n+
    65 using size_type = std::size_t;
    \n+
    66
    \n+
    70 using TupleType::TupleType;
    \n+
    71
    \n+
    75 typedef MultiTypeBlockVector<Args...> type;
    \n+
    76
    \n+
    82 using field_type = Std::detected_t<std::common_type_t, typename FieldTraits< std::decay_t<Args> >::field_type...>;
    \n+
    83
    \n+
    89 using real_type = Std::detected_t<std::common_type_t, typename FieldTraits< std::decay_t<Args> >::real_type...>;
    \n+
    90
    \n+
    91 // make sure that we have an std::common_type: using an assertion produces a more readable error message
    \n+
    92 // than a compiler template instantiation error
    \n+
    93 static_assert ( sizeof...(Args) == 0 or
    \n+
    94 not (std::is_same_v<field_type, Std::nonesuch> or std::is_same_v<real_type, Std::nonesuch>),
    \n+
    95 "No std::common_type implemented for the given field_type/real_type of the Args. Please provide an implementation and check that a FieldTraits class is present for your type.");
    \n+
    96
    \n+
    97
    \n+
    \n+
    103 static constexpr size_type size()
    \n+
    104 {
    \n+
    105 return sizeof...(Args);
    \n+
    106 }
    \n+
    \n
    107
    \n-
    108 // print data from all blocks
    \n-
    109 recursive_printvector(s,v,rowtext,counter,columns,width);
    \n-
    110
    \n-
    111 // check if new line is required
    \n-
    112 if (counter%columns!=0)
    \n-
    113 s << std::endl;
    \n+
    \n+
    110 static constexpr size_type N()
    \n+
    111 {
    \n+
    112 return sizeof...(Args);
    \n+
    113 }
    \n+
    \n
    114
    \n-
    115 // reset the output format
    \n-
    116 s.flags(oldflags);
    \n-
    117 s.precision(oldprec);
    \n-
    118 }
    \n-
    \n-
    119
    \n-
    120
    \n-
    122 //
    \n-
    123 // pretty printing of matrices
    \n-
    124 //
    \n-
    125
    \n-
    \n-
    133 inline void fill_row (std::ostream& s, int m, int width, [[maybe_unused]] int precision)
    \n-
    134 {
    \n-
    135 for (int j=0; j<m; j++)
    \n-
    136 {
    \n-
    137 s << " "; // space in front of each entry
    \n-
    138 s.width(width); // set width for each entry anew
    \n-
    139 s << "."; // yeah, the number !
    \n-
    140 }
    \n-
    141 }
    \n-
    \n-
    142
    \n-
    150 template<class K,
    \n-
    151 std::enable_if_t<Dune::IsNumber<K>::value, int> = 0>
    \n-
    \n-
    152 void print_row (std::ostream& s, const K& value,
    \n-
    153 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type I,
    \n-
    154 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type J,
    \n-
    155 [[maybe_unused]] typename FieldMatrix<K,1,1>::size_type therow,
    \n-
    156 int width,
    \n-
    157 [[maybe_unused]] int precision)
    \n-
    158 {
    \n-
    159 s << " "; // space in front of each entry
    \n-
    160 s.width(width); // set width for each entry anew
    \n-
    161 s << value;
    \n-
    162 }
    \n-
    \n-
    163
    \n-
    171 template<class M,
    \n-
    172 std::enable_if_t<not Dune::IsNumber<M>::value, int> = 0>
    \n-
    \n-
    173 void print_row (std::ostream& s, const M& A, typename M::size_type I,
    \n-
    174 typename M::size_type J, typename M::size_type therow,
    \n-
    175 int width, int precision)
    \n-
    176 {
    \n-
    177 typename M::size_type i0=I;
    \n-
    178 for (typename M::size_type i=0; i<A.N(); i++)
    \n-
    179 {
    \n-
    180 if (therow>=i0 && therow<i0+MatrixDimension<M>::rowdim(A,i))
    \n-
    181 {
    \n-
    182 // the row is in this block row !
    \n-
    183 typename M::size_type j0=J;
    \n-
    184 for (typename M::size_type j=0; j<A.M(); j++)
    \n-
    185 {
    \n-
    186 // find this block
    \n-
    187 typename M::ConstColIterator it = A[i].find(j);
    \n-
    188
    \n-
    189 // print row or filler
    \n-
    190 if (it!=A[i].end())
    \n-
    191 print_row(s,*it,i0,j0,therow,width,precision);
    \n-
    192 else
    \n-
    193 fill_row(s,MatrixDimension<M>::coldim(A,j),width,precision);
    \n-
    194
    \n-
    195 // advance columns
    \n-\n-
    197 }
    \n-
    198 }
    \n-
    199 // advance rows
    \n-\n-
    201 }
    \n-
    202 }
    \n-
    \n-
    203
    \n-
    212 template<class M>
    \n-
    \n-
    213 void printmatrix (std::ostream& s, const M& A, std::string title,
    \n-
    214 std::string rowtext, int width=10, int precision=2)
    \n-
    215 {
    \n-
    216
    \n-
    217 // remember old flags
    \n-
    218 std::ios_base::fmtflags oldflags = s.flags();
    \n-
    219
    \n-
    220 // set the output format
    \n-
    221 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
    \n-
    222 int oldprec = s.precision();
    \n-
    223 s.precision(precision);
    \n-
    224
    \n-
    225 // print title
    \n-
    226 s << title
    \n-
    227 << " [n=" << A.N()
    \n-
    228 << ",m=" << A.M()
    \n-
    229 << ",rowdim=" << MatrixDimension<M>::rowdim(A)
    \n-
    230 << ",coldim=" << MatrixDimension<M>::coldim(A)
    \n-
    231 << "]" << std::endl;
    \n-
    232
    \n-
    233 // print all rows
    \n-
    234 for (typename M::size_type i=0; i<MatrixDimension<M>::rowdim(A); i++)
    \n-
    235 {
    \n-
    236 s << rowtext; // start a new row
    \n-
    237 s << " "; // space in front of each entry
    \n-
    238 s.width(4); // set width for counter
    \n-
    239 s << i; // number of first entry in a line
    \n-
    240 print_row(s,A,0,0,i,width,precision); // generic print
    \n-
    241 s << std::endl; // start a new line
    \n-
    242 }
    \n-
    243
    \n-
    244 // reset the output format
    \n-
    245 s.flags(oldflags);
    \n-
    246 s.precision(oldprec);
    \n-
    247 }
    \n-
    \n-
    248
    \n-
    249 namespace Impl
    \n-
    250 {
    \n-
    251 template<class B>
    \n-
    252 void printInnerMatrixElement(std::ostream& s,
    \n-
    253 const B& innerMatrixElement,
    \n-
    254 int innerrow, int innercol)
    \n-
    255 {
    \n-
    256 s<<innerMatrixElement<<" ";
    \n-
    257 }
    \n-
    258
    \n-
    259 template<class B, int n>
    \n-
    260 void printInnerMatrixElement(std::ostream& s,
    \n-
    261 const ScaledIdentityMatrix<B,n> innerMatrixElement,
    \n-
    262 int innerrow, int innercol)
    \n-
    263 {
    \n-
    264 if (innerrow == innercol)
    \n-
    265 s<<innerMatrixElement.scalar()<<" ";
    \n-
    266 else
    \n-
    267 s<<"-";
    \n-
    268 }
    \n-
    269
    \n-
    270 template<class B, int n, int m>
    \n-
    271 void printInnerMatrixElement(std::ostream& s,
    \n-
    272 const FieldMatrix<B,n,m> innerMatrixElement,
    \n-
    273 int innerrow, int innercol)
    \n-
    274 {
    \n-
    275 s<<innerMatrixElement[innerrow][innercol]<<" ";
    \n-
    276 }
    \n-
    277 }
    \n-
    278
    \n-
    300 template<class A, class InnerMatrixType>
    \n-
    \n-
    301 void printSparseMatrix(std::ostream& s,
    \n-\n-
    303 std::string title, std::string rowtext,
    \n-
    304 int width=3, int precision=2)
    \n-
    305 {
    \n-\n-
    307 // remember old flags
    \n-
    308 std::ios_base::fmtflags oldflags = s.flags();
    \n-
    309 // set the output format
    \n-
    310 s.setf(std::ios_base::scientific, std::ios_base::floatfield);
    \n-
    311 int oldprec = s.precision();
    \n-
    312 s.precision(precision);
    \n-
    313 // print title
    \n-
    314 s << title
    \n-
    315 << " [n=" << mat.N()
    \n-
    316 << ",m=" << mat.M()
    \n-
    317 << ",rowdim=" << MatrixDimension<Matrix>::rowdim(mat)
    \n-
    318 << ",coldim=" << MatrixDimension<Matrix>::coldim(mat)
    \n-
    319 << "]" << std::endl;
    \n-
    320
    \n-
    321 typedef typename Matrix::ConstRowIterator Row;
    \n-
    322
    \n-
    323 constexpr int n = std::decay_t<decltype(Impl::asMatrix(std::declval<InnerMatrixType>()))>::rows;
    \n-
    324 constexpr int m = std::decay_t<decltype(Impl::asMatrix(std::declval<InnerMatrixType>()))>::cols;
    \n-
    325 for(Row row=mat.begin(); row != mat.end(); ++row) {
    \n-
    326 int skipcols=0;
    \n-
    327 bool reachedEnd=false;
    \n+
    \n+\n+
    117 {
    \n+
    118 size_type result = 0;
    \n+
    119 Hybrid::forEach(std::make_index_sequence<N()>{},
    \n+
    120 [&](auto i){result += std::get<i>(*this).dim();});
    \n+
    121
    \n+
    122 return result;
    \n+
    123 }
    \n+
    \n+
    124
    \n+
    143 template< size_type index >
    \n+
    144 typename std::tuple_element<index,TupleType>::type&
    \n+
    \n+
    145 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable)
    \n+
    146 {
    \n+
    147 return std::get<index>(*this);
    \n+
    148 }
    \n+
    \n+
    149
    \n+
    155 template< size_type index >
    \n+
    156 const typename std::tuple_element<index,TupleType>::type&
    \n+
    \n+
    157 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable) const
    \n+
    158 {
    \n+
    159 return std::get<index>(*this);
    \n+
    160 }
    \n+
    \n+
    161
    \n+
    164 template<typename T>
    \n+
    \n+
    165 void operator= (const T& newval) {
    \n+
    166 Dune::Hybrid::forEach(*this, [&](auto&& entry) {
    \n+
    167 entry = newval;
    \n+
    168 });
    \n+
    169 }
    \n+
    \n+
    170
    \n+
    \n+
    174 void operator+= (const type& newv) {
    \n+
    175 using namespace Dune::Hybrid;
    \n+
    176 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
    \n+
    177 (*this)[i] += newv[i];
    \n+
    178 });
    \n+
    179 }
    \n+
    \n+
    180
    \n+
    \n+
    184 void operator-= (const type& newv) {
    \n+
    185 using namespace Dune::Hybrid;
    \n+
    186 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
    \n+
    187 (*this)[i] -= newv[i];
    \n+
    188 });
    \n+
    189 }
    \n+
    \n+
    190
    \n+
    192 template<class T,
    \n+
    193 std::enable_if_t< IsNumber<T>::value, int> = 0>
    \n+
    \n+
    194 void operator*= (const T& w) {
    \n+
    195 Hybrid::forEach(*this, [&](auto&& entry) {
    \n+
    196 entry *= w;
    \n+
    197 });
    \n+
    198 }
    \n+
    \n+
    199
    \n+
    201 template<class T,
    \n+
    202 std::enable_if_t< IsNumber<T>::value, int> = 0>
    \n+
    \n+
    203 void operator/= (const T& w) {
    \n+
    204 Hybrid::forEach(*this, [&](auto&& entry) {
    \n+
    205 entry /= w;
    \n+
    206 });
    \n+
    207 }
    \n+
    \n+
    208
    \n+
    \n+
    209 field_type operator* (const type& newv) const {
    \n+
    210 using namespace Dune::Hybrid;
    \n+
    211 return accumulate(integralRange(Hybrid::size(*this)), field_type(0), [&](auto&& a, auto&& i) {
    \n+
    212 return a + (*this)[i]*newv[i];
    \n+
    213 });
    \n+
    214 }
    \n+
    \n+
    215
    \n+
    \n+
    216 field_type dot (const type& newv) const {
    \n+
    217 using namespace Dune::Hybrid;
    \n+
    218 return accumulate(integralRange(Hybrid::size(*this)), field_type(0), [&](auto&& a, auto&& i) {
    \n+
    219 return a + (*this)[i].dot(newv[i]);
    \n+
    220 });
    \n+
    221 }
    \n+
    \n+
    222
    \n+
    \n+
    225 auto one_norm() const {
    \n+
    226 using namespace Dune::Hybrid;
    \n+
    227 return accumulate(*this, real_type(0), [&](auto&& a, auto&& entry) {
    \n+
    228 return a + entry.one_norm();
    \n+
    229 });
    \n+
    230 }
    \n+
    \n+
    231
    \n+
    \n+
    234 auto one_norm_real() const {
    \n+
    235 using namespace Dune::Hybrid;
    \n+
    236 return accumulate(*this, real_type(0), [&](auto&& a, auto&& entry) {
    \n+
    237 return a + entry.one_norm_real();
    \n+
    238 });
    \n+
    239 }
    \n+
    \n+
    240
    \n+
    \n+\n+
    244 using namespace Dune::Hybrid;
    \n+
    245 return accumulate(*this, real_type(0), [&](auto&& a, auto&& entry) {
    \n+
    246 return a + entry.two_norm2();
    \n+
    247 });
    \n+
    248 }
    \n+
    \n+
    249
    \n+
    252 real_type two_norm() const {return sqrt(this->two_norm2());}
    \n+
    253
    \n+
    \n+\n+
    257 {
    \n+
    258 using namespace Dune::Hybrid;
    \n+
    259 using std::max;
    \n+
    260
    \n+
    261 real_type result = 0.0;
    \n+
    262 // Compute max norm tracking appearing nan values
    \n+
    263 // if the field type supports nan.
    \n+
    264 if constexpr (HasNaN<field_type>()) {
    \n+
    265 // This variable will preserve any nan value
    \n+
    266 real_type nanTracker = 1.0;
    \n+
    267 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    268 forEach(*this, [&](auto&& entry) {
    \n+
    269 real_type entryNorm = entry.infinity_norm();
    \n+
    270 result = max(entryNorm, result);
    \n+
    271 nanTracker += entryNorm;
    \n+
    272 });
    \n+
    273 // Incorporate possible nan value into result
    \n+
    274 result *= (nanTracker / nanTracker);
    \n+
    275 } else {
    \n+
    276 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    277 forEach(*this, [&](auto&& entry) {
    \n+
    278 result = max(entry.infinity_norm(), result);
    \n+
    279 });
    \n+
    280 }
    \n+
    281 return result;
    \n+
    282 }
    \n+
    \n+
    283
    \n+
    \n+\n+
    287 {
    \n+
    288 using namespace Dune::Hybrid;
    \n+
    289 using std::max;
    \n+
    290
    \n+
    291 real_type result = 0.0;
    \n+
    292 // Compute max norm tracking appearing nan values
    \n+
    293 // if the field type supports nan.
    \n+
    294 if constexpr (HasNaN<field_type>()) {
    \n+
    295 // This variable will preserve any nan value
    \n+
    296 real_type nanTracker = 1.0;
    \n+
    297 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    298 forEach(*this, [&](auto&& entry) {
    \n+
    299 real_type entryNorm = entry.infinity_norm_real();
    \n+
    300 result = max(entryNorm, result);
    \n+
    301 nanTracker += entryNorm;
    \n+
    302 });
    \n+
    303 // Incorporate possible nan value into result
    \n+
    304 result *= (nanTracker / nanTracker);
    \n+
    305 } else {
    \n+
    306 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    307 forEach(*this, [&](auto&& entry) {
    \n+
    308 result = max(entry.infinity_norm_real(), result);
    \n+
    309 });
    \n+
    310 }
    \n+
    311 return result;
    \n+
    312 }
    \n+
    \n+
    313
    \n+
    318 template<typename Ta>
    \n+
    \n+
    319 void axpy (const Ta& a, const type& y) {
    \n+
    320 using namespace Dune::Hybrid;
    \n+
    321 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
    \n+
    322 (*this)[i].axpy(a, y[i]);
    \n+
    323 });
    \n+
    324 }
    \n+
    \n+
    325
    \n+
    326 };
    \n+
    \n+
    327
    \n
    328
    \n-
    329 while(!reachedEnd) {
    \n-
    330 for(int innerrow=0; innerrow<n; ++innerrow) {
    \n-
    331 int count=0;
    \n-
    332 typedef typename Matrix::ConstColIterator Col;
    \n-
    333 Col col=row->begin();
    \n-
    334 for(; col != row->end(); ++col,++count) {
    \n-
    335 if(count<skipcols)
    \n-
    336 continue;
    \n-
    337 if(count>=skipcols+width)
    \n-
    338 break;
    \n-
    339 if(innerrow==0) {
    \n-
    340 if(count==skipcols) {
    \n-
    341 s << rowtext; // start a new row
    \n-
    342 s << " "; // space in front of each entry
    \n-
    343 s.width(4); // set width for counter
    \n-
    344 s << row.index()<<": "; // number of first entry in a line
    \n-
    345 }
    \n-
    346 s.width(4);
    \n-
    347 s<<col.index()<<": |";
    \n-
    348 } else {
    \n-
    349 if(count==skipcols) {
    \n-
    350 for(typename std::string::size_type i=0; i < rowtext.length(); i++)
    \n-
    351 s<<" ";
    \n-
    352 s<<" ";
    \n-
    353 }
    \n-
    354 s<<" |";
    \n-
    355 }
    \n-
    356 for(int innercol=0; innercol < m; ++innercol) {
    \n-
    357 s.width(9);
    \n-
    358 Impl::printInnerMatrixElement(s,*col,innerrow,innercol);
    \n-
    359 }
    \n-
    360
    \n-
    361 s<<"|";
    \n-
    362 }
    \n-
    363 if(innerrow==n-1 && col==row->end())
    \n-
    364 reachedEnd = true;
    \n-
    365 else
    \n-
    366 s << std::endl;
    \n-
    367 }
    \n-
    368 skipcols += width;
    \n-
    369 s << std::endl;
    \n-
    370 }
    \n-
    371 s << std::endl;
    \n-
    372 }
    \n-
    373
    \n-
    374 // reset the output format
    \n-
    375 s.flags(oldflags);
    \n-
    376 s.precision(oldprec);
    \n-
    377 }
    \n-
    \n-
    378
    \n-
    379 namespace
    \n-
    380 {
    \n-
    381 template<typename T>
    \n-
    382 struct MatlabPODWriter
    \n-
    383 {
    \n-
    384 static std::ostream& write(const T& t, std::ostream& s)
    \n-
    385 {
    \n-
    386 s << t;
    \n-
    387 return s;
    \n-
    388 }
    \n-
    389 };
    \n-
    390 template<typename T>
    \n-
    391 struct MatlabPODWriter<std::complex<T> >
    \n-
    392 {
    \n-
    393 static std::ostream& write(const std::complex<T>& t, std::ostream& s)
    \n-
    394 {
    \n-
    395 s << t.real() << " " << t.imag();
    \n-
    396 return s;
    \n-
    397 }
    \n-
    398 };
    \n-
    399 } // anonymous namespace
    \n-
    400
    \n-
    410 template <class FieldType,
    \n-
    411 std::enable_if_t<Dune::IsNumber<FieldType>::value, int> = 0>
    \n-
    \n-
    412 void writeMatrixToMatlabHelper(const FieldType& value,
    \n-
    413 int rowOffset, int colOffset,
    \n-
    414 std::ostream& s)
    \n-
    415 {
    \n-
    416 //+1 for Matlab numbering
    \n-
    417 s << rowOffset + 1 << " " << colOffset + 1 << " ";
    \n-
    418 MatlabPODWriter<FieldType>::write(value, s)<< std::endl;
    \n-
    419 }
    \n-
    \n-
    420
    \n-
    428 template <class MatrixType,
    \n-
    429 std::enable_if_t<not Dune::IsNumber<MatrixType>::value, int> = 0>
    \n-
    \n-
    430 void writeMatrixToMatlabHelper(const MatrixType& matrix,
    \n-
    431 int externalRowOffset, int externalColOffset,
    \n-
    432 std::ostream& s)
    \n-
    433 {
    \n-
    434 // Precompute the accumulated sizes of the columns
    \n-
    435 std::vector<typename MatrixType::size_type> colOffset(matrix.M());
    \n-
    436 if (colOffset.size() > 0)
    \n-
    437 colOffset[0] = 0;
    \n-
    438
    \n-
    439 for (typename MatrixType::size_type i=0; i<matrix.M()-1; i++)
    \n-
    440 colOffset[i+1] = colOffset[i] +
    \n-\n-
    442
    \n-
    443 typename MatrixType::size_type rowOffset = 0;
    \n-
    444
    \n-
    445 // Loop over all matrix rows
    \n-
    446 for (typename MatrixType::size_type rowIdx=0; rowIdx<matrix.N(); rowIdx++)
    \n-
    447 {
    \n-
    448 auto cIt = matrix[rowIdx].begin();
    \n-
    449 auto cEndIt = matrix[rowIdx].end();
    \n-
    450
    \n-
    451 // Loop over all columns in this row
    \n-
    452 for (; cIt!=cEndIt; ++cIt)
    \n-\n-
    454 externalRowOffset+rowOffset,
    \n-
    455 externalColOffset + colOffset[cIt.index()],
    \n-
    456 s);
    \n-
    457
    \n-
    458 rowOffset += MatrixDimension<MatrixType>::rowdim(matrix, rowIdx);
    \n-
    459 }
    \n-
    460
    \n-
    461 }
    \n-
    \n-
    462
    \n-
    482 template <class MatrixType>
    \n-
    \n-
    483 void writeMatrixToMatlab(const MatrixType& matrix,
    \n-
    484 const std::string& filename, int outputPrecision = 18)
    \n-
    485 {
    \n-
    486 std::ofstream outStream(filename.c_str());
    \n-
    487 int oldPrecision = outStream.precision();
    \n-
    488 outStream.precision(outputPrecision);
    \n-
    489
    \n-
    490 writeMatrixToMatlabHelper(matrix, 0, 0, outStream);
    \n-
    491 outStream.precision(oldPrecision);
    \n-
    492 }
    \n-
    \n-
    493
    \n-
    494 // Recursively write vector entries to a stream
    \n-
    495 template<class V>
    \n-
    \n-
    496 void writeVectorToMatlabHelper (const V& v, std::ostream& stream)
    \n-
    497 {
    \n-
    498 if constexpr (IsNumber<V>()) {
    \n-
    499 stream << v << std::endl;
    \n-
    500 } else {
    \n-
    501 for (const auto& entry : v)
    \n-
    502 writeVectorToMatlabHelper(entry, stream);
    \n-
    503 }
    \n-
    504 }
    \n-
    \n-
    505
    \n-
    523 template <class VectorType>
    \n-
    \n-
    524 void writeVectorToMatlab(const VectorType& vector,
    \n-
    525 const std::string& filename, int outputPrecision = 18)
    \n-
    526 {
    \n-
    527 std::ofstream outStream(filename.c_str());
    \n-
    528 int oldPrecision = outStream.precision();
    \n-
    529 outStream.precision(outputPrecision);
    \n-
    530
    \n-
    531 writeVectorToMatlabHelper(vector, outStream);
    \n-
    532 outStream.precision(oldPrecision);
    \n-
    533 }
    \n-
    \n-
    534
    \n-
    535 namespace Impl {
    \n-
    536
    \n-
    538 struct NullStream {
    \n-
    539 template <class Any>
    \n-
    540 friend NullStream &operator<<(NullStream &dev0, Any &&) {
    \n-
    541 return dev0;
    \n-
    542 }
    \n-
    543 };
    \n-
    544
    \n-
    546 // svg shall be closed with a group and an svg. i.e. "</g></svg>"
    \n-
    547 template <class Stream, class SVGMatrixOptions>
    \n-
    548 void writeSVGMatrixHeader(Stream &out, const SVGMatrixOptions &opts,
    \n-
    549 std::pair<std::size_t, size_t> offsets) {
    \n-
    550 auto [col_offset, row_offset] = offsets;
    \n-
    551 double width = opts.width;
    \n-
    552 double height = opts.height;
    \n-
    553 // if empty, we try to figure out a sensible value of width and height
    \n-
    554 if (opts.width == 0 and opts.height == 0)
    \n-
    555 width = height = 500;
    \n-
    556 if (opts.width == 0)
    \n-
    557 width = opts.height * (double(col_offset) / row_offset);
    \n-
    558 if (opts.height == 0)
    \n-
    559 height = opts.width * (double(row_offset) / col_offset);
    \n-
    560
    \n-
    561 // scale group w.r.t final offsets
    \n-
    562 double scale_width = width / col_offset;
    \n-
    563 double scale_height = height / row_offset;
    \n-
    564
    \n-
    565 // write the header text
    \n-
    566 out << "<svg xmlns='http://www.w3.org/2000/svg' width='" << std::ceil(width)
    \n-
    567 << "' height='" << std::ceil(height) << "' version='1.1'>\\n"
    \n-
    568 << "<style>\\n"
    \n-
    569 << opts.style << "</style>\\n"
    \n-
    570 << "<g transform='scale(" << scale_width << " " << scale_height
    \n-
    571 << ")'>\\n";
    \n-
    572 }
    \n-
    573
    \n-
    575 template <class Stream, class Mat, class SVGMatrixOptions,
    \n-
    576 class RowPrefix, class ColPrefix>
    \n-
    577 std::pair<std::size_t, size_t>
    \n-
    578 writeSVGMatrix(Stream &out, const Mat &mat, SVGMatrixOptions opts,
    \n-
    579 RowPrefix row_prefix, ColPrefix col_prefix) {
    \n-
    580 // get values to fill the offsets
    \n-
    581 const auto& block_size = opts.block_size;
    \n-
    582 const auto& interspace = opts.interspace;
    \n-
    583
    \n-
    584 const std::size_t rows = mat.N();
    \n-
    585 const std::size_t cols = mat.M();
    \n-
    586
    \n-
    587 // disable header write for recursive calls
    \n-
    588 const bool write_header = opts.write_header;
    \n-
    589 opts.write_header = false;
    \n-
    590
    \n-
    591 // counter of offsets for every block
    \n-
    592 std::size_t row_offset = interspace;
    \n-
    593 std::size_t col_offset = interspace;
    \n-
    594
    \n-
    595 // lambda helper: for-each value
    \n-
    596 auto for_each_entry = [&mat](const auto &call_back) {
    \n-
    597 for (auto row_it = mat.begin(); row_it != mat.end(); ++row_it) {
    \n-
    598 for (auto col_it = row_it->begin(); col_it != row_it->end(); ++col_it) {
    \n-
    599 call_back(row_it.index(), col_it.index(), *col_it);
    \n-
    600 }
    \n-
    601 }
    \n-
    602 };
    \n-
    603
    \n-
    604 // accumulate content in another stream so that we write in correct order
    \n-
    605 std::stringstream ss;
    \n-
    606
    \n-
    607 // we need to append current row and col values to the prefixes
    \n-
    608 row_prefix.push_back(0);
    \n-
    609 col_prefix.push_back(0);
    \n-
    610
    \n-
    611 // do we need to write nested matrix blocks?
    \n-
    612 if constexpr (Dune::blockLevel<typename Mat::block_type>() == 0) {
    \n-
    613 // simple case: write svg block content to stream for each value
    \n-
    614 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
    \n-
    615 std::size_t x_off = interspace + col * (interspace + block_size);
    \n-
    616 std::size_t y_off = interspace + row * (interspace + block_size);
    \n-
    617 row_prefix.back() = row;
    \n-
    618 col_prefix.back() = col;
    \n-
    619 opts.writeSVGBlock(ss, row_prefix, col_prefix, val,
    \n-
    620 {x_off, y_off, block_size, block_size});
    \n-
    621 });
    \n-
    622 col_offset += cols * (block_size + interspace);
    \n-
    623 row_offset += rows * (block_size + interspace);
    \n-
    624 } else {
    \n-
    625 // before we write anything, we need to calculate the
    \n-
    626 // offset for every {row,col} index
    \n-
    627 const auto null_offset = std::numeric_limits<std::size_t>::max();
    \n-
    628 std::vector<std::size_t> col_offsets(cols + 1, null_offset);
    \n-
    629 std::vector<std::size_t> row_offsets(rows + 1, null_offset);
    \n-
    630 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
    \n-
    631 NullStream dev0;
    \n-
    632 // get size of sub-block
    \n-
    633 auto sub_size =
    \n-
    634 writeSVGMatrix(dev0, val, opts, row_prefix, col_prefix);
    \n-
    635
    \n-
    636 // if we didn't see col size before
    \n-
    637 if (col_offsets[col + 1] == null_offset) // write it in the offset vector
    \n-
    638 col_offsets[col + 1] = sub_size.first;
    \n-
    639
    \n-
    640 // repeat process for row sizes
    \n-
    641 if (row_offsets[row + 1] == null_offset)
    \n-
    642 row_offsets[row + 1] = sub_size.second;
    \n-
    643 });
    \n-
    644
    \n-
    645 // if some rows/cols were not visited, make an educated guess with the minimum offset
    \n-
    646 auto min_row_offset = *std::min_element(begin(row_offsets), end(row_offsets));
    \n-
    647 std::replace(begin(row_offsets), end(row_offsets), null_offset, min_row_offset);
    \n-
    648 auto min_col_offset = *std::min_element(begin(col_offsets), end(col_offsets));
    \n-
    649 std::replace(begin(col_offsets), end(col_offsets), null_offset, min_col_offset);
    \n-
    650
    \n-
    651 // we have sizes for every block: to get offsets we make a partial sum
    \n-
    652 col_offsets[0] = interspace;
    \n-
    653 row_offsets[0] = interspace;
    \n-
    654 for (std::size_t i = 1; i < col_offsets.size(); i++)
    \n-
    655 col_offsets[i] += col_offsets[i - 1] + interspace;
    \n-
    656 for (std::size_t i = 1; i < row_offsets.size(); i++)
    \n-
    657 row_offsets[i] += row_offsets[i - 1] + interspace;
    \n-
    658
    \n-
    659 for_each_entry([&](const auto &row, const auto &col, const auto &val) {
    \n-
    660 // calculate svg view from offsets
    \n-
    661 std::size_t width =
    \n-
    662 col_offsets[col + 1] - col_offsets[col] - interspace;
    \n-
    663 std::size_t height =
    \n-
    664 row_offsets[row + 1] - row_offsets[row] - interspace;
    \n-
    665 row_prefix.back() = row;
    \n-
    666 col_prefix.back() = col;
    \n-
    667 // content of the sub-block has origin at {0,0}: shift it to the correct place
    \n-
    668 ss << "<svg x='" << col_offsets[col] << "' y='" << row_offsets[row]
    \n-
    669 << "' width='" << width << "' height='" << height << "'>\\n";
    \n-
    670 // write a nested svg with the contents of the sub-block
    \n-
    671 writeSVGMatrix(ss, val, opts, row_prefix, col_prefix);
    \n-
    672 ss << "</svg>\\n";
    \n-
    673 });
    \n-
    674 col_offset = col_offsets.back();
    \n-
    675 row_offset = row_offsets.back();
    \n-
    676 }
    \n-
    677
    \n-
    678 // write content in order!
    \n-
    679 // (i) if required, first header
    \n-
    680 if (write_header)
    \n-
    681 writeSVGMatrixHeader(out, opts, {col_offset, row_offset});
    \n-
    682
    \n-
    683 col_prefix.pop_back();
    \n-
    684 row_prefix.pop_back();
    \n-
    685 // (ii) an svg block for this level
    \n-
    686 opts.writeSVGBlock(out, row_prefix, col_prefix, mat,
    \n-
    687 {0, 0, col_offset, row_offset});
    \n-
    688 // (iii) the content of the matrix
    \n-
    689 out << ss.str();
    \n-
    690 // (iv) if required, close the header
    \n-
    691 if (write_header)
    \n-
    692 out << "</g>\\n</svg>\\n";
    \n-
    693
    \n-
    694 // return the total required for this block
    \n-
    695 return {col_offset, row_offset};
    \n-
    696 }
    \n-
    697 } // namespace Impl
    \n-
    698
    \n-
    699
    \n-
    \n-\n-
    708 std::size_t block_size = 10;
    \n-
    710 std::size_t interspace = 5;
    \n-
    712 std::size_t width = 500;
    \n-
    714 std::size_t height = 0;
    \n-
    716 bool write_header = true;
    \n-
    718 std::string style = " .matrix-block {\\n"
    \n-
    719 " fill: cornflowerblue;\\n"
    \n-
    720 " fill-opacity: 0.4;\\n"
    \n-
    721 " stroke-width: 2;\\n"
    \n-
    722 " stroke: black;\\n"
    \n-
    723 " stroke-opacity: 0.5;\\n"
    \n-
    724 " }\\n"
    \n-
    725 " .matrix-block:hover {\\n"
    \n-
    726 " fill: lightcoral;\\n"
    \n-
    727 " fill-opacity: 0.4;\\n"
    \n-
    728 " stroke-opacity: 1;\\n"
    \n-
    729 " }\\n";
    \n-
    730
    \n-
    742 std::function<std::string(const double&)> color_fill;
    \n-
    743
    \n-
    749 template <class RowPrefix, class ColPrefix>
    \n-
    \n-
    750 std::string blockStyleClass(const RowPrefix &row_prefix,
    \n-
    751 const ColPrefix &col_prefix) const {
    \n-
    752 // here, you can potentially give a different style to each block
    \n-
    753 return "matrix-block";
    \n-
    754 }
    \n-
    \n-
    755
    \n-
    757 bool write_block_title = true;
    \n-
    758
    \n-
    764 template <class Stream, class RowPrefix, class ColPrefix, class Block>
    \n-
    \n-
    765 void writeBlockTitle(Stream& out, const RowPrefix &row_prefix,
    \n-
    766 const ColPrefix &col_prefix,
    \n-
    767 const Block &block) const {
    \n-
    768 if (this->write_block_title) {
    \n-
    769 out << "<title>";
    \n-
    770 assert(row_prefix.size() == col_prefix.size());
    \n-
    771 for (std::size_t i = 0; i < row_prefix.size(); ++i)
    \n-
    772 out << "[" << row_prefix[i] << ", "<< col_prefix[i] << "]";
    \n-
    773 if constexpr (Dune::blockLevel<Block>() == 0)
    \n-
    774 out << ": " << block;
    \n-
    775 out << "</title>\\n";
    \n-
    776 }
    \n-
    777 }
    \n-
    \n-
    778
    \n-
    800 template <class Stream, class RowPrefix, class ColPrefix, class Block>
    \n-
    \n-
    801 void writeSVGBlock(Stream &out,
    \n-
    802 const RowPrefix &row_prefix,
    \n-
    803 const ColPrefix &col_prefix, const Block block,
    \n-
    804 const std::array<std::size_t, 4> &svg_box) const {
    \n-
    805 // get bounding box values
    \n-
    806 auto &[x_off, y_off, width, height] = svg_box;
    \n-
    807 // get style class
    \n-
    808 std::string block_class = this->blockStyleClass(row_prefix, col_prefix);
    \n-
    809 // write a rectangle on the bounding box
    \n-
    810 out << "<rect class='" << block_class << "' x='" << x_off << "' y='"
    \n-
    811 << y_off << "' width='" << width << "' height='" << height << "'";
    \n-
    812 if constexpr (Dune::blockLevel<Block>() == 0 and std::is_convertible<Block,double>{})
    \n-
    813 if (color_fill)
    \n-
    814 out << " style='fill-opacity: 1;fill:" << color_fill(double(block)) << "'";
    \n-
    815
    \n-
    816 out << ">\\n";
    \n-
    817 // give the rectangle a title (in html this shows info about the block)
    \n-
    818 this->writeBlockTitle(out,row_prefix, col_prefix, block);
    \n-
    819 // close rectangle
    \n-
    820 out << "</rect>\\n";
    \n-
    821 }
    \n-
    \n-
    822 };
    \n-
    \n-
    823
    \n-
    838 template <class Mat, class SVGOptions = DefaultSVGMatrixOptions>
    \n-
    \n-
    839 void writeSVGMatrix(std::ostream &out, const Mat &mat, SVGOptions opts = {}) {
    \n-
    840 // We need a vector that can fit all the multi-indices for rows and columns
    \n-
    841 using IndexPrefix = Dune::ReservedVector<std::size_t, blockLevel<Mat>()>;
    \n-
    842 // Call overload for Mat type
    \n-
    843 Impl::writeSVGMatrix(out, mat, opts, IndexPrefix{}, IndexPrefix{});
    \n-
    844 }
    \n-
    \n-
    845
    \n-
    863 template <class Mat, class SVGOptions = DefaultSVGMatrixOptions>
    \n-
    864 [[deprecated("Use signature where std::stream is the first argument. This will be removed after Dune 2.10.")]]
    \n-
    \n-
    865 void writeSVGMatrix(const Mat &mat, std::ostream &out, SVGOptions opts = {}) {
    \n-
    866 writeSVGMatrix(out, mat, opts);
    \n-
    867 }
    \n-
    \n-
    868
    \n-
    871} // namespace Dune
    \n-
    872
    \n-
    873#endif
    \n-
    Helper functions for determining the vector/matrix block level.
    \n-\n-
    Some handy generic functions for ISTL matrices.
    \n-
    Implementation of the BCRSMatrix class.
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n-
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n-
    void writeMatrixToMatlab(const MatrixType &matrix, const std::string &filename, int outputPrecision=18)
    Writes sparse matrix in a Matlab-readable format.
    Definition io.hh:483
    \n-
    void writeMatrixToMatlabHelper(const FieldType &value, int rowOffset, int colOffset, std::ostream &s)
    Helper method for the writeMatrixToMatlab routine.
    Definition io.hh:412
    \n-
    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)
    Print one row of a matrix, specialization for number types.
    Definition io.hh:152
    \n-
    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
    \n-
    void printSparseMatrix(std::ostream &s, const BCRSMatrix< InnerMatrixType, A > &mat, std::string title, std::string rowtext, int width=3, int precision=2)
    Prints a BCRSMatrix with fixed sized blocks.
    Definition io.hh:301
    \n-
    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
    \n-
    void writeVectorToMatlabHelper(const V &v, std::ostream &stream)
    Definition io.hh:496
    \n-
    void writeSVGMatrix(std::ostream &out, const Mat &mat, SVGOptions opts={})
    Writes the visualization of matrix in the SVG format.
    Definition io.hh:839
    \n-
    void writeVectorToMatlab(const VectorType &vector, const std::string &filename, int outputPrecision=18)
    Writes vectors in a Matlab-readable format.
    Definition io.hh:524
    \n-
    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
    \n-
    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
    \n+
    329
    \n+
    332 template <typename... Args>
    \n+
    \n+
    333 std::ostream& operator<< (std::ostream& s, const MultiTypeBlockVector<Args...>& v) {
    \n+
    334 using namespace Dune::Hybrid;
    \n+
    335 forEach(integralRange(Dune::Hybrid::size(v)), [&](auto&& i) {
    \n+
    336 s << "\\t(" << i << "):\\n" << v[i] << "\\n";
    \n+
    337 });
    \n+
    338 return s;
    \n+
    339 }
    \n+
    \n+
    340
    \n+
    341} // end namespace Dune
    \n+
    342
    \n+
    343namespace std
    \n+
    344{
    \n+
    349 template <size_t i, typename... Args>
    \n+
    \n+
    350 struct tuple_element<i,Dune::MultiTypeBlockVector<Args...> >
    \n+
    351 {
    \n+
    352 using type = typename std::tuple_element<i, std::tuple<Args...> >::type;
    \n+
    353 };
    \n+
    \n+
    354
    \n+
    359 template <typename... Args>
    \n+
    \n+
    360 struct tuple_size<Dune::MultiTypeBlockVector<Args...> >
    \n+
    361 : std::integral_constant<std::size_t, sizeof...(Args)>
    \n+
    362 {};
    \n+
    \n+
    363}
    \n+
    364
    \n+
    365#endif
    \n+\n+
    Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
    \n+
    void operator=(const T &newval)
    Assignment operator.
    Definition multitypeblockvector.hh:165
    \n+
    std::size_t size_type
    Type used for vector sizes.
    Definition multitypeblockvector.hh:65
    \n+
    static constexpr size_type N()
    Number of elements.
    Definition multitypeblockvector.hh:110
    \n+
    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
    \n+
    static constexpr size_type size()
    Return the number of non-zero vector entries.
    Definition multitypeblockvector.hh:103
    \n+
    std::tuple_element< index, TupleType >::type & operator[](const std::integral_constant< size_type, index > indexVariable)
    Random-access operator.
    Definition multitypeblockvector.hh:145
    \n+
    typename MultiTypeBlockVector< Args... >::field_type field_type
    Definition multitypeblockvector.hh:44
    \n+
    size_type dim() const
    Number of scalar elements.
    Definition multitypeblockvector.hh:116
    \n+
    Std::detected_t< std::common_type_t, typename FieldTraits< std::decay_t< Args > >::real_type... > real_type
    The type used for real values.
    Definition multitypeblockvector.hh:89
    \n+
    field_type dot(const type &newv) const
    Definition multitypeblockvector.hh:216
    \n+
    void operator*=(const T &w)
    Multiplication with a scalar.
    Definition multitypeblockvector.hh:194
    \n+
    void axpy(const Ta &a, const type &y)
    Axpy operation on this vector (*this += a * y)
    Definition multitypeblockvector.hh:319
    \n+
    real_type two_norm() const
    Compute the Euclidean norm.
    Definition multitypeblockvector.hh:252
    \n+
    void operator/=(const T &w)
    Division by a scalar.
    Definition multitypeblockvector.hh:203
    \n+
    MultiTypeBlockVector< Args... > type
    Definition multitypeblockvector.hh:75
    \n+
    auto one_norm() const
    Compute the 1-norm.
    Definition multitypeblockvector.hh:225
    \n+
    real_type two_norm2() const
    Compute the squared Euclidean norm.
    Definition multitypeblockvector.hh:243
    \n+
    real_type infinity_norm_real() const
    Compute the simplified maximum norm (uses 1-norm for complex values)
    Definition multitypeblockvector.hh:286
    \n+
    void operator-=(const type &newv)
    Definition multitypeblockvector.hh:184
    \n+
    real_type infinity_norm() const
    Compute the maximum norm.
    Definition multitypeblockvector.hh:256
    \n+
    field_type operator*(const type &newv) const
    Definition multitypeblockvector.hh:209
    \n+
    void operator+=(const type &newv)
    Definition multitypeblockvector.hh:174
    \n+
    typename std::tuple_element< i, std::tuple< Args... > >::type type
    Definition multitypeblockvector.hh:352
    \n+
    auto one_norm_real() const
    Compute the simplified 1-norm (uses 1-norm also for complex values)
    Definition multitypeblockvector.hh:234
    \n+
    typename MultiTypeBlockVector< Args... >::real_type real_type
    Definition multitypeblockvector.hh:45
    \n
    STL namespace.
    \n
    Definition allocator.hh:11
    \n-
    Definition matrixutils.hh:211
    \n-
    static auto coldim(const M &A)
    Definition matrixutils.hh:219
    \n-
    static auto rowdim(const M &A)
    Definition matrixutils.hh:214
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    Default options class to write SVG matrices.
    Definition io.hh:706
    \n-
    std::string style
    CSS style block to write in header.
    Definition io.hh:718
    \n-
    std::size_t width
    Final width size (pixels) of the SVG header. If 0, size is automatic.
    Definition io.hh:712
    \n-
    std::function< std::string(const double &)> color_fill
    Color fill for default options.
    Definition io.hh:742
    \n-
    std::size_t block_size
    size (pixels) of the deepst block/value of the matrix
    Definition io.hh:708
    \n-
    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:801
    \n-
    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:765
    \n-
    std::size_t interspace
    size (pixels) of the interspace between blocks
    Definition io.hh:710
    \n-
    bool write_block_title
    (Helper) Whether to write a title on the rectangle value
    Definition io.hh:757
    \n-
    std::size_t height
    Final height size (pixels) of the SVG header. If 0, size is automatic.
    Definition io.hh:714
    \n-
    bool write_header
    Whether to write the SVG header.
    Definition io.hh:716
    \n-
    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:750
    \n-
    ConstIterator class for sequential access.
    Definition matrix.hh:404
    \n-
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n-
    RowIterator end()
    Get iterator to one beyond last row.
    Definition matrix.hh:616
    \n-
    RowIterator begin()
    Get iterator to first row.
    Definition matrix.hh:610
    \n-
    row_type::const_iterator ConstColIterator
    Const iterator for the entries of each row.
    Definition matrix.hh:589
    \n-
    size_type M() const
    Return the number of columns.
    Definition matrix.hh:696
    \n-
    size_type N() const
    Return the number of rows.
    Definition matrix.hh:691
    \n-
    Definition matrixutils.hh:27
    \n+
    std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
    Send BlockVector to an output stream.
    Definition bvector.hh:583
    \n+
    A Vector class to support different block types.
    Definition multitypeblockvector.hh:59
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,838 +1,392 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-io.hh\n+multitypeblockvector.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_IO_HH\n-6#define DUNE_ISTL_IO_HH\n+5#ifndef DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH\n+6#define DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH\n 7\n 8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15\n-16#include \"_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\"\n-17#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-18#include \n-19#include \n-20#include \n-21#include \n-22\n-23#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-24#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+9#include \n+10#include \n+11\n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \n+17\n+18#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+19\n+20// forward declaration\n+21namespace _\bD_\bu_\bn_\be {\n+22 template < typename... Args >\n+23 class MultiTypeBlockVector;\n+24}\n 25\n-26namespace _\bD_\bu_\bn_\be {\n+26#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n 27\n-40 //\n-41 // pretty printing of vectors\n-42 //\n-43\n-51 template\n-_\b5_\b2 void _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b__\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br (std::ostream& s, const V& v, std::string\n-rowtext,\n-53 int& counter, int columns, int width)\n-54 {\n-55 if constexpr (IsNumber())\n-56 {\n-57 // Print one number\n-58 if (counter%columns==0)\n+28namespace _\bD_\bu_\bn_\be {\n+29\n+41 template \n+_\b4_\b2 struct FieldTraits< _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n+43 {\n+_\b4_\b4 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br::field_type;\n+_\b4_\b5 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br::real_type;\n+46 };\n+56 template < typename... Args >\n+_\b5_\b7 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+58 : public std::tuple\n 59 {\n-60 s << rowtext; // start a new row\n-61 s << \" \"; // space in front of each entry\n-62 s.width(4); // set width for counter\n-63 s << counter; // number of first entry in a line\n-64 }\n-65 s << \" \"; // space in front of each entry\n-66 s.width(width); // set width for each entry anew\n-67 s << v; // yeah, the number !\n-68 counter++; // increment the counter\n-69 if (counter%columns==0)\n-70 s << std::endl; // start a new line\n-71 }\n-72 else\n-73 {\n-74 // Recursively print a vector\n-75 for (const auto& entry : v)\n-76 _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b__\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(s,entry,rowtext,counter,columns,width);\n-77 }\n-78 }\n-79\n-80\n-88 template\n-_\b8_\b9 void _\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br (std::ostream& s, const V& v, std::string title,\n-90 std::string rowtext, int columns=1, int width=10,\n-91 int precision=2)\n-92 {\n-93 // count the numbers printed to make columns\n-94 int counter=0;\n-95\n-96 // remember old flags\n-97 std::ios_base::fmtflags oldflags = s.flags();\n-98\n-99 // set the output format\n-100 s.setf(std::ios_base::scientific, std::ios_base::floatfield);\n-101 int oldprec = s.precision();\n-102 s.precision(precision);\n-103\n-104 // print title\n-105 s << title << \" [blocks=\" << v.N() << \",dimension=\" << v.dim() << \"]\"\n-106 << std::endl;\n+61 typedef std::tuple TupleType;\n+62 public:\n+63\n+_\b6_\b5 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = std::size_t;\n+66\n+70 using TupleType::TupleType;\n+71\n+_\b7_\b5 typedef _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br _\bt_\by_\bp_\be;\n+76\n+_\b8_\b2 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = Std::detected_t >_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be...>;\n+83\n+_\b8_\b9 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = Std::detected_t >_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be...>;\n+90\n+91 // make sure that we have an std::common_type: using an assertion produces a\n+more readable error message\n+92 // than a compiler template instantiation error\n+93 static_assert ( sizeof...(Args) == 0 or\n+94 not (std::is_same_v or std::is_same_v),\n+95 \"No std::common_type implemented for the given field_type/real_type of the\n+Args. Please provide an implementation and check that a FieldTraits class is\n+present for your type.\");\n+96\n+97\n+_\b1_\b0_\b3 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be()\n+104 {\n+105 return sizeof...(Args);\n+106 }\n 107\n-108 // print data from all blocks\n-109 _\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b__\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(s,v,rowtext,counter,columns,width);\n-110\n-111 // check if new line is required\n-112 if (counter%columns!=0)\n-113 s << std::endl;\n+_\b1_\b1_\b0 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN()\n+111 {\n+112 return sizeof...(Args);\n+113 }\n 114\n-115 // reset the output format\n-116 s.flags(oldflags);\n-117 s.precision(oldprec);\n-118 }\n-119\n-120\n-122 //\n-123 // pretty printing of matrices\n-124 //\n-125\n-_\b1_\b3_\b3 inline void _\bf_\bi_\bl_\bl_\b__\br_\bo_\bw (std::ostream& s, int m, int width, [[maybe_unused]]\n-int precision)\n-134 {\n-135 for (int j=0; j::value, int> = 0>\n-_\b1_\b5_\b2 void _\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw (std::ostream& s, const K& value,\n-153 [[maybe_unused]] typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be I,\n-154 [[maybe_unused]] typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be J,\n-155 [[maybe_unused]] typename _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b1_\b,_\b1_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be therow,\n-156 int width,\n-157 [[maybe_unused]] int precision)\n+_\b1_\b1_\b6 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bd_\bi_\bm() const\n+117 {\n+118 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be result = 0;\n+119 Hybrid::forEach(std::make_index_sequence<_\bN()>{},\n+120 [&](auto i){result += std::get(*this).dim();});\n+121\n+122 return result;\n+123 }\n+124\n+143 template< size_type index >\n+144 typename std::tuple_element::type&\n+_\b1_\b4_\b5 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ([[maybe_unused]] const std::integral_constant< size_type, index\n+> indexVariable)\n+146 {\n+147 return std::get(*this);\n+148 }\n+149\n+155 template< size_type index >\n+156 const typename std::tuple_element::type&\n+_\b1_\b5_\b7 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ([[maybe_unused]] const std::integral_constant< size_type, index\n+> indexVariable) const\n 158 {\n-159 s << \" \"; // space in front of each entry\n-160 s.width(width); // set width for each entry anew\n-161 s << value;\n-162 }\n-163\n-171 template::value, int> = 0>\n-_\b1_\b7_\b3 void _\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw (std::ostream& s, const M& A, typename M::size_type I,\n-174 typename M::size_type J, typename M::size_type therow,\n-175 int width, int precision)\n-176 {\n-177 typename M::size_type i0=I;\n-178 for (typename M::size_type i=0; i=i0 && therow_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(A,i))\n-181 {\n-182 // the row is in this block row !\n-183 typename M::size_type j0=J;\n-184 for (typename M::size_type j=0; j_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(A,j),width,precision);\n-194\n-195 // advance columns\n-196 j0 += _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(A,j);\n-197 }\n+159 return std::get(*this);\n+160 }\n+161\n+164 template\n+_\b1_\b6_\b5 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const T& newval) {\n+166 Dune::Hybrid::forEach(*this, [&](auto&& entry) {\n+167 entry = newval;\n+168 });\n+169 }\n+170\n+_\b1_\b7_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bt_\by_\bp_\be& newv) {\n+175 using namespace Dune::Hybrid;\n+176 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {\n+177 (*this)[i] += newv[i];\n+178 });\n+179 }\n+180\n+_\b1_\b8_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bt_\by_\bp_\be& newv) {\n+185 using namespace Dune::Hybrid;\n+186 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {\n+187 (*this)[i] -= newv[i];\n+188 });\n+189 }\n+190\n+192 template::value, int> = 0>\n+_\b1_\b9_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const T& w) {\n+195 Hybrid::forEach(*this, [&](auto&& entry) {\n+196 entry *= w;\n+197 });\n 198 }\n-199 // advance rows\n-200 i0 += _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(A,i);\n-201 }\n-202 }\n-203\n-212 template\n-_\b2_\b1_\b3 void _\bp_\br_\bi_\bn_\bt_\bm_\ba_\bt_\br_\bi_\bx (std::ostream& s, const M& A, std::string title,\n-214 std::string rowtext, int width=10, int precision=2)\n-215 {\n-216\n-217 // remember old flags\n-218 std::ios_base::fmtflags oldflags = s.flags();\n-219\n-220 // set the output format\n-221 s.setf(std::ios_base::scientific, std::ios_base::floatfield);\n-222 int oldprec = s.precision();\n-223 s.precision(precision);\n-224\n-225 // print title\n-226 s << title\n-227 << \" [n=\" << A._\bN()\n-228 << \",m=\" << A._\bM()\n-229 << \",rowdim=\" << _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(A)\n-230 << \",coldim=\" << _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(A)\n-231 << \"]\" << std::endl;\n-232\n-233 // print all rows\n-234 for (typename M::size_type i=0; i::rowdim(A); i++)\n-235 {\n-236 s << rowtext; // start a new row\n-237 s << \" \"; // space in front of each entry\n-238 s.width(4); // set width for counter\n-239 s << i; // number of first entry in a line\n-240 _\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw(s,A,0,0,i,width,precision); // generic print\n-241 s << std::endl; // start a new line\n-242 }\n-243\n-244 // reset the output format\n-245 s.flags(oldflags);\n-246 s.precision(oldprec);\n-247 }\n-248\n-249 namespace Impl\n-250 {\n-251 template\n-252 void printInnerMatrixElement(std::ostream& s,\n-253 const B& innerMatrixElement,\n-254 int innerrow, int innercol)\n-255 {\n-256 s<\n-260 void printInnerMatrixElement(std::ostream& s,\n-261 const ScaledIdentityMatrix innerMatrixElement,\n-262 int innerrow, int innercol)\n-263 {\n-264 if (innerrow == innercol)\n-265 s<\n-271 void printInnerMatrixElement(std::ostream& s,\n-272 const FieldMatrix innerMatrixElement,\n-273 int innerrow, int innercol)\n-274 {\n-275 s<\n-_\b3_\b0_\b1 void _\bp_\br_\bi_\bn_\bt_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx(std::ostream& s,\n-302 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bI_\bn_\bn_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be_\b,_\bA_\b>& _\bm_\ba_\bt,\n-303 std::string title, std::string rowtext,\n-304 int width=3, int precision=2)\n-305 {\n-306 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bI_\bn_\bn_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be_\b,_\bA_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n-307 // remember old flags\n-308 std::ios_base::fmtflags oldflags = s.flags();\n-309 // set the output format\n-310 s.setf(std::ios_base::scientific, std::ios_base::floatfield);\n-311 int oldprec = s.precision();\n-312 s.precision(precision);\n-313 // print title\n-314 s << title\n-315 << \" [n=\" << _\bm_\ba_\bt._\bN()\n-316 << \",m=\" << _\bm_\ba_\bt._\bM()\n-317 << \",rowdim=\" << _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(_\bm_\ba_\bt)\n-318 << \",coldim=\" << _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(_\bm_\ba_\bt)\n-319 << \"]\" << std::endl;\n-320\n-321 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Row;\n-322\n-323 constexpr int n = std::decay_t()))>::rows;\n-324 constexpr int m = std::decay_t()))>::cols;\n-325 for(Row row=_\bm_\ba_\bt._\bb_\be_\bg_\bi_\bn(); row != _\bm_\ba_\bt._\be_\bn_\bd(); ++row) {\n-326 int skipcols=0;\n-327 bool reachedEnd=false;\n+199\n+201 template::value, int> = 0>\n+_\b2_\b0_\b3 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const T& w) {\n+204 Hybrid::forEach(*this, [&](auto&& entry) {\n+205 entry /= w;\n+206 });\n+207 }\n+208\n+_\b2_\b0_\b9 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b (const _\bt_\by_\bp_\be& newv) const {\n+210 using namespace Dune::Hybrid;\n+211 return accumulate(integralRange(Hybrid::size(*this)), _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0), [&]\n+(auto&& a, auto&& i) {\n+212 return a + (*this)[i]*newv[i];\n+213 });\n+214 }\n+215\n+_\b2_\b1_\b6 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bd_\bo_\bt (const _\bt_\by_\bp_\be& newv) const {\n+217 using namespace Dune::Hybrid;\n+218 return accumulate(integralRange(Hybrid::size(*this)), _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0), [&]\n+(auto&& a, auto&& i) {\n+219 return a + (*this)[i].dot(newv[i]);\n+220 });\n+221 }\n+222\n+_\b2_\b2_\b5 auto _\bo_\bn_\be_\b__\bn_\bo_\br_\bm() const {\n+226 using namespace Dune::Hybrid;\n+227 return accumulate(*this, _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(0), [&](auto&& a, auto&& entry) {\n+228 return a + entry.one_norm();\n+229 });\n+230 }\n+231\n+_\b2_\b3_\b4 auto _\bo_\bn_\be_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n+235 using namespace Dune::Hybrid;\n+236 return accumulate(*this, _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(0), [&](auto&& a, auto&& entry) {\n+237 return a + entry.one_norm_real();\n+238 });\n+239 }\n+240\n+_\b2_\b4_\b3 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bt_\bw_\bo_\b__\bn_\bo_\br_\bm_\b2() const {\n+244 using namespace Dune::Hybrid;\n+245 return accumulate(*this, _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(0), [&](auto&& a, auto&& entry) {\n+246 return a + entry.two_norm2();\n+247 });\n+248 }\n+249\n+_\b2_\b5_\b2 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bt_\bw_\bo_\b__\bn_\bo_\br_\bm() const {return sqrt(this->_\bt_\bw_\bo_\b__\bn_\bo_\br_\bm_\b2());}\n+253\n+_\b2_\b5_\b6 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const\n+257 {\n+258 using namespace Dune::Hybrid;\n+259 using std::max;\n+260\n+261 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be result = 0.0;\n+262 // Compute max norm tracking appearing nan values\n+263 // if the field type supports nan.\n+264 if constexpr (HasNaN()) {\n+265 // This variable will preserve any nan value\n+266 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be nanTracker = 1.0;\n+267 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+268 forEach(*this, [&](auto&& entry) {\n+269 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be entryNorm = entry.infinity_norm();\n+270 result = max(entryNorm, result);\n+271 nanTracker += entryNorm;\n+272 });\n+273 // Incorporate possible nan value into result\n+274 result *= (nanTracker / nanTracker);\n+275 } else {\n+276 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+277 forEach(*this, [&](auto&& entry) {\n+278 result = max(entry.infinity_norm(), result);\n+279 });\n+280 }\n+281 return result;\n+282 }\n+283\n+_\b2_\b8_\b6 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const\n+287 {\n+288 using namespace Dune::Hybrid;\n+289 using std::max;\n+290\n+291 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be result = 0.0;\n+292 // Compute max norm tracking appearing nan values\n+293 // if the field type supports nan.\n+294 if constexpr (HasNaN()) {\n+295 // This variable will preserve any nan value\n+296 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be nanTracker = 1.0;\n+297 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+298 forEach(*this, [&](auto&& entry) {\n+299 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be entryNorm = entry.infinity_norm_real();\n+300 result = max(entryNorm, result);\n+301 nanTracker += entryNorm;\n+302 });\n+303 // Incorporate possible nan value into result\n+304 result *= (nanTracker / nanTracker);\n+305 } else {\n+306 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+307 forEach(*this, [&](auto&& entry) {\n+308 result = max(entry.infinity_norm_real(), result);\n+309 });\n+310 }\n+311 return result;\n+312 }\n+313\n+318 template\n+_\b3_\b1_\b9 void _\ba_\bx_\bp_\by (const Ta& a, const _\bt_\by_\bp_\be& y) {\n+320 using namespace Dune::Hybrid;\n+321 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {\n+322 (*this)[i].axpy(a, y[i]);\n+323 });\n+324 }\n+325\n+326 };\n+327\n 328\n-329 while(!reachedEnd) {\n-330 for(int innerrow=0; innerrowbegin();\n-334 for(; _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl,++count) {\n-335 if(count=skipcols+width)\n-338 break;\n-339 if(innerrow==0) {\n-340 if(count==skipcols) {\n-341 s << rowtext; // start a new row\n-342 s << \" \"; // space in front of each entry\n-343 s.width(4); // set width for counter\n-344 s << row.index()<<\": \"; // number of first entry in a line\n-345 }\n-346 s.width(4);\n-347 s<<_\bc_\bo_\bl.index()<<\": |\";\n-348 } else {\n-349 if(count==skipcols) {\n-350 for(typename std::string::size_type i=0; i < rowtext.length(); i++)\n-351 s<<\" \";\n-352 s<<\" \";\n-353 }\n-354 s<<\" |\";\n-355 }\n-356 for(int innercol=0; innercol < m; ++innercol) {\n-357 s.width(9);\n-358 Impl::printInnerMatrixElement(s,*_\bc_\bo_\bl,innerrow,innercol);\n-359 }\n-360\n-361 s<<\"|\";\n-362 }\n-363 if(innerrow==n-1 && _\bc_\bo_\bl==row->end())\n-364 reachedEnd = true;\n-365 else\n-366 s << std::endl;\n-367 }\n-368 skipcols += width;\n-369 s << std::endl;\n-370 }\n-371 s << std::endl;\n-372 }\n-373\n-374 // reset the output format\n-375 s.flags(oldflags);\n-376 s.precision(oldprec);\n-377 }\n-378\n-379 namespace\n-380 {\n-381 template\n-382 struct MatlabPODWriter\n-383 {\n-384 static std::ostream& write(const T& t, std::ostream& s)\n-385 {\n-386 s << t;\n-387 return s;\n-388 }\n-389 };\n-390 template\n-391 struct MatlabPODWriter<_\bs_\bt_\bd::complex >\n-392 {\n-393 static std::ostream& write(const std::complex& t, std::ostream& s)\n-394 {\n-395 s << t.real() << \" \" << t.imag();\n-396 return s;\n-397 }\n-398 };\n-399 } // anonymous namespace\n-400\n-410 template ::value, int> = 0>\n-_\b4_\b1_\b2 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br(const FieldType& value,\n-413 int rowOffset, int colOffset,\n-414 std::ostream& s)\n-415 {\n-416 //+1 for Matlab numbering\n-417 s << rowOffset + 1 << \" \" << colOffset + 1 << \" \";\n-418 MatlabPODWriter::write(value, s)<< std::endl;\n-419 }\n-420\n-428 template ::value, int> = 0>\n-_\b4_\b3_\b0 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br(const MatrixType& matrix,\n-431 int externalRowOffset, int externalColOffset,\n-432 std::ostream& s)\n-433 {\n-434 // Precompute the accumulated sizes of the columns\n-435 std::vector colOffset(matrix.M());\n-436 if (colOffset.size() > 0)\n-437 colOffset[0] = 0;\n-438\n-439 for (typename MatrixType::size_type i=0; i_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(matrix,i);\n-442\n-443 typename MatrixType::size_type rowOffset = 0;\n-444\n-445 // Loop over all matrix rows\n-446 for (typename MatrixType::size_type rowIdx=0; rowIdx_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(matrix, rowIdx);\n-459 }\n-460\n-461 }\n-462\n-482 template \n-_\b4_\b8_\b3 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb(const MatrixType& matrix,\n-484 const std::string& filename, int outputPrecision = 18)\n-485 {\n-486 std::ofstream outStream(filename.c_str());\n-487 int oldPrecision = outStream.precision();\n-488 outStream.precision(outputPrecision);\n-489\n-490 _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br(matrix, 0, 0, outStream);\n-491 outStream.precision(oldPrecision);\n-492 }\n-493\n-494 // Recursively write vector entries to a stream\n-495 template\n-_\b4_\b9_\b6 void _\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br (const V& v, std::ostream& stream)\n-497 {\n-498 if constexpr (IsNumber()) {\n-499 stream << v << std::endl;\n-500 } else {\n-501 for (const auto& entry : v)\n-502 _\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br(entry, stream);\n-503 }\n-504 }\n-505\n-523 template \n-_\b5_\b2_\b4 void _\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb(const VectorType& vector,\n-525 const std::string& filename, int outputPrecision = 18)\n-526 {\n-527 std::ofstream outStream(filename.c_str());\n-528 int oldPrecision = outStream.precision();\n-529 outStream.precision(outputPrecision);\n-530\n-531 _\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br(vector, outStream);\n-532 outStream.precision(oldPrecision);\n-533 }\n-534\n-535 namespace Impl {\n-536\n-538 struct NullStream {\n-539 template \n-540 friend NullStream &operator<<(NullStream &dev0, Any &&) {\n-541 return dev0;\n-542 }\n-543 };\n-544\n-546 // svg shall be closed with a group and an svg. i.e. \"\"\n-547 template \n-548 void writeSVGMatrixHeader(Stream &out, const SVGMatrixOptions &opts,\n-549 std::pair offsets) {\n-550 auto [col_offset, row_offset] = offsets;\n-551 double width = opts.width;\n-552 double height = opts.height;\n-553 // if empty, we try to figure out a sensible value of width and height\n-554 if (opts.width == 0 and opts.height == 0)\n-555 width = height = 500;\n-556 if (opts.width == 0)\n-557 width = opts.height * (double(col_offset) / row_offset);\n-558 if (opts.height == 0)\n-559 height = opts.width * (double(row_offset) / col_offset);\n-560\n-561 // scale group w.r.t final offsets\n-562 double scale_width = width / col_offset;\n-563 double scale_height = height / row_offset;\n-564\n-565 // write the header text\n-566 out << \"\\n\"\n-568 << \"\\n\"\n-570 << \"\\n\";\n-572 }\n-573\n-575 template \n-577 std::pair\n-578 writeSVGMatrix(Stream &out, const Mat &_\bm_\ba_\bt, SVGMatrixOptions opts,\n-579 RowPrefix row_prefix, ColPrefix col_prefix) {\n-580 // get values to fill the offsets\n-581 const auto& block_size = opts.block_size;\n-582 const auto& interspace = opts.interspace;\n-583\n-584 const std::size_t rows = _\bm_\ba_\bt.N();\n-585 const std::size_t cols = _\bm_\ba_\bt.M();\n-586\n-587 // disable header write for recursive calls\n-588 const bool write_header = opts.write_header;\n-589 opts.write_header = false;\n-590\n-591 // counter of offsets for every block\n-592 std::size_t row_offset = interspace;\n-593 std::size_t col_offset = interspace;\n-594\n-595 // lambda helper: for-each value\n-596 auto for_each_entry = [&_\bm_\ba_\bt](const auto &call_back) {\n-597 for (auto row_it = _\bm_\ba_\bt.begin(); row_it != _\bm_\ba_\bt.end(); ++row_it) {\n-598 for (auto col_it = row_it->begin(); col_it != row_it->end(); ++col_it) {\n-599 call_back(row_it.index(), col_it.index(), *col_it);\n-600 }\n-601 }\n-602 };\n-603\n-604 // accumulate content in another stream so that we write in correct order\n-605 std::stringstream ss;\n-606\n-607 // we need to append current row and col values to the prefixes\n-608 row_prefix.push_back(0);\n-609 col_prefix.push_back(0);\n-610\n-611 // do we need to write nested matrix blocks?\n-612 if constexpr (Dune::blockLevel() == 0) {\n-613 // simple case: write svg block content to stream for each value\n-614 for_each_entry([&](const auto &row, const auto &_\bc_\bo_\bl, const auto &val) {\n-615 std::size_t x_off = interspace + _\bc_\bo_\bl * (interspace + block_size);\n-616 std::size_t y_off = interspace + row * (interspace + block_size);\n-617 row_prefix.back() = row;\n-618 col_prefix.back() = _\bc_\bo_\bl;\n-619 opts.writeSVGBlock(ss, row_prefix, col_prefix, val,\n-620 {x_off, y_off, block_size, block_size});\n-621 });\n-622 col_offset += cols * (block_size + interspace);\n-623 row_offset += rows * (block_size + interspace);\n-624 } else {\n-625 // before we write anything, we need to calculate the\n-626 // offset for every {row,col} index\n-627 const auto null_offset = std::numeric_limits::max();\n-628 std::vector col_offsets(cols + 1, null_offset);\n-629 std::vector row_offsets(rows + 1, null_offset);\n-630 for_each_entry([&](const auto &row, const auto &_\bc_\bo_\bl, const auto &val) {\n-631 NullStream dev0;\n-632 // get size of sub-block\n-633 auto sub_size =\n-634 writeSVGMatrix(dev0, val, opts, row_prefix, col_prefix);\n-635\n-636 // if we didn't see col size before\n-637 if (col_offsets[_\bc_\bo_\bl + 1] == null_offset) // write it in the offset vector\n-638 col_offsets[_\bc_\bo_\bl + 1] = sub_size.first;\n-639\n-640 // repeat process for row sizes\n-641 if (row_offsets[row + 1] == null_offset)\n-642 row_offsets[row + 1] = sub_size.second;\n-643 });\n-644\n-645 // if some rows/cols were not visited, make an educated guess with the\n-minimum offset\n-646 auto min_row_offset = *std::min_element(begin(row_offsets), end\n-(row_offsets));\n-647 std::replace(begin(row_offsets), end(row_offsets), null_offset,\n-min_row_offset);\n-648 auto min_col_offset = *std::min_element(begin(col_offsets), end\n-(col_offsets));\n-649 std::replace(begin(col_offsets), end(col_offsets), null_offset,\n-min_col_offset);\n-650\n-651 // we have sizes for every block: to get offsets we make a partial sum\n-652 col_offsets[0] = interspace;\n-653 row_offsets[0] = interspace;\n-654 for (std::size_t i = 1; i < col_offsets.size(); i++)\n-655 col_offsets[i] += col_offsets[i - 1] + interspace;\n-656 for (std::size_t i = 1; i < row_offsets.size(); i++)\n-657 row_offsets[i] += row_offsets[i - 1] + interspace;\n-658\n-659 for_each_entry([&](const auto &row, const auto &_\bc_\bo_\bl, const auto &val) {\n-660 // calculate svg view from offsets\n-661 std::size_t width =\n-662 col_offsets[_\bc_\bo_\bl + 1] - col_offsets[_\bc_\bo_\bl] - interspace;\n-663 std::size_t height =\n-664 row_offsets[row + 1] - row_offsets[row] - interspace;\n-665 row_prefix.back() = row;\n-666 col_prefix.back() = _\bc_\bo_\bl;\n-667 // content of the sub-block has origin at {0,0}: shift it to the correct\n-place\n-668 ss << \"\\n\";\n-670 // write a nested svg with the contents of the sub-block\n-671 writeSVGMatrix(ss, val, opts, row_prefix, col_prefix);\n-672 ss << \"\\n\";\n-673 });\n-674 col_offset = col_offsets.back();\n-675 row_offset = row_offsets.back();\n-676 }\n-677\n-678 // write content in order!\n-679 // (i) if required, first header\n-680 if (write_header)\n-681 writeSVGMatrixHeader(out, opts, {col_offset, row_offset});\n-682\n-683 col_prefix.pop_back();\n-684 row_prefix.pop_back();\n-685 // (ii) an svg block for this level\n-686 opts.writeSVGBlock(out, row_prefix, col_prefix, _\bm_\ba_\bt,\n-687 {0, 0, col_offset, row_offset});\n-688 // (iii) the content of the matrix\n-689 out << ss.str();\n-690 // (iv) if required, close the header\n-691 if (write_header)\n-692 out << \"\\n\\n\";\n-693\n-694 // return the total required for this block\n-695 return {col_offset, row_offset};\n-696 }\n-697 } // namespace Impl\n-698\n-699\n-_\b7_\b0_\b6 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs {\n-_\b7_\b0_\b8 std::size_t _\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be = 10;\n-_\b7_\b1_\b0 std::size_t _\bi_\bn_\bt_\be_\br_\bs_\bp_\ba_\bc_\be = 5;\n-_\b7_\b1_\b2 std::size_t _\bw_\bi_\bd_\bt_\bh = 500;\n-_\b7_\b1_\b4 std::size_t _\bh_\be_\bi_\bg_\bh_\bt = 0;\n-_\b7_\b1_\b6 bool _\bw_\br_\bi_\bt_\be_\b__\bh_\be_\ba_\bd_\be_\br = true;\n-_\b7_\b1_\b8 std::string _\bs_\bt_\by_\bl_\be = \" .matrix-block {\\n\"\n-719 \" fill: cornflowerblue;\\n\"\n-720 \" fill-opacity: 0.4;\\n\"\n-721 \" stroke-width: 2;\\n\"\n-722 \" stroke: black;\\n\"\n-723 \" stroke-opacity: 0.5;\\n\"\n-724 \" }\\n\"\n-725 \" .matrix-block:hover {\\n\"\n-726 \" fill: lightcoral;\\n\"\n-727 \" fill-opacity: 0.4;\\n\"\n-728 \" stroke-opacity: 1;\\n\"\n-729 \" }\\n\";\n-730\n-_\b7_\b4_\b2 std::function _\bc_\bo_\bl_\bo_\br_\b__\bf_\bi_\bl_\bl;\n-743\n-749 template \n-_\b7_\b5_\b0 std::string _\bb_\bl_\bo_\bc_\bk_\bS_\bt_\by_\bl_\be_\bC_\bl_\ba_\bs_\bs(const RowPrefix &row_prefix,\n-751 const ColPrefix &col_prefix) const {\n-752 // here, you can potentially give a different style to each block\n-753 return \"matrix-block\";\n-754 }\n-755\n-_\b7_\b5_\b7 bool _\bw_\br_\bi_\bt_\be_\b__\bb_\bl_\bo_\bc_\bk_\b__\bt_\bi_\bt_\bl_\be = true;\n-758\n-764 template \n-_\b7_\b6_\b5 void _\bw_\br_\bi_\bt_\be_\bB_\bl_\bo_\bc_\bk_\bT_\bi_\bt_\bl_\be(Stream& out, const RowPrefix &row_prefix,\n-766 const ColPrefix &col_prefix,\n-767 const Block &block) const {\n-768 if (this->write_block_title) {\n-769 out << \"\";\n-770 assert(row_prefix.size() == col_prefix.size());\n-771 for (std::size_t i = 0; i < row_prefix.size(); ++i)\n-772 out << \"[\" << row_prefix[i] << \", \"<< col_prefix[i] << \"]\";\n-773 if constexpr (Dune::blockLevel<Block>() == 0)\n-774 out << \": \" << block;\n-775 out << \"\\n\";\n-776 }\n-777 }\n-778\n-800 template \n-_\b8_\b0_\b1 void _\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bB_\bl_\bo_\bc_\bk(Stream &out,\n-802 const RowPrefix &row_prefix,\n-803 const ColPrefix &col_prefix, const Block block,\n-804 const std::array &svg_box) const {\n-805 // get bounding box values\n-806 auto &[x_off, y_off, _\bw_\bi_\bd_\bt_\bh, _\bh_\be_\bi_\bg_\bh_\bt] = svg_box;\n-807 // get style class\n-808 std::string block_class = this->_\bb_\bl_\bo_\bc_\bk_\bS_\bt_\by_\bl_\be_\bC_\bl_\ba_\bs_\bs(row_prefix, col_prefix);\n-809 // write a rectangle on the bounding box\n-810 out << \"() == 0 and std::\n-is_convertible{})\n-813 if (_\bc_\bo_\bl_\bo_\br_\b__\bf_\bi_\bl_\bl)\n-814 out << \" style='fill-opacity: 1;fill:\" << _\bc_\bo_\bl_\bo_\br_\b__\bf_\bi_\bl_\bl(double(block)) << \"'\";\n-815\n-816 out << \">\\n\";\n-817 // give the rectangle a title (in html this shows info about the block)\n-818 this->_\bw_\br_\bi_\bt_\be_\bB_\bl_\bo_\bc_\bk_\bT_\bi_\bt_\bl_\be(out,row_prefix, col_prefix, block);\n-819 // close rectangle\n-820 out << \"\\n\";\n-821 }\n-822 };\n-823\n-838 template \n-_\b8_\b3_\b9 void _\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx(std::ostream &out, const Mat &_\bm_\ba_\bt, SVGOptions opts =\n-{}) {\n-840 // We need a vector that can fit all the multi-indices for rows and columns\n-841 using IndexPrefix = Dune::ReservedVector()>;\n-842 // Call overload for Mat type\n-843 Impl::writeSVGMatrix(out, _\bm_\ba_\bt, opts, IndexPrefix{}, IndexPrefix{});\n-844 }\n-845\n-863 template \n-864 [[deprecated(\"Use signature where std::stream is the first argument. This\n-will be removed after Dune 2.10.\")]]\n-_\b8_\b6_\b5 void _\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx(const Mat &_\bm_\ba_\bt, std::ostream &out, SVGOptions opts =\n-{}) {\n-866 _\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx(out, _\bm_\ba_\bt, opts);\n-867 }\n-868\n-871} // namespace Dune\n-872\n-873#endif\n-_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n-Helper functions for determining the vector/matrix block level.\n+329\n+332 template \n+_\b3_\b3_\b3 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const\n+_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bA_\br_\bg_\bs_\b._\b._\b._\b>& v) {\n+334 using namespace Dune::Hybrid;\n+335 forEach(integralRange(Dune::Hybrid::size(v)), [&](auto&& i) {\n+336 s << \"\\t(\" << i << \"):\\n\" << v[i] << \"\\n\";\n+337 });\n+338 return s;\n+339 }\n+340\n+341} // end namespace Dune\n+342\n+343namespace _\bs_\bt_\bd\n+344{\n+349 template \n+_\b3_\b5_\b0 struct tuple_element >\n+351 {\n+_\b3_\b5_\b2 using _\bt_\by_\bp_\be = typename std::tuple_element >::type;\n+353 };\n+354\n+359 template \n+_\b3_\b6_\b0 struct tuple_size<_\bD_\bu_\bn_\be::MultiTypeBlockVector >\n+361 : std::integral_constant\n+362 {};\n+363}\n+364\n+365#endif\n _\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\n-Some handy generic functions for ISTL matrices.\n-_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implementation of the BCRSMatrix class.\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n-_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n-_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb\n-void writeMatrixToMatlab(const MatrixType &matrix, const std::string &filename,\n-int outputPrecision=18)\n-Writes sparse matrix in a Matlab-readable format.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:483\n-_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br\n-void writeMatrixToMatlabHelper(const FieldType &value, int rowOffset, int\n-colOffset, std::ostream &s)\n-Helper method for the writeMatrixToMatlab routine.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:412\n-_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\br_\bo_\bw\n-void print_row(std::ostream &s, const K &value, typename FieldMatrix< K, 1, 1\n->::size_type I, typename FieldMatrix< K, 1, 1 >::size_type J, typename\n-FieldMatrix< K, 1, 1 >::size_type therow, int width, int precision)\n-Print one row of a matrix, specialization for number types.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:152\n-_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bm_\ba_\bt_\br_\bi_\bx\n-void printmatrix(std::ostream &s, const M &A, std::string title, std::string\n-rowtext, int width=10, int precision=2)\n-Print a generic block matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:213\n-_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n-void printSparseMatrix(std::ostream &s, const BCRSMatrix< InnerMatrixType, A >\n-&mat, std::string title, std::string rowtext, int width=3, int precision=2)\n-Prints a BCRSMatrix with fixed sized blocks.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:301\n-_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br\n-void printvector(std::ostream &s, const V &v, std::string title, std::string\n-rowtext, int columns=1, int width=10, int precision=2)\n-Print an ISTL vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:89\n-_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb_\bH_\be_\bl_\bp_\be_\br\n-void writeVectorToMatlabHelper(const V &v, std::ostream &stream)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:496\n-_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx\n-void writeSVGMatrix(std::ostream &out, const Mat &mat, SVGOptions opts={})\n-Writes the visualization of matrix in the SVG format.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:839\n-_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bV_\be_\bc_\bt_\bo_\br_\bT_\bo_\bM_\ba_\bt_\bl_\ba_\bb\n-void writeVectorToMatlab(const VectorType &vector, const std::string &filename,\n-int outputPrecision=18)\n-Writes vectors in a Matlab-readable format.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:524\n-_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bv_\be_\b__\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br\n-void recursive_printvector(std::ostream &s, const V &v, std::string rowtext,\n-int &counter, int columns, int width)\n-Recursively print a vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\bl_\bl_\b__\br_\bo_\bw\n-void fill_row(std::ostream &s, int m, int width, int precision)\n-Print a row of zeros for a non-existing block.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:133\n+_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\n+Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n+generic way.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+void operator=(const T &newval)\n+Assignment operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::size_t size_type\n+Type used for vector sizes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bN\n+static constexpr size_type N()\n+Number of elements.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Std::detected_t< std::common_type_t, typename FieldTraits< std::decay_t< Args >\n+>::field_type... > field_type\n+The type used for scalars.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n+static constexpr size_type size()\n+Return the number of non-zero vector entries.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:103\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+std::tuple_element< index, TupleType >::type & operator[](const std::\n+integral_constant< size_type, index > indexVariable)\n+Random-access operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:145\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename MultiTypeBlockVector< Args... >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bm\n+size_type dim() const\n+Number of scalar elements.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+Std::detected_t< std::common_type_t, typename FieldTraits< std::decay_t< Args >\n+>::real_type... > real_type\n+The type used for real values.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bt\n+field_type dot(const type &newv) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n+void operator*=(const T &w)\n+Multiplication with a scalar.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\ba_\bx_\bp_\by\n+void axpy(const Ta &a, const type &y)\n+Axpy operation on this vector (*this += a * y)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:319\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bt_\bw_\bo_\b__\bn_\bo_\br_\bm\n+real_type two_norm() const\n+Compute the Euclidean norm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:252\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n+void operator/=(const T &w)\n+Division by a scalar.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:203\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bt_\by_\bp_\be\n+MultiTypeBlockVector< Args... > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bn_\be_\b__\bn_\bo_\br_\bm\n+auto one_norm() const\n+Compute the 1-norm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:225\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bt_\bw_\bo_\b__\bn_\bo_\br_\bm_\b2\n+real_type two_norm2() const\n+Compute the squared Euclidean norm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:243\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n+real_type infinity_norm_real() const\n+Compute the simplified maximum norm (uses 1-norm for complex values)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:286\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n+void operator-=(const type &newv)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:184\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n+real_type infinity_norm() const\n+Compute the maximum norm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:256\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+field_type operator*(const type &newv) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:209\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n+void operator+=(const type &newv)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:174\n+_\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+typename std::tuple_element< i, std::tuple< Args... > >::type type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:352\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bn_\be_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n+auto one_norm_real() const\n+Compute the simplified 1-norm (uses 1-norm also for complex values)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:234\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+typename MultiTypeBlockVector< Args... >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:45\n _\bs_\bt_\bd\n STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static auto coldim(const M &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static auto rowdim(const M &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:214\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs\n-Default options class to write SVG matrices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:706\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bs_\bt_\by_\bl_\be\n-std::string style\n-CSS style block to write in header.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:718\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bw_\bi_\bd_\bt_\bh\n-std::size_t width\n-Final width size (pixels) of the SVG header. If 0, size is automatic.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:712\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bc_\bo_\bl_\bo_\br_\b__\bf_\bi_\bl_\bl\n-std::function< std::string(const double &)> color_fill\n-Color fill for default options.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:742\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bs_\bi_\bz_\be\n-std::size_t block_size\n-size (pixels) of the deepst block/value of the matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:708\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bw_\br_\bi_\bt_\be_\bS_\bV_\bG_\bB_\bl_\bo_\bc_\bk\n-void writeSVGBlock(Stream &out, const RowPrefix &row_prefix, const ColPrefix\n-&col_prefix, const Block block, const std::array< std::size_t, 4 > &svg_box)\n-const\n-Write an SVG object for a given block/value in the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:801\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bw_\br_\bi_\bt_\be_\bB_\bl_\bo_\bc_\bk_\bT_\bi_\bt_\bl_\be\n-void writeBlockTitle(Stream &out, const RowPrefix &row_prefix, const ColPrefix\n-&col_prefix, const Block &block) const\n-Helper function writes a title for a given block and prefix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:765\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bi_\bn_\bt_\be_\br_\bs_\bp_\ba_\bc_\be\n-std::size_t interspace\n-size (pixels) of the interspace between blocks\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:710\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bw_\br_\bi_\bt_\be_\b__\bb_\bl_\bo_\bc_\bk_\b__\bt_\bi_\bt_\bl_\be\n-bool write_block_title\n-(Helper) Whether to write a title on the rectangle value\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:757\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bh_\be_\bi_\bg_\bh_\bt\n-std::size_t height\n-Final height size (pixels) of the SVG header. If 0, size is automatic.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:714\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bw_\br_\bi_\bt_\be_\b__\bh_\be_\ba_\bd_\be_\br\n-bool write_header\n-Whether to write the SVG header.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:716\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bV_\bG_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\bt_\bi_\bo_\bn_\bs_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bS_\bt_\by_\bl_\be_\bC_\bl_\ba_\bs_\bs\n-std::string blockStyleClass(const RowPrefix &row_prefix, const ColPrefix\n-&col_prefix) const\n-Helper function that returns an style class for a given prefix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:750\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:404\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-A generic dynamic dense matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-RowIterator end()\n-Get iterator to one beyond last row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:616\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-RowIterator begin()\n-Get iterator to first row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:610\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::const_iterator ConstColIterator\n-Const iterator for the entries of each row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:589\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n-size_type M() const\n-Return the number of columns.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:696\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-size_type N() const\n-Return the number of rows.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:691\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)\n+Send BlockVector to an output stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:583\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A Vector class to support different block types.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:59\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00023.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00023.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: novlpschwarz.hh File Reference\n+dune-istl: owneroverlapcopy.hh File Reference\n \n \n \n \n \n \n \n@@ -71,55 +71,95 @@\n \n
    \n
    \n
    \n \n-
    novlpschwarz.hh File Reference
    \n+Namespaces |\n+Functions
    \n+ \n
    \n
    \n-
    #include <iostream>
    \n-#include <fstream>
    \n+\n+

    Classes providing communication interfaces for overlapping Schwarz methods. \n+More...

    \n+
    #include <new>
    \n+#include <iostream>
    \n #include <vector>
    \n-#include <sstream>
    \n+#include <list>
    \n+#include <map>
    \n+#include <set>
    \n+#include <tuple>
    \n #include <cmath>
    \n-#include <dune/common/timer.hh>
    \n-#include <dune/common/hybridutilities.hh>
    \n-#include "io.hh"
    \n-#include "bvector.hh"
    \n-#include "vbvector.hh"
    \n-#include "bcrsmatrix.hh"
    \n-#include "gsetc.hh"
    \n-#include "ilu.hh"
    \n-#include "operators.hh"
    \n-#include "solvers.hh"
    \n-#include "preconditioners.hh"
    \n-#include "scalarproducts.hh"
    \n-#include "owneroverlapcopy.hh"
    \n+#include <mpi.h>
    \n+#include <dune/common/enumset.hh>
    \n+#include <dune/common/parallel/indexset.hh>
    \n+#include <dune/common/parallel/communicator.hh>
    \n+#include <dune/common/parallel/remoteindices.hh>
    \n+#include <dune/common/parallel/mpicommunication.hh>
    \n+#include "solvercategory.hh"
    \n+#include "istlexception.hh"
    \n+#include <dune/common/parallel/communication.hh>
    \n+#include <dune/istl/matrixmarket.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n \n-\n-\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::NonoverlappingSchwarzOperator< M, X, Y, C >
     A nonoverlapping operator with communication object. More...
    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...
     
    class  Dune::NonoverlappingBlockPreconditioner< C, P >
     Nonoverlapping parallel preconditioner. More...
    struct  Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::CopyGatherScatter< T >
     gather/scatter callback for communication More...
     
    struct  Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::AddGatherScatter< T >
     
    \n \n \n \n-\n-\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n+\n+\n+\n+\n

    \n+Functions

    template<int dim, template< class, class > class Comm>
    void testRedistributed (int s)
     
    \n+

    Detailed Description

    \n+

    Classes providing communication interfaces for overlapping Schwarz methods.

    \n+
    Author
    Peter Bastian
    \n+

    Function Documentation

    \n+\n+

    ◆ testRedistributed()

    \n+\n+
    \n+
    \n+
    \n+template<int dim, template< class, class > class Comm>
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    void testRedistributed (int s)
    \n+
    \n+\n+
    \n+
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,41 +1,65 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-novlpschwarz.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+owneroverlapcopy.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+Classes providing communication interfaces for overlapping Schwarz methods.\n+_\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n #include \n-#include \n #include \n-#include \n+#include \n+#include \n+#include \n+#include \n #include \n-#include \n-#include \n-#include \"_\bi_\bo_\b._\bh_\bh\"\n-#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-#include \"_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n-#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n-#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n-#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n-#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n-#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n-#include \"_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\"\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n+#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bm_\ba_\br_\bk_\be_\bt_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>\n-\u00a0 A nonoverlapping operator with communication object. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt\n+\u00a0 Attribute set for overlapping Schwarz. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bP_\b _\b>\n-\u00a0 Nonoverlapping parallel preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b<_\b _\bG_\b,_\b _\bL_\b _\b>\n+\u00a0 Information about the index distribution. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,_\b _\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b _\b>\n+\u00a0 A class setting up standard communication for a two-valued attribute\n+ set with owner/overlap/copy semantics. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,_\b _\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b _\b>_\b:_\b:\n+ _\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bT_\b _\b>\n+\u00a0 gather/scatter callback for communication _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,_\b _\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b _\b>_\b:_\b:\n+ _\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bT_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template class Comm>\n+void\u00a0 _\bt_\be_\bs_\bt_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd (int s)\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Classes providing communication interfaces for overlapping Schwarz methods.\n+ Author\n+ Peter Bastian\n+*\b**\b**\b**\b**\b* F\bFu\bun\bnc\bct\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0t\bte\bes\bst\btR\bRe\bed\bdi\bis\bst\btr\bri\bib\bbu\but\bte\bed\bd(\b()\b) *\b**\b**\b**\b**\b*\n+template class Comm>\n+void testRedistributed ( int\u00a0 s\bs )\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00023_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00023_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: novlpschwarz.hh Source File\n+dune-istl: owneroverlapcopy.hh Source File\n \n \n \n \n \n \n \n@@ -74,381 +74,710 @@\n \n
    \n \n
    \n
    \n
    \n-
    novlpschwarz.hh
    \n+
    owneroverlapcopy.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_NOVLPSCHWARZ_HH
    \n-
    6#define DUNE_ISTL_NOVLPSCHWARZ_HH
    \n+
    5#ifndef DUNE_ISTL_OWNEROVERLAPCOPY_HH
    \n+
    6#define DUNE_ISTL_OWNEROVERLAPCOPY_HH
    \n
    7
    \n-
    8#include <iostream> // for input/output to shell
    \n-
    9#include <fstream> // for input/output to files
    \n-
    10#include <vector> // STL vector class
    \n-
    11#include <sstream>
    \n-
    12
    \n-
    13#include <cmath> // Yes, we do some math here
    \n-
    14
    \n-
    15#include <dune/common/timer.hh>
    \n-
    16
    \n-
    17#include <dune/common/hybridutilities.hh>
    \n-
    18
    \n-
    19#include "io.hh"
    \n-
    20#include "bvector.hh"
    \n-
    21#include "vbvector.hh"
    \n-
    22#include "bcrsmatrix.hh"
    \n-
    23#include "io.hh"
    \n-
    24#include "gsetc.hh"
    \n-
    25#include "ilu.hh"
    \n-
    26#include "operators.hh"
    \n-
    27#include "solvers.hh"
    \n-
    28#include "preconditioners.hh"
    \n-
    29#include "scalarproducts.hh"
    \n-
    30#include "owneroverlapcopy.hh"
    \n+
    8#include <new>
    \n+
    9#include <iostream>
    \n+
    10#include <vector>
    \n+
    11#include <list>
    \n+
    12#include <map>
    \n+
    13#include <set>
    \n+
    14#include <tuple>
    \n+
    15
    \n+
    16#include <cmath>
    \n+
    17
    \n+
    18// MPI header
    \n+
    19#if HAVE_MPI
    \n+
    20#include <mpi.h>
    \n+
    21#endif
    \n+
    22
    \n+
    23#include <dune/common/enumset.hh>
    \n+
    24
    \n+
    25#if HAVE_MPI
    \n+
    26#include <dune/common/parallel/indexset.hh>
    \n+
    27#include <dune/common/parallel/communicator.hh>
    \n+
    28#include <dune/common/parallel/remoteindices.hh>
    \n+
    29#include <dune/common/parallel/mpicommunication.hh>
    \n+
    30#endif
    \n
    31
    \n-
    32namespace Dune {
    \n-
    33
    \n-
    59 template<class M, class X, class Y, class C>
    \n+
    32#include "solvercategory.hh"
    \n+
    33#include "istlexception.hh"
    \n+
    34#include <dune/common/parallel/communication.hh>
    \n+\n+
    36
    \n+
    37template<int dim, template<class,class> class Comm>
    \n+\n+
    39
    \n+
    40
    \n+
    41namespace Dune {
    \n+
    42
    \n+
    \n+\n+
    59 {
    \n
    \n-\n-
    61 {
    \n-
    62 public:
    \n-
    64 typedef M matrix_type;
    \n-
    66 typedef X domain_type;
    \n-
    68 typedef Y range_type;
    \n-
    70 typedef typename X::field_type field_type;
    \n-\n-
    73
    \n-
    74 typedef typename C::PIS PIS;
    \n-
    75 typedef typename C::RI RI;
    \n-
    76 typedef typename RI::RemoteIndexList RIL;
    \n-
    77 typedef typename RI::const_iterator RIIterator;
    \n-
    78 typedef typename RIL::const_iterator RILIterator;
    \n-
    79 typedef typename M::ConstColIterator ColIterator;
    \n-
    80 typedef typename M::ConstRowIterator RowIterator;
    \n-
    81 typedef std::multimap<int,int> MM;
    \n-
    82 typedef std::multimap<int,std::pair<int,RILIterator> > RIMap;
    \n-
    83 typedef typename RIMap::iterator RIMapit;
    \n-
    84
    \n-
    \n-\n-
    93 : _A_(stackobject_to_shared_ptr(A)), communication(com), buildcomm(true)
    \n-
    94 {}
    \n-
    \n-
    95
    \n-
    \n-
    96 NonoverlappingSchwarzOperator (std::shared_ptr<const matrix_type> A, const communication_type& com)
    \n-
    97 : _A_(A), communication(com), buildcomm(true)
    \n-
    98 {}
    \n-
    \n-
    99
    \n-
    \n-
    101 virtual void apply (const X& x, Y& y) const
    \n-
    102 {
    \n-
    103 y = 0;
    \n-
    104 novlp_op_apply(x,y,1);
    \n-
    105 communication.addOwnerCopyToOwnerCopy(y,y);
    \n-
    106 }
    \n-
    \n-
    107
    \n-
    \n-
    109 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
    \n-
    110 {
    \n-
    111 // only apply communication to alpha*A*x to make it consistent,
    \n-
    112 // y already has to be consistent.
    \n-
    113 Y y1(y);
    \n-
    114 y = 0;
    \n-
    115 novlp_op_apply(x,y,alpha);
    \n-
    116 communication.addOwnerCopyToOwnerCopy(y,y);
    \n-
    117 y += y1;
    \n-
    118 }
    \n-
    \n-
    119
    \n-
    \n-
    121 virtual const matrix_type& getmat () const
    \n-
    122 {
    \n-
    123 return *_A_;
    \n-
    124 }
    \n-
    \n-
    125
    \n-
    \n-
    126 void novlp_op_apply (const X& x, Y& y, field_type alpha) const
    \n-
    127 {
    \n-
    128 //get index sets
    \n-
    129 const PIS& pis=communication.indexSet();
    \n-
    130 const RI& ri = communication.remoteIndices();
    \n-
    131
    \n-
    132 // at the beginning make a multimap "bordercontribution".
    \n-
    133 // process has i and j as border dofs but is not the owner
    \n-
    134 // => only contribute to Ax if i,j is in bordercontribution
    \n-
    135 if (buildcomm) {
    \n-
    136
    \n-
    137 // set up mask vector
    \n-
    138 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size())) {
    \n-
    139 mask.resize(x.size());
    \n-
    140 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
    \n-
    141 mask[i] = 1;
    \n-
    142 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
    \n-
    143 if (i->local().attribute()==OwnerOverlapCopyAttributeSet::copy)
    \n-
    144 mask[i->local().local()] = 0;
    \n-
    145 else if (i->local().attribute()==OwnerOverlapCopyAttributeSet::overlap)
    \n-
    146 mask[i->local().local()] = 2;
    \n-
    147 }
    \n-
    148
    \n-
    149 for (MM::iterator iter = bordercontribution.begin();
    \n-
    150 iter != bordercontribution.end(); ++iter)
    \n-
    151 bordercontribution.erase(iter);
    \n-
    152 std::map<int,int> owner; //key: local index i, value: process, that owns i
    \n-
    153 RIMap rimap;
    \n-
    154
    \n-
    155 // for each local index make multimap rimap:
    \n-
    156 // key: local index i, data: pair of process that knows i and pointer to RI entry
    \n-
    157 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i)
    \n-
    158 if (mask[i.index()] == 0)
    \n-
    159 for (RIIterator remote = ri.begin(); remote != ri.end(); ++remote) {
    \n-
    160 RIL& ril = *(remote->second.first);
    \n-
    161 for (RILIterator rindex = ril.begin(); rindex != ril.end(); ++rindex)
    \n-
    162 if (rindex->attribute() != OwnerOverlapCopyAttributeSet::overlap)
    \n-
    163 if (rindex->localIndexPair().local().local() == i.index()) {
    \n-
    164 rimap.insert
    \n-
    165 (std::make_pair(i.index(),
    \n-
    166 std::pair<int,RILIterator>(remote->first, rindex)));
    \n-
    167 if(rindex->attribute()==OwnerOverlapCopyAttributeSet::owner)
    \n-
    168 owner.insert(std::make_pair(i.index(),remote->first));
    \n-
    169 }
    \n-
    170 }
    \n-
    171
    \n-
    172 int iowner = 0;
    \n-
    173 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i) {
    \n-
    174 if (mask[i.index()] == 0) {
    \n-
    175 std::map<int,int>::iterator it = owner.find(i.index());
    \n-
    176 iowner = it->second;
    \n-
    177 std::pair<RIMapit, RIMapit> foundiit = rimap.equal_range(i.index());
    \n-
    178 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j) {
    \n-
    179 if (mask[j.index()] == 0) {
    \n-
    180 bool flag = true;
    \n-
    181 for (RIMapit foundi = foundiit.first; foundi != foundiit.second; ++foundi) {
    \n-
    182 std::pair<RIMapit, RIMapit> foundjit = rimap.equal_range(j.index());
    \n-
    183 for (RIMapit foundj = foundjit.first; foundj != foundjit.second; ++foundj)
    \n-
    184 if (foundj->second.first == foundi->second.first)
    \n-
    185 if (foundj->second.second->attribute() == OwnerOverlapCopyAttributeSet::owner
    \n-
    186 || foundj->second.first == iowner
    \n-
    187 || foundj->second.first < communication.communicator().rank()) {
    \n-
    188 flag = false;
    \n-
    189 continue;
    \n-
    190 }
    \n-
    191 if (!flag)
    \n-
    192 continue;
    \n-
    193 }
    \n-
    194 // don\u00b4t contribute to Ax if
    \n-
    195 // 1. the owner of j has i as interior/border dof
    \n-
    196 // 2. iowner has j as interior/border dof
    \n-
    197 // 3. there is another process with smaller rank that has i and j
    \n-
    198 // as interor/border dofs
    \n-
    199 // if the owner of j does not have i as interior/border dof,
    \n-
    200 // it will not be taken into account
    \n-
    201 if (flag)
    \n-
    202 bordercontribution.insert(std::pair<int,int>(i.index(),j.index()));
    \n-
    203 }
    \n-
    204 }
    \n-
    205 }
    \n-
    206 }
    \n-
    207 buildcomm = false;
    \n-
    208 }
    \n-
    209
    \n-
    210 //compute alpha*A*x nonoverlapping case
    \n-
    211 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i) {
    \n-
    212 if (mask[i.index()] == 0) {
    \n-
    213 //dof doesn't belong to process but is border (not ghost)
    \n-
    214 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j) {
    \n-
    215 if (mask[j.index()] == 1) //j is owner => then sum entries
    \n-
    216 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
    \n-
    217 else if (mask[j.index()] == 0) {
    \n-
    218 std::pair<MM::iterator, MM::iterator> itp =
    \n-
    219 bordercontribution.equal_range(i.index());
    \n-
    220 for (MM::iterator it = itp.first; it != itp.second; ++it)
    \n-
    221 if ((*it).second == (int)j.index())
    \n-
    222 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
    \n-
    223 }
    \n-
    224 }
    \n-
    225 }
    \n-
    226 else if (mask[i.index()] == 1) {
    \n-
    227 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j)
    \n-
    228 if (mask[j.index()] != 2)
    \n-
    229 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
    \n-
    230 }
    \n-
    231 }
    \n-
    232 }
    \n-
    \n-
    233
    \n-
    \n-\n-
    236 {
    \n-\n-
    238 }
    \n-
    \n-
    239
    \n-
    \n-\n-
    242 {
    \n-
    243 return communication;
    \n-
    244 }
    \n-
    \n-
    245 private:
    \n-
    246 std::shared_ptr<const matrix_type> _A_;
    \n-
    247 const communication_type& communication;
    \n-
    248 mutable bool buildcomm;
    \n-
    249 mutable std::vector<double> mask;
    \n-
    250 mutable std::multimap<int,int> bordercontribution;
    \n-
    251 };
    \n-
    \n-
    252
    \n-
    \n-
    255 namespace Amg
    \n-
    256 {
    \n-
    257 template<class T> struct ConstructionTraits;
    \n-
    258 }
    \n-
    \n-
    259
    \n-
    274 template<class C, class P>
    \n-
    \n-\n-
    276 : public Preconditioner<typename P::domain_type,typename P::range_type> {
    \n-
    277 friend struct Amg::ConstructionTraits<NonoverlappingBlockPreconditioner<C,P> >;
    \n-
    278 using X = typename P::domain_type;
    \n-
    279 using Y = typename P::range_type;
    \n-
    280 public:
    \n-
    282 typedef typename P::domain_type domain_type;
    \n-
    284 typedef typename P::range_type range_type;
    \n-\n-
    287
    \n+\n+\n+
    62 };
    \n+
    \n+
    63 };
    \n+
    \n+
    64
    \n+
    76 template <class G, class L>
    \n+
    \n+\n+
    78 {
    \n+
    79 public:
    \n+
    81 typedef G GlobalIdType;
    \n+
    82
    \n+
    84 typedef L LocalIdType;
    \n+
    85
    \n+
    92 typedef std::tuple<GlobalIdType,LocalIdType,int> IndexTripel;
    \n+
    99 typedef std::tuple<int,GlobalIdType,int> RemoteIndexTripel;
    \n+
    100
    \n+
    \n+\n+
    107 {
    \n+
    108 if (std::get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
    \n+\n+\n+
    111 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
    \n+
    112 localindices.insert(x);
    \n+
    113 }
    \n+
    \n+
    114
    \n+
    \n+\n+
    121 {
    \n+
    122 if (std::get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
    \n+\n+\n+
    125 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
    \n+
    126 remoteindices.insert(x);
    \n+
    127 }
    \n+
    \n+
    128
    \n+
    \n+
    133 const std::set<IndexTripel>& localIndices () const
    \n+
    134 {
    \n+
    135 return localindices;
    \n+
    136 }
    \n+
    \n+
    137
    \n+
    \n+
    142 const std::set<RemoteIndexTripel>& remoteIndices () const
    \n+
    143 {
    \n+
    144 return remoteindices;
    \n+
    145 }
    \n+
    \n+
    146
    \n+
    \n+
    150 void clear ()
    \n+
    151 {
    \n+
    152 localindices.clear();
    \n+
    153 remoteindices.clear();
    \n+
    154 }
    \n+
    \n+
    155
    \n+
    156 private:
    \n+
    158 std::set<IndexTripel> localindices;
    \n+
    160 std::set<RemoteIndexTripel> remoteindices;
    \n+
    161 };
    \n+
    \n+
    162
    \n+
    163
    \n+
    164#if HAVE_MPI
    \n+
    165
    \n+
    172 template <class GlobalIdType, class LocalIdType=int>
    \n+
    \n+\n+
    174 {
    \n+
    175 template<typename M, typename G, typename L>
    \n+
    176 friend void loadMatrixMarket(M&,
    \n+
    177 const std::string&,
    \n+\n+
    179 bool);
    \n+
    180 // used types
    \n+\n+\n+
    183 typedef typename std::set<IndexTripel>::const_iterator localindex_iterator;
    \n+
    184 typedef typename std::set<RemoteIndexTripel>::const_iterator remoteindex_iterator;
    \n+\n+
    186 typedef Dune::ParallelLocalIndex<AttributeSet> LI;
    \n+
    187 public:
    \n+
    188 typedef Dune::ParallelIndexSet<GlobalIdType,LI,512> PIS;
    \n+
    189 typedef Dune::RemoteIndices<PIS> RI;
    \n+
    190 typedef Dune::RemoteIndexListModifier<PIS,typename RI::Allocator,false> RILM;
    \n+
    191 typedef typename RI::RemoteIndex RX;
    \n+
    192 typedef Dune::BufferedCommunicator BC;
    \n+
    193 typedef Dune::Interface IF;
    \n+
    194 typedef EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner> OwnerSet;
    \n+
    195 typedef EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy> CopySet;
    \n+
    196 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> OwnerOverlapSet;
    \n+
    197 typedef Dune::AllSet<AttributeSet> AllSet;
    \n+
    198 protected:
    \n+
    199
    \n+
    200
    \n+
    202 template<typename T>
    \n+
    \n+\n+
    204 {
    \n+
    205 typedef typename CommPolicy<T>::IndexedType V;
    \n+
    206
    \n+
    \n+
    207 static V gather(const T& a, std::size_t i)
    \n+
    208 {
    \n+
    209 return a[i];
    \n+
    210 }
    \n+
    \n+
    211
    \n+
    \n+
    212 static void scatter(T& a, V v, std::size_t i)
    \n+
    213 {
    \n+
    214 a[i] = v;
    \n+
    215 }
    \n+
    \n+
    216 };
    \n+
    \n+
    217 template<typename T>
    \n+
    \n+\n+
    219 {
    \n+
    220 typedef typename CommPolicy<T>::IndexedType V;
    \n+
    221
    \n+
    \n+
    222 static V gather(const T& a, std::size_t i)
    \n+
    223 {
    \n+
    224 return a[i];
    \n+
    225 }
    \n+
    \n+
    226
    \n+
    \n+
    227 static void scatter(T& a, V v, std::size_t i)
    \n+
    228 {
    \n+
    229 a[i] += v;
    \n+
    230 }
    \n+
    \n+
    231 };
    \n+
    \n+
    232
    \n+
    \n+\n+
    234 {
    \n+
    235 if (OwnerOverlapToAllInterfaceBuilt)
    \n+
    236 OwnerOverlapToAllInterface.free();
    \n+
    237 OwnerOverlapSet sourceFlags;
    \n+
    238 Combine<OwnerOverlapSet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet>
    \n+
    239 destFlags;
    \n+
    240 OwnerOverlapToAllInterface.build(ri,sourceFlags,destFlags);
    \n+
    241 OwnerOverlapToAllInterfaceBuilt = true;
    \n+
    242 }
    \n+
    \n+
    243
    \n+
    \n+\n+
    245 {
    \n+
    246 if (OwnerToAllInterfaceBuilt)
    \n+
    247 OwnerToAllInterface.free();
    \n+
    248 OwnerSet sourceFlags;
    \n+
    249 AllSet destFlags;
    \n+
    250 OwnerToAllInterface.build(ri,sourceFlags,destFlags);
    \n+
    251 OwnerToAllInterfaceBuilt = true;
    \n+
    252 }
    \n+
    \n+
    253
    \n+
    \n+\n+
    255 {
    \n+
    256 if (OwnerCopyToAllInterfaceBuilt)
    \n+
    257 OwnerCopyToAllInterface.free();
    \n+
    258
    \n+
    259 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
    \n+
    260 OwnerCopySet sourceFlags;
    \n+
    261 Combine<OwnerCopySet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> destFlags;
    \n+
    262 OwnerCopyToAllInterface.build(ri,sourceFlags,destFlags);
    \n+
    263 OwnerCopyToAllInterfaceBuilt = true;
    \n+
    264 }
    \n+
    \n+
    265
    \n+
    \n+\n+
    267 {
    \n+
    268 if (OwnerCopyToOwnerCopyInterfaceBuilt)
    \n+
    269 OwnerCopyToOwnerCopyInterface.free();
    \n+
    270
    \n+
    271
    \n+
    272 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
    \n+
    273 OwnerCopySet sourceFlags;
    \n+
    274 OwnerCopySet destFlags;
    \n+
    275 OwnerCopyToOwnerCopyInterface.build(ri,sourceFlags,destFlags);
    \n+
    276 OwnerCopyToOwnerCopyInterfaceBuilt = true;
    \n+
    277 }
    \n+
    \n+
    278
    \n+
    \n+\n+
    280 {
    \n+
    281 if (CopyToAllInterfaceBuilt)
    \n+
    282 CopyToAllInterface.free();
    \n+
    283 CopySet sourceFlags;
    \n+
    284 AllSet destFlags;
    \n+
    285 CopyToAllInterface.build(ri,sourceFlags,destFlags);
    \n+
    286 CopyToAllInterfaceBuilt = true;
    \n+
    287 }
    \n+
    \n+
    288
    \n+
    289 public:
    \n+
    290
    \n
    \n-\n-
    296 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)
    \n-
    297 { }
    \n+\n+
    296 return category_;
    \n+
    297 }
    \n
    \n
    298
    \n-
    \n-
    306 NonoverlappingBlockPreconditioner (const std::shared_ptr<P>& p, const communication_type& c)
    \n-
    307 : _preconditioner(p), _communication(c)
    \n-
    308 { }
    \n-
    \n-
    309
    \n-
    \n-
    315 virtual void pre (domain_type& x, range_type& b)
    \n-
    316 {
    \n-
    317 _preconditioner->pre(x,b);
    \n-
    318 }
    \n-
    \n-
    319
    \n-
    \n-
    325 virtual void apply (domain_type& v, const range_type& d)
    \n-
    326 {
    \n-
    327 // block preconditioner equivalent to WrappedPreconditioner from
    \n-
    328 // pdelab/backend/ovlpistsolverbackend.hh,
    \n-
    329 // but not to BlockPreconditioner from schwarz.hh
    \n-
    330 _preconditioner->apply(v,d);
    \n-
    331 _communication.addOwnerCopyToOwnerCopy(v,v);
    \n-
    332 }
    \n-
    \n-
    333
    \n-
    334 template<bool forward>
    \n-
    \n-
    335 void apply (X& v, const Y& d)
    \n-
    336 {
    \n-
    337 _preconditioner->template apply<forward>(v,d);
    \n-
    338 _communication.addOwnerCopyToOwnerCopy(v,v);
    \n-
    339 }
    \n-
    \n-
    340
    \n-
    \n-
    346 virtual void post (domain_type& x)
    \n-
    347 {
    \n-
    348 _preconditioner->post(x);
    \n-
    349 }
    \n-
    \n-
    350
    \n-
    \n-\n-
    353 {
    \n-\n-
    355 }
    \n-
    \n-
    356
    \n-
    357 private:
    \n-
    359 std::shared_ptr<P> _preconditioner;
    \n-
    360
    \n-
    362 const communication_type& _communication;
    \n-
    363 };
    \n-
    \n-
    364
    \n-
    367} // end namespace
    \n-
    368
    \n-
    369#endif
    \n-
    Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
    \n-
    Some generic functions for pretty printing vectors and matrices.
    \n-
    Define general preconditioner interface.
    \n-
    Define base class for scalar product and norm.
    \n-
    Implementation of the BCRSMatrix class.
    \n-
    Implementations of the inverse operator interface.
    \n-
    The incomplete LU factorization kernels.
    \n-
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n-\n-
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+
    \n+
    299 const Communication<MPI_Comm>& communicator() const
    \n+
    300 {
    \n+
    301 return cc;
    \n+
    302 }
    \n+
    \n+
    303
    \n+
    310 template<class T>
    \n+
    \n+
    311 void copyOwnerToAll (const T& source, T& dest) const
    \n+
    312 {
    \n+
    313 if (!OwnerToAllInterfaceBuilt)
    \n+\n+\n+
    316 communicator.template build<T>(OwnerToAllInterface);
    \n+
    317 communicator.template forward<CopyGatherScatter<T> >(source,dest);
    \n+
    318 communicator.free();
    \n+
    319 }
    \n+
    \n+
    320
    \n+
    327 template<class T>
    \n+
    \n+
    328 void copyCopyToAll (const T& source, T& dest) const
    \n+
    329 {
    \n+
    330 if (!CopyToAllInterfaceBuilt)
    \n+\n+\n+
    333 communicator.template build<T>(CopyToAllInterface);
    \n+
    334 communicator.template forward<CopyGatherScatter<T> >(source,dest);
    \n+
    335 communicator.free();
    \n+
    336 }
    \n+
    \n+
    337
    \n+
    344 template<class T>
    \n+
    \n+
    345 void addOwnerOverlapToAll (const T& source, T& dest) const
    \n+
    346 {
    \n+
    347 if (!OwnerOverlapToAllInterfaceBuilt)
    \n+\n+\n+
    350 communicator.template build<T>(OwnerOverlapToAllInterface);
    \n+
    351 communicator.template forward<AddGatherScatter<T> >(source,dest);
    \n+
    352 communicator.free();
    \n+
    353 }
    \n+
    \n+
    354
    \n+
    361 template<class T>
    \n+
    \n+
    362 void addOwnerCopyToAll (const T& source, T& dest) const
    \n+
    363 {
    \n+
    364 if (!OwnerCopyToAllInterfaceBuilt)
    \n+\n+\n+
    367 communicator.template build<T>(OwnerCopyToAllInterface);
    \n+
    368 communicator.template forward<AddGatherScatter<T> >(source,dest);
    \n+
    369 communicator.free();
    \n+
    370 }
    \n+
    \n+
    371
    \n+
    378 template<class T>
    \n+
    \n+
    379 void addOwnerCopyToOwnerCopy (const T& source, T& dest) const
    \n+
    380 {
    \n+
    381 if (!OwnerCopyToOwnerCopyInterfaceBuilt)
    \n+\n+\n+
    384 communicator.template build<T>(OwnerCopyToOwnerCopyInterface);
    \n+
    385 communicator.template forward<AddGatherScatter<T> >(source,dest);
    \n+
    386 communicator.free();
    \n+
    387 }
    \n+
    \n+
    388
    \n+
    389
    \n+
    397 template<class T1, class T2>
    \n+
    \n+
    398 void dot (const T1& x, const T1& y, T2& result) const
    \n+
    399 {
    \n+
    400 using real_type = typename FieldTraits<typename T1::field_type>::real_type;
    \n+
    401 // set up mask vector
    \n+
    402 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
    \n+
    403 {
    \n+
    404 mask.resize(x.size());
    \n+
    405 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
    \n+
    406 mask[i] = 1;
    \n+
    407 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
    \n+
    408 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
    \n+
    409 mask[i->local().local()] = 0;
    \n+
    410 }
    \n+
    411 result = T2(0.0);
    \n+
    412
    \n+
    413 for (typename T1::size_type i=0; i<x.size(); i++)
    \n+
    414 result += (x[i]*(y[i]))*static_cast<real_type>(mask[i]);
    \n+
    415 result = cc.sum(result);
    \n+
    416 }
    \n+
    \n+
    417
    \n+
    424 template<class T1>
    \n+
    \n+
    425 typename FieldTraits<typename T1::field_type>::real_type norm (const T1& x) const
    \n+
    426 {
    \n+
    427 using real_type = typename FieldTraits<typename T1::field_type>::real_type;
    \n+
    428
    \n+
    429 // set up mask vector
    \n+
    430 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
    \n+
    431 {
    \n+
    432 mask.resize(x.size());
    \n+
    433 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
    \n+
    434 mask[i] = 1;
    \n+
    435 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
    \n+
    436 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
    \n+
    437 mask[i->local().local()] = 0;
    \n+
    438 }
    \n+
    439 auto result = real_type(0.0);
    \n+
    440 for (typename T1::size_type i=0; i<x.size(); i++)
    \n+
    441 result += Impl::asVector(x[i]).two_norm2()*mask[i];
    \n+
    442 using std::sqrt;
    \n+
    443 return sqrt(cc.sum(result));
    \n+
    444 }
    \n+
    \n+
    445
    \n+
    446 typedef Dune::EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy> CopyFlags;
    \n+
    447
    \n+
    449 typedef Dune::ParallelIndexSet<GlobalIdType,LI,512> ParallelIndexSet;
    \n+
    450
    \n+
    452 typedef Dune::RemoteIndices<PIS> RemoteIndices;
    \n+
    453
    \n+
    456 typedef Dune::GlobalLookupIndexSet<ParallelIndexSet> GlobalLookupIndexSet;
    \n+
    457
    \n+
    \n+\n+
    463 {
    \n+
    464 return pis;
    \n+
    465 }
    \n+
    \n+
    466
    \n+
    \n+\n+
    472 {
    \n+
    473 return ri;
    \n+
    474 }
    \n+
    \n+
    475
    \n+
    \n+\n+
    481 {
    \n+
    482 return pis;
    \n+
    483 }
    \n+
    \n+
    484
    \n+
    485
    \n+
    \n+\n+
    491 {
    \n+
    492 return ri;
    \n+
    493 }
    \n+
    \n+
    494
    \n+
    \n+\n+
    496 {
    \n+
    497 if(globalLookup_) {
    \n+
    498 if(pis.seqNo()==oldseqNo)
    \n+
    499 // Nothing changed!
    \n+
    500 return;
    \n+
    501 delete globalLookup_;
    \n+
    502 }
    \n+
    503
    \n+
    504 globalLookup_ = new GlobalLookupIndexSet(pis);
    \n+
    505 oldseqNo = pis.seqNo();
    \n+
    506 }
    \n+
    \n+
    507
    \n+
    \n+
    508 void buildGlobalLookup(std::size_t size)
    \n+
    509 {
    \n+
    510 if(globalLookup_) {
    \n+
    511 if(pis.seqNo()==oldseqNo)
    \n+
    512 // Nothing changed!
    \n+
    513 return;
    \n+
    514 delete globalLookup_;
    \n+
    515 }
    \n+
    516 globalLookup_ = new GlobalLookupIndexSet(pis, size);
    \n+
    517 oldseqNo = pis.seqNo();
    \n+
    518 }
    \n+
    \n+
    519
    \n+
    \n+\n+
    521 {
    \n+
    522 delete globalLookup_;
    \n+
    523 globalLookup_=0;
    \n+
    524 }
    \n+
    \n+
    525
    \n+
    \n+\n+
    527 {
    \n+
    528 assert(globalLookup_ != 0);
    \n+
    529 return *globalLookup_;
    \n+
    530 }
    \n+
    \n+
    531
    \n+
    537 template<class T1>
    \n+
    \n+
    538 void project (T1& x) const
    \n+
    539 {
    \n+
    540 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
    \n+
    541 if (i->local().attribute()==OwnerOverlapCopyAttributeSet::copy)
    \n+
    542 x[i->local().local()] = 0;
    \n+
    543 }
    \n+
    \n+
    544
    \n+
    \n+\n+\n+
    556 bool freecomm_ = false)
    \n+
    557 : comm(comm_), cc(comm_), pis(), ri(pis,pis,comm_),
    \n+
    558 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
    \n+
    559 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
    \n+
    560 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_),
    \n+
    561 freecomm(freecomm_)
    \n+
    562 {}
    \n+
    \n+
    563
    \n+
    \n+\n+
    573 : comm(MPI_COMM_WORLD), cc(MPI_COMM_WORLD), pis(), ri(pis,pis,MPI_COMM_WORLD),
    \n+
    574 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
    \n+
    575 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
    \n+
    576 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), freecomm(false)
    \n+
    577 {}
    \n+
    \n+
    578
    \n+
    \n+\n+
    587 MPI_Comm comm_,
    \n+\n+
    589 bool freecomm_ = false)
    \n+
    590 : comm(comm_), cc(comm_), OwnerToAllInterfaceBuilt(false),
    \n+
    591 OwnerOverlapToAllInterfaceBuilt(false), OwnerCopyToAllInterfaceBuilt(false),
    \n+
    592 OwnerCopyToOwnerCopyInterfaceBuilt(false), CopyToAllInterfaceBuilt(false),
    \n+
    593 globalLookup_(0), category_(cat_), freecomm(freecomm_)
    \n+
    594 {
    \n+
    595 // set up an ISTL index set
    \n+
    596 pis.beginResize();
    \n+
    597 for (localindex_iterator i=indexinfo.localIndices().begin(); i!=indexinfo.localIndices().end(); ++i)
    \n+
    598 {
    \n+
    599 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
    \n+
    600 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::owner,true));
    \n+
    601 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
    \n+
    602 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::overlap,true));
    \n+
    603 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
    \n+
    604 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::copy,true));
    \n+
    605 // std::cout << cc.rank() << ": adding index " << std::get<0>(*i) << " " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl;
    \n+
    606 }
    \n+
    607 pis.endResize();
    \n+
    608
    \n+
    609 // build remote indices WITHOUT communication
    \n+
    610 // std::cout << cc.rank() << ": build remote indices" << std::endl;
    \n+
    611 ri.setIndexSets(pis,pis,cc);
    \n+
    612 if (indexinfo.remoteIndices().size()>0)
    \n+
    613 {
    \n+
    614 remoteindex_iterator i=indexinfo.remoteIndices().begin();
    \n+
    615 int p = std::get<0>(*i);
    \n+
    616 RILM modifier = ri.template getModifier<false,true>(p);
    \n+
    617 typename PIS::const_iterator pi=pis.begin();
    \n+
    618 for ( ; i!=indexinfo.remoteIndices().end(); ++i)
    \n+
    619 {
    \n+
    620 // handle processor change
    \n+
    621 if (p!=std::get<0>(*i))
    \n+
    622 {
    \n+
    623 p = std::get<0>(*i);
    \n+
    624 modifier = ri.template getModifier<false,true>(p);
    \n+
    625 pi=pis.begin();
    \n+
    626 }
    \n+
    627
    \n+
    628 // position to correct entry in parallel index set
    \n+
    629 while (pi->global()!=std::get<1>(*i) && pi!=pis.end())
    \n+
    630 ++pi;
    \n+
    631 if (pi==pis.end())
    \n+
    632 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
    \n+
    633
    \n+
    634 // insert entry
    \n+
    635 // std::cout << cc.rank() << ": adding remote index " << std::get<0>(*i) << " " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl;
    \n+
    636 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
    \n+
    637 modifier.insert(RX(OwnerOverlapCopyAttributeSet::owner,&(*pi)));
    \n+
    638 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
    \n+
    639 modifier.insert(RX(OwnerOverlapCopyAttributeSet::overlap,&(*pi)));
    \n+
    640 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
    \n+
    641 modifier.insert(RX(OwnerOverlapCopyAttributeSet::copy,&(*pi)));
    \n+
    642 }
    \n+
    643 }else{
    \n+
    644 // Force remote indices to be synced!
    \n+
    645 ri.template getModifier<false,true>(0);
    \n+
    646 }
    \n+
    647 }
    \n+
    \n+
    648
    \n+
    649 // destructor: free memory in some objects
    \n+
    \n+\n+
    651 {
    \n+
    652 ri.free();
    \n+
    653 if (OwnerToAllInterfaceBuilt) OwnerToAllInterface.free();
    \n+
    654 if (OwnerOverlapToAllInterfaceBuilt) OwnerOverlapToAllInterface.free();
    \n+
    655 if (OwnerCopyToAllInterfaceBuilt) OwnerCopyToAllInterface.free();
    \n+
    656 if (OwnerCopyToOwnerCopyInterfaceBuilt) OwnerCopyToOwnerCopyInterface.free();
    \n+
    657 if (CopyToAllInterfaceBuilt) CopyToAllInterface.free();
    \n+
    658 if (globalLookup_) delete globalLookup_;
    \n+
    659 if (freecomm && (comm != MPI_COMM_NULL))
    \n+
    660 {
    \n+
    661 // If it is possible to query whether MPI_Finalize
    \n+
    662 // was called, only free the communicator before
    \n+
    663 // calling MPI_Finalize.
    \n+
    664 int wasFinalized = 0;
    \n+
    665 MPI_Finalized(&wasFinalized);
    \n+
    666 if (!wasFinalized) {
    \n+
    667 MPI_Comm_free(&comm);
    \n+
    668 }
    \n+
    669 }
    \n+
    670 }
    \n+
    \n+
    671
    \n+
    672 private:
    \n+\n+
    674 {}
    \n+
    675 MPI_Comm comm;
    \n+
    676 Communication<MPI_Comm> cc;
    \n+
    677 PIS pis;
    \n+
    678 RI ri;
    \n+
    679 mutable IF OwnerToAllInterface;
    \n+
    680 mutable bool OwnerToAllInterfaceBuilt;
    \n+
    681 mutable IF OwnerOverlapToAllInterface;
    \n+
    682 mutable bool OwnerOverlapToAllInterfaceBuilt;
    \n+
    683 mutable IF OwnerCopyToAllInterface;
    \n+
    684 mutable bool OwnerCopyToAllInterfaceBuilt;
    \n+
    685 mutable IF OwnerCopyToOwnerCopyInterface;
    \n+
    686 mutable bool OwnerCopyToOwnerCopyInterfaceBuilt;
    \n+
    687 mutable IF CopyToAllInterface;
    \n+
    688 mutable bool CopyToAllInterfaceBuilt;
    \n+
    689 mutable std::vector<double> mask;
    \n+
    690 int oldseqNo;
    \n+
    691 GlobalLookupIndexSet* globalLookup_;
    \n+
    692 const SolverCategory::Category category_;
    \n+
    693 bool freecomm;
    \n+
    694 };
    \n+
    \n+
    695
    \n+
    696#endif
    \n+
    697
    \n+
    698
    \n+
    701} // end namespace
    \n+
    702
    \n+
    703#endif
    \n+\n+
    void testRedistributed(int s)
    \n+\n+
    Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.
    \n
    Definition allocator.hh:11
    \n-
    A nonoverlapping operator with communication object.
    Definition novlpschwarz.hh:61
    \n-
    C::PIS PIS
    Definition novlpschwarz.hh:74
    \n-
    C communication_type
    The type of the communication object.
    Definition novlpschwarz.hh:72
    \n-
    std::multimap< int, std::pair< int, RILIterator > > RIMap
    Definition novlpschwarz.hh:82
    \n-
    C::RI RI
    Definition novlpschwarz.hh:75
    \n-
    void novlp_op_apply(const X &x, Y &y, field_type alpha) const
    Definition novlpschwarz.hh:126
    \n-
    NonoverlappingSchwarzOperator(std::shared_ptr< const matrix_type > A, const communication_type &com)
    Definition novlpschwarz.hh:96
    \n-
    M::ConstColIterator ColIterator
    Definition novlpschwarz.hh:79
    \n-
    virtual void apply(const X &x, Y &y) const
    apply operator to x:
    Definition novlpschwarz.hh:101
    \n-
    X domain_type
    The type of the domain.
    Definition novlpschwarz.hh:66
    \n-
    virtual SolverCategory::Category category() const
    Category of the linear operator (see SolverCategory::Category)
    Definition novlpschwarz.hh:235
    \n-
    RIMap::iterator RIMapit
    Definition novlpschwarz.hh:83
    \n-
    virtual const matrix_type & getmat() const
    get matrix via *
    Definition novlpschwarz.hh:121
    \n-
    RIL::const_iterator RILIterator
    Definition novlpschwarz.hh:78
    \n-
    std::multimap< int, int > MM
    Definition novlpschwarz.hh:81
    \n-
    Y range_type
    The type of the range.
    Definition novlpschwarz.hh:68
    \n-
    M matrix_type
    The type of the matrix we operate on.
    Definition novlpschwarz.hh:64
    \n-
    M::ConstRowIterator RowIterator
    Definition novlpschwarz.hh:80
    \n-
    const communication_type & getCommunication() const
    Get the object responsible for communication.
    Definition novlpschwarz.hh:241
    \n-
    virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const
    apply operator to x, scale and add:
    Definition novlpschwarz.hh:109
    \n-
    RI::RemoteIndexList RIL
    Definition novlpschwarz.hh:76
    \n-
    X::field_type field_type
    The field type of the range.
    Definition novlpschwarz.hh:70
    \n-
    NonoverlappingSchwarzOperator(const matrix_type &A, const communication_type &com)
    constructor: just store a reference to a matrix.
    Definition novlpschwarz.hh:92
    \n-
    RI::const_iterator RIIterator
    Definition novlpschwarz.hh:77
    \n-
    Nonoverlapping parallel preconditioner.
    Definition novlpschwarz.hh:276
    \n-
    NonoverlappingBlockPreconditioner(P &p, const communication_type &c)
    Constructor.
    Definition novlpschwarz.hh:295
    \n-
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition novlpschwarz.hh:352
    \n-
    virtual void apply(domain_type &v, const range_type &d)
    Apply the preconditioner.
    Definition novlpschwarz.hh:325
    \n-
    P::range_type range_type
    The range type of the preconditioner.
    Definition novlpschwarz.hh:284
    \n-
    NonoverlappingBlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c)
    Constructor.
    Definition novlpschwarz.hh:306
    \n-
    virtual void post(domain_type &x)
    Clean up.
    Definition novlpschwarz.hh:346
    \n-
    C communication_type
    The type of the communication object.
    Definition novlpschwarz.hh:286
    \n-
    virtual void pre(domain_type &x, range_type &b)
    Prepare the preconditioner.
    Definition novlpschwarz.hh:315
    \n-
    void apply(X &v, const Y &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition novlpschwarz.hh:335
    \n-
    P::domain_type domain_type
    The domain type of the preconditioner.
    Definition novlpschwarz.hh:282
    \n-
    A linear operator exporting itself in matrix form.
    Definition operators.hh:111
    \n+
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    Attribute set for overlapping Schwarz.
    Definition owneroverlapcopy.hh:59
    \n+
    AttributeSet
    Definition owneroverlapcopy.hh:60
    \n
    @ owner
    Definition owneroverlapcopy.hh:61
    \n
    @ copy
    Definition owneroverlapcopy.hh:61
    \n
    @ overlap
    Definition owneroverlapcopy.hh:61
    \n-
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    Information about the index distribution.
    Definition owneroverlapcopy.hh:78
    \n+
    std::tuple< GlobalIdType, LocalIdType, int > IndexTripel
    A triple describing a local index.
    Definition owneroverlapcopy.hh:92
    \n+
    void addRemoteIndex(const RemoteIndexTripel &x)
    Add a new remote index triple to the set of remote indices.
    Definition owneroverlapcopy.hh:120
    \n+
    G GlobalIdType
    The type of the global index.
    Definition owneroverlapcopy.hh:81
    \n+
    const std::set< IndexTripel > & localIndices() const
    Get the set of indices local to the process.
    Definition owneroverlapcopy.hh:133
    \n+
    const std::set< RemoteIndexTripel > & remoteIndices() const
    Get the set of remote indices.
    Definition owneroverlapcopy.hh:142
    \n+
    L LocalIdType
    The type of the local index.
    Definition owneroverlapcopy.hh:84
    \n+
    void clear()
    Remove all indices from the sets.
    Definition owneroverlapcopy.hh:150
    \n+
    void addLocalIndex(const IndexTripel &x)
    Add a new index triple to the set of local indices.
    Definition owneroverlapcopy.hh:106
    \n+
    std::tuple< int, GlobalIdType, int > RemoteIndexTripel
    A triple describing a remote index.
    Definition owneroverlapcopy.hh:99
    \n+
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n+
    EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopySet
    Definition owneroverlapcopy.hh:195
    \n+
    const GlobalLookupIndexSet & globalLookup() const
    Definition owneroverlapcopy.hh:526
    \n+
    FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const
    Compute the global Euclidean norm of a vector.
    Definition owneroverlapcopy.hh:425
    \n+
    void buildOwnerOverlapToAllInterface() const
    Definition owneroverlapcopy.hh:233
    \n+
    Dune::ParallelIndexSet< GlobalIdType, LI, 512 > PIS
    Definition owneroverlapcopy.hh:188
    \n+
    void buildOwnerCopyToAllInterface() const
    Definition owneroverlapcopy.hh:254
    \n+
    void buildOwnerCopyToOwnerCopyInterface() const
    Definition owneroverlapcopy.hh:266
    \n+
    OwnerOverlapCopyCommunication(const IndexInfoFromGrid< GlobalIdType, LocalIdType > &indexinfo, MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
    Constructor.
    Definition owneroverlapcopy.hh:586
    \n+
    SolverCategory::Category category() const
    Get Solver Category.
    Definition owneroverlapcopy.hh:295
    \n+
    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
    \n+
    void buildCopyToAllInterface() const
    Definition owneroverlapcopy.hh:279
    \n+
    Dune::EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopyFlags
    Definition owneroverlapcopy.hh:446
    \n+
    RemoteIndices & remoteIndices()
    Get the underlying remote indices.
    Definition owneroverlapcopy.hh:490
    \n+
    const ParallelIndexSet & indexSet() const
    Get the underlying parallel index set.
    Definition owneroverlapcopy.hh:462
    \n+
    Dune::RemoteIndices< PIS > RI
    Definition owneroverlapcopy.hh:189
    \n+
    void buildGlobalLookup(std::size_t size)
    Definition owneroverlapcopy.hh:508
    \n+
    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
    \n+
    Dune::RemoteIndices< PIS > RemoteIndices
    The type of the remote indices.
    Definition owneroverlapcopy.hh:452
    \n+
    void project(T1 &x) const
    Set vector to zero at copy dofs.
    Definition owneroverlapcopy.hh:538
    \n+
    Dune::AllSet< AttributeSet > AllSet
    Definition owneroverlapcopy.hh:197
    \n+
    Combine< EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner >, EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::overlap >, AttributeSet > OwnerOverlapSet
    Definition owneroverlapcopy.hh:196
    \n+
    void copyCopyToAll(const T &source, T &dest) const
    Communicate values from copy data points to all other data points.
    Definition owneroverlapcopy.hh:328
    \n+
    Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
    The type of the reverse lookup of indices.
    Definition owneroverlapcopy.hh:456
    \n+
    Dune::Interface IF
    Definition owneroverlapcopy.hh:193
    \n+
    ~OwnerOverlapCopyCommunication()
    Definition owneroverlapcopy.hh:650
    \n+
    void buildGlobalLookup()
    Definition owneroverlapcopy.hh:495
    \n+
    Dune::BufferedCommunicator BC
    Definition owneroverlapcopy.hh:192
    \n+
    OwnerOverlapCopyCommunication(MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
    Construct the communication without any indices.
    Definition owneroverlapcopy.hh:554
    \n+
    ParallelIndexSet & indexSet()
    Get the underlying parallel index set.
    Definition owneroverlapcopy.hh:480
    \n+
    void dot(const T1 &x, const T1 &y, T2 &result) const
    Compute a global dot product of two vectors.
    Definition owneroverlapcopy.hh:398
    \n+
    const Communication< MPI_Comm > & communicator() const
    Definition owneroverlapcopy.hh:299
    \n+
    OwnerOverlapCopyCommunication(SolverCategory::Category cat_=SolverCategory::overlapping)
    Construct the communication without any indices using MPI_COMM_WORLD.
    Definition owneroverlapcopy.hh:572
    \n+
    EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet
    Definition owneroverlapcopy.hh:194
    \n+
    void copyOwnerToAll(const T &source, T &dest) const
    Communicate values from owner data points to all other data points.
    Definition owneroverlapcopy.hh:311
    \n+
    const RemoteIndices & remoteIndices() const
    Get the underlying remote indices.
    Definition owneroverlapcopy.hh:471
    \n+
    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
    \n+
    RI::RemoteIndex RX
    Definition owneroverlapcopy.hh:191
    \n+
    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
    \n+
    void freeGlobalLookup()
    Definition owneroverlapcopy.hh:520
    \n+
    Dune::RemoteIndexListModifier< PIS, typename RI::Allocator, false > RILM
    Definition owneroverlapcopy.hh:190
    \n+
    Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
    The type of the parallel index set.
    Definition owneroverlapcopy.hh:449
    \n+
    void buildOwnerToAllInterface() const
    Definition owneroverlapcopy.hh:244
    \n+
    gather/scatter callback for communication
    Definition owneroverlapcopy.hh:204
    \n+
    static V gather(const T &a, std::size_t i)
    Definition owneroverlapcopy.hh:207
    \n+
    static void scatter(T &a, V v, std::size_t i)
    Definition owneroverlapcopy.hh:212
    \n+
    CommPolicy< T >::IndexedType V
    Definition owneroverlapcopy.hh:205
    \n+\n+
    CommPolicy< T >::IndexedType V
    Definition owneroverlapcopy.hh:220
    \n+
    static V gather(const T &a, std::size_t i)
    Definition owneroverlapcopy.hh:222
    \n+
    static void scatter(T &a, V v, std::size_t i)
    Definition owneroverlapcopy.hh:227
    \n
    Category
    Definition solvercategory.hh:23
    \n-
    @ nonoverlapping
    Category for non-overlapping solvers.
    Definition solvercategory.hh:27
    \n+
    @ overlapping
    Category for overlapping solvers.
    Definition solvercategory.hh:29
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,474 +1,837 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-novlpschwarz.hh\n+owneroverlapcopy.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_NOVLPSCHWARZ_HH\n-6#define DUNE_ISTL_NOVLPSCHWARZ_HH\n+5#ifndef DUNE_ISTL_OWNEROVERLAPCOPY_HH\n+6#define DUNE_ISTL_OWNEROVERLAPCOPY_HH\n 7\n-8#include // for input/output to shell\n-9#include // for input/output to files\n-10#include // STL vector class\n-11#include \n-12\n-13#include // Yes, we do some math here\n-14\n-15#include \n-16\n-17#include \n-18\n-19#include \"_\bi_\bo_\b._\bh_\bh\"\n-20#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-21#include \"_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-22#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-23#include \"_\bi_\bo_\b._\bh_\bh\"\n-24#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n-25#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n-26#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n-27#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n-28#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n-29#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n-30#include \"_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\"\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15\n+16#include \n+17\n+18// MPI header\n+19#if HAVE_MPI\n+20#include \n+21#endif\n+22\n+23#include \n+24\n+25#if HAVE_MPI\n+26#include \n+27#include \n+28#include \n+29#include \n+30#endif\n 31\n-32namespace _\bD_\bu_\bn_\be {\n-33\n-59 template\n-_\b6_\b0 class _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br : public _\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-61 {\n-62 public:\n-_\b6_\b4 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b6_\b6 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b6_\b8 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b7_\b0 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b7_\b2 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n-73\n-_\b7_\b4 typedef typename C::PIS _\bP_\bI_\bS;\n-_\b7_\b5 typedef typename C::RI _\bR_\bI;\n-_\b7_\b6 typedef typename RI::RemoteIndexList _\bR_\bI_\bL;\n-_\b7_\b7 typedef typename RI::const_iterator _\bR_\bI_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b7_\b8 typedef typename RIL::const_iterator _\bR_\bI_\bL_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b7_\b9 typedef typename M::ConstColIterator _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b8_\b0 typedef typename M::ConstRowIterator _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b8_\b1 typedef std::multimap _\bM_\bM;\n-_\b8_\b2 typedef std::multimap > _\bR_\bI_\bM_\ba_\bp;\n-_\b8_\b3 typedef typename RIMap::iterator _\bR_\bI_\bM_\ba_\bp_\bi_\bt;\n-84\n-_\b9_\b2 _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br (const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& A, const\n-_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& com)\n-93 : _A_(stackobject_to_shared_ptr(A)), communication(com), buildcomm(true)\n-94 {}\n-95\n-_\b9_\b6 _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br (std::shared_ptr A, const\n-_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& com)\n-97 : _A_(A), communication(com), buildcomm(true)\n-98 {}\n-99\n-_\b1_\b0_\b1 virtual void _\ba_\bp_\bp_\bl_\by (const X& x, Y& y) const\n-102 {\n-103 y = 0;\n-104 _\bn_\bo_\bv_\bl_\bp_\b__\bo_\bp_\b__\ba_\bp_\bp_\bl_\by(x,y,1);\n-105 communication.addOwnerCopyToOwnerCopy(y,y);\n-106 }\n-107\n-_\b1_\b0_\b9 virtual void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha, const X& x, Y& y) const\n-110 {\n-111 // only apply communication to alpha*A*x to make it consistent,\n-112 // y already has to be consistent.\n-113 Y y1(y);\n-114 y = 0;\n-115 _\bn_\bo_\bv_\bl_\bp_\b__\bo_\bp_\b__\ba_\bp_\bp_\bl_\by(x,y,alpha);\n-116 communication.addOwnerCopyToOwnerCopy(y,y);\n-117 y += y1;\n-118 }\n-119\n-_\b1_\b2_\b1 virtual const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bg_\be_\bt_\bm_\ba_\bt () const\n-122 {\n-123 return *_A_;\n-124 }\n-125\n-_\b1_\b2_\b6 void _\bn_\bo_\bv_\bl_\bp_\b__\bo_\bp_\b__\ba_\bp_\bp_\bl_\by (const X& x, Y& y, _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha) const\n-127 {\n-128 //get index sets\n-129 const _\bP_\bI_\bS& pis=communication.indexSet();\n-130 const _\bR_\bI& ri = communication.remoteIndices();\n-131\n-132 // at the beginning make a multimap \"bordercontribution\".\n-133 // process has i and j as border dofs but is not the owner\n-134 // => only contribute to Ax if i,j is in bordercontribution\n-135 if (buildcomm) {\n-136\n-137 // set up mask vector\n-138 if (mask.size()!=static_cast::size_type>\n-(x.size())) {\n-139 mask.resize(x.size());\n-140 for (typename std::vector::size_type i=0; ilocal().attribute()==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n-144 mask[i->local().local()] = 0;\n-145 else if (i->local().attribute()==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp)\n-146 mask[i->local().local()] = 2;\n-147 }\n-148\n-149 for (MM::iterator iter = bordercontribution.begin();\n-150 iter != bordercontribution.end(); ++iter)\n-151 bordercontribution.erase(iter);\n-152 std::map owner; //key: local index i, value: process, that owns i\n-153 _\bR_\bI_\bM_\ba_\bp rimap;\n-154\n-155 // for each local index make multimap rimap:\n-156 // key: local index i, data: pair of process that knows i and pointer to RI\n-entry\n-157 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i = _A_->begin(); i != _A_->end(); ++i)\n-158 if (mask[i.index()] == 0)\n-159 for (_\bR_\bI_\bI_\bt_\be_\br_\ba_\bt_\bo_\br remote = ri.begin(); remote != ri.end(); ++remote) {\n-160 _\bR_\bI_\bL& ril = *(remote->second.first);\n-161 for (_\bR_\bI_\bL_\bI_\bt_\be_\br_\ba_\bt_\bo_\br rindex = ril.begin(); rindex != ril.end(); ++rindex)\n-162 if (rindex->attribute() != _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp)\n-163 if (rindex->localIndexPair().local().local() == i.index()) {\n-164 rimap.insert\n-165 (std::make_pair(i.index(),\n-166 std::pair(remote->first, rindex)));\n-167 if(rindex->attribute()==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br)\n-168 owner.insert(std::make_pair(i.index(),remote->first));\n-169 }\n-170 }\n-171\n-172 int iowner = 0;\n-173 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i = _A_->begin(); i != _A_->end(); ++i) {\n-174 if (mask[i.index()] == 0) {\n-175 std::map::iterator it = owner.find(i.index());\n-176 iowner = it->second;\n-177 std::pair foundiit = rimap.equal_range(i.index());\n-178 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end\n-(); ++j) {\n-179 if (mask[j.index()] == 0) {\n-180 bool flag = true;\n-181 for (_\bR_\bI_\bM_\ba_\bp_\bi_\bt foundi = foundiit.first; foundi != foundiit.second; ++foundi)\n-{\n-182 std::pair foundjit = rimap.equal_range(j.index());\n-183 for (_\bR_\bI_\bM_\ba_\bp_\bi_\bt foundj = foundjit.first; foundj != foundjit.second; ++foundj)\n-184 if (foundj->second.first == foundi->second.first)\n-185 if (foundj->second.second->attribute() == _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:\n-_\bo_\bw_\bn_\be_\br\n-186 || foundj->second.first == iowner\n-187 || foundj->second.first < communication.communicator().rank()) {\n-188 flag = false;\n-189 continue;\n-190 }\n-191 if (!flag)\n-192 continue;\n-193 }\n-194 // don\u00c2\u00b4t contribute to Ax if\n-195 // 1. the owner of j has i as interior/border dof\n-196 // 2. iowner has j as interior/border dof\n-197 // 3. there is another process with smaller rank that has i and j\n-198 // as interor/border dofs\n-199 // if the owner of j does not have i as interior/border dof,\n-200 // it will not be taken into account\n-201 if (flag)\n-202 bordercontribution.insert(std::pair(i.index(),j.index()));\n-203 }\n-204 }\n-205 }\n-206 }\n-207 buildcomm = false;\n-208 }\n-209\n-210 //compute alpha*A*x nonoverlapping case\n-211 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i = _A_->begin(); i != _A_->end(); ++i) {\n-212 if (mask[i.index()] == 0) {\n-213 //dof doesn't belong to process but is border (not ghost)\n-214 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end\n-(); ++j) {\n-215 if (mask[j.index()] == 1) //j is owner => then sum entries\n-216 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);\n-217 else if (mask[j.index()] == 0) {\n-218 std::pair itp =\n-219 bordercontribution.equal_range(i.index());\n-220 for (MM::iterator it = itp.first; it != itp.second; ++it)\n-221 if ((*it).second == (int)j.index())\n-222 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);\n-223 }\n-224 }\n+32#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n+33#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+34#include \n+35#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bm_\ba_\br_\bk_\be_\bt_\b._\bh_\bh>\n+36\n+37template class Comm>\n+_\b3_\b8void _\bt_\be_\bs_\bt_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd(int s);\n+39\n+40\n+41namespace _\bD_\bu_\bn_\be {\n+42\n+_\b5_\b8 struct _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt\n+59 {\n+_\b6_\b0 enum _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt {\n+_\b6_\b1 _\bo_\bw_\bn_\be_\br=1, _\bo_\bv_\be_\br_\bl_\ba_\bp=2, _\bc_\bo_\bp_\by=3\n+_\b6_\b2 };\n+63 };\n+64\n+76 template \n+_\b7_\b7 class _\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd\n+78 {\n+79 public:\n+_\b8_\b1 typedef G _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be;\n+82\n+_\b8_\b4 typedef L _\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be;\n+85\n+_\b9_\b2 typedef std::tuple _\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl;\n+_\b9_\b9 typedef std::tuple _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl;\n+100\n+_\b1_\b0_\b6 void _\ba_\bd_\bd_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx (const _\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl& x)\n+107 {\n+108 if (std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br &&\n+109 std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp &&\n+110 std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n+111 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"OwnerOverlapCopyCommunication: global index not in\n+index set\");\n+112 localindices.insert(x);\n+113 }\n+114\n+_\b1_\b2_\b0 void _\ba_\bd_\bd_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx (const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl& x)\n+121 {\n+122 if (std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br &&\n+123 std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp &&\n+124 std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n+125 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"OwnerOverlapCopyCommunication: global index not in\n+index set\");\n+126 remoteindices.insert(x);\n+127 }\n+128\n+_\b1_\b3_\b3 const std::set& _\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs () const\n+134 {\n+135 return localindices;\n+136 }\n+137\n+_\b1_\b4_\b2 const std::set& _\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs () const\n+143 {\n+144 return remoteindices;\n+145 }\n+146\n+_\b1_\b5_\b0 void _\bc_\bl_\be_\ba_\br ()\n+151 {\n+152 localindices.clear();\n+153 remoteindices.clear();\n+154 }\n+155\n+156 private:\n+158 std::set localindices;\n+160 std::set remoteindices;\n+161 };\n+162\n+163\n+164#if HAVE_MPI\n+165\n+172 template \n+_\b1_\b7_\b3 class _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+174 {\n+175 template\n+176 friend void _\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(M&,\n+177 const std::string&,\n+178 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bG_\b,_\bL_\b>&,\n+179 bool);\n+180 // used types\n+181 typedef typename _\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,_\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl\n+IndexTripel;\n+182 typedef typename _\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,_\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b>_\b:_\b:\n+_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl RemoteIndexTripel;\n+183 typedef typename std::set::const_iterator localindex_iterator;\n+184 typedef typename std::set::const_iterator\n+remoteindex_iterator;\n+185 typedef typename _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt;\n+186 typedef Dune::ParallelLocalIndex LI;\n+187 public:\n+_\b1_\b8_\b8 typedef Dune::ParallelIndexSet _\bP_\bI_\bS;\n+_\b1_\b8_\b9 typedef Dune::RemoteIndices _\bR_\bI;\n+_\b1_\b9_\b0 typedef Dune::RemoteIndexListModifier\n+_\bR_\bI_\bL_\bM;\n+_\b1_\b9_\b1 typedef typename RI::RemoteIndex _\bR_\bX;\n+_\b1_\b9_\b2 typedef Dune::BufferedCommunicator _\bB_\bC;\n+_\b1_\b9_\b3 typedef Dune::Interface _\bI_\bF;\n+_\b1_\b9_\b4 typedef EnumItem\n+_\bO_\bw_\bn_\be_\br_\bS_\be_\bt;\n+_\b1_\b9_\b5 typedef EnumItem _\bC_\bo_\bp_\by_\bS_\be_\bt;\n+_\b1_\b9_\b6 typedef Combine,EnumItem,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt> _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bS_\be_\bt;\n+_\b1_\b9_\b7 typedef Dune::AllSet _\bA_\bl_\bl_\bS_\be_\bt;\n+198 protected:\n+199\n+200\n+202 template\n+_\b2_\b0_\b3 struct _\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+204 {\n+_\b2_\b0_\b5 typedef typename CommPolicy::IndexedType _\bV;\n+206\n+_\b2_\b0_\b7 static _\bV _\bg_\ba_\bt_\bh_\be_\br(const T& a, std::size_t i)\n+208 {\n+209 return a[i];\n+210 }\n+211\n+_\b2_\b1_\b2 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(T& a, _\bV v, std::size_t i)\n+213 {\n+214 a[i] = v;\n+215 }\n+216 };\n+217 template\n+_\b2_\b1_\b8 struct _\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+219 {\n+_\b2_\b2_\b0 typedef typename CommPolicy::IndexedType _\bV;\n+221\n+_\b2_\b2_\b2 static _\bV _\bg_\ba_\bt_\bh_\be_\br(const T& a, std::size_t i)\n+223 {\n+224 return a[i];\n 225 }\n-226 else if (mask[i.index()] == 1) {\n-227 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end\n-(); ++j)\n-228 if (mask[j.index()] != 2)\n-229 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);\n+226\n+_\b2_\b2_\b7 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(T& a, _\bV v, std::size_t i)\n+228 {\n+229 a[i] += v;\n 230 }\n-231 }\n-232 }\n-233\n-_\b2_\b3_\b5 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-236 {\n-237 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg;\n-238 }\n-239\n-_\b2_\b4_\b1 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn() const\n-242 {\n-243 return communication;\n-244 }\n-245 private:\n-246 std::shared_ptr _A_;\n-247 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& communication;\n-248 mutable bool buildcomm;\n-249 mutable std::vector mask;\n-_\b2_\b5_\b0 mutable std::multimap bordercontribution;\n-251 };\n-252\n-_\b2_\b5_\b5 namespace Amg\n-256 {\n-257 template struct ConstructionTraits;\n-258 }\n-259\n-274 template\n-_\b2_\b7_\b5 class _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-276 : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n-277 friend struct Amg::\n-ConstructionTraits<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >;\n-278 using X = typename P::domain_type;\n-279 using Y = typename P::range_type;\n-280 public:\n-_\b2_\b8_\b2 typedef typename P::domain_type _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b2_\b8_\b4 typedef typename P::range_type _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b2_\b8_\b6 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n-287\n-_\b2_\b9_\b5 _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br (P& p, const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& c)\n-296 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)\n-297 { }\n+231 };\n+232\n+_\b2_\b3_\b3 void _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be () const\n+234 {\n+235 if (OwnerOverlapToAllInterfaceBuilt)\n+236 OwnerOverlapToAllInterface.free();\n+237 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bS_\be_\bt sourceFlags;\n+238\n+Combine,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt>\n+239 destFlags;\n+240 OwnerOverlapToAllInterface.build(ri,sourceFlags,destFlags);\n+241 OwnerOverlapToAllInterfaceBuilt = true;\n+242 }\n+243\n+_\b2_\b4_\b4 void _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be () const\n+245 {\n+246 if (OwnerToAllInterfaceBuilt)\n+247 OwnerToAllInterface.free();\n+248 _\bO_\bw_\bn_\be_\br_\bS_\be_\bt sourceFlags;\n+249 _\bA_\bl_\bl_\bS_\be_\bt destFlags;\n+250 OwnerToAllInterface.build(ri,sourceFlags,destFlags);\n+251 OwnerToAllInterfaceBuilt = true;\n+252 }\n+253\n+_\b2_\b5_\b4 void _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be () const\n+255 {\n+256 if (OwnerCopyToAllInterfaceBuilt)\n+257 OwnerCopyToAllInterface.free();\n+258\n+259 typedef Combine,EnumItem,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt>\n+OwnerCopySet;\n+260 OwnerCopySet sourceFlags;\n+261 Combine,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt> destFlags;\n+262 OwnerCopyToAllInterface.build(ri,sourceFlags,destFlags);\n+263 OwnerCopyToAllInterfaceBuilt = true;\n+264 }\n+265\n+_\b2_\b6_\b6 void _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be () const\n+267 {\n+268 if (OwnerCopyToOwnerCopyInterfaceBuilt)\n+269 OwnerCopyToOwnerCopyInterface.free();\n+270\n+271\n+272 typedef Combine,EnumItem,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt>\n+OwnerCopySet;\n+273 OwnerCopySet sourceFlags;\n+274 OwnerCopySet destFlags;\n+275 OwnerCopyToOwnerCopyInterface.build(ri,sourceFlags,destFlags);\n+276 OwnerCopyToOwnerCopyInterfaceBuilt = true;\n+277 }\n+278\n+_\b2_\b7_\b9 void _\bb_\bu_\bi_\bl_\bd_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be () const\n+280 {\n+281 if (CopyToAllInterfaceBuilt)\n+282 CopyToAllInterface.free();\n+283 _\bC_\bo_\bp_\by_\bS_\be_\bt sourceFlags;\n+284 _\bA_\bl_\bl_\bS_\be_\bt destFlags;\n+285 CopyToAllInterface.build(ri,sourceFlags,destFlags);\n+286 CopyToAllInterfaceBuilt = true;\n+287 }\n+288\n+289 public:\n+290\n+_\b2_\b9_\b5 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by () const {\n+296 return category_;\n+297 }\n 298\n-_\b3_\b0_\b6 _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br (const std::shared_ptr

    & p, const\n-_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& c)\n-307 : _preconditioner(p), _communication(c)\n-308 { }\n-309\n-_\b3_\b1_\b5 virtual void _\bp_\br_\be (_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b)\n-316 {\n-317 _preconditioner->pre(x,b);\n-318 }\n-319\n-_\b3_\b2_\b5 virtual void _\ba_\bp_\bp_\bl_\by (_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& v, const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& d)\n-326 {\n-327 // block preconditioner equivalent to WrappedPreconditioner from\n-328 // pdelab/backend/ovlpistsolverbackend.hh,\n-329 // but not to BlockPreconditioner from schwarz.hh\n-330 _preconditioner->apply(v,d);\n-331 _communication.addOwnerCopyToOwnerCopy(v,v);\n-332 }\n-333\n-334 template\n-_\b3_\b3_\b5 void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n-336 {\n-337 _preconditioner->template apply(v,d);\n-338 _communication.addOwnerCopyToOwnerCopy(v,v);\n-339 }\n-340\n-_\b3_\b4_\b6 virtual void _\bp_\bo_\bs_\bt (_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x)\n-347 {\n-348 _preconditioner->post(x);\n-349 }\n-350\n-_\b3_\b5_\b2 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-353 {\n-354 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg;\n-355 }\n-356\n-357 private:\n-359 std::shared_ptr

    _preconditioner;\n-360\n-362 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& _communication;\n-363 };\n-364\n-367} // end namespace\n-368\n-369#endif\n-_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\n-Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n-generic way.\n-_\bi_\bo_\b._\bh_\bh\n-Some generic functions for pretty printing vectors and matrices.\n-_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n-Define general preconditioner interface.\n-_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\n-Define base class for scalar product and norm.\n-_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implementation of the BCRSMatrix class.\n-_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n-Implementations of the inverse operator interface.\n-_\bi_\bl_\bu_\b._\bh_\bh\n-The incomplete LU factorization kernels.\n-_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n-Define general, extensible interface for operators. The available\n-implementation wraps a matrix.\n-_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-???\n-_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n-Classes providing communication interfaces for overlapping Schwarz methods.\n-_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-This file implements a vector space as a tensor product of a given vector\n-space. The number of compon...\n+_\b2_\b9_\b9 const Communication& _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br() const\n+300 {\n+301 return cc;\n+302 }\n+303\n+310 template\n+_\b3_\b1_\b1 void _\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl (const T& source, T& dest) const\n+312 {\n+313 if (!OwnerToAllInterfaceBuilt)\n+314 _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be ();\n+315 _\bB_\bC _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n+316 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template build(OwnerToAllInterface);\n+317 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template forward >(source,dest);\n+318 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.free();\n+319 }\n+320\n+327 template\n+_\b3_\b2_\b8 void _\bc_\bo_\bp_\by_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl (const T& source, T& dest) const\n+329 {\n+330 if (!CopyToAllInterfaceBuilt)\n+331 _\bb_\bu_\bi_\bl_\bd_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be ();\n+332 _\bB_\bC _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n+333 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template build(CopyToAllInterface);\n+334 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template forward >(source,dest);\n+335 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.free();\n+336 }\n+337\n+344 template\n+_\b3_\b4_\b5 void _\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bT_\bo_\bA_\bl_\bl (const T& source, T& dest) const\n+346 {\n+347 if (!OwnerOverlapToAllInterfaceBuilt)\n+348 _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be ();\n+349 _\bB_\bC _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n+350 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template build(OwnerOverlapToAllInterface);\n+351 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template forward >(source,dest);\n+352 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.free();\n+353 }\n+354\n+361 template\n+_\b3_\b6_\b2 void _\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl (const T& source, T& dest) const\n+363 {\n+364 if (!OwnerCopyToAllInterfaceBuilt)\n+365 _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be ();\n+366 _\bB_\bC _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n+367 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template build(OwnerCopyToAllInterface);\n+368 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template forward >(source,dest);\n+369 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.free();\n+370 }\n+371\n+378 template\n+_\b3_\b7_\b9 void _\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by (const T& source, T& dest) const\n+380 {\n+381 if (!OwnerCopyToOwnerCopyInterfaceBuilt)\n+382 _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be ();\n+383 _\bB_\bC _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n+384 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template build(OwnerCopyToOwnerCopyInterface);\n+385 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template forward >(source,dest);\n+386 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.free();\n+387 }\n+388\n+389\n+397 template\n+_\b3_\b9_\b8 void _\bd_\bo_\bt (const T1& x, const T1& y, T2& result) const\n+399 {\n+400 using real_type = typename FieldTraits::real_type;\n+401 // set up mask vector\n+402 if (mask.size()!=static_cast::size_type>\n+(x.size()))\n+403 {\n+404 mask.resize(x.size());\n+405 for (typename std::vector::size_type i=0; ilocal().attribute()!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br)\n+409 mask[i->local().local()] = 0;\n+410 }\n+411 result = T2(0.0);\n+412\n+413 for (typename T1::size_type i=0; i(mask[i]);\n+415 result = cc.sum(result);\n+416 }\n+417\n+424 template\n+_\b4_\b2_\b5 typename FieldTraits::real_type _\bn_\bo_\br_\bm (const T1& x)\n+const\n+426 {\n+427 using real_type = typename FieldTraits::real_type;\n+428\n+429 // set up mask vector\n+430 if (mask.size()!=static_cast::size_type>\n+(x.size()))\n+431 {\n+432 mask.resize(x.size());\n+433 for (typename std::vector::size_type i=0; ilocal().attribute()!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br)\n+437 mask[i->local().local()] = 0;\n+438 }\n+439 auto result = real_type(0.0);\n+440 for (typename T1::size_type i=0; i\n+_\bC_\bo_\bp_\by_\bF_\bl_\ba_\bg_\bs;\n+447\n+_\b4_\b4_\b9 typedef Dune::ParallelIndexSet _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+450\n+_\b4_\b5_\b2 typedef Dune::RemoteIndices _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n+453\n+_\b4_\b5_\b6 typedef Dune::GlobalLookupIndexSet _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+457\n+_\b4_\b6_\b2 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bi_\bn_\bd_\be_\bx_\bS_\be_\bt() const\n+463 {\n+464 return pis;\n+465 }\n+466\n+_\b4_\b7_\b1 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& _\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs() const\n+472 {\n+473 return ri;\n+474 }\n+475\n+_\b4_\b8_\b0 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bi_\bn_\bd_\be_\bx_\bS_\be_\bt()\n+481 {\n+482 return pis;\n+483 }\n+484\n+485\n+_\b4_\b9_\b0 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& _\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs()\n+491 {\n+492 return ri;\n+493 }\n+494\n+_\b4_\b9_\b5 void _\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp()\n+496 {\n+497 if(globalLookup_) {\n+498 if(pis.seqNo()==oldseqNo)\n+499 // Nothing changed!\n+500 return;\n+501 delete globalLookup_;\n+502 }\n+503\n+504 globalLookup_ = new _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(pis);\n+505 oldseqNo = pis.seqNo();\n+506 }\n+507\n+_\b5_\b0_\b8 void _\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp(std::size_t size)\n+509 {\n+510 if(globalLookup_) {\n+511 if(pis.seqNo()==oldseqNo)\n+512 // Nothing changed!\n+513 return;\n+514 delete globalLookup_;\n+515 }\n+516 globalLookup_ = new _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(pis, size);\n+517 oldseqNo = pis.seqNo();\n+518 }\n+519\n+_\b5_\b2_\b0 void _\bf_\br_\be_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp()\n+521 {\n+522 delete globalLookup_;\n+523 globalLookup_=0;\n+524 }\n+525\n+_\b5_\b2_\b6 const _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bg_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp() const\n+527 {\n+528 assert(globalLookup_ != 0);\n+529 return *globalLookup_;\n+530 }\n+531\n+537 template\n+_\b5_\b3_\b8 void _\bp_\br_\bo_\bj_\be_\bc_\bt (T1& x) const\n+539 {\n+540 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)\n+541 if (i->local().attribute()==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n+542 x[i->local().local()] = 0;\n+543 }\n+544\n+_\b5_\b5_\b4 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (MPI_Comm comm_,\n+555 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by cat_ = _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg,\n+556 bool freecomm_ = false)\n+557 : comm(comm_), cc(comm_), pis(), ri(pis,pis,comm_),\n+558 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),\n+559 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt\n+(false),\n+560 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_),\n+561 freecomm(freecomm_)\n+562 {}\n+563\n+_\b5_\b7_\b2 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by cat_ =\n+_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg)\n+573 : comm(MPI_COMM_WORLD), cc(MPI_COMM_WORLD), pis(), ri\n+(pis,pis,MPI_COMM_WORLD),\n+574 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),\n+575 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt\n+(false),\n+576 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), freecomm\n+(false)\n+577 {}\n+578\n+_\b5_\b8_\b6 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (const _\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,\n+_\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b>& indexinfo,\n+587 MPI_Comm comm_,\n+588 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by cat_ = _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg,\n+589 bool freecomm_ = false)\n+590 : comm(comm_), cc(comm_), OwnerToAllInterfaceBuilt(false),\n+591 OwnerOverlapToAllInterfaceBuilt(false), OwnerCopyToAllInterfaceBuilt\n+(false),\n+592 OwnerCopyToOwnerCopyInterfaceBuilt(false), CopyToAllInterfaceBuilt(false),\n+593 globalLookup_(0), category_(cat_), freecomm(freecomm_)\n+594 {\n+595 // set up an ISTL index set\n+596 pis.beginResize();\n+597 for (localindex_iterator i=indexinfo._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs().begin();\n+i!=indexinfo._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs().end(); ++i)\n+598 {\n+599 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br)\n+600 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:\n+_\bo_\bw_\bn_\be_\br,true));\n+601 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp)\n+602 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:\n+_\bo_\bv_\be_\br_\bl_\ba_\bp,true));\n+603 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n+604 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:\n+_\bc_\bo_\bp_\by,true));\n+605 // std::cout << cc.rank() << \": adding index \" << std::get<0>(*i) << \" \" <<\n+std::get<1>(*i) << \" \" << std::get<2>(*i) << std::endl;\n+606 }\n+607 pis.endResize();\n+608\n+609 // build remote indices WITHOUT communication\n+610 // std::cout << cc.rank() << \": build remote indices\" << std::endl;\n+611 ri.setIndexSets(pis,pis,cc);\n+612 if (indexinfo._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().size()>0)\n+613 {\n+614 remoteindex_iterator i=indexinfo._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().begin();\n+615 int p = std::get<0>(*i);\n+616 _\bR_\bI_\bL_\bM modifier = ri.template getModifier(p);\n+617 typename PIS::const_iterator pi=pis.begin();\n+618 for ( ; i!=indexinfo._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().end(); ++i)\n+619 {\n+620 // handle processor change\n+621 if (p!=std::get<0>(*i))\n+622 {\n+623 p = std::get<0>(*i);\n+624 modifier = ri.template getModifier(p);\n+625 pi=pis.begin();\n+626 }\n+627\n+628 // position to correct entry in parallel index set\n+629 while (pi->global()!=std::get<1>(*i) && pi!=pis.end())\n+630 ++pi;\n+631 if (pi==pis.end())\n+632 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"OwnerOverlapCopyCommunication: global index not in\n+index set\");\n+633\n+634 // insert entry\n+635 // std::cout << cc.rank() << \": adding remote index \" << std::get<0>(*i) <<\n+\" \" << std::get<1>(*i) << \" \" << std::get<2>(*i) << std::endl;\n+636 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br)\n+637 modifier.insert(_\bR_\bX(_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br,&(*pi)));\n+638 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp)\n+639 modifier.insert(_\bR_\bX(_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp,&(*pi)));\n+640 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n+641 modifier.insert(_\bR_\bX(_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by,&(*pi)));\n+642 }\n+643 }else{\n+644 // Force remote indices to be synced!\n+645 ri.template getModifier(0);\n+646 }\n+647 }\n+648\n+649 // destructor: free memory in some objects\n+_\b6_\b5_\b0 _\b~_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn ()\n+651 {\n+652 ri.free();\n+653 if (OwnerToAllInterfaceBuilt) OwnerToAllInterface.free();\n+654 if (OwnerOverlapToAllInterfaceBuilt) OwnerOverlapToAllInterface.free();\n+655 if (OwnerCopyToAllInterfaceBuilt) OwnerCopyToAllInterface.free();\n+656 if (OwnerCopyToOwnerCopyInterfaceBuilt) OwnerCopyToOwnerCopyInterface.free\n+();\n+657 if (CopyToAllInterfaceBuilt) CopyToAllInterface.free();\n+658 if (globalLookup_) delete globalLookup_;\n+659 if (freecomm && (comm != MPI_COMM_NULL))\n+660 {\n+661 // If it is possible to query whether MPI_Finalize\n+662 // was called, only free the communicator before\n+663 // calling MPI_Finalize.\n+664 int wasFinalized = 0;\n+665 MPI_Finalized(&wasFinalized);\n+666 if (!wasFinalized) {\n+667 MPI_Comm_free(&comm);\n+668 }\n+669 }\n+670 }\n+671\n+672 private:\n+673 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (const _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn&)\n+674 {}\n+675 MPI_Comm comm;\n+676 Communication cc;\n+677 _\bP_\bI_\bS pis;\n+678 _\bR_\bI ri;\n+679 mutable _\bI_\bF OwnerToAllInterface;\n+680 mutable bool OwnerToAllInterfaceBuilt;\n+681 mutable _\bI_\bF OwnerOverlapToAllInterface;\n+682 mutable bool OwnerOverlapToAllInterfaceBuilt;\n+683 mutable _\bI_\bF OwnerCopyToAllInterface;\n+684 mutable bool OwnerCopyToAllInterfaceBuilt;\n+685 mutable _\bI_\bF OwnerCopyToOwnerCopyInterface;\n+686 mutable bool OwnerCopyToOwnerCopyInterfaceBuilt;\n+687 mutable _\bI_\bF CopyToAllInterface;\n+688 mutable bool CopyToAllInterfaceBuilt;\n+689 mutable std::vector mask;\n+690 int oldseqNo;\n+691 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* globalLookup_;\n+692 const _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category_;\n+693 bool freecomm;\n+694 };\n+695\n+696#endif\n+697\n+698\n+701} // end namespace\n+702\n+703#endif\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bt_\be_\bs_\bt_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd\n+void testRedistributed(int s)\n+_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n+_\bm_\ba_\bt_\br_\bi_\bx_\bm_\ba_\br_\bk_\be_\bt_\b._\bh_\bh\n+Provides classes for reading and writing MatrixMarket Files with an extension\n+for parallel matrices.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-A nonoverlapping operator with communication object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bP_\bI_\bS\n-C::PIS PIS\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n-C communication_type\n-The type of the communication object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI_\bM_\ba_\bp\n-std::multimap< int, std::pair< int, RILIterator > > RIMap\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI\n-C::RI RI\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bn_\bo_\bv_\bl_\bp_\b__\bo_\bp_\b__\ba_\bp_\bp_\bl_\by\n-void novlp_op_apply(const X &x, Y &y, field_type alpha) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-NonoverlappingSchwarzOperator(std::shared_ptr< const matrix_type > A, const\n-communication_type &com)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-M::ConstColIterator ColIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(const X &x, Y &y) const\n-apply operator to x:\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The type of the domain.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the linear operator (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:235\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI_\bM_\ba_\bp_\bi_\bt\n-RIMap::iterator RIMapit\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bm_\ba_\bt\n-virtual const matrix_type & getmat() const\n-get matrix via *\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:121\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI_\bL_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-RIL::const_iterator RILIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bM_\bM\n-std::multimap< int, int > MM\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The type of the range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:68\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-The type of the matrix we operate on.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:64\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-M::ConstRowIterator RowIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-const communication_type & getCommunication() const\n-Get the object responsible for communication.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:241\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd\n-virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const\n-apply operator to x, scale and add:\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:109\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI_\bL\n-RI::RemoteIndexList RIL\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-NonoverlappingSchwarzOperator(const matrix_type &A, const communication_type\n-&com)\n-constructor: just store a reference to a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:92\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-RI::const_iterator RIIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Nonoverlapping parallel preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:276\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-NonoverlappingBlockPreconditioner(P &p, const communication_type &c)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:295\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:352\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(domain_type &v, const range_type &d)\n-Apply the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:325\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-P::range_type range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:284\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-NonoverlappingBlockPreconditioner(const std::shared_ptr< P > &p, const\n-communication_type &c)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:306\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(domain_type &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:346\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n-C communication_type\n-The type of the communication object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:286\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\br_\be\n-virtual void pre(domain_type &x, range_type &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:315\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(X &v, const Y &d)\n-Apply one step of the preconditioner to the system A(v)=d.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:335\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-P::domain_type domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:282\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-A linear operator exporting itself in matrix form.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+derive error class from the base class in common\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt\n+Attribute set for overlapping Schwarz.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt\n+AttributeSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:60\n _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br\n @ owner\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:61\n _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by\n @ copy\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:61\n _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp\n @ overlap\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Base class for matrix free definition of preconditioners.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd\n+Information about the index distribution.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl\n+std::tuple< GlobalIdType, LocalIdType, int > IndexTripel\n+A triple describing a local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:92\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\ba_\bd_\bd_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n+void addRemoteIndex(const RemoteIndexTripel &x)\n+Add a new remote index triple to the set of remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be\n+G GlobalIdType\n+The type of the global index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+const std::set< IndexTripel > & localIndices() const\n+Get the set of indices local to the process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:133\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+const std::set< RemoteIndexTripel > & remoteIndices() const\n+Get the set of remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be\n+L LocalIdType\n+The type of the local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bc_\bl_\be_\ba_\br\n+void clear()\n+Remove all indices from the sets.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\ba_\bd_\bd_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+void addLocalIndex(const IndexTripel &x)\n+Add a new index triple to the set of local indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl\n+std::tuple< int, GlobalIdType, int > RemoteIndexTripel\n+A triple describing a remote index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:99\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+A class setting up standard communication for a two-valued attribute set with\n+owner/overlap/copy sema...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bS_\be_\bt\n+EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopySet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:195\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n+const GlobalLookupIndexSet & globalLookup() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:526\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bn_\bo_\br_\bm\n+FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const\n+Compute the global Euclidean norm of a vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:425\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+void buildOwnerOverlapToAllInterface() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:233\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\bI_\bS\n+Dune::ParallelIndexSet< GlobalIdType, LI, 512 > PIS\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+void buildOwnerCopyToAllInterface() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:254\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+void buildOwnerCopyToOwnerCopyInterface() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:266\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+OwnerOverlapCopyCommunication(const IndexInfoFromGrid< GlobalIdType,\n+LocalIdType > &indexinfo, MPI_Comm comm_, SolverCategory::Category\n+cat_=SolverCategory::overlapping, bool freecomm_=false)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:586\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+SolverCategory::Category category() const\n+Get Solver Category.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:295\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by\n+void addOwnerCopyToOwnerCopy(const T &source, T &dest) const\n+Communicate values from owner and copy data points to owner and copy data\n+points and add them to thos...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:379\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+void buildCopyToAllInterface() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:279\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bF_\bl_\ba_\bg_\bs\n+Dune::EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopyFlags\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:446\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+RemoteIndices & remoteIndices()\n+Get the underlying remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:490\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bn_\bd_\be_\bx_\bS_\be_\bt\n+const ParallelIndexSet & indexSet() const\n+Get the underlying parallel index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:462\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bR_\bI\n+Dune::RemoteIndices< PIS > RI\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:189\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n+void buildGlobalLookup(std::size_t size)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:508\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bT_\bo_\bA_\bl_\bl\n+void addOwnerOverlapToAll(const T &source, T &dest) const\n+Communicate values from owner data points to all other data points and add them\n+to those values.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:345\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+Dune::RemoteIndices< PIS > RemoteIndices\n+The type of the remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:452\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bj_\be_\bc_\bt\n+void project(T1 &x) const\n+Set vector to zero at copy dofs.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:538\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bl_\bl_\bS_\be_\bt\n+Dune::AllSet< AttributeSet > AllSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:197\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bS_\be_\bt\n+Combine< EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner >,\n+EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::overlap >, AttributeSet >\n+OwnerOverlapSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:196\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl\n+void copyCopyToAll(const T &source, T &dest) const\n+Communicate values from copy data points to all other data points.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:328\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet\n+The type of the reverse lookup of indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:456\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bI_\bF\n+Dune::Interface IF\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:193\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b~_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+~OwnerOverlapCopyCommunication()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:650\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n+void buildGlobalLookup()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:495\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bB_\bC\n+Dune::BufferedCommunicator BC\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:192\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+OwnerOverlapCopyCommunication(MPI_Comm comm_, SolverCategory::Category\n+cat_=SolverCategory::overlapping, bool freecomm_=false)\n+Construct the communication without any indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:554\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bn_\bd_\be_\bx_\bS_\be_\bt\n+ParallelIndexSet & indexSet()\n+Get the underlying parallel index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:480\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bd_\bo_\bt\n+void dot(const T1 &x, const T1 &y, T2 &result) const\n+Compute a global dot product of two vectors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:398\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+const Communication< MPI_Comm > & communicator() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+OwnerOverlapCopyCommunication(SolverCategory::Category cat_=SolverCategory::\n+overlapping)\n+Construct the communication without any indices using MPI_COMM_WORLD.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:572\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n+EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl\n+void copyOwnerToAll(const T &source, T &dest) const\n+Communicate values from owner data points to all other data points.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:311\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+const RemoteIndices & remoteIndices() const\n+Get the underlying remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:471\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt\n+friend void loadMatrixMarket(M &, const std::string &,\n+OwnerOverlapCopyCommunication< G, L > &, bool)\n+Load a parallel matrix/vector stored in matrix market format.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1269\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bR_\bX\n+RI::RemoteIndex RX\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:191\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl\n+void addOwnerCopyToAll(const T &source, T &dest) const\n+Communicate values from owner and copy data points to all other data points and\n+add them to those val...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:362\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bf_\br_\be_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n+void freeGlobalLookup()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:520\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bR_\bI_\bL_\bM\n+Dune::RemoteIndexListModifier< PIS, typename RI::Allocator, false > RILM\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:190\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet\n+The type of the parallel index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:449\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+void buildOwnerToAllInterface() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:244\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+gather/scatter callback for communication\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:204\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n+static V gather(const T &a, std::size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:207\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n+static void scatter(T &a, V v, std::size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:212\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bV\n+CommPolicy< T >::IndexedType V\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:205\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bV\n+CommPolicy< T >::IndexedType V\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:220\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n+static V gather(const T &a, std::size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:222\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n+static void scatter(T &a, V v, std::size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:227\n _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n Category\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n-@ nonoverlapping\n-Category for non-overlapping solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n+@ overlapping\n+Category for overlapping solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:29\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00026.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00026.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: basearray.hh File Reference\n+dune-istl: umfpack.hh File Reference\n \n \n \n \n \n \n \n@@ -70,38 +70,73 @@\n

    \n \n
    \n \n
    \n \n-
    basearray.hh File Reference
    \n+Classes |\n+Namespaces |\n+Functions
    \n+ \n \n
    \n \n-

    Implements several basic array containers. \n+

    Classes for using UMFPack with ISTL matrices. \n More...

    \n-
    #include <cassert>
    \n-#include <cmath>
    \n-#include <cstddef>
    \n-#include <memory>
    \n-#include <algorithm>
    \n-#include "istlexception.hh"
    \n-#include <dune/common/iteratorfacades.hh>
    \n+
    #include <complex>
    \n+#include <type_traits>
    \n+#include <umfpack.h>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/fmatrix.hh>
    \n+#include <dune/common/fvector.hh>
    \n+#include <dune/istl/bccsmatrixinitializer.hh>
    \n+#include <dune/istl/bcrsmatrix.hh>
    \n+#include <dune/istl/foreach.hh>
    \n+#include <dune/istl/multitypeblockmatrix.hh>
    \n+#include <dune/istl/multitypeblockvector.hh>
    \n+#include <dune/istl/solvers.hh>
    \n+#include <dune/istl/solvertype.hh>
    \n+#include <dune/istl/solverfactory.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Classes

    struct  Dune::UMFPackMethodChooser< T >
     
    struct  Dune::UMFPackMethodChooser< double >
     
    struct  Dune::UMFPackMethodChooser< std::complex< double > >
     
    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< TL, M, class >
     
    \n \n \n \n+

    \n Namespaces

    namespace  Dune
     
    \n+\n+\n+\n

    \n+Functions

     Dune::DUNE_REGISTER_DIRECT_SOLVER ("umfpack", Dune::UMFPackCreator())
     
    \n

    Detailed Description

    \n-

    Implements several basic array containers.

    \n+

    Classes for using UMFPack with ISTL matrices.

    \n+
    Author
    Dominic Kempf
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,24 +1,56 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-basearray.hh File Reference\n-Implements several basic array containers. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+umfpack.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b)\n+Classes for using UMFPack with ISTL matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b<_\b _\bM_\b _\b>\n+\u00a0 The UMFPack direct sparse solver. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>\n+ _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\b _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bT_\bL_\b,_\b _\bM_\b,_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"umfpack\", _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br())\n+\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Implements several basic array containers.\n+Classes for using UMFPack with ISTL matrices.\n+ Author\n+ Dominic Kempf\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00026_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00026_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: basearray.hh Source File\n+dune-istl: umfpack.hh Source File\n \n \n \n \n \n \n \n@@ -74,423 +74,903 @@\n \n
    \n \n
    \n
    \n
    \n-
    basearray.hh
    \n+
    umfpack.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_BASEARRAY_HH
    \n-
    6#define DUNE_ISTL_BASEARRAY_HH
    \n+
    5#ifndef DUNE_ISTL_UMFPACK_HH
    \n+
    6#define DUNE_ISTL_UMFPACK_HH
    \n
    7
    \n-
    8#include <cassert>
    \n-
    9#include <cmath>
    \n-
    10#include <cstddef>
    \n-
    11#include <memory>
    \n-
    12#include <algorithm>
    \n-
    13
    \n-
    14#include "istlexception.hh"
    \n-
    15#include <dune/common/iteratorfacades.hh>
    \n-
    16
    \n-
    21namespace Dune {
    \n-
    22
    \n-
    24namespace Imp {
    \n-
    25
    \n-
    46 template<class B, class ST=std::size_t >
    \n-
    47 class base_array_unmanaged
    \n-
    48 {
    \n-
    49 public:
    \n-
    50
    \n-
    51 //===== type definitions and constants
    \n-
    52
    \n-
    54 typedef B member_type;
    \n+
    8#if HAVE_SUITESPARSE_UMFPACK || defined DOXYGEN
    \n+
    9
    \n+
    10#include<complex>
    \n+
    11#include<type_traits>
    \n+
    12
    \n+
    13#include<umfpack.h>
    \n+
    14
    \n+
    15#include<dune/common/exceptions.hh>
    \n+
    16#include<dune/common/fmatrix.hh>
    \n+
    17#include<dune/common/fvector.hh>
    \n+\n+\n+\n+\n+\n+\n+\n+\n+
    26
    \n+
    27
    \n+
    28
    \n+
    29namespace Dune {
    \n+
    41 // FORWARD DECLARATIONS
    \n+
    42 template<class M, class T, class TM, class TD, class TA>
    \n+
    43 class SeqOverlappingSchwarz;
    \n+
    44
    \n+
    45 template<class T, bool tag>
    \n+
    46 struct SeqOverlappingSchwarzAssemblerHelper;
    \n+
    47
    \n+
    48 // wrapper class for C-Function Calls in the backend. Choose the right function namespace
    \n+
    49 // depending on the template parameter used.
    \n+
    50 template<typename T>
    \n+
    \n+\n+
    52 {
    \n+
    53 static constexpr bool valid = false ;
    \n+
    54 };
    \n+
    \n
    55
    \n-
    57 typedef ST size_type;
    \n-
    58
    \n-
    60 using reference = B&;
    \n-
    61
    \n-
    63 using const_reference = const B&;
    \n-
    64
    \n-
    65 //===== access to components
    \n-
    66
    \n-
    68 reference operator[] (size_type i)
    \n-
    69 {
    \n-
    70#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    71 if (i>=n) DUNE_THROW(ISTLError,"index out of range");
    \n-
    72#endif
    \n-
    73 return p[i];
    \n-
    74 }
    \n-
    75
    \n-
    77 const_reference operator[] (size_type i) const
    \n-
    78 {
    \n-
    79#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    80 if (i>=n) DUNE_THROW(ISTLError,"index out of range");
    \n-
    81#endif
    \n-
    82 return p[i];
    \n-
    83 }
    \n-
    84
    \n-
    86 template<class T>
    \n-
    87 class RealIterator
    \n-
    88 : public RandomAccessIteratorFacade<RealIterator<T>, T>
    \n-
    89 {
    \n-
    90 public:
    \n-
    92 typedef typename std::remove_const<T>::type ValueType;
    \n-
    93
    \n-
    94 friend class RandomAccessIteratorFacade<RealIterator<const ValueType>, const ValueType>;
    \n-
    95 friend class RandomAccessIteratorFacade<RealIterator<ValueType>, ValueType>;
    \n-
    96 friend class RealIterator<const ValueType>;
    \n-
    97 friend class RealIterator<ValueType>;
    \n-
    98
    \n-
    100 RealIterator ()
    \n-
    101 : p(0), i(0)
    \n-
    102 {}
    \n-
    103
    \n-
    104 RealIterator (const B* _p, B* _i) : p(_p), i(_i)
    \n-
    105 { }
    \n-
    106
    \n-
    107 RealIterator(const RealIterator<ValueType>& it)
    \n-
    108 : p(it.p), i(it.i)
    \n-
    109 {}
    \n-
    110
    \n-
    112 size_type index () const
    \n-
    113 {
    \n-
    114 return i-p;
    \n-
    115 }
    \n-
    116
    \n-
    118 bool equals (const RealIterator<ValueType>& other) const
    \n-
    119 {
    \n-
    120 assert(other.p==p);
    \n-
    121 return i==other.i;
    \n-
    122 }
    \n-
    123
    \n-
    125 bool equals (const RealIterator<const ValueType>& other) const
    \n-
    126 {
    \n-
    127 assert(other.p==p);
    \n-
    128 return i==other.i;
    \n-
    129 }
    \n-
    130
    \n-
    131 std::ptrdiff_t distanceTo(const RealIterator& o) const
    \n-
    132 {
    \n-
    133 return o.i-i;
    \n-
    134 }
    \n-
    135
    \n-
    136 private:
    \n-
    138 void increment()
    \n-
    139 {
    \n-
    140 ++i;
    \n-
    141 }
    \n-
    142
    \n-
    144 void decrement()
    \n-
    145 {
    \n-
    146 --i;
    \n-
    147 }
    \n-
    148
    \n-
    149 // Needed for operator[] of the iterator
    \n-
    150 reference elementAt (std::ptrdiff_t offset) const
    \n-
    151 {
    \n-
    152 return *(i+offset);
    \n-
    153 }
    \n-
    154
    \n-
    156 reference dereference () const
    \n-
    157 {
    \n-
    158 return *i;
    \n-
    159 }
    \n-
    160
    \n-
    161 void advance(std::ptrdiff_t d)
    \n-
    162 {
    \n-
    163 i+=d;
    \n-
    164 }
    \n-
    165
    \n-
    166 const B* p;
    \n-
    167 B* i;
    \n-
    168 };
    \n-
    169
    \n-
    171 typedef RealIterator<B> iterator;
    \n-
    172
    \n-
    173
    \n-
    175 iterator begin ()
    \n-
    176 {
    \n-
    177 return iterator(p,p);
    \n-
    178 }
    \n+
    56 template<>
    \n+
    \n+
    57 struct UMFPackMethodChooser<double>
    \n+
    58 {
    \n+
    59 static constexpr bool valid = true ;
    \n+
    60
    \n+
    61 template<typename... A>
    \n+
    \n+
    62 static void defaults(A... args)
    \n+
    63 {
    \n+
    64 umfpack_dl_defaults(args...);
    \n+
    65 }
    \n+
    \n+
    66 template<typename... A>
    \n+
    \n+
    67 static void free_numeric(A... args)
    \n+
    68 {
    \n+
    69 umfpack_dl_free_numeric(args...);
    \n+
    70 }
    \n+
    \n+
    71 template<typename... A>
    \n+
    \n+
    72 static void free_symbolic(A... args)
    \n+
    73 {
    \n+
    74 umfpack_dl_free_symbolic(args...);
    \n+
    75 }
    \n+
    \n+
    76 template<typename... A>
    \n+
    \n+
    77 static int load_numeric(A... args)
    \n+
    78 {
    \n+
    79 return umfpack_dl_load_numeric(args...);
    \n+
    80 }
    \n+
    \n+
    81 template<typename... A>
    \n+
    \n+
    82 static void numeric(A... args)
    \n+
    83 {
    \n+
    84 umfpack_dl_numeric(args...);
    \n+
    85 }
    \n+
    \n+
    86 template<typename... A>
    \n+
    \n+
    87 static void report_info(A... args)
    \n+
    88 {
    \n+
    89 umfpack_dl_report_info(args...);
    \n+
    90 }
    \n+
    \n+
    91 template<typename... A>
    \n+
    \n+
    92 static void report_status(A... args)
    \n+
    93 {
    \n+
    94 umfpack_dl_report_status(args...);
    \n+
    95 }
    \n+
    \n+
    96 template<typename... A>
    \n+
    \n+
    97 static int save_numeric(A... args)
    \n+
    98 {
    \n+
    99 return umfpack_dl_save_numeric(args...);
    \n+
    100 }
    \n+
    \n+
    101 template<typename... A>
    \n+
    \n+
    102 static void solve(A... args)
    \n+
    103 {
    \n+
    104 umfpack_dl_solve(args...);
    \n+
    105 }
    \n+
    \n+
    106 template<typename... A>
    \n+
    \n+
    107 static void symbolic(A... args)
    \n+
    108 {
    \n+
    109 umfpack_dl_symbolic(args...);
    \n+
    110 }
    \n+
    \n+
    111 };
    \n+
    \n+
    112
    \n+
    113 template<>
    \n+
    \n+
    114 struct UMFPackMethodChooser<std::complex<double> >
    \n+
    115 {
    \n+
    116 static constexpr bool valid = true ;
    \n+
    117 using size_type = SuiteSparse_long;
    \n+
    118
    \n+
    119 template<typename... A>
    \n+
    \n+
    120 static void defaults(A... args)
    \n+
    121 {
    \n+
    122 umfpack_zl_defaults(args...);
    \n+
    123 }
    \n+
    \n+
    124 template<typename... A>
    \n+
    \n+
    125 static void free_numeric(A... args)
    \n+
    126 {
    \n+
    127 umfpack_zl_free_numeric(args...);
    \n+
    128 }
    \n+
    \n+
    129 template<typename... A>
    \n+
    \n+
    130 static void free_symbolic(A... args)
    \n+
    131 {
    \n+
    132 umfpack_zl_free_symbolic(args...);
    \n+
    133 }
    \n+
    \n+
    134 template<typename... A>
    \n+
    \n+
    135 static int load_numeric(A... args)
    \n+
    136 {
    \n+
    137 return umfpack_zl_load_numeric(args...);
    \n+
    138 }
    \n+
    \n+
    139 template<typename... A>
    \n+
    \n+
    140 static void numeric(const size_type* cs, const size_type* ri, const double* val, A... args)
    \n+
    141 {
    \n+
    142 umfpack_zl_numeric(cs,ri,val,NULL,args...);
    \n+
    143 }
    \n+
    \n+
    144 template<typename... A>
    \n+
    \n+
    145 static void report_info(A... args)
    \n+
    146 {
    \n+
    147 umfpack_zl_report_info(args...);
    \n+
    148 }
    \n+
    \n+
    149 template<typename... A>
    \n+
    \n+
    150 static void report_status(A... args)
    \n+
    151 {
    \n+
    152 umfpack_zl_report_status(args...);
    \n+
    153 }
    \n+
    \n+
    154 template<typename... A>
    \n+
    \n+
    155 static int save_numeric(A... args)
    \n+
    156 {
    \n+
    157 return umfpack_zl_save_numeric(args...);
    \n+
    158 }
    \n+
    \n+
    159 template<typename... A>
    \n+
    \n+
    160 static void solve(size_type m, const size_type* cs, const size_type* ri, std::complex<double>* val, double* x, const double* b,A... args)
    \n+
    161 {
    \n+
    162 const double* cval = reinterpret_cast<const double*>(val);
    \n+
    163 umfpack_zl_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...);
    \n+
    164 }
    \n+
    \n+
    165 template<typename... A>
    \n+
    \n+
    166 static void symbolic(size_type m, size_type n, const size_type* cs, const size_type* ri, const double* val, A... args)
    \n+
    167 {
    \n+
    168 umfpack_zl_symbolic(m,n,cs,ri,val,NULL,args...);
    \n+
    169 }
    \n+
    \n+
    170 };
    \n+
    \n+
    171
    \n+
    172 namespace Impl
    \n+
    173 {
    \n+
    174 template<class M, class = void>
    \n+
    175 struct UMFPackVectorChooser;
    \n+
    176
    \n+
    178 template<class M> using UMFPackDomainType = typename UMFPackVectorChooser<M>::domain_type;
    \n
    179
    \n-
    181 iterator end ()
    \n-
    182 {
    \n-
    183 return iterator(p,p+n);
    \n-
    184 }
    \n-
    185
    \n-
    188 iterator beforeEnd ()
    \n-
    189 {
    \n-
    190 return iterator(p,p+n-1);
    \n-
    191 }
    \n-
    192
    \n-
    195 iterator beforeBegin ()
    \n-
    196 {
    \n-
    197 return iterator(p,p-1);
    \n-
    198 }
    \n-
    199
    \n-
    201 iterator find (size_type i)
    \n-
    202 {
    \n-
    203 return iterator(p,p+std::min(i,n));
    \n-
    204 }
    \n-
    205
    \n-
    207 typedef RealIterator<const B> const_iterator;
    \n-
    208
    \n-
    210 const_iterator begin () const
    \n-
    211 {
    \n-
    212 return const_iterator(p,p+0);
    \n-
    213 }
    \n-
    214
    \n-
    216 const_iterator end () const
    \n-
    217 {
    \n-
    218 return const_iterator(p,p+n);
    \n-
    219 }
    \n-
    220
    \n-
    223 const_iterator beforeEnd () const
    \n-
    224 {
    \n-
    225 return const_iterator(p,p+n-1);
    \n-
    226 }
    \n-
    227
    \n-
    230 const_iterator beforeBegin () const
    \n-
    231 {
    \n-
    232 return const_iterator(p,p-1);
    \n-
    233 }
    \n-
    234
    \n-
    236 const_iterator find (size_type i) const
    \n-
    237 {
    \n-
    238 return const_iterator(p,p+std::min(i,n));
    \n-
    239 }
    \n+
    181 template<class M> using UMFPackRangeType = typename UMFPackVectorChooser<M>::range_type;
    \n+
    182
    \n+
    183 template<class M>
    \n+
    184 struct UMFPackVectorChooser<M,
    \n+
    185 std::enable_if_t<(std::is_same<M,double>::value) || (std::is_same<M,std::complex<double> >::value)>>
    \n+
    186 {
    \n+
    187 using domain_type = M;
    \n+
    188 using range_type = M;
    \n+
    189 };
    \n+
    190
    \n+
    191 template<typename T, int n, int m>
    \n+
    192 struct UMFPackVectorChooser<FieldMatrix<T,n,m>,
    \n+
    193 std::enable_if_t<(std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value)>>
    \n+
    194 {
    \n+
    196 using domain_type = FieldVector<T,m>;
    \n+
    198 using range_type = FieldVector<T,n>;
    \n+
    199 };
    \n+
    200
    \n+
    201 template<typename T, typename A>
    \n+
    202 struct UMFPackVectorChooser<BCRSMatrix<T,A>,
    \n+
    203 std::void_t<UMFPackDomainType<T>, UMFPackRangeType<T>>>
    \n+
    204 {
    \n+
    205 // In case of recursive deduction (e.g., BCRSMatrix<FieldMatrix<...>, Allocator<FieldMatrix<...>>>)
    \n+
    206 // the allocator needs to be converted to the sub-block allocator type too (e.g., Allocator<FieldVector<...>>).
    \n+
    207 // Note that matrix allocator is assumed to be the same as the domain/range type of allocators
    \n+
    209 using domain_type = BlockVector<UMFPackDomainType<T>, typename std::allocator_traits<A>::template rebind_alloc<UMFPackDomainType<T>>>;
    \n+
    211 using range_type = BlockVector<UMFPackRangeType<T>, typename std::allocator_traits<A>::template rebind_alloc<UMFPackRangeType<T>>>;
    \n+
    212 };
    \n+
    213
    \n+
    214 // to make the `UMFPackVectorChooser` work with `MultiTypeBlockMatrix`, we need to add an intermediate step for the rows, which are typically `MultiTypeBlockVector`
    \n+
    215 template<typename FirstBlock, typename... Blocks>
    \n+
    216 struct UMFPackVectorChooser<MultiTypeBlockVector<FirstBlock, Blocks...>,
    \n+
    217 std::void_t<UMFPackDomainType<FirstBlock>, UMFPackRangeType<FirstBlock>, UMFPackDomainType<Blocks>...>>
    \n+
    218 {
    \n+
    220 using domain_type = MultiTypeBlockVector<UMFPackDomainType<FirstBlock>, UMFPackDomainType<Blocks>...>;
    \n+
    222 using range_type = UMFPackRangeType<FirstBlock>;
    \n+
    223 };
    \n+
    224
    \n+
    225 // specialization for `MultiTypeBlockMatrix` with `MultiTypeBlockVector` rows
    \n+
    226 template<typename FirstRow, typename... Rows>
    \n+
    227 struct UMFPackVectorChooser<MultiTypeBlockMatrix<FirstRow, Rows...>,
    \n+
    228 std::void_t<UMFPackDomainType<FirstRow>, UMFPackRangeType<FirstRow>, UMFPackRangeType<Rows>...>>
    \n+
    229 {
    \n+
    231 using domain_type = UMFPackDomainType<FirstRow>;
    \n+
    233 using range_type = MultiTypeBlockVector< UMFPackRangeType<FirstRow>, UMFPackRangeType<Rows>... >;
    \n+
    234 };
    \n+
    235
    \n+
    236 // dummy class to represent no BitVector
    \n+
    237 struct NoBitVector
    \n+
    238 {};
    \n+
    239
    \n
    240
    \n-
    241
    \n-
    242 //===== sizes
    \n-
    243
    \n-
    245 size_type size () const
    \n-
    246 {
    \n-
    247 return n;
    \n-
    248 }
    \n-
    249
    \n-
    251 const B* data() const
    \n-
    252 {
    \n-
    253 return p;
    \n-
    254 }
    \n-
    255
    \n-
    257 B* data()
    \n-
    258 {
    \n-
    259 return p;
    \n-
    260 }
    \n-
    261
    \n-
    262 protected:
    \n-
    264 base_array_unmanaged ()
    \n-
    265 : n(0), p(0)
    \n-
    266 {}
    \n-
    268 base_array_unmanaged (size_type n_, B* p_)
    \n-
    269 : n(n_), p(p_)
    \n-
    270 {}
    \n-
    271 size_type n; // number of elements in array
    \n-
    272 B *p; // pointer to dynamically allocated built-in array
    \n-
    273 };
    \n-
    274
    \n+
    241 }
    \n+
    242
    \n+
    256 template<typename M>
    \n+
    \n+
    257 class UMFPack : public InverseOperator<Impl::UMFPackDomainType<M>,Impl::UMFPackRangeType<M>>
    \n+
    258 {
    \n+
    259 using T = typename M::field_type;
    \n+
    260
    \n+
    261 public:
    \n+
    262 using size_type = SuiteSparse_long;
    \n+
    263
    \n+
    265 using Matrix = M;
    \n+
    266 using matrix_type = M;
    \n+
    268 using UMFPackMatrix = ISTL::Impl::BCCSMatrix<typename Matrix::field_type, size_type>;
    \n+
    270 using MatrixInitializer = ISTL::Impl::BCCSMatrixInitializer<M, size_type>;
    \n+
    272 using domain_type = Impl::UMFPackDomainType<M>;
    \n+
    274 using range_type = Impl::UMFPackRangeType<M>;
    \n
    275
    \n-
    276
    \n-
    298 template<class B, class ST=std::size_t >
    \n-
    299 class compressed_base_array_unmanaged
    \n-
    300 {
    \n-
    301 public:
    \n-
    302
    \n-
    303 //===== type definitions and constants
    \n-
    304
    \n-
    306 typedef B member_type;
    \n-
    307
    \n-
    309 typedef ST size_type;
    \n-
    310
    \n-
    312 using reference = B&;
    \n-
    313
    \n-
    315 using const_reference = const B&;
    \n-
    316
    \n-
    317 //===== access to components
    \n-
    318
    \n-
    320 reference operator[] (size_type i)
    \n-
    321 {
    \n-
    322 const size_type* lb = std::lower_bound(j, j+n, i);
    \n-
    323 if (lb == j+n || *lb != i)
    \n-
    324 DUNE_THROW(ISTLError,"index "<<i<<" not in compressed array");
    \n-
    325 return p[lb-j];
    \n-
    326 }
    \n-
    327
    \n-
    329 const_reference operator[] (size_type i) const
    \n-
    330 {
    \n-
    331 const size_type* lb = std::lower_bound(j, j+n, i);
    \n-
    332 if (lb == j+n || *lb != i)
    \n-
    333 DUNE_THROW(ISTLError,"index "<<i<<" not in compressed array");
    \n-
    334 return p[lb-j];
    \n-
    335 }
    \n-
    336
    \n-
    338 template<class T>
    \n-
    339 class RealIterator
    \n-
    340 : public BidirectionalIteratorFacade<RealIterator<T>, T>
    \n-
    341 {
    \n-
    342 public:
    \n-
    344 typedef typename std::remove_const<T>::type ValueType;
    \n-
    345
    \n-
    346 friend class BidirectionalIteratorFacade<RealIterator<const ValueType>, const ValueType>;
    \n-
    347 friend class BidirectionalIteratorFacade<RealIterator<ValueType>, ValueType>;
    \n-
    348 friend class RealIterator<const ValueType>;
    \n-
    349 friend class RealIterator<ValueType>;
    \n-
    350
    \n-
    352 RealIterator ()
    \n-
    353 : p(0), j(0), i(0)
    \n-
    354 {}
    \n-
    355
    \n-
    357 RealIterator (B* _p, size_type* _j, size_type _i)
    \n-
    358 : p(_p), j(_j), i(_i)
    \n-
    359 { }
    \n-
    360
    \n-
    364 RealIterator(const RealIterator<ValueType>& it)
    \n-
    365 : p(it.p), j(it.j), i(it.i)
    \n-
    366 {}
    \n-
    367
    \n-
    368
    \n-
    370 bool equals (const RealIterator<ValueType>& it) const
    \n-
    371 {
    \n-
    372 assert(p==it.p);
    \n-
    373 return (i)==(it.i);
    \n-
    374 }
    \n-
    375
    \n-
    377 bool equals (const RealIterator<const ValueType>& it) const
    \n-
    378 {
    \n-
    379 assert(p==it.p);
    \n-
    380 return (i)==(it.i);
    \n-
    381 }
    \n-
    382
    \n-
    383
    \n-
    385 size_type index () const
    \n-
    386 {
    \n-
    387 return j[i];
    \n-
    388 }
    \n-
    389
    \n-
    391 void setindex (size_type k)
    \n-
    392 {
    \n-
    393 return j[i] = k;
    \n-
    394 }
    \n-
    395
    \n-
    403 size_type offset () const
    \n-
    404 {
    \n-
    405 return i;
    \n-
    406 }
    \n-
    407
    \n-
    408 private:
    \n-
    410 void increment()
    \n-
    411 {
    \n-
    412 ++i;
    \n-
    413 }
    \n-
    414
    \n-
    416 void decrement()
    \n+
    \n+\n+
    278 {
    \n+\n+
    280 }
    \n+
    \n+
    281
    \n+
    \n+
    290 UMFPack(const Matrix& matrix, int verbose=0) : matrixIsLoaded_(false)
    \n+
    291 {
    \n+
    292 //check whether T is a supported type
    \n+
    293 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n+
    294 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
    \n+
    295 Caller::defaults(UMF_Control);
    \n+
    296 setVerbosity(verbose);
    \n+
    297 setMatrix(matrix);
    \n+
    298 }
    \n+
    \n+
    299
    \n+
    \n+
    308 UMFPack(const Matrix& matrix, int verbose, bool) : matrixIsLoaded_(false)
    \n+
    309 {
    \n+
    310 //check whether T is a supported type
    \n+
    311 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n+
    312 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
    \n+
    313 Caller::defaults(UMF_Control);
    \n+
    314 setVerbosity(verbose);
    \n+
    315 setMatrix(matrix);
    \n+
    316 }
    \n+
    \n+
    317
    \n+
    \n+
    327 UMFPack(const Matrix& mat_, const ParameterTree& config)
    \n+
    328 : UMFPack(mat_, config.get<int>("verbose", 0))
    \n+
    329 {}
    \n+
    \n+
    330
    \n+
    \n+
    333 UMFPack() : matrixIsLoaded_(false), verbosity_(0)
    \n+
    334 {
    \n+
    335 //check whether T is a supported type
    \n+
    336 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n+
    337 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
    \n+
    338 Caller::defaults(UMF_Control);
    \n+
    339 }
    \n+
    \n+
    340
    \n+
    \n+
    351 UMFPack(const Matrix& mat_, const char* file, int verbose=0)
    \n+
    352 {
    \n+
    353 //check whether T is a supported type
    \n+
    354 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n+
    355 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
    \n+
    356 Caller::defaults(UMF_Control);
    \n+
    357 setVerbosity(verbose);
    \n+
    358 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast<char*>(file));
    \n+
    359 if ((errcode == UMFPACK_ERROR_out_of_memory) || (errcode == UMFPACK_ERROR_file_IO))
    \n+
    360 {
    \n+
    361 matrixIsLoaded_ = false;
    \n+
    362 setMatrix(mat_);
    \n+
    363 saveDecomposition(file);
    \n+
    364 }
    \n+
    365 else
    \n+
    366 {
    \n+
    367 matrixIsLoaded_ = true;
    \n+
    368 std::cout << "UMFPack decomposition successfully loaded from " << file << std::endl;
    \n+
    369 }
    \n+
    370 }
    \n+
    \n+
    371
    \n+
    \n+
    378 UMFPack(const char* file, int verbose=0)
    \n+
    379 {
    \n+
    380 //check whether T is a supported type
    \n+
    381 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n+
    382 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
    \n+
    383 Caller::defaults(UMF_Control);
    \n+
    384 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast<char*>(file));
    \n+
    385 if (errcode == UMFPACK_ERROR_out_of_memory)
    \n+
    386 DUNE_THROW(Dune::Exception, "ran out of memory while loading UMFPack decomposition");
    \n+
    387 if (errcode == UMFPACK_ERROR_file_IO)
    \n+
    388 DUNE_THROW(Dune::Exception, "IO error while loading UMFPack decomposition");
    \n+
    389 matrixIsLoaded_ = true;
    \n+
    390 std::cout << "UMFPack decomposition successfully loaded from " << file << std::endl;
    \n+
    391 setVerbosity(verbose);
    \n+
    392 }
    \n+
    \n+
    393
    \n+
    \n+
    394 virtual ~UMFPack()
    \n+
    395 {
    \n+
    396 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
    \n+
    397 free();
    \n+
    398 }
    \n+
    \n+
    399
    \n+
    \n+\n+
    404 {
    \n+
    405 if (umfpackMatrix_.N() != b.dim())
    \n+
    406 DUNE_THROW(Dune::ISTLError, "Size of right-hand-side vector b does not match the number of matrix rows!");
    \n+
    407 if (umfpackMatrix_.M() != x.dim())
    \n+
    408 DUNE_THROW(Dune::ISTLError, "Size of solution vector x does not match the number of matrix columns!");
    \n+
    409 if (b.size() == 0)
    \n+
    410 return;
    \n+
    411
    \n+
    412 // we have to convert x and b into flat structures
    \n+
    413 // however, this is linear in time
    \n+
    414 std::vector<T> xFlat(x.dim()), bFlat(b.dim());
    \n+
    415
    \n+
    416 flatVectorForEach(x, [&](auto&& entry, auto&& offset)
    \n
    417 {
    \n-
    418 --i;
    \n-
    419 }
    \n+
    418 xFlat[ offset ] = entry;
    \n+
    419 });
    \n
    420
    \n-
    422 reference dereference () const
    \n-
    423 {
    \n-
    424 return p[i];
    \n-
    425 }
    \n-
    426
    \n-
    427 B* p;
    \n-
    428 size_type* j;
    \n-
    429 size_type i;
    \n-
    430 };
    \n-
    431
    \n-
    433 typedef RealIterator<B> iterator;
    \n-
    434
    \n-
    436 iterator begin ()
    \n-
    437 {
    \n-
    438 return iterator(p,j,0);
    \n-
    439 }
    \n-
    440
    \n-
    442 iterator end ()
    \n-
    443 {
    \n-
    444 return iterator(p,j,n);
    \n-
    445 }
    \n-
    446
    \n-
    449 iterator beforeEnd ()
    \n-
    450 {
    \n-
    451 return iterator(p,j,n-1);
    \n-
    452 }
    \n-
    453
    \n-
    456 iterator beforeBegin ()
    \n-
    457 {
    \n-
    458 return iterator(p,j,-1);
    \n-
    459 }
    \n-
    460
    \n-
    462 iterator find (size_type i)
    \n-
    463 {
    \n-
    464 const size_type* lb = std::lower_bound(j, j+n, i);
    \n-
    465 return (lb != j+n && *lb == i)
    \n-
    466 ? iterator(p,j,lb-j)
    \n-
    467 : end();
    \n-
    468 }
    \n-
    469
    \n-
    471 typedef RealIterator<const B> const_iterator;
    \n-
    472
    \n-
    474 const_iterator begin () const
    \n-
    475 {
    \n-
    476 return const_iterator(p,j,0);
    \n-
    477 }
    \n-
    478
    \n-
    480 const_iterator end () const
    \n-
    481 {
    \n-
    482 return const_iterator(p,j,n);
    \n-
    483 }
    \n-
    484
    \n-
    487 const_iterator beforeEnd () const
    \n-
    488 {
    \n-
    489 return const_iterator(p,j,n-1);
    \n-
    490 }
    \n-
    491
    \n-
    494 const_iterator beforeBegin () const
    \n-
    495 {
    \n-
    496 return const_iterator(p,j,-1);
    \n-
    497 }
    \n-
    498
    \n-
    500 const_iterator find (size_type i) const
    \n-
    501 {
    \n-
    502 const size_type* lb = std::lower_bound(j, j+n, i);
    \n-
    503 return (lb != j+n && *lb == i)
    \n-
    504 ? const_iterator(p,j,lb-j)
    \n-
    505 : end();
    \n-
    506 }
    \n-
    507
    \n-
    508 //===== sizes
    \n+
    421 flatVectorForEach(b, [&](auto&& entry, auto&& offset)
    \n+
    422 {
    \n+
    423 bFlat[ offset ] = entry;
    \n+
    424 });
    \n+
    425
    \n+
    426 double UMF_Apply_Info[UMFPACK_INFO];
    \n+
    427 Caller::solve(UMFPACK_A,
    \n+
    428 umfpackMatrix_.getColStart(),
    \n+
    429 umfpackMatrix_.getRowIndex(),
    \n+
    430 umfpackMatrix_.getValues(),
    \n+
    431 reinterpret_cast<double*>(&xFlat[0]),
    \n+
    432 reinterpret_cast<double*>(&bFlat[0]),
    \n+
    433 UMF_Numeric,
    \n+
    434 UMF_Control,
    \n+
    435 UMF_Apply_Info);
    \n+
    436
    \n+
    437 // copy back to blocked vector
    \n+
    438 flatVectorForEach(x, [&](auto&& entry, auto offset)
    \n+
    439 {
    \n+
    440 entry = xFlat[offset];
    \n+
    441 });
    \n+
    442
    \n+
    443 //this is a direct solver
    \n+
    444 res.iterations = 1;
    \n+
    445 res.converged = true;
    \n+
    446 res.elapsed = UMF_Apply_Info[UMFPACK_SOLVE_WALLTIME];
    \n+
    447
    \n+
    448 printOnApply(UMF_Apply_Info);
    \n+
    449 }
    \n+
    \n+
    450
    \n+
    \n+
    454 virtual void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
    \n+
    455 {
    \n+
    456 apply(x,b,res);
    \n+
    457 }
    \n+
    \n+
    458
    \n+
    \n+
    466 void apply(T* x, T* b)
    \n+
    467 {
    \n+
    468 double UMF_Apply_Info[UMFPACK_INFO];
    \n+
    469 Caller::solve(UMFPACK_A,
    \n+
    470 umfpackMatrix_.getColStart(),
    \n+
    471 umfpackMatrix_.getRowIndex(),
    \n+
    472 umfpackMatrix_.getValues(),
    \n+
    473 x,
    \n+
    474 b,
    \n+
    475 UMF_Numeric,
    \n+
    476 UMF_Control,
    \n+
    477 UMF_Apply_Info);
    \n+
    478 printOnApply(UMF_Apply_Info);
    \n+
    479 }
    \n+
    \n+
    480
    \n+
    \n+
    492 void setOption(unsigned int option, double value)
    \n+
    493 {
    \n+
    494 if (option >= UMFPACK_CONTROL)
    \n+
    495 DUNE_THROW(RangeError, "Requested non-existing UMFPack option");
    \n+
    496
    \n+
    497 UMF_Control[option] = value;
    \n+
    498 }
    \n+
    \n+
    499
    \n+
    \n+
    503 void saveDecomposition(const char* file)
    \n+
    504 {
    \n+
    505 int errcode = Caller::save_numeric(UMF_Numeric, const_cast<char*>(file));
    \n+
    506 if (errcode != UMFPACK_OK)
    \n+
    507 DUNE_THROW(Dune::Exception,"IO ERROR while trying to save UMFPack decomposition");
    \n+
    508 }
    \n+
    \n
    509
    \n-
    511 size_type size () const
    \n-
    512 {
    \n-
    513 return n;
    \n-
    514 }
    \n-
    515
    \n-
    516 protected:
    \n-
    518 compressed_base_array_unmanaged ()
    \n-
    519 : n(0), p(0), j(0)
    \n-
    520 {}
    \n-
    521
    \n-
    522 size_type n; // number of elements in array
    \n-
    523 B *p; // pointer to dynamically allocated built-in array
    \n-
    524 size_type* j; // the index set
    \n-
    525 };
    \n+
    519 template<class BitVector = Impl::NoBitVector>
    \n+
    \n+
    520 void setMatrix(const Matrix& matrix, const BitVector& bitVector = {})
    \n+
    521 {
    \n+
    522 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
    \n+
    523 free();
    \n+
    524 if (matrix.N() == 0 or matrix.M() == 0)
    \n+
    525 return;
    \n
    526
    \n-
    527} // end namespace Imp
    \n-
    528
    \n-
    529} // end namespace
    \n-
    530
    \n-
    531#endif
    \n-\n+
    527 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != 0)
    \n+
    528 umfpackMatrix_.free();
    \n+
    529
    \n+
    530 constexpr bool useBitVector = not std::is_same_v<BitVector,Impl::NoBitVector>;
    \n+
    531
    \n+
    532 // use a dynamic flat vector for the bitset
    \n+
    533 std::vector<bool> flatBitVector;
    \n+
    534 // and a mapping from the compressed indices
    \n+
    535 std::vector<size_type> subIndices;
    \n+
    536
    \n+
    537 int numberOfIgnoredDofs = 0;
    \n+
    538 int nonZeros = 0;
    \n+
    539
    \n+
    540 if constexpr ( useBitVector )
    \n+
    541 {
    \n+
    542 auto flatSize = flatVectorForEach(bitVector, [](auto&&, auto&&){});
    \n+
    543 flatBitVector.resize(flatSize);
    \n+
    544
    \n+
    545 flatVectorForEach(bitVector, [&](auto&& entry, auto&& offset)
    \n+
    546 {
    \n+
    547 flatBitVector[ offset ] = entry;
    \n+
    548 if ( entry )
    \n+
    549 {
    \n+
    550 numberOfIgnoredDofs++;
    \n+
    551 }
    \n+
    552 });
    \n+
    553 }
    \n+
    554
    \n+
    555 // compute the flat dimension and the number of nonzeros of the matrix
    \n+
    556 auto [flatRows,flatCols] = flatMatrixForEach( matrix, [&](auto&& /*entry*/, auto&& row, auto&& col){
    \n+
    557 // do not count ignored entries
    \n+
    558 if constexpr ( useBitVector )
    \n+
    559 if ( flatBitVector[row] or flatBitVector[col] )
    \n+
    560 return;
    \n+
    561
    \n+
    562 nonZeros++;
    \n+
    563 });
    \n+
    564
    \n+
    565 if constexpr ( useBitVector )
    \n+
    566 {
    \n+
    567 // use the original flatRows!
    \n+
    568 subIndices.resize(flatRows,std::numeric_limits<std::size_t>::max());
    \n+
    569
    \n+
    570 size_type subIndexCounter = 0;
    \n+
    571 for ( size_type i=0; i<size_type(flatRows); i++ )
    \n+
    572 if ( not flatBitVector[ i ] )
    \n+
    573 subIndices[ i ] = subIndexCounter++;
    \n+
    574
    \n+
    575 // update the original matrix size
    \n+
    576 flatRows -= numberOfIgnoredDofs;
    \n+
    577 flatCols -= numberOfIgnoredDofs;
    \n+
    578 }
    \n+
    579
    \n+
    580
    \n+
    581 umfpackMatrix_.setSize(flatRows,flatCols);
    \n+
    582 umfpackMatrix_.Nnz_ = nonZeros;
    \n+
    583
    \n+
    584 // prepare the arrays
    \n+
    585 umfpackMatrix_.colstart = new size_type[flatCols+1];
    \n+
    586 umfpackMatrix_.rowindex = new size_type[nonZeros];
    \n+
    587 umfpackMatrix_.values = new T[nonZeros];
    \n+
    588
    \n+
    589 for ( size_type i=0; i<size_type(flatCols+1); i++ )
    \n+
    590 {
    \n+
    591 umfpackMatrix_.colstart[i] = 0;
    \n+
    592 }
    \n+
    593
    \n+
    594 // at first, we need to compute the column start indices
    \n+
    595 // therefore, we count all entries in each column and in the end we accumulate everything
    \n+
    596 flatMatrixForEach(matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&& flatColIndex)
    \n+
    597 {
    \n+
    598 // do nothing if entry is excluded
    \n+
    599 if constexpr ( useBitVector )
    \n+
    600 if ( flatBitVector[flatRowIndex] or flatBitVector[flatColIndex] )
    \n+
    601 return;
    \n+
    602
    \n+
    603 // pick compressed or uncompressed index
    \n+
    604 // compiler will hopefully do some constexpr optimization here
    \n+
    605 auto colIdx = useBitVector ? subIndices[flatColIndex] : flatColIndex;
    \n+
    606
    \n+
    607 umfpackMatrix_.colstart[colIdx+1]++;
    \n+
    608 });
    \n+
    609
    \n+
    610 // now accumulate
    \n+
    611 for ( size_type i=0; i<(size_type)flatCols; i++ )
    \n+
    612 {
    \n+
    613 umfpackMatrix_.colstart[i+1] += umfpackMatrix_.colstart[i];
    \n+
    614 }
    \n+
    615
    \n+
    616 // we need a compressed position counter in each column
    \n+
    617 std::vector<size_type> colPosition(flatCols,0);
    \n+
    618
    \n+
    619 // now we can set the entries: the procedure below works with both row- or column major index ordering
    \n+
    620 flatMatrixForEach(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&& flatColIndex)
    \n+
    621 {
    \n+
    622 // do nothing if entry is excluded
    \n+
    623 if constexpr ( useBitVector )
    \n+
    624 if ( flatBitVector[flatRowIndex] or flatBitVector[flatColIndex] )
    \n+
    625 return;
    \n+
    626
    \n+
    627 // pick compressed or uncompressed index
    \n+
    628 // compiler will hopefully do some constexpr optimization here
    \n+
    629 auto rowIdx = useBitVector ? subIndices[flatRowIndex] : flatRowIndex;
    \n+
    630 auto colIdx = useBitVector ? subIndices[flatColIndex] : flatColIndex;
    \n+
    631
    \n+
    632 // the start index of each column is already fixed
    \n+
    633 auto colStart = umfpackMatrix_.colstart[colIdx];
    \n+
    634 // get the current number of picked elements in this column
    \n+
    635 auto colPos = colPosition[colIdx];
    \n+
    636 // assign the corresponding row index and the value of this element
    \n+
    637 umfpackMatrix_.rowindex[ colStart + colPos ] = rowIdx;
    \n+
    638 umfpackMatrix_.values[ colStart + colPos ] = entry;
    \n+
    639 // increase the number of picked elements in this column
    \n+
    640 colPosition[colIdx]++;
    \n+
    641 });
    \n+
    642
    \n+
    643 decompose();
    \n+
    644 }
    \n+
    \n+
    645
    \n+
    646 // Keep legacy version using a set of scalar indices
    \n+
    647 // The new version using a bitVector type for marking the active matrix indices is
    \n+
    648 // directly given in `setMatrix` with an additional BitVector argument.
    \n+
    649 // The new version is more flexible and allows, e.g., marking single components of a matrix block.
    \n+
    650 template<typename S>
    \n+
    \n+
    651 void setSubMatrix(const Matrix& _mat, const S& rowIndexSet)
    \n+
    652 {
    \n+
    653 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
    \n+
    654 free();
    \n+
    655
    \n+
    656 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != 0)
    \n+
    657 umfpackMatrix_.free();
    \n+
    658
    \n+
    659 umfpackMatrix_.setSize(rowIndexSet.size()*MatrixDimension<Matrix>::rowdim(_mat) / _mat.N(),
    \n+
    660 rowIndexSet.size()*MatrixDimension<Matrix>::coldim(_mat) / _mat.M());
    \n+
    661 ISTL::Impl::BCCSMatrixInitializer<Matrix, SuiteSparse_long> initializer(umfpackMatrix_);
    \n+
    662
    \n+
    663 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(_mat,rowIndexSet));
    \n+
    664
    \n+
    665 decompose();
    \n+
    666 }
    \n+
    \n+
    667
    \n+
    \n+
    675 void setVerbosity(int v)
    \n+
    676 {
    \n+
    677 verbosity_ = v;
    \n+
    678 // set the verbosity level in UMFPack
    \n+
    679 if (verbosity_ == 0)
    \n+
    680 UMF_Control[UMFPACK_PRL] = 1;
    \n+
    681 if (verbosity_ == 1)
    \n+
    682 UMF_Control[UMFPACK_PRL] = 2;
    \n+
    683 if (verbosity_ == 2)
    \n+
    684 UMF_Control[UMFPACK_PRL] = 4;
    \n+
    685 }
    \n+
    \n+
    686
    \n+
    \n+\n+
    692 {
    \n+
    693 return UMF_Numeric;
    \n+
    694 }
    \n+
    \n+
    695
    \n+
    \n+\n+
    701 {
    \n+
    702 return umfpackMatrix_;
    \n+
    703 }
    \n+
    \n+
    704
    \n+
    \n+
    709 void free()
    \n+
    710 {
    \n+
    711 if (!matrixIsLoaded_)
    \n+
    712 {
    \n+
    713 Caller::free_symbolic(&UMF_Symbolic);
    \n+
    714 umfpackMatrix_.free();
    \n+
    715 }
    \n+
    716 Caller::free_numeric(&UMF_Numeric);
    \n+
    717 matrixIsLoaded_ = false;
    \n+
    718 }
    \n+
    \n+
    719
    \n+
    720 const char* name() { return "UMFPACK"; }
    \n+
    721
    \n+
    722 private:
    \n+
    723 typedef typename Dune::UMFPackMethodChooser<T> Caller;
    \n+
    724
    \n+
    725 template<class Mat,class X, class TM, class TD, class T1>
    \n+\n+\n+
    728
    \n+
    730 void decompose()
    \n+
    731 {
    \n+
    732 double UMF_Decomposition_Info[UMFPACK_INFO];
    \n+
    733 Caller::symbolic(static_cast<SuiteSparse_long>(umfpackMatrix_.N()),
    \n+
    734 static_cast<SuiteSparse_long>(umfpackMatrix_.N()),
    \n+
    735 umfpackMatrix_.getColStart(),
    \n+
    736 umfpackMatrix_.getRowIndex(),
    \n+
    737 reinterpret_cast<double*>(umfpackMatrix_.getValues()),
    \n+
    738 &UMF_Symbolic,
    \n+
    739 UMF_Control,
    \n+
    740 UMF_Decomposition_Info);
    \n+
    741 Caller::numeric(umfpackMatrix_.getColStart(),
    \n+
    742 umfpackMatrix_.getRowIndex(),
    \n+
    743 reinterpret_cast<double*>(umfpackMatrix_.getValues()),
    \n+
    744 UMF_Symbolic,
    \n+
    745 &UMF_Numeric,
    \n+
    746 UMF_Control,
    \n+
    747 UMF_Decomposition_Info);
    \n+
    748 Caller::report_status(UMF_Control,UMF_Decomposition_Info[UMFPACK_STATUS]);
    \n+
    749 if (verbosity_ == 1)
    \n+
    750 {
    \n+
    751 std::cout << "[UMFPack Decomposition]" << std::endl;
    \n+
    752 std::cout << "Wallclock Time taken: " << UMF_Decomposition_Info[UMFPACK_NUMERIC_WALLTIME] << " (CPU Time: " << UMF_Decomposition_Info[UMFPACK_NUMERIC_TIME] << ")" << std::endl;
    \n+
    753 std::cout << "Flops taken: " << UMF_Decomposition_Info[UMFPACK_FLOPS] << std::endl;
    \n+
    754 std::cout << "Peak Memory Usage: " << UMF_Decomposition_Info[UMFPACK_PEAK_MEMORY]*UMF_Decomposition_Info[UMFPACK_SIZE_OF_UNIT] << " bytes" << std::endl;
    \n+
    755 std::cout << "Condition number estimate: " << 1./UMF_Decomposition_Info[UMFPACK_RCOND] << std::endl;
    \n+
    756 std::cout << "Numbers of non-zeroes in decomposition: L: " << UMF_Decomposition_Info[UMFPACK_LNZ] << " U: " << UMF_Decomposition_Info[UMFPACK_UNZ] << std::endl;
    \n+
    757 }
    \n+
    758 if (verbosity_ == 2)
    \n+
    759 {
    \n+
    760 Caller::report_info(UMF_Control,UMF_Decomposition_Info);
    \n+
    761 }
    \n+
    762 }
    \n+
    763
    \n+
    764 void printOnApply(double* UMF_Info)
    \n+
    765 {
    \n+
    766 Caller::report_status(UMF_Control,UMF_Info[UMFPACK_STATUS]);
    \n+
    767 if (verbosity_ > 0)
    \n+
    768 {
    \n+
    769 std::cout << "[UMFPack Solve]" << std::endl;
    \n+
    770 std::cout << "Wallclock Time: " << UMF_Info[UMFPACK_SOLVE_WALLTIME] << " (CPU Time: " << UMF_Info[UMFPACK_SOLVE_TIME] << ")" << std::endl;
    \n+
    771 std::cout << "Flops Taken: " << UMF_Info[UMFPACK_SOLVE_FLOPS] << std::endl;
    \n+
    772 std::cout << "Iterative Refinement steps taken: " << UMF_Info[UMFPACK_IR_TAKEN] << std::endl;
    \n+
    773 std::cout << "Error Estimate: " << UMF_Info[UMFPACK_OMEGA1] << " resp. " << UMF_Info[UMFPACK_OMEGA2] << std::endl;
    \n+
    774 }
    \n+
    775 }
    \n+
    776
    \n+
    777 UMFPackMatrix umfpackMatrix_;
    \n+
    778 bool matrixIsLoaded_;
    \n+
    779 int verbosity_;
    \n+
    780 void *UMF_Symbolic;
    \n+
    781 void *UMF_Numeric;
    \n+
    782 double UMF_Control[UMFPACK_CONTROL];
    \n+
    783 };
    \n+
    \n+
    784
    \n+
    785 template<typename T, typename A, int n, int m>
    \n+
    \n+\n+
    787 {
    \n+
    788 enum { value=true};
    \n+
    789 };
    \n+
    \n+
    790
    \n+
    791 template<typename T, typename A>
    \n+
    \n+\n+
    793 {
    \n+
    794 enum { value = true };
    \n+
    795 };
    \n+
    \n+
    796
    \n+
    \n+\n+
    798
    \n+
    799 template<class TL, class M,class=void> struct isValidBlock : std::false_type{};
    \n+
    800 template<class TL, class M> struct isValidBlock<TL,M,
    \n+
    801 std::enable_if_t<
    \n+
    802 std::is_same_v<Impl::UMFPackDomainType<M>, typename Dune::TypeListElement<1,TL>::type>
    \n+
    803 && std::is_same_v<Impl::UMFPackRangeType<M>, typename Dune::TypeListElement<2,TL>::type>
    \n+
    804 >> : std::true_type {};
    \n+
    805
    \n+
    806 template<typename TL, typename M>
    \n+
    807 std::shared_ptr<Dune::InverseOperator<Impl::UMFPackDomainType<M>,Impl::UMFPackRangeType<M>>>
    \n+
    \n+
    808 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
    \n+
    809 std::enable_if_t<isValidBlock<TL, M>::value,int> = 0) const
    \n+
    810 {
    \n+
    811 int verbose = config.get("verbose", 0);
    \n+
    812 return std::make_shared<Dune::UMFPack<M>>(mat,verbose);
    \n+
    813 }
    \n+
    \n+
    814
    \n+
    815 // second version with SFINAE to validate the template parameters of UMFPack
    \n+
    816 template<typename TL, typename M>
    \n+
    817 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n+
    818 typename Dune::TypeListElement<2, TL>::type>>
    \n+
    \n+
    819 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
    \n+
    820 std::enable_if_t<!isValidBlock<TL, M>::value,int> = 0) const
    \n+
    821 {
    \n+
    822 using D = typename Dune::TypeListElement<1,TL>::type;
    \n+
    823 using R = typename Dune::TypeListElement<2,TL>::type;
    \n+
    824 using DU = Std::detected_t< Impl::UMFPackDomainType, M>;
    \n+
    825 using RU = Std::detected_t< Impl::UMFPackRangeType, M>;
    \n+
    826 DUNE_THROW(UnsupportedType,
    \n+
    827 "Unsupported Types in UMFPack:\\n"
    \n+
    828 "Matrix: " << className<M>() << ""
    \n+
    829 "Domain provided: " << className<D>() << "\\n"
    \n+
    830 "Domain required: " << className<DU>() << "\\n"
    \n+
    831 "Range provided: " << className<R>() << "\\n"
    \n+
    832 "Range required: " << className<RU>() << "\\n"
    \n+
    833 );
    \n+
    834 }
    \n+
    \n+
    835 };
    \n+
    \n+\n+
    837} // end namespace Dune
    \n+
    838
    \n+
    839#endif // HAVE_SUITESPARSE_UMFPACK
    \n+
    840
    \n+
    841#endif //DUNE_ISTL_UMFPACK_HH
    \n+
    Implementation of the BCRSMatrix class.
    \n+\n+\n+\n+
    Implementations of the inverse operator interface.
    \n+\n+
    Templates characterizing the type of a solver.
    \n+
    #define DUNE_REGISTER_DIRECT_SOLVER(name,...)
    Definition solverregistry.hh:13
    \n+\n+
    void free()
    free allocated space.
    Definition umfpack.hh:709
    \n+
    std::shared_ptr< Dune::InverseOperator< Impl::UMFPackDomainType< M >, Impl::UMFPackRangeType< M > > > operator()(TL, const M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< TL, M >::value, int >=0) const
    Definition umfpack.hh:808
    \n+
    virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
    Apply inverse operator,.
    Definition umfpack.hh:403
    \n+
    SuiteSparse_long size_type
    Definition umfpack.hh:262
    \n+
    static void symbolic(size_type m, size_type n, const size_type *cs, const size_type *ri, const double *val, A... args)
    Definition umfpack.hh:166
    \n+
    static void solve(size_type m, const size_type *cs, const size_type *ri, std::complex< double > *val, double *x, const double *b, A... args)
    Definition umfpack.hh:160
    \n+
    virtual SolverCategory::Category category() const
    Category of the solver (see SolverCategory::Category)
    Definition umfpack.hh:277
    \n+
    M matrix_type
    Definition umfpack.hh:266
    \n+
    static void numeric(const size_type *cs, const size_type *ri, const double *val, A... args)
    Definition umfpack.hh:140
    \n+
    static void report_info(A... args)
    Definition umfpack.hh:145
    \n+
    UMFPack(const Matrix &mat_, const ParameterTree &config)
    Construct a solver object from a matrix.
    Definition umfpack.hh:327
    \n+
    static int load_numeric(A... args)
    Definition umfpack.hh:135
    \n+
    static int load_numeric(A... args)
    Definition umfpack.hh:77
    \n+
    static void report_status(A... args)
    Definition umfpack.hh:92
    \n+
    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:351
    \n+
    Impl::UMFPackRangeType< M > range_type
    The type of the range of the solver.
    Definition umfpack.hh:274
    \n+
    UMFPack()
    default constructor
    Definition umfpack.hh:333
    \n+
    static void symbolic(A... args)
    Definition umfpack.hh:107
    \n+
    static void report_info(A... args)
    Definition umfpack.hh:87
    \n+
    static void free_symbolic(A... args)
    Definition umfpack.hh:72
    \n+
    static int save_numeric(A... args)
    Definition umfpack.hh:155
    \n+
    static void free_numeric(A... args)
    Definition umfpack.hh:125
    \n+
    void setSubMatrix(const Matrix &_mat, const S &rowIndexSet)
    Definition umfpack.hh:651
    \n+
    static int save_numeric(A... args)
    Definition umfpack.hh:97
    \n+
    static void report_status(A... args)
    Definition umfpack.hh:150
    \n+
    Impl::UMFPackDomainType< M > domain_type
    The type of the domain of the solver.
    Definition umfpack.hh:272
    \n+
    void apply(T *x, T *b)
    additional apply method with c-arrays in analogy to superlu
    Definition umfpack.hh:466
    \n+
    static void defaults(A... args)
    Definition umfpack.hh:120
    \n+
    static void free_numeric(A... args)
    Definition umfpack.hh:67
    \n+
    void setVerbosity(int v)
    sets the verbosity level for the UMFPack solver
    Definition umfpack.hh:675
    \n+
    UMFPack(const char *file, int verbose=0)
    try loading a decomposition from file
    Definition umfpack.hh:378
    \n+
    static void numeric(A... args)
    Definition umfpack.hh:82
    \n+
    static constexpr bool valid
    Definition umfpack.hh:53
    \n+
    virtual ~UMFPack()
    Definition umfpack.hh:394
    \n+
    const char * name()
    Definition umfpack.hh:720
    \n+
    void setMatrix(const Matrix &matrix, const BitVector &bitVector={})
    Initialize data from given matrix.
    Definition umfpack.hh:520
    \n+
    void saveDecomposition(const char *file)
    saves a decomposition to a file
    Definition umfpack.hh:503
    \n+
    UMFPackMatrix & getInternalMatrix()
    Return the column compress matrix from UMFPack.
    Definition umfpack.hh:700
    \n+
    SuiteSparse_long size_type
    Definition umfpack.hh:117
    \n+
    UMFPack(const Matrix &matrix, int verbose=0)
    Construct a solver object from a matrix.
    Definition umfpack.hh:290
    \n+
    ISTL::Impl::BCCSMatrixInitializer< M, size_type > MatrixInitializer
    Type of an associated initializer class.
    Definition umfpack.hh:270
    \n+
    virtual void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
    apply inverse operator, with given convergence criteria.
    Definition umfpack.hh:454
    \n+
    ISTL::Impl::BCCSMatrix< typename Matrix::field_type, size_type > UMFPackMatrix
    The corresponding (scalar) UMFPack matrix type.
    Definition umfpack.hh:268
    \n+
    void setOption(unsigned int option, double value)
    Set UMFPack-specific options.
    Definition umfpack.hh:492
    \n+
    static void free_symbolic(A... args)
    Definition umfpack.hh:130
    \n+
    M Matrix
    The matrix type.
    Definition umfpack.hh:265
    \n+
    static void defaults(A... args)
    Definition umfpack.hh:62
    \n+
    static void solve(A... args)
    Definition umfpack.hh:102
    \n+
    UMFPack(const Matrix &matrix, int verbose, bool)
    Constructor for compatibility with SuperLU standard constructor.
    Definition umfpack.hh:308
    \n+
    void * getFactorization()
    Return the matrix factorization.
    Definition umfpack.hh:691
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n+
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    STL namespace.
    \n
    Definition allocator.hh:11
    \n+
    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
    \n+
    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
    \n+
    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
    \n+
    Definition matrixutils.hh:211
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n+
    Definition overlappingschwarz.hh:694
    \n+
    Definition matrixutils.hh:27
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    double elapsed
    Elapsed time in seconds.
    Definition solver.hh:84
    \n+
    int iterations
    Number of iterations.
    Definition solver.hh:69
    \n+
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n+
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    Definition solverregistry.hh:77
    \n+
    Definition solvertype.hh:16
    \n+
    @ value
    Whether this is a direct solver.
    Definition solvertype.hh:24
    \n+
    Definition solvertype.hh:30
    \n+
    @ value
    whether the solver internally uses column compressed storage
    Definition solvertype.hh:36
    \n+
    Definition umfpack.hh:52
    \n+
    The UMFPack direct sparse solver.
    Definition umfpack.hh:258
    \n+
    Definition umfpack.hh:797
    \n+
    Definition umfpack.hh:799
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,421 +1,1066 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-basearray.hh\n+umfpack.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_BASEARRAY_HH\n-6#define DUNE_ISTL_BASEARRAY_HH\n+5#ifndef DUNE_ISTL_UMFPACK_HH\n+6#define DUNE_ISTL_UMFPACK_HH\n 7\n-8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13\n-14#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-15#include \n-16\n-21namespace _\bD_\bu_\bn_\be {\n-22\n-24namespace Imp {\n-25\n-46 template\n-47 class base_array_unmanaged\n-48 {\n-49 public:\n-50\n-51 //===== type definitions and constants\n-52\n-54 typedef B member_type;\n+8#if HAVE_SUITESPARSE_UMFPACK || defined DOXYGEN\n+9\n+10#include\n+11#include\n+12\n+13#include\n+14\n+15#include\n+16#include\n+17#include\n+18#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n+19#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+20#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh>\n+21#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+22#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+23#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n+24#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+25#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n+26\n+27\n+28\n+29namespace _\bD_\bu_\bn_\be {\n+41 // FORWARD DECLARATIONS\n+42 template\n+43 class SeqOverlappingSchwarz;\n+44\n+45 template\n+46 struct SeqOverlappingSchwarzAssemblerHelper;\n+47\n+48 // wrapper class for C-Function Calls in the backend. Choose the right\n+function namespace\n+49 // depending on the template parameter used.\n+50 template\n+_\b5_\b1 struct _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br\n+52 {\n+_\b5_\b3 static constexpr bool _\bv_\ba_\bl_\bi_\bd = false ;\n+54 };\n 55\n-57 typedef ST size_type;\n-58\n-60 using reference = B&;\n-61\n-63 using const_reference = const B&;\n-64\n-65 //===== access to components\n-66\n-68 reference operator[] (size_type i)\n-69 {\n-70#ifdef DUNE_ISTL_WITH_CHECKING\n-71 if (i>=n) DUNE_THROW(ISTLError,\"index out of range\");\n-72#endif\n-73 return p[i];\n-74 }\n-75\n-77 const_reference operator[] (size_type i) const\n+56 template<>\n+_\b5_\b7 struct _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br\n+58 {\n+_\b5_\b9 static constexpr bool _\bv_\ba_\bl_\bi_\bd = true ;\n+60\n+61 template\n+_\b6_\b2 static void _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs(A... args)\n+63 {\n+64 umfpack_dl_defaults(args...);\n+65 }\n+66 template\n+_\b6_\b7 static void _\bf_\br_\be_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n+68 {\n+69 umfpack_dl_free_numeric(args...);\n+70 }\n+71 template\n+_\b7_\b2 static void _\bf_\br_\be_\be_\b__\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc(A... args)\n+73 {\n+74 umfpack_dl_free_symbolic(args...);\n+75 }\n+76 template\n+_\b7_\b7 static int _\bl_\bo_\ba_\bd_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n 78 {\n-79#ifdef DUNE_ISTL_WITH_CHECKING\n-80 if (i>=n) DUNE_THROW(ISTLError,\"index out of range\");\n-81#endif\n-82 return p[i];\n-83 }\n-84\n-86 template\n-87 class RealIterator\n-88 : public RandomAccessIteratorFacade, T>\n-89 {\n-90 public:\n-92 typedef typename std::remove_const::type ValueType;\n-93\n-94 friend class RandomAccessIteratorFacade, const\n-ValueType>;\n-95 friend class RandomAccessIteratorFacade, ValueType>;\n-96 friend class RealIterator;\n-97 friend class RealIterator;\n-98\n-100 RealIterator ()\n-101 : p(0), i(0)\n-102 {}\n-103\n-104 RealIterator (const B* _p, B* _i) : p(_p), i(_i)\n-105 { }\n-106\n-107 RealIterator(const RealIterator& it)\n-108 : p(it.p), i(it.i)\n-109 {}\n-110\n-112 size_type index () const\n-113 {\n-114 return i-p;\n-115 }\n-116\n-118 bool equals (const RealIterator& other) const\n-119 {\n-120 assert(other.p==p);\n-121 return i==other.i;\n-122 }\n-123\n-125 bool equals (const RealIterator& other) const\n+79 return umfpack_dl_load_numeric(args...);\n+80 }\n+81 template\n+_\b8_\b2 static void _\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n+83 {\n+84 umfpack_dl_numeric(args...);\n+85 }\n+86 template\n+_\b8_\b7 static void _\br_\be_\bp_\bo_\br_\bt_\b__\bi_\bn_\bf_\bo(A... args)\n+88 {\n+89 umfpack_dl_report_info(args...);\n+90 }\n+91 template\n+_\b9_\b2 static void _\br_\be_\bp_\bo_\br_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs(A... args)\n+93 {\n+94 umfpack_dl_report_status(args...);\n+95 }\n+96 template\n+_\b9_\b7 static int _\bs_\ba_\bv_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n+98 {\n+99 return umfpack_dl_save_numeric(args...);\n+100 }\n+101 template\n+_\b1_\b0_\b2 static void _\bs_\bo_\bl_\bv_\be(A... args)\n+103 {\n+104 umfpack_dl_solve(args...);\n+105 }\n+106 template\n+_\b1_\b0_\b7 static void _\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc(A... args)\n+108 {\n+109 umfpack_dl_symbolic(args...);\n+110 }\n+111 };\n+112\n+113 template<>\n+_\b1_\b1_\b4 struct _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br<_\bs_\bt_\bd::complex >\n+115 {\n+_\b1_\b1_\b6 static constexpr bool _\bv_\ba_\bl_\bi_\bd = true ;\n+_\b1_\b1_\b7 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = SuiteSparse_long;\n+118\n+119 template\n+_\b1_\b2_\b0 static void _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs(A... args)\n+121 {\n+122 umfpack_zl_defaults(args...);\n+123 }\n+124 template\n+_\b1_\b2_\b5 static void _\bf_\br_\be_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n 126 {\n-127 assert(other.p==p);\n-128 return i==other.i;\n-129 }\n-130\n-131 std::ptrdiff_t distanceTo(const RealIterator& o) const\n-132 {\n-133 return o.i-i;\n-134 }\n-135\n-136 private:\n-138 void increment()\n-139 {\n-140 ++i;\n-141 }\n-142\n-144 void decrement()\n-145 {\n-146 --i;\n-147 }\n-148\n-149 // Needed for operator[] of the iterator\n-150 reference elementAt (std::ptrdiff_t offset) const\n+127 umfpack_zl_free_numeric(args...);\n+128 }\n+129 template\n+_\b1_\b3_\b0 static void _\bf_\br_\be_\be_\b__\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc(A... args)\n+131 {\n+132 umfpack_zl_free_symbolic(args...);\n+133 }\n+134 template\n+_\b1_\b3_\b5 static int _\bl_\bo_\ba_\bd_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n+136 {\n+137 return umfpack_zl_load_numeric(args...);\n+138 }\n+139 template\n+_\b1_\b4_\b0 static void _\bn_\bu_\bm_\be_\br_\bi_\bc(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* cs, const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* ri, const double*\n+val, A... args)\n+141 {\n+142 umfpack_zl_numeric(cs,ri,val,NULL,args...);\n+143 }\n+144 template\n+_\b1_\b4_\b5 static void _\br_\be_\bp_\bo_\br_\bt_\b__\bi_\bn_\bf_\bo(A... args)\n+146 {\n+147 umfpack_zl_report_info(args...);\n+148 }\n+149 template\n+_\b1_\b5_\b0 static void _\br_\be_\bp_\bo_\br_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs(A... args)\n 151 {\n-152 return *(i+offset);\n+152 umfpack_zl_report_status(args...);\n 153 }\n-154\n-156 reference dereference () const\n-157 {\n-158 return *i;\n-159 }\n-160\n-161 void advance(std::ptrdiff_t d)\n-162 {\n-163 i+=d;\n+154 template\n+_\b1_\b5_\b5 static int _\bs_\ba_\bv_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n+156 {\n+157 return umfpack_zl_save_numeric(args...);\n+158 }\n+159 template\n+_\b1_\b6_\b0 static void _\bs_\bo_\bl_\bv_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be m, const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* cs, const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* ri,\n+std::complex* val, double* x, const double* b,A... args)\n+161 {\n+162 const double* cval = reinterpret_cast(val);\n+163 umfpack_zl_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...);\n 164 }\n-165\n-166 const B* p;\n-167 B* i;\n-168 };\n-169\n-171 typedef RealIterator iterator;\n-172\n-173\n-175 iterator begin ()\n-176 {\n-177 return iterator(p,p);\n-178 }\n+165 template\n+_\b1_\b6_\b6 static void _\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n, const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* cs, const\n+_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* ri, const double* val, A... args)\n+167 {\n+168 umfpack_zl_symbolic(m,n,cs,ri,val,NULL,args...);\n+169 }\n+170 };\n+171\n+172 namespace Impl\n+173 {\n+174 template\n+175 struct UMFPackVectorChooser;\n+176\n+178 template using UMFPackDomainType = typename\n+UMFPackVectorChooser::domain_type;\n 179\n-181 iterator end ()\n-182 {\n-183 return iterator(p,p+n);\n-184 }\n-185\n-188 iterator beforeEnd ()\n-189 {\n-190 return iterator(p,p+n-1);\n-191 }\n-192\n-195 iterator beforeBegin ()\n-196 {\n-197 return iterator(p,p-1);\n-198 }\n-199\n-201 iterator find (size_type i)\n-202 {\n-203 return iterator(p,p+std::min(i,n));\n-204 }\n-205\n-207 typedef RealIterator const_iterator;\n-208\n-210 const_iterator begin () const\n-211 {\n-212 return const_iterator(p,p+0);\n-213 }\n-214\n-216 const_iterator end () const\n-217 {\n-218 return const_iterator(p,p+n);\n-219 }\n-220\n-223 const_iterator beforeEnd () const\n-224 {\n-225 return const_iterator(p,p+n-1);\n-226 }\n-227\n-230 const_iterator beforeBegin () const\n-231 {\n-232 return const_iterator(p,p-1);\n-233 }\n-234\n-236 const_iterator find (size_type i) const\n-237 {\n-238 return const_iterator(p,p+std::min(i,n));\n-239 }\n+181 template using UMFPackRangeType = typename\n+UMFPackVectorChooser::range_type;\n+182\n+183 template\n+184 struct UMFPackVectorChooser::value) || (std::is_same >::value)>>\n+186 {\n+187 using domain_type = M;\n+188 using range_type = M;\n+189 };\n+190\n+191 template\n+192 struct UMFPackVectorChooser,\n+193 _\bs_\bt_\bd::enable_if_t<(std::is_same::value) || (std::is_same >::value)>>\n+194 {\n+196 using domain_type = FieldVector;\n+198 using range_type = FieldVector;\n+199 };\n+200\n+201 template\n+202 struct UMFPackVectorChooser,\n+203 _\bs_\bt_\bd::void_t, UMFPackRangeType>>\n+204 {\n+205 // In case of recursive deduction (e.g., BCRSMatrix,\n+Allocator>>)\n+206 // the allocator needs to be converted to the sub-block allocator type too\n+(e.g., Allocator>).\n+207 // Note that matrix allocator is assumed to be the same as the domain/range\n+type of allocators\n+209 using domain_type = BlockVector, typename std::\n+allocator_traits::template rebind_alloc>>;\n+211 using range_type = BlockVector, typename std::\n+allocator_traits::template rebind_alloc>>;\n+212 };\n+213\n+214 // to make the `UMFPackVectorChooser` work with `MultiTypeBlockMatrix`, we\n+need to add an intermediate step for the rows, which are typically\n+`MultiTypeBlockVector`\n+215 template\n+216 struct UMFPackVectorChooser,\n+217 _\bs_\bt_\bd::void_t, UMFPackRangeType,\n+UMFPackDomainType...>>\n+218 {\n+220 using domain_type = MultiTypeBlockVector,\n+UMFPackDomainType...>;\n+222 using range_type = UMFPackRangeType;\n+223 };\n+224\n+225 // specialization for `MultiTypeBlockMatrix` with `MultiTypeBlockVector`\n+rows\n+226 template\n+227 struct UMFPackVectorChooser,\n+228 _\bs_\bt_\bd::void_t, UMFPackRangeType,\n+UMFPackRangeType...>>\n+229 {\n+231 using domain_type = UMFPackDomainType;\n+233 using range_type = MultiTypeBlockVector< UMFPackRangeType,\n+UMFPackRangeType... >;\n+234 };\n+235\n+236 // dummy class to represent no BitVector\n+237 struct NoBitVector\n+238 {};\n+239\n 240\n-241\n-242 //===== sizes\n-243\n-245 size_type size () const\n-246 {\n-247 return n;\n-248 }\n-249\n-251 const B* data() const\n-252 {\n-253 return p;\n-254 }\n-255\n-257 B* data()\n+241 }\n+242\n+256 template\n+_\b2_\b5_\b7 class _\bU_\bM_\bF_\bP_\ba_\bc_\bk : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br,Impl::\n+UMFPackRangeType>\n 258 {\n-259 return p;\n-260 }\n-261\n-262 protected:\n-264 base_array_unmanaged ()\n-265 : n(0), p(0)\n-266 {}\n-268 base_array_unmanaged (size_type n_, B* p_)\n-269 : n(n_), p(p_)\n-270 {}\n-271 size_type n; // number of elements in array\n-272 B *p; // pointer to dynamically allocated built-in array\n-273 };\n-274\n+259 using T = typename M::field_type;\n+260\n+261 public:\n+_\b2_\b6_\b2 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = SuiteSparse_long;\n+263\n+_\b2_\b6_\b5 using _\bM_\ba_\bt_\br_\bi_\bx = M;\n+_\b2_\b6_\b6 using _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be = M;\n+_\b2_\b6_\b8 using _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx = ISTL::Impl::BCCSMatrix;\n+_\b2_\b7_\b0 using _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br = ISTL::Impl::BCCSMatrixInitializer;\n+_\b2_\b7_\b2 using _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be = Impl::UMFPackDomainType;\n+_\b2_\b7_\b4 using _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be = Impl::UMFPackRangeType;\n 275\n-276\n-298 template\n-299 class compressed_base_array_unmanaged\n-300 {\n-301 public:\n-302\n-303 //===== type definitions and constants\n-304\n-306 typedef B member_type;\n-307\n-309 typedef ST size_type;\n-310\n-312 using reference = B&;\n-313\n-315 using const_reference = const B&;\n-316\n-317 //===== access to components\n-318\n-320 reference operator[] (size_type i)\n-321 {\n-322 const size_type* lb = std::lower_bound(j, j+n, i);\n-323 if (lb == j+n || *lb != i)\n-324 DUNE_THROW(ISTLError,\"index \"<\n-339 class RealIterator\n-340 : public BidirectionalIteratorFacade, T>\n-341 {\n-342 public:\n-344 typedef typename std::remove_const::type ValueType;\n-345\n-346 friend class BidirectionalIteratorFacade,\n-const ValueType>;\n-347 friend class BidirectionalIteratorFacade,\n-ValueType>;\n-348 friend class RealIterator;\n-349 friend class RealIterator;\n-350\n-352 RealIterator ()\n-353 : p(0), j(0), i(0)\n-354 {}\n-355\n-357 RealIterator (B* _p, size_type* _j, size_type _i)\n-358 : p(_p), j(_j), i(_i)\n-359 { }\n-360\n-364 RealIterator(const RealIterator& it)\n-365 : p(it.p), j(it.j), i(it.i)\n-366 {}\n-367\n-368\n-370 bool equals (const RealIterator& it) const\n-371 {\n-372 assert(p==it.p);\n-373 return (i)==(it.i);\n-374 }\n-375\n-377 bool equals (const RealIterator& it) const\n-378 {\n-379 assert(p==it.p);\n-380 return (i)==(it.i);\n-381 }\n-382\n-383\n-385 size_type index () const\n-386 {\n-387 return j[i];\n-388 }\n-389\n-391 void setindex (size_type k)\n-392 {\n-393 return j[i] = k;\n-394 }\n-395\n-403 size_type offset () const\n+_\b2_\b7_\b7 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+278 {\n+279 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+280 }\n+281\n+_\b2_\b9_\b0 _\bU_\bM_\bF_\bP_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose=0) : matrixIsLoaded_(false)\n+291 {\n+292 //check whether T is a supported type\n+293 static_assert((std::is_same::value) || (std::is_same >::value),\n+294 \"Unsupported Type in UMFPack (only double and std::complex\n+supported)\");\n+295 Caller::defaults(UMF_Control);\n+296 _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(verbose);\n+297 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(matrix);\n+298 }\n+299\n+_\b3_\b0_\b8 _\bU_\bM_\bF_\bP_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose, bool) : matrixIsLoaded_(false)\n+309 {\n+310 //check whether T is a supported type\n+311 static_assert((std::is_same::value) || (std::is_same >::value),\n+312 \"Unsupported Type in UMFPack (only double and std::complex\n+supported)\");\n+313 Caller::defaults(UMF_Control);\n+314 _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(verbose);\n+315 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(matrix);\n+316 }\n+317\n+_\b3_\b2_\b7 _\bU_\bM_\bF_\bP_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& mat_, const ParameterTree& config)\n+328 : _\bU_\bM_\bF_\bP_\ba_\bc_\bk(mat_, config._\bg_\be_\bt(\"verbose\", 0))\n+329 {}\n+330\n+_\b3_\b3_\b3 _\bU_\bM_\bF_\bP_\ba_\bc_\bk() : matrixIsLoaded_(false), verbosity_(0)\n+334 {\n+335 //check whether T is a supported type\n+336 static_assert((std::is_same::value) || (std::is_same >::value),\n+337 \"Unsupported Type in UMFPack (only double and std::complex\n+supported)\");\n+338 Caller::defaults(UMF_Control);\n+339 }\n+340\n+_\b3_\b5_\b1 _\bU_\bM_\bF_\bP_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& mat_, const char* file, int verbose=0)\n+352 {\n+353 //check whether T is a supported type\n+354 static_assert((std::is_same::value) || (std::is_same >::value),\n+355 \"Unsupported Type in UMFPack (only double and std::complex\n+supported)\");\n+356 Caller::defaults(UMF_Control);\n+357 _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(verbose);\n+358 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast(file));\n+359 if ((errcode == UMFPACK_ERROR_out_of_memory) || (errcode ==\n+UMFPACK_ERROR_file_IO))\n+360 {\n+361 matrixIsLoaded_ = false;\n+362 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(mat_);\n+363 _\bs_\ba_\bv_\be_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(file);\n+364 }\n+365 else\n+366 {\n+367 matrixIsLoaded_ = true;\n+368 std::cout << \"UMFPack decomposition successfully loaded from \" << file <<\n+std::endl;\n+369 }\n+370 }\n+371\n+_\b3_\b7_\b8 _\bU_\bM_\bF_\bP_\ba_\bc_\bk(const char* file, int verbose=0)\n+379 {\n+380 //check whether T is a supported type\n+381 static_assert((std::is_same::value) || (std::is_same >::value),\n+382 \"Unsupported Type in UMFPack (only double and std::complex\n+supported)\");\n+383 Caller::defaults(UMF_Control);\n+384 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast(file));\n+385 if (errcode == UMFPACK_ERROR_out_of_memory)\n+386 DUNE_THROW(Dune::Exception, \"ran out of memory while loading UMFPack\n+decomposition\");\n+387 if (errcode == UMFPACK_ERROR_file_IO)\n+388 DUNE_THROW(Dune::Exception, \"IO error while loading UMFPack\n+decomposition\");\n+389 matrixIsLoaded_ = true;\n+390 std::cout << \"UMFPack decomposition successfully loaded from \" << file <<\n+std::endl;\n+391 _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(verbose);\n+392 }\n+393\n+_\b3_\b9_\b4 virtual _\b~_\bU_\bM_\bF_\bP_\ba_\bc_\bk()\n+395 {\n+396 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)\n+397 _\bf_\br_\be_\be();\n+398 }\n+399\n+_\b4_\b0_\b3 virtual void _\ba_\bp_\bp_\bl_\by(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt&\n+res)\n 404 {\n-405 return i;\n-406 }\n-407\n-408 private:\n-410 void increment()\n-411 {\n-412 ++i;\n-413 }\n-414\n-416 void decrement()\n+405 if (umfpackMatrix_.N() != b.dim())\n+406 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Size of right-hand-side vector b does not\n+match the number of matrix rows!\");\n+407 if (umfpackMatrix_.M() != x.dim())\n+408 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Size of solution vector x does not match the\n+number of matrix columns!\");\n+409 if (b.size() == 0)\n+410 return;\n+411\n+412 // we have to convert x and b into flat structures\n+413 // however, this is linear in time\n+414 std::vector xFlat(x.dim()), bFlat(b.dim());\n+415\n+416 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(x, [&](auto&& entry, auto&& offset)\n 417 {\n-418 --i;\n-419 }\n+418 xFlat[ offset ] = entry;\n+419 });\n 420\n-422 reference dereference () const\n-423 {\n-424 return p[i];\n-425 }\n-426\n-427 B* p;\n-428 size_type* j;\n-429 size_type i;\n-430 };\n-431\n-433 typedef RealIterator iterator;\n-434\n-436 iterator begin ()\n-437 {\n-438 return iterator(p,j,0);\n-439 }\n-440\n-442 iterator end ()\n-443 {\n-444 return iterator(p,j,n);\n-445 }\n-446\n-449 iterator beforeEnd ()\n-450 {\n-451 return iterator(p,j,n-1);\n-452 }\n-453\n-456 iterator beforeBegin ()\n-457 {\n-458 return iterator(p,j,-1);\n-459 }\n-460\n-462 iterator find (size_type i)\n-463 {\n-464 const size_type* lb = std::lower_bound(j, j+n, i);\n-465 return (lb != j+n && *lb == i)\n-466 ? iterator(p,j,lb-j)\n-467 : end();\n-468 }\n-469\n-471 typedef RealIterator const_iterator;\n-472\n-474 const_iterator begin () const\n-475 {\n-476 return const_iterator(p,j,0);\n-477 }\n-478\n-480 const_iterator end () const\n-481 {\n-482 return const_iterator(p,j,n);\n-483 }\n-484\n-487 const_iterator beforeEnd () const\n-488 {\n-489 return const_iterator(p,j,n-1);\n-490 }\n-491\n-494 const_iterator beforeBegin () const\n-495 {\n-496 return const_iterator(p,j,-1);\n-497 }\n-498\n-500 const_iterator find (size_type i) const\n-501 {\n-502 const size_type* lb = std::lower_bound(j, j+n, i);\n-503 return (lb != j+n && *lb == i)\n-504 ? const_iterator(p,j,lb-j)\n-505 : end();\n-506 }\n-507\n-508 //===== sizes\n+421 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(b, [&](auto&& entry, auto&& offset)\n+422 {\n+423 bFlat[ offset ] = entry;\n+424 });\n+425\n+426 double UMF_Apply_Info[UMFPACK_INFO];\n+427 Caller::solve(UMFPACK_A,\n+428 umfpackMatrix_.getColStart(),\n+429 umfpackMatrix_.getRowIndex(),\n+430 umfpackMatrix_.getValues(),\n+431 reinterpret_cast(&xFlat[0]),\n+432 reinterpret_cast(&bFlat[0]),\n+433 UMF_Numeric,\n+434 UMF_Control,\n+435 UMF_Apply_Info);\n+436\n+437 // copy back to blocked vector\n+438 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(x, [&](auto&& entry, auto offset)\n+439 {\n+440 entry = xFlat[offset];\n+441 });\n+442\n+443 //this is a direct solver\n+444 res._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 1;\n+445 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = true;\n+446 res._\be_\bl_\ba_\bp_\bs_\be_\bd = UMF_Apply_Info[UMFPACK_SOLVE_WALLTIME];\n+447\n+448 printOnApply(UMF_Apply_Info);\n+449 }\n+450\n+_\b4_\b5_\b4 virtual void _\ba_\bp_\bp_\bl_\by (_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, [[maybe_unused]] double\n+reduction, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+455 {\n+456 _\ba_\bp_\bp_\bl_\by(x,b,res);\n+457 }\n+458\n+_\b4_\b6_\b6 void _\ba_\bp_\bp_\bl_\by(T* x, T* b)\n+467 {\n+468 double UMF_Apply_Info[UMFPACK_INFO];\n+469 Caller::solve(UMFPACK_A,\n+470 umfpackMatrix_.getColStart(),\n+471 umfpackMatrix_.getRowIndex(),\n+472 umfpackMatrix_.getValues(),\n+473 x,\n+474 b,\n+475 UMF_Numeric,\n+476 UMF_Control,\n+477 UMF_Apply_Info);\n+478 printOnApply(UMF_Apply_Info);\n+479 }\n+480\n+_\b4_\b9_\b2 void _\bs_\be_\bt_\bO_\bp_\bt_\bi_\bo_\bn(unsigned int option, double value)\n+493 {\n+494 if (option >= UMFPACK_CONTROL)\n+495 DUNE_THROW(RangeError, \"Requested non-existing UMFPack option\");\n+496\n+497 UMF_Control[option] = value;\n+498 }\n+499\n+_\b5_\b0_\b3 void _\bs_\ba_\bv_\be_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(const char* file)\n+504 {\n+505 int errcode = Caller::save_numeric(UMF_Numeric, const_cast(file));\n+506 if (errcode != UMFPACK_OK)\n+507 DUNE_THROW(Dune::Exception,\"IO ERROR while trying to save UMFPack\n+decomposition\");\n+508 }\n 509\n-511 size_type size () const\n-512 {\n-513 return n;\n-514 }\n-515\n-516 protected:\n-518 compressed_base_array_unmanaged ()\n-519 : n(0), p(0), j(0)\n-520 {}\n-521\n-522 size_type n; // number of elements in array\n-523 B *p; // pointer to dynamically allocated built-in array\n-524 size_type* j; // the index set\n-525 };\n+519 template\n+_\b5_\b2_\b0 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const BitVector& bitVector = {})\n+521 {\n+522 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)\n+523 _\bf_\br_\be_\be();\n+524 if (matrix.N() == 0 or matrix.M() == 0)\n+525 return;\n 526\n-527} // end namespace Imp\n-528\n-529} // end namespace\n-530\n-531#endif\n-_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+527 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() !=\n+0)\n+528 umfpackMatrix_.free();\n+529\n+530 constexpr bool useBitVector = not std::is_same_v;\n+531\n+532 // use a dynamic flat vector for the bitset\n+533 std::vector flatBitVector;\n+534 // and a mapping from the compressed indices\n+535 std::vector subIndices;\n+536\n+537 int numberOfIgnoredDofs = 0;\n+538 int nonZeros = 0;\n+539\n+540 if constexpr ( useBitVector )\n+541 {\n+542 auto flatSize = _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(bitVector, [](auto&&, auto&&){});\n+543 flatBitVector.resize(flatSize);\n+544\n+545 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(bitVector, [&](auto&& entry, auto&& offset)\n+546 {\n+547 flatBitVector[ offset ] = entry;\n+548 if ( entry )\n+549 {\n+550 numberOfIgnoredDofs++;\n+551 }\n+552 });\n+553 }\n+554\n+555 // compute the flat dimension and the number of nonzeros of the matrix\n+556 auto [flatRows,flatCols] = _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh( matrix, [&](auto&& /*entry*/,\n+auto&& row, auto&& _\bc_\bo_\bl){\n+557 // do not count ignored entries\n+558 if constexpr ( useBitVector )\n+559 if ( flatBitVector[row] or flatBitVector[_\bc_\bo_\bl] )\n+560 return;\n+561\n+562 nonZeros++;\n+563 });\n+564\n+565 if constexpr ( useBitVector )\n+566 {\n+567 // use the original flatRows!\n+568 subIndices.resize(flatRows,std::numeric_limits::max());\n+569\n+570 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be subIndexCounter = 0;\n+571 for ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be(flatRows); i++ )\n+572 if ( not flatBitVector[ i ] )\n+573 subIndices[ i ] = subIndexCounter++;\n+574\n+575 // update the original matrix size\n+576 flatRows -= numberOfIgnoredDofs;\n+577 flatCols -= numberOfIgnoredDofs;\n+578 }\n+579\n+580\n+581 umfpackMatrix_.setSize(flatRows,flatCols);\n+582 umfpackMatrix_.Nnz_ = nonZeros;\n+583\n+584 // prepare the arrays\n+585 umfpackMatrix_.colstart = new _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be[flatCols+1];\n+586 umfpackMatrix_.rowindex = new _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be[nonZeros];\n+587 umfpackMatrix_.values = new T[nonZeros];\n+588\n+589 for ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be(flatCols+1); i++ )\n+590 {\n+591 umfpackMatrix_.colstart[i] = 0;\n+592 }\n+593\n+594 // at first, we need to compute the column start indices\n+595 // therefore, we count all entries in each column and in the end we\n+accumulate everything\n+596 _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&&\n+flatColIndex)\n+597 {\n+598 // do nothing if entry is excluded\n+599 if constexpr ( useBitVector )\n+600 if ( flatBitVector[flatRowIndex] or flatBitVector[flatColIndex] )\n+601 return;\n+602\n+603 // pick compressed or uncompressed index\n+604 // compiler will hopefully do some constexpr optimization here\n+605 auto colIdx = useBitVector ? subIndices[flatColIndex] : flatColIndex;\n+606\n+607 umfpackMatrix_.colstart[colIdx+1]++;\n+608 });\n+609\n+610 // now accumulate\n+611 for ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be)flatCols; i++ )\n+612 {\n+613 umfpackMatrix_.colstart[i+1] += umfpackMatrix_.colstart[i];\n+614 }\n+615\n+616 // we need a compressed position counter in each column\n+617 std::vector colPosition(flatCols,0);\n+618\n+619 // now we can set the entries: the procedure below works with both row- or\n+column major index ordering\n+620 _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&&\n+flatColIndex)\n+621 {\n+622 // do nothing if entry is excluded\n+623 if constexpr ( useBitVector )\n+624 if ( flatBitVector[flatRowIndex] or flatBitVector[flatColIndex] )\n+625 return;\n+626\n+627 // pick compressed or uncompressed index\n+628 // compiler will hopefully do some constexpr optimization here\n+629 auto rowIdx = useBitVector ? subIndices[flatRowIndex] : flatRowIndex;\n+630 auto colIdx = useBitVector ? subIndices[flatColIndex] : flatColIndex;\n+631\n+632 // the start index of each column is already fixed\n+633 auto colStart = umfpackMatrix_.colstart[colIdx];\n+634 // get the current number of picked elements in this column\n+635 auto colPos = colPosition[colIdx];\n+636 // assign the corresponding row index and the value of this element\n+637 umfpackMatrix_.rowindex[ colStart + colPos ] = rowIdx;\n+638 umfpackMatrix_.values[ colStart + colPos ] = entry;\n+639 // increase the number of picked elements in this column\n+640 colPosition[colIdx]++;\n+641 });\n+642\n+643 decompose();\n+644 }\n+645\n+646 // Keep legacy version using a set of scalar indices\n+647 // The new version using a bitVector type for marking the active matrix\n+indices is\n+648 // directly given in `setMatrix` with an additional BitVector argument.\n+649 // The new version is more flexible and allows, e.g., marking single\n+components of a matrix block.\n+650 template\n+_\b6_\b5_\b1 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& _mat, const S& rowIndexSet)\n+652 {\n+653 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)\n+654 _\bf_\br_\be_\be();\n+655\n+656 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() !=\n+0)\n+657 umfpackMatrix_.free();\n+658\n+659 umfpackMatrix_.setSize(rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+(_mat) / _mat.N(),\n+660 rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(_mat) / _mat.M());\n+661 ISTL::Impl::BCCSMatrixInitializer initializer\n+(umfpackMatrix_);\n+662\n+663 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_\bM_\ba_\bt_\br_\bi_\bx,std::\n+set >(_mat,rowIndexSet));\n+664\n+665 decompose();\n+666 }\n+667\n+_\b6_\b7_\b5 void _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(int v)\n+676 {\n+677 verbosity_ = v;\n+678 // set the verbosity level in UMFPack\n+679 if (verbosity_ == 0)\n+680 UMF_Control[UMFPACK_PRL] = 1;\n+681 if (verbosity_ == 1)\n+682 UMF_Control[UMFPACK_PRL] = 2;\n+683 if (verbosity_ == 2)\n+684 UMF_Control[UMFPACK_PRL] = 4;\n+685 }\n+686\n+_\b6_\b9_\b1 void* _\bg_\be_\bt_\bF_\ba_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn()\n+692 {\n+693 return UMF_Numeric;\n+694 }\n+695\n+_\b7_\b0_\b0 _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& _\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx()\n+701 {\n+702 return umfpackMatrix_;\n+703 }\n+704\n+_\b7_\b0_\b9 void _\bf_\br_\be_\be()\n+710 {\n+711 if (!matrixIsLoaded_)\n+712 {\n+713 Caller::free_symbolic(&UMF_Symbolic);\n+714 umfpackMatrix_.free();\n+715 }\n+716 Caller::free_numeric(&UMF_Numeric);\n+717 matrixIsLoaded_ = false;\n+718 }\n+719\n+_\b7_\b2_\b0 const char* _\bn_\ba_\bm_\be() { return \"UMFPACK\"; }\n+721\n+722 private:\n+723 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b> Caller;\n+724\n+725 template\n+_\b7_\b2_\b6 friend class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n+727 friend struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bU_\bM_\bF_\bP_\ba_\bc_\bk<_\bM_\ba_\bt_\br_\bi_\bx>,true>;\n+728\n+730 void decompose()\n+731 {\n+732 double UMF_Decomposition_Info[UMFPACK_INFO];\n+733 Caller::symbolic(static_cast(umfpackMatrix_.N()),\n+734 static_cast(umfpackMatrix_.N()),\n+735 umfpackMatrix_.getColStart(),\n+736 umfpackMatrix_.getRowIndex(),\n+737 reinterpret_cast(umfpackMatrix_.getValues()),\n+738 &UMF_Symbolic,\n+739 UMF_Control,\n+740 UMF_Decomposition_Info);\n+741 Caller::numeric(umfpackMatrix_.getColStart(),\n+742 umfpackMatrix_.getRowIndex(),\n+743 reinterpret_cast(umfpackMatrix_.getValues()),\n+744 UMF_Symbolic,\n+745 &UMF_Numeric,\n+746 UMF_Control,\n+747 UMF_Decomposition_Info);\n+748 Caller::report_status(UMF_Control,UMF_Decomposition_Info[UMFPACK_STATUS]);\n+749 if (verbosity_ == 1)\n+750 {\n+751 std::cout << \"[UMFPack Decomposition]\" << std::endl;\n+752 std::cout << \"Wallclock Time taken: \" << UMF_Decomposition_Info\n+[UMFPACK_NUMERIC_WALLTIME] << \" (CPU Time: \" << UMF_Decomposition_Info\n+[UMFPACK_NUMERIC_TIME] << \")\" << std::endl;\n+753 std::cout << \"Flops taken: \" << UMF_Decomposition_Info[UMFPACK_FLOPS] <<\n+std::endl;\n+754 std::cout << \"Peak Memory Usage: \" << UMF_Decomposition_Info\n+[UMFPACK_PEAK_MEMORY]*UMF_Decomposition_Info[UMFPACK_SIZE_OF_UNIT] << \" bytes\"\n+<< std::endl;\n+755 std::cout << \"Condition number estimate: \" << 1./UMF_Decomposition_Info\n+[UMFPACK_RCOND] << std::endl;\n+756 std::cout << \"Numbers of non-zeroes in decomposition: L: \" <<\n+UMF_Decomposition_Info[UMFPACK_LNZ] << \" U: \" << UMF_Decomposition_Info\n+[UMFPACK_UNZ] << std::endl;\n+757 }\n+758 if (verbosity_ == 2)\n+759 {\n+760 Caller::report_info(UMF_Control,UMF_Decomposition_Info);\n+761 }\n+762 }\n+763\n+764 void printOnApply(double* UMF_Info)\n+765 {\n+766 Caller::report_status(UMF_Control,UMF_Info[UMFPACK_STATUS]);\n+767 if (verbosity_ > 0)\n+768 {\n+769 std::cout << \"[UMFPack Solve]\" << std::endl;\n+770 std::cout << \"Wallclock Time: \" << UMF_Info[UMFPACK_SOLVE_WALLTIME] << \"\n+(CPU Time: \" << UMF_Info[UMFPACK_SOLVE_TIME] << \")\" << std::endl;\n+771 std::cout << \"Flops Taken: \" << UMF_Info[UMFPACK_SOLVE_FLOPS] << std::endl;\n+772 std::cout << \"Iterative Refinement steps taken: \" << UMF_Info\n+[UMFPACK_IR_TAKEN] << std::endl;\n+773 std::cout << \"Error Estimate: \" << UMF_Info[UMFPACK_OMEGA1] << \" resp. \" <<\n+UMF_Info[UMFPACK_OMEGA2] << std::endl;\n+774 }\n+775 }\n+776\n+777 _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx umfpackMatrix_;\n+778 bool matrixIsLoaded_;\n+779 int verbosity_;\n+780 void *UMF_Symbolic;\n+781 void *UMF_Numeric;\n+782 double UMF_Control[UMFPACK_CONTROL];\n+783 };\n+784\n+785 template\n+_\b7_\b8_\b6 struct _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br<_\bU_\bM_\bF_\bP_\ba_\bc_\bk<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A> > >\n+787 {\n+_\b7_\b8_\b8 enum { _\bv_\ba_\bl_\bu_\be=true};\n+789 };\n+790\n+791 template\n+_\b7_\b9_\b2 struct _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd<_\bU_\bM_\bF_\bP_\ba_\bc_\bk<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx > >\n+793 {\n+_\b7_\b9_\b4 enum { _\bv_\ba_\bl_\bu_\be = true };\n+795 };\n+796\n+_\b7_\b9_\b7 struct _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br {\n+798\n+_\b7_\b9_\b9 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::\n+false_type{};\n+800 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk, typename Dune::\n+TypeListElement<1,TL>::type>\n+803 && std::is_same_v, typename Dune::\n+TypeListElement<2,TL>::type>\n+804 >> : std::true_type {};\n+805\n+806 template\n+807 std::shared_ptr,Impl::\n+UMFPackRangeType>>\n+_\b8_\b0_\b8 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& _\bm_\ba_\bt, const Dune::ParameterTree& config,\n+809 std::enable_if_t<_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\bT_\bL_\b,_\b _\bM_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be,int> = 0) const\n+810 {\n+811 int verbose = config.get(\"verbose\", 0);\n+812 return std::make_shared>(_\bm_\ba_\bt,verbose);\n+813 }\n+814\n+815 // second version with SFINAE to validate the template parameters of\n+UMFPack\n+816 template\n+817 std::shared_ptr::type,\n+818 typename Dune::TypeListElement<2, TL>::type>>\n+_\b8_\b1_\b9 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /\n+*config*/,\n+820 std::enable_if_t_\b:_\b:_\bv_\ba_\bl_\bu_\be,int> = 0) const\n+821 {\n+822 using D = typename Dune::TypeListElement<1,TL>::type;\n+823 using R = typename Dune::TypeListElement<2,TL>::type;\n+824 using DU = Std::detected_t< Impl::UMFPackDomainType, M>;\n+825 using RU = Std::detected_t< Impl::UMFPackRangeType, M>;\n+826 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be,\n+827 \"Unsupported Types in UMFPack:\\n\"\n+828 \"Matrix: \" << className() << \"\"\n+829 \"Domain provided: \" << className() << \"\\n\"\n+830 \"Domain required: \" << className() << \"\\n\"\n+831 \"Range provided: \" << className() << \"\\n\"\n+832 \"Range required: \" << className() << \"\\n\"\n+833 );\n+834 }\n+835 };\n+_\b8_\b3_\b6 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"umfpack\",_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br());\n+837} // end namespace Dune\n+838\n+839#endif // HAVE_SUITESPARSE_UMFPACK\n+840\n+841#endif //DUNE_ISTL_UMFPACK_HH\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n+_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n+Implementations of the inverse operator interface.\n+_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n+Templates characterizing the type of a solver.\n+_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR\n+#define DUNE_REGISTER_DIRECT_SOLVER(name,...)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:13\n+_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bf_\br_\be_\be\n+void free()\n+free allocated space.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:709\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+std::shared_ptr< Dune::InverseOperator< Impl::UMFPackDomainType< M >, Impl::\n+UMFPackRangeType< M > > > operator()(TL, const M &mat, const Dune::\n+ParameterTree &config, std::enable_if_t< isValidBlock< TL, M >::value, int >=0)\n+const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:808\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)\n+Apply inverse operator,.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:403\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+SuiteSparse_long size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:262\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc\n+static void symbolic(size_type m, size_type n, const size_type *cs, const\n+size_type *ri, const double *val, A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:166\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be\n+static void solve(size_type m, const size_type *cs, const size_type *ri, std::\n+complex< double > *val, double *x, const double *b, A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:160\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the solver (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:277\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:266\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bn_\bu_\bm_\be_\br_\bi_\bc\n+static void numeric(const size_type *cs, const size_type *ri, const double\n+*val, A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:140\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\bp_\bo_\br_\bt_\b__\bi_\bn_\bf_\bo\n+static void report_info(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:145\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n+UMFPack(const Matrix &mat_, const ParameterTree &config)\n+Construct a solver object from a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:327\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bl_\bo_\ba_\bd_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n+static int load_numeric(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:135\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bl_\bo_\ba_\bd_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n+static int load_numeric(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\br_\be_\bp_\bo_\br_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs\n+static void report_status(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:92\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n+UMFPack(const Matrix &mat_, const char *file, int verbose=0)\n+Try loading a decomposition from file and do a decomposition if unsuccessful.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:351\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Impl::UMFPackRangeType< M > range_type\n+The type of the range of the solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:274\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n+UMFPack()\n+default constructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:333\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc\n+static void symbolic(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\br_\be_\bp_\bo_\br_\bt_\b__\bi_\bn_\bf_\bo\n+static void report_info(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bf_\br_\be_\be_\b__\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc\n+static void free_symbolic(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bs_\ba_\bv_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n+static int save_numeric(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bf_\br_\be_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n+static void free_numeric(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n+void setSubMatrix(const Matrix &_mat, const S &rowIndexSet)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:651\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bs_\ba_\bv_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n+static int save_numeric(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:97\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\bp_\bo_\br_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs\n+static void report_status(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+Impl::UMFPackDomainType< M > domain_type\n+The type of the domain of the solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:272\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(T *x, T *b)\n+additional apply method with c-arrays in analogy to superlu\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs\n+static void defaults(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bf_\br_\be_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n+static void free_numeric(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by\n+void setVerbosity(int v)\n+sets the verbosity level for the UMFPack solver\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:675\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n+UMFPack(const char *file, int verbose=0)\n+try loading a decomposition from file\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:378\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bn_\bu_\bm_\be_\br_\bi_\bc\n+static void numeric(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b:_\b:_\bv_\ba_\bl_\bi_\bd\n+static constexpr bool valid\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\b~_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n+virtual ~UMFPack()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:394\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bn_\ba_\bm_\be\n+const char * name()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:720\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+void setMatrix(const Matrix &matrix, const BitVector &bitVector={})\n+Initialize data from given matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:520\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\ba_\bv_\be_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+void saveDecomposition(const char *file)\n+saves a decomposition to a file\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:503\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n+UMFPackMatrix & getInternalMatrix()\n+Return the column compress matrix from UMFPack.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:700\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+SuiteSparse_long size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n+UMFPack(const Matrix &matrix, int verbose=0)\n+Construct a solver object from a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:290\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+ISTL::Impl::BCCSMatrixInitializer< M, size_type > MatrixInitializer\n+Type of an associated initializer class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:270\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(domain_type &x, range_type &b, double reduction,\n+InverseOperatorResult &res)\n+apply inverse operator, with given convergence criteria.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:454\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx\n+ISTL::Impl::BCCSMatrix< typename Matrix::field_type, size_type > UMFPackMatrix\n+The corresponding (scalar) UMFPack matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:268\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\be_\bt_\bO_\bp_\bt_\bi_\bo_\bn\n+void setOption(unsigned int option, double value)\n+Set UMFPack-specific options.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:492\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bf_\br_\be_\be_\b__\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc\n+static void free_symbolic(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:130\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+M Matrix\n+The matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:265\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs\n+static void defaults(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be\n+static void solve(A... args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:102\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n+UMFPack(const Matrix &matrix, int verbose, bool)\n+Constructor for compatibility with SuperLU standard constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:308\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bg_\be_\bt_\bF_\ba_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn\n+void * getFactorization()\n+Return the matrix factorization.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:691\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh\n+std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f,\n+std::size_t rowOffset=0, std::size_t colOffset=0)\n+Traverse a blocked matrix and call a functor at each scalar entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh\n+std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0)\n+Traverse a blocked vector and call a functor at each scalar entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+derive error class from the base class in common\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n+Sequential overlapping Schwarz preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\be_\bl_\ba_\bp_\bs_\be_\bd\n+double elapsed\n+Elapsed time in seconds.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+int iterations\n+Number of iterations.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n+bool converged\n+True if convergence criterion has been met.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Abstract base class for all solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+@ value\n+Whether this is a direct solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+@ value\n+whether the solver internally uses column compressed storage\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n+The UMFPack direct sparse solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:258\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:797\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:799\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00029.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00029.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: preconditioners.hh File Reference\n+dune-istl: repartition.hh File Reference\n \n \n \n \n \n \n \n@@ -74,102 +74,98 @@\n
    \n
    \n \n- \n+
    repartition.hh File Reference
    \n
    \n
    \n \n-

    Define general preconditioner interface. \n+

    Functionality for redistributing a parallel index set using graph partitioning. \n More...

    \n-
    #include <cmath>
    \n-#include <complex>
    \n-#include <iostream>
    \n-#include <iomanip>
    \n-#include <memory>
    \n-#include <string>
    \n-#include <dune/common/simd/simd.hh>
    \n-#include <dune/common/parametertree.hh>
    \n-#include <dune/istl/solverregistry.hh>
    \n-#include "preconditioner.hh"
    \n-#include "solver.hh"
    \n-#include "solvercategory.hh"
    \n-#include "istlexception.hh"
    \n-#include "matrixutils.hh"
    \n-#include "gsetc.hh"
    \n-#include "dilu.hh"
    \n-#include "ildl.hh"
    \n-#include "ilu.hh"
    \n+
    #include <cassert>
    \n+#include <map>
    \n+#include <utility>
    \n+#include <cmath>
    \n+#include <dune/common/timer.hh>
    \n+#include <dune/common/enumset.hh>
    \n+#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/parallel/mpitraits.hh>
    \n+#include <dune/common/parallel/communicator.hh>
    \n+#include <dune/common/parallel/indexset.hh>
    \n+#include <dune/common/parallel/indicessyncer.hh>
    \n+#include <dune/common/parallel/remoteindices.hh>
    \n+#include <dune/common/rangeutilities.hh>
    \n+#include <dune/istl/owneroverlapcopy.hh>
    \n+#include <dune/istl/paamg/graph.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n

    \n 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::SeqSOR< M, X, Y, l >
     Sequential SOR preconditioner. More...
     
    class  Dune::SeqJac< M, X, Y, l >
     The sequential jacobian preconditioner. More...
     
    class  Dune::SeqDILU< M, X, Y, l >
     Sequential DILU preconditioner. More...
     
    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...
    struct  Dune::RedistributeInterface
     
    \n \n \n \n+\n+\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Metis
     
    \n \n-\n-\n-\n-\n+\n+\n+\n+\n

    \n Typedefs

    template<class M , class X , class Y , int l = 1>
    using Dune::SeqGS = SeqSOR< M, X, Y, l >
     Sequential Gauss Seidel preconditioner.
     
    using Dune::Metis::real_t = float
     
    using Dune::Metis::idx_t = std::size_t
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n 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 ("dilu", defaultPreconditionerBlockLevelCreator< Dune::SeqDILU >())
     
     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<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.
     
    \n

    Detailed Description

    \n-

    Define general preconditioner interface.

    \n-

    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.

    \n-
    \n+

    Functionality for redistributing a parallel index set using graph partitioning.

    \n+

    Refactored version of an intern.

    Author
    Markus Blatt
    \n+

    Variable Documentation

    \n+\n+

    ◆ globalOwnerVertices

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

    & outcomm,\n+1871 R& redistInf,\n+1872 bool v=false)\n+1873 {\n+1874 if(nparts!=oocomm.size())\n+1875 DUNE_THROW(NotImplemented, \"only available for MPI programs\");\n+1876 }\n+1877\n+1878\n+1879 template\n+1880 bool _\bc_\bo_\bm_\bm_\bG_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn(const G& graph, P& oocomm, int nparts,\n+1881 std::shared_ptr

    & outcomm,\n+1882 R& redistInf,\n+1883 bool v=false)\n+1884 {\n+1885 if(nparts!=oocomm.size())\n+1886 DUNE_THROW(NotImplemented, \"only available for MPI programs\");\n+1887 }\n+1888#endif // HAVE_MPI\n+1889} // end of namespace Dune\n+1890#endif\n+_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n+Classes providing communication interfaces for overlapping Schwarz methods.\n+_\bg_\bl_\bo_\bb_\ba_\bl_\bO_\bw_\bn_\be_\br_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n+int globalOwnerVertices\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:175\n+_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\n+Provides classes for building the matrix graph.\n+_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bd_\be_\bc_\bo_\bm_\bp_\bo_\bs_\be\n-void bildl_decompose(Matrix &A)\n-compute ILDL decomposition of a symmetric matrix A\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ildl.hh:88\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bb_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n-void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool\n-isLowerTriangular=false)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ildl.hh:149\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-void blockDILUDecomposition(M &A, std::vector< typename M::block_type > &Dinv_)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dilu.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n-void blockDILUBacksolve(const M &A, const std::vector< typename M::block_type >\n-Dinv_, X &v, const Y &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dilu.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bt_\bT_\bo_\bC_\bR_\bS\n-void convertToCRS(const M &A, CRS &lower, CRS &upper, InvVector &inv)\n-convert ILU decomposition into CRS format for lower and upper triangular and\n-inverse.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:307\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n-void blockILUBacksolve(const M &A, X &v, const Y &d)\n-LU backsolve with stored inverse.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:94\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-void blockILU0Decomposition(M &A)\n-compute ILU decomposition of A. A is overwritten by its decomposition\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-void blockILUDecomposition(const M &A, int n, M &ILU)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:167\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bL\n-compile-time parameter for block recursion depth\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:45\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS\n-a simple compressed row storage matrix class\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:259\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-derive error class from the base class in common\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk\n-static void check(const Matrix &mat)\n-Check whether the a matrix has diagonal values on blocklevel recursion levels.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-A linear operator exporting itself in matrix form.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Base class for matrix free definition of preconditioners.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Turns an InverseOperator into a Preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-O::range_type range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-O::domain_type domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(domain_type &)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-range_type::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< scalar_field_type >::real_type real_field_type\n-real scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Simd::Scalar< field_type > scalar_field_type\n-scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\br_\be\n-virtual void pre(domain_type &, range_type &)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:102\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-InverseOperator2Preconditioner(InverseOperator &inverse_operator)\n-Construct the preconditioner from the solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-O InverseOperator\n-type of the wrapped inverse operator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:89\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(domain_type &v, const range_type &d)\n-Apply one step of the preconditioner to the system A(v)=d.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n-Sequential SSOR preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(X &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n-SeqSSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n-const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:183\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n-SeqSSOR(const M &A, const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:200\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:234\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Simd::Scalar< field_type > scalar_field_type\n-scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:147\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-The matrix type the preconditioner is for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:145\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &v, const Y &d)\n-Apply the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:217\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bp_\br_\be\n-virtual void pre(X &x, Y &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:209\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:149\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< scalar_field_type >::real_type real_field_type\n-real scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n-SeqSSOR(const M &A, int n, real_field_type w)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:164\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR\n-Sequential SOR preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:262\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR\n-SeqSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n-const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:303\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-The matrix type the preconditioner is for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:265\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< scalar_field_type >::real_type real_field_type\n-real scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:275\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(X &v, const Y &d)\n-Apply the preconditioner in a special direction.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:351\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:267\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(X &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:368\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bp_\br_\be\n-virtual void pre(X &x, Y &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:329\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Simd::Scalar< field_type > scalar_field_type\n-scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:273\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:372\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &v, const Y &d)\n-Apply the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:337\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR\n-SeqSOR(const M &A, const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:320\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:271\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR\n-SeqSOR(const M &A, int n, real_field_type w)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:284\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc\n-The sequential jacobian preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:413\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(X &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:500\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc\n-SeqJac(const M &A, const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:471\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &v, const Y &d)\n-Apply the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:488\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-The matrix type the preconditioner is for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:416\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Simd::Scalar< field_type > scalar_field_type\n-scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:424\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc\n-SeqJac(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n-const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:454\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:422\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bp_\br_\be\n-virtual void pre(X &x, Y &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:480\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:418\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< scalar_field_type >::real_type real_field_type\n-real scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:426\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:504\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc\n-SeqJac(const M &A, int n, real_field_type w)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:435\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:420\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU\n-Sequential DILU preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:564\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bw_\bN_\bo_\bt_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\b_\n-const bool wNotIdentity_\n-true if w != 1.0\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:681\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename X::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:576\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\b__\bw\n-const real_field_type _w\n-The relaxation factor to use.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:679\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\b__\bA_\b_\n-const M & _A_\n-The matrix we operate on.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:677\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU\n-SeqDILU(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n-const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:612\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Simd::Scalar< field_type > scalar_field_type\n-scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:579\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(X &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:664\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename FieldTraits< scalar_field_type >::real_type real_field_type\n-real scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:581\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-The matrix type the preconditioner is for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:567\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:571\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-typename matrix_type::block_type block_type\n-block type of matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:569\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &v, const Y &d)\n-Apply the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:648\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bp_\br_\be\n-virtual void pre(X &x, Y &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:639\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU\n-SeqDILU(const M &A, real_field_type w)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:589\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:669\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:573\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU\n-SeqDILU(const M &A, const ParameterTree &config)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:629\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bD_\bi_\bn_\bv_\b_\n-std::vector< block_type > Dinv_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:675\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n-Sequential ILU preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:697\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(X &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:843\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n-SeqILU(const M &A, int n, real_field_type w, const bool resort=false)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:777\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bp_\br_\be\n-virtual void pre(X &x, Y &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:813\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &v, const Y &d)\n-Apply the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:821\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS\n-ILU::CRS< block_type, typename M::allocator_type > CRS\n-type of ILU storage\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:717\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:706\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bl_\bo_\bw_\be_\br_\b_\n-CRS lower_\n-The ILU(n) decomposition of the matrix. As storage a CRS structure is used.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:857\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bw_\bN_\bo_\bt_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\b_\n-const bool wNotIdentity_\n-true if w != 1.0\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:864\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n-SeqILU(const M &A, const ParameterTree &config)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:763\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-std::remove_const< M >::type matrix_type\n-The matrix type the preconditioner is for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:700\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-matrix_type::block_type block_type\n-block type of matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:702\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< scalar_field_type >::real_type real_field_type\n-real scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:714\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:709\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:847\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n-SeqILU(const M &A, real_field_type w, const bool resort=false)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:726\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bw_\b_\n-const real_field_type w_\n-The relaxation factor to use.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:862\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n-SeqILU(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n-const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:745\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:704\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bi_\bn_\bv_\b_\n-std::vector< block_type, typename matrix_type::allocator_type > inv_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:859\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Simd::Scalar< field_type > scalar_field_type\n-scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:712\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bI_\bL_\bU_\b_\n-std::unique_ptr< matrix_type > ILU_\n-The ILU(n) decomposition of the matrix. As storage a BCRSMatrix is used.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:854\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bu_\bp_\bp_\be_\br_\b_\n-CRS upper_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:858\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn\n-Richardson preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:878\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:885\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:943\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:883\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bp_\br_\be\n-virtual void pre(X &x, Y &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:920\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn\n-Richardson(real_field_type w=1.0)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:896\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(X &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:939\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< scalar_field_type >::real_type real_field_type\n-real scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:889\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Simd::Scalar< field_type > scalar_field_type\n-scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:887\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn\n-Richardson(const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:911\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:881\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &v, const Y &d)\n-Apply the precondioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:928\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL\n-sequential ILDL preconditioner\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:972\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL\n-SeqILDL(const matrix_type &A, const ParameterTree &config)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1018\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL\n-SeqILDL(const matrix_type &A, real_field_type relax=real_field_type(1))\n-constructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1030\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-domain type of the preconditioner\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:980\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bp_\bo_\bs_\bt\n-void post(X &x) override\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1081\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-range type of the preconditioner\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:982\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-std::remove_const_t< M > matrix_type\n-type of matrix the preconditioner is for\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:978\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(X &v, const Y &d) override\n-Apply one step of the preconditioner to the system A(v)=d.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1074\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< scalar_field_type >::real_type real_field_type\n-real scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:988\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL\n-SeqILDL(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n-const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1002\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bp_\br_\be\n-void pre(X &x, Y &b) override\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1070\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Simd::Scalar< field_type > scalar_field_type\n-scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:986\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-field type of the preconditioner\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:984\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-SolverCategory::Category category() const override\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1085\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-Statistics about the application of an inverse operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Abstract base class for all solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-static Category category(const OP &op, decltype(op.category()) *=nullptr)\n-Helperfunction to extract the solver category either from an enum, or from the\n-newly introduced virtu...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+bool buildCommunication(const G &graph, std::vector< int > &realparts, Dune::\n+OwnerOverlapCopyCommunication< T1, T2 > &oocomm, std::shared_ptr< Dune::\n+OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface\n+&redistInf, bool verbose=false)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:1449\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\bl_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bH_\bo_\bl_\be_\bs\n+void fillIndexSetHoles(const G &graph, Dune::OwnerOverlapCopyCommunication< T1,\n+T2 > &oocomm)\n+Fills the holes in an index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bG_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn\n+bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication<\n+T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::\n+OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface\n+&redistInf, bool verbose=false)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:822\n+_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\bc_\ba_\br_\br_\ba_\by\n+void print_carray(S &os, T *array, std::size_t l)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:771\n+_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bG_\br_\ba_\bp_\bh\n+bool isValidGraph(std::size_t noVtx, std::size_t gnoVtx, S noEdges, T *xadj, T\n+*adjncy, bool checkSymmetry)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:778\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn\n+bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1,\n+T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::\n+OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface\n+&redistInf, bool verbose=false)\n+execute a graph repartition for a giving graph and indexset.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:1228\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\be_\bt_\bi_\bs_\b:_\b:_\br_\be_\ba_\bl_\b__\bt\n+float real_t\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\be_\bt_\bi_\bs_\b:_\b:_\bi_\bd_\bx_\b__\bt\n+std::size_t idx_t\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br\n+@ owner\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+A class setting up standard communication for a two-valued attribute set with\n+owner/overlap/copy sema...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n+const GlobalLookupIndexSet & globalLookup() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:526\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bn_\bd_\be_\bx_\bS_\be_\bt\n+const ParallelIndexSet & indexSet() const\n+Get the underlying parallel index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:462\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl\n+void copyCopyToAll(const T &source, T &dest) const\n+Communicate values from copy data points to all other data points.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:328\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet\n+The type of the reverse lookup of indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:456\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n+void buildGlobalLookup()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:495\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+const Communication< MPI_Comm > & communicator() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl\n+void copyOwnerToAll(const T &source, T &dest) const\n+Communicate values from owner data points to all other data points.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:311\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+const RemoteIndices & remoteIndices() const\n+Get the underlying remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:471\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bf_\br_\be_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n+void freeGlobalLookup()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:520\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet\n+The type of the parallel index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:449\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+The (undirected) graph of a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:260\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\br_\be_\bs_\be_\br_\bv_\be_\bS_\bp_\ba_\bc_\be_\bF_\bo_\br_\bR_\be_\bc_\be_\bi_\bv_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+void reserveSpaceForReceiveInterface(int proc, int size)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:284\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bR_\be_\bc_\be_\bi_\bv_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+void buildReceiveInterface(std::vector< std::pair< TG, int > > &indices)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bs_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+void setCommunicator(MPI_Comm comm)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:261\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bS_\be_\bn_\bd_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+void buildSendInterface(const std::vector< int > &toPart, const IS &idxset)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:266\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\ba_\bd_\bd_\bR_\be_\bc_\be_\bi_\bv_\be_\bI_\bn_\bd_\be_\bx\n+void addReceiveIndex(int proc, std::size_t idx)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:288\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00032.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00032.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: blocklevel.hh File Reference\n+dune-istl: ilu.hh File Reference\n \n \n \n \n \n \n \n@@ -70,56 +70,80 @@\n

    \n \n
    \n
    \n
    \n \n-
    blocklevel.hh File Reference
    \n+
    ilu.hh File Reference
    \n
    \n
    \n \n-

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

    The incomplete LU factorization kernels. \n More...

    \n-
    #include <algorithm>
    \n-#include <type_traits>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/hybridutilities.hh>
    \n+
    #include <cmath>
    \n+#include <complex>
    \n+#include <map>
    \n+#include <vector>
    \n+#include <dune/common/fmatrix.hh>
    \n+#include <dune/common/scalarvectorview.hh>
    \n+#include <dune/common/scalarmatrixview.hh>
    \n+#include "istlexception.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n+\n+\n+\n+\n+

    \n+Classes

    struct  Dune::ILU::CRS< B, Alloc >
     a simple compressed row storage matrix class More...
     
    \n \n \n \n+\n+\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::ILU
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n 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<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.
     
    \n

    Detailed Description

    \n-

    Helper functions for determining the vector/matrix block level.

    \n+

    The incomplete LU factorization kernels.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,43 +1,67 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-blocklevel.hh File Reference\n-Helper functions for determining the vector/matrix block level. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+ilu.hh File Reference\n+The incomplete LU factorization kernels. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b<_\b _\bB_\b,_\b _\bA_\bl_\bl_\bo_\bc_\b _\b>\n+\u00a0 a simple compressed row storage matrix class _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU\n+\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-constexpr std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bx_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl ()\n-\u00a0 Determine the maximum block level of a possibly nested\n- vector/matrix type.\n-\u00a0\n-template\n-constexpr std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bi_\bn_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl ()\n-\u00a0 Determine the minimum block level of a possibly nested\n- vector/matrix type.\n-\u00a0\n-template\n- constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bU_\bn_\bi_\bq_\bu_\be_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl ()\n-\u00a0 Determine if a vector/matrix has a uniquely determinable\n- block level.\n-\u00a0\n-template\n-constexpr std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl ()\n-\u00a0 Determine the block level of a possibly nested vector/\n- matrix type.\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn (M &A)\n+\u00a0 compute _\bI_\bL_\bU decomposition of A. A is overwritten by its\n+ decomposition\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n+\u00a0 LU backsolve with stored inverse.\n+\u00a0\n+template\n+M::field_type &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (M &A, typename std::\n+ enable_if_t::value > *sfinae=nullptr)\n+\u00a0\n+template\n+ K &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (K &A, typename std::\n+ enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)\n+\u00a0\n+template\n+ K &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, n, m > &A)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn (const M &A, int n, M &ILU)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bt_\bT_\bo_\bC_\bR_\bS (const M &A, _\bC_\bR_\bS &lower, _\bC_\bR_\bS &upper,\n+ InvVector &inv)\n+\u00a0 convert _\bI_\bL_\bU decomposition into _\bC_\bR_\bS format for lower and upper\n+ triangular and inverse.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const _\bC_\bR_\bS &lower, const _\bC_\bR_\bS\n+ &upper, const InvVector &inv, X &v, const Y &d)\n+\u00a0 LU backsolve with stored inverse in _\bC_\bR_\bS format for lower and\n+ upper triangular.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Helper functions for determining the vector/matrix block level.\n+The incomplete LU factorization kernels.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00032_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00032_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: blocklevel.hh Source File\n+dune-istl: ilu.hh Source File\n \n \n \n \n \n \n \n@@ -74,203 +74,475 @@\n \n
    \n \n
    \n
    \n
    \n-
    blocklevel.hh
    \n+
    ilu.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5
    \n-
    6#ifndef DUNE_ISTL_BLOCKLEVEL_HH
    \n-
    7#define DUNE_ISTL_BLOCKLEVEL_HH
    \n-
    8
    \n-
    9#include <algorithm>
    \n-
    10#include <type_traits>
    \n-
    11
    \n-
    12#include <dune/common/indices.hh>
    \n-
    13#include <dune/common/typetraits.hh>
    \n-
    14#include <dune/common/hybridutilities.hh>
    \n-
    15
    \n-
    21// forward declaration
    \n-
    22namespace Dune {
    \n-
    23template<typename... Args>
    \n-
    24class MultiTypeBlockVector;
    \n-
    25template<typename FirstRow, typename... Args>
    \n-
    26class MultiTypeBlockMatrix;
    \n-
    27} // end namespace Dune
    \n-
    28
    \n-
    29namespace Dune { namespace Impl {
    \n+
    5#ifndef DUNE_ISTL_ILU_HH
    \n+
    6#define DUNE_ISTL_ILU_HH
    \n+
    7
    \n+
    8#include <cmath>
    \n+
    9#include <complex>
    \n+
    10#include <map>
    \n+
    11#include <vector>
    \n+
    12
    \n+
    13#include <dune/common/fmatrix.hh>
    \n+
    14#include <dune/common/scalarvectorview.hh>
    \n+
    15#include <dune/common/scalarmatrixview.hh>
    \n+
    16
    \n+
    17#include "istlexception.hh"
    \n+
    18
    \n+
    23namespace Dune {
    \n+
    24
    \n+
    \n+
    29 namespace ILU {
    \n
    30
    \n-
    31// forward declaration
    \n-
    32template<typename T> struct MaxBlockLevel;
    \n-
    33template<typename T> struct MinBlockLevel;
    \n-
    34
    \n-
    36template<typename M, template<typename B> typename BlockLevel, typename Op>
    \n-
    37constexpr std::size_t blockLevelMultiTypeBlockMatrix(const Op& op)
    \n-
    38{
    \n-
    39 // inialize with zeroth diagonal block
    \n-
    40 using namespace Dune::Indices;
    \n-
    41 using Block00 = typename std::decay_t<decltype(std::declval<M>()[_0][_0])>;
    \n-
    42 std::size_t blockLevel = BlockLevel<Block00>::value() + 1;
    \n-
    43 // iterate over all blocks to determine min/max block level
    \n-
    44 using namespace Dune::Hybrid;
    \n-
    45 forEach(integralRange(index_constant<M::N()>()), [&](auto&& i) {
    \n-
    46 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    47 forEach(integralRange(index_constant<M::M()>()), [&](auto&& j) {
    \n-
    48 using Block = typename std::decay_t<decltype(std::declval<M>()[i][j])>;
    \n-
    49 blockLevel = op(blockLevel, BlockLevel<Block>::value() + 1);
    \n-
    50 });
    \n-
    51 });
    \n-
    52 return blockLevel;
    \n-
    53}
    \n-
    54
    \n-
    56template<typename V, template<typename B> typename BlockLevel, typename Op>
    \n-
    57constexpr std::size_t blockLevelMultiTypeBlockVector(const Op& op)
    \n-
    58{
    \n-
    59 // inialize with zeroth block
    \n-
    60 using namespace Dune::Indices;
    \n-
    61 using Block0 = typename std::decay_t<decltype(std::declval<V>()[_0])>;
    \n-
    62 std::size_t blockLevel = BlockLevel<Block0>::value() + 1;
    \n-
    63 // iterate over all blocks to determine min/max block level
    \n-
    64 using namespace Dune::Hybrid;
    \n-
    65 forEach(integralRange(index_constant<V::size()>()), [&](auto&& i) {
    \n-
    66 using Block = typename std::decay_t<decltype(std::declval<V>()[i])>;
    \n-
    67 blockLevel = op(blockLevel, BlockLevel<Block>::value() + 1);
    \n-
    68 });
    \n-
    69 return blockLevel;
    \n-
    70}
    \n-
    71
    \n-
    72template<typename T>
    \n-
    73struct MaxBlockLevel
    \n-
    74{
    \n-
    75 static constexpr std::size_t value(){
    \n-
    76 if constexpr (IsNumber<T>::value)
    \n-
    77 return 0;
    \n-
    78 else
    \n-
    79 return MaxBlockLevel<typename T::block_type>::value() + 1;
    \n-
    80 }
    \n-
    81};
    \n-
    82
    \n-
    83template<typename T>
    \n-
    84struct MinBlockLevel
    \n-
    85{
    \n-
    86 // the default implementation assumes minBlockLevel == maxBlockLevel
    \n-
    87 static constexpr std::size_t value()
    \n-
    88 { return MaxBlockLevel<T>::value(); }
    \n-
    89};
    \n-
    90
    \n-
    91// max block level for MultiTypeBlockMatrix
    \n-
    92template<typename FirstRow, typename... Args>
    \n-
    93struct MaxBlockLevel<Dune::MultiTypeBlockMatrix<FirstRow, Args...>>
    \n-
    94{
    \n-
    95 static constexpr std::size_t value()
    \n-
    96 {
    \n-
    97 using M = MultiTypeBlockMatrix<FirstRow, Args...>;
    \n-
    98 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b); };
    \n-
    99 return blockLevelMultiTypeBlockMatrix<M, MaxBlockLevel>(max);
    \n-
    100 }
    \n-
    101};
    \n-
    102
    \n-
    103// min block level for MultiTypeBlockMatrix
    \n-
    104template<typename FirstRow, typename... Args>
    \n-
    105struct MinBlockLevel<Dune::MultiTypeBlockMatrix<FirstRow, Args...>>
    \n-
    106{
    \n-
    107 static constexpr std::size_t value()
    \n-
    108 {
    \n-
    109 using M = MultiTypeBlockMatrix<FirstRow, Args...>;
    \n-
    110 constexpr auto min = [](const auto& a, const auto& b){ return std::min(a,b); };
    \n-
    111 return blockLevelMultiTypeBlockMatrix<M, MinBlockLevel>(min);
    \n-
    112 }
    \n-
    113};
    \n-
    114
    \n-
    115// max block level for MultiTypeBlockVector
    \n-
    116template<typename... Args>
    \n-
    117struct MaxBlockLevel<Dune::MultiTypeBlockVector<Args...>>
    \n-
    118{
    \n-
    119 static constexpr std::size_t value()
    \n-
    120 {
    \n-
    121 using V = MultiTypeBlockVector<Args...>;
    \n-
    122 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b); };
    \n-
    123 return blockLevelMultiTypeBlockVector<V, MaxBlockLevel>(max);
    \n-
    124 }
    \n-
    125};
    \n-
    126
    \n-
    127// min block level for MultiTypeBlockVector
    \n-
    128template<typename... Args>
    \n-
    129struct MinBlockLevel<Dune::MultiTypeBlockVector<Args...>>
    \n-
    130{
    \n-
    131 static constexpr std::size_t value()
    \n-
    132 {
    \n-
    133 using V = MultiTypeBlockVector<Args...>;
    \n-
    134 constexpr auto min = [](const auto& a, const auto& b){ return std::min(a,b); };
    \n-
    135 return blockLevelMultiTypeBlockVector<V, MinBlockLevel>(min);
    \n-
    136 }
    \n-
    137};
    \n+
    32 template<class M>
    \n+
    \n+\n+
    34 {
    \n+
    35 // iterator types
    \n+
    36 typedef typename M::RowIterator rowiterator;
    \n+
    37 typedef typename M::ColIterator coliterator;
    \n+
    38 typedef typename M::block_type block;
    \n+
    39
    \n+
    40 // implement left looking variant with stored inverse
    \n+
    41 rowiterator endi=A.end();
    \n+
    42 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n+
    43 {
    \n+
    44 // coliterator is diagonal after the following loop
    \n+
    45 coliterator endij=(*i).end(); // end of row i
    \n+
    46 coliterator ij;
    \n+
    47
    \n+
    48 // eliminate entries left of diagonal; store L factor
    \n+
    49 for (ij=(*i).begin(); ij.index()<i.index(); ++ij)
    \n+
    50 {
    \n+
    51 // find A_jj which eliminates A_ij
    \n+
    52 coliterator jj = A[ij.index()].find(ij.index());
    \n+
    53
    \n+
    54 // compute L_ij = A_jj^-1 * A_ij
    \n+
    55 Impl::asMatrix(*ij).rightmultiply(Impl::asMatrix(*jj));
    \n+
    56
    \n+
    57 // modify row
    \n+
    58 coliterator endjk=A[ij.index()].end(); // end of row j
    \n+
    59 coliterator jk=jj; ++jk;
    \n+
    60 coliterator ik=ij; ++ik;
    \n+
    61 while (ik!=endij && jk!=endjk)
    \n+
    62 if (ik.index()==jk.index())
    \n+
    63 {
    \n+
    64 block B(*jk);
    \n+
    65 Impl::asMatrix(B).leftmultiply(Impl::asMatrix(*ij));
    \n+
    66 *ik -= B;
    \n+
    67 ++ik; ++jk;
    \n+
    68 }
    \n+
    69 else
    \n+
    70 {
    \n+
    71 if (ik.index()<jk.index())
    \n+
    72 ++ik;
    \n+
    73 else
    \n+
    74 ++jk;
    \n+
    75 }
    \n+
    76 }
    \n+
    77
    \n+
    78 // invert pivot and store it in A
    \n+
    79 if (ij.index()!=i.index())
    \n+
    80 DUNE_THROW(ISTLError,"diagonal entry missing");
    \n+
    81 try {
    \n+
    82 Impl::asMatrix(*ij).invert(); // compute inverse of diagonal block
    \n+
    83 }
    \n+
    84 catch (Dune::FMatrixError & e) {
    \n+
    85 DUNE_THROW(MatrixBlockError, "ILU failed to invert matrix block A["
    \n+
    86 << i.index() << "][" << ij.index() << "]" << e.what();
    \n+
    87 th__ex.r=i.index(); th__ex.c=ij.index(););
    \n+
    88 }
    \n+
    89 }
    \n+
    90 }
    \n+
    \n+
    91
    \n+
    93 template<class M, class X, class Y>
    \n+
    \n+
    94 void blockILUBacksolve (const M& A, X& v, const Y& d)
    \n+
    95 {
    \n+
    96 // iterator types
    \n+
    97 typedef typename M::ConstRowIterator rowiterator;
    \n+
    98 typedef typename M::ConstColIterator coliterator;
    \n+
    99 typedef typename Y::block_type dblock;
    \n+
    100 typedef typename X::block_type vblock;
    \n+
    101
    \n+
    102 // lower triangular solve
    \n+
    103 rowiterator endi=A.end();
    \n+
    104 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n+
    105 {
    \n+
    106 // We need to be careful here: Directly using
    \n+
    107 // auto rhs = Impl::asVector(d[ i.index() ]);
    \n+
    108 // is not OK in case this is a proxy. Hence
    \n+
    109 // we first have to copy the value. Notice that
    \n+
    110 // this is still not OK, if the vector type itself returns
    \n+
    111 // proxy references.
    \n+
    112 dblock rhsValue(d[i.index()]);
    \n+
    113 auto&& rhs = Impl::asVector(rhsValue);
    \n+
    114 for (coliterator j=(*i).begin(); j.index()<i.index(); ++j)
    \n+
    115 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);
    \n+
    116 Impl::asVector(v[i.index()]) = rhs; // Lii = I
    \n+
    117 }
    \n+
    118
    \n+
    119 // upper triangular solve
    \n+
    120 rowiterator rendi=A.beforeBegin();
    \n+
    121 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
    \n+
    122 {
    \n+
    123 // We need to be careful here: Directly using
    \n+
    124 // auto rhs = Impl::asVector(v[ i.index() ]);
    \n+
    125 // is not OK in case this is a proxy. Hence
    \n+
    126 // we first have to copy the value. Notice that
    \n+
    127 // this is still not OK, if the vector type itself returns
    \n+
    128 // proxy references.
    \n+
    129 vblock rhsValue(v[i.index()]);
    \n+
    130 auto&& rhs = Impl::asVector(rhsValue);
    \n+
    131 coliterator j;
    \n+
    132 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)
    \n+
    133 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);
    \n+
    134 auto&& vi = Impl::asVector(v[i.index()]);
    \n+
    135 Impl::asMatrix(*j).mv(rhs,vi); // diagonal stores inverse!
    \n+
    136 }
    \n+
    137 }
    \n+
    \n
    138
    \n-
    139// special case: empty MultiTypeBlockVector
    \n-
    140template<>
    \n-
    141struct MaxBlockLevel<Dune::MultiTypeBlockVector<>>
    \n-
    142{
    \n-
    143 static constexpr std::size_t value()
    \n-
    144 { return 0; };
    \n-
    145};
    \n+
    139 // recursive function template to access first entry of a matrix
    \n+
    140 template<class M>
    \n+
    \n+
    141 typename M::field_type& firstMatrixElement (M& A,
    \n+
    142 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr)
    \n+
    143 {
    \n+
    144 return firstMatrixElement(*(A.begin()->begin()));
    \n+
    145 }
    \n+
    \n
    146
    \n-
    147// special case: empty MultiTypeBlockVector
    \n-
    148template<>
    \n-
    149struct MinBlockLevel<Dune::MultiTypeBlockVector<>>
    \n-
    150{
    \n-
    151 static constexpr std::size_t value()
    \n-
    152 { return 0; };
    \n-
    153};
    \n-
    154
    \n-
    155}} // end namespace Dune::Impl
    \n-
    156
    \n-
    157namespace Dune {
    \n-
    158
    \n-
    160template<typename T>
    \n-
    \n-
    161constexpr std::size_t maxBlockLevel()
    \n-
    162{ return Impl::MaxBlockLevel<T>::value(); }
    \n-
    \n-
    163
    \n-
    165template<typename T>
    \n-
    \n-
    166constexpr std::size_t minBlockLevel()
    \n-
    167{ return Impl::MinBlockLevel<T>::value(); }
    \n-
    \n-
    168
    \n-
    170template<typename T>
    \n-
    \n-
    171constexpr bool hasUniqueBlockLevel()
    \n-
    172{ return maxBlockLevel<T>() == minBlockLevel<T>(); }
    \n-
    \n-
    173
    \n-
    175template<typename T>
    \n-
    \n-
    176constexpr std::size_t blockLevel()
    \n-
    177{
    \n-
    178 static_assert(hasUniqueBlockLevel<T>(), "Block level cannot be uniquely determined!");
    \n-
    179 return Impl::MaxBlockLevel<T>::value();
    \n-
    180}
    \n-
    \n-
    181
    \n-
    182} // end namespace Dune
    \n-
    183
    \n-
    184#endif
    \n+
    147 template<class K>
    \n+
    \n+\n+
    149 [[maybe_unused]] typename std::enable_if_t<Dune::IsNumber<K>::value>* sfinae = nullptr)
    \n+
    150 {
    \n+
    151 return A;
    \n+
    152 }
    \n+
    \n+
    153
    \n+
    154 template<class K, int n, int m>
    \n+
    \n+\n+
    156 {
    \n+
    157 return A[0][0];
    \n+
    158 }
    \n+
    \n+
    159
    \n+
    166 template<class M>
    \n+
    \n+
    167 void blockILUDecomposition (const M& A, int n, M& ILU)
    \n+
    168 {
    \n+
    169 // iterator types
    \n+
    170 typedef typename M::ColIterator coliterator;
    \n+
    171 typedef typename M::ConstRowIterator crowiterator;
    \n+
    172 typedef typename M::ConstColIterator ccoliterator;
    \n+
    173 typedef typename M::CreateIterator createiterator;
    \n+
    174 typedef typename M::field_type K;
    \n+
    175 typedef std::map<size_t, int> map;
    \n+
    176 typedef typename map::iterator mapiterator;
    \n+
    177
    \n+
    178 // symbolic factorization phase, store generation number in first matrix element
    \n+
    179 crowiterator endi=A.end();
    \n+
    180 createiterator ci=ILU.createbegin();
    \n+
    181 for (crowiterator i=A.begin(); i!=endi; ++i)
    \n+
    182 {
    \n+
    183 map rowpattern; // maps column index to generation
    \n+
    184
    \n+
    185 // initialize pattern with row of A
    \n+
    186 for (ccoliterator j=(*i).begin(); j!=(*i).end(); ++j)
    \n+
    187 rowpattern[j.index()] = 0;
    \n+
    188
    \n+
    189 // eliminate entries in row which are to the left of the diagonal
    \n+
    190 for (mapiterator ik=rowpattern.begin(); (*ik).first<i.index(); ++ik)
    \n+
    191 {
    \n+
    192 if ((*ik).second<n)
    \n+
    193 {
    \n+
    194 coliterator endk = ILU[(*ik).first].end(); // end of row k
    \n+
    195 coliterator kj = ILU[(*ik).first].find((*ik).first); // diagonal in k
    \n+
    196 for (++kj; kj!=endk; ++kj) // row k eliminates in row i
    \n+
    197 {
    \n+
    198 // we misuse the storage to store an int. If the field_type is std::complex, we have to access the real/abs part
    \n+
    199 // starting from C++11, we can use std::abs to always return a real value, even if it is double/float
    \n+
    200 using std::abs;
    \n+
    201 int generation = (int) Simd::lane(0, abs( firstMatrixElement(*kj) ));
    \n+
    202 if (generation<n)
    \n+
    203 {
    \n+
    204 mapiterator ij = rowpattern.find(kj.index());
    \n+
    205 if (ij==rowpattern.end())
    \n+
    206 {
    \n+
    207 rowpattern[kj.index()] = generation+1;
    \n+
    208 }
    \n+
    209 }
    \n+
    210 }
    \n+
    211 }
    \n+
    212 }
    \n+
    213
    \n+
    214 // create row
    \n+
    215 for (mapiterator ik=rowpattern.begin(); ik!=rowpattern.end(); ++ik)
    \n+
    216 ci.insert((*ik).first);
    \n+
    217 ++ci; // now row i exist
    \n+
    218
    \n+
    219 // write generation index into entries
    \n+
    220 coliterator endILUij = ILU[i.index()].end();;
    \n+
    221 for (coliterator ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)
    \n+
    222 Simd::lane(0, firstMatrixElement(*ILUij)) = (Simd::Scalar<K>) rowpattern[ILUij.index()];
    \n+
    223 }
    \n+
    224
    \n+
    225 // copy entries of A
    \n+
    226 for (crowiterator i=A.begin(); i!=endi; ++i)
    \n+
    227 {
    \n+
    228 coliterator ILUij;
    \n+
    229 coliterator endILUij = ILU[i.index()].end();;
    \n+
    230 for (ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)
    \n+
    231 (*ILUij) = 0; // clear row
    \n+
    232 ccoliterator Aij = (*i).begin();
    \n+
    233 ccoliterator endAij = (*i).end();
    \n+
    234 ILUij = ILU[i.index()].begin();
    \n+
    235 while (Aij!=endAij && ILUij!=endILUij)
    \n+
    236 {
    \n+
    237 if (Aij.index()==ILUij.index())
    \n+
    238 {
    \n+
    239 *ILUij = *Aij;
    \n+
    240 ++Aij; ++ILUij;
    \n+
    241 }
    \n+
    242 else
    \n+
    243 {
    \n+
    244 if (Aij.index()<ILUij.index())
    \n+
    245 ++Aij;
    \n+
    246 else
    \n+
    247 ++ILUij;
    \n+
    248 }
    \n+
    249 }
    \n+
    250 }
    \n+
    251
    \n+
    252 // call decomposition on pattern
    \n+\n+
    254 }
    \n+
    \n+
    255
    \n+
    257 template <class B, class Alloc = std::allocator<B>>
    \n+
    \n+
    258 struct CRS
    \n+
    259 {
    \n+
    260 typedef B block_type;
    \n+
    261 typedef size_t size_type;
    \n+
    262
    \n+
    263 CRS() : nRows_( 0 ) {}
    \n+
    264
    \n+
    265 size_type rows() const { return nRows_; }
    \n+
    266
    \n+
    \n+\n+
    268 {
    \n+
    269 assert( rows_[ rows() ] != size_type(-1) );
    \n+
    270 return rows_[ rows() ];
    \n+
    271 }
    \n+
    \n+
    272
    \n+
    \n+
    273 void resize( const size_type nRows )
    \n+
    274 {
    \n+
    275 if( nRows_ != nRows )
    \n+
    276 {
    \n+
    277 nRows_ = nRows ;
    \n+
    278 rows_.resize( nRows_+1, size_type(-1) );
    \n+
    279 }
    \n+
    280 }
    \n+
    \n+
    281
    \n+
    \n+\n+
    283 {
    \n+
    284 const size_type needed = values_.size() + nonZeros ;
    \n+
    285 if( values_.capacity() < needed )
    \n+
    286 {
    \n+
    287 const size_type estimate = needed * 1.1;
    \n+
    288 values_.reserve( estimate );
    \n+
    289 cols_.reserve( estimate );
    \n+
    290 }
    \n+
    291 }
    \n+
    \n+
    292
    \n+
    \n+
    293 void push_back( const block_type& value, const size_type index )
    \n+
    294 {
    \n+
    295 values_.push_back( value );
    \n+
    296 cols_.push_back( index );
    \n+
    297 }
    \n+
    \n+
    298
    \n+
    299 std::vector< size_type > rows_;
    \n+
    300 std::vector< block_type, Alloc> values_;
    \n+
    301 std::vector< size_type > cols_;
    \n+\n+
    303 };
    \n+
    \n+
    304
    \n+
    306 template<class M, class CRS, class InvVector>
    \n+
    \n+
    307 void convertToCRS(const M& A, CRS& lower, CRS& upper, InvVector& inv )
    \n+
    308 {
    \n+
    309 typedef typename M :: size_type size_type;
    \n+
    310
    \n+
    311 lower.resize( A.N() );
    \n+
    312 upper.resize( A.N() );
    \n+
    313 inv.resize( A.N() );
    \n+
    314
    \n+
    315 // lower and upper triangular should store half of non zeros minus diagonal
    \n+
    316 const size_t memEstimate = (A.nonzeroes() - A.N())/2;
    \n+
    317
    \n+
    318 assert( A.nonzeroes() != 0 );
    \n+
    319 lower.reserveAdditional( memEstimate );
    \n+
    320 upper.reserveAdditional( memEstimate );
    \n+
    321
    \n+
    322 const auto endi = A.end();
    \n+
    323 size_type row = 0;
    \n+
    324 size_type colcount = 0;
    \n+
    325 lower.rows_[ 0 ] = colcount;
    \n+
    326 for (auto i=A.begin(); i!=endi; ++i, ++row)
    \n+
    327 {
    \n+
    328 const size_type iIndex = i.index();
    \n+
    329
    \n+
    330 // store entries left of diagonal
    \n+
    331 for (auto j=(*i).begin(); j.index() < iIndex; ++j )
    \n+
    332 {
    \n+
    333 lower.push_back( (*j), j.index() );
    \n+
    334 ++colcount;
    \n+
    335 }
    \n+
    336 lower.rows_[ iIndex+1 ] = colcount;
    \n+
    337 }
    \n+
    338
    \n+
    339 const auto rendi = A.beforeBegin();
    \n+
    340 row = 0;
    \n+
    341 colcount = 0;
    \n+
    342 upper.rows_[ 0 ] = colcount ;
    \n+
    343
    \n+
    344 // NOTE: upper and inv store entries in reverse row and col order,
    \n+
    345 // reverse here relative to ILU
    \n+
    346 for (auto i=A.beforeEnd(); i!=rendi; --i, ++ row )
    \n+
    347 {
    \n+
    348 const auto endij=(*i).beforeBegin(); // end of row i
    \n+
    349
    \n+
    350 const size_type iIndex = i.index();
    \n+
    351
    \n+
    352 // store in reverse row order for faster access during backsolve
    \n+
    353 for (auto j=(*i).beforeEnd(); j != endij; --j )
    \n+
    354 {
    \n+
    355 const size_type jIndex = j.index();
    \n+
    356 if( j.index() == iIndex )
    \n+
    357 {
    \n+
    358 inv[ row ] = (*j);
    \n+
    359 break; // assuming consecutive ordering of A
    \n+
    360 }
    \n+
    361 else if ( j.index() >= i.index() )
    \n+
    362 {
    \n+
    363 upper.push_back( (*j), jIndex );
    \n+
    364 ++colcount ;
    \n+
    365 }
    \n+
    366 }
    \n+
    367 upper.rows_[ row+1 ] = colcount;
    \n+
    368 }
    \n+
    369 } // end convertToCRS
    \n+
    \n+
    370
    \n+
    372 template<class CRS, class InvVector, class X, class Y>
    \n+
    \n+
    373 void blockILUBacksolve (const CRS& lower,
    \n+
    374 const CRS& upper,
    \n+
    375 const InvVector& inv,
    \n+
    376 X& v, const Y& d)
    \n+
    377 {
    \n+
    378 // iterator types
    \n+
    379 typedef typename Y :: block_type dblock;
    \n+
    380 typedef typename X :: block_type vblock;
    \n+
    381 typedef typename X :: size_type size_type ;
    \n+
    382
    \n+
    383 const size_type iEnd = lower.rows();
    \n+
    384 const size_type lastRow = iEnd - 1;
    \n+
    385 if( iEnd != upper.rows() )
    \n+
    386 {
    \n+
    387 DUNE_THROW(ISTLError,"ILU::blockILUBacksolve: lower and upper rows must be the same");
    \n+
    388 }
    \n+
    389
    \n+
    390 // lower triangular solve
    \n+
    391 for( size_type i=0; i<iEnd; ++ i )
    \n+
    392 {
    \n+
    393 dblock rhsValue( d[ i ] );
    \n+
    394 auto&& rhs = Impl::asVector(rhsValue);
    \n+
    395 const size_type rowI = lower.rows_[ i ];
    \n+
    396 const size_type rowINext = lower.rows_[ i+1 ];
    \n+
    397
    \n+
    398 for( size_type col = rowI; col < rowINext; ++ col )
    \n+
    399 Impl::asMatrix(lower.values_[ col ]).mmv( Impl::asVector(v[ lower.cols_[ col ] ] ), rhs );
    \n+
    400
    \n+
    401 Impl::asVector(v[ i ]) = rhs; // Lii = I
    \n+
    402 }
    \n+
    403
    \n+
    404 // upper triangular solve
    \n+
    405 for( size_type i=0; i<iEnd; ++ i )
    \n+
    406 {
    \n+
    407 auto&& vBlock = Impl::asVector(v[ lastRow - i ]);
    \n+
    408 vblock rhsValue ( v[ lastRow - i ] );
    \n+
    409 auto&& rhs = Impl::asVector(rhsValue);
    \n+
    410 const size_type rowI = upper.rows_[ i ];
    \n+
    411 const size_type rowINext = upper.rows_[ i+1 ];
    \n+
    412
    \n+
    413 for( size_type col = rowI; col < rowINext; ++ col )
    \n+
    414 Impl::asMatrix(upper.values_[ col ]).mmv( Impl::asVector(v[ upper.cols_[ col ] ]), rhs );
    \n+
    415
    \n+
    416 // apply inverse and store result
    \n+
    417 Impl::asMatrix(inv[ i ]).mv(rhs, vBlock);
    \n+
    418 }
    \n+
    419 }
    \n+
    \n+
    420
    \n+
    421 } // end namespace ILU
    \n+
    \n+
    422
    \n+
    425} // end namespace
    \n+
    426
    \n+
    427#endif
    \n+\n+
    Col col
    Definition matrixmatrix.hh:351
    \n
    Definition allocator.hh:11
    \n-
    constexpr bool hasUniqueBlockLevel()
    Determine if a vector/matrix has a uniquely determinable block level.
    Definition blocklevel.hh:171
    \n-
    constexpr std::size_t maxBlockLevel()
    Determine the maximum block level of a possibly nested vector/matrix type.
    Definition blocklevel.hh:161
    \n-
    constexpr std::size_t blockLevel()
    Determine the block level of a possibly nested vector/matrix type.
    Definition blocklevel.hh:176
    \n-
    constexpr std::size_t minBlockLevel()
    Determine the minimum block level of a possibly nested vector/matrix type.
    Definition blocklevel.hh:166
    \n+
    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
    \n+
    void blockILUBacksolve(const M &A, X &v, const Y &d)
    LU backsolve with stored inverse.
    Definition ilu.hh:94
    \n+
    M::field_type & firstMatrixElement(M &A, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr)
    Definition ilu.hh:141
    \n+
    void blockILU0Decomposition(M &A)
    compute ILU decomposition of A. A is overwritten by its decomposition
    Definition ilu.hh:33
    \n+
    void blockILUDecomposition(const M &A, int n, M &ILU)
    Definition ilu.hh:167
    \n+
    a simple compressed row storage matrix class
    Definition ilu.hh:259
    \n+
    std::vector< size_type > cols_
    Definition ilu.hh:301
    \n+
    size_type nonZeros() const
    Definition ilu.hh:267
    \n+
    void resize(const size_type nRows)
    Definition ilu.hh:273
    \n+
    size_type rows() const
    Definition ilu.hh:265
    \n+
    CRS()
    Definition ilu.hh:263
    \n+
    void reserveAdditional(const size_type nonZeros)
    Definition ilu.hh:282
    \n+
    B block_type
    Definition ilu.hh:260
    \n+
    std::vector< block_type, Alloc > values_
    Definition ilu.hh:300
    \n+
    size_type nRows_
    Definition ilu.hh:302
    \n+
    size_t size_type
    Definition ilu.hh:261
    \n+
    std::vector< size_type > rows_
    Definition ilu.hh:299
    \n+
    void push_back(const block_type &value, const size_type index)
    Definition ilu.hh:293
    \n+
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    Error when performing an operation on a matrix block.
    Definition istlexception.hh:52
    \n+
    Definition matrixutils.hh:27
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,207 +1,499 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-blocklevel.hh\n+ilu.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5\n-6#ifndef DUNE_ISTL_BLOCKLEVEL_HH\n-7#define DUNE_ISTL_BLOCKLEVEL_HH\n-8\n-9#include \n-10#include \n-11\n-12#include \n-13#include \n-14#include \n-15\n-21// forward declaration\n-22namespace _\bD_\bu_\bn_\be {\n-23template\n-24class MultiTypeBlockVector;\n-25template\n-26class MultiTypeBlockMatrix;\n-27} // end namespace Dune\n-28\n-29namespace _\bD_\bu_\bn_\be { namespace Impl {\n+5#ifndef DUNE_ISTL_ILU_HH\n+6#define DUNE_ISTL_ILU_HH\n+7\n+8#include \n+9#include \n+10#include \n+11#include \n+12\n+13#include \n+14#include \n+15#include \n+16\n+17#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+18\n+23namespace _\bD_\bu_\bn_\be {\n+24\n+_\b2_\b9 namespace ILU {\n 30\n-31// forward declaration\n-32template struct MaxBlockLevel;\n-33template struct MinBlockLevel;\n-34\n-36template typename BlockLevel, typename Op>\n-37constexpr std::size_t blockLevelMultiTypeBlockMatrix(const Op& op)\n-38{\n-39 // inialize with zeroth diagonal block\n-40 using namespace Dune::Indices;\n-41 using Block00 = typename std::decay_t()[_0][_0])>;\n-42 std::size_t _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl = BlockLevel::value() + 1;\n-43 // iterate over all blocks to determine min/max block level\n-44 using namespace Dune::Hybrid;\n-45 forEach(integralRange(index_constant()), [&](auto&& i) {\n-46 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-47 forEach(integralRange(index_constant()), [&](auto&& j) {\n-48 using Block = typename std::decay_t()[i][j])>;\n-49 _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl = op(_\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl, BlockLevel::value() + 1);\n-50 });\n-51 });\n-52 return _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl;\n-53}\n-54\n-56template typename BlockLevel, typename Op>\n-57constexpr std::size_t blockLevelMultiTypeBlockVector(const Op& op)\n-58{\n-59 // inialize with zeroth block\n-60 using namespace Dune::Indices;\n-61 using Block0 = typename std::decay_t()[_0])>;\n-62 std::size_t _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl = BlockLevel::value() + 1;\n-63 // iterate over all blocks to determine min/max block level\n-64 using namespace Dune::Hybrid;\n-65 forEach(integralRange(index_constant()), [&](auto&& i) {\n-66 using Block = typename std::decay_t()[i])>;\n-67 _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl = op(_\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl, BlockLevel::value() + 1);\n-68 });\n-69 return _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl;\n-70}\n-71\n-72template\n-73struct MaxBlockLevel\n-74{\n-75 static constexpr std::size_t value(){\n-76 if constexpr (IsNumber::value)\n-77 return 0;\n-78 else\n-79 return MaxBlockLevel::value() + 1;\n-80 }\n-81};\n-82\n-83template\n-84struct MinBlockLevel\n-85{\n-86 // the default implementation assumes minBlockLevel == maxBlockLevel\n-87 static constexpr std::size_t value()\n-88 { return MaxBlockLevel::value(); }\n-89};\n-90\n-91// max block level for MultiTypeBlockMatrix\n-92template\n-93struct MaxBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockMatrix>\n-94{\n-95 static constexpr std::size_t value()\n-96 {\n-97 using M = MultiTypeBlockMatrix;\n-98 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b);\n-};\n-99 return blockLevelMultiTypeBlockMatrix(max);\n-100 }\n-101};\n-102\n-103// min block level for MultiTypeBlockMatrix\n-104template\n-105struct MinBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockMatrix>\n-106{\n-107 static constexpr std::size_t value()\n-108 {\n-109 using M = MultiTypeBlockMatrix;\n-110 constexpr auto min = [](const auto& a, const auto& b){ return std::min\n-(a,b); };\n-111 return blockLevelMultiTypeBlockMatrix(min);\n-112 }\n-113};\n-114\n-115// max block level for MultiTypeBlockVector\n-116template\n-117struct MaxBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockVector>\n-118{\n-119 static constexpr std::size_t value()\n-120 {\n-121 using V = MultiTypeBlockVector;\n-122 constexpr auto max = [](const auto& a, const auto& b){ return std::max\n-(a,b); };\n-123 return blockLevelMultiTypeBlockVector(max);\n-124 }\n-125};\n-126\n-127// min block level for MultiTypeBlockVector\n-128template\n-129struct MinBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockVector>\n-130{\n-131 static constexpr std::size_t value()\n-132 {\n-133 using V = MultiTypeBlockVector;\n-134 constexpr auto min = [](const auto& a, const auto& b){ return std::min\n-(a,b); };\n-135 return blockLevelMultiTypeBlockVector(min);\n+32 template\n+_\b3_\b3 void _\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn (M& A)\n+34 {\n+35 // iterator types\n+36 typedef typename M::RowIterator rowiterator;\n+37 typedef typename M::ColIterator coliterator;\n+38 typedef typename M::block_type block;\n+39\n+40 // implement left looking variant with stored inverse\n+41 rowiterator endi=A.end();\n+42 for (rowiterator i=A.begin(); i!=endi; ++i)\n+43 {\n+44 // coliterator is diagonal after the following loop\n+45 coliterator endij=(*i).end(); // end of row i\n+46 coliterator ij;\n+47\n+48 // eliminate entries left of diagonal; store L factor\n+49 for (ij=(*i).begin(); ij.index()\n+_\b9_\b4 void _\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n+95 {\n+96 // iterator types\n+97 typedef typename M::ConstRowIterator rowiterator;\n+98 typedef typename M::ConstColIterator coliterator;\n+99 typedef typename Y::block_type dblock;\n+100 typedef typename X::block_type vblock;\n+101\n+102 // lower triangular solve\n+103 rowiterator endi=A.end();\n+104 for (rowiterator i=A.begin(); i!=endi; ++i)\n+105 {\n+106 // We need to be careful here: Directly using\n+107 // auto rhs = Impl::asVector(d[ i.index() ]);\n+108 // is not OK in case this is a proxy. Hence\n+109 // we first have to copy the value. Notice that\n+110 // this is still not OK, if the vector type itself returns\n+111 // proxy references.\n+112 dblock rhsValue(d[i.index()]);\n+113 auto&& rhs = Impl::asVector(rhsValue);\n+114 for (coliterator j=(*i).begin(); j.index()i.index(); --j)\n+133 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);\n+134 auto&& vi = Impl::asVector(v[i.index()]);\n+135 Impl::asMatrix(*j).mv(rhs,vi); // diagonal stores inverse!\n 136 }\n-137};\n+137 }\n 138\n-139// special case: empty MultiTypeBlockVector\n-140template<>\n-141struct MaxBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockVector<>>\n-142{\n-143 static constexpr std::size_t value()\n-144 { return 0; };\n-145};\n+139 // recursive function template to access first entry of a matrix\n+140 template\n+_\b1_\b4_\b1 typename M::field_type& _\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (M& A,\n+142 [[maybe_unused]] typename std::enable_if_t::value>*\n+sfinae = nullptr)\n+143 {\n+144 return _\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt(*(A.begin()->begin()));\n+145 }\n 146\n-147// special case: empty MultiTypeBlockVector\n-148template<>\n-149struct MinBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockVector<>>\n-150{\n-151 static constexpr std::size_t value()\n-152 { return 0; };\n-153};\n-154\n-155}} // end namespace Dune::Impl\n-156\n-157namespace _\bD_\bu_\bn_\be {\n-158\n-160template\n-_\b1_\b6_\b1constexpr std::size_t _\bm_\ba_\bx_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl()\n-162{ return Impl::MaxBlockLevel::value(); }\n-163\n-165template\n-_\b1_\b6_\b6constexpr std::size_t _\bm_\bi_\bn_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl()\n-167{ return Impl::MinBlockLevel::value(); }\n-168\n-170template\n-_\b1_\b7_\b1constexpr bool _\bh_\ba_\bs_\bU_\bn_\bi_\bq_\bu_\be_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl()\n-172{ return maxBlockLevel() == minBlockLevel(); }\n-173\n-175template\n-_\b1_\b7_\b6constexpr std::size_t _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl()\n-177{\n-178 static_assert(hasUniqueBlockLevel(), \"Block level cannot be uniquely\n-determined!\");\n-179 return Impl::MaxBlockLevel::value();\n-180}\n-181\n-182} // end namespace Dune\n-183\n-184#endif\n+147 template\n+_\b1_\b4_\b8 K& _\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (K& A,\n+149 [[maybe_unused]] typename std::enable_if_t::value>*\n+sfinae = nullptr)\n+150 {\n+151 return A;\n+152 }\n+153\n+154 template\n+_\b1_\b5_\b5 K& _\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b,_\bm_\b>& A)\n+156 {\n+157 return A[0][0];\n+158 }\n+159\n+166 template\n+_\b1_\b6_\b7 void _\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn (const M& A, int n, M& ILU)\n+168 {\n+169 // iterator types\n+170 typedef typename M::ColIterator coliterator;\n+171 typedef typename M::ConstRowIterator crowiterator;\n+172 typedef typename M::ConstColIterator ccoliterator;\n+173 typedef typename M::CreateIterator createiterator;\n+174 typedef typename M::field_type K;\n+175 typedef std::map map;\n+176 typedef typename map::iterator mapiterator;\n+177\n+178 // symbolic factorization phase, store generation number in first matrix\n+element\n+179 crowiterator endi=A.end();\n+180 createiterator ci=ILU.createbegin();\n+181 for (crowiterator i=A.begin(); i!=endi; ++i)\n+182 {\n+183 map rowpattern; // maps column index to generation\n+184\n+185 // initialize pattern with row of A\n+186 for (ccoliterator j=(*i).begin(); j!=(*i).end(); ++j)\n+187 rowpattern[j.index()] = 0;\n+188\n+189 // eliminate entries in row which are to the left of the diagonal\n+190 for (mapiterator ik=rowpattern.begin(); (*ik).first) rowpattern\n+[ILUij.index()];\n+223 }\n+224\n+225 // copy entries of A\n+226 for (crowiterator i=A.begin(); i!=endi; ++i)\n+227 {\n+228 coliterator ILUij;\n+229 coliterator endILUij = ILU[i.index()].end();;\n+230 for (ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)\n+231 (*ILUij) = 0; // clear row\n+232 ccoliterator Aij = (*i).begin();\n+233 ccoliterator endAij = (*i).end();\n+234 ILUij = ILU[i.index()].begin();\n+235 while (Aij!=endAij && ILUij!=endILUij)\n+236 {\n+237 if (Aij.index()==ILUij.index())\n+238 {\n+239 *ILUij = *Aij;\n+240 ++Aij; ++ILUij;\n+241 }\n+242 else\n+243 {\n+244 if (Aij.index()>\n+_\b2_\b5_\b8 struct _\bC_\bR_\bS\n+259 {\n+_\b2_\b6_\b0 typedef B _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+_\b2_\b6_\b1 typedef size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+262\n+_\b2_\b6_\b3 _\bC_\bR_\bS() : _\bn_\bR_\bo_\bw_\bs_\b_( 0 ) {}\n+264\n+_\b2_\b6_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bs() const { return _\bn_\bR_\bo_\bw_\bs_\b_; }\n+266\n+_\b2_\b6_\b7 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn_\bo_\bn_\bZ_\be_\br_\bo_\bs() const\n+268 {\n+269 assert( _\br_\bo_\bw_\bs_\b_[ _\br_\bo_\bw_\bs() ] != _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be(-1) );\n+270 return _\br_\bo_\bw_\bs_\b_[ _\br_\bo_\bw_\bs() ];\n+271 }\n+272\n+_\b2_\b7_\b3 void _\br_\be_\bs_\bi_\bz_\be( const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nRows )\n+274 {\n+275 if( _\bn_\bR_\bo_\bw_\bs_\b_ != nRows )\n+276 {\n+277 _\bn_\bR_\bo_\bw_\bs_\b_ = nRows ;\n+278 _\br_\bo_\bw_\bs_\b_.resize( _\bn_\bR_\bo_\bw_\bs_\b_+1, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be(-1) );\n+279 }\n+280 }\n+281\n+_\b2_\b8_\b2 void _\br_\be_\bs_\be_\br_\bv_\be_\bA_\bd_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl( const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn_\bo_\bn_\bZ_\be_\br_\bo_\bs )\n+283 {\n+284 const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be needed = _\bv_\ba_\bl_\bu_\be_\bs_\b_.size() + _\bn_\bo_\bn_\bZ_\be_\br_\bo_\bs ;\n+285 if( _\bv_\ba_\bl_\bu_\be_\bs_\b_.capacity() < needed )\n+286 {\n+287 const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be estimate = needed * 1.1;\n+288 _\bv_\ba_\bl_\bu_\be_\bs_\b_.reserve( estimate );\n+289 _\bc_\bo_\bl_\bs_\b_.reserve( estimate );\n+290 }\n+291 }\n+292\n+_\b2_\b9_\b3 void _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk( const _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& value, const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be index )\n+294 {\n+295 _\bv_\ba_\bl_\bu_\be_\bs_\b_.push_back( value );\n+296 _\bc_\bo_\bl_\bs_\b_.push_back( index );\n+297 }\n+298\n+_\b2_\b9_\b9 std::vector< size_type > _\br_\bo_\bw_\bs_\b_;\n+_\b3_\b0_\b0 std::vector< block_type, Alloc> _\bv_\ba_\bl_\bu_\be_\bs_\b_;\n+_\b3_\b0_\b1 std::vector< size_type > _\bc_\bo_\bl_\bs_\b_;\n+_\b3_\b0_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn_\bR_\bo_\bw_\bs_\b_;\n+303 };\n+304\n+306 template\n+_\b3_\b0_\b7 void _\bc_\bo_\bn_\bv_\be_\br_\bt_\bT_\bo_\bC_\bR_\bS(const M& A, _\bC_\bR_\bS& lower, _\bC_\bR_\bS& upper, InvVector& inv )\n+308 {\n+309 typedef typename M :: size_type size_type;\n+310\n+311 lower._\br_\be_\bs_\bi_\bz_\be( A.N() );\n+312 upper._\br_\be_\bs_\bi_\bz_\be( A.N() );\n+313 inv.resize( A.N() );\n+314\n+315 // lower and upper triangular should store half of non zeros minus diagonal\n+316 const size_t memEstimate = (A.nonzeroes() - A.N())/2;\n+317\n+318 assert( A.nonzeroes() != 0 );\n+319 lower._\br_\be_\bs_\be_\br_\bv_\be_\bA_\bd_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl( memEstimate );\n+320 upper._\br_\be_\bs_\be_\br_\bv_\be_\bA_\bd_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl( memEstimate );\n+321\n+322 const auto endi = A.end();\n+323 size_type row = 0;\n+324 size_type colcount = 0;\n+325 lower._\br_\bo_\bw_\bs_\b_[ 0 ] = colcount;\n+326 for (auto i=A.begin(); i!=endi; ++i, ++row)\n+327 {\n+328 const size_type iIndex = i.index();\n+329\n+330 // store entries left of diagonal\n+331 for (auto j=(*i).begin(); j.index() < iIndex; ++j )\n+332 {\n+333 lower._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk( (*j), j.index() );\n+334 ++colcount;\n+335 }\n+336 lower._\br_\bo_\bw_\bs_\b_[ iIndex+1 ] = colcount;\n+337 }\n+338\n+339 const auto rendi = A.beforeBegin();\n+340 row = 0;\n+341 colcount = 0;\n+342 upper._\br_\bo_\bw_\bs_\b_[ 0 ] = colcount ;\n+343\n+344 // NOTE: upper and inv store entries in reverse row and col order,\n+345 // reverse here relative to ILU\n+346 for (auto i=A.beforeEnd(); i!=rendi; --i, ++ row )\n+347 {\n+348 const auto endij=(*i).beforeBegin(); // end of row i\n+349\n+350 const size_type iIndex = i.index();\n+351\n+352 // store in reverse row order for faster access during backsolve\n+353 for (auto j=(*i).beforeEnd(); j != endij; --j )\n+354 {\n+355 const size_type jIndex = j.index();\n+356 if( j.index() == iIndex )\n+357 {\n+358 inv[ row ] = (*j);\n+359 break; // assuming consecutive ordering of A\n+360 }\n+361 else if ( j.index() >= i.index() )\n+362 {\n+363 upper._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk( (*j), jIndex );\n+364 ++colcount ;\n+365 }\n+366 }\n+367 upper._\br_\bo_\bw_\bs_\b_[ row+1 ] = colcount;\n+368 }\n+369 } // end convertToCRS\n+370\n+372 template\n+_\b3_\b7_\b3 void _\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const _\bC_\bR_\bS& lower,\n+374 const _\bC_\bR_\bS& upper,\n+375 const InvVector& inv,\n+376 X& v, const Y& d)\n+377 {\n+378 // iterator types\n+379 typedef typename Y :: block_type dblock;\n+380 typedef typename X :: block_type vblock;\n+381 typedef typename X :: size_type size_type ;\n+382\n+383 const size_type iEnd = lower._\br_\bo_\bw_\bs();\n+384 const size_type lastRow = iEnd - 1;\n+385 if( iEnd != upper._\br_\bo_\bw_\bs() )\n+386 {\n+387 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"ILU::blockILUBacksolve: lower and upper rows must be\n+the same\");\n+388 }\n+389\n+390 // lower triangular solve\n+391 for( size_type i=0; i::value > *sfinae=nullptr)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:141\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+void blockILU0Decomposition(M &A)\n+compute ILU decomposition of A. A is overwritten by its decomposition\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+void blockILUDecomposition(const M &A, int n, M &ILU)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:167\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS\n+a simple compressed row storage matrix class\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:259\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bc_\bo_\bl_\bs_\b_\n+std::vector< size_type > cols_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bn_\bo_\bn_\bZ_\be_\br_\bo_\bs\n+size_type nonZeros() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:267\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(const size_type nRows)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:273\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\br_\bo_\bw_\bs\n+size_type rows() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:265\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bC_\bR_\bS\n+CRS()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:263\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\br_\be_\bs_\be_\br_\bv_\be_\bA_\bd_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl\n+void reserveAdditional(const size_type nonZeros)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:282\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+B block_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:260\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bv_\ba_\bl_\bu_\be_\bs_\b_\n+std::vector< block_type, Alloc > values_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:300\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bn_\bR_\bo_\bw_\bs_\b_\n+size_type nRows_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:302\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+size_t size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:261\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\br_\bo_\bw_\bs_\b_\n+std::vector< size_type > rows_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n+void push_back(const block_type &value, const size_type index)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+derive error class from the base class in common\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br\n+Error when performing an operation on a matrix block.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00035.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00035.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: bccsmatrix.hh File Reference\n+dune-istl: matrixmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -70,31 +70,70 @@\n
    \n \n
    \n
    \n
    \n \n-
    bccsmatrix.hh File Reference
    \n+Classes |\n+Namespaces |\n+Functions
    \n+ \n \n
    \n-
    #include <dune/common/fmatrix.hh>
    \n-#include <dune/common/fvector.hh>
    \n-#include <dune/common/typetraits.hh>
    \n+\n+

    provides functions for sparse matrix matrix multiplication. \n+More...

    \n+
    #include <tuple>
    \n+#include <dune/istl/bcrsmatrix.hh>
    \n+#include <dune/common/fmatrix.hh>
    \n+#include <dune/common/timer.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Classes

    struct  Dune::MatMultMatResult< M1, M2 >
     Helper TMP to get the result type of a sparse matrix matrix multiplication ( \"$C=A*B$\") More...
     
    struct  Dune::MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >
     
    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 > >
     
    \n \n \n \n-\n-\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::ISTL
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+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$\").
     
    \n-
    \n+

    Detailed Description

    \n+

    provides functions for sparse matrix matrix multiplication.

    \n+
    Author
    Markus Blatt
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,19 +1,66 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-bccsmatrix.hh File Reference\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+matrixmatrix.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bS_\bp_\ba_\br_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bc_\bl_\ba_\bs_\bs_\be_\bs\n+provides functions for sparse matrix matrix multiplication. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n #include \n-#include \n-#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bM_\b1_\b,_\b _\bM_\b2_\b _\b>\n+\u00a0 Helper TMP to get the result type of a sparse matrix matrix\n+ multiplication ( [$C=A*B$]) _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bk_\b _\b>_\b,_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bk_\b _\b>_\b,_\b _\bA_\b _\b>_\b,\n+ _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b1_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bM_\b1_\b,_\b _\bM_\b2_\b _\b>\n+\u00a0 Helper TMP to get the result type of a sparse matrix matrix\n+ multiplication ( [$C=A*B$]) _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bn_\b _\b>_\b,_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<\n+ _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bn_\b _\b>_\b,\n+ _\bA_\b _\b>_\b,_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b1_\b _\b>_\b _\b>\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt (_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, n, k >, A > &res,\n+ const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, n, m >, A1 > &_\bm_\ba_\bt, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, k, m >, A2 > &matt, bool tryHard=false)\n+\u00a0 Calculate product of a sparse matrix with a transposed sparse matrices (\n+ [$C=A*B^T$]).\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt (_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, n, m >, A > &res, const\n+ _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, n, k >, A1 > &_\bm_\ba_\bt, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, k, m >, A2 > &matt, bool tryHard=false)\n+\u00a0 Calculate product of two sparse matrices ( [$C=A*B$]).\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt (_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, n, m >, A > &res,\n+ const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, k, n >, A1 > &_\bm_\ba_\bt, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, k, m >, A2 > &matt, bool tryHard=false)\n+\u00a0 Calculate product of a transposed sparse matrix with another sparse\n+ matrices ( [$C=A^T*B$]).\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+provides functions for sparse matrix matrix multiplication.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00035_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00035_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: bccsmatrix.hh Source File\n+dune-istl: matrixmatrix.hh Source File\n \n \n \n \n \n \n \n@@ -74,131 +74,622 @@\n \n
    \n \n
    \n \n
    \n-
    bccsmatrix.hh
    \n+
    matrixmatrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_BCCSMATRIX_HH
    \n-
    6#define DUNE_ISTL_BCCSMATRIX_HH
    \n+
    5#ifndef DUNE_ISTL_MATRIXMATRIX_HH
    \n+
    6#define DUNE_ISTL_MATRIXMATRIX_HH
    \n
    7
    \n-
    8#include <dune/common/fmatrix.hh>
    \n-
    9#include <dune/common/fvector.hh>
    \n-
    10#include <dune/common/typetraits.hh>
    \n-
    11
    \n-
    \n-
    12namespace Dune::ISTL::Impl
    \n-
    13{
    \n-
    27 template<class B, class I = typename std::allocator<B>::size_type>
    \n-
    28 class BCCSMatrix
    \n-
    29 {
    \n-
    30 public:
    \n-
    31 using Index = I;
    \n-
    32 using size_type = std::size_t;
    \n-
    33
    \n-
    36 BCCSMatrix()
    \n-
    37 : N_(0), M_(0), Nnz_(0), values(0), rowindex(0), colstart(0)
    \n-
    38 {}
    \n-
    39
    \n-
    41 ~BCCSMatrix()
    \n-
    42 {
    \n-
    43 if(N_+M_+Nnz_!=0)
    \n-
    44 free();
    \n-
    45 }
    \n-
    46
    \n-
    48 void setSize(size_type rows, size_type columns)
    \n-
    49 {
    \n-
    50 N_ = rows;
    \n-
    51 M_ = columns;
    \n-
    52 }
    \n-
    53
    \n-
    58 size_type N() const
    \n-
    59 {
    \n-
    60 return N_;
    \n-
    61 }
    \n-
    62
    \n-
    64 size_type nonzeroes() const
    \n-
    65 {
    \n-
    66 return Nnz_;
    \n-
    67 }
    \n-
    68
    \n-
    73 size_type M() const
    \n-
    74 {
    \n-
    75 return M_;
    \n-
    76 }
    \n-
    77
    \n-
    84 B* getValues() const
    \n-
    85 {
    \n-
    86 return values;
    \n-
    87 }
    \n-
    88
    \n-
    95 Index* getRowIndex() const
    \n-
    96 {
    \n-
    97 return rowindex;
    \n-
    98 }
    \n-
    99
    \n-
    106 Index* getColStart() const
    \n-
    107 {
    \n-
    108 return colstart;
    \n-
    109 }
    \n-
    110
    \n-
    112 BCCSMatrix& operator=(const BCCSMatrix& mat)
    \n-
    113 {
    \n-
    114 if(N_+M_+Nnz_!=0)
    \n-
    115 free();
    \n-
    116 N_=mat.N_;
    \n-
    117 M_=mat.M_;
    \n-
    118 Nnz_= mat.Nnz_;
    \n-
    119 if(M_>0) {
    \n-
    120 colstart=new size_type[M_+1];
    \n-
    121 for(size_type i=0; i<=M_; ++i)
    \n-
    122 colstart[i]=mat.colstart[i];
    \n-
    123 }
    \n-
    124
    \n-
    125 if(Nnz_>0) {
    \n-
    126 values = new B[Nnz_];
    \n-
    127 rowindex = new size_type[Nnz_];
    \n-
    128
    \n-
    129 for(size_type i=0; i<Nnz_; ++i)
    \n-
    130 values[i]=mat.values[i];
    \n-
    131
    \n-
    132 for(size_type i=0; i<Nnz_; ++i)
    \n-
    133 rowindex[i]=mat.rowindex[i];
    \n-
    134 }
    \n-
    135 return *this;
    \n-
    136 }
    \n-
    137
    \n-
    139 virtual void free()
    \n-
    140 {
    \n-
    141 delete[] values;
    \n-
    142 delete[] rowindex;
    \n-
    143 delete[] colstart;
    \n-
    144 N_ = 0;
    \n-
    145 M_ = 0;
    \n-
    146 Nnz_ = 0;
    \n-
    147 }
    \n+
    8#include <tuple>
    \n+
    9
    \n+\n+
    11#include <dune/common/fmatrix.hh>
    \n+
    12#include <dune/common/timer.hh>
    \n+
    13namespace Dune
    \n+
    14{
    \n+
    15
    \n+
    26 namespace
    \n+
    27 {
    \n+
    28
    \n+
    37 template<int b>
    \n+
    38 struct NonzeroPatternTraverser
    \n+
    39 {};
    \n+
    40
    \n+
    41
    \n+
    42 template<>
    \n+
    43 struct NonzeroPatternTraverser<0>
    \n+
    44 {
    \n+
    45 template<class T,class A1, class A2, class F, int n, int m, int k>
    \n+
    46 static void traverse(const Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>& A,
    \n+\n+
    48 F& func)
    \n+
    49 {
    \n+
    50 if(A.M()!=B.N())
    \n+
    51 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<A.M()<<"!="<<B.N());
    \n+
    52
    \n+
    53 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>::ConstRowIterator Row;
    \n+
    54 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>::ConstColIterator Col;
    \n+
    55 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>::ConstColIterator BCol;
    \n+
    56 for(Row row= A.begin(); row != A.end(); ++row) {
    \n+
    57 // Loop over all column entries
    \n+
    58 for(Col col = row->begin(); col != row->end(); ++col) {
    \n+
    59 // entry at i,k
    \n+
    60 // search for all nonzeros in row k
    \n+
    61 for(BCol bcol = B[col.index()].begin(); bcol != B[col.index()].end(); ++bcol) {
    \n+
    62 func(*col, *bcol, row.index(), bcol.index());
    \n+
    63 }
    \n+
    64 }
    \n+
    65 }
    \n+
    66 }
    \n+
    67
    \n+
    68 };
    \n+
    69
    \n+
    70 template<>
    \n+
    71 struct NonzeroPatternTraverser<1>
    \n+
    72 {
    \n+
    73 template<class T, class A1, class A2, class F, int n, int m, int k>
    \n+
    74 static void traverse(const Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>& A,
    \n+\n+
    76 F& func)
    \n+
    77 {
    \n+
    78
    \n+
    79 if(A.N()!=B.N())
    \n+
    80 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<A.N()<<"!="<<B.N());
    \n+
    81
    \n+
    82 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>::ConstRowIterator Row;
    \n+
    83 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>::ConstColIterator Col;
    \n+
    84 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>::ConstColIterator BCol;
    \n+
    85
    \n+
    86 for(Row row=A.begin(); row!=A.end(); ++row) {
    \n+
    87 for(Col col=row->begin(); col!=row->end(); ++col) {
    \n+
    88 for(BCol bcol = B[row.index()].begin(); bcol != B[row.index()].end(); ++bcol) {
    \n+
    89 func(*col, *bcol, col.index(), bcol.index());
    \n+
    90 }
    \n+
    91 }
    \n+
    92 }
    \n+
    93 }
    \n+
    94 };
    \n+
    95
    \n+
    96 template<>
    \n+
    97 struct NonzeroPatternTraverser<2>
    \n+
    98 {
    \n+
    99 template<class T, class A1, class A2, class F, int n, int m, int k>
    \n+
    100 static void traverse(const BCRSMatrix<FieldMatrix<T,n,m>,A1>& mat,
    \n+
    101 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt,
    \n+
    102 F& func)
    \n+
    103 {
    \n+
    104 if(mat.M()!=matt.M())
    \n+
    105 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<mat.M()<<"!="<<matt.M());
    \n+
    106
    \n+
    107 typedef typename BCRSMatrix<FieldMatrix<T,n,m>,A1>::ConstRowIterator row_iterator;
    \n+
    108 typedef typename BCRSMatrix<FieldMatrix<T,n,m>,A1>::ConstColIterator col_iterator;
    \n+
    109 typedef typename BCRSMatrix<FieldMatrix<T,k,m>,A2>::ConstRowIterator row_iterator_t;
    \n+
    110 typedef typename BCRSMatrix<FieldMatrix<T,k,m>,A2>::ConstColIterator col_iterator_t;
    \n+
    111
    \n+
    112 for(row_iterator mrow=mat.begin(); mrow != mat.end(); ++mrow) {
    \n+
    113 //iterate over the column entries
    \n+
    114 // mt is a transposed matrix crs therefore it is treated as a ccs matrix
    \n+
    115 // and the row_iterator iterates over the columns of the transposed matrix.
    \n+
    116 // search the row of the transposed matrix for an entry with the same index
    \n+
    117 // as the mcol iterator
    \n+
    118
    \n+
    119 for(row_iterator_t mtcol=matt.begin(); mtcol != matt.end(); ++mtcol) {
    \n+
    120 //Search for col entries in mat that have a corresponding row index in matt
    \n+
    121 // (i.e. corresponding col index in the as this is the transposed matrix
    \n+
    122 col_iterator_t mtrow=mtcol->begin();
    \n+
    123 bool funcCalled = false;
    \n+
    124 for(col_iterator mcol=mrow->begin(); mcol != mrow->end(); ++mcol) {
    \n+
    125 // search
    \n+
    126 // TODO: This should probably be substituted by a binary search
    \n+
    127 for( ; mtrow != mtcol->end(); ++mtrow)
    \n+
    128 if(mtrow.index()>=mcol.index())
    \n+
    129 break;
    \n+
    130 if(mtrow != mtcol->end() && mtrow.index()==mcol.index()) {
    \n+
    131 func(*mcol, *mtrow, mtcol.index());
    \n+
    132 funcCalled = true;
    \n+
    133 // In some cases we only search for one pair, then we break here
    \n+
    134 // and continue with the next column.
    \n+
    135 if(F::do_break)
    \n+
    136 break;
    \n+
    137 }
    \n+
    138 }
    \n+
    139 // move on with func only if func was called, otherwise they might
    \n+
    140 // get out of sync
    \n+
    141 if (funcCalled)
    \n+
    142 func.nextCol();
    \n+
    143 }
    \n+
    144 func.nextRow();
    \n+
    145 }
    \n+
    146 }
    \n+
    147 };
    \n
    148
    \n-
    149 public:
    \n-
    150 size_type N_, M_, Nnz_;
    \n-
    151 B* values;
    \n-
    152 Index* rowindex;
    \n-
    153 Index* colstart;
    \n-
    154 };
    \n-
    155
    \n-
    156}
    \n+
    149
    \n+
    150
    \n+
    151 template<class T, class A, int n, int m>
    \n+
    152 class SparsityPatternInitializer
    \n+
    153 {
    \n+
    154 public:
    \n+
    155 enum {do_break=true};
    \n+\n+\n+
    158
    \n+
    159 SparsityPatternInitializer(CreateIterator iter)
    \n+
    160 : rowiter(iter)
    \n+
    161 {}
    \n+
    162
    \n+
    163 template<class T1, class T2>
    \n+
    164 void operator()(const T1&, const T2&, size_type j)
    \n+
    165 {
    \n+
    166 rowiter.insert(j);
    \n+
    167 }
    \n+
    168
    \n+
    169 void nextRow()
    \n+
    170 {
    \n+
    171 ++rowiter;
    \n+
    172 }
    \n+
    173 void nextCol()
    \n+
    174 {}
    \n+
    175
    \n+
    176 private:
    \n+
    177 CreateIterator rowiter;
    \n+
    178 };
    \n+
    179
    \n+
    180
    \n+
    181 template<int transpose, class T, class TA, int n, int m>
    \n+
    182 class MatrixInitializer
    \n+
    183 {
    \n+
    184 public:
    \n+
    185 enum {do_break=true};
    \n+\n+\n+
    188 typedef typename Matrix::size_type size_type;
    \n+
    189
    \n+
    190 MatrixInitializer(Matrix& A_, size_type)
    \n+
    191 : count(0), A(A_)
    \n+
    192 {}
    \n+
    193 template<class T1, class T2>
    \n+
    194 void operator()(const T1&, const T2&, int)
    \n+
    195 {
    \n+
    196 ++count;
    \n+
    197 }
    \n+
    198
    \n+
    199 void nextCol()
    \n+
    200 {}
    \n+
    201
    \n+
    202 void nextRow()
    \n+
    203 {}
    \n+
    204
    \n+
    205 std::size_t nonzeros()
    \n+
    206 {
    \n+
    207 return count;
    \n+
    208 }
    \n+
    209
    \n+
    210 template<class A1, class A2, int n2, int m2, int n3, int m3>
    \n+
    211 void initPattern(const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>& mat1,
    \n+
    212 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>& mat2)
    \n+
    213 {
    \n+
    214 SparsityPatternInitializer<T, TA, n, m> sparsity(A.createbegin());
    \n+
    215 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,sparsity);
    \n+
    216 }
    \n+
    217
    \n+
    218 private:
    \n+
    219 std::size_t count;
    \n+
    220 Matrix& A;
    \n+
    221 };
    \n+
    222
    \n+
    223 template<class T, class TA, int n, int m>
    \n+
    224 class MatrixInitializer<1,T,TA,n,m>
    \n+
    225 {
    \n+
    226 public:
    \n+
    227 enum {do_break=false};
    \n+\n+\n+
    230 typedef typename Matrix::size_type size_type;
    \n+
    231
    \n+
    232 MatrixInitializer(Matrix& A_, size_type rows)
    \n+
    233 : A(A_), entries(rows)
    \n+
    234 {}
    \n+
    235
    \n+
    236 template<class T1, class T2>
    \n+
    237 void operator()(const T1&, const T2&, size_type i, size_type j)
    \n+
    238 {
    \n+
    239 entries[i].insert(j);
    \n+
    240 }
    \n+
    241
    \n+
    242 void nextCol()
    \n+
    243 {}
    \n+
    244
    \n+
    245 size_type nonzeros()
    \n+
    246 {
    \n+
    247 size_type nnz=0;
    \n+
    248 typedef typename std::vector<std::set<size_t> >::const_iterator Iter;
    \n+
    249 for(Iter iter = entries.begin(); iter != entries.end(); ++iter)
    \n+
    250 nnz+=(*iter).size();
    \n+
    251 return nnz;
    \n+
    252 }
    \n+
    253 template<class A1, class A2, int n2, int m2, int n3, int m3>
    \n+
    254 void initPattern(const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>&,
    \n+
    255 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>&)
    \n+
    256 {
    \n+
    257 typedef typename std::vector<std::set<size_t> >::const_iterator Iter;
    \n+
    258 CreateIterator citer = A.createbegin();
    \n+
    259 for(Iter iter = entries.begin(); iter != entries.end(); ++iter, ++citer) {
    \n+
    260 typedef std::set<size_t>::const_iterator SetIter;
    \n+
    261 for(SetIter index=iter->begin(); index != iter->end(); ++index)
    \n+
    262 citer.insert(*index);
    \n+
    263 }
    \n+
    264 }
    \n+
    265
    \n+
    266 private:
    \n+
    267 Matrix& A;
    \n+
    268 std::vector<std::set<size_t> > entries;
    \n+
    269 };
    \n+
    270
    \n+
    271 template<class T, class TA, int n, int m>
    \n+
    272 struct MatrixInitializer<0,T,TA,n,m>
    \n+
    273 : public MatrixInitializer<1,T,TA,n,m>
    \n+
    274 {
    \n+
    275 MatrixInitializer(Dune::BCRSMatrix<Dune::FieldMatrix<T,n,m>,TA>& A_,
    \n+\n+
    277 : MatrixInitializer<1,T,TA,n,m>(A_,rows)
    \n+
    278 {}
    \n+
    279 };
    \n+
    280
    \n+
    281
    \n+
    282 template<class T, class T1, class T2, int n, int m, int k>
    \n+
    283 void addMatMultTransposeMat(FieldMatrix<T,n,k>& res, const FieldMatrix<T1,n,m>& mat,
    \n+
    284 const FieldMatrix<T2,k,m>& matt)
    \n+
    285 {
    \n+
    286 typedef typename FieldMatrix<T,n,k>::size_type size_type;
    \n+
    287
    \n+
    288 for(size_type row=0; row<n; ++row)
    \n+
    289 for(size_type col=0; col<k; ++col) {
    \n+
    290 for(size_type i=0; i < m; ++i)
    \n+
    291 res[row][col]+=mat[row][i]*matt[col][i];
    \n+
    292 }
    \n+
    293 }
    \n+
    294
    \n+
    295 template<class T, class T1, class T2, int n, int m, int k>
    \n+
    296 void addTransposeMatMultMat(FieldMatrix<T,n,k>& res, const FieldMatrix<T1,m,n>& mat,
    \n+
    297 const FieldMatrix<T2,m,k>& matt)
    \n+
    298 {
    \n+
    299 typedef typename FieldMatrix<T,n,k>::size_type size_type;
    \n+
    300 for(size_type i=0; i<m; ++i)
    \n+
    301 for(size_type row=0; row<n; ++row) {
    \n+
    302 for(size_type col=0; col < k; ++col)
    \n+
    303 res[row][col]+=mat[i][row]*matt[i][col];
    \n+
    304 }
    \n+
    305 }
    \n+
    306
    \n+
    307 template<class T, class T1, class T2, int n, int m, int k>
    \n+
    308 void addMatMultMat(FieldMatrix<T,n,m>& res, const FieldMatrix<T1,n,k>& mat,
    \n+
    309 const FieldMatrix<T2,k,m>& matt)
    \n+
    310 {
    \n+
    311 typedef typename FieldMatrix<T,n,k>::size_type size_type;
    \n+
    312 for(size_type row=0; row<n; ++row)
    \n+
    313 for(size_type col=0; col<m; ++col) {
    \n+
    314 for(size_type i=0; i < k; ++i)
    \n+
    315 res[row][col]+=mat[row][i]*matt[i][col];
    \n+
    316 }
    \n+
    317 }
    \n+
    318
    \n+
    319
    \n+
    320 template<class T, class A, int n, int m>
    \n+
    321 class EntryAccumulatorFather
    \n+
    322 {
    \n+
    323 public:
    \n+
    324 enum {do_break=false};
    \n+\n+
    326 typedef typename Matrix::RowIterator Row;
    \n+
    327 typedef typename Matrix::ColIterator Col;
    \n+
    328
    \n+
    329 EntryAccumulatorFather(Matrix& mat_)
    \n+
    330 : mat(mat_), row(mat.begin())
    \n+
    331 {
    \n+
    332 mat=0;
    \n+
    333 col=row->begin();
    \n+
    334 }
    \n+
    335 void nextRow()
    \n+
    336 {
    \n+
    337 ++row;
    \n+
    338 if(row!=mat.end())
    \n+
    339 col=row->begin();
    \n+
    340 }
    \n+
    341
    \n+
    342 void nextCol()
    \n+
    343 {
    \n+
    344 ++this->col;
    \n+
    345 }
    \n+
    346 protected:
    \n+
    347 Matrix& mat;
    \n+
    348 private:
    \n+
    349 Row row;
    \n+
    350 protected:
    \n+\n+
    352 };
    \n+
    353
    \n+
    354 template<class T, class A, int n, int m, int transpose>
    \n+
    355 class EntryAccumulator
    \n+
    356 : public EntryAccumulatorFather<T,A,n,m>
    \n+
    357 {
    \n+
    358 public:
    \n+\n+
    360 typedef typename Matrix::size_type size_type;
    \n+
    361
    \n+
    362 EntryAccumulator(Matrix& mat_)
    \n+
    363 : EntryAccumulatorFather<T,A,n,m>(mat_)
    \n+
    364 {}
    \n+
    365
    \n+
    366 template<class T1, class T2>
    \n+
    367 void operator()(const T1& t1, const T2& t2, size_type i)
    \n+
    368 {
    \n+
    369 assert(this->col.index()==i);
    \n+
    370 addMatMultMat(*(this->col),t1,t2);
    \n+
    371 }
    \n+
    372 };
    \n+
    373
    \n+
    374 template<class T, class A, int n, int m>
    \n+
    375 class EntryAccumulator<T,A,n,m,0>
    \n+
    376 : public EntryAccumulatorFather<T,A,n,m>
    \n+
    377 {
    \n+
    378 public:
    \n+\n+
    380 typedef typename Matrix::size_type size_type;
    \n+
    381
    \n+
    382 EntryAccumulator(Matrix& mat_)
    \n+
    383 : EntryAccumulatorFather<T,A,n,m>(mat_)
    \n+
    384 {}
    \n+
    385
    \n+
    386 template<class T1, class T2>
    \n+
    387 void operator()(const T1& t1, const T2& t2, size_type i, size_type j)
    \n+
    388 {
    \n+
    389 addMatMultMat(this->mat[i][j], t1, t2);
    \n+
    390 }
    \n+
    391 };
    \n+
    392
    \n+
    393 template<class T, class A, int n, int m>
    \n+
    394 class EntryAccumulator<T,A,n,m,1>
    \n+
    395 : public EntryAccumulatorFather<T,A,n,m>
    \n+
    396 {
    \n+
    397 public:
    \n+\n+
    399 typedef typename Matrix::size_type size_type;
    \n+
    400
    \n+
    401 EntryAccumulator(Matrix& mat_)
    \n+
    402 : EntryAccumulatorFather<T,A,n,m>(mat_)
    \n+
    403 {}
    \n+
    404
    \n+
    405 template<class T1, class T2>
    \n+
    406 void operator()(const T1& t1, const T2& t2, size_type i, size_type j)
    \n+
    407 {
    \n+
    408 addTransposeMatMultMat(this->mat[i][j], t1, t2);
    \n+
    409 }
    \n+
    410 };
    \n+
    411
    \n+
    412 template<class T, class A, int n, int m>
    \n+
    413 class EntryAccumulator<T,A,n,m,2>
    \n+
    414 : public EntryAccumulatorFather<T,A,n,m>
    \n+
    415 {
    \n+
    416 public:
    \n+\n+
    418 typedef typename Matrix::size_type size_type;
    \n+
    419
    \n+
    420 EntryAccumulator(Matrix& mat_)
    \n+
    421 : EntryAccumulatorFather<T,A,n,m>(mat_)
    \n+
    422 {}
    \n+
    423
    \n+
    424 template<class T1, class T2>
    \n+
    425 void operator()(const T1& t1, const T2& t2, [[maybe_unused]] size_type i)
    \n+
    426 {
    \n+
    427 assert(this->col.index()==i);
    \n+
    428 addMatMultTransposeMat(*this->col,t1,t2);
    \n+
    429 }
    \n+
    430 };
    \n+
    431
    \n+
    432
    \n+
    433 template<int transpose>
    \n+
    434 struct SizeSelector
    \n+
    435 {};
    \n+
    436
    \n+
    437 template<>
    \n+
    438 struct SizeSelector<0>
    \n+
    439 {
    \n+
    440 template<class M1, class M2>
    \n+
    441 static std::tuple<typename M1::size_type, typename M2::size_type>
    \n+
    442 size(const M1& m1, const M2& m2)
    \n+
    443 {
    \n+
    444 return std::make_tuple(m1.N(), m2.M());
    \n+
    445 }
    \n+
    446 };
    \n+
    447
    \n+
    448 template<>
    \n+
    449 struct SizeSelector<1>
    \n+
    450 {
    \n+
    451 template<class M1, class M2>
    \n+
    452 static std::tuple<typename M1::size_type, typename M2::size_type>
    \n+
    453 size(const M1& m1, const M2& m2)
    \n+
    454 {
    \n+
    455 return std::make_tuple(m1.M(), m2.M());
    \n+
    456 }
    \n+
    457 };
    \n+
    458
    \n+
    459
    \n+
    460 template<>
    \n+
    461 struct SizeSelector<2>
    \n+
    462 {
    \n+
    463 template<class M1, class M2>
    \n+
    464 static std::tuple<typename M1::size_type, typename M2::size_type>
    \n+
    465 size(const M1& m1, const M2& m2)
    \n+
    466 {
    \n+
    467 return std::make_tuple(m1.N(), m2.N());
    \n+
    468 }
    \n+
    469 };
    \n+
    470
    \n+
    471 template<int transpose, class T, class A, class A1, class A2, int n1, int m1, int n2, int m2, int n3, int m3>
    \n+
    472 void matMultMat(BCRSMatrix<FieldMatrix<T,n1,m1>,A>& res, const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>& mat1,
    \n+
    473 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>& mat2)
    \n+
    474 {
    \n+
    475 // First step is to count the number of nonzeros
    \n+
    476 typename BCRSMatrix<FieldMatrix<T,n1,m1>,A>::size_type rows, cols;
    \n+
    477 std::tie(rows,cols)=SizeSelector<transpose>::size(mat1, mat2);
    \n+
    478 MatrixInitializer<transpose,T,A,n1,m1> patternInit(res, rows);
    \n+
    479 Timer timer;
    \n+
    480 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,patternInit);
    \n+
    481 res.setSize(rows, cols, patternInit.nonzeros());
    \n+
    482 res.setBuildMode(BCRSMatrix<FieldMatrix<T,n1,m1>,A>::row_wise);
    \n+
    483
    \n+
    484 //std::cout<<"Counting nonzeros took "<<timer.elapsed()<<std::endl;
    \n+
    485 timer.reset();
    \n+
    486
    \n+
    487 // Second step is to allocate the storage for the result and initialize the nonzero pattern
    \n+
    488 patternInit.initPattern(mat1, mat2);
    \n+
    489
    \n+
    490 //std::cout<<"Setting up sparsity pattern took "<<timer.elapsed()<<std::endl;
    \n+
    491 timer.reset();
    \n+
    492 // As a last step calculate the entries
    \n+
    493 res = 0.0;
    \n+
    494 EntryAccumulator<T,A,n1,m1, transpose> entriesAccu(res);
    \n+
    495 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,entriesAccu);
    \n+
    496 //std::cout<<"Calculating entries took "<<timer.elapsed()<<std::endl;
    \n+
    497 }
    \n+
    498
    \n+
    499 }
    \n+
    500
    \n+
    508 template<typename M1, typename M2>
    \n+
    \n+\n+
    510 {};
    \n
    \n-
    157#endif
    \n+
    511
    \n+
    512 template<typename T, int n, int k, int m>
    \n+
    \n+\n+
    514 {
    \n+\n+
    516 };
    \n+
    \n+
    517
    \n+
    518 template<typename T, typename A, typename A1, int n, int k, int m>
    \n+
    \n+\n+
    520 {
    \n+\n+
    522 std::allocator<typename MatMultMatResult<FieldMatrix<T,n,k>,FieldMatrix<T,k,m> >::type> > type;
    \n+
    523 };
    \n+
    \n+
    524
    \n+
    525
    \n+
    533 template<typename M1, typename M2>
    \n+
    \n+\n+
    535 {};
    \n+
    \n+
    536
    \n+
    537 template<typename T, int n, int k, int m>
    \n+
    \n+\n+
    539 {
    \n+\n+
    541 };
    \n+
    \n+
    542
    \n+
    543 template<typename T, typename A, typename A1, int n, int k, int m>
    \n+
    \n+\n+
    545 {
    \n+\n+
    547 std::allocator<typename MatMultMatResult<FieldMatrix<T,n,k>,FieldMatrix<T,k,m> >::type> > type;
    \n+
    548 };
    \n+
    \n+
    549
    \n+
    550
    \n+
    559 template<class T, class A, class A1, class A2, int n, int m, int k>
    \n+
    \n+\n+
    561 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, [[maybe_unused]] bool tryHard=false)
    \n+
    562 {
    \n+
    563 matMultMat<2>(res,mat, matt);
    \n+
    564 }
    \n+
    \n+
    565
    \n+
    574 template<class T, class A, class A1, class A2, int n, int m, int k>
    \n+
    \n+\n+
    576 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, bool tryHard=false)
    \n+
    577 {
    \n+
    578 matMultMat<0>(res,mat, matt);
    \n+
    579 }
    \n+
    \n+
    580
    \n+
    589 template<class T, class A, class A1, class A2, int n, int m, int k>
    \n+
    \n+\n+
    591 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, [[maybe_unused]] bool tryHard=false)
    \n+
    592 {
    \n+
    593 matMultMat<1>(res,mat, matt);
    \n+
    594 }
    \n+
    \n+
    595
    \n+
    596}
    \n+
    597#endif
    \n+
    Implementation of the BCRSMatrix class.
    \n+
    BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    Definition matrixmatrix.hh:379
    \n+
    FieldMatrix< T, n, m > type
    Definition matrixmatrix.hh:515
    \n+
    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
    \n+
    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
    \n+
    BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    Definition matrixmatrix.hh:359
    \n+
    Matrix::RowIterator Row
    Definition matrixmatrix.hh:326
    \n+
    BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    Definition matrixmatrix.hh:417
    \n+
    Dune::BCRSMatrix< Dune::FieldMatrix< T, n, m >, TA > Matrix
    Definition matrixmatrix.hh:228
    \n+
    Matrix::size_type size_type
    Definition matrixmatrix.hh:360
    \n+
    Matrix::size_type size_type
    Definition matrixmatrix.hh:380
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n+
    Matrix::ColIterator Col
    Definition matrixmatrix.hh:327
    \n+
    Matrix::size_type size_type
    Definition matrixmatrix.hh:188
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    Matrix::size_type size_type
    Definition matrixmatrix.hh:230
    \n+\n+
    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
    \n+
    BCRSMatrix< FieldMatrix< T, n, m >, A >::CreateIterator CreateIterator
    Definition matrixmatrix.hh:156
    \n+
    BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    Definition matrixmatrix.hh:398
    \n+
    Dune::BCRSMatrix< FieldMatrix< T, n, m >, TA > Matrix
    Definition matrixmatrix.hh:186
    \n+
    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
    \n+
    Matrix::CreateIterator CreateIterator
    Definition matrixmatrix.hh:229
    \n+
    BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    Definition matrixmatrix.hh:325
    \n+
    Matrix::size_type size_type
    Definition matrixmatrix.hh:399
    \n+
    Matrix::CreateIterator CreateIterator
    Definition matrixmatrix.hh:187
    \n+
    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
    \n+
    Matrix::size_type size_type
    Definition matrixmatrix.hh:418
    \n+
    BCRSMatrix< FieldMatrix< T, n, m >, A >::size_type size_type
    Definition matrixmatrix.hh:157
    \n+
    @ do_break
    Definition matrixmatrix.hh:155
    \n+
    @ do_break
    Definition matrixmatrix.hh:185
    \n+
    @ do_break
    Definition matrixmatrix.hh:324
    \n+
    Definition allocator.hh:11
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    Iterator end()
    Get iterator to one beyond last row.
    Definition bcrsmatrix.hh:677
    \n+
    row_type::Iterator ColIterator
    Iterator for the entries of each row.
    Definition bcrsmatrix.hh:700
    \n+
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n+
    CreateIterator createbegin()
    get initial create iterator
    Definition bcrsmatrix.hh:1094
    \n+
    Iterator access to matrix rows
    Definition bcrsmatrix.hh:575
    \n+
    Iterator class for sequential creation of blocks
    Definition bcrsmatrix.hh:954
    \n+
    void insert(size_type j)
    put column index in row
    Definition bcrsmatrix.hh:1061
    \n+
    Helper TMP to get the result type of a sparse matrix matrix multiplication ( )
    Definition matrixmatrix.hh:510
    \n+
    Helper TMP to get the result type of a sparse matrix matrix multiplication ( )
    Definition matrixmatrix.hh:535
    \n+
    Definition matrixutils.hh:27
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,125 +1,742 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-bccsmatrix.hh\n+matrixmatrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_BCCSMATRIX_HH\n-6#define DUNE_ISTL_BCCSMATRIX_HH\n+5#ifndef DUNE_ISTL_MATRIXMATRIX_HH\n+6#define DUNE_ISTL_MATRIXMATRIX_HH\n 7\n-8#include \n-9#include \n-10#include \n-11\n-_\b1_\b2namespace Dune::ISTL::Impl\n-13{\n-27 template::size_type>\n-28 class BCCSMatrix\n-29 {\n-30 public:\n-31 using Index = I;\n-32 using size_type = std::size_t;\n-33\n-36 BCCSMatrix()\n-37 : N_(0), M_(0), Nnz_(0), values(0), rowindex(0), colstart(0)\n-38 {}\n-39\n-41 ~BCCSMatrix()\n-42 {\n-43 if(N_+M_+Nnz_!=0)\n-44 free();\n-45 }\n-46\n-48 void setSize(size_type rows, size_type columns)\n+8#include \n+9\n+10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+11#include \n+12#include \n+13namespace _\bD_\bu_\bn_\be\n+14{\n+15\n+26 namespace\n+27 {\n+28\n+37 template\n+38 struct NonzeroPatternTraverser\n+39 {};\n+40\n+41\n+42 template<>\n+43 struct NonzeroPatternTraverser<0>\n+44 {\n+45 template\n+46 static void traverse(const _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,A1>& A,\n+47 const _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>& B,\n+48 F& func)\n 49 {\n-50 N_ = rows;\n-51 M_ = columns;\n-52 }\n-53\n-58 size_type N() const\n-59 {\n-60 return N_;\n-61 }\n-62\n-64 size_type nonzeroes() const\n-65 {\n-66 return Nnz_;\n-67 }\n-68\n-73 size_type M() const\n-74 {\n-75 return M_;\n-76 }\n-77\n-84 B* getValues() const\n-85 {\n-86 return values;\n-87 }\n-88\n-95 Index* getRowIndex() const\n-96 {\n-97 return rowindex;\n-98 }\n-99\n-106 Index* getColStart() const\n-107 {\n-108 return colstart;\n-109 }\n-110\n-112 BCCSMatrix& operator=(const BCCSMatrix& _\bm_\ba_\bt)\n-113 {\n-114 if(N_+M_+Nnz_!=0)\n-115 free();\n-116 N_=_\bm_\ba_\bt.N_;\n-117 M_=_\bm_\ba_\bt.M_;\n-118 Nnz_= _\bm_\ba_\bt.Nnz_;\n-119 if(M_>0) {\n-120 colstart=new size_type[M_+1];\n-121 for(size_type i=0; i<=M_; ++i)\n-122 colstart[i]=_\bm_\ba_\bt.colstart[i];\n-123 }\n-124\n-125 if(Nnz_>0) {\n-126 values = new B[Nnz_];\n-127 rowindex = new size_type[Nnz_];\n-128\n-129 for(size_type i=0; i,A1>::\n+ConstRowIterator Row;\n+54 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,A1>::\n+ConstColIterator Col;\n+55 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>::\n+ConstColIterator BCol;\n+56 for(Row row= A.begin(); row != A.end(); ++row) {\n+57 // Loop over all column entries\n+58 for(Col _\bc_\bo_\bl = row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl) {\n+59 // entry at i,k\n+60 // search for all nonzeros in row k\n+61 for(BCol bcol = B[_\bc_\bo_\bl.index()].begin(); bcol != B[_\bc_\bo_\bl.index()].end();\n+++bcol) {\n+62 func(*_\bc_\bo_\bl, *bcol, row.index(), bcol.index());\n+63 }\n+64 }\n+65 }\n+66 }\n+67\n+68 };\n+69\n+70 template<>\n+71 struct NonzeroPatternTraverser<1>\n+72 {\n+73 template\n+74 static void traverse(const _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bn_\b>,A1>& A,\n+75 const _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>& B,\n+76 F& func)\n+77 {\n+78\n+79 if(A.N()!=B.N())\n+80 DUNE_THROW(ISTLError, \"The sizes of the matrices do not match: \"<,A1>::\n+ConstRowIterator Row;\n+83 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bn_\b>,A1>::\n+ConstColIterator Col;\n+84 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>::\n+ConstColIterator BCol;\n+85\n+86 for(Row row=A.begin(); row!=A.end(); ++row) {\n+87 for(Col _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl!=row->end(); ++_\bc_\bo_\bl) {\n+88 for(BCol bcol = B[row.index()].begin(); bcol != B[row.index()].end();\n+++bcol) {\n+89 func(*_\bc_\bo_\bl, *bcol, _\bc_\bo_\bl.index(), bcol.index());\n+90 }\n+91 }\n+92 }\n+93 }\n+94 };\n+95\n+96 template<>\n+97 struct NonzeroPatternTraverser<2>\n+98 {\n+99 template\n+100 static void traverse(const BCRSMatrix,A1>& _\bm_\ba_\bt,\n+101 const BCRSMatrix,A2>& matt,\n+102 F& func)\n+103 {\n+104 if(_\bm_\ba_\bt.M()!=matt.M())\n+105 DUNE_THROW(ISTLError, \"The sizes of the matrices do not match: \"<<_\bm_\ba_\bt.M\n+()<<\"!=\"<,A1>::ConstRowIterator\n+row_iterator;\n+108 typedef typename BCRSMatrix,A1>::ConstColIterator\n+col_iterator;\n+109 typedef typename BCRSMatrix,A2>::ConstRowIterator\n+row_iterator_t;\n+110 typedef typename BCRSMatrix,A2>::ConstColIterator\n+col_iterator_t;\n+111\n+112 for(row_iterator mrow=_\bm_\ba_\bt.begin(); mrow != _\bm_\ba_\bt.end(); ++mrow) {\n+113 //iterate over the column entries\n+114 // mt is a transposed matrix crs therefore it is treated as a ccs matrix\n+115 // and the row_iterator iterates over the columns of the transposed matrix.\n+116 // search the row of the transposed matrix for an entry with the same index\n+117 // as the mcol iterator\n+118\n+119 for(row_iterator_t mtcol=matt.begin(); mtcol != matt.end(); ++mtcol) {\n+120 //Search for col entries in mat that have a corresponding row index in matt\n+121 // (i.e. corresponding col index in the as this is the transposed matrix\n+122 col_iterator_t mtrow=mtcol->begin();\n+123 bool funcCalled = false;\n+124 for(col_iterator mcol=mrow->begin(); mcol != mrow->end(); ++mcol) {\n+125 // search\n+126 // TODO: This should probably be substituted by a binary search\n+127 for( ; mtrow != mtcol->end(); ++mtrow)\n+128 if(mtrow.index()>=mcol.index())\n+129 break;\n+130 if(mtrow != mtcol->end() && mtrow.index()==mcol.index()) {\n+131 func(*mcol, *mtrow, mtcol.index());\n+132 funcCalled = true;\n+133 // In some cases we only search for one pair, then we break here\n+134 // and continue with the next column.\n+135 if(F::do_break)\n+136 break;\n+137 }\n+138 }\n+139 // move on with func only if func was called, otherwise they might\n+140 // get out of sync\n+141 if (funcCalled)\n+142 func.nextCol();\n+143 }\n+144 func.nextRow();\n+145 }\n+146 }\n+147 };\n 148\n-149 public:\n-150 size_type N_, M_, Nnz_;\n-151 B* values;\n-152 Index* rowindex;\n-153 Index* colstart;\n-154 };\n-155\n-156}\n-157#endif\n+149\n+150\n+151 template\n+152 class SparsityPatternInitializer\n+153 {\n+154 public:\n+_\b1_\b5_\b5 enum {_\bd_\bo_\b__\bb_\br_\be_\ba_\bk=true};\n+_\b1_\b5_\b6 typedef typename _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A>_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b5_\b7 typedef typename _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+158\n+159 SparsityPatternInitializer(_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter)\n+160 : rowiter(iter)\n+161 {}\n+162\n+163 template\n+164 void operator()(const T1&, const T2&, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n+165 {\n+166 rowiter._\bi_\bn_\bs_\be_\br_\bt(j);\n+167 }\n+168\n+169 void nextRow()\n+170 {\n+171 ++rowiter;\n+172 }\n+173 void nextCol()\n+174 {}\n+175\n+176 private:\n+177 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br rowiter;\n+178 };\n+179\n+180\n+181 template\n+182 class MatrixInitializer\n+183 {\n+184 public:\n+_\b1_\b8_\b5 enum {_\bd_\bo_\b__\bb_\br_\be_\ba_\bk=true};\n+_\b1_\b8_\b6 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,TA> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b1_\b8_\b7 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b8_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+189\n+190 MatrixInitializer(_\bM_\ba_\bt_\br_\bi_\bx& A_, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be)\n+191 : count(0), A(A_)\n+192 {}\n+193 template\n+194 void operator()(const T1&, const T2&, int)\n+195 {\n+196 ++count;\n+197 }\n+198\n+199 void nextCol()\n+200 {}\n+201\n+202 void nextRow()\n+203 {}\n+204\n+205 std::size_t nonzeros()\n+206 {\n+207 return count;\n+208 }\n+209\n+210 template\n+211 void initPattern(const BCRSMatrix,A1>& mat1,\n+212 const BCRSMatrix,A2>& mat2)\n+213 {\n+214 SparsityPatternInitializer sparsity(A._\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn());\n+215 NonzeroPatternTraverser::traverse(mat1,mat2,sparsity);\n+216 }\n+217\n+218 private:\n+219 std::size_t count;\n+220 _\bM_\ba_\bt_\br_\bi_\bx& A;\n+221 };\n+222\n+223 template\n+224 class MatrixInitializer<1,T,TA,n,m>\n+225 {\n+226 public:\n+_\b2_\b2_\b7 enum {_\bd_\bo_\b__\bb_\br_\be_\ba_\bk=false};\n+_\b2_\b2_\b8 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,TA> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b2_\b2_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b2_\b3_\b0 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+231\n+232 MatrixInitializer(_\bM_\ba_\bt_\br_\bi_\bx& A_, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows)\n+233 : A(A_), entries(rows)\n+234 {}\n+235\n+236 template\n+237 void operator()(const T1&, const T2&, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n+238 {\n+239 entries[i].insert(j);\n+240 }\n+241\n+242 void nextCol()\n+243 {}\n+244\n+245 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nonzeros()\n+246 {\n+247 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nnz=0;\n+248 typedef typename std::vector >::const_iterator Iter;\n+249 for(Iter iter = entries.begin(); iter != entries.end(); ++iter)\n+250 nnz+=(*iter).size();\n+251 return nnz;\n+252 }\n+253 template\n+254 void initPattern(const BCRSMatrix,A1>&,\n+255 const BCRSMatrix,A2>&)\n+256 {\n+257 typedef typename std::vector >::const_iterator Iter;\n+258 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br citer = A._\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn();\n+259 for(Iter iter = entries.begin(); iter != entries.end(); ++iter, ++citer) {\n+260 typedef std::set::const_iterator SetIter;\n+261 for(SetIter index=iter->begin(); index != iter->end(); ++index)\n+262 citer._\bi_\bn_\bs_\be_\br_\bt(*index);\n+263 }\n+264 }\n+265\n+266 private:\n+267 _\bM_\ba_\bt_\br_\bi_\bx& A;\n+268 std::vector > entries;\n+269 };\n+270\n+271 template\n+272 struct MatrixInitializer<0,T,TA,n,m>\n+273 : public MatrixInitializer<1,T,TA,n,m>\n+274 {\n+275 MatrixInitializer(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,TA>& A_,\n+276 typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,TA>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows)\n+277 : MatrixInitializer<1,T,TA,n,m>(A_,rows)\n+278 {}\n+279 };\n+280\n+281\n+282 template\n+283 void addMatMultTransposeMat(FieldMatrix& res, const\n+FieldMatrix& _\bm_\ba_\bt,\n+284 const FieldMatrix& matt)\n+285 {\n+286 typedef typename FieldMatrix::size_type size_type;\n+287\n+288 for(size_type row=0; row\n+296 void addTransposeMatMultMat(FieldMatrix& res, const\n+FieldMatrix& _\bm_\ba_\bt,\n+297 const FieldMatrix& matt)\n+298 {\n+299 typedef typename FieldMatrix::size_type size_type;\n+300 for(size_type i=0; i\n+308 void addMatMultMat(FieldMatrix& res, const FieldMatrix& _\bm_\ba_\bt,\n+309 const FieldMatrix& matt)\n+310 {\n+311 typedef typename FieldMatrix::size_type size_type;\n+312 for(size_type row=0; row\n+321 class EntryAccumulatorFather\n+322 {\n+323 public:\n+_\b3_\b2_\b4 enum {_\bd_\bo_\b__\bb_\br_\be_\ba_\bk=false};\n+_\b3_\b2_\b5 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b3_\b2_\b6 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bR_\bo_\bw;\n+_\b3_\b2_\b7 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bl;\n+328\n+329 EntryAccumulatorFather(_\bM_\ba_\bt_\br_\bi_\bx& mat_)\n+330 : _\bm_\ba_\bt(mat_), row(_\bm_\ba_\bt.begin())\n+331 {\n+332 _\bm_\ba_\bt=0;\n+333 _\bc_\bo_\bl=row->begin();\n+334 }\n+335 void nextRow()\n+336 {\n+337 ++row;\n+338 if(row!=_\bm_\ba_\bt._\be_\bn_\bd())\n+339 _\bc_\bo_\bl=row->begin();\n+340 }\n+341\n+342 void nextCol()\n+343 {\n+344 ++this->_\bc_\bo_\bl;\n+345 }\n+346 protected:\n+_\b3_\b4_\b7 Matrix& _\bm_\ba_\bt;\n+348 private:\n+349 _\bR_\bo_\bw row;\n+350 protected:\n+_\b3_\b5_\b1 _\bC_\bo_\bl _\bc_\bo_\bl;\n+352 };\n+353\n+354 template\n+355 class EntryAccumulator\n+356 : public EntryAccumulatorFather\n+357 {\n+358 public:\n+_\b3_\b5_\b9 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b3_\b6_\b0 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+361\n+362 EntryAccumulator(_\bM_\ba_\bt_\br_\bi_\bx& mat_)\n+363 : EntryAccumulatorFather(mat_)\n+364 {}\n+365\n+366 template\n+367 void operator()(const T1& t1, const T2& t2, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+368 {\n+369 assert(this->_\bc_\bo_\bl.index()==i);\n+370 addMatMultMat(*(this->_\bc_\bo_\bl),t1,t2);\n+371 }\n+372 };\n+373\n+374 template\n+375 class EntryAccumulator\n+376 : public EntryAccumulatorFather\n+377 {\n+378 public:\n+_\b3_\b7_\b9 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b3_\b8_\b0 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+381\n+382 EntryAccumulator(_\bM_\ba_\bt_\br_\bi_\bx& mat_)\n+383 : EntryAccumulatorFather(mat_)\n+384 {}\n+385\n+386 template\n+387 void operator()(const T1& t1, const T2& t2, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n+388 {\n+389 addMatMultMat(this->mat[i][j], t1, t2);\n+390 }\n+391 };\n+392\n+393 template\n+394 class EntryAccumulator\n+395 : public EntryAccumulatorFather\n+396 {\n+397 public:\n+_\b3_\b9_\b8 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b3_\b9_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+400\n+401 EntryAccumulator(_\bM_\ba_\bt_\br_\bi_\bx& mat_)\n+402 : EntryAccumulatorFather(mat_)\n+403 {}\n+404\n+405 template\n+406 void operator()(const T1& t1, const T2& t2, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n+407 {\n+408 addTransposeMatMultMat(this->mat[i][j], t1, t2);\n+409 }\n+410 };\n+411\n+412 template\n+413 class EntryAccumulator\n+414 : public EntryAccumulatorFather\n+415 {\n+416 public:\n+_\b4_\b1_\b7 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b4_\b1_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+419\n+420 EntryAccumulator(_\bM_\ba_\bt_\br_\bi_\bx& mat_)\n+421 : EntryAccumulatorFather(mat_)\n+422 {}\n+423\n+424 template\n+425 void operator()(const T1& t1, const T2& t2, [[maybe_unused]] _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+426 {\n+427 assert(this->_\bc_\bo_\bl.index()==i);\n+428 addMatMultTransposeMat(*this->_\bc_\bo_\bl,t1,t2);\n+429 }\n+430 };\n+431\n+432\n+433 template\n+434 struct SizeSelector\n+435 {};\n+436\n+437 template<>\n+438 struct SizeSelector<0>\n+439 {\n+440 template\n+441 static std::tuple\n+442 size(const M1& m1, const M2& m2)\n+443 {\n+444 return std::make_tuple(m1.N(), m2.M());\n+445 }\n+446 };\n+447\n+448 template<>\n+449 struct SizeSelector<1>\n+450 {\n+451 template\n+452 static std::tuple\n+453 size(const M1& m1, const M2& m2)\n+454 {\n+455 return std::make_tuple(m1.M(), m2.M());\n+456 }\n+457 };\n+458\n+459\n+460 template<>\n+461 struct SizeSelector<2>\n+462 {\n+463 template\n+464 static std::tuple\n+465 size(const M1& m1, const M2& m2)\n+466 {\n+467 return std::make_tuple(m1.N(), m2.N());\n+468 }\n+469 };\n+470\n+471 template\n+472 void _\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt(BCRSMatrix,A>& res, const\n+BCRSMatrix,A1>& mat1,\n+473 const BCRSMatrix,A2>& mat2)\n+474 {\n+475 // First step is to count the number of nonzeros\n+476 typename BCRSMatrix,A>::size_type rows, cols;\n+477 std::tie(rows,cols)=SizeSelector::size(mat1, mat2);\n+478 MatrixInitializer patternInit(res, rows);\n+479 Timer timer;\n+480 NonzeroPatternTraverser::traverse(mat1,mat2,patternInit);\n+481 res.setSize(rows, cols, patternInit.nonzeros());\n+482 res.setBuildMode(BCRSMatrix,A>::row_wise);\n+483\n+484 //std::cout<<\"Counting nonzeros took \"< entriesAccu(res);\n+495 NonzeroPatternTraverser::traverse(mat1,mat2,entriesAccu);\n+496 //std::cout<<\"Calculating entries took \"<\n+_\b5_\b0_\b9 struct _\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt\n+510 {};\n+511\n+512 template\n+_\b5_\b1_\b3 struct _\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n+514 {\n+_\b5_\b1_\b5 typedef _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b> _\bt_\by_\bp_\be;\n+516 };\n+517\n+518 template\n+_\b5_\b1_\b9 struct _\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A\n+>,_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A1 > >\n+520 {\n+521 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be\n+_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b> >::type,\n+_\b5_\b2_\b2 std::allocator,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b> >::type> > _\bt_\by_\bp_\be;\n+523 };\n+524\n+525\n+533 template\n+_\b5_\b3_\b4 struct _\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt\n+535 {};\n+536\n+537 template\n+_\b5_\b3_\b8 struct _\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n+539 {\n+_\b5_\b4_\b0 typedef _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b> _\bt_\by_\bp_\be;\n+541 };\n+542\n+543 template\n+_\b5_\b4_\b4 struct _\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A\n+>,_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A1 > >\n+545 {\n+546 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be\n+_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b> >::type,\n+_\b5_\b4_\b7 std::allocator,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b> >::type> > _\bt_\by_\bp_\be;\n+548 };\n+549\n+550\n+559 template\n+_\b5_\b6_\b0 void _\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,A>& res, const\n+_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A1>& _\bm_\ba_\bt,\n+561 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>& matt, [[maybe_unused]] bool\n+tryHard=false)\n+562 {\n+563 matMultMat<2>(res,_\bm_\ba_\bt, matt);\n+564 }\n+565\n+574 template\n+_\b5_\b7_\b5 void _\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A>& res, const\n+_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,A1>& _\bm_\ba_\bt,\n+576 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>& matt, bool tryHard=false)\n+577 {\n+578 matMultMat<0>(res,_\bm_\ba_\bt, matt);\n+579 }\n+580\n+589 template\n+_\b5_\b9_\b0 void _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A>& res, const\n+_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bn_\b>,A1>& _\bm_\ba_\bt,\n+591 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>& matt, [[maybe_unused]] bool\n+tryHard=false)\n+592 {\n+593 matMultMat<1>(res,_\bm_\ba_\bt, matt);\n+594 }\n+595\n+596}\n+597#endif\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b0_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:379\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bk_\b _\b>_\b,_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+FieldMatrix< T, n, m > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:515\n+_\bD_\bu_\bn_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt\n+void transposeMatMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const\n+BCRSMatrix< FieldMatrix< T, k, n >, A1 > &mat, const BCRSMatrix< FieldMatrix<\n+T, k, m >, A2 > &matt, bool tryHard=false)\n+Calculate product of a transposed sparse matrix with another sparse matrices\n+( ).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:590\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt\n+void matMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix<\n+FieldMatrix< T, n, k >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2\n+> &matt, bool tryHard=false)\n+Calculate product of two sparse matrices ( ).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:575\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:359\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bR_\bo_\bw\n+Matrix::RowIterator Row\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:326\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b2_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:417\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\b1_\b,_\b _\bT_\b,_\b _\bT_\bA_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+Dune::BCRSMatrix< Dune::FieldMatrix< T, n, m >, TA > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:228\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:360\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b0_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:380\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bC_\bo_\bl\n+Matrix::ColIterator Col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:327\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n _\bm_\ba_\bt\n Matrix & mat\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\b1_\b,_\b _\bT_\b,_\b _\bT_\bA_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bn_\b _\b>_\b,_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm\n+_\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+FieldMatrix< T, n, m > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:540\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt\n+void matMultTransposeMat(BCRSMatrix< FieldMatrix< T, n, k >, A > &res, const\n+BCRSMatrix< FieldMatrix< T, n, m >, A1 > &mat, const BCRSMatrix< FieldMatrix<\n+T, k, m >, A2 > &matt, bool tryHard=false)\n+Calculate product of a sparse matrix with a transposed sparse matrices ( ).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+BCRSMatrix< FieldMatrix< T, n, m >, A >::CreateIterator CreateIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:156\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b1_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:398\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+Dune::BCRSMatrix< FieldMatrix< T, n, m >, TA > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:186\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bk_\b _\b>_\b,_\b _\bA_\b _\b>_\b,_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<\n+_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b1_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T,\n+k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k\n+>, FieldMatrix< T, k, m > >::type > > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:522\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\b1_\b,_\b _\bT_\b,_\b _\bT_\bA_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Matrix::CreateIterator CreateIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:229\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:325\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b1_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:399\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Matrix::CreateIterator CreateIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:187\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bn_\b _\b>_\b,_\b _\bA_\b _\b>_\b,\n+_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b1_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T,\n+k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k\n+>, FieldMatrix< T, k, m > >::type > > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:547\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b2_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:418\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+BCRSMatrix< FieldMatrix< T, n, m >, A >::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:157\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bd_\bo_\b__\bb_\br_\be_\ba_\bk\n+@ do_break\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bd_\bo_\b__\bb_\br_\be_\ba_\bk\n+@ do_break\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:185\n+_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bd_\bo_\b__\bb_\br_\be_\ba_\bk\n+@ do_break\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:324\n+_\bD_\bu_\bn_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+Iterator end()\n+Get iterator to one beyond last row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:677\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::Iterator ColIterator\n+Iterator for the entries of each row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:700\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+The type for the index access and the size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn\n+CreateIterator createbegin()\n+get initial create iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1094\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator access to matrix rows\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:575\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator class for sequential creation of blocks\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:954\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n+void insert(size_type j)\n+put column index in row\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1061\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt\n+Helper TMP to get the result type of a sparse matrix matrix multiplication ( )\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:510\n+_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt\n+Helper TMP to get the result type of a sparse matrix matrix multiplication ( )\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:535\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00038.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00038.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: solverregistry.hh File Reference\n+dune-istl: scaledidmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -71,144 +71,49 @@\n \n
    \n \n
    \n \n-
    solverregistry.hh File Reference
    \n+Namespaces
    \n+
    scaledidmatrix.hh File Reference
    \n \n
    \n-
    #include <dune/istl/common/registry.hh>
    \n-#include <dune/istl/preconditioner.hh>
    \n-#include <dune/istl/solver.hh>
    \n+\n+

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

    \n+
    #include <cmath>
    \n+#include <cstddef>
    \n+#include <complex>
    \n+#include <iostream>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/fmatrix.hh>
    \n+#include <dune/common/diagonalmatrix.hh>
    \n+#include <dune/common/ftraits.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n+\n+\n \n-\n+\n \n

    \n Classes

    class  Dune::UnsupportedType
    class  Dune::ScaledIdentityMatrix< K, n >
     A multiple of the identity matrix of static size. More...
     
    struct  Dune::DenseMatrixAssigner< DenseMatrix, ScaledIdentityMatrix< field, N > >
     
    class  Dune::InvalidSolverFactoryConfiguration
    struct  Dune::FieldTraits< ScaledIdentityMatrix< K, n > >
     
    \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n-\n-\n-\n-\n-

    \n-Macros

    #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_ITERATIVE_SOLVER(name, ...)    DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__)
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n

    \n-Functions

    template<template< class, class, class, int >class Preconditioner, int blockLevel = 1>
    auto Dune::defaultPreconditionerBlockLevelCreator ()
     
    template<template< class, class, class >class Preconditioner>
    auto Dune::defaultPreconditionerCreator ()
     
    template<template< class... >class Solver>
    auto Dune::defaultIterativeSolverCreator ()
     
    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_REGISTER_DIRECT_SOLVER

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_REGISTER_DIRECT_SOLVER( name,
     ... 
    )    DUNE_REGISTRY_PUT(DirectSolverTag, name, __VA_ARGS__)
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_REGISTER_ITERATIVE_SOLVER

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_REGISTER_ITERATIVE_SOLVER( name,
     ... 
    )    DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__)
    \n-
    \n-\n-
    \n-
    \n-\n-

    ◆ DUNE_REGISTER_PRECONDITIONER

    \n-\n-
    \n-
    \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n-
    #define DUNE_REGISTER_PRECONDITIONER( name,
     ... 
    )    DUNE_REGISTRY_PUT(PreconditionerTag, name, __VA_ARGS__)
    \n-
    \n-\n-
    \n-
    \n-
    \n+

    Detailed Description

    \n+

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

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,60 +1,36 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-solverregistry.hh File Reference\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+scaledidmatrix.hh File Reference\n+This file implements a quadratic matrix of fixed size which is a multiple of\n+the identity. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>\n+\u00a0 A multiple of the identity matrix of static size. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\bC_\bo_\bn_\bf_\bi_\bg_\bu_\br_\ba_\bt_\bi_\bo_\bn\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bf_\bi_\be_\bl_\bd_\b,_\b _\bN\n+ _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(name, ...)\u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT\n- (DirectSolverTag, name, __VA_ARGS__)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(name, ...)\u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT\n- (PreconditionerTag, name, __VA_ARGS__)\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(name, ...)\u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT\n- (IterativeSolverTag, name, __VA_ARGS__)\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-templateclass Preconditioner, int\n-blockLevel = 1>\n-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br ()\n-\u00a0\n-templateclass Preconditioner>\n-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br ()\n-\u00a0\n-templateclass Solver>\n-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br ()\n-\u00a0\n-*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_R\bRE\bEG\bGI\bIS\bST\bTE\bER\bR_\b_D\bDI\bIR\bRE\bEC\bCT\bT_\b_S\bSO\bOL\bLV\bVE\bER\bR *\b**\b**\b**\b**\b*\n-#define DUNE_REGISTER_DIRECT_SOLVER ( \u00a0 name,\n- \u00a0 .\b..\b..\b.\u00a0\n- ) \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT(DirectSolverTag,\n- name, __VA_ARGS__)\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_R\bRE\bEG\bGI\bIS\bST\bTE\bER\bR_\b_I\bIT\bTE\bER\bRA\bAT\bTI\bIV\bVE\bE_\b_S\bSO\bOL\bLV\bVE\bER\bR *\b**\b**\b**\b**\b*\n-#define DUNE_REGISTER_ITERATIVE_SOLVER ( \u00a0 name,\n- \u00a0 .\b..\b..\b.\u00a0\n- \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT\n- ) (IterativeSolverTag, name,\n- __VA_ARGS__)\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_R\bRE\bEG\bGI\bIS\bST\bTE\bER\bR_\b_P\bPR\bRE\bEC\bCO\bON\bND\bDI\bIT\bTI\bIO\bON\bNE\bER\bR *\b**\b**\b**\b**\b*\n-#define DUNE_REGISTER_PRECONDITIONER ( \u00a0 name,\n- \u00a0 .\b..\b..\b.\u00a0\n- ) \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT\n- (PreconditionerTag, name, __VA_ARGS__)\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+This file implements a quadratic matrix of fixed size which is a multiple of\n+the identity.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00038_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00038_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: solverregistry.hh Source File\n+dune-istl: scaledidmatrix.hh Source File\n \n \n \n \n \n \n \n@@ -74,118 +74,622 @@\n \n
    \n \n
    \n \n
    \n-
    solverregistry.hh
    \n+
    scaledidmatrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5
    \n-
    6#ifndef DUNE_ISTL_SOLVERREGISTRY_HH
    \n-
    7#define DUNE_ISTL_SOLVERREGISTRY_HH
    \n-
    8
    \n-\n-\n-
    11#include <dune/istl/solver.hh>
    \n-
    12
    \n-
    \n-
    13#define DUNE_REGISTER_DIRECT_SOLVER(name, ...) \\
    \n-
    14 DUNE_REGISTRY_PUT(DirectSolverTag, name, __VA_ARGS__)
    \n-
    \n-
    15
    \n-
    \n-
    16#define DUNE_REGISTER_PRECONDITIONER(name, ...) \\
    \n-
    17 DUNE_REGISTRY_PUT(PreconditionerTag, name, __VA_ARGS__)
    \n-
    \n-
    18
    \n-
    \n-
    19#define DUNE_REGISTER_ITERATIVE_SOLVER(name, ...) \\
    \n-
    20 DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__)
    \n-
    \n-
    21
    \n-
    22namespace Dune{
    \n-
    27 namespace {
    \n-
    28 struct DirectSolverTag {};
    \n-
    29 struct PreconditionerTag {};
    \n-
    30 struct IterativeSolverTag {};
    \n-
    31 }
    \n-
    32 template<template<class,class,class,int>class Preconditioner, int blockLevel=1>
    \n-
    \n-\n-
    34 return [](auto typeList, const auto& matrix, const Dune::ParameterTree& config)
    \n-
    35 {
    \n-
    36 using Matrix = typename Dune::TypeListElement<0, decltype(typeList)>::type;
    \n-
    37 using Domain = typename Dune::TypeListElement<1, decltype(typeList)>::type;
    \n-
    38 using Range = typename Dune::TypeListElement<2, decltype(typeList)>::type;
    \n-
    39 std::shared_ptr<Dune::Preconditioner<Domain, Range>> preconditioner
    \n-
    40 = std::make_shared<Preconditioner<Matrix, Domain, Range, blockLevel>>(matrix, config);
    \n-
    41 return preconditioner;
    \n-
    42 };
    \n-
    43 }
    \n-
    \n+
    5#ifndef DUNE_ISTL_SCALEDIDMATRIX_HH
    \n+
    6#define DUNE_ISTL_SCALEDIDMATRIX_HH
    \n+
    7
    \n+
    14#include <cmath>
    \n+
    15#include <cstddef>
    \n+
    16#include <complex>
    \n+
    17#include <iostream>
    \n+
    18#include <dune/common/exceptions.hh>
    \n+
    19#include <dune/common/fmatrix.hh>
    \n+
    20#include <dune/common/diagonalmatrix.hh>
    \n+
    21#include <dune/common/ftraits.hh>
    \n+
    22
    \n+
    23namespace Dune {
    \n+
    24
    \n+
    28 template<class K, int n>
    \n+
    \n+\n+
    30 {
    \n+
    31 typedef DiagonalMatrixWrapper< ScaledIdentityMatrix<K,n> > WrapperType;
    \n+
    32
    \n+
    33 public:
    \n+
    34 //===== type definitions and constants
    \n+
    35
    \n+
    37 typedef K field_type;
    \n+
    38
    \n+
    40 typedef K block_type;
    \n+
    41
    \n+
    43 typedef std::size_t size_type;
    \n
    44
    \n-
    45 template<template<class,class,class>class Preconditioner>
    \n-
    \n-\n-
    47 return [](auto typeList, const auto& matrix, const Dune::ParameterTree& config)
    \n-
    48 {
    \n-
    49 using Matrix = typename Dune::TypeListElement<0, decltype(typeList)>::type;
    \n-
    50 using Domain = typename Dune::TypeListElement<1, decltype(typeList)>::type;
    \n-
    51 using Range = typename Dune::TypeListElement<2, decltype(typeList)>::type;
    \n-
    52 std::shared_ptr<Dune::Preconditioner<Domain, Range>> preconditioner
    \n-
    53 = std::make_shared<Preconditioner<Matrix, Domain, Range>>(matrix, config);
    \n-
    54 return preconditioner;
    \n-
    55 };
    \n-
    56 }
    \n-
    \n-
    57
    \n-
    58 template<template<class...>class Solver>
    \n-
    \n-\n-
    60 return [](auto typeList,
    \n-
    61 const auto& linearOperator,
    \n-
    62 const auto& scalarProduct,
    \n-
    63 const auto& preconditioner,
    \n-
    64 const Dune::ParameterTree& config)
    \n-
    65 {
    \n-
    66 using Domain = typename Dune::TypeListElement<0, decltype(typeList)>::type;
    \n-
    67 using Range = typename Dune::TypeListElement<1, decltype(typeList)>::type;
    \n-
    68 std::shared_ptr<Dune::InverseOperator<Domain, Range>> solver
    \n-
    69 = std::make_shared<Solver<Domain>>(linearOperator, scalarProduct, preconditioner, config);
    \n-
    70 return solver;
    \n-
    71 };
    \n-
    72 }
    \n-
    \n-
    73
    \n-
    74 /* This exception is thrown, when the requested solver is in the factory but
    \n-
    75 cannot be instantiated for the required template parameters
    \n-
    76 */
    \n-
    77 class UnsupportedType : public NotImplemented {};
    \n-
    78
    \n-
    79 class InvalidSolverFactoryConfiguration : public InvalidStateException{};
    \n-
    80} // end namespace Dune
    \n-
    81
    \n-
    82#endif // DUNE_ISTL_SOLVERREGISTRY_HH
    \n-\n-\n-
    Define general, extensible interface for inverse operators.
    \n-
    auto defaultIterativeSolverCreator()
    Definition solverregistry.hh:59
    \n-
    auto defaultPreconditionerBlockLevelCreator()
    Definition solverregistry.hh:33
    \n-
    auto defaultPreconditionerCreator()
    Definition solverregistry.hh:46
    \n+
    46 typedef DiagonalRowVector<K,n> row_type;
    \n+\n+
    48 typedef DiagonalRowVectorConst<K,n> const_row_type;
    \n+\n+
    50
    \n+
    52 enum {
    \n+
    54 rows = n,
    \n+
    56 cols = n
    \n+
    57 };
    \n+
    58
    \n+
    59 //===== constructors
    \n+\n+
    63
    \n+
    \n+\n+
    67 : p_(k)
    \n+
    68 {}
    \n+
    \n+
    69
    \n+
    70 //===== assignment from scalar
    \n+
    \n+\n+
    72 {
    \n+
    73 p_ = k;
    \n+
    74 return *this;
    \n+
    75 }
    \n+
    \n+
    76
    \n+
    77 // check if matrix is identical to other matrix (not only identical values)
    \n+
    \n+
    78 bool identical(const ScaledIdentityMatrix<K,n>& other) const
    \n+
    79 {
    \n+
    80 return (this==&other);
    \n+
    81 }
    \n+
    \n+
    82
    \n+
    83 //===== iterator interface to rows of the matrix
    \n+
    85 typedef ContainerWrapperIterator<const WrapperType, reference, reference> Iterator;
    \n+\n+\n+
    91 typedef typename row_type::Iterator ColIterator;
    \n+
    92
    \n+
    \n+\n+
    95 {
    \n+
    96 return Iterator(WrapperType(this),0);
    \n+
    97 }
    \n+
    \n+
    98
    \n+
    \n+\n+
    101 {
    \n+
    102 return Iterator(WrapperType(this),n);
    \n+
    103 }
    \n+
    \n+
    104
    \n+
    \n+\n+
    108 {
    \n+
    109 return Iterator(WrapperType(this),n-1);
    \n+
    110 }
    \n+
    \n+
    111
    \n+
    \n+\n+
    115 {
    \n+
    116 return Iterator(WrapperType(this),-1);
    \n+
    117 }
    \n+
    \n+
    118
    \n+
    119
    \n+
    121 typedef ContainerWrapperIterator<const WrapperType, const_reference, const_reference> ConstIterator;
    \n+\n+\n+
    127 typedef typename const_row_type::ConstIterator ConstColIterator;
    \n+
    128
    \n+
    \n+\n+
    131 {
    \n+
    132 return ConstIterator(WrapperType(this),0);
    \n+
    133 }
    \n+
    \n+
    134
    \n+
    \n+\n+
    137 {
    \n+
    138 return ConstIterator(WrapperType(this),n);
    \n+
    139 }
    \n+
    \n+
    140
    \n+
    \n+\n+
    144 {
    \n+
    145 return ConstIterator(WrapperType(this),n-1);
    \n+
    146 }
    \n+
    \n+
    147
    \n+
    \n+\n+
    151 {
    \n+
    152 return ConstIterator(WrapperType(this),-1);
    \n+
    153 }
    \n+
    \n+
    154
    \n+
    155 //===== vector space arithmetic
    \n+
    156
    \n+
    \n+\n+
    159 {
    \n+
    160 p_ += y.p_;
    \n+
    161 return *this;
    \n+
    162 }
    \n+
    \n+
    163
    \n+
    \n+\n+
    166 {
    \n+
    167 p_ -= y.p_;
    \n+
    168 return *this;
    \n+
    169 }
    \n+
    \n+
    170
    \n+
    \n+\n+
    173 {
    \n+
    174 p_ += k;
    \n+
    175 return *this;
    \n+
    176 }
    \n+
    \n+
    177
    \n+
    \n+\n+
    180 {
    \n+
    181 p_ -= k;
    \n+
    182 return *this;
    \n+
    183 }
    \n+
    \n+
    \n+\n+
    186 {
    \n+
    187 p_ *= k;
    \n+
    188 return *this;
    \n+
    189 }
    \n+
    \n+
    190
    \n+
    \n+\n+
    193 {
    \n+
    194 p_ /= k;
    \n+
    195 return *this;
    \n+
    196 }
    \n+
    \n+
    197
    \n+
    198 //===== binary operators
    \n+
    199
    \n+
    201 template <class Scalar,
    \n+
    202 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
    \n+
    \n+
    203 friend auto operator* ( const ScaledIdentityMatrix& matrix, Scalar scalar)
    \n+
    204 {
    \n+\n+
    206 }
    \n+
    \n+
    207
    \n+
    209 template <class Scalar,
    \n+
    210 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
    \n+
    \n+
    211 friend auto operator* (Scalar scalar, const ScaledIdentityMatrix& matrix)
    \n+
    212 {
    \n+\n+
    214 }
    \n+
    \n+
    215
    \n+
    216 //===== comparison ops
    \n+
    217
    \n+
    \n+
    219 bool operator==(const ScaledIdentityMatrix& other) const
    \n+
    220 {
    \n+
    221 return p_==other.scalar();
    \n+
    222 }
    \n+
    \n+
    223
    \n+
    \n+
    225 bool operator!=(const ScaledIdentityMatrix& other) const
    \n+
    226 {
    \n+
    227 return p_!=other.scalar();
    \n+
    228 }
    \n+
    \n+
    229
    \n+
    230 //===== linear maps
    \n+
    231
    \n+
    233 template<class X, class Y>
    \n+
    \n+
    234 void mv (const X& x, Y& y) const
    \n+
    235 {
    \n+
    236#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    237 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    238 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    239#endif
    \n+
    240 for (size_type i=0; i<n; ++i)
    \n+
    241 y[i] = p_ * x[i];
    \n+
    242 }
    \n+
    \n+
    243
    \n+
    245 template<class X, class Y>
    \n+
    \n+
    246 void mtv (const X& x, Y& y) const
    \n+
    247 {
    \n+
    248 mv(x, y);
    \n+
    249 }
    \n+
    \n+
    250
    \n+
    252 template<class X, class Y>
    \n+
    \n+
    253 void umv (const X& x, Y& y) const
    \n+
    254 {
    \n+
    255#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    256 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    257 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    258#endif
    \n+
    259 for (size_type i=0; i<n; ++i)
    \n+
    260 y[i] += p_ * x[i];
    \n+
    261 }
    \n+
    \n+
    262
    \n+
    264 template<class X, class Y>
    \n+
    \n+
    265 void umtv (const X& x, Y& y) const
    \n+
    266 {
    \n+
    267#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    268 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    269 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    270#endif
    \n+
    271 for (size_type i=0; i<n; ++i)
    \n+
    272 y[i] += p_ * x[i];
    \n+
    273 }
    \n+
    \n+
    274
    \n+
    276 template<class X, class Y>
    \n+
    \n+
    277 void umhv (const X& x, Y& y) const
    \n+
    278 {
    \n+
    279#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    280 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    281 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    282#endif
    \n+
    283 for (size_type i=0; i<n; i++)
    \n+
    284 y[i] += conjugateComplex(p_)*x[i];
    \n+
    285 }
    \n+
    \n+
    286
    \n+
    288 template<class X, class Y>
    \n+
    \n+
    289 void mmv (const X& x, Y& y) const
    \n+
    290 {
    \n+
    291#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    292 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    293 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    294#endif
    \n+
    295 for (size_type i=0; i<n; ++i)
    \n+
    296 y[i] -= p_ * x[i];
    \n+
    297 }
    \n+
    \n+
    298
    \n+
    300 template<class X, class Y>
    \n+
    \n+
    301 void mmtv (const X& x, Y& y) const
    \n+
    302 {
    \n+
    303#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    304 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    305 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    306#endif
    \n+
    307 for (size_type i=0; i<n; ++i)
    \n+
    308 y[i] -= p_ * x[i];
    \n+
    309 }
    \n+
    \n+
    310
    \n+
    312 template<class X, class Y>
    \n+
    \n+
    313 void mmhv (const X& x, Y& y) const
    \n+
    314 {
    \n+
    315#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    316 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    317 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    318#endif
    \n+
    319 for (size_type i=0; i<n; i++)
    \n+
    320 y[i] -= conjugateComplex(p_)*x[i];
    \n+
    321 }
    \n+
    \n+
    322
    \n+
    324 template<class X, class Y>
    \n+
    \n+
    325 void usmv (const K& alpha, const X& x, Y& y) const
    \n+
    326 {
    \n+
    327#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    328 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    329 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    330#endif
    \n+
    331 for (size_type i=0; i<n; i++)
    \n+
    332 y[i] += alpha * p_ * x[i];
    \n+
    333 }
    \n+
    \n+
    334
    \n+
    336 template<class X, class Y>
    \n+
    \n+
    337 void usmtv (const K& alpha, const X& x, Y& y) const
    \n+
    338 {
    \n+
    339#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    340 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    341 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    342#endif
    \n+
    343 for (size_type i=0; i<n; i++)
    \n+
    344 y[i] += alpha * p_ * x[i];
    \n+
    345 }
    \n+
    \n+
    346
    \n+
    348 template<class X, class Y>
    \n+
    \n+
    349 void usmhv (const K& alpha, const X& x, Y& y) const
    \n+
    350 {
    \n+
    351#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    352 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    353 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n+
    354#endif
    \n+
    355 for (size_type i=0; i<n; i++)
    \n+
    356 y[i] += alpha * conjugateComplex(p_) * x[i];
    \n+
    357 }
    \n+
    \n+
    358
    \n+
    359 //===== norms
    \n+
    360
    \n+
    \n+
    362 typename FieldTraits<field_type>::real_type frobenius_norm () const
    \n+
    363 {
    \n+
    364 return fvmeta::sqrt(n*p_*p_);
    \n+
    365 }
    \n+
    \n+
    366
    \n+
    \n+
    368 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
    \n+
    369 {
    \n+
    370 return n*p_*p_;
    \n+
    371 }
    \n+
    \n+
    372
    \n+
    \n+
    374 typename FieldTraits<field_type>::real_type infinity_norm () const
    \n+
    375 {
    \n+
    376 return std::abs(p_);
    \n+
    377 }
    \n+
    \n+
    378
    \n+
    \n+
    380 typename FieldTraits<field_type>::real_type infinity_norm_real () const
    \n+
    381 {
    \n+
    382 return fvmeta::absreal(p_);
    \n+
    383 }
    \n+
    \n+
    384
    \n+
    385 //===== solve
    \n+
    386
    \n+
    389 template<class V>
    \n+
    \n+
    390 void solve (V& x, const V& b) const
    \n+
    391 {
    \n+
    392 for (int i=0; i<n; i++)
    \n+
    393 x[i] = b[i]/p_;
    \n+
    394 }
    \n+
    \n+
    395
    \n+
    \n+
    398 void invert()
    \n+
    399 {
    \n+
    400 p_ = 1/p_;
    \n+
    401 }
    \n+
    \n+
    402
    \n+
    \n+
    404 K determinant () const {
    \n+
    405 return std::pow(p_,n);
    \n+
    406 }
    \n+
    \n+
    407
    \n+
    408 //===== sizes
    \n+
    409
    \n+
    \n+
    411 size_type N () const
    \n+
    412 {
    \n+
    413 return n;
    \n+
    414 }
    \n+
    \n+
    415
    \n+
    \n+
    417 size_type M () const
    \n+
    418 {
    \n+
    419 return n;
    \n+
    420 }
    \n+
    \n+
    421
    \n+
    422 //===== query
    \n+
    423
    \n+
    \n+
    425 bool exists (size_type i, size_type j) const
    \n+
    426 {
    \n+
    427#ifdef DUNE_FMatrix_WITH_CHECKING
    \n+
    428 if (i<0 || i>=n) DUNE_THROW(FMatrixError,"row index out of range");
    \n+
    429 if (j<0 || j>=n) DUNE_THROW(FMatrixError,"column index out of range");
    \n+
    430#endif
    \n+
    431 return i==j;
    \n+
    432 }
    \n+
    \n+
    433
    \n+
    434 //===== conversion operator
    \n+
    435
    \n+
    \n+
    437 friend std::ostream& operator<< (std::ostream& s, const ScaledIdentityMatrix<K,n>& a)
    \n+
    438 {
    \n+
    439 for (size_type i=0; i<n; i++) {
    \n+
    440 for (size_type j=0; j<n; j++)
    \n+
    441 s << ((i==j) ? a.p_ : 0) << " ";
    \n+
    442 s << std::endl;
    \n+
    443 }
    \n+
    444 return s;
    \n+
    445 }
    \n+
    \n+
    446
    \n+
    \n+\n+
    449 {
    \n+
    450 return reference(const_cast<K*>(&p_), i);
    \n+
    451 }
    \n+
    \n+
    452
    \n+
    \n+\n+
    455 {
    \n+
    456 return const_reference(const_cast<K*>(&p_), i);
    \n+
    457 }
    \n+
    \n+
    458
    \n+
    \n+
    460 const K& diagonal(size_type /*i*/) const
    \n+
    461 {
    \n+
    462 return p_;
    \n+
    463 }
    \n+
    \n+
    464
    \n+
    \n+\n+
    467 {
    \n+
    468 return p_;
    \n+
    469 }
    \n+
    \n+
    470
    \n+
    \n+
    473 const K& scalar() const
    \n+
    474 {
    \n+
    475 return p_;
    \n+
    476 }
    \n+
    \n+
    477
    \n+
    \n+\n+
    481 {
    \n+
    482 return p_;
    \n+
    483 }
    \n+
    \n+
    484
    \n+
    485 private:
    \n+
    486 // the data, very simply a single number
    \n+
    487 K p_;
    \n+
    488
    \n+
    489 };
    \n+
    \n+
    490
    \n+
    491 template <class DenseMatrix, class field, int N>
    \n+
    \n+
    492 struct DenseMatrixAssigner<DenseMatrix, ScaledIdentityMatrix<field, N>> {
    \n+
    \n+
    493 static void apply(DenseMatrix& denseMatrix,
    \n+\n+
    495 assert(denseMatrix.M() == N);
    \n+
    496 assert(denseMatrix.N() == N);
    \n+
    497 denseMatrix = field(0);
    \n+
    498 for (int i = 0; i < N; ++i)
    \n+
    499 denseMatrix[i][i] = rhs.scalar();
    \n+
    500 }
    \n+
    \n+
    501 };
    \n+
    \n+
    502
    \n+
    503 template<class K, int n>
    \n+
    \n+
    504 struct FieldTraits< ScaledIdentityMatrix<K, n> >
    \n+
    505 {
    \n+\n+
    507 using real_type = typename FieldTraits<field_type>::real_type;
    \n+
    508 };
    \n+
    \n+
    509
    \n+
    510} // end namespace
    \n+
    511
    \n+
    512#endif
    \n
    Definition allocator.hh:11
    \n-
    constexpr std::size_t blockLevel()
    Determine the block level of a possibly nested vector/matrix type.
    Definition blocklevel.hh:176
    \n-
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n-
    Definition solverregistry.hh:77
    \n-
    Definition solverregistry.hh:79
    \n+
    A multiple of the identity matrix of static size.
    Definition scaledidmatrix.hh:30
    \n+
    void usmhv(const K &alpha, const X &x, Y &y) const
    y += alpha A^H x
    Definition scaledidmatrix.hh:349
    \n+
    void mmtv(const X &x, Y &y) const
    y -= A^T x
    Definition scaledidmatrix.hh:301
    \n+
    ScaledIdentityMatrix & operator-=(const ScaledIdentityMatrix &y)
    vector space subtraction
    Definition scaledidmatrix.hh:165
    \n+
    const_row_type::ConstIterator ConstColIterator
    rename the iterators for easier access
    Definition scaledidmatrix.hh:127
    \n+
    ConstIterator end() const
    end iterator
    Definition scaledidmatrix.hh:136
    \n+
    Iterator beforeBegin()
    Definition scaledidmatrix.hh:114
    \n+
    bool operator!=(const ScaledIdentityMatrix &other) const
    incomparison operator
    Definition scaledidmatrix.hh:225
    \n+
    void mmv(const X &x, Y &y) const
    y -= A x
    Definition scaledidmatrix.hh:289
    \n+
    std::size_t size_type
    The type used for the index access and size operations.
    Definition scaledidmatrix.hh:43
    \n+
    void usmv(const K &alpha, const X &x, Y &y) const
    y += alpha A x
    Definition scaledidmatrix.hh:325
    \n+
    row_type::Iterator ColIterator
    rename the iterators for easier access
    Definition scaledidmatrix.hh:91
    \n+
    const_row_type const_reference
    Definition scaledidmatrix.hh:49
    \n+
    void mv(const X &x, Y &y) const
    y = A x
    Definition scaledidmatrix.hh:234
    \n+
    void umtv(const X &x, Y &y) const
    y += A^T x
    Definition scaledidmatrix.hh:265
    \n+
    void umhv(const X &x, Y &y) const
    y += A^H x
    Definition scaledidmatrix.hh:277
    \n+
    DiagonalRowVector< K, n > row_type
    Each row is implemented by a field vector.
    Definition scaledidmatrix.hh:46
    \n+
    ContainerWrapperIterator< const WrapperType, reference, reference > Iterator
    Iterator class for sequential access.
    Definition scaledidmatrix.hh:85
    \n+
    Iterator beforeEnd()
    Definition scaledidmatrix.hh:107
    \n+
    K determinant() const
    calculates the determinant of this matrix
    Definition scaledidmatrix.hh:404
    \n+
    K field_type
    export the type representing the field
    Definition scaledidmatrix.hh:37
    \n+
    void usmtv(const K &alpha, const X &x, Y &y) const
    y += alpha A^T x
    Definition scaledidmatrix.hh:337
    \n+
    Iterator end()
    end iterator
    Definition scaledidmatrix.hh:100
    \n+
    Iterator iterator
    typedef for stl compliant access
    Definition scaledidmatrix.hh:87
    \n+
    const K & scalar() const
    Get const reference to the scalar diagonal value.
    Definition scaledidmatrix.hh:473
    \n+
    void umv(const X &x, Y &y) const
    y += A x
    Definition scaledidmatrix.hh:253
    \n+
    const K & diagonal(size_type) const
    Get const reference to diagonal entry.
    Definition scaledidmatrix.hh:460
    \n+
    @ rows
    The number of rows.
    Definition scaledidmatrix.hh:54
    \n+
    @ cols
    The number of columns.
    Definition scaledidmatrix.hh:56
    \n+
    ScaledIdentityMatrix & operator=(const K &k)
    Definition scaledidmatrix.hh:71
    \n+
    ContainerWrapperIterator< const WrapperType, const_reference, const_reference > ConstIterator
    Iterator class for sequential access.
    Definition scaledidmatrix.hh:121
    \n+
    K & diagonal(size_type)
    Get reference to diagonal entry.
    Definition scaledidmatrix.hh:466
    \n+
    void solve(V &x, const V &b) const
    Solve system A x = b.
    Definition scaledidmatrix.hh:390
    \n+
    bool exists(size_type i, size_type j) const
    return true when (i,j) is in pattern
    Definition scaledidmatrix.hh:425
    \n+
    Iterator RowIterator
    rename the iterators for easier access
    Definition scaledidmatrix.hh:89
    \n+
    ConstIterator const_iterator
    typedef for stl compliant access
    Definition scaledidmatrix.hh:123
    \n+
    ScaledIdentityMatrix()
    Default constructor.
    Definition scaledidmatrix.hh:62
    \n+
    bool operator==(const ScaledIdentityMatrix &other) const
    comparison operator
    Definition scaledidmatrix.hh:219
    \n+
    ConstIterator beforeBegin() const
    Definition scaledidmatrix.hh:150
    \n+
    ScaledIdentityMatrix & operator/=(const K &k)
    vector space division by scalar
    Definition scaledidmatrix.hh:192
    \n+
    friend std::ostream & operator<<(std::ostream &s, const ScaledIdentityMatrix< K, n > &a)
    Sends the matrix to an output stream.
    Definition scaledidmatrix.hh:437
    \n+
    FieldTraits< field_type >::real_type frobenius_norm2() const
    square of frobenius norm, need for block recursion
    Definition scaledidmatrix.hh:368
    \n+
    FieldTraits< field_type >::real_type frobenius_norm() const
    frobenius norm: sqrt(sum over squared values of entries)
    Definition scaledidmatrix.hh:362
    \n+
    FieldTraits< field_type >::real_type infinity_norm() const
    infinity norm (row sum norm, how to generalize for blocks?)
    Definition scaledidmatrix.hh:374
    \n+
    ConstIterator ConstRowIterator
    rename the iterators for easier access
    Definition scaledidmatrix.hh:125
    \n+
    ConstIterator beforeEnd() const
    Definition scaledidmatrix.hh:143
    \n+
    size_type M() const
    number of blocks in column direction
    Definition scaledidmatrix.hh:417
    \n+
    const_reference operator[](size_type i) const
    Return const_reference object as row replacement.
    Definition scaledidmatrix.hh:454
    \n+
    ScaledIdentityMatrix(const K &k)
    Constructor initializing the whole matrix with a scalar.
    Definition scaledidmatrix.hh:66
    \n+
    friend auto operator*(const ScaledIdentityMatrix &matrix, Scalar scalar)
    vector space multiplication with scalar
    Definition scaledidmatrix.hh:203
    \n+
    FieldTraits< field_type >::real_type infinity_norm_real() const
    simplified infinity norm (uses Manhattan norm for complex values)
    Definition scaledidmatrix.hh:380
    \n+
    ScaledIdentityMatrix & operator*=(const K &k)
    vector space multiplication with scalar
    Definition scaledidmatrix.hh:185
    \n+
    bool identical(const ScaledIdentityMatrix< K, n > &other) const
    Definition scaledidmatrix.hh:78
    \n+
    void invert()
    Compute inverse.
    Definition scaledidmatrix.hh:398
    \n+
    Iterator begin()
    begin iterator
    Definition scaledidmatrix.hh:94
    \n+
    K & scalar()
    Get reference to the scalar diagonal value.
    Definition scaledidmatrix.hh:480
    \n+
    row_type reference
    Definition scaledidmatrix.hh:47
    \n+
    K block_type
    export the type representing the components
    Definition scaledidmatrix.hh:40
    \n+
    void mmhv(const X &x, Y &y) const
    y -= A^H x
    Definition scaledidmatrix.hh:313
    \n+
    ScaledIdentityMatrix & operator+=(const ScaledIdentityMatrix &y)
    vector space addition
    Definition scaledidmatrix.hh:158
    \n+
    DiagonalRowVectorConst< K, n > const_row_type
    Definition scaledidmatrix.hh:48
    \n+
    void mtv(const X &x, Y &y) const
    y = A^T x
    Definition scaledidmatrix.hh:246
    \n+
    reference operator[](size_type i)
    Return reference object as row replacement.
    Definition scaledidmatrix.hh:448
    \n+
    ConstIterator begin() const
    begin iterator
    Definition scaledidmatrix.hh:130
    \n+
    size_type N() const
    number of blocks in row direction
    Definition scaledidmatrix.hh:411
    \n+
    static void apply(DenseMatrix &denseMatrix, ScaledIdentityMatrix< field, N > const &rhs)
    Definition scaledidmatrix.hh:493
    \n+
    typename ScaledIdentityMatrix< K, n >::field_type field_type
    Definition scaledidmatrix.hh:506
    \n+
    typename FieldTraits< field_type >::real_type real_type
    Definition scaledidmatrix.hh:507
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,120 +1,711 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-solverregistry.hh\n+scaledidmatrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5\n-6#ifndef DUNE_ISTL_SOLVERREGISTRY_HH\n-7#define DUNE_ISTL_SOLVERREGISTRY_HH\n-8\n-9#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh>\n-10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh>\n-11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n-12\n-_\b1_\b3#define DUNE_REGISTER_DIRECT_SOLVER(name, ...) \\\n-14 DUNE_REGISTRY_PUT(DirectSolverTag, name, __VA_ARGS__)\n-15\n-_\b1_\b6#define DUNE_REGISTER_PRECONDITIONER(name, ...) \\\n-17 DUNE_REGISTRY_PUT(PreconditionerTag, name, __VA_ARGS__)\n-18\n-_\b1_\b9#define DUNE_REGISTER_ITERATIVE_SOLVER(name, ...) \\\n-20 DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__)\n-21\n-22namespace _\bD_\bu_\bn_\be{\n-27 namespace {\n-28 struct DirectSolverTag {};\n-29 struct PreconditionerTag {};\n-30 struct IterativeSolverTag {};\n-31 }\n-32 templateclass Preconditioner, int\n-_\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl=1>\n-_\b3_\b3 auto _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br(){\n-34 return [](auto typeList, const auto& matrix, const Dune::ParameterTree&\n-config)\n-35 {\n-36 using _\bM_\ba_\bt_\br_\bi_\bx = typename Dune::TypeListElement<0, decltype(typeList)>::type;\n-37 using Domain = typename Dune::TypeListElement<1, decltype(typeList)>::type;\n-38 using Range = typename Dune::TypeListElement<2, decltype(typeList)>::type;\n-39 std::shared_ptr> preconditioner\n-40 = std::make_shared>\n-(matrix, config);\n-41 return preconditioner;\n-42 };\n-43 }\n+5#ifndef DUNE_ISTL_SCALEDIDMATRIX_HH\n+6#define DUNE_ISTL_SCALEDIDMATRIX_HH\n+7\n+14#include \n+15#include \n+16#include \n+17#include \n+18#include \n+19#include \n+20#include \n+21#include \n+22\n+23namespace _\bD_\bu_\bn_\be {\n+24\n+28 template\n+_\b2_\b9 class _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx\n+30 {\n+31 typedef DiagonalMatrixWrapper< ScaledIdentityMatrix > WrapperType;\n+32\n+33 public:\n+34 //===== type definitions and constants\n+35\n+_\b3_\b7 typedef K _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+38\n+_\b4_\b0 typedef K _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+41\n+_\b4_\b3 typedef std::size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n 44\n-45 templateclass Preconditioner>\n-_\b4_\b6 auto _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br(){\n-47 return [](auto typeList, const auto& matrix, const Dune::ParameterTree&\n-config)\n-48 {\n-49 using _\bM_\ba_\bt_\br_\bi_\bx = typename Dune::TypeListElement<0, decltype(typeList)>::type;\n-50 using Domain = typename Dune::TypeListElement<1, decltype(typeList)>::type;\n-51 using Range = typename Dune::TypeListElement<2, decltype(typeList)>::type;\n-52 std::shared_ptr> preconditioner\n-53 = std::make_shared>(matrix, config);\n-54 return preconditioner;\n-55 };\n-56 }\n-57\n-58 templateclass Solver>\n-_\b5_\b9 auto _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br(){\n-60 return [](auto typeList,\n-61 const auto& linearOperator,\n-62 const auto& scalarProduct,\n-63 const auto& preconditioner,\n-64 const Dune::ParameterTree& config)\n-65 {\n-66 using Domain = typename Dune::TypeListElement<0, decltype(typeList)>::type;\n-67 using Range = typename Dune::TypeListElement<1, decltype(typeList)>::type;\n-68 std::shared_ptr> solver\n-69 = std::make_shared>(linearOperator, scalarProduct,\n-preconditioner, config);\n-70 return solver;\n-71 };\n-72 }\n-73\n-74 /* This exception is thrown, when the requested solver is in the factory but\n-75 cannot be instantiated for the required template parameters\n-76 */\n-_\b7_\b7 class _\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be : public NotImplemented {};\n-78\n-_\b7_\b9 class _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\bC_\bo_\bn_\bf_\bi_\bg_\bu_\br_\ba_\bt_\bi_\bo_\bn : public InvalidStateException{};\n-80} // end namespace Dune\n-81\n-82#endif // DUNE_ISTL_SOLVERREGISTRY_HH\n-_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\n-_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh\n-_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n-Define general, extensible interface for inverse operators.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br\n-auto defaultIterativeSolverCreator()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:59\n-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br\n-auto defaultPreconditionerBlockLevelCreator()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br\n-auto defaultPreconditionerCreator()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:46\n+_\b4_\b6 typedef DiagonalRowVector _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+_\b4_\b7 typedef _\br_\bo_\bw_\b__\bt_\by_\bp_\be _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+_\b4_\b8 typedef DiagonalRowVectorConst _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+_\b4_\b9 typedef _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+50\n+52 enum {\n+_\b5_\b4 _\br_\bo_\bw_\bs = n,\n+56 _\bc_\bo_\bl_\bs = n\n+_\b5_\b7 };\n+58\n+59 //===== constructors\n+_\b6_\b2 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx () {}\n+63\n+_\b6_\b6 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx (const K& k)\n+67 : p_(k)\n+68 {}\n+69\n+70 //===== assignment from scalar\n+_\b7_\b1 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const K& k)\n+72 {\n+73 p_ = k;\n+74 return *this;\n+75 }\n+76\n+77 // check if matrix is identical to other matrix (not only identical values)\n+_\b7_\b8 bool _\bi_\bd_\be_\bn_\bt_\bi_\bc_\ba_\bl(const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b>& other) const\n+79 {\n+80 return (this==&other);\n+81 }\n+82\n+83 //===== iterator interface to rows of the matrix\n+_\b8_\b5 typedef ContainerWrapperIterator\n+_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b8_\b7 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b8_\b9 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b9_\b1 typedef typename row_type::Iterator _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+92\n+_\b9_\b4 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n+95 {\n+96 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),0);\n+97 }\n+98\n+_\b1_\b0_\b0 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n+101 {\n+102 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),n);\n+103 }\n+104\n+_\b1_\b0_\b7 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n+108 {\n+109 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),n-1);\n+110 }\n+111\n+_\b1_\b1_\b4 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n+115 {\n+116 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),-1);\n+117 }\n+118\n+119\n+_\b1_\b2_\b1 typedef ContainerWrapperIterator _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b2_\b3 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b2_\b5 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b2_\b7 typedef typename const_row_type::ConstIterator _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+128\n+_\b1_\b3_\b0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n+131 {\n+132 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),0);\n+133 }\n+134\n+_\b1_\b3_\b6 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n+137 {\n+138 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),n);\n+139 }\n+140\n+_\b1_\b4_\b3 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd() const\n+144 {\n+145 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),n-1);\n+146 }\n+147\n+_\b1_\b5_\b0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n+151 {\n+152 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),-1);\n+153 }\n+154\n+155 //===== vector space arithmetic\n+156\n+_\b1_\b5_\b8 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& y)\n+159 {\n+160 p_ += y.p_;\n+161 return *this;\n+162 }\n+163\n+_\b1_\b6_\b5 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& y)\n+166 {\n+167 p_ -= y.p_;\n+168 return *this;\n+169 }\n+170\n+_\b1_\b7_\b2 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const K& k)\n+173 {\n+174 p_ += k;\n+175 return *this;\n+176 }\n+177\n+_\b1_\b7_\b9 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const K& k)\n+180 {\n+181 p_ -= k;\n+182 return *this;\n+183 }\n+_\b1_\b8_\b5 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const K& k)\n+186 {\n+187 p_ *= k;\n+188 return *this;\n+189 }\n+190\n+_\b1_\b9_\b2 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const K& k)\n+193 {\n+194 p_ /= k;\n+195 return *this;\n+196 }\n+197\n+198 //===== binary operators\n+199\n+201 template ::value, int> = 0>\n+_\b2_\b0_\b3 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& matrix, Scalar _\bs_\bc_\ba_\bl_\ba_\br)\n+204 {\n+205 return _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:\n+_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be, n>{matrix._\bs_\bc_\ba_\bl_\ba_\br()*_\bs_\bc_\ba_\bl_\ba_\br};\n+206 }\n+207\n+209 template ::value, int> = 0>\n+_\b2_\b1_\b1 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b (Scalar _\bs_\bc_\ba_\bl_\ba_\br, const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n+212 {\n+213 return _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bc_\ba_\bl_\ba_\br_\b,_\bK_\b>_\b:_\b:\n+_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be, n>{_\bs_\bc_\ba_\bl_\ba_\br*matrix._\bs_\bc_\ba_\bl_\ba_\br()};\n+214 }\n+215\n+216 //===== comparison ops\n+217\n+_\b2_\b1_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& other) const\n+220 {\n+221 return p_==other._\bs_\bc_\ba_\bl_\ba_\br();\n+222 }\n+223\n+_\b2_\b2_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& other) const\n+226 {\n+227 return p_!=other._\bs_\bc_\ba_\bl_\ba_\br();\n+228 }\n+229\n+230 //===== linear maps\n+231\n+233 template\n+_\b2_\b3_\b4 void _\bm_\bv (const X& x, Y& y) const\n+235 {\n+236#ifdef DUNE_FMatrix_WITH_CHECKING\n+237 if (x.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n+238 if (y.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n+239#endif\n+240 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b2_\b4_\b6 void _\bm_\bt_\bv (const X& x, Y& y) const\n+247 {\n+248 _\bm_\bv(x, y);\n+249 }\n+250\n+252 template\n+_\b2_\b5_\b3 void _\bu_\bm_\bv (const X& x, Y& y) const\n+254 {\n+255#ifdef DUNE_FMatrix_WITH_CHECKING\n+256 if (x.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n+257 if (y.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n+258#endif\n+259 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b2_\b6_\b5 void _\bu_\bm_\bt_\bv (const X& x, Y& y) const\n+266 {\n+267#ifdef DUNE_FMatrix_WITH_CHECKING\n+268 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n+269 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n+270#endif\n+271 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b2_\b7_\b7 void _\bu_\bm_\bh_\bv (const X& x, Y& y) const\n+278 {\n+279#ifdef DUNE_FMatrix_WITH_CHECKING\n+280 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n+281 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n+282#endif\n+283 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b2_\b8_\b9 void _\bm_\bm_\bv (const X& x, Y& y) const\n+290 {\n+291#ifdef DUNE_FMatrix_WITH_CHECKING\n+292 if (x.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n+293 if (y.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n+294#endif\n+295 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b0_\b1 void _\bm_\bm_\bt_\bv (const X& x, Y& y) const\n+302 {\n+303#ifdef DUNE_FMatrix_WITH_CHECKING\n+304 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n+305 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n+306#endif\n+307 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b1_\b3 void _\bm_\bm_\bh_\bv (const X& x, Y& y) const\n+314 {\n+315#ifdef DUNE_FMatrix_WITH_CHECKING\n+316 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n+317 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n+318#endif\n+319 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b2_\b5 void _\bu_\bs_\bm_\bv (const K& alpha, const X& x, Y& y) const\n+326 {\n+327#ifdef DUNE_FMatrix_WITH_CHECKING\n+328 if (x.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n+329 if (y.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n+330#endif\n+331 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b3_\b7 void _\bu_\bs_\bm_\bt_\bv (const K& alpha, const X& x, Y& y) const\n+338 {\n+339#ifdef DUNE_FMatrix_WITH_CHECKING\n+340 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n+341 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n+342#endif\n+343 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b4_\b9 void _\bu_\bs_\bm_\bh_\bv (const K& alpha, const X& x, Y& y) const\n+350 {\n+351#ifdef DUNE_FMatrix_WITH_CHECKING\n+352 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n+353 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n+354#endif\n+355 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm () const\n+363 {\n+364 return fvmeta::sqrt(n*p_*p_);\n+365 }\n+366\n+_\b3_\b6_\b8 typename FieldTraits::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2 () const\n+369 {\n+370 return n*p_*p_;\n+371 }\n+372\n+_\b3_\b7_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm () const\n+375 {\n+376 return std::abs(p_);\n+377 }\n+378\n+_\b3_\b8_\b0 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl () const\n+381 {\n+382 return fvmeta::absreal(p_);\n+383 }\n+384\n+385 //===== solve\n+386\n+389 template\n+_\b3_\b9_\b0 void _\bs_\bo_\bl_\bv_\be (V& x, const V& b) const\n+391 {\n+392 for (int i=0; i=n) DUNE_THROW(FMatrixError,\"row index out of range\");\n+429 if (j<0 || j>=n) DUNE_THROW(FMatrixError,\"column index out of range\");\n+430#endif\n+431 return i==j;\n+432 }\n+433\n+434 //===== conversion operator\n+435\n+_\b4_\b3_\b7 friend std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const\n+_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b>& a)\n+438 {\n+439 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i(&p_), i);\n+451 }\n+452\n+_\b4_\b5_\b4 _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+455 {\n+456 return _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be(const_cast(&p_), i);\n+457 }\n+458\n+_\b4_\b6_\b0 const K& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*i*/) const\n+461 {\n+462 return p_;\n+463 }\n+464\n+_\b4_\b6_\b6 K& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*i*/)\n+467 {\n+468 return p_;\n+469 }\n+470\n+_\b4_\b7_\b3 const K& _\bs_\bc_\ba_\bl_\ba_\br() const\n+474 {\n+475 return p_;\n+476 }\n+477\n+_\b4_\b8_\b0 K& _\bs_\bc_\ba_\bl_\ba_\br()\n+481 {\n+482 return p_;\n+483 }\n+484\n+485 private:\n+486 // the data, very simply a single number\n+487 K p_;\n+488\n+489 };\n+490\n+491 template \n+_\b4_\b9_\b2 struct DenseMatrixAssigner> {\n+_\b4_\b9_\b3 static void _\ba_\bp_\bp_\bl_\by(DenseMatrix& denseMatrix,\n+494 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bf_\bi_\be_\bl_\bd_\b,_\b _\bN_\b> const& rhs) {\n+495 assert(denseMatrix.M() == N);\n+496 assert(denseMatrix.N() == N);\n+497 denseMatrix = field(0);\n+498 for (int i = 0; i < N; ++i)\n+499 denseMatrix[i][i] = rhs._\bs_\bc_\ba_\bl_\ba_\br();\n+500 }\n+501 };\n+502\n+503 template\n+_\b5_\b0_\b4 struct FieldTraits< _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx >\n+505 {\n+_\b5_\b0_\b6 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bn_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b5_\b0_\b7 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename FieldTraits::real_type;\n+508 };\n+509\n+510} // end namespace\n+511\n+512#endif\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl\n-constexpr std::size_t blockLevel()\n-Determine the block level of a possibly nested vector/matrix type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn blocklevel.hh:176\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-A generic dynamic dense matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\bC_\bo_\bn_\bf_\bi_\bg_\bu_\br_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx\n+A multiple of the identity matrix of static size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bh_\bv\n+void usmhv(const K &alpha, const X &x, Y &y) const\n+y += alpha A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:349\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bt_\bv\n+void mmtv(const X &x, Y &y) const\n+y -= A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n+ScaledIdentityMatrix & operator-=(const ScaledIdentityMatrix &y)\n+vector space subtraction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+const_row_type::ConstIterator ConstColIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:127\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+ConstIterator end() const\n+end iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+Iterator beforeBegin()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:114\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const ScaledIdentityMatrix &other) const\n+incomparison operator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:225\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bv\n+void mmv(const X &x, Y &y) const\n+y -= A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:289\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::size_t size_type\n+The type used for the index access and size operations.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bv\n+void usmv(const K &alpha, const X &x, Y &y) const\n+y += alpha A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:325\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::Iterator ColIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const_row_type const_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n+void mv(const X &x, Y &y) const\n+y = A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:234\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bt_\bv\n+void umtv(const X &x, Y &y) const\n+y += A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:265\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bh_\bv\n+void umhv(const X &x, Y &y) const\n+y += A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:277\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+DiagonalRowVector< K, n > row_type\n+Each row is implemented by a field vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ContainerWrapperIterator< const WrapperType, reference, reference > Iterator\n+Iterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+Iterator beforeEnd()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\be_\bt_\be_\br_\bm_\bi_\bn_\ba_\bn_\bt\n+K determinant() const\n+calculates the determinant of this matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:404\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+K field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bt_\bv\n+void usmtv(const K &alpha, const X &x, Y &y) const\n+y += alpha A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:337\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+Iterator end()\n+end iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator iterator\n+typedef for stl compliant access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br\n+const K & scalar() const\n+Get const reference to the scalar diagonal value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:473\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bv\n+void umv(const X &x, Y &y) const\n+y += A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:253\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+const K & diagonal(size_type) const\n+Get const reference to diagonal entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:460\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bs\n+@ rows\n+The number of rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bl_\bs\n+@ cols\n+The number of columns.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+ScaledIdentityMatrix & operator=(const K &k)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ContainerWrapperIterator< const WrapperType, const_reference, const_reference >\n+ConstIterator\n+Iterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:121\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+K & diagonal(size_type)\n+Get reference to diagonal entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bo_\bl_\bv_\be\n+void solve(V &x, const V &b) const\n+Solve system A x = b.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:390\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n+bool exists(size_type i, size_type j) const\n+return true when (i,j) is in pattern\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:425\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator RowIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator const_iterator\n+typedef for stl compliant access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:123\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx\n+ScaledIdentityMatrix()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const ScaledIdentityMatrix &other) const\n+comparison operator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+ConstIterator beforeBegin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n+ScaledIdentityMatrix & operator/=(const K &k)\n+vector space division by scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:192\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+friend std::ostream & operator<<(std::ostream &s, const ScaledIdentityMatrix<\n+K, n > &a)\n+Sends the matrix to an output stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:437\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2\n+FieldTraits< field_type >::real_type frobenius_norm2() const\n+square of frobenius norm, need for block recursion\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:368\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm\n+FieldTraits< field_type >::real_type frobenius_norm() const\n+frobenius norm: sqrt(sum over squared values of entries)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:362\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n+FieldTraits< field_type >::real_type infinity_norm() const\n+infinity norm (row sum norm, how to generalize for blocks?)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:374\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator ConstRowIterator\n+rename the iterators for easier access\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+ConstIterator beforeEnd() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:143\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+size_type M() const\n+number of blocks in column direction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:417\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const_reference operator[](size_type i) const\n+Return const_reference object as row replacement.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:454\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx\n+ScaledIdentityMatrix(const K &k)\n+Constructor initializing the whole matrix with a scalar.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+friend auto operator*(const ScaledIdentityMatrix &matrix, Scalar scalar)\n+vector space multiplication with scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:203\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n+FieldTraits< field_type >::real_type infinity_norm_real() const\n+simplified infinity norm (uses Manhattan norm for complex values)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:380\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n+ScaledIdentityMatrix & operator*=(const K &k)\n+vector space multiplication with scalar\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:185\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bd_\be_\bn_\bt_\bi_\bc_\ba_\bl\n+bool identical(const ScaledIdentityMatrix< K, n > &other) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt\n+void invert()\n+Compute inverse.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:398\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+Iterator begin()\n+begin iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:94\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br\n+K & scalar()\n+Get reference to the scalar diagonal value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:480\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+row_type reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:47\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+K block_type\n+export the type representing the components\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bh_\bv\n+void mmhv(const X &x, Y &y) const\n+y -= A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:313\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n+ScaledIdentityMatrix & operator+=(const ScaledIdentityMatrix &y)\n+vector space addition\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+DiagonalRowVectorConst< K, n > const_row_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bt_\bv\n+void mtv(const X &x, Y &y) const\n+y = A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:246\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+reference operator[](size_type i)\n+Return reference object as row replacement.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:448\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+ConstIterator begin() const\n+begin iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:130\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+size_type N() const\n+number of blocks in row direction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:411\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bf_\bi_\be_\bl_\bd_\b,_\b _\bN_\b _\b>_\b _\b>_\b:_\b:\n+_\ba_\bp_\bp_\bl_\by\n+static void apply(DenseMatrix &denseMatrix, ScaledIdentityMatrix< field, N >\n+const &rhs)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:493\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename ScaledIdentityMatrix< K, n >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:506\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+typename FieldTraits< field_type >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:507\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00041.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00041.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: scalarproducts.hh File Reference\n+dune-istl: schwarz.hh File Reference\n \n \n \n \n \n \n \n@@ -71,71 +71,57 @@\n \n \n \n \n+
    schwarz.hh File Reference
    \n \n
    \n-\n-

    Define base class for scalar product and norm. \n-More...

    \n-
    #include <cmath>
    \n-#include <complex>
    \n-#include <iostream>
    \n-#include <iomanip>
    \n-#include <string>
    \n-#include <memory>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/shared_ptr.hh>
    \n-#include "bvector.hh"
    \n-#include "solvercategory.hh"
    \n+
    #include <iostream>
    \n+#include <fstream>
    \n+#include <vector>
    \n+#include <sstream>
    \n+#include <cmath>
    \n+#include <dune/common/timer.hh>
    \n+#include "io.hh"
    \n+#include "bvector.hh"
    \n+#include "vbvector.hh"
    \n+#include "bcrsmatrix.hh"
    \n+#include "gsetc.hh"
    \n+#include "ilu.hh"
    \n+#include "operators.hh"
    \n+#include "solvers.hh"
    \n+#include "preconditioners.hh"
    \n+#include "scalarproducts.hh"
    \n+#include "owneroverlapcopy.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n

    \n 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...
     
    class  Dune::SeqScalarProduct< X >
     Default implementation for the scalar case. More...
    class  Dune::OverlappingSchwarzOperator< M, X, Y, C >
     An overlapping Schwarz operator. More...
     
    class  Dune::NonoverlappingSchwarzScalarProduct< X, C >
     Nonoverlapping Scalar Product with communication object. More...
    class  Dune::ParSSOR< M, X, Y, C >
     A parallel SSOR preconditioner. More...
     
    class  Dune::OverlappingSchwarzScalarProduct< X, C >
     Scalar product for overlapping Schwarz methods. More...
    class  Dune::BlockPreconditioner< X, Y, C, P >
     Block parallel preconditioner. More...
     
    \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n

    \n-Functions

    template<class X , class Comm >
    std::shared_ptr< ScalarProduct< X > > Dune::makeScalarProduct (std::shared_ptr< const Comm > comm, SolverCategory::Category category)
     Choose the appropriate scalar product for a solver category.
     
    template<class X , class Comm >
    std::shared_ptr< ScalarProduct< X > > Dune::createScalarProduct (const Comm &comm, SolverCategory::Category category)
     
    namespace  Dune::Amg
     
    \n-

    Detailed Description

    \n-

    Define base class for scalar product and norm.

    \n-

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

    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,60 +1,43 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-scalarproducts.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bS_\bc_\ba_\bl_\ba_\br_\b _\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs\n-Define base class for scalar product and norm. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+schwarz.hh File Reference\n #include \n-#include \n-#include \n-#include \n-#include \n-#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bi_\bo_\b._\bh_\bh\"\n #include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n+#include \"_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n+#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n+#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n+#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n+#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n+#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n+#include \"_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bX_\b _\b>\n-\u00a0 Base class for scalar product and norm computation. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bX_\b,_\b _\bC_\b _\b>\n-\u00a0 Scalar product for overlapping Schwarz methods. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>\n+\u00a0 An overlapping Schwarz operator. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bX_\b _\b>\n-\u00a0 Default implementation for the scalar case. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>\n+\u00a0 A parallel SSOR preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bX_\b,_\b _\bC_\b _\b>\n-\u00a0 Nonoverlapping Scalar Product with communication object. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bX_\b,_\b _\bC_\b _\b>\n-\u00a0 Scalar product for overlapping Schwarz methods. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bP_\b _\b>\n+\u00a0 Block parallel preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (std::\n- shared_ptr< const Comm > comm,\n- _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category)\n-\u00a0 Choose the appropriate scalar product\n- for a solver category.\n-\u00a0\n-template\n-std::shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const Comm\n- &comm, _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n- category)\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Define base class for scalar product and norm.\n-These classes have to be implemented differently for different data\n-partitioning strategies. Default implementations for the sequential case are\n-provided.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00041_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00041_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: scalarproducts.hh Source File\n+dune-istl: schwarz.hh Source File\n \n \n \n \n \n \n \n@@ -74,224 +74,298 @@\n \n
    \n \n
    \n \n
    \n-
    scalarproducts.hh
    \n+
    schwarz.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_SCALARPRODUCTS_HH
    \n-
    6#define DUNE_ISTL_SCALARPRODUCTS_HH
    \n+
    5#ifndef DUNE_ISTL_SCHWARZ_HH
    \n+
    6#define DUNE_ISTL_SCHWARZ_HH
    \n
    7
    \n-
    8#include <cmath>
    \n-
    9#include <complex>
    \n-
    10#include <iostream>
    \n-
    11#include <iomanip>
    \n-
    12#include <string>
    \n-
    13#include <memory>
    \n+
    8#include <iostream> // for input/output to shell
    \n+
    9#include <fstream> // for input/output to files
    \n+
    10#include <vector> // STL vector class
    \n+
    11#include <sstream>
    \n+
    12
    \n+
    13#include <cmath> // Yes, we do some math here
    \n
    14
    \n-
    15#include <dune/common/exceptions.hh>
    \n-
    16#include <dune/common/shared_ptr.hh>
    \n-
    17
    \n-
    18#include "bvector.hh"
    \n-
    19#include "solvercategory.hh"
    \n-
    20
    \n-
    21
    \n-
    22namespace Dune {
    \n-
    51 template<class X>
    \n-
    \n-\n-
    53 public:
    \n-
    55 typedef X domain_type;
    \n-
    56 typedef typename X::field_type field_type;
    \n-
    57 typedef typename FieldTraits<field_type>::real_type real_type;
    \n-
    58
    \n-
    \n-
    63 virtual field_type dot (const X& x, const X& y) const
    \n-
    64 {
    \n-
    65 return x.dot(y);
    \n-
    66 }
    \n-
    \n-
    67
    \n-
    \n-
    71 virtual real_type norm (const X& x) const
    \n-
    72 {
    \n-
    73 return x.two_norm();
    \n-
    74 }
    \n-
    \n-
    75
    \n-
    \n-\n-
    78 {
    \n-\n-
    80 }
    \n-
    \n-
    81
    \n-
    83 virtual ~ScalarProduct () {}
    \n-
    84 };
    \n-
    \n-
    85
    \n-
    97 template<class X, class C>
    \n-
    \n-\n-
    99 {
    \n-
    100 public:
    \n-
    105 typedef X domain_type;
    \n-
    107 typedef typename X::field_type field_type;
    \n-
    108 typedef typename FieldTraits<field_type>::real_type real_type;
    \n-\n+
    15#include <dune/common/timer.hh>
    \n+
    16
    \n+
    17#include "io.hh"
    \n+
    18#include "bvector.hh"
    \n+
    19#include "vbvector.hh"
    \n+
    20#include "bcrsmatrix.hh"
    \n+
    21#include "io.hh"
    \n+
    22#include "gsetc.hh"
    \n+
    23#include "ilu.hh"
    \n+
    24#include "operators.hh"
    \n+
    25#include "solvers.hh"
    \n+
    26#include "preconditioners.hh"
    \n+
    27#include "scalarproducts.hh"
    \n+
    28#include "owneroverlapcopy.hh"
    \n+
    29
    \n+
    30namespace Dune {
    \n+
    31
    \n+
    73 template<class M, class X, class Y, class C>
    \n+
    \n+\n+
    75 {
    \n+
    76 public:
    \n+
    81 typedef M matrix_type;
    \n+
    86 typedef X domain_type;
    \n+
    91 typedef Y range_type;
    \n+
    93 typedef typename X::field_type field_type;
    \n+\n+
    99
    \n+
    \n+\n+
    108 : _A_(stackobject_to_shared_ptr(A)), communication(com)
    \n+
    109 {}
    \n+
    \n+
    110
    \n+
    \n+
    111 OverlappingSchwarzOperator (const std::shared_ptr<matrix_type> A, const communication_type& com)
    \n+
    112 : _A_(A), communication(com)
    \n+
    113 {}
    \n+
    \n
    114
    \n-
    \n-
    120 ParallelScalarProduct (std::shared_ptr<const communication_type> com, SolverCategory::Category cat)
    \n-
    121 : _communication(com), _category(cat)
    \n-
    122 {}
    \n+
    \n+
    116 virtual void apply (const X& x, Y& y) const
    \n+
    117 {
    \n+
    118 y = 0;
    \n+
    119 _A_->umv(x,y); // result is consistent on interior+border
    \n+
    120 communication.project(y); // we want this here to avoid it before the preconditioner
    \n+
    121 // since there d is const!
    \n+
    122 }
    \n
    \n
    123
    \n-
    \n-\n-
    131 : ParallelScalarProduct(stackobject_to_shared_ptr(com), cat)
    \n-
    132 {}
    \n+
    \n+
    125 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
    \n+
    126 {
    \n+
    127 _A_->usmv(alpha,x,y); // result is consistent on interior+border
    \n+
    128 communication.project(y); // we want this here to avoid it before the preconditioner
    \n+
    129 // since there d is const!
    \n+
    130 }
    \n+
    \n+
    131
    \n+
    \n+
    133 virtual const matrix_type& getmat () const
    \n+
    134 {
    \n+
    135 return *_A_;
    \n+
    136 }
    \n
    \n-
    133
    \n-
    134
    \n+
    137
    \n
    \n-
    139 virtual field_type dot (const X& x, const X& y) const override
    \n+\n
    140 {
    \n-
    141 field_type result(0);
    \n-
    142 _communication->dot(x,y,result); // explicitly loop and apply masking
    \n-
    143 return result;
    \n-
    144 }
    \n-
    \n-
    145
    \n-
    \n-
    149 virtual real_type norm (const X& x) const override
    \n-
    150 {
    \n-
    151 return _communication->norm(x);
    \n-
    152 }
    \n-
    \n-
    153
    \n-
    \n-
    155 virtual SolverCategory::Category category() const override
    \n-
    156 {
    \n-
    157 return _category;
    \n-
    158 }
    \n-
    \n-
    159
    \n-
    160 private:
    \n-
    161 std::shared_ptr<const communication_type> _communication;
    \n-
    162 SolverCategory::Category _category;
    \n-
    163 };
    \n-
    \n-
    164
    \n-
    166 template<class X>
    \n-
    \n-\n-
    168 {
    \n-
    169 using ScalarProduct<X>::ScalarProduct;
    \n-
    170 };
    \n-
    \n-
    171
    \n-
    177 template<class X, class C>
    \n-
    \n-\n-
    179 {
    \n-
    180 public:
    \n-
    \n-
    181 NonoverlappingSchwarzScalarProduct (std::shared_ptr<const C> comm) :
    \n-
    182 ParallelScalarProduct<X,C>(comm,SolverCategory::nonoverlapping) {}
    \n-
    \n-
    183
    \n-
    \n-\n-
    185 ParallelScalarProduct<X,C>(comm,SolverCategory::nonoverlapping) {}
    \n-
    \n-
    186 };
    \n+\n+
    142 }
    \n
    \n+
    143
    \n+
    144
    \n+
    \n+\n+
    147 {
    \n+
    148 return communication;
    \n+
    149 }
    \n+
    \n+
    150 private:
    \n+
    151 const std::shared_ptr<const matrix_type>_A_;
    \n+
    152 const communication_type& communication;
    \n+
    153 };
    \n+
    \n+
    154
    \n+
    174 template<class M, class X, class Y, class C>
    \n+
    \n+
    175 class ParSSOR : public Preconditioner<X,Y> {
    \n+
    176 public:
    \n+
    178 typedef M matrix_type;
    \n+
    180 typedef X domain_type;
    \n+
    182 typedef Y range_type;
    \n+
    184 typedef typename X::field_type field_type;
    \n+\n
    187
    \n-
    199 template<class X, class C>
    \n-
    \n-\n-
    201 {
    \n-
    202 public:
    \n-
    \n-
    203 OverlappingSchwarzScalarProduct (std::shared_ptr<const C> comm) :
    \n-
    204 ParallelScalarProduct<X,C>(comm, SolverCategory::overlapping) {}
    \n+
    \n+
    197 ParSSOR (const matrix_type& A, int n, field_type w, const communication_type& c)
    \n+
    198 : _A_(A), _n(n), _w(w), communication(c)
    \n+
    199 { }
    \n
    \n-
    205
    \n+
    200
    \n
    \n-\n-
    207 ParallelScalarProduct<X,C>(comm,SolverCategory::overlapping) {}
    \n-
    \n-
    208 };
    \n-
    \n-
    209
    \n-
    223 template<class X, class Comm>
    \n-
    \n-
    224 std::shared_ptr<ScalarProduct<X>> makeScalarProduct(std::shared_ptr<const Comm> comm, SolverCategory::Category category)
    \n-
    225 {
    \n-
    226 switch(category)
    \n-
    227 {
    \n-\n-
    229 return
    \n-
    230 std::make_shared<ScalarProduct<X>>();
    \n-
    231 default:
    \n-
    232 return
    \n-
    233 std::make_shared<ParallelScalarProduct<X,Comm>>(comm,category);
    \n-
    234 }
    \n-
    235 }
    \n-
    \n-
    236
    \n-
    241 template<class X, class Comm>
    \n-
    \n-
    242 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const Comm& comm, SolverCategory::Category category)
    \n-
    243 { return makeScalarProduct<X>(stackobject_to_shared_ptr(comm), category); }
    \n-
    \n-
    244
    \n-
    245} // end namespace Dune
    \n-
    246
    \n-
    247#endif
    \n-\n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+
    206 virtual void pre (X& x, [[maybe_unused]] Y& b)
    \n+
    207 {
    \n+
    208 communication.copyOwnerToAll(x,x); // make dirichlet values consistent
    \n+
    209 }
    \n+
    \n+
    210
    \n+
    \n+
    216 virtual void apply (X& v, const Y& d)
    \n+
    217 {
    \n+
    218 for (int i=0; i<_n; i++) {
    \n+
    219 bsorf(_A_,v,d,_w);
    \n+
    220 bsorb(_A_,v,d,_w);
    \n+
    221 }
    \n+
    222 communication.copyOwnerToAll(v,v);
    \n+
    223 }
    \n+
    \n+
    224
    \n+
    230 virtual void post ([[maybe_unused]] X& x) {}
    \n+
    231
    \n+
    \n+\n+
    234 {
    \n+\n+
    236 }
    \n+
    \n+
    237
    \n+
    238 private:
    \n+
    240 const matrix_type& _A_;
    \n+
    242 int _n;
    \n+
    244 field_type _w;
    \n+
    246 const communication_type& communication;
    \n+
    247 };
    \n+
    \n+
    248
    \n+
    249 namespace Amg
    \n+
    250 {
    \n+
    251 template<class T> struct ConstructionTraits;
    \n+
    252 }
    \n+
    253
    \n+
    277 template<class X, class Y, class C, class P=Preconditioner<X,Y> >
    \n+
    \n+\n+
    279 friend struct Amg::ConstructionTraits<BlockPreconditioner<X,Y,C,P> >;
    \n+
    280 public:
    \n+
    285 typedef X domain_type;
    \n+
    290 typedef Y range_type;
    \n+
    292 typedef typename X::field_type field_type;
    \n+\n+
    298
    \n+
    \n+\n+
    307 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)
    \n+
    308 { }
    \n+
    \n+
    309
    \n+
    \n+
    317 BlockPreconditioner (const std::shared_ptr<P>& p, const communication_type& c)
    \n+
    318 : _preconditioner(p), _communication(c)
    \n+
    319 { }
    \n+
    \n+
    320
    \n+
    \n+
    326 virtual void pre (X& x, Y& b)
    \n+
    327 {
    \n+
    328 _communication.copyOwnerToAll(x,x); // make dirichlet values consistent
    \n+
    329 _preconditioner->pre(x,b);
    \n+
    330 }
    \n+
    \n+
    331
    \n+
    \n+
    337 virtual void apply (X& v, const Y& d)
    \n+
    338 {
    \n+
    339 _preconditioner->apply(v,d);
    \n+
    340 _communication.copyOwnerToAll(v,v);
    \n+
    341 }
    \n+
    \n+
    342
    \n+
    343 template<bool forward>
    \n+
    \n+
    344 void apply (X& v, const Y& d)
    \n+
    345 {
    \n+
    346 _preconditioner->template apply<forward>(v,d);
    \n+
    347 _communication.copyOwnerToAll(v,v);
    \n+
    348 }
    \n+
    \n+
    349
    \n+
    \n+
    355 virtual void post (X& x)
    \n+
    356 {
    \n+
    357 _preconditioner->post(x);
    \n+
    358 }
    \n+
    \n+
    359
    \n+
    \n+\n+
    362 {
    \n+\n+
    364 }
    \n+
    \n+
    365
    \n+
    366 private:
    \n+
    368 std::shared_ptr<P> _preconditioner;
    \n+
    369
    \n+
    371 const communication_type& _communication;
    \n+
    372 };
    \n+
    \n+
    373
    \n+
    376} // end namespace
    \n+
    377
    \n+
    378#endif
    \n+
    Some generic functions for pretty printing vectors and matrices.
    \n+
    Implementation of the BCRSMatrix class.
    \n+
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n+
    The incomplete LU factorization kernels.
    \n+
    Define base class for scalar product and norm.
    \n+
    Implementations of the inverse operator interface.
    \n+
    Define general preconditioner interface.
    \n+
    Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
    \n+\n+
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+
    void bsorb(const M &A, X &x, const Y &b, const K &w)
    SSOR step.
    Definition gsetc.hh:646
    \n+
    void bsorf(const M &A, X &x, const Y &b, const K &w)
    SOR step.
    Definition gsetc.hh:634
    \n
    Definition allocator.hh:11
    \n-
    std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, SolverCategory::Category category)
    Definition scalarproducts.hh:242
    \n-
    std::shared_ptr< ScalarProduct< X > > makeScalarProduct(std::shared_ptr< const Comm > comm, SolverCategory::Category category)
    Choose the appropriate scalar product for a solver category.
    Definition scalarproducts.hh:224
    \n-
    Base class for scalar product and norm computation.
    Definition scalarproducts.hh:52
    \n-
    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
    \n-
    virtual SolverCategory::Category category() const
    Category of the scalar product (see SolverCategory::Category)
    Definition scalarproducts.hh:77
    \n-
    X::field_type field_type
    Definition scalarproducts.hh:56
    \n-
    X domain_type
    export types, they come from the derived class
    Definition scalarproducts.hh:55
    \n-
    virtual ~ScalarProduct()
    every abstract base class has a virtual destructor
    Definition scalarproducts.hh:83
    \n-
    FieldTraits< field_type >::real_type real_type
    Definition scalarproducts.hh:57
    \n-
    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
    \n-
    Scalar product for overlapping Schwarz methods.
    Definition scalarproducts.hh:99
    \n-
    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
    \n-
    virtual SolverCategory::Category category() const override
    Category of the scalar product (see SolverCategory::Category)
    Definition scalarproducts.hh:155
    \n-
    FieldTraits< field_type >::real_type real_type
    Definition scalarproducts.hh:108
    \n-
    C communication_type
    The type of the communication object.
    Definition scalarproducts.hh:113
    \n-
    ParallelScalarProduct(const communication_type &com, SolverCategory::Category cat)
    Definition scalarproducts.hh:130
    \n-
    X domain_type
    The type of the vector to compute the scalar product on.
    Definition scalarproducts.hh:105
    \n-
    ParallelScalarProduct(std::shared_ptr< const communication_type > com, SolverCategory::Category cat)
    Definition scalarproducts.hh:120
    \n-
    X::field_type field_type
    The field type used by the vector type domain_type.
    Definition scalarproducts.hh:107
    \n-
    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
    \n-
    Default implementation for the scalar case.
    Definition scalarproducts.hh:168
    \n-
    Nonoverlapping Scalar Product with communication object.
    Definition scalarproducts.hh:179
    \n-
    NonoverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)
    Definition scalarproducts.hh:181
    \n-
    NonoverlappingSchwarzScalarProduct(const C &comm)
    Definition scalarproducts.hh:184
    \n-
    Scalar product for overlapping Schwarz methods.
    Definition scalarproducts.hh:201
    \n-
    OverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)
    Definition scalarproducts.hh:203
    \n-
    OverlappingSchwarzScalarProduct(const C &comm)
    Definition scalarproducts.hh:206
    \n-
    Categories for the solvers.
    Definition solvercategory.hh:22
    \n+
    A linear operator exporting itself in matrix form.
    Definition operators.hh:111
    \n+
    An overlapping Schwarz operator.
    Definition schwarz.hh:75
    \n+
    const communication_type & getCommunication() const
    Get the object responsible for communication.
    Definition schwarz.hh:146
    \n+
    virtual const matrix_type & getmat() const
    get the sequential assembled linear operator.
    Definition schwarz.hh:133
    \n+
    virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const
    apply operator to x, scale and add:
    Definition schwarz.hh:125
    \n+
    virtual void apply(const X &x, Y &y) const
    apply operator to x:
    Definition schwarz.hh:116
    \n+
    C communication_type
    The type of the communication object.
    Definition schwarz.hh:98
    \n+
    X domain_type
    The type of the domain.
    Definition schwarz.hh:86
    \n+
    M matrix_type
    The type of the matrix we operate on.
    Definition schwarz.hh:81
    \n+
    Y range_type
    The type of the range.
    Definition schwarz.hh:91
    \n+
    X::field_type field_type
    The field type of the range.
    Definition schwarz.hh:93
    \n+
    OverlappingSchwarzOperator(const matrix_type &A, const communication_type &com)
    constructor: just store a reference to a matrix.
    Definition schwarz.hh:107
    \n+
    OverlappingSchwarzOperator(const std::shared_ptr< matrix_type > A, const communication_type &com)
    Definition schwarz.hh:111
    \n+
    virtual SolverCategory::Category category() const
    Category of the linear operator (see SolverCategory::Category)
    Definition schwarz.hh:139
    \n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    A parallel SSOR preconditioner.
    Definition schwarz.hh:175
    \n+
    X::field_type field_type
    The field type of the preconditioner.
    Definition schwarz.hh:184
    \n+
    C communication_type
    The type of the communication object.
    Definition schwarz.hh:186
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition schwarz.hh:233
    \n+
    ParSSOR(const matrix_type &A, int n, field_type w, const communication_type &c)
    Constructor.
    Definition schwarz.hh:197
    \n+
    virtual void post(X &x)
    Clean up.
    Definition schwarz.hh:230
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition schwarz.hh:180
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition schwarz.hh:182
    \n+
    M matrix_type
    The matrix type the preconditioner is for.
    Definition schwarz.hh:178
    \n+
    virtual void apply(X &v, const Y &d)
    Apply the preconditioner.
    Definition schwarz.hh:216
    \n+
    virtual void pre(X &x, Y &b)
    Prepare the preconditioner.
    Definition schwarz.hh:206
    \n+
    Block parallel preconditioner.
    Definition schwarz.hh:278
    \n+
    virtual void pre(X &x, Y &b)
    Prepare the preconditioner.
    Definition schwarz.hh:326
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition schwarz.hh:285
    \n+
    BlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c)
    Constructor.
    Definition schwarz.hh:317
    \n+
    virtual void apply(X &v, const Y &d)
    Apply the preconditioner.
    Definition schwarz.hh:337
    \n+
    BlockPreconditioner(P &p, const communication_type &c)
    Constructor.
    Definition schwarz.hh:306
    \n+
    void apply(X &v, const Y &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition schwarz.hh:344
    \n+
    C communication_type
    The type of the communication object..
    Definition schwarz.hh:297
    \n+
    X::field_type field_type
    The field type of the preconditioner.
    Definition schwarz.hh:292
    \n+
    virtual void post(X &x)
    Clean up.
    Definition schwarz.hh:355
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition schwarz.hh:290
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition schwarz.hh:361
    \n
    Category
    Definition solvercategory.hh:23
    \n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    @ overlapping
    Category for overlapping solvers.
    Definition solvercategory.hh:29
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,269 +1,391 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-scalarproducts.hh\n+schwarz.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_SCALARPRODUCTS_HH\n-6#define DUNE_ISTL_SCALARPRODUCTS_HH\n+5#ifndef DUNE_ISTL_SCHWARZ_HH\n+6#define DUNE_ISTL_SCHWARZ_HH\n 7\n-8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n+8#include // for input/output to shell\n+9#include // for input/output to files\n+10#include // STL vector class\n+11#include \n+12\n+13#include // Yes, we do some math here\n 14\n-15#include \n-16#include \n-17\n+15#include \n+16\n+17#include \"_\bi_\bo_\b._\bh_\bh\"\n 18#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-19#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n-20\n-21\n-22namespace _\bD_\bu_\bn_\be {\n-51 template\n-_\b5_\b2 class _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt {\n-53 public:\n-_\b5_\b5 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b5_\b6 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b5_\b7 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-58\n-_\b6_\b3 virtual _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bd_\bo_\bt (const X& x, const X& y) const\n-64 {\n-65 return x.dot(y);\n-66 }\n-67\n-_\b7_\b1 virtual _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bn_\bo_\br_\bm (const X& x) const\n-72 {\n-73 return x.two_norm();\n-74 }\n-75\n-_\b7_\b7 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-78 {\n-79 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-80 }\n-81\n-_\b8_\b3 virtual _\b~_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt () {}\n-84 };\n-85\n-97 template\n-_\b9_\b8 class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt : public _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-99 {\n-100 public:\n-_\b1_\b0_\b5 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b1_\b0_\b7 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b1_\b0_\b8 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-_\b1_\b1_\b3 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n+19#include \"_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+20#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+21#include \"_\bi_\bo_\b._\bh_\bh\"\n+22#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n+23#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n+24#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n+25#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n+26#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n+27#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n+28#include \"_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\"\n+29\n+30namespace _\bD_\bu_\bn_\be {\n+31\n+73 template\n+_\b7_\b4 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br : public _\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+75 {\n+76 public:\n+_\b8_\b1 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b8_\b6 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b9_\b1 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b9_\b3 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b9_\b8 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n+99\n+_\b1_\b0_\b7 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br (const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& A, const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be&\n+com)\n+108 : _A_(stackobject_to_shared_ptr(A)), communication(com)\n+109 {}\n+110\n+_\b1_\b1_\b1 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br (const std::shared_ptr A, const\n+_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& com)\n+112 : _A_(A), communication(com)\n+113 {}\n 114\n-_\b1_\b2_\b0 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (std::shared_ptr com,\n-_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by cat)\n-121 : _communication(com), _category(cat)\n-122 {}\n+_\b1_\b1_\b6 virtual void _\ba_\bp_\bp_\bl_\by (const X& x, Y& y) const\n+117 {\n+118 y = 0;\n+119 _A_->umv(x,y); // result is consistent on interior+border\n+120 communication.project(y); // we want this here to avoid it before the\n+preconditioner\n+121 // since there d is const!\n+122 }\n 123\n-_\b1_\b3_\b0 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& com, _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:\n-_\bC_\ba_\bt_\be_\bg_\bo_\br_\by cat)\n-131 : _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(stackobject_to_shared_ptr(com), cat)\n-132 {}\n-133\n-134\n-_\b1_\b3_\b9 virtual _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bd_\bo_\bt (const X& x, const X& y) const override\n+_\b1_\b2_\b5 virtual void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha, const X& x, Y& y) const\n+126 {\n+127 _A_->usmv(alpha,x,y); // result is consistent on interior+border\n+128 communication.project(y); // we want this here to avoid it before the\n+preconditioner\n+129 // since there d is const!\n+130 }\n+131\n+_\b1_\b3_\b3 virtual const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bg_\be_\bt_\bm_\ba_\bt () const\n+134 {\n+135 return *_A_;\n+136 }\n+137\n+_\b1_\b3_\b9 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n 140 {\n-141 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be result(0);\n-142 _communication->dot(x,y,result); // explicitly loop and apply masking\n-143 return result;\n-144 }\n-145\n-_\b1_\b4_\b9 virtual _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bn_\bo_\br_\bm (const X& x) const override\n-150 {\n-151 return _communication->norm(x);\n-152 }\n-153\n-_\b1_\b5_\b5 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const override\n-156 {\n-157 return _category;\n-158 }\n-159\n-160 private:\n-161 std::shared_ptr _communication;\n-162 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _category;\n-163 };\n-164\n-166 template\n-_\b1_\b6_\b7 class _\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt : public _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-168 {\n-169 using _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt::ScalarProduct;\n-170 };\n-171\n-177 template\n-_\b1_\b7_\b8 class _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt : public\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-179 {\n-180 public:\n-_\b1_\b8_\b1 _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (std::shared_ptr comm) :\n-182 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(comm,_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::nonoverlapping) {}\n-183\n-_\b1_\b8_\b4 _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const C& comm) :\n-185 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(comm,_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::nonoverlapping) {}\n-186 };\n+141 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg;\n+142 }\n+143\n+144\n+_\b1_\b4_\b6 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn() const\n+147 {\n+148 return communication;\n+149 }\n+150 private:\n+151 const std::shared_ptr_A_;\n+152 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& communication;\n+153 };\n+154\n+174 template\n+_\b1_\b7_\b5 class _\bP_\ba_\br_\bS_\bS_\bO_\bR : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n+176 public:\n+_\b1_\b7_\b8 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b1_\b8_\b0 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b1_\b8_\b2 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b1_\b8_\b4 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b1_\b8_\b6 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n 187\n-199 template\n-_\b2_\b0_\b0 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt : public _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-201 {\n-202 public:\n-_\b2_\b0_\b3 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (std::shared_ptr comm) :\n-204 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(comm, _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::overlapping) {}\n-205\n-_\b2_\b0_\b6 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const C& comm) :\n-207 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(comm,_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::overlapping) {}\n-208 };\n-209\n-223 template\n-_\b2_\b2_\b4 std::shared_ptr> _\bm_\ba_\bk_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(std::shared_ptr comm, _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category)\n-225 {\n-226 switch(category)\n-227 {\n-228 case _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl:\n-229 return\n-230 std::make_shared>();\n-231 default:\n-232 return\n-233 std::make_shared>(comm,category);\n-234 }\n-235 }\n-236\n-241 template\n-_\b2_\b4_\b2 std::shared_ptr> _\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(const Comm& comm,\n-_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category)\n-243 { return makeScalarProduct(stackobject_to_shared_ptr(comm), category); }\n-244\n-245} // end namespace Dune\n-246\n-247#endif\n-_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n+_\b1_\b9_\b7 _\bP_\ba_\br_\bS_\bS_\bO_\bR (const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& A, int n, _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be w, const\n+_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& c)\n+198 : _A_(A), _n(n), _w(w), communication(c)\n+199 { }\n+200\n+_\b2_\b0_\b6 virtual void _\bp_\br_\be (X& x, [[maybe_unused]] Y& b)\n+207 {\n+208 communication.copyOwnerToAll(x,x); // make dirichlet values consistent\n+209 }\n+210\n+_\b2_\b1_\b6 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n+217 {\n+218 for (int i=0; i<_n; i++) {\n+219 _\bb_\bs_\bo_\br_\bf(_A_,v,d,_w);\n+220 _\bb_\bs_\bo_\br_\bb(_A_,v,d,_w);\n+221 }\n+222 communication.copyOwnerToAll(v,v);\n+223 }\n+224\n+_\b2_\b3_\b0 virtual void _\bp_\bo_\bs_\bt ([[maybe_unused]] X& x) {}\n+231\n+_\b2_\b3_\b3 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+234 {\n+235 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg;\n+236 }\n+237\n+238 private:\n+240 const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _A_;\n+242 int _n;\n+244 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _w;\n+_\b2_\b4_\b6 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& communication;\n+247 };\n+248\n+249 namespace Amg\n+250 {\n+251 template struct ConstructionTraits;\n+252 }\n+253\n+277 template >\n+_\b2_\b7_\b8 class _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n+279 friend struct Amg::ConstructionTraits<_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >;\n+280 public:\n+_\b2_\b8_\b5 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b2_\b9_\b0 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b2_\b9_\b2 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b2_\b9_\b7 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n+298\n+_\b3_\b0_\b6 _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br (P& p, const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& c)\n+307 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)\n+308 { }\n+309\n+_\b3_\b1_\b7 _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br (const std::shared_ptr

    & p, const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be&\n+c)\n+318 : _preconditioner(p), _communication(c)\n+319 { }\n+320\n+_\b3_\b2_\b6 virtual void _\bp_\br_\be (X& x, Y& b)\n+327 {\n+328 _communication.copyOwnerToAll(x,x); // make dirichlet values consistent\n+329 _preconditioner->pre(x,b);\n+330 }\n+331\n+_\b3_\b3_\b7 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n+338 {\n+339 _preconditioner->apply(v,d);\n+340 _communication.copyOwnerToAll(v,v);\n+341 }\n+342\n+343 template\n+_\b3_\b4_\b4 void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n+345 {\n+346 _preconditioner->template apply(v,d);\n+347 _communication.copyOwnerToAll(v,v);\n+348 }\n+349\n+_\b3_\b5_\b5 virtual void _\bp_\bo_\bs_\bt (X& x)\n+356 {\n+357 _preconditioner->post(x);\n+358 }\n+359\n+_\b3_\b6_\b1 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+362 {\n+363 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg;\n+364 }\n+365\n+366 private:\n+368 std::shared_ptr

    _preconditioner;\n+369\n+371 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& _communication;\n+372 };\n+373\n+376} // end namespace\n+377\n+378#endif\n+_\bi_\bo_\b._\bh_\bh\n+Some generic functions for pretty printing vectors and matrices.\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n+_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n+Classes providing communication interfaces for overlapping Schwarz methods.\n+_\bi_\bl_\bu_\b._\bh_\bh\n+The incomplete LU factorization kernels.\n+_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\n+Define base class for scalar product and norm.\n+_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n+Implementations of the inverse operator interface.\n+_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n+Define general preconditioner interface.\n+_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\n+Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n+generic way.\n+_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+???\n+_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n+Define general, extensible interface for operators. The available\n+implementation wraps a matrix.\n _\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n This file implements a vector space as a tensor product of a given vector\n space. The number of compon...\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bb\n+void bsorb(const M &A, X &x, const Y &b, const K &w)\n+SSOR step.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:646\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bf\n+void bsorf(const M &A, X &x, const Y &b, const K &w)\n+SOR step.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:634\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm,\n-SolverCategory::Category category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:242\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-std::shared_ptr< ScalarProduct< X > > makeScalarProduct(std::shared_ptr< const\n-Comm > comm, SolverCategory::Category category)\n-Choose the appropriate scalar product for a solver category.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:224\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-Base class for scalar product and norm computation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bd_\bo_\bt\n-virtual field_type dot(const X &x, const X &y) const\n-Dot product of two vectors. It is assumed that the vectors are consistent on\n-the interior+border part...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A linear operator exporting itself in matrix form.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+An overlapping Schwarz operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+const communication_type & getCommunication() const\n+Get the object responsible for communication.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:146\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bm_\ba_\bt\n+virtual const matrix_type & getmat() const\n+get the sequential assembled linear operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:133\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd\n+virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const\n+apply operator to x, scale and add:\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(const X &x, Y &y) const\n+apply operator to x:\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n+C communication_type\n+The type of the communication object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:98\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The type of the domain.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:86\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+The type of the matrix we operate on.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The type of the range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:93\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+OverlappingSchwarzOperator(const matrix_type &A, const communication_type &com)\n+constructor: just store a reference to a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+OverlappingSchwarzOperator(const std::shared_ptr< matrix_type > A, const\n+communication_type &com)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n virtual SolverCategory::Category category() const\n-Category of the scalar product (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Category of the linear operator (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:139\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR\n+A parallel SSOR preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:175\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n X::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-export types, they come from the derived class\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\b~_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-virtual ~ScalarProduct()\n-every abstract base class has a virtual destructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< field_type >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bn_\bo_\br_\bm\n-virtual real_type norm(const X &x) const\n-Norm of a right-hand side vector. The vector must be consistent on the\n-interior+border partition.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-Scalar product for overlapping Schwarz methods.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:99\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bd_\bo_\bt\n-virtual field_type dot(const X &x, const X &y) const override\n-Dot product of two vectors. It is assumed that the vectors are consistent on\n-the interior+border part...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:139\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const override\n-Category of the scalar product (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< field_type >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:108\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:184\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n C communication_type\n The type of the communication object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-ParallelScalarProduct(const communication_type &com, SolverCategory::Category\n-cat)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:130\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:186\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:233\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR\n+ParSSOR(const matrix_type &A, int n, field_type w, const communication_type &c)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:197\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(X &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:180\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:182\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+The matrix type the preconditioner is for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:178\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &v, const Y &d)\n+Apply the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR_\b:_\b:_\bp_\br_\be\n+virtual void pre(X &x, Y &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:206\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Block parallel preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\br_\be\n+virtual void pre(X &x, Y &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:326\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n X domain_type\n-The type of the vector to compute the scalar product on.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-ParallelScalarProduct(std::shared_ptr< const communication_type > com,\n-SolverCategory::Category cat)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:285\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+BlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:317\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &v, const Y &d)\n+Apply the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:337\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+BlockPreconditioner(P &p, const communication_type &c)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:306\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(X &v, const Y &d)\n+Apply one step of the preconditioner to the system A(v)=d.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:344\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n+C communication_type\n+The type of the communication object..\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:297\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n X::field_type field_type\n-The field type used by the vector type domain_type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bn_\bo_\br_\bm\n-virtual real_type norm(const X &x) const override\n-Norm of a right-hand side vector. The vector must be consistent on the\n-interior+border partition.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:149\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-Default implementation for the scalar case.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:168\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-Nonoverlapping Scalar Product with communication object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:179\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-NonoverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:181\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-NonoverlappingSchwarzScalarProduct(const C &comm)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:184\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-Scalar product for overlapping Schwarz methods.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:201\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-OverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:203\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-OverlappingSchwarzScalarProduct(const C &comm)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:206\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Categories for the solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:22\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:292\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(X &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:355\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:290\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:361\n _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n Category\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n+@ overlapping\n+Category for overlapping solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:29\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00044.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00044.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: umfpack.hh File Reference\n+dune-istl: basearray.hh File Reference\n \n \n \n \n \n \n \n@@ -70,73 +70,38 @@\n

    \n \n
    \n
    \n \n+
    basearray.hh File Reference
    \n
    \n
    \n \n-

    Classes for using UMFPack with ISTL matrices. \n+

    Implements several basic array containers. \n More...

    \n-
    #include <complex>
    \n-#include <type_traits>
    \n-#include <umfpack.h>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/fmatrix.hh>
    \n-#include <dune/common/fvector.hh>
    \n-#include <dune/istl/bccsmatrixinitializer.hh>
    \n-#include <dune/istl/bcrsmatrix.hh>
    \n-#include <dune/istl/foreach.hh>
    \n-#include <dune/istl/multitypeblockmatrix.hh>
    \n-#include <dune/istl/multitypeblockvector.hh>
    \n-#include <dune/istl/solvers.hh>
    \n-#include <dune/istl/solvertype.hh>
    \n-#include <dune/istl/solverfactory.hh>
    \n+
    #include <cassert>
    \n+#include <cmath>
    \n+#include <cstddef>
    \n+#include <memory>
    \n+#include <algorithm>
    \n+#include "istlexception.hh"
    \n+#include <dune/common/iteratorfacades.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Classes

    struct  Dune::UMFPackMethodChooser< T >
     
    struct  Dune::UMFPackMethodChooser< double >
     
    struct  Dune::UMFPackMethodChooser< std::complex< double > >
     
    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< TL, M, class >
     
    \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n

    \n-Functions

     Dune::DUNE_REGISTER_DIRECT_SOLVER ("umfpack", Dune::UMFPackCreator())
     
    \n

    Detailed Description

    \n-

    Classes for using UMFPack with ISTL matrices.

    \n-
    Author
    Dominic Kempf
    \n+

    Implements several basic array containers.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,56 +1,24 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-umfpack.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b)\n-Classes for using UMFPack with ISTL matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+basearray.hh File Reference\n+Implements several basic array containers. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b<_\b _\bM_\b _\b>\n-\u00a0 The UMFPack direct sparse solver. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>\n- _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\b _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bT_\bL_\b,_\b _\bM_\b,_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"umfpack\", _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br())\n-\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Classes for using UMFPack with ISTL matrices.\n- Author\n- Dominic Kempf\n+Implements several basic array containers.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00044_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00044_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: umfpack.hh Source File\n+dune-istl: basearray.hh Source File\n \n \n \n \n \n \n \n@@ -74,903 +74,423 @@\n \n
    \n \n
    \n
    \n
    \n-
    umfpack.hh
    \n+
    basearray.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_UMFPACK_HH
    \n-
    6#define DUNE_ISTL_UMFPACK_HH
    \n+
    5#ifndef DUNE_ISTL_BASEARRAY_HH
    \n+
    6#define DUNE_ISTL_BASEARRAY_HH
    \n
    7
    \n-
    8#if HAVE_SUITESPARSE_UMFPACK || defined DOXYGEN
    \n-
    9
    \n-
    10#include<complex>
    \n-
    11#include<type_traits>
    \n-
    12
    \n-
    13#include<umfpack.h>
    \n-
    14
    \n-
    15#include<dune/common/exceptions.hh>
    \n-
    16#include<dune/common/fmatrix.hh>
    \n-
    17#include<dune/common/fvector.hh>
    \n-\n-\n-\n-\n-\n-\n-\n-\n-
    26
    \n-
    27
    \n-
    28
    \n-
    29namespace Dune {
    \n-
    41 // FORWARD DECLARATIONS
    \n-
    42 template<class M, class T, class TM, class TD, class TA>
    \n-
    43 class SeqOverlappingSchwarz;
    \n-
    44
    \n-
    45 template<class T, bool tag>
    \n-
    46 struct SeqOverlappingSchwarzAssemblerHelper;
    \n-
    47
    \n-
    48 // wrapper class for C-Function Calls in the backend. Choose the right function namespace
    \n-
    49 // depending on the template parameter used.
    \n-
    50 template<typename T>
    \n-
    \n-\n-
    52 {
    \n-
    53 static constexpr bool valid = false ;
    \n-
    54 };
    \n-
    \n+
    8#include <cassert>
    \n+
    9#include <cmath>
    \n+
    10#include <cstddef>
    \n+
    11#include <memory>
    \n+
    12#include <algorithm>
    \n+
    13
    \n+
    14#include "istlexception.hh"
    \n+
    15#include <dune/common/iteratorfacades.hh>
    \n+
    16
    \n+
    21namespace Dune {
    \n+
    22
    \n+
    24namespace Imp {
    \n+
    25
    \n+
    46 template<class B, class ST=std::size_t >
    \n+
    47 class base_array_unmanaged
    \n+
    48 {
    \n+
    49 public:
    \n+
    50
    \n+
    51 //===== type definitions and constants
    \n+
    52
    \n+
    54 typedef B member_type;
    \n
    55
    \n-
    56 template<>
    \n-
    \n-
    57 struct UMFPackMethodChooser<double>
    \n-
    58 {
    \n-
    59 static constexpr bool valid = true ;
    \n-
    60
    \n-
    61 template<typename... A>
    \n-
    \n-
    62 static void defaults(A... args)
    \n-
    63 {
    \n-
    64 umfpack_dl_defaults(args...);
    \n-
    65 }
    \n-
    \n-
    66 template<typename... A>
    \n-
    \n-
    67 static void free_numeric(A... args)
    \n-
    68 {
    \n-
    69 umfpack_dl_free_numeric(args...);
    \n-
    70 }
    \n-
    \n-
    71 template<typename... A>
    \n-
    \n-
    72 static void free_symbolic(A... args)
    \n-
    73 {
    \n-
    74 umfpack_dl_free_symbolic(args...);
    \n-
    75 }
    \n-
    \n-
    76 template<typename... A>
    \n-
    \n-
    77 static int load_numeric(A... args)
    \n-
    78 {
    \n-
    79 return umfpack_dl_load_numeric(args...);
    \n-
    80 }
    \n-
    \n-
    81 template<typename... A>
    \n-
    \n-
    82 static void numeric(A... args)
    \n-
    83 {
    \n-
    84 umfpack_dl_numeric(args...);
    \n-
    85 }
    \n-
    \n-
    86 template<typename... A>
    \n-
    \n-
    87 static void report_info(A... args)
    \n-
    88 {
    \n-
    89 umfpack_dl_report_info(args...);
    \n-
    90 }
    \n-
    \n-
    91 template<typename... A>
    \n-
    \n-
    92 static void report_status(A... args)
    \n-
    93 {
    \n-
    94 umfpack_dl_report_status(args...);
    \n-
    95 }
    \n-
    \n-
    96 template<typename... A>
    \n-
    \n-
    97 static int save_numeric(A... args)
    \n-
    98 {
    \n-
    99 return umfpack_dl_save_numeric(args...);
    \n-
    100 }
    \n-
    \n-
    101 template<typename... A>
    \n-
    \n-
    102 static void solve(A... args)
    \n-
    103 {
    \n-
    104 umfpack_dl_solve(args...);
    \n-
    105 }
    \n-
    \n-
    106 template<typename... A>
    \n-
    \n-
    107 static void symbolic(A... args)
    \n-
    108 {
    \n-
    109 umfpack_dl_symbolic(args...);
    \n-
    110 }
    \n-
    \n-
    111 };
    \n-
    \n-
    112
    \n-
    113 template<>
    \n-
    \n-
    114 struct UMFPackMethodChooser<std::complex<double> >
    \n-
    115 {
    \n-
    116 static constexpr bool valid = true ;
    \n-
    117 using size_type = SuiteSparse_long;
    \n-
    118
    \n-
    119 template<typename... A>
    \n-
    \n-
    120 static void defaults(A... args)
    \n-
    121 {
    \n-
    122 umfpack_zl_defaults(args...);
    \n-
    123 }
    \n-
    \n-
    124 template<typename... A>
    \n-
    \n-
    125 static void free_numeric(A... args)
    \n-
    126 {
    \n-
    127 umfpack_zl_free_numeric(args...);
    \n-
    128 }
    \n-
    \n-
    129 template<typename... A>
    \n-
    \n-
    130 static void free_symbolic(A... args)
    \n-
    131 {
    \n-
    132 umfpack_zl_free_symbolic(args...);
    \n-
    133 }
    \n-
    \n-
    134 template<typename... A>
    \n-
    \n-
    135 static int load_numeric(A... args)
    \n-
    136 {
    \n-
    137 return umfpack_zl_load_numeric(args...);
    \n-
    138 }
    \n-
    \n-
    139 template<typename... A>
    \n-
    \n-
    140 static void numeric(const size_type* cs, const size_type* ri, const double* val, A... args)
    \n-
    141 {
    \n-
    142 umfpack_zl_numeric(cs,ri,val,NULL,args...);
    \n-
    143 }
    \n-
    \n-
    144 template<typename... A>
    \n-
    \n-
    145 static void report_info(A... args)
    \n-
    146 {
    \n-
    147 umfpack_zl_report_info(args...);
    \n-
    148 }
    \n-
    \n-
    149 template<typename... A>
    \n-
    \n-
    150 static void report_status(A... args)
    \n-
    151 {
    \n-
    152 umfpack_zl_report_status(args...);
    \n-
    153 }
    \n-
    \n-
    154 template<typename... A>
    \n-
    \n-
    155 static int save_numeric(A... args)
    \n-
    156 {
    \n-
    157 return umfpack_zl_save_numeric(args...);
    \n-
    158 }
    \n-
    \n-
    159 template<typename... A>
    \n-
    \n-
    160 static void solve(size_type m, const size_type* cs, const size_type* ri, std::complex<double>* val, double* x, const double* b,A... args)
    \n-
    161 {
    \n-
    162 const double* cval = reinterpret_cast<const double*>(val);
    \n-
    163 umfpack_zl_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...);
    \n-
    164 }
    \n-
    \n-
    165 template<typename... A>
    \n-
    \n-
    166 static void symbolic(size_type m, size_type n, const size_type* cs, const size_type* ri, const double* val, A... args)
    \n-
    167 {
    \n-
    168 umfpack_zl_symbolic(m,n,cs,ri,val,NULL,args...);
    \n-
    169 }
    \n-
    \n-
    170 };
    \n-
    \n-
    171
    \n-
    172 namespace Impl
    \n-
    173 {
    \n-
    174 template<class M, class = void>
    \n-
    175 struct UMFPackVectorChooser;
    \n-
    176
    \n-
    178 template<class M> using UMFPackDomainType = typename UMFPackVectorChooser<M>::domain_type;
    \n+
    57 typedef ST size_type;
    \n+
    58
    \n+
    60 using reference = B&;
    \n+
    61
    \n+
    63 using const_reference = const B&;
    \n+
    64
    \n+
    65 //===== access to components
    \n+
    66
    \n+
    68 reference operator[] (size_type i)
    \n+
    69 {
    \n+
    70#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    71 if (i>=n) DUNE_THROW(ISTLError,"index out of range");
    \n+
    72#endif
    \n+
    73 return p[i];
    \n+
    74 }
    \n+
    75
    \n+
    77 const_reference operator[] (size_type i) const
    \n+
    78 {
    \n+
    79#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    80 if (i>=n) DUNE_THROW(ISTLError,"index out of range");
    \n+
    81#endif
    \n+
    82 return p[i];
    \n+
    83 }
    \n+
    84
    \n+
    86 template<class T>
    \n+
    87 class RealIterator
    \n+
    88 : public RandomAccessIteratorFacade<RealIterator<T>, T>
    \n+
    89 {
    \n+
    90 public:
    \n+
    92 typedef typename std::remove_const<T>::type ValueType;
    \n+
    93
    \n+
    94 friend class RandomAccessIteratorFacade<RealIterator<const ValueType>, const ValueType>;
    \n+
    95 friend class RandomAccessIteratorFacade<RealIterator<ValueType>, ValueType>;
    \n+
    96 friend class RealIterator<const ValueType>;
    \n+
    97 friend class RealIterator<ValueType>;
    \n+
    98
    \n+
    100 RealIterator ()
    \n+
    101 : p(0), i(0)
    \n+
    102 {}
    \n+
    103
    \n+
    104 RealIterator (const B* _p, B* _i) : p(_p), i(_i)
    \n+
    105 { }
    \n+
    106
    \n+
    107 RealIterator(const RealIterator<ValueType>& it)
    \n+
    108 : p(it.p), i(it.i)
    \n+
    109 {}
    \n+
    110
    \n+
    112 size_type index () const
    \n+
    113 {
    \n+
    114 return i-p;
    \n+
    115 }
    \n+
    116
    \n+
    118 bool equals (const RealIterator<ValueType>& other) const
    \n+
    119 {
    \n+
    120 assert(other.p==p);
    \n+
    121 return i==other.i;
    \n+
    122 }
    \n+
    123
    \n+
    125 bool equals (const RealIterator<const ValueType>& other) const
    \n+
    126 {
    \n+
    127 assert(other.p==p);
    \n+
    128 return i==other.i;
    \n+
    129 }
    \n+
    130
    \n+
    131 std::ptrdiff_t distanceTo(const RealIterator& o) const
    \n+
    132 {
    \n+
    133 return o.i-i;
    \n+
    134 }
    \n+
    135
    \n+
    136 private:
    \n+
    138 void increment()
    \n+
    139 {
    \n+
    140 ++i;
    \n+
    141 }
    \n+
    142
    \n+
    144 void decrement()
    \n+
    145 {
    \n+
    146 --i;
    \n+
    147 }
    \n+
    148
    \n+
    149 // Needed for operator[] of the iterator
    \n+
    150 reference elementAt (std::ptrdiff_t offset) const
    \n+
    151 {
    \n+
    152 return *(i+offset);
    \n+
    153 }
    \n+
    154
    \n+
    156 reference dereference () const
    \n+
    157 {
    \n+
    158 return *i;
    \n+
    159 }
    \n+
    160
    \n+
    161 void advance(std::ptrdiff_t d)
    \n+
    162 {
    \n+
    163 i+=d;
    \n+
    164 }
    \n+
    165
    \n+
    166 const B* p;
    \n+
    167 B* i;
    \n+
    168 };
    \n+
    169
    \n+
    171 typedef RealIterator<B> iterator;
    \n+
    172
    \n+
    173
    \n+
    175 iterator begin ()
    \n+
    176 {
    \n+
    177 return iterator(p,p);
    \n+
    178 }
    \n
    179
    \n-
    181 template<class M> using UMFPackRangeType = typename UMFPackVectorChooser<M>::range_type;
    \n-
    182
    \n-
    183 template<class M>
    \n-
    184 struct UMFPackVectorChooser<M,
    \n-
    185 std::enable_if_t<(std::is_same<M,double>::value) || (std::is_same<M,std::complex<double> >::value)>>
    \n-
    186 {
    \n-
    187 using domain_type = M;
    \n-
    188 using range_type = M;
    \n-
    189 };
    \n-
    190
    \n-
    191 template<typename T, int n, int m>
    \n-
    192 struct UMFPackVectorChooser<FieldMatrix<T,n,m>,
    \n-
    193 std::enable_if_t<(std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value)>>
    \n-
    194 {
    \n-
    196 using domain_type = FieldVector<T,m>;
    \n-
    198 using range_type = FieldVector<T,n>;
    \n-
    199 };
    \n-
    200
    \n-
    201 template<typename T, typename A>
    \n-
    202 struct UMFPackVectorChooser<BCRSMatrix<T,A>,
    \n-
    203 std::void_t<UMFPackDomainType<T>, UMFPackRangeType<T>>>
    \n-
    204 {
    \n-
    205 // In case of recursive deduction (e.g., BCRSMatrix<FieldMatrix<...>, Allocator<FieldMatrix<...>>>)
    \n-
    206 // the allocator needs to be converted to the sub-block allocator type too (e.g., Allocator<FieldVector<...>>).
    \n-
    207 // Note that matrix allocator is assumed to be the same as the domain/range type of allocators
    \n-
    209 using domain_type = BlockVector<UMFPackDomainType<T>, typename std::allocator_traits<A>::template rebind_alloc<UMFPackDomainType<T>>>;
    \n-
    211 using range_type = BlockVector<UMFPackRangeType<T>, typename std::allocator_traits<A>::template rebind_alloc<UMFPackRangeType<T>>>;
    \n-
    212 };
    \n-
    213
    \n-
    214 // to make the `UMFPackVectorChooser` work with `MultiTypeBlockMatrix`, we need to add an intermediate step for the rows, which are typically `MultiTypeBlockVector`
    \n-
    215 template<typename FirstBlock, typename... Blocks>
    \n-
    216 struct UMFPackVectorChooser<MultiTypeBlockVector<FirstBlock, Blocks...>,
    \n-
    217 std::void_t<UMFPackDomainType<FirstBlock>, UMFPackRangeType<FirstBlock>, UMFPackDomainType<Blocks>...>>
    \n-
    218 {
    \n-
    220 using domain_type = MultiTypeBlockVector<UMFPackDomainType<FirstBlock>, UMFPackDomainType<Blocks>...>;
    \n-
    222 using range_type = UMFPackRangeType<FirstBlock>;
    \n-
    223 };
    \n-
    224
    \n-
    225 // specialization for `MultiTypeBlockMatrix` with `MultiTypeBlockVector` rows
    \n-
    226 template<typename FirstRow, typename... Rows>
    \n-
    227 struct UMFPackVectorChooser<MultiTypeBlockMatrix<FirstRow, Rows...>,
    \n-
    228 std::void_t<UMFPackDomainType<FirstRow>, UMFPackRangeType<FirstRow>, UMFPackRangeType<Rows>...>>
    \n-
    229 {
    \n-
    231 using domain_type = UMFPackDomainType<FirstRow>;
    \n-
    233 using range_type = MultiTypeBlockVector< UMFPackRangeType<FirstRow>, UMFPackRangeType<Rows>... >;
    \n-
    234 };
    \n-
    235
    \n-
    236 // dummy class to represent no BitVector
    \n-
    237 struct NoBitVector
    \n-
    238 {};
    \n-
    239
    \n+
    181 iterator end ()
    \n+
    182 {
    \n+
    183 return iterator(p,p+n);
    \n+
    184 }
    \n+
    185
    \n+
    188 iterator beforeEnd ()
    \n+
    189 {
    \n+
    190 return iterator(p,p+n-1);
    \n+
    191 }
    \n+
    192
    \n+
    195 iterator beforeBegin ()
    \n+
    196 {
    \n+
    197 return iterator(p,p-1);
    \n+
    198 }
    \n+
    199
    \n+
    201 iterator find (size_type i)
    \n+
    202 {
    \n+
    203 return iterator(p,p+std::min(i,n));
    \n+
    204 }
    \n+
    205
    \n+
    207 typedef RealIterator<const B> const_iterator;
    \n+
    208
    \n+
    210 const_iterator begin () const
    \n+
    211 {
    \n+
    212 return const_iterator(p,p+0);
    \n+
    213 }
    \n+
    214
    \n+
    216 const_iterator end () const
    \n+
    217 {
    \n+
    218 return const_iterator(p,p+n);
    \n+
    219 }
    \n+
    220
    \n+
    223 const_iterator beforeEnd () const
    \n+
    224 {
    \n+
    225 return const_iterator(p,p+n-1);
    \n+
    226 }
    \n+
    227
    \n+
    230 const_iterator beforeBegin () const
    \n+
    231 {
    \n+
    232 return const_iterator(p,p-1);
    \n+
    233 }
    \n+
    234
    \n+
    236 const_iterator find (size_type i) const
    \n+
    237 {
    \n+
    238 return const_iterator(p,p+std::min(i,n));
    \n+
    239 }
    \n
    240
    \n-
    241 }
    \n-
    242
    \n-
    256 template<typename M>
    \n-
    \n-
    257 class UMFPack : public InverseOperator<Impl::UMFPackDomainType<M>,Impl::UMFPackRangeType<M>>
    \n-
    258 {
    \n-
    259 using T = typename M::field_type;
    \n-
    260
    \n-
    261 public:
    \n-
    262 using size_type = SuiteSparse_long;
    \n-
    263
    \n-
    265 using Matrix = M;
    \n-
    266 using matrix_type = M;
    \n-
    268 using UMFPackMatrix = ISTL::Impl::BCCSMatrix<typename Matrix::field_type, size_type>;
    \n-
    270 using MatrixInitializer = ISTL::Impl::BCCSMatrixInitializer<M, size_type>;
    \n-
    272 using domain_type = Impl::UMFPackDomainType<M>;
    \n-
    274 using range_type = Impl::UMFPackRangeType<M>;
    \n+
    241
    \n+
    242 //===== sizes
    \n+
    243
    \n+
    245 size_type size () const
    \n+
    246 {
    \n+
    247 return n;
    \n+
    248 }
    \n+
    249
    \n+
    251 const B* data() const
    \n+
    252 {
    \n+
    253 return p;
    \n+
    254 }
    \n+
    255
    \n+
    257 B* data()
    \n+
    258 {
    \n+
    259 return p;
    \n+
    260 }
    \n+
    261
    \n+
    262 protected:
    \n+
    264 base_array_unmanaged ()
    \n+
    265 : n(0), p(0)
    \n+
    266 {}
    \n+
    268 base_array_unmanaged (size_type n_, B* p_)
    \n+
    269 : n(n_), p(p_)
    \n+
    270 {}
    \n+
    271 size_type n; // number of elements in array
    \n+
    272 B *p; // pointer to dynamically allocated built-in array
    \n+
    273 };
    \n+
    274
    \n
    275
    \n-
    \n-\n-
    278 {
    \n-\n-
    280 }
    \n-
    \n-
    281
    \n-
    \n-
    290 UMFPack(const Matrix& matrix, int verbose=0) : matrixIsLoaded_(false)
    \n-
    291 {
    \n-
    292 //check whether T is a supported type
    \n-
    293 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n-
    294 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
    \n-
    295 Caller::defaults(UMF_Control);
    \n-
    296 setVerbosity(verbose);
    \n-
    297 setMatrix(matrix);
    \n-
    298 }
    \n-
    \n-
    299
    \n-
    \n-
    308 UMFPack(const Matrix& matrix, int verbose, bool) : matrixIsLoaded_(false)
    \n-
    309 {
    \n-
    310 //check whether T is a supported type
    \n-
    311 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n-
    312 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
    \n-
    313 Caller::defaults(UMF_Control);
    \n-
    314 setVerbosity(verbose);
    \n-
    315 setMatrix(matrix);
    \n-
    316 }
    \n-
    \n-
    317
    \n-
    \n-
    327 UMFPack(const Matrix& mat_, const ParameterTree& config)
    \n-
    328 : UMFPack(mat_, config.get<int>("verbose", 0))
    \n-
    329 {}
    \n-
    \n-
    330
    \n-
    \n-
    333 UMFPack() : matrixIsLoaded_(false), verbosity_(0)
    \n-
    334 {
    \n-
    335 //check whether T is a supported type
    \n-
    336 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n-
    337 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
    \n-
    338 Caller::defaults(UMF_Control);
    \n-
    339 }
    \n-
    \n-
    340
    \n-
    \n-
    351 UMFPack(const Matrix& mat_, const char* file, int verbose=0)
    \n-
    352 {
    \n-
    353 //check whether T is a supported type
    \n-
    354 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n-
    355 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
    \n-
    356 Caller::defaults(UMF_Control);
    \n-
    357 setVerbosity(verbose);
    \n-
    358 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast<char*>(file));
    \n-
    359 if ((errcode == UMFPACK_ERROR_out_of_memory) || (errcode == UMFPACK_ERROR_file_IO))
    \n-
    360 {
    \n-
    361 matrixIsLoaded_ = false;
    \n-
    362 setMatrix(mat_);
    \n-
    363 saveDecomposition(file);
    \n-
    364 }
    \n-
    365 else
    \n-
    366 {
    \n-
    367 matrixIsLoaded_ = true;
    \n-
    368 std::cout << "UMFPack decomposition successfully loaded from " << file << std::endl;
    \n-
    369 }
    \n-
    370 }
    \n-
    \n-
    371
    \n-
    \n-
    378 UMFPack(const char* file, int verbose=0)
    \n-
    379 {
    \n-
    380 //check whether T is a supported type
    \n-
    381 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n-
    382 "Unsupported Type in UMFPack (only double and std::complex<double> supported)");
    \n-
    383 Caller::defaults(UMF_Control);
    \n-
    384 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast<char*>(file));
    \n-
    385 if (errcode == UMFPACK_ERROR_out_of_memory)
    \n-
    386 DUNE_THROW(Dune::Exception, "ran out of memory while loading UMFPack decomposition");
    \n-
    387 if (errcode == UMFPACK_ERROR_file_IO)
    \n-
    388 DUNE_THROW(Dune::Exception, "IO error while loading UMFPack decomposition");
    \n-
    389 matrixIsLoaded_ = true;
    \n-
    390 std::cout << "UMFPack decomposition successfully loaded from " << file << std::endl;
    \n-
    391 setVerbosity(verbose);
    \n-
    392 }
    \n-
    \n-
    393
    \n-
    \n-
    394 virtual ~UMFPack()
    \n-
    395 {
    \n-
    396 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
    \n-
    397 free();
    \n-
    398 }
    \n-
    \n-
    399
    \n-
    \n-\n-
    404 {
    \n-
    405 if (umfpackMatrix_.N() != b.dim())
    \n-
    406 DUNE_THROW(Dune::ISTLError, "Size of right-hand-side vector b does not match the number of matrix rows!");
    \n-
    407 if (umfpackMatrix_.M() != x.dim())
    \n-
    408 DUNE_THROW(Dune::ISTLError, "Size of solution vector x does not match the number of matrix columns!");
    \n-
    409 if (b.size() == 0)
    \n-
    410 return;
    \n-
    411
    \n-
    412 // we have to convert x and b into flat structures
    \n-
    413 // however, this is linear in time
    \n-
    414 std::vector<T> xFlat(x.dim()), bFlat(b.dim());
    \n-
    415
    \n-
    416 flatVectorForEach(x, [&](auto&& entry, auto&& offset)
    \n+
    276
    \n+
    298 template<class B, class ST=std::size_t >
    \n+
    299 class compressed_base_array_unmanaged
    \n+
    300 {
    \n+
    301 public:
    \n+
    302
    \n+
    303 //===== type definitions and constants
    \n+
    304
    \n+
    306 typedef B member_type;
    \n+
    307
    \n+
    309 typedef ST size_type;
    \n+
    310
    \n+
    312 using reference = B&;
    \n+
    313
    \n+
    315 using const_reference = const B&;
    \n+
    316
    \n+
    317 //===== access to components
    \n+
    318
    \n+
    320 reference operator[] (size_type i)
    \n+
    321 {
    \n+
    322 const size_type* lb = std::lower_bound(j, j+n, i);
    \n+
    323 if (lb == j+n || *lb != i)
    \n+
    324 DUNE_THROW(ISTLError,"index "<<i<<" not in compressed array");
    \n+
    325 return p[lb-j];
    \n+
    326 }
    \n+
    327
    \n+
    329 const_reference operator[] (size_type i) const
    \n+
    330 {
    \n+
    331 const size_type* lb = std::lower_bound(j, j+n, i);
    \n+
    332 if (lb == j+n || *lb != i)
    \n+
    333 DUNE_THROW(ISTLError,"index "<<i<<" not in compressed array");
    \n+
    334 return p[lb-j];
    \n+
    335 }
    \n+
    336
    \n+
    338 template<class T>
    \n+
    339 class RealIterator
    \n+
    340 : public BidirectionalIteratorFacade<RealIterator<T>, T>
    \n+
    341 {
    \n+
    342 public:
    \n+
    344 typedef typename std::remove_const<T>::type ValueType;
    \n+
    345
    \n+
    346 friend class BidirectionalIteratorFacade<RealIterator<const ValueType>, const ValueType>;
    \n+
    347 friend class BidirectionalIteratorFacade<RealIterator<ValueType>, ValueType>;
    \n+
    348 friend class RealIterator<const ValueType>;
    \n+
    349 friend class RealIterator<ValueType>;
    \n+
    350
    \n+
    352 RealIterator ()
    \n+
    353 : p(0), j(0), i(0)
    \n+
    354 {}
    \n+
    355
    \n+
    357 RealIterator (B* _p, size_type* _j, size_type _i)
    \n+
    358 : p(_p), j(_j), i(_i)
    \n+
    359 { }
    \n+
    360
    \n+
    364 RealIterator(const RealIterator<ValueType>& it)
    \n+
    365 : p(it.p), j(it.j), i(it.i)
    \n+
    366 {}
    \n+
    367
    \n+
    368
    \n+
    370 bool equals (const RealIterator<ValueType>& it) const
    \n+
    371 {
    \n+
    372 assert(p==it.p);
    \n+
    373 return (i)==(it.i);
    \n+
    374 }
    \n+
    375
    \n+
    377 bool equals (const RealIterator<const ValueType>& it) const
    \n+
    378 {
    \n+
    379 assert(p==it.p);
    \n+
    380 return (i)==(it.i);
    \n+
    381 }
    \n+
    382
    \n+
    383
    \n+
    385 size_type index () const
    \n+
    386 {
    \n+
    387 return j[i];
    \n+
    388 }
    \n+
    389
    \n+
    391 void setindex (size_type k)
    \n+
    392 {
    \n+
    393 return j[i] = k;
    \n+
    394 }
    \n+
    395
    \n+
    403 size_type offset () const
    \n+
    404 {
    \n+
    405 return i;
    \n+
    406 }
    \n+
    407
    \n+
    408 private:
    \n+
    410 void increment()
    \n+
    411 {
    \n+
    412 ++i;
    \n+
    413 }
    \n+
    414
    \n+
    416 void decrement()
    \n
    417 {
    \n-
    418 xFlat[ offset ] = entry;
    \n-
    419 });
    \n+
    418 --i;
    \n+
    419 }
    \n
    420
    \n-
    421 flatVectorForEach(b, [&](auto&& entry, auto&& offset)
    \n-
    422 {
    \n-
    423 bFlat[ offset ] = entry;
    \n-
    424 });
    \n-
    425
    \n-
    426 double UMF_Apply_Info[UMFPACK_INFO];
    \n-
    427 Caller::solve(UMFPACK_A,
    \n-
    428 umfpackMatrix_.getColStart(),
    \n-
    429 umfpackMatrix_.getRowIndex(),
    \n-
    430 umfpackMatrix_.getValues(),
    \n-
    431 reinterpret_cast<double*>(&xFlat[0]),
    \n-
    432 reinterpret_cast<double*>(&bFlat[0]),
    \n-
    433 UMF_Numeric,
    \n-
    434 UMF_Control,
    \n-
    435 UMF_Apply_Info);
    \n-
    436
    \n-
    437 // copy back to blocked vector
    \n-
    438 flatVectorForEach(x, [&](auto&& entry, auto offset)
    \n-
    439 {
    \n-
    440 entry = xFlat[offset];
    \n-
    441 });
    \n-
    442
    \n-
    443 //this is a direct solver
    \n-
    444 res.iterations = 1;
    \n-
    445 res.converged = true;
    \n-
    446 res.elapsed = UMF_Apply_Info[UMFPACK_SOLVE_WALLTIME];
    \n-
    447
    \n-
    448 printOnApply(UMF_Apply_Info);
    \n-
    449 }
    \n-
    \n-
    450
    \n-
    \n-
    454 virtual void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
    \n-
    455 {
    \n-
    456 apply(x,b,res);
    \n-
    457 }
    \n-
    \n-
    458
    \n-
    \n-
    466 void apply(T* x, T* b)
    \n-
    467 {
    \n-
    468 double UMF_Apply_Info[UMFPACK_INFO];
    \n-
    469 Caller::solve(UMFPACK_A,
    \n-
    470 umfpackMatrix_.getColStart(),
    \n-
    471 umfpackMatrix_.getRowIndex(),
    \n-
    472 umfpackMatrix_.getValues(),
    \n-
    473 x,
    \n-
    474 b,
    \n-
    475 UMF_Numeric,
    \n-
    476 UMF_Control,
    \n-
    477 UMF_Apply_Info);
    \n-
    478 printOnApply(UMF_Apply_Info);
    \n-
    479 }
    \n-
    \n-
    480
    \n-
    \n-
    492 void setOption(unsigned int option, double value)
    \n-
    493 {
    \n-
    494 if (option >= UMFPACK_CONTROL)
    \n-
    495 DUNE_THROW(RangeError, "Requested non-existing UMFPack option");
    \n-
    496
    \n-
    497 UMF_Control[option] = value;
    \n-
    498 }
    \n-
    \n-
    499
    \n-
    \n-
    503 void saveDecomposition(const char* file)
    \n-
    504 {
    \n-
    505 int errcode = Caller::save_numeric(UMF_Numeric, const_cast<char*>(file));
    \n-
    506 if (errcode != UMFPACK_OK)
    \n-
    507 DUNE_THROW(Dune::Exception,"IO ERROR while trying to save UMFPack decomposition");
    \n-
    508 }
    \n-
    \n+
    422 reference dereference () const
    \n+
    423 {
    \n+
    424 return p[i];
    \n+
    425 }
    \n+
    426
    \n+
    427 B* p;
    \n+
    428 size_type* j;
    \n+
    429 size_type i;
    \n+
    430 };
    \n+
    431
    \n+
    433 typedef RealIterator<B> iterator;
    \n+
    434
    \n+
    436 iterator begin ()
    \n+
    437 {
    \n+
    438 return iterator(p,j,0);
    \n+
    439 }
    \n+
    440
    \n+
    442 iterator end ()
    \n+
    443 {
    \n+
    444 return iterator(p,j,n);
    \n+
    445 }
    \n+
    446
    \n+
    449 iterator beforeEnd ()
    \n+
    450 {
    \n+
    451 return iterator(p,j,n-1);
    \n+
    452 }
    \n+
    453
    \n+
    456 iterator beforeBegin ()
    \n+
    457 {
    \n+
    458 return iterator(p,j,-1);
    \n+
    459 }
    \n+
    460
    \n+
    462 iterator find (size_type i)
    \n+
    463 {
    \n+
    464 const size_type* lb = std::lower_bound(j, j+n, i);
    \n+
    465 return (lb != j+n && *lb == i)
    \n+
    466 ? iterator(p,j,lb-j)
    \n+
    467 : end();
    \n+
    468 }
    \n+
    469
    \n+
    471 typedef RealIterator<const B> const_iterator;
    \n+
    472
    \n+
    474 const_iterator begin () const
    \n+
    475 {
    \n+
    476 return const_iterator(p,j,0);
    \n+
    477 }
    \n+
    478
    \n+
    480 const_iterator end () const
    \n+
    481 {
    \n+
    482 return const_iterator(p,j,n);
    \n+
    483 }
    \n+
    484
    \n+
    487 const_iterator beforeEnd () const
    \n+
    488 {
    \n+
    489 return const_iterator(p,j,n-1);
    \n+
    490 }
    \n+
    491
    \n+
    494 const_iterator beforeBegin () const
    \n+
    495 {
    \n+
    496 return const_iterator(p,j,-1);
    \n+
    497 }
    \n+
    498
    \n+
    500 const_iterator find (size_type i) const
    \n+
    501 {
    \n+
    502 const size_type* lb = std::lower_bound(j, j+n, i);
    \n+
    503 return (lb != j+n && *lb == i)
    \n+
    504 ? const_iterator(p,j,lb-j)
    \n+
    505 : end();
    \n+
    506 }
    \n+
    507
    \n+
    508 //===== sizes
    \n
    509
    \n-
    519 template<class BitVector = Impl::NoBitVector>
    \n-
    \n-
    520 void setMatrix(const Matrix& matrix, const BitVector& bitVector = {})
    \n-
    521 {
    \n-
    522 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
    \n-
    523 free();
    \n-
    524 if (matrix.N() == 0 or matrix.M() == 0)
    \n-
    525 return;
    \n+
    511 size_type size () const
    \n+
    512 {
    \n+
    513 return n;
    \n+
    514 }
    \n+
    515
    \n+
    516 protected:
    \n+
    518 compressed_base_array_unmanaged ()
    \n+
    519 : n(0), p(0), j(0)
    \n+
    520 {}
    \n+
    521
    \n+
    522 size_type n; // number of elements in array
    \n+
    523 B *p; // pointer to dynamically allocated built-in array
    \n+
    524 size_type* j; // the index set
    \n+
    525 };
    \n
    526
    \n-
    527 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != 0)
    \n-
    528 umfpackMatrix_.free();
    \n-
    529
    \n-
    530 constexpr bool useBitVector = not std::is_same_v<BitVector,Impl::NoBitVector>;
    \n-
    531
    \n-
    532 // use a dynamic flat vector for the bitset
    \n-
    533 std::vector<bool> flatBitVector;
    \n-
    534 // and a mapping from the compressed indices
    \n-
    535 std::vector<size_type> subIndices;
    \n-
    536
    \n-
    537 int numberOfIgnoredDofs = 0;
    \n-
    538 int nonZeros = 0;
    \n-
    539
    \n-
    540 if constexpr ( useBitVector )
    \n-
    541 {
    \n-
    542 auto flatSize = flatVectorForEach(bitVector, [](auto&&, auto&&){});
    \n-
    543 flatBitVector.resize(flatSize);
    \n-
    544
    \n-
    545 flatVectorForEach(bitVector, [&](auto&& entry, auto&& offset)
    \n-
    546 {
    \n-
    547 flatBitVector[ offset ] = entry;
    \n-
    548 if ( entry )
    \n-
    549 {
    \n-
    550 numberOfIgnoredDofs++;
    \n-
    551 }
    \n-
    552 });
    \n-
    553 }
    \n-
    554
    \n-
    555 // compute the flat dimension and the number of nonzeros of the matrix
    \n-
    556 auto [flatRows,flatCols] = flatMatrixForEach( matrix, [&](auto&& /*entry*/, auto&& row, auto&& col){
    \n-
    557 // do not count ignored entries
    \n-
    558 if constexpr ( useBitVector )
    \n-
    559 if ( flatBitVector[row] or flatBitVector[col] )
    \n-
    560 return;
    \n-
    561
    \n-
    562 nonZeros++;
    \n-
    563 });
    \n-
    564
    \n-
    565 if constexpr ( useBitVector )
    \n-
    566 {
    \n-
    567 // use the original flatRows!
    \n-
    568 subIndices.resize(flatRows,std::numeric_limits<std::size_t>::max());
    \n-
    569
    \n-
    570 size_type subIndexCounter = 0;
    \n-
    571 for ( size_type i=0; i<size_type(flatRows); i++ )
    \n-
    572 if ( not flatBitVector[ i ] )
    \n-
    573 subIndices[ i ] = subIndexCounter++;
    \n-
    574
    \n-
    575 // update the original matrix size
    \n-
    576 flatRows -= numberOfIgnoredDofs;
    \n-
    577 flatCols -= numberOfIgnoredDofs;
    \n-
    578 }
    \n-
    579
    \n-
    580
    \n-
    581 umfpackMatrix_.setSize(flatRows,flatCols);
    \n-
    582 umfpackMatrix_.Nnz_ = nonZeros;
    \n-
    583
    \n-
    584 // prepare the arrays
    \n-
    585 umfpackMatrix_.colstart = new size_type[flatCols+1];
    \n-
    586 umfpackMatrix_.rowindex = new size_type[nonZeros];
    \n-
    587 umfpackMatrix_.values = new T[nonZeros];
    \n-
    588
    \n-
    589 for ( size_type i=0; i<size_type(flatCols+1); i++ )
    \n-
    590 {
    \n-
    591 umfpackMatrix_.colstart[i] = 0;
    \n-
    592 }
    \n-
    593
    \n-
    594 // at first, we need to compute the column start indices
    \n-
    595 // therefore, we count all entries in each column and in the end we accumulate everything
    \n-
    596 flatMatrixForEach(matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&& flatColIndex)
    \n-
    597 {
    \n-
    598 // do nothing if entry is excluded
    \n-
    599 if constexpr ( useBitVector )
    \n-
    600 if ( flatBitVector[flatRowIndex] or flatBitVector[flatColIndex] )
    \n-
    601 return;
    \n-
    602
    \n-
    603 // pick compressed or uncompressed index
    \n-
    604 // compiler will hopefully do some constexpr optimization here
    \n-
    605 auto colIdx = useBitVector ? subIndices[flatColIndex] : flatColIndex;
    \n-
    606
    \n-
    607 umfpackMatrix_.colstart[colIdx+1]++;
    \n-
    608 });
    \n-
    609
    \n-
    610 // now accumulate
    \n-
    611 for ( size_type i=0; i<(size_type)flatCols; i++ )
    \n-
    612 {
    \n-
    613 umfpackMatrix_.colstart[i+1] += umfpackMatrix_.colstart[i];
    \n-
    614 }
    \n-
    615
    \n-
    616 // we need a compressed position counter in each column
    \n-
    617 std::vector<size_type> colPosition(flatCols,0);
    \n-
    618
    \n-
    619 // now we can set the entries: the procedure below works with both row- or column major index ordering
    \n-
    620 flatMatrixForEach(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&& flatColIndex)
    \n-
    621 {
    \n-
    622 // do nothing if entry is excluded
    \n-
    623 if constexpr ( useBitVector )
    \n-
    624 if ( flatBitVector[flatRowIndex] or flatBitVector[flatColIndex] )
    \n-
    625 return;
    \n-
    626
    \n-
    627 // pick compressed or uncompressed index
    \n-
    628 // compiler will hopefully do some constexpr optimization here
    \n-
    629 auto rowIdx = useBitVector ? subIndices[flatRowIndex] : flatRowIndex;
    \n-
    630 auto colIdx = useBitVector ? subIndices[flatColIndex] : flatColIndex;
    \n-
    631
    \n-
    632 // the start index of each column is already fixed
    \n-
    633 auto colStart = umfpackMatrix_.colstart[colIdx];
    \n-
    634 // get the current number of picked elements in this column
    \n-
    635 auto colPos = colPosition[colIdx];
    \n-
    636 // assign the corresponding row index and the value of this element
    \n-
    637 umfpackMatrix_.rowindex[ colStart + colPos ] = rowIdx;
    \n-
    638 umfpackMatrix_.values[ colStart + colPos ] = entry;
    \n-
    639 // increase the number of picked elements in this column
    \n-
    640 colPosition[colIdx]++;
    \n-
    641 });
    \n-
    642
    \n-
    643 decompose();
    \n-
    644 }
    \n-
    \n-
    645
    \n-
    646 // Keep legacy version using a set of scalar indices
    \n-
    647 // The new version using a bitVector type for marking the active matrix indices is
    \n-
    648 // directly given in `setMatrix` with an additional BitVector argument.
    \n-
    649 // The new version is more flexible and allows, e.g., marking single components of a matrix block.
    \n-
    650 template<typename S>
    \n-
    \n-
    651 void setSubMatrix(const Matrix& _mat, const S& rowIndexSet)
    \n-
    652 {
    \n-
    653 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)
    \n-
    654 free();
    \n-
    655
    \n-
    656 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() != 0)
    \n-
    657 umfpackMatrix_.free();
    \n-
    658
    \n-
    659 umfpackMatrix_.setSize(rowIndexSet.size()*MatrixDimension<Matrix>::rowdim(_mat) / _mat.N(),
    \n-
    660 rowIndexSet.size()*MatrixDimension<Matrix>::coldim(_mat) / _mat.M());
    \n-
    661 ISTL::Impl::BCCSMatrixInitializer<Matrix, SuiteSparse_long> initializer(umfpackMatrix_);
    \n-
    662
    \n-
    663 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(_mat,rowIndexSet));
    \n-
    664
    \n-
    665 decompose();
    \n-
    666 }
    \n-
    \n-
    667
    \n-
    \n-
    675 void setVerbosity(int v)
    \n-
    676 {
    \n-
    677 verbosity_ = v;
    \n-
    678 // set the verbosity level in UMFPack
    \n-
    679 if (verbosity_ == 0)
    \n-
    680 UMF_Control[UMFPACK_PRL] = 1;
    \n-
    681 if (verbosity_ == 1)
    \n-
    682 UMF_Control[UMFPACK_PRL] = 2;
    \n-
    683 if (verbosity_ == 2)
    \n-
    684 UMF_Control[UMFPACK_PRL] = 4;
    \n-
    685 }
    \n-
    \n-
    686
    \n-
    \n-\n-
    692 {
    \n-
    693 return UMF_Numeric;
    \n-
    694 }
    \n-
    \n-
    695
    \n-
    \n-\n-
    701 {
    \n-
    702 return umfpackMatrix_;
    \n-
    703 }
    \n-
    \n-
    704
    \n-
    \n-
    709 void free()
    \n-
    710 {
    \n-
    711 if (!matrixIsLoaded_)
    \n-
    712 {
    \n-
    713 Caller::free_symbolic(&UMF_Symbolic);
    \n-
    714 umfpackMatrix_.free();
    \n-
    715 }
    \n-
    716 Caller::free_numeric(&UMF_Numeric);
    \n-
    717 matrixIsLoaded_ = false;
    \n-
    718 }
    \n-
    \n-
    719
    \n-
    720 const char* name() { return "UMFPACK"; }
    \n-
    721
    \n-
    722 private:
    \n-
    723 typedef typename Dune::UMFPackMethodChooser<T> Caller;
    \n-
    724
    \n-
    725 template<class Mat,class X, class TM, class TD, class T1>
    \n-\n-\n-
    728
    \n-
    730 void decompose()
    \n-
    731 {
    \n-
    732 double UMF_Decomposition_Info[UMFPACK_INFO];
    \n-
    733 Caller::symbolic(static_cast<SuiteSparse_long>(umfpackMatrix_.N()),
    \n-
    734 static_cast<SuiteSparse_long>(umfpackMatrix_.N()),
    \n-
    735 umfpackMatrix_.getColStart(),
    \n-
    736 umfpackMatrix_.getRowIndex(),
    \n-
    737 reinterpret_cast<double*>(umfpackMatrix_.getValues()),
    \n-
    738 &UMF_Symbolic,
    \n-
    739 UMF_Control,
    \n-
    740 UMF_Decomposition_Info);
    \n-
    741 Caller::numeric(umfpackMatrix_.getColStart(),
    \n-
    742 umfpackMatrix_.getRowIndex(),
    \n-
    743 reinterpret_cast<double*>(umfpackMatrix_.getValues()),
    \n-
    744 UMF_Symbolic,
    \n-
    745 &UMF_Numeric,
    \n-
    746 UMF_Control,
    \n-
    747 UMF_Decomposition_Info);
    \n-
    748 Caller::report_status(UMF_Control,UMF_Decomposition_Info[UMFPACK_STATUS]);
    \n-
    749 if (verbosity_ == 1)
    \n-
    750 {
    \n-
    751 std::cout << "[UMFPack Decomposition]" << std::endl;
    \n-
    752 std::cout << "Wallclock Time taken: " << UMF_Decomposition_Info[UMFPACK_NUMERIC_WALLTIME] << " (CPU Time: " << UMF_Decomposition_Info[UMFPACK_NUMERIC_TIME] << ")" << std::endl;
    \n-
    753 std::cout << "Flops taken: " << UMF_Decomposition_Info[UMFPACK_FLOPS] << std::endl;
    \n-
    754 std::cout << "Peak Memory Usage: " << UMF_Decomposition_Info[UMFPACK_PEAK_MEMORY]*UMF_Decomposition_Info[UMFPACK_SIZE_OF_UNIT] << " bytes" << std::endl;
    \n-
    755 std::cout << "Condition number estimate: " << 1./UMF_Decomposition_Info[UMFPACK_RCOND] << std::endl;
    \n-
    756 std::cout << "Numbers of non-zeroes in decomposition: L: " << UMF_Decomposition_Info[UMFPACK_LNZ] << " U: " << UMF_Decomposition_Info[UMFPACK_UNZ] << std::endl;
    \n-
    757 }
    \n-
    758 if (verbosity_ == 2)
    \n-
    759 {
    \n-
    760 Caller::report_info(UMF_Control,UMF_Decomposition_Info);
    \n-
    761 }
    \n-
    762 }
    \n-
    763
    \n-
    764 void printOnApply(double* UMF_Info)
    \n-
    765 {
    \n-
    766 Caller::report_status(UMF_Control,UMF_Info[UMFPACK_STATUS]);
    \n-
    767 if (verbosity_ > 0)
    \n-
    768 {
    \n-
    769 std::cout << "[UMFPack Solve]" << std::endl;
    \n-
    770 std::cout << "Wallclock Time: " << UMF_Info[UMFPACK_SOLVE_WALLTIME] << " (CPU Time: " << UMF_Info[UMFPACK_SOLVE_TIME] << ")" << std::endl;
    \n-
    771 std::cout << "Flops Taken: " << UMF_Info[UMFPACK_SOLVE_FLOPS] << std::endl;
    \n-
    772 std::cout << "Iterative Refinement steps taken: " << UMF_Info[UMFPACK_IR_TAKEN] << std::endl;
    \n-
    773 std::cout << "Error Estimate: " << UMF_Info[UMFPACK_OMEGA1] << " resp. " << UMF_Info[UMFPACK_OMEGA2] << std::endl;
    \n-
    774 }
    \n-
    775 }
    \n-
    776
    \n-
    777 UMFPackMatrix umfpackMatrix_;
    \n-
    778 bool matrixIsLoaded_;
    \n-
    779 int verbosity_;
    \n-
    780 void *UMF_Symbolic;
    \n-
    781 void *UMF_Numeric;
    \n-
    782 double UMF_Control[UMFPACK_CONTROL];
    \n-
    783 };
    \n-
    \n-
    784
    \n-
    785 template<typename T, typename A, int n, int m>
    \n-
    \n-\n-
    787 {
    \n-
    788 enum { value=true};
    \n-
    789 };
    \n-
    \n-
    790
    \n-
    791 template<typename T, typename A>
    \n-
    \n-\n-
    793 {
    \n-
    794 enum { value = true };
    \n-
    795 };
    \n-
    \n-
    796
    \n-
    \n-\n-
    798
    \n-
    799 template<class TL, class M,class=void> struct isValidBlock : std::false_type{};
    \n-
    800 template<class TL, class M> struct isValidBlock<TL,M,
    \n-
    801 std::enable_if_t<
    \n-
    802 std::is_same_v<Impl::UMFPackDomainType<M>, typename Dune::TypeListElement<1,TL>::type>
    \n-
    803 && std::is_same_v<Impl::UMFPackRangeType<M>, typename Dune::TypeListElement<2,TL>::type>
    \n-
    804 >> : std::true_type {};
    \n-
    805
    \n-
    806 template<typename TL, typename M>
    \n-
    807 std::shared_ptr<Dune::InverseOperator<Impl::UMFPackDomainType<M>,Impl::UMFPackRangeType<M>>>
    \n-
    \n-
    808 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
    \n-
    809 std::enable_if_t<isValidBlock<TL, M>::value,int> = 0) const
    \n-
    810 {
    \n-
    811 int verbose = config.get("verbose", 0);
    \n-
    812 return std::make_shared<Dune::UMFPack<M>>(mat,verbose);
    \n-
    813 }
    \n-
    \n-
    814
    \n-
    815 // second version with SFINAE to validate the template parameters of UMFPack
    \n-
    816 template<typename TL, typename M>
    \n-
    817 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n-
    818 typename Dune::TypeListElement<2, TL>::type>>
    \n-
    \n-
    819 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
    \n-
    820 std::enable_if_t<!isValidBlock<TL, M>::value,int> = 0) const
    \n-
    821 {
    \n-
    822 using D = typename Dune::TypeListElement<1,TL>::type;
    \n-
    823 using R = typename Dune::TypeListElement<2,TL>::type;
    \n-
    824 using DU = Std::detected_t< Impl::UMFPackDomainType, M>;
    \n-
    825 using RU = Std::detected_t< Impl::UMFPackRangeType, M>;
    \n-
    826 DUNE_THROW(UnsupportedType,
    \n-
    827 "Unsupported Types in UMFPack:\\n"
    \n-
    828 "Matrix: " << className<M>() << ""
    \n-
    829 "Domain provided: " << className<D>() << "\\n"
    \n-
    830 "Domain required: " << className<DU>() << "\\n"
    \n-
    831 "Range provided: " << className<R>() << "\\n"
    \n-
    832 "Range required: " << className<RU>() << "\\n"
    \n-
    833 );
    \n-
    834 }
    \n-
    \n-
    835 };
    \n-
    \n-\n-
    837} // end namespace Dune
    \n-
    838
    \n-
    839#endif // HAVE_SUITESPARSE_UMFPACK
    \n-
    840
    \n-
    841#endif //DUNE_ISTL_UMFPACK_HH
    \n-
    #define DUNE_REGISTER_DIRECT_SOLVER(name,...)
    Definition solverregistry.hh:13
    \n-
    Implementation of the BCRSMatrix class.
    \n-
    Implementations of the inverse operator interface.
    \n-\n-\n-\n-\n-\n-
    Templates characterizing the type of a solver.
    \n-
    void free()
    free allocated space.
    Definition umfpack.hh:709
    \n-
    std::shared_ptr< Dune::InverseOperator< Impl::UMFPackDomainType< M >, Impl::UMFPackRangeType< M > > > operator()(TL, const M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< TL, M >::value, int >=0) const
    Definition umfpack.hh:808
    \n-
    virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
    Apply inverse operator,.
    Definition umfpack.hh:403
    \n-
    SuiteSparse_long size_type
    Definition umfpack.hh:262
    \n-
    static void symbolic(size_type m, size_type n, const size_type *cs, const size_type *ri, const double *val, A... args)
    Definition umfpack.hh:166
    \n-
    static void solve(size_type m, const size_type *cs, const size_type *ri, std::complex< double > *val, double *x, const double *b, A... args)
    Definition umfpack.hh:160
    \n-
    virtual SolverCategory::Category category() const
    Category of the solver (see SolverCategory::Category)
    Definition umfpack.hh:277
    \n-
    M matrix_type
    Definition umfpack.hh:266
    \n-
    static void numeric(const size_type *cs, const size_type *ri, const double *val, A... args)
    Definition umfpack.hh:140
    \n-
    static void report_info(A... args)
    Definition umfpack.hh:145
    \n-
    UMFPack(const Matrix &mat_, const ParameterTree &config)
    Construct a solver object from a matrix.
    Definition umfpack.hh:327
    \n-
    static int load_numeric(A... args)
    Definition umfpack.hh:135
    \n-
    static int load_numeric(A... args)
    Definition umfpack.hh:77
    \n-
    static void report_status(A... args)
    Definition umfpack.hh:92
    \n-
    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:351
    \n-
    Impl::UMFPackRangeType< M > range_type
    The type of the range of the solver.
    Definition umfpack.hh:274
    \n-
    UMFPack()
    default constructor
    Definition umfpack.hh:333
    \n-
    static void symbolic(A... args)
    Definition umfpack.hh:107
    \n-
    static void report_info(A... args)
    Definition umfpack.hh:87
    \n-
    static void free_symbolic(A... args)
    Definition umfpack.hh:72
    \n-
    static int save_numeric(A... args)
    Definition umfpack.hh:155
    \n-
    static void free_numeric(A... args)
    Definition umfpack.hh:125
    \n-
    void setSubMatrix(const Matrix &_mat, const S &rowIndexSet)
    Definition umfpack.hh:651
    \n-
    static int save_numeric(A... args)
    Definition umfpack.hh:97
    \n-
    static void report_status(A... args)
    Definition umfpack.hh:150
    \n-
    Impl::UMFPackDomainType< M > domain_type
    The type of the domain of the solver.
    Definition umfpack.hh:272
    \n-
    void apply(T *x, T *b)
    additional apply method with c-arrays in analogy to superlu
    Definition umfpack.hh:466
    \n-
    static void defaults(A... args)
    Definition umfpack.hh:120
    \n-
    static void free_numeric(A... args)
    Definition umfpack.hh:67
    \n-
    void setVerbosity(int v)
    sets the verbosity level for the UMFPack solver
    Definition umfpack.hh:675
    \n-
    UMFPack(const char *file, int verbose=0)
    try loading a decomposition from file
    Definition umfpack.hh:378
    \n-
    static void numeric(A... args)
    Definition umfpack.hh:82
    \n-
    static constexpr bool valid
    Definition umfpack.hh:53
    \n-
    virtual ~UMFPack()
    Definition umfpack.hh:394
    \n-
    const char * name()
    Definition umfpack.hh:720
    \n-
    void setMatrix(const Matrix &matrix, const BitVector &bitVector={})
    Initialize data from given matrix.
    Definition umfpack.hh:520
    \n-
    void saveDecomposition(const char *file)
    saves a decomposition to a file
    Definition umfpack.hh:503
    \n-
    UMFPackMatrix & getInternalMatrix()
    Return the column compress matrix from UMFPack.
    Definition umfpack.hh:700
    \n-
    SuiteSparse_long size_type
    Definition umfpack.hh:117
    \n-
    UMFPack(const Matrix &matrix, int verbose=0)
    Construct a solver object from a matrix.
    Definition umfpack.hh:290
    \n-
    ISTL::Impl::BCCSMatrixInitializer< M, size_type > MatrixInitializer
    Type of an associated initializer class.
    Definition umfpack.hh:270
    \n-
    virtual void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
    apply inverse operator, with given convergence criteria.
    Definition umfpack.hh:454
    \n-
    ISTL::Impl::BCCSMatrix< typename Matrix::field_type, size_type > UMFPackMatrix
    The corresponding (scalar) UMFPack matrix type.
    Definition umfpack.hh:268
    \n-
    void setOption(unsigned int option, double value)
    Set UMFPack-specific options.
    Definition umfpack.hh:492
    \n-
    static void free_symbolic(A... args)
    Definition umfpack.hh:130
    \n-
    M Matrix
    The matrix type.
    Definition umfpack.hh:265
    \n-
    static void defaults(A... args)
    Definition umfpack.hh:62
    \n-
    static void solve(A... args)
    Definition umfpack.hh:102
    \n-
    UMFPack(const Matrix &matrix, int verbose, bool)
    Constructor for compatibility with SuperLU standard constructor.
    Definition umfpack.hh:308
    \n-
    void * getFactorization()
    Return the matrix factorization.
    Definition umfpack.hh:691
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n-
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n-
    STL namespace.
    \n+
    527} // end namespace Imp
    \n+
    528
    \n+
    529} // end namespace
    \n+
    530
    \n+
    531#endif
    \n+\n
    Definition allocator.hh:11
    \n-
    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
    \n-
    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
    \n-
    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
    \n-
    Definition matrixutils.hh:211
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n-
    Definition overlappingschwarz.hh:694
    \n-
    Definition matrixutils.hh:27
    \n-
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n-
    double elapsed
    Elapsed time in seconds.
    Definition solver.hh:84
    \n-
    int iterations
    Number of iterations.
    Definition solver.hh:69
    \n-
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n-
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n-
    Definition solverregistry.hh:77
    \n-
    Definition solvertype.hh:16
    \n-
    @ value
    Whether this is a direct solver.
    Definition solvertype.hh:24
    \n-
    Definition solvertype.hh:30
    \n-
    @ value
    whether the solver internally uses column compressed storage
    Definition solvertype.hh:36
    \n-
    Definition umfpack.hh:52
    \n-
    The UMFPack direct sparse solver.
    Definition umfpack.hh:258
    \n-
    Definition umfpack.hh:797
    \n-
    Definition umfpack.hh:799
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1066 +1,421 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-umfpack.hh\n+basearray.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_UMFPACK_HH\n-6#define DUNE_ISTL_UMFPACK_HH\n+5#ifndef DUNE_ISTL_BASEARRAY_HH\n+6#define DUNE_ISTL_BASEARRAY_HH\n 7\n-8#if HAVE_SUITESPARSE_UMFPACK || defined DOXYGEN\n-9\n-10#include\n-11#include\n-12\n-13#include\n-14\n-15#include\n-16#include\n-17#include\n-18#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n-19#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-20#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh>\n-21#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-22#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-23#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n-24#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-25#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n-26\n-27\n-28\n-29namespace _\bD_\bu_\bn_\be {\n-41 // FORWARD DECLARATIONS\n-42 template\n-43 class SeqOverlappingSchwarz;\n-44\n-45 template\n-46 struct SeqOverlappingSchwarzAssemblerHelper;\n-47\n-48 // wrapper class for C-Function Calls in the backend. Choose the right\n-function namespace\n-49 // depending on the template parameter used.\n-50 template\n-_\b5_\b1 struct _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br\n-52 {\n-_\b5_\b3 static constexpr bool _\bv_\ba_\bl_\bi_\bd = false ;\n-54 };\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13\n+14#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+15#include \n+16\n+21namespace _\bD_\bu_\bn_\be {\n+22\n+24namespace Imp {\n+25\n+46 template\n+47 class base_array_unmanaged\n+48 {\n+49 public:\n+50\n+51 //===== type definitions and constants\n+52\n+54 typedef B member_type;\n 55\n-56 template<>\n-_\b5_\b7 struct _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br\n-58 {\n-_\b5_\b9 static constexpr bool _\bv_\ba_\bl_\bi_\bd = true ;\n-60\n-61 template\n-_\b6_\b2 static void _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs(A... args)\n-63 {\n-64 umfpack_dl_defaults(args...);\n-65 }\n-66 template\n-_\b6_\b7 static void _\bf_\br_\be_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n-68 {\n-69 umfpack_dl_free_numeric(args...);\n-70 }\n-71 template\n-_\b7_\b2 static void _\bf_\br_\be_\be_\b__\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc(A... args)\n-73 {\n-74 umfpack_dl_free_symbolic(args...);\n-75 }\n-76 template\n-_\b7_\b7 static int _\bl_\bo_\ba_\bd_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n+57 typedef ST size_type;\n+58\n+60 using reference = B&;\n+61\n+63 using const_reference = const B&;\n+64\n+65 //===== access to components\n+66\n+68 reference operator[] (size_type i)\n+69 {\n+70#ifdef DUNE_ISTL_WITH_CHECKING\n+71 if (i>=n) DUNE_THROW(ISTLError,\"index out of range\");\n+72#endif\n+73 return p[i];\n+74 }\n+75\n+77 const_reference operator[] (size_type i) const\n 78 {\n-79 return umfpack_dl_load_numeric(args...);\n-80 }\n-81 template\n-_\b8_\b2 static void _\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n-83 {\n-84 umfpack_dl_numeric(args...);\n-85 }\n-86 template\n-_\b8_\b7 static void _\br_\be_\bp_\bo_\br_\bt_\b__\bi_\bn_\bf_\bo(A... args)\n-88 {\n-89 umfpack_dl_report_info(args...);\n-90 }\n-91 template\n-_\b9_\b2 static void _\br_\be_\bp_\bo_\br_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs(A... args)\n-93 {\n-94 umfpack_dl_report_status(args...);\n-95 }\n-96 template\n-_\b9_\b7 static int _\bs_\ba_\bv_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n-98 {\n-99 return umfpack_dl_save_numeric(args...);\n-100 }\n-101 template\n-_\b1_\b0_\b2 static void _\bs_\bo_\bl_\bv_\be(A... args)\n-103 {\n-104 umfpack_dl_solve(args...);\n-105 }\n-106 template\n-_\b1_\b0_\b7 static void _\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc(A... args)\n-108 {\n-109 umfpack_dl_symbolic(args...);\n-110 }\n-111 };\n-112\n-113 template<>\n-_\b1_\b1_\b4 struct _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br<_\bs_\bt_\bd::complex >\n-115 {\n-_\b1_\b1_\b6 static constexpr bool _\bv_\ba_\bl_\bi_\bd = true ;\n-_\b1_\b1_\b7 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = SuiteSparse_long;\n-118\n-119 template\n-_\b1_\b2_\b0 static void _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs(A... args)\n-121 {\n-122 umfpack_zl_defaults(args...);\n-123 }\n-124 template\n-_\b1_\b2_\b5 static void _\bf_\br_\be_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n+79#ifdef DUNE_ISTL_WITH_CHECKING\n+80 if (i>=n) DUNE_THROW(ISTLError,\"index out of range\");\n+81#endif\n+82 return p[i];\n+83 }\n+84\n+86 template\n+87 class RealIterator\n+88 : public RandomAccessIteratorFacade, T>\n+89 {\n+90 public:\n+92 typedef typename std::remove_const::type ValueType;\n+93\n+94 friend class RandomAccessIteratorFacade, const\n+ValueType>;\n+95 friend class RandomAccessIteratorFacade, ValueType>;\n+96 friend class RealIterator;\n+97 friend class RealIterator;\n+98\n+100 RealIterator ()\n+101 : p(0), i(0)\n+102 {}\n+103\n+104 RealIterator (const B* _p, B* _i) : p(_p), i(_i)\n+105 { }\n+106\n+107 RealIterator(const RealIterator& it)\n+108 : p(it.p), i(it.i)\n+109 {}\n+110\n+112 size_type index () const\n+113 {\n+114 return i-p;\n+115 }\n+116\n+118 bool equals (const RealIterator& other) const\n+119 {\n+120 assert(other.p==p);\n+121 return i==other.i;\n+122 }\n+123\n+125 bool equals (const RealIterator& other) const\n 126 {\n-127 umfpack_zl_free_numeric(args...);\n-128 }\n-129 template\n-_\b1_\b3_\b0 static void _\bf_\br_\be_\be_\b__\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc(A... args)\n-131 {\n-132 umfpack_zl_free_symbolic(args...);\n-133 }\n-134 template\n-_\b1_\b3_\b5 static int _\bl_\bo_\ba_\bd_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n-136 {\n-137 return umfpack_zl_load_numeric(args...);\n-138 }\n-139 template\n-_\b1_\b4_\b0 static void _\bn_\bu_\bm_\be_\br_\bi_\bc(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* cs, const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* ri, const double*\n-val, A... args)\n-141 {\n-142 umfpack_zl_numeric(cs,ri,val,NULL,args...);\n-143 }\n-144 template\n-_\b1_\b4_\b5 static void _\br_\be_\bp_\bo_\br_\bt_\b__\bi_\bn_\bf_\bo(A... args)\n-146 {\n-147 umfpack_zl_report_info(args...);\n-148 }\n-149 template\n-_\b1_\b5_\b0 static void _\br_\be_\bp_\bo_\br_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs(A... args)\n+127 assert(other.p==p);\n+128 return i==other.i;\n+129 }\n+130\n+131 std::ptrdiff_t distanceTo(const RealIterator& o) const\n+132 {\n+133 return o.i-i;\n+134 }\n+135\n+136 private:\n+138 void increment()\n+139 {\n+140 ++i;\n+141 }\n+142\n+144 void decrement()\n+145 {\n+146 --i;\n+147 }\n+148\n+149 // Needed for operator[] of the iterator\n+150 reference elementAt (std::ptrdiff_t offset) const\n 151 {\n-152 umfpack_zl_report_status(args...);\n+152 return *(i+offset);\n 153 }\n-154 template\n-_\b1_\b5_\b5 static int _\bs_\ba_\bv_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc(A... args)\n-156 {\n-157 return umfpack_zl_save_numeric(args...);\n-158 }\n-159 template\n-_\b1_\b6_\b0 static void _\bs_\bo_\bl_\bv_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be m, const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* cs, const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* ri,\n-std::complex* val, double* x, const double* b,A... args)\n-161 {\n-162 const double* cval = reinterpret_cast(val);\n-163 umfpack_zl_solve(m,cs,ri,cval,NULL,x,NULL,b,NULL,args...);\n+154\n+156 reference dereference () const\n+157 {\n+158 return *i;\n+159 }\n+160\n+161 void advance(std::ptrdiff_t d)\n+162 {\n+163 i+=d;\n 164 }\n-165 template\n-_\b1_\b6_\b6 static void _\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be n, const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* cs, const\n-_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* ri, const double* val, A... args)\n-167 {\n-168 umfpack_zl_symbolic(m,n,cs,ri,val,NULL,args...);\n-169 }\n-170 };\n-171\n-172 namespace Impl\n-173 {\n-174 template\n-175 struct UMFPackVectorChooser;\n-176\n-178 template using UMFPackDomainType = typename\n-UMFPackVectorChooser::domain_type;\n+165\n+166 const B* p;\n+167 B* i;\n+168 };\n+169\n+171 typedef RealIterator iterator;\n+172\n+173\n+175 iterator begin ()\n+176 {\n+177 return iterator(p,p);\n+178 }\n 179\n-181 template using UMFPackRangeType = typename\n-UMFPackVectorChooser::range_type;\n-182\n-183 template\n-184 struct UMFPackVectorChooser::value) || (std::is_same >::value)>>\n-186 {\n-187 using domain_type = M;\n-188 using range_type = M;\n-189 };\n-190\n-191 template\n-192 struct UMFPackVectorChooser,\n-193 _\bs_\bt_\bd::enable_if_t<(std::is_same::value) || (std::is_same >::value)>>\n-194 {\n-196 using domain_type = FieldVector;\n-198 using range_type = FieldVector;\n-199 };\n-200\n-201 template\n-202 struct UMFPackVectorChooser,\n-203 _\bs_\bt_\bd::void_t, UMFPackRangeType>>\n-204 {\n-205 // In case of recursive deduction (e.g., BCRSMatrix,\n-Allocator>>)\n-206 // the allocator needs to be converted to the sub-block allocator type too\n-(e.g., Allocator>).\n-207 // Note that matrix allocator is assumed to be the same as the domain/range\n-type of allocators\n-209 using domain_type = BlockVector, typename std::\n-allocator_traits::template rebind_alloc>>;\n-211 using range_type = BlockVector, typename std::\n-allocator_traits::template rebind_alloc>>;\n-212 };\n-213\n-214 // to make the `UMFPackVectorChooser` work with `MultiTypeBlockMatrix`, we\n-need to add an intermediate step for the rows, which are typically\n-`MultiTypeBlockVector`\n-215 template\n-216 struct UMFPackVectorChooser,\n-217 _\bs_\bt_\bd::void_t, UMFPackRangeType,\n-UMFPackDomainType...>>\n-218 {\n-220 using domain_type = MultiTypeBlockVector,\n-UMFPackDomainType...>;\n-222 using range_type = UMFPackRangeType;\n-223 };\n-224\n-225 // specialization for `MultiTypeBlockMatrix` with `MultiTypeBlockVector`\n-rows\n-226 template\n-227 struct UMFPackVectorChooser,\n-228 _\bs_\bt_\bd::void_t, UMFPackRangeType,\n-UMFPackRangeType...>>\n-229 {\n-231 using domain_type = UMFPackDomainType;\n-233 using range_type = MultiTypeBlockVector< UMFPackRangeType,\n-UMFPackRangeType... >;\n-234 };\n-235\n-236 // dummy class to represent no BitVector\n-237 struct NoBitVector\n-238 {};\n-239\n+181 iterator end ()\n+182 {\n+183 return iterator(p,p+n);\n+184 }\n+185\n+188 iterator beforeEnd ()\n+189 {\n+190 return iterator(p,p+n-1);\n+191 }\n+192\n+195 iterator beforeBegin ()\n+196 {\n+197 return iterator(p,p-1);\n+198 }\n+199\n+201 iterator find (size_type i)\n+202 {\n+203 return iterator(p,p+std::min(i,n));\n+204 }\n+205\n+207 typedef RealIterator const_iterator;\n+208\n+210 const_iterator begin () const\n+211 {\n+212 return const_iterator(p,p+0);\n+213 }\n+214\n+216 const_iterator end () const\n+217 {\n+218 return const_iterator(p,p+n);\n+219 }\n+220\n+223 const_iterator beforeEnd () const\n+224 {\n+225 return const_iterator(p,p+n-1);\n+226 }\n+227\n+230 const_iterator beforeBegin () const\n+231 {\n+232 return const_iterator(p,p-1);\n+233 }\n+234\n+236 const_iterator find (size_type i) const\n+237 {\n+238 return const_iterator(p,p+std::min(i,n));\n+239 }\n 240\n-241 }\n-242\n-256 template\n-_\b2_\b5_\b7 class _\bU_\bM_\bF_\bP_\ba_\bc_\bk : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br,Impl::\n-UMFPackRangeType>\n+241\n+242 //===== sizes\n+243\n+245 size_type size () const\n+246 {\n+247 return n;\n+248 }\n+249\n+251 const B* data() const\n+252 {\n+253 return p;\n+254 }\n+255\n+257 B* data()\n 258 {\n-259 using T = typename M::field_type;\n-260\n-261 public:\n-_\b2_\b6_\b2 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = SuiteSparse_long;\n-263\n-_\b2_\b6_\b5 using _\bM_\ba_\bt_\br_\bi_\bx = M;\n-_\b2_\b6_\b6 using _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be = M;\n-_\b2_\b6_\b8 using _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx = ISTL::Impl::BCCSMatrix;\n-_\b2_\b7_\b0 using _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br = ISTL::Impl::BCCSMatrixInitializer;\n-_\b2_\b7_\b2 using _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be = Impl::UMFPackDomainType;\n-_\b2_\b7_\b4 using _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be = Impl::UMFPackRangeType;\n+259 return p;\n+260 }\n+261\n+262 protected:\n+264 base_array_unmanaged ()\n+265 : n(0), p(0)\n+266 {}\n+268 base_array_unmanaged (size_type n_, B* p_)\n+269 : n(n_), p(p_)\n+270 {}\n+271 size_type n; // number of elements in array\n+272 B *p; // pointer to dynamically allocated built-in array\n+273 };\n+274\n 275\n-_\b2_\b7_\b7 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-278 {\n-279 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-280 }\n-281\n-_\b2_\b9_\b0 _\bU_\bM_\bF_\bP_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose=0) : matrixIsLoaded_(false)\n-291 {\n-292 //check whether T is a supported type\n-293 static_assert((std::is_same::value) || (std::is_same >::value),\n-294 \"Unsupported Type in UMFPack (only double and std::complex\n-supported)\");\n-295 Caller::defaults(UMF_Control);\n-296 _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(verbose);\n-297 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(matrix);\n-298 }\n-299\n-_\b3_\b0_\b8 _\bU_\bM_\bF_\bP_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose, bool) : matrixIsLoaded_(false)\n-309 {\n-310 //check whether T is a supported type\n-311 static_assert((std::is_same::value) || (std::is_same >::value),\n-312 \"Unsupported Type in UMFPack (only double and std::complex\n-supported)\");\n-313 Caller::defaults(UMF_Control);\n-314 _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(verbose);\n-315 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(matrix);\n-316 }\n-317\n-_\b3_\b2_\b7 _\bU_\bM_\bF_\bP_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& mat_, const ParameterTree& config)\n-328 : _\bU_\bM_\bF_\bP_\ba_\bc_\bk(mat_, config._\bg_\be_\bt(\"verbose\", 0))\n-329 {}\n-330\n-_\b3_\b3_\b3 _\bU_\bM_\bF_\bP_\ba_\bc_\bk() : matrixIsLoaded_(false), verbosity_(0)\n-334 {\n-335 //check whether T is a supported type\n-336 static_assert((std::is_same::value) || (std::is_same >::value),\n-337 \"Unsupported Type in UMFPack (only double and std::complex\n-supported)\");\n-338 Caller::defaults(UMF_Control);\n-339 }\n-340\n-_\b3_\b5_\b1 _\bU_\bM_\bF_\bP_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& mat_, const char* file, int verbose=0)\n-352 {\n-353 //check whether T is a supported type\n-354 static_assert((std::is_same::value) || (std::is_same >::value),\n-355 \"Unsupported Type in UMFPack (only double and std::complex\n-supported)\");\n-356 Caller::defaults(UMF_Control);\n-357 _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(verbose);\n-358 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast(file));\n-359 if ((errcode == UMFPACK_ERROR_out_of_memory) || (errcode ==\n-UMFPACK_ERROR_file_IO))\n-360 {\n-361 matrixIsLoaded_ = false;\n-362 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(mat_);\n-363 _\bs_\ba_\bv_\be_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(file);\n-364 }\n-365 else\n-366 {\n-367 matrixIsLoaded_ = true;\n-368 std::cout << \"UMFPack decomposition successfully loaded from \" << file <<\n-std::endl;\n-369 }\n-370 }\n-371\n-_\b3_\b7_\b8 _\bU_\bM_\bF_\bP_\ba_\bc_\bk(const char* file, int verbose=0)\n-379 {\n-380 //check whether T is a supported type\n-381 static_assert((std::is_same::value) || (std::is_same >::value),\n-382 \"Unsupported Type in UMFPack (only double and std::complex\n-supported)\");\n-383 Caller::defaults(UMF_Control);\n-384 int errcode = Caller::load_numeric(&UMF_Numeric, const_cast(file));\n-385 if (errcode == UMFPACK_ERROR_out_of_memory)\n-386 DUNE_THROW(Dune::Exception, \"ran out of memory while loading UMFPack\n-decomposition\");\n-387 if (errcode == UMFPACK_ERROR_file_IO)\n-388 DUNE_THROW(Dune::Exception, \"IO error while loading UMFPack\n-decomposition\");\n-389 matrixIsLoaded_ = true;\n-390 std::cout << \"UMFPack decomposition successfully loaded from \" << file <<\n-std::endl;\n-391 _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(verbose);\n-392 }\n-393\n-_\b3_\b9_\b4 virtual _\b~_\bU_\bM_\bF_\bP_\ba_\bc_\bk()\n-395 {\n-396 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)\n-397 _\bf_\br_\be_\be();\n-398 }\n-399\n-_\b4_\b0_\b3 virtual void _\ba_\bp_\bp_\bl_\by(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt&\n-res)\n+276\n+298 template\n+299 class compressed_base_array_unmanaged\n+300 {\n+301 public:\n+302\n+303 //===== type definitions and constants\n+304\n+306 typedef B member_type;\n+307\n+309 typedef ST size_type;\n+310\n+312 using reference = B&;\n+313\n+315 using const_reference = const B&;\n+316\n+317 //===== access to components\n+318\n+320 reference operator[] (size_type i)\n+321 {\n+322 const size_type* lb = std::lower_bound(j, j+n, i);\n+323 if (lb == j+n || *lb != i)\n+324 DUNE_THROW(ISTLError,\"index \"<\n+339 class RealIterator\n+340 : public BidirectionalIteratorFacade, T>\n+341 {\n+342 public:\n+344 typedef typename std::remove_const::type ValueType;\n+345\n+346 friend class BidirectionalIteratorFacade,\n+const ValueType>;\n+347 friend class BidirectionalIteratorFacade,\n+ValueType>;\n+348 friend class RealIterator;\n+349 friend class RealIterator;\n+350\n+352 RealIterator ()\n+353 : p(0), j(0), i(0)\n+354 {}\n+355\n+357 RealIterator (B* _p, size_type* _j, size_type _i)\n+358 : p(_p), j(_j), i(_i)\n+359 { }\n+360\n+364 RealIterator(const RealIterator& it)\n+365 : p(it.p), j(it.j), i(it.i)\n+366 {}\n+367\n+368\n+370 bool equals (const RealIterator& it) const\n+371 {\n+372 assert(p==it.p);\n+373 return (i)==(it.i);\n+374 }\n+375\n+377 bool equals (const RealIterator& it) const\n+378 {\n+379 assert(p==it.p);\n+380 return (i)==(it.i);\n+381 }\n+382\n+383\n+385 size_type index () const\n+386 {\n+387 return j[i];\n+388 }\n+389\n+391 void setindex (size_type k)\n+392 {\n+393 return j[i] = k;\n+394 }\n+395\n+403 size_type offset () const\n 404 {\n-405 if (umfpackMatrix_.N() != b.dim())\n-406 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Size of right-hand-side vector b does not\n-match the number of matrix rows!\");\n-407 if (umfpackMatrix_.M() != x.dim())\n-408 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Size of solution vector x does not match the\n-number of matrix columns!\");\n-409 if (b.size() == 0)\n-410 return;\n-411\n-412 // we have to convert x and b into flat structures\n-413 // however, this is linear in time\n-414 std::vector xFlat(x.dim()), bFlat(b.dim());\n-415\n-416 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(x, [&](auto&& entry, auto&& offset)\n+405 return i;\n+406 }\n+407\n+408 private:\n+410 void increment()\n+411 {\n+412 ++i;\n+413 }\n+414\n+416 void decrement()\n 417 {\n-418 xFlat[ offset ] = entry;\n-419 });\n+418 --i;\n+419 }\n 420\n-421 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(b, [&](auto&& entry, auto&& offset)\n-422 {\n-423 bFlat[ offset ] = entry;\n-424 });\n-425\n-426 double UMF_Apply_Info[UMFPACK_INFO];\n-427 Caller::solve(UMFPACK_A,\n-428 umfpackMatrix_.getColStart(),\n-429 umfpackMatrix_.getRowIndex(),\n-430 umfpackMatrix_.getValues(),\n-431 reinterpret_cast(&xFlat[0]),\n-432 reinterpret_cast(&bFlat[0]),\n-433 UMF_Numeric,\n-434 UMF_Control,\n-435 UMF_Apply_Info);\n-436\n-437 // copy back to blocked vector\n-438 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(x, [&](auto&& entry, auto offset)\n-439 {\n-440 entry = xFlat[offset];\n-441 });\n-442\n-443 //this is a direct solver\n-444 res._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 1;\n-445 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = true;\n-446 res._\be_\bl_\ba_\bp_\bs_\be_\bd = UMF_Apply_Info[UMFPACK_SOLVE_WALLTIME];\n-447\n-448 printOnApply(UMF_Apply_Info);\n-449 }\n-450\n-_\b4_\b5_\b4 virtual void _\ba_\bp_\bp_\bl_\by (_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, [[maybe_unused]] double\n-reduction, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n-455 {\n-456 _\ba_\bp_\bp_\bl_\by(x,b,res);\n-457 }\n-458\n-_\b4_\b6_\b6 void _\ba_\bp_\bp_\bl_\by(T* x, T* b)\n-467 {\n-468 double UMF_Apply_Info[UMFPACK_INFO];\n-469 Caller::solve(UMFPACK_A,\n-470 umfpackMatrix_.getColStart(),\n-471 umfpackMatrix_.getRowIndex(),\n-472 umfpackMatrix_.getValues(),\n-473 x,\n-474 b,\n-475 UMF_Numeric,\n-476 UMF_Control,\n-477 UMF_Apply_Info);\n-478 printOnApply(UMF_Apply_Info);\n-479 }\n-480\n-_\b4_\b9_\b2 void _\bs_\be_\bt_\bO_\bp_\bt_\bi_\bo_\bn(unsigned int option, double value)\n-493 {\n-494 if (option >= UMFPACK_CONTROL)\n-495 DUNE_THROW(RangeError, \"Requested non-existing UMFPack option\");\n-496\n-497 UMF_Control[option] = value;\n-498 }\n-499\n-_\b5_\b0_\b3 void _\bs_\ba_\bv_\be_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(const char* file)\n-504 {\n-505 int errcode = Caller::save_numeric(UMF_Numeric, const_cast(file));\n-506 if (errcode != UMFPACK_OK)\n-507 DUNE_THROW(Dune::Exception,\"IO ERROR while trying to save UMFPack\n-decomposition\");\n-508 }\n+422 reference dereference () const\n+423 {\n+424 return p[i];\n+425 }\n+426\n+427 B* p;\n+428 size_type* j;\n+429 size_type i;\n+430 };\n+431\n+433 typedef RealIterator iterator;\n+434\n+436 iterator begin ()\n+437 {\n+438 return iterator(p,j,0);\n+439 }\n+440\n+442 iterator end ()\n+443 {\n+444 return iterator(p,j,n);\n+445 }\n+446\n+449 iterator beforeEnd ()\n+450 {\n+451 return iterator(p,j,n-1);\n+452 }\n+453\n+456 iterator beforeBegin ()\n+457 {\n+458 return iterator(p,j,-1);\n+459 }\n+460\n+462 iterator find (size_type i)\n+463 {\n+464 const size_type* lb = std::lower_bound(j, j+n, i);\n+465 return (lb != j+n && *lb == i)\n+466 ? iterator(p,j,lb-j)\n+467 : end();\n+468 }\n+469\n+471 typedef RealIterator const_iterator;\n+472\n+474 const_iterator begin () const\n+475 {\n+476 return const_iterator(p,j,0);\n+477 }\n+478\n+480 const_iterator end () const\n+481 {\n+482 return const_iterator(p,j,n);\n+483 }\n+484\n+487 const_iterator beforeEnd () const\n+488 {\n+489 return const_iterator(p,j,n-1);\n+490 }\n+491\n+494 const_iterator beforeBegin () const\n+495 {\n+496 return const_iterator(p,j,-1);\n+497 }\n+498\n+500 const_iterator find (size_type i) const\n+501 {\n+502 const size_type* lb = std::lower_bound(j, j+n, i);\n+503 return (lb != j+n && *lb == i)\n+504 ? const_iterator(p,j,lb-j)\n+505 : end();\n+506 }\n+507\n+508 //===== sizes\n 509\n-519 template\n-_\b5_\b2_\b0 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const BitVector& bitVector = {})\n-521 {\n-522 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)\n-523 _\bf_\br_\be_\be();\n-524 if (matrix.N() == 0 or matrix.M() == 0)\n-525 return;\n+511 size_type size () const\n+512 {\n+513 return n;\n+514 }\n+515\n+516 protected:\n+518 compressed_base_array_unmanaged ()\n+519 : n(0), p(0), j(0)\n+520 {}\n+521\n+522 size_type n; // number of elements in array\n+523 B *p; // pointer to dynamically allocated built-in array\n+524 size_type* j; // the index set\n+525 };\n 526\n-527 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() !=\n-0)\n-528 umfpackMatrix_.free();\n-529\n-530 constexpr bool useBitVector = not std::is_same_v;\n-531\n-532 // use a dynamic flat vector for the bitset\n-533 std::vector flatBitVector;\n-534 // and a mapping from the compressed indices\n-535 std::vector subIndices;\n-536\n-537 int numberOfIgnoredDofs = 0;\n-538 int nonZeros = 0;\n-539\n-540 if constexpr ( useBitVector )\n-541 {\n-542 auto flatSize = _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(bitVector, [](auto&&, auto&&){});\n-543 flatBitVector.resize(flatSize);\n-544\n-545 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(bitVector, [&](auto&& entry, auto&& offset)\n-546 {\n-547 flatBitVector[ offset ] = entry;\n-548 if ( entry )\n-549 {\n-550 numberOfIgnoredDofs++;\n-551 }\n-552 });\n-553 }\n-554\n-555 // compute the flat dimension and the number of nonzeros of the matrix\n-556 auto [flatRows,flatCols] = _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh( matrix, [&](auto&& /*entry*/,\n-auto&& row, auto&& _\bc_\bo_\bl){\n-557 // do not count ignored entries\n-558 if constexpr ( useBitVector )\n-559 if ( flatBitVector[row] or flatBitVector[_\bc_\bo_\bl] )\n-560 return;\n-561\n-562 nonZeros++;\n-563 });\n-564\n-565 if constexpr ( useBitVector )\n-566 {\n-567 // use the original flatRows!\n-568 subIndices.resize(flatRows,std::numeric_limits::max());\n-569\n-570 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be subIndexCounter = 0;\n-571 for ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be(flatRows); i++ )\n-572 if ( not flatBitVector[ i ] )\n-573 subIndices[ i ] = subIndexCounter++;\n-574\n-575 // update the original matrix size\n-576 flatRows -= numberOfIgnoredDofs;\n-577 flatCols -= numberOfIgnoredDofs;\n-578 }\n-579\n-580\n-581 umfpackMatrix_.setSize(flatRows,flatCols);\n-582 umfpackMatrix_.Nnz_ = nonZeros;\n-583\n-584 // prepare the arrays\n-585 umfpackMatrix_.colstart = new _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be[flatCols+1];\n-586 umfpackMatrix_.rowindex = new _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be[nonZeros];\n-587 umfpackMatrix_.values = new T[nonZeros];\n-588\n-589 for ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be(flatCols+1); i++ )\n-590 {\n-591 umfpackMatrix_.colstart[i] = 0;\n-592 }\n-593\n-594 // at first, we need to compute the column start indices\n-595 // therefore, we count all entries in each column and in the end we\n-accumulate everything\n-596 _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&&\n-flatColIndex)\n-597 {\n-598 // do nothing if entry is excluded\n-599 if constexpr ( useBitVector )\n-600 if ( flatBitVector[flatRowIndex] or flatBitVector[flatColIndex] )\n-601 return;\n-602\n-603 // pick compressed or uncompressed index\n-604 // compiler will hopefully do some constexpr optimization here\n-605 auto colIdx = useBitVector ? subIndices[flatColIndex] : flatColIndex;\n-606\n-607 umfpackMatrix_.colstart[colIdx+1]++;\n-608 });\n-609\n-610 // now accumulate\n-611 for ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be)flatCols; i++ )\n-612 {\n-613 umfpackMatrix_.colstart[i+1] += umfpackMatrix_.colstart[i];\n-614 }\n-615\n-616 // we need a compressed position counter in each column\n-617 std::vector colPosition(flatCols,0);\n-618\n-619 // now we can set the entries: the procedure below works with both row- or\n-column major index ordering\n-620 _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&&\n-flatColIndex)\n-621 {\n-622 // do nothing if entry is excluded\n-623 if constexpr ( useBitVector )\n-624 if ( flatBitVector[flatRowIndex] or flatBitVector[flatColIndex] )\n-625 return;\n-626\n-627 // pick compressed or uncompressed index\n-628 // compiler will hopefully do some constexpr optimization here\n-629 auto rowIdx = useBitVector ? subIndices[flatRowIndex] : flatRowIndex;\n-630 auto colIdx = useBitVector ? subIndices[flatColIndex] : flatColIndex;\n-631\n-632 // the start index of each column is already fixed\n-633 auto colStart = umfpackMatrix_.colstart[colIdx];\n-634 // get the current number of picked elements in this column\n-635 auto colPos = colPosition[colIdx];\n-636 // assign the corresponding row index and the value of this element\n-637 umfpackMatrix_.rowindex[ colStart + colPos ] = rowIdx;\n-638 umfpackMatrix_.values[ colStart + colPos ] = entry;\n-639 // increase the number of picked elements in this column\n-640 colPosition[colIdx]++;\n-641 });\n-642\n-643 decompose();\n-644 }\n-645\n-646 // Keep legacy version using a set of scalar indices\n-647 // The new version using a bitVector type for marking the active matrix\n-indices is\n-648 // directly given in `setMatrix` with an additional BitVector argument.\n-649 // The new version is more flexible and allows, e.g., marking single\n-components of a matrix block.\n-650 template\n-_\b6_\b5_\b1 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& _mat, const S& rowIndexSet)\n-652 {\n-653 if ((umfpackMatrix_.N() + umfpackMatrix_.M() > 0) || matrixIsLoaded_)\n-654 _\bf_\br_\be_\be();\n-655\n-656 if (umfpackMatrix_.N() + umfpackMatrix_.M() + umfpackMatrix_.nonzeroes() !=\n-0)\n-657 umfpackMatrix_.free();\n-658\n-659 umfpackMatrix_.setSize(rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-(_mat) / _mat.N(),\n-660 rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(_mat) / _mat.M());\n-661 ISTL::Impl::BCCSMatrixInitializer initializer\n-(umfpackMatrix_);\n-662\n-663 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_\bM_\ba_\bt_\br_\bi_\bx,std::\n-set >(_mat,rowIndexSet));\n-664\n-665 decompose();\n-666 }\n-667\n-_\b6_\b7_\b5 void _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(int v)\n-676 {\n-677 verbosity_ = v;\n-678 // set the verbosity level in UMFPack\n-679 if (verbosity_ == 0)\n-680 UMF_Control[UMFPACK_PRL] = 1;\n-681 if (verbosity_ == 1)\n-682 UMF_Control[UMFPACK_PRL] = 2;\n-683 if (verbosity_ == 2)\n-684 UMF_Control[UMFPACK_PRL] = 4;\n-685 }\n-686\n-_\b6_\b9_\b1 void* _\bg_\be_\bt_\bF_\ba_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn()\n-692 {\n-693 return UMF_Numeric;\n-694 }\n-695\n-_\b7_\b0_\b0 _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& _\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx()\n-701 {\n-702 return umfpackMatrix_;\n-703 }\n-704\n-_\b7_\b0_\b9 void _\bf_\br_\be_\be()\n-710 {\n-711 if (!matrixIsLoaded_)\n-712 {\n-713 Caller::free_symbolic(&UMF_Symbolic);\n-714 umfpackMatrix_.free();\n-715 }\n-716 Caller::free_numeric(&UMF_Numeric);\n-717 matrixIsLoaded_ = false;\n-718 }\n-719\n-_\b7_\b2_\b0 const char* _\bn_\ba_\bm_\be() { return \"UMFPACK\"; }\n-721\n-722 private:\n-723 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b> Caller;\n-724\n-725 template\n-_\b7_\b2_\b6 friend class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n-727 friend struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bU_\bM_\bF_\bP_\ba_\bc_\bk<_\bM_\ba_\bt_\br_\bi_\bx>,true>;\n-728\n-730 void decompose()\n-731 {\n-732 double UMF_Decomposition_Info[UMFPACK_INFO];\n-733 Caller::symbolic(static_cast(umfpackMatrix_.N()),\n-734 static_cast(umfpackMatrix_.N()),\n-735 umfpackMatrix_.getColStart(),\n-736 umfpackMatrix_.getRowIndex(),\n-737 reinterpret_cast(umfpackMatrix_.getValues()),\n-738 &UMF_Symbolic,\n-739 UMF_Control,\n-740 UMF_Decomposition_Info);\n-741 Caller::numeric(umfpackMatrix_.getColStart(),\n-742 umfpackMatrix_.getRowIndex(),\n-743 reinterpret_cast(umfpackMatrix_.getValues()),\n-744 UMF_Symbolic,\n-745 &UMF_Numeric,\n-746 UMF_Control,\n-747 UMF_Decomposition_Info);\n-748 Caller::report_status(UMF_Control,UMF_Decomposition_Info[UMFPACK_STATUS]);\n-749 if (verbosity_ == 1)\n-750 {\n-751 std::cout << \"[UMFPack Decomposition]\" << std::endl;\n-752 std::cout << \"Wallclock Time taken: \" << UMF_Decomposition_Info\n-[UMFPACK_NUMERIC_WALLTIME] << \" (CPU Time: \" << UMF_Decomposition_Info\n-[UMFPACK_NUMERIC_TIME] << \")\" << std::endl;\n-753 std::cout << \"Flops taken: \" << UMF_Decomposition_Info[UMFPACK_FLOPS] <<\n-std::endl;\n-754 std::cout << \"Peak Memory Usage: \" << UMF_Decomposition_Info\n-[UMFPACK_PEAK_MEMORY]*UMF_Decomposition_Info[UMFPACK_SIZE_OF_UNIT] << \" bytes\"\n-<< std::endl;\n-755 std::cout << \"Condition number estimate: \" << 1./UMF_Decomposition_Info\n-[UMFPACK_RCOND] << std::endl;\n-756 std::cout << \"Numbers of non-zeroes in decomposition: L: \" <<\n-UMF_Decomposition_Info[UMFPACK_LNZ] << \" U: \" << UMF_Decomposition_Info\n-[UMFPACK_UNZ] << std::endl;\n-757 }\n-758 if (verbosity_ == 2)\n-759 {\n-760 Caller::report_info(UMF_Control,UMF_Decomposition_Info);\n-761 }\n-762 }\n-763\n-764 void printOnApply(double* UMF_Info)\n-765 {\n-766 Caller::report_status(UMF_Control,UMF_Info[UMFPACK_STATUS]);\n-767 if (verbosity_ > 0)\n-768 {\n-769 std::cout << \"[UMFPack Solve]\" << std::endl;\n-770 std::cout << \"Wallclock Time: \" << UMF_Info[UMFPACK_SOLVE_WALLTIME] << \"\n-(CPU Time: \" << UMF_Info[UMFPACK_SOLVE_TIME] << \")\" << std::endl;\n-771 std::cout << \"Flops Taken: \" << UMF_Info[UMFPACK_SOLVE_FLOPS] << std::endl;\n-772 std::cout << \"Iterative Refinement steps taken: \" << UMF_Info\n-[UMFPACK_IR_TAKEN] << std::endl;\n-773 std::cout << \"Error Estimate: \" << UMF_Info[UMFPACK_OMEGA1] << \" resp. \" <<\n-UMF_Info[UMFPACK_OMEGA2] << std::endl;\n-774 }\n-775 }\n-776\n-777 _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx umfpackMatrix_;\n-778 bool matrixIsLoaded_;\n-779 int verbosity_;\n-780 void *UMF_Symbolic;\n-781 void *UMF_Numeric;\n-782 double UMF_Control[UMFPACK_CONTROL];\n-783 };\n-784\n-785 template\n-_\b7_\b8_\b6 struct _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br<_\bU_\bM_\bF_\bP_\ba_\bc_\bk<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A> > >\n-787 {\n-_\b7_\b8_\b8 enum { _\bv_\ba_\bl_\bu_\be=true};\n-789 };\n-790\n-791 template\n-_\b7_\b9_\b2 struct _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd<_\bU_\bM_\bF_\bP_\ba_\bc_\bk<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx > >\n-793 {\n-_\b7_\b9_\b4 enum { _\bv_\ba_\bl_\bu_\be = true };\n-795 };\n-796\n-_\b7_\b9_\b7 struct _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br {\n-798\n-_\b7_\b9_\b9 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::\n-false_type{};\n-800 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk, typename Dune::\n-TypeListElement<1,TL>::type>\n-803 && std::is_same_v, typename Dune::\n-TypeListElement<2,TL>::type>\n-804 >> : std::true_type {};\n-805\n-806 template\n-807 std::shared_ptr,Impl::\n-UMFPackRangeType>>\n-_\b8_\b0_\b8 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& _\bm_\ba_\bt, const Dune::ParameterTree& config,\n-809 std::enable_if_t<_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\bT_\bL_\b,_\b _\bM_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be,int> = 0) const\n-810 {\n-811 int verbose = config.get(\"verbose\", 0);\n-812 return std::make_shared>(_\bm_\ba_\bt,verbose);\n-813 }\n-814\n-815 // second version with SFINAE to validate the template parameters of\n-UMFPack\n-816 template\n-817 std::shared_ptr::type,\n-818 typename Dune::TypeListElement<2, TL>::type>>\n-_\b8_\b1_\b9 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /\n-*config*/,\n-820 std::enable_if_t_\b:_\b:_\bv_\ba_\bl_\bu_\be,int> = 0) const\n-821 {\n-822 using D = typename Dune::TypeListElement<1,TL>::type;\n-823 using R = typename Dune::TypeListElement<2,TL>::type;\n-824 using DU = Std::detected_t< Impl::UMFPackDomainType, M>;\n-825 using RU = Std::detected_t< Impl::UMFPackRangeType, M>;\n-826 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be,\n-827 \"Unsupported Types in UMFPack:\\n\"\n-828 \"Matrix: \" << className() << \"\"\n-829 \"Domain provided: \" << className() << \"\\n\"\n-830 \"Domain required: \" << className() << \"\\n\"\n-831 \"Range provided: \" << className() << \"\\n\"\n-832 \"Range required: \" << className() << \"\\n\"\n-833 );\n-834 }\n-835 };\n-_\b8_\b3_\b6 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"umfpack\",_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br());\n-837} // end namespace Dune\n-838\n-839#endif // HAVE_SUITESPARSE_UMFPACK\n-840\n-841#endif //DUNE_ISTL_UMFPACK_HH\n-_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR\n-#define DUNE_REGISTER_DIRECT_SOLVER(name,...)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:13\n-_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implementation of the BCRSMatrix class.\n-_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n-Implementations of the inverse operator interface.\n-_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh\n-_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh\n-_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh\n-_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n-Templates characterizing the type of a solver.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bf_\br_\be_\be\n-void free()\n-free allocated space.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:709\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-std::shared_ptr< Dune::InverseOperator< Impl::UMFPackDomainType< M >, Impl::\n-UMFPackRangeType< M > > > operator()(TL, const M &mat, const Dune::\n-ParameterTree &config, std::enable_if_t< isValidBlock< TL, M >::value, int >=0)\n-const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:808\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)\n-Apply inverse operator,.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:403\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-SuiteSparse_long size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:262\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc\n-static void symbolic(size_type m, size_type n, const size_type *cs, const\n-size_type *ri, const double *val, A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:166\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be\n-static void solve(size_type m, const size_type *cs, const size_type *ri, std::\n-complex< double > *val, double *x, const double *b, A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:160\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the solver (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:277\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:266\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bn_\bu_\bm_\be_\br_\bi_\bc\n-static void numeric(const size_type *cs, const size_type *ri, const double\n-*val, A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:140\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\bp_\bo_\br_\bt_\b__\bi_\bn_\bf_\bo\n-static void report_info(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:145\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n-UMFPack(const Matrix &mat_, const ParameterTree &config)\n-Construct a solver object from a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:327\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bl_\bo_\ba_\bd_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n-static int load_numeric(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:135\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bl_\bo_\ba_\bd_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n-static int load_numeric(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\br_\be_\bp_\bo_\br_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs\n-static void report_status(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:92\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n-UMFPack(const Matrix &mat_, const char *file, int verbose=0)\n-Try loading a decomposition from file and do a decomposition if unsuccessful.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:351\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Impl::UMFPackRangeType< M > range_type\n-The type of the range of the solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:274\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n-UMFPack()\n-default constructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:333\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc\n-static void symbolic(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\br_\be_\bp_\bo_\br_\bt_\b__\bi_\bn_\bf_\bo\n-static void report_info(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bf_\br_\be_\be_\b__\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc\n-static void free_symbolic(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bs_\ba_\bv_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n-static int save_numeric(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bf_\br_\be_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n-static void free_numeric(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n-void setSubMatrix(const Matrix &_mat, const S &rowIndexSet)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:651\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bs_\ba_\bv_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n-static int save_numeric(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:97\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\bp_\bo_\br_\bt_\b__\bs_\bt_\ba_\bt_\bu_\bs\n-static void report_status(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-Impl::UMFPackDomainType< M > domain_type\n-The type of the domain of the solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:272\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(T *x, T *b)\n-additional apply method with c-arrays in analogy to superlu\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs\n-static void defaults(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bf_\br_\be_\be_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n-static void free_numeric(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by\n-void setVerbosity(int v)\n-sets the verbosity level for the UMFPack solver\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:675\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n-UMFPack(const char *file, int verbose=0)\n-try loading a decomposition from file\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:378\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bn_\bu_\bm_\be_\br_\bi_\bc\n-static void numeric(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b:_\b:_\bv_\ba_\bl_\bi_\bd\n-static constexpr bool valid\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\b~_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n-virtual ~UMFPack()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:394\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bn_\ba_\bm_\be\n-const char * name()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:720\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-void setMatrix(const Matrix &matrix, const BitVector &bitVector={})\n-Initialize data from given matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:520\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\ba_\bv_\be_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-void saveDecomposition(const char *file)\n-saves a decomposition to a file\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:503\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n-UMFPackMatrix & getInternalMatrix()\n-Return the column compress matrix from UMFPack.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:700\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-SuiteSparse_long size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:117\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n-UMFPack(const Matrix &matrix, int verbose=0)\n-Construct a solver object from a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:290\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-ISTL::Impl::BCCSMatrixInitializer< M, size_type > MatrixInitializer\n-Type of an associated initializer class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:270\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(domain_type &x, range_type &b, double reduction,\n-InverseOperatorResult &res)\n-apply inverse operator, with given convergence criteria.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:454\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx\n-ISTL::Impl::BCCSMatrix< typename Matrix::field_type, size_type > UMFPackMatrix\n-The corresponding (scalar) UMFPack matrix type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:268\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bs_\be_\bt_\bO_\bp_\bt_\bi_\bo_\bn\n-void setOption(unsigned int option, double value)\n-Set UMFPack-specific options.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:492\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bf_\br_\be_\be_\b__\bs_\by_\bm_\bb_\bo_\bl_\bi_\bc\n-static void free_symbolic(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:130\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-M Matrix\n-The matrix type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:265\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs\n-static void defaults(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:62\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be\n-static void solve(A... args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:102\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n-UMFPack(const Matrix &matrix, int verbose, bool)\n-Constructor for compatibility with SuperLU standard constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:308\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b:_\b:_\bg_\be_\bt_\bF_\ba_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn\n-void * getFactorization()\n-Return the matrix factorization.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:691\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n-_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n-_\bs_\bt_\bd\n-STL namespace.\n+527} // end namespace Imp\n+528\n+529} // end namespace\n+530\n+531#endif\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh\n-std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f,\n-std::size_t rowOffset=0, std::size_t colOffset=0)\n-Traverse a blocked matrix and call a functor at each scalar entry.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh\n-std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0)\n-Traverse a blocked vector and call a functor at each scalar entry.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-derive error class from the base class in common\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n-Sequential overlapping Schwarz preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-Statistics about the application of an inverse operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\be_\bl_\ba_\bp_\bs_\be_\bd\n-double elapsed\n-Elapsed time in seconds.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n-int iterations\n-Number of iterations.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n-bool converged\n-True if convergence criterion has been met.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Abstract base class for all solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-@ value\n-Whether this is a direct solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-@ value\n-whether the solver internally uses column compressed storage\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n-The UMFPack direct sparse solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:258\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:797\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:799\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00047.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00047.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrix.hh File Reference\n+dune-istl: superlu.hh File Reference\n \n \n \n \n \n \n \n@@ -71,59 +71,81 @@\n \n
    \n \n
    \n \n-
    matrix.hh File Reference
    \n+Namespaces |\n+Functions
    \n+ \n \n
    \n \n-

    A dynamic dense block matrix class. \n+

    Classes for using SuperLU with ISTL matrices. \n More...

    \n-
    #include <cmath>
    \n-#include <memory>
    \n-#include <dune/common/ftraits.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/scalarvectorview.hh>
    \n-#include <dune/common/scalarmatrixview.hh>
    \n-#include <dune/istl/bvector.hh>
    \n-#include <dune/istl/istlexception.hh>
    \n-#include <dune/istl/blocklevel.hh>
    \n+
    #include "superlufunctions.hh"
    \n+#include "solvers.hh"
    \n+#include "supermatrix.hh"
    \n+#include <algorithm>
    \n+#include <functional>
    \n+#include "bcrsmatrix.hh"
    \n+#include "bvector.hh"
    \n+#include "istlexception.hh"
    \n+#include <dune/common/fmatrix.hh>
    \n+#include <dune/common/fvector.hh>
    \n+#include <dune/common/stdstreams.hh>
    \n+#include <dune/istl/solvertype.hh>
    \n+#include <dune/istl/solverfactory.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::MatrixImp::DenseMatrixBase< B, A >
     A Vector of blocks with different blocksizes. More...
    struct  Dune::SuperLUSolveChooser< T >
     
    class  Dune::MatrixImp::DenseMatrixBase< B, A >::Iterator
     Iterator class for sequential access. More...
    struct  Dune::SuperLUDenseMatChooser< T >
     
    class  Dune::MatrixImp::DenseMatrixBase< B, A >::ConstIterator
     ConstIterator class for sequential access. More...
    struct  Dune::SuperLUQueryChooser< T >
     
    class  Dune::Matrix< T, A >
     A generic dynamic dense matrix. More...
    struct  Dune::QuerySpaceChooser< T >
     
    struct  Dune::FieldTraits< Matrix< T, A > >
    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 > >
     
    \n \n \n \n-\n-\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::MatrixImp
     
    \n+\n+\n+\n

    \n+Functions

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

    Detailed Description

    \n-

    A dynamic dense block matrix class.

    \n+

    Classes for using SuperLU with ISTL matrices.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,43 +1,65 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-matrix.hh File Reference\n-A dynamic dense block matrix class. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+superlu.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b)\n+Classes for using SuperLU with ISTL matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\n+#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n+#include \"_\bs_\bu_\bp_\be_\br_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+#include \n+#include \n+#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n-\u00a0 A Vector of blocks with different blocksizes. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-\u00a0 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br class for sequential access. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-\u00a0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br class for sequential access. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bQ_\bu_\be_\br_\by_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n-\u00a0 A generic dynamic dense matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bQ_\bu_\be_\br_\by_\bS_\bp_\ba_\bc_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\b _\bM_\b _\b>\n+\u00a0 SuperLu Solver. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\b _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b,_\b _\bk_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<\n+ _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b,_\b _\bk_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"superlu\", _\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br())\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-A dynamic dense block matrix class.\n+Classes for using SuperLU with ISTL matrices.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00047_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00047_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrix.hh Source File\n+dune-istl: superlu.hh Source File\n \n \n \n \n \n \n \n@@ -74,1254 +74,833 @@\n \n
    \n \n
    \n
    \n
    \n-
    matrix.hh
    \n+
    superlu.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_MATRIX_HH
    \n-
    6#define DUNE_ISTL_MATRIX_HH
    \n+
    5#ifndef DUNE_ISTL_SUPERLU_HH
    \n+
    6#define DUNE_ISTL_SUPERLU_HH
    \n
    7
    \n-
    12#include <cmath>
    \n-
    13#include <memory>
    \n-
    14
    \n-
    15#include <dune/common/ftraits.hh>
    \n-
    16#include <dune/common/typetraits.hh>
    \n-
    17#include <dune/common/scalarvectorview.hh>
    \n-
    18#include <dune/common/scalarmatrixview.hh>
    \n-
    19
    \n-
    20#include <dune/istl/bvector.hh>
    \n-\n-\n+
    8#if HAVE_SUPERLU
    \n+
    9
    \n+
    10#include "superlufunctions.hh"
    \n+
    11#include "solvers.hh"
    \n+
    12#include "supermatrix.hh"
    \n+
    13#include <algorithm>
    \n+
    14#include <functional>
    \n+
    15#include "bcrsmatrix.hh"
    \n+
    16#include "bvector.hh"
    \n+
    17#include "istlexception.hh"
    \n+
    18#include <dune/common/fmatrix.hh>
    \n+
    19#include <dune/common/fvector.hh>
    \n+
    20#include <dune/common/stdstreams.hh>
    \n+\n+\n
    23
    \n-
    24namespace Dune {
    \n-
    25
    \n-
    \n-
    26namespace MatrixImp
    \n-
    27{
    \n-
    39 template<class B, class A=std::allocator<B> >
    \n-
    \n-
    40 class DenseMatrixBase : public Imp::block_vector_unmanaged<B,typename A::size_type>
    \n-
    41 // this derivation gives us all the blas level 1 and norms
    \n-
    42 // on the large array. However, access operators have to be
    \n-
    43 // overwritten.
    \n-
    44 {
    \n-
    45 public:
    \n+
    24namespace Dune
    \n+
    25{
    \n+
    26
    \n+
    37 template<class M, class T, class TM, class TD, class TA>
    \n+
    38 class SeqOverlappingSchwarz;
    \n+
    39
    \n+
    40 template<class T, bool tag>
    \n+
    41 struct SeqOverlappingSchwarzAssemblerHelper;
    \n+
    42
    \n+
    43 template<class T>
    \n+
    \n+\n+
    45 {};
    \n+
    \n
    46
    \n-
    47 //===== type definitions and constants
    \n-
    48
    \n-
    50 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n-
    51
    \n-
    53 typedef A allocator_type;
    \n+
    47 template<class T>
    \n+
    \n+\n+
    49 {};
    \n+
    \n+
    50
    \n+
    51 template<class T>
    \n+
    \n+\n+
    53 {};
    \n+
    \n
    54
    \n-
    56 typedef typename A::size_type size_type;
    \n-
    57
    \n-\n-
    64
    \n-\n-
    68
    \n-
    69 // just a shorthand
    \n-
    70 typedef Imp::BlockVectorWindow<B,A> window_type;
    \n-
    71
    \n-\n-
    73
    \n-\n-
    75
    \n-
    76
    \n-
    77 //===== constructors and such
    \n-
    78
    \n-
    \n-
    82 DenseMatrixBase () : Imp::block_vector_unmanaged<B,size_type>()
    \n-
    83 {
    \n-
    84 // nothing is known ...
    \n-
    85 rows_ = 0;
    \n-
    86 columns_ = 0;
    \n+
    55 template<class T>
    \n+
    \n+\n+
    57 {};
    \n+
    \n+
    58
    \n+
    59#if __has_include("slu_sdefs.h")
    \n+
    60 template<>
    \n+
    61 struct SuperLUDenseMatChooser<float>
    \n+
    62 {
    \n+
    63 static void create(SuperMatrix *mat, int n, int m, float *dat, int n1,
    \n+
    64 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n+
    65 {
    \n+
    66 sCreate_Dense_Matrix(mat, n, m, dat, n1, stype, dtype, mtype);
    \n+
    67
    \n+
    68 }
    \n+
    69
    \n+
    70 static void destroy(SuperMatrix*)
    \n+
    71 {}
    \n+
    72
    \n+
    73 };
    \n+
    74 template<>
    \n+
    75 struct SuperLUSolveChooser<float>
    \n+
    76 {
    \n+
    77 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
    \n+
    78 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,
    \n+
    79 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
    \n+
    80 float *rpg, float *rcond, float *ferr, float *berr,
    \n+
    81 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
    \n+
    82 {
    \n+
    83 GlobalLU_t gLU;
    \n+
    84 sgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
    \n+
    85 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
    \n+
    86 &gLU, memusage, stat, info);
    \n
    87 }
    \n-
    \n-
    88
    \n-
    \n-
    95 DenseMatrixBase (size_type rows, size_type columns) : Imp::block_vector_unmanaged<B,size_type>()
    \n-
    96 {
    \n-
    97 // and we can allocate the big array in the base class
    \n-
    98 this->n = rows*columns;
    \n-
    99 columns_ = columns;
    \n-
    100 if (this->n>0)
    \n-
    101 {
    \n-
    102 this->p = allocator_.allocate(this->n);
    \n-
    103 new (this->p)B[this->n];
    \n-
    104 }
    \n-
    105 else
    \n-
    106 {
    \n-
    107 this->n = 0;
    \n-
    108 this->p = 0;
    \n-
    109 }
    \n+
    88 };
    \n+
    89
    \n+
    90 template<>
    \n+
    91 struct QuerySpaceChooser<float>
    \n+
    92 {
    \n+
    93 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
    \n+
    94 {
    \n+
    95 sQuerySpace(L,U,memusage);
    \n+
    96 }
    \n+
    97 };
    \n+
    98
    \n+
    99#endif
    \n+
    100
    \n+
    101#if __has_include("slu_ddefs.h")
    \n+
    102
    \n+
    103 template<>
    \n+
    104 struct SuperLUDenseMatChooser<double>
    \n+
    105 {
    \n+
    106 static void create(SuperMatrix *mat, int n, int m, double *dat, int n1,
    \n+
    107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n+
    108 {
    \n+
    109 dCreate_Dense_Matrix(mat, n, m, dat, n1, stype, dtype, mtype);
    \n
    110
    \n-
    111 // we can allocate the windows now
    \n-
    112 rows_ = rows;
    \n-
    113 }
    \n-
    \n-
    114
    \n-
    \n-\n-
    117 {
    \n-
    118 // allocate the big array in the base class
    \n-
    119 this->n = a.n;
    \n-
    120 columns_ = a.columns_;
    \n-
    121 if (this->n>0)
    \n-
    122 {
    \n-
    123 // allocate and construct objects
    \n-
    124 this->p = allocator_.allocate(this->n);
    \n-
    125 new (this->p)B[this->n];
    \n-
    126
    \n-
    127 // copy data
    \n-
    128 for (size_type i=0; i<this->n; i++)
    \n-
    129 this->p[i]=a.p[i];
    \n-
    130 }
    \n-
    131 else
    \n-
    132 {
    \n-
    133 this->n = 0;
    \n-
    134 this->p = nullptr;
    \n-
    135 }
    \n-
    136
    \n-
    137 // we can allocate the windows now
    \n-
    138 rows_ = a.rows_;
    \n-
    139 }
    \n-
    \n-
    140
    \n-
    \n-\n-
    143 {
    \n-
    144 if (this->n>0) {
    \n-
    145 size_type i=this->n;
    \n-
    146 while (i)
    \n-
    147 this->p[--i].~B();
    \n-
    148 allocator_.deallocate(this->p,this->n);
    \n-
    149 }
    \n-
    150 }
    \n-
    \n-
    151
    \n-
    \n-
    153 void resize (size_type rows, size_type columns)
    \n-
    154 {
    \n-
    155 // deconstruct objects and deallocate memory if necessary
    \n-
    156 if (this->n>0) {
    \n-
    157 size_type i=this->n;
    \n-
    158 while (i)
    \n-
    159 this->p[--i].~B();
    \n-
    160 allocator_.deallocate(this->p,this->n);
    \n-
    161 }
    \n-
    162
    \n-
    163 // and we can allocate the big array in the base class
    \n-
    164 this->n = rows*columns;
    \n-
    165 if (this->n>0)
    \n-
    166 {
    \n-
    167 this->p = allocator_.allocate(this->n);
    \n-
    168 new (this->p)B[this->n];
    \n-
    169 }
    \n-
    170 else
    \n-
    171 {
    \n-
    172 this->n = 0;
    \n-
    173 this->p = nullptr;
    \n-
    174 }
    \n-
    175
    \n-
    176 // we can allocate the windows now
    \n-
    177 rows_ = rows;
    \n-
    178 columns_ = columns;
    \n+
    111 }
    \n+
    112
    \n+
    113 static void destroy(SuperMatrix * /* mat */)
    \n+
    114 {}
    \n+
    115 };
    \n+
    116 template<>
    \n+
    117 struct SuperLUSolveChooser<double>
    \n+
    118 {
    \n+
    119 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
    \n+
    120 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,
    \n+
    121 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
    \n+
    122 double *rpg, double *rcond, double *ferr, double *berr,
    \n+
    123 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
    \n+
    124 {
    \n+
    125 GlobalLU_t gLU;
    \n+
    126 dgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
    \n+
    127 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
    \n+
    128 &gLU, memusage, stat, info);
    \n+
    129 }
    \n+
    130 };
    \n+
    131
    \n+
    132 template<>
    \n+
    133 struct QuerySpaceChooser<double>
    \n+
    134 {
    \n+
    135 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
    \n+
    136 {
    \n+
    137 dQuerySpace(L,U,memusage);
    \n+
    138 }
    \n+
    139 };
    \n+
    140#endif
    \n+
    141
    \n+
    142#if __has_include("slu_zdefs.h")
    \n+
    143 template<>
    \n+
    144 struct SuperLUDenseMatChooser<std::complex<double> >
    \n+
    145 {
    \n+
    146 static void create(SuperMatrix *mat, int n, int m, std::complex<double> *dat, int n1,
    \n+
    147 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n+
    148 {
    \n+
    149 zCreate_Dense_Matrix(mat, n, m, reinterpret_cast<doublecomplex*>(dat), n1, stype, dtype, mtype);
    \n+
    150
    \n+
    151 }
    \n+
    152
    \n+
    153 static void destroy(SuperMatrix*)
    \n+
    154 {}
    \n+
    155 };
    \n+
    156
    \n+
    157 template<>
    \n+
    158 struct SuperLUSolveChooser<std::complex<double> >
    \n+
    159 {
    \n+
    160 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
    \n+
    161 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,
    \n+
    162 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
    \n+
    163 double *rpg, double *rcond, double *ferr, double *berr,
    \n+
    164 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
    \n+
    165 {
    \n+
    166 GlobalLU_t gLU;
    \n+
    167 zgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
    \n+
    168 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
    \n+
    169 &gLU, memusage, stat, info);
    \n+
    170 }
    \n+
    171 };
    \n+
    172
    \n+
    173 template<>
    \n+
    174 struct QuerySpaceChooser<std::complex<double> >
    \n+
    175 {
    \n+
    176 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
    \n+
    177 {
    \n+
    178 zQuerySpace(L,U,memusage);
    \n
    179 }
    \n-
    \n-
    180
    \n-
    \n-\n-
    183 {
    \n-
    184 if (&a!=this) // check if this and a are different objects
    \n-
    185 {
    \n-
    186 columns_ = a.columns_;
    \n-
    187 // reallocate arrays if necessary
    \n-
    188 // Note: still the block sizes may vary !
    \n-
    189 if (this->n!=a.n || rows_!=a.rows_)
    \n-
    190 {
    \n-
    191 // deconstruct objects and deallocate memory if necessary
    \n-
    192 if (this->n>0) {
    \n-
    193 size_type i=this->n;
    \n-
    194 while (i)
    \n-
    195 this->p[--i].~B();
    \n-
    196 allocator_.deallocate(this->p,this->n);
    \n-
    197 }
    \n-
    198
    \n-
    199 // allocate the big array in the base class
    \n-
    200 this->n = a.n;
    \n-
    201 if (this->n>0)
    \n-
    202 {
    \n-
    203 // allocate and construct objects
    \n-
    204 this->p = allocator_.allocate(this->n);
    \n-
    205 new (this->p)B[this->n];
    \n-
    206 }
    \n-
    207 else
    \n-
    208 {
    \n-
    209 this->n = 0;
    \n-
    210 this->p = nullptr;
    \n-
    211 }
    \n-
    212
    \n-
    213 // Copy number of rows
    \n-
    214 rows_ = a.rows_;
    \n-
    215 }
    \n-
    216
    \n-
    217 // and copy the data
    \n-
    218 for (size_type i=0; i<this->n; i++)
    \n-
    219 this->p[i]=a.p[i];
    \n-
    220 }
    \n-
    221
    \n-
    222 return *this;
    \n-
    223 }
    \n-
    \n-
    224
    \n-
    225
    \n-
    226 //===== assignment from scalar
    \n-
    227
    \n-
    \n-\n-
    230 {
    \n-
    231 (static_cast<Imp::block_vector_unmanaged<B,size_type>&>(*this)) = k;
    \n-
    232 return *this;
    \n-
    233 }
    \n-
    \n-
    234
    \n-
    235
    \n-
    236 //===== access to components
    \n-
    237 // has to be overwritten from base class because it must
    \n-
    238 // return access to the windows
    \n-
    239
    \n-
    \n-\n-
    242 {
    \n-
    243#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    244 if (i>=rows_) DUNE_THROW(ISTLError,"index out of range");
    \n-
    245#endif
    \n-
    246 return window_type(this->p + i*columns_, columns_);
    \n-
    247 }
    \n-
    \n-
    248
    \n-
    \n-\n-
    251 {
    \n-
    252#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    253 if (i<0 || i>=rows_) DUNE_THROW(ISTLError,"index out of range");
    \n-
    254#endif
    \n-
    255 return window_type(this->p + i*columns_, columns_);
    \n-
    256 }
    \n-
    \n-
    257
    \n-
    258 // forward declaration
    \n-
    259 class ConstIterator;
    \n-
    260
    \n-
    \n-\n-
    263 {
    \n-
    264 public:
    \n-
    \n-\n-
    267 : window_(nullptr,0)
    \n-
    268 {
    \n-
    269 i = 0;
    \n-
    270 }
    \n-
    \n-
    271
    \n-
    272 Iterator (Iterator& other) = default;
    \n-
    273 Iterator (Iterator&& other) = default;
    \n-
    274
    \n-
    \n-
    276 Iterator (B* data, size_type columns, size_type _i)
    \n-
    277 : i(_i),
    \n-
    278 window_(data + _i*columns, columns)
    \n-
    279 {}
    \n-
    \n-
    280
    \n-
    \n-\n-
    283 {
    \n-
    284 i = other.i;
    \n-
    285 // Do NOT use window_.operator=, because that copies the window content, not just the window!
    \n-
    286 window_.set(other.window_.getsize(),other.window_.getptr());
    \n-
    287 return *this;
    \n-
    288 }
    \n-
    \n-
    289
    \n-
    \n-\n-
    292 {
    \n-
    293 i = other.i;
    \n-
    294 // Do NOT use window_.operator=, because that copies the window content, not just the window!
    \n-
    295 window_.set(other.window_.getsize(),other.window_.getptr());
    \n-
    296 return *this;
    \n-
    297 }
    \n-
    \n-
    298
    \n-
    \n-\n-
    301 {
    \n-
    302 ++i;
    \n-
    303 window_.setptr(window_.getptr()+window_.getsize());
    \n-
    304 return *this;
    \n-
    305 }
    \n-
    \n-
    306
    \n-
    \n-\n-
    309 {
    \n-
    310 --i;
    \n-
    311 window_.setptr(window_.getptr()-window_.getsize());
    \n-
    312 return *this;
    \n-
    313 }
    \n-
    \n-
    314
    \n-
    \n-
    316 bool operator== (const Iterator& it) const
    \n-
    317 {
    \n-
    318 return window_.getptr() == it.window_.getptr();
    \n-
    319 }
    \n-
    \n-
    320
    \n-
    \n-
    322 bool operator!= (const Iterator& it) const
    \n-
    323 {
    \n-
    324 return window_.getptr() != it.window_.getptr();
    \n-
    325 }
    \n-
    \n-
    326
    \n-
    \n-
    328 bool operator== (const ConstIterator& it) const
    \n-
    329 {
    \n-
    330 return window_.getptr() == it.window_.getptr();
    \n-
    331 }
    \n-
    \n-
    332
    \n-
    \n-
    334 bool operator!= (const ConstIterator& it) const
    \n-
    335 {
    \n-
    336 return window_.getptr() != it.window_.getptr();
    \n-
    337 }
    \n-
    \n+
    180 };
    \n+
    181#endif
    \n+
    182
    \n+
    183#if __has_include("slu_cdefs.h")
    \n+
    184 template<>
    \n+
    185 struct SuperLUDenseMatChooser<std::complex<float> >
    \n+
    186 {
    \n+
    187 static void create(SuperMatrix *mat, int n, int m, std::complex<float> *dat, int n1,
    \n+
    188 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n+
    189 {
    \n+
    190 cCreate_Dense_Matrix(mat, n, m, reinterpret_cast< ::complex*>(dat), n1, stype, dtype, mtype);
    \n+
    191
    \n+
    192 }
    \n+
    193
    \n+
    194 static void destroy(SuperMatrix* /* mat */)
    \n+
    195 {}
    \n+
    196 };
    \n+
    197
    \n+
    198 template<>
    \n+
    199 struct SuperLUSolveChooser<std::complex<float> >
    \n+
    200 {
    \n+
    201 static void solve(superlu_options_t *options, SuperMatrix *mat, int *perm_c, int *perm_r, int *etree,
    \n+
    202 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,
    \n+
    203 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,
    \n+
    204 float *rpg, float *rcond, float *ferr, float *berr,
    \n+
    205 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)
    \n+
    206 {
    \n+
    207 GlobalLU_t gLU;
    \n+
    208 cgssvx(options, mat, perm_c, perm_r, etree, equed, R, C,
    \n+
    209 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,
    \n+
    210 &gLU, memusage, stat, info);
    \n+
    211 }
    \n+
    212 };
    \n+
    213
    \n+
    214 template<>
    \n+
    215 struct QuerySpaceChooser<std::complex<float> >
    \n+
    216 {
    \n+
    217 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t* memusage)
    \n+
    218 {
    \n+
    219 cQuerySpace(L,U,memusage);
    \n+
    220 }
    \n+
    221 };
    \n+
    222#endif
    \n+
    223
    \n+
    224 namespace Impl
    \n+
    225 {
    \n+
    226 template<class M>
    \n+
    227 struct SuperLUVectorChooser
    \n+
    228 {};
    \n+
    229
    \n+
    230 template<typename T, typename A, int n, int m>
    \n+
    231 struct SuperLUVectorChooser<BCRSMatrix<FieldMatrix<T,n,m>,A > >
    \n+
    232 {
    \n+
    234 using domain_type = BlockVector<
    \n+
    235 FieldVector<T,m>,
    \n+
    236 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > >;
    \n+
    238 using range_type = BlockVector<
    \n+
    239 FieldVector<T,n>,
    \n+
    240 typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > >;
    \n+
    241 };
    \n+
    242
    \n+
    243 template<typename T, typename A>
    \n+
    244 struct SuperLUVectorChooser<BCRSMatrix<T,A> >
    \n+
    245 {
    \n+
    247 using domain_type = BlockVector<T, A>;
    \n+
    249 using range_type = BlockVector<T, A>;
    \n+
    250 };
    \n+
    251 }
    \n+
    252
    \n+
    266 template<typename M>
    \n+
    \n+\n+
    268 : public InverseOperator<
    \n+
    269 typename Impl::SuperLUVectorChooser<M>::domain_type,
    \n+
    270 typename Impl::SuperLUVectorChooser<M>::range_type >
    \n+
    271 {
    \n+
    272 using T = typename M::field_type;
    \n+
    273 public:
    \n+
    275 using Matrix = M;
    \n+
    276 using matrix_type = M;
    \n+\n+\n+
    282 using domain_type = typename Impl::SuperLUVectorChooser<M>::domain_type;
    \n+
    284 using range_type = typename Impl::SuperLUVectorChooser<M>::range_type;
    \n+
    285
    \n+
    \n+\n+
    288 {
    \n+\n+
    290 }
    \n+
    \n+
    291
    \n+
    306 explicit SuperLU(const Matrix& mat, bool verbose=false,
    \n+
    307 bool reusevector=true);
    \n+
    308
    \n+
    309
    \n+
    \n+
    320 SuperLU(const Matrix& mat, const ParameterTree& config)
    \n+
    321 : SuperLU(mat, config.get<bool>("verbose", false), config.get<bool>("reuseVector", true))
    \n+
    322 {}
    \n+
    \n+
    323
    \n+
    330 SuperLU();
    \n+
    331
    \n+
    332 ~SuperLU();
    \n+
    333
    \n+\n
    338
    \n-
    \n-\n-
    341 {
    \n-
    342 return window_;
    \n-
    343 }
    \n-
    \n-
    344
    \n-
    \n-\n-
    347 {
    \n-
    348 return &window_;
    \n-
    349 }
    \n-
    \n-
    350
    \n-
    351 // return index corresponding to pointer
    \n-
    \n-\n-
    353 {
    \n-
    354 return i;
    \n-
    355 }
    \n-
    \n-
    356
    \n-
    357 friend class ConstIterator;
    \n-
    358
    \n-
    359 private:
    \n-
    360 size_type i;
    \n-
    361 mutable window_type window_;
    \n-
    362 };
    \n-
    \n-
    363
    \n-
    \n-\n-
    366 {
    \n-
    367 return Iterator(this->p, columns_, 0);
    \n-
    368 }
    \n-
    \n-
    369
    \n-
    \n-\n-
    372 {
    \n-
    373 return Iterator(this->p, columns_, rows_);
    \n-
    374 }
    \n-
    \n-
    375
    \n-
    \n-\n-
    379 {
    \n-
    380 return Iterator(this->p, columns_, rows_-1);
    \n-
    381 }
    \n-
    \n-
    382
    \n-
    \n-\n-
    386 {
    \n-
    387 return Iterator(this->p, columns_, -1);
    \n-
    388 }
    \n-
    \n-
    389
    \n-
    \n-\n-
    392 {
    \n-
    393 return Iterator(this->p, columns_, std::min(i,rows_));
    \n-
    394 }
    \n-
    \n-
    395
    \n-
    \n-\n-
    398 {
    \n-
    399 return ConstIterator(this->p, columns_, std::min(i,rows_));
    \n-
    400 }
    \n+
    \n+
    342 void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
    \n+
    343 {
    \n+
    344 apply(x,b,res);
    \n+
    345 }
    \n+
    \n+
    346
    \n+
    350 void apply(T* x, T* b);
    \n+
    351
    \n+
    353 void setMatrix(const Matrix& mat);
    \n+
    354
    \n+
    \n+
    355 typename SuperLUMatrix::size_type nnz() const
    \n+
    356 {
    \n+
    357 return mat.nonzeroes();
    \n+
    358 }
    \n+
    \n+
    359
    \n+
    360 template<class S>
    \n+
    361 void setSubMatrix(const Matrix& mat, const S& rowIndexSet);
    \n+
    362
    \n+
    363 void setVerbosity(bool v);
    \n+
    364
    \n+
    369 void free();
    \n+
    370
    \n+
    371 const char* name() { return "SuperLU"; }
    \n+
    372 private:
    \n+
    373 template<class Mat,class X, class TM, class TD, class T1>
    \n+\n+\n+
    376
    \n+
    377 SuperLUMatrix& getInternalMatrix() { return mat; }
    \n+
    378
    \n+
    380 void decompose();
    \n+
    381
    \n+\n+
    383 SuperMatrix L, U, B, X;
    \n+
    384 int *perm_c, *perm_r, *etree;
    \n+
    385 typename GetSuperLUType<T>::float_type *R, *C;
    \n+
    386 T *bstore;
    \n+
    387 superlu_options_t options;
    \n+
    388 char equed;
    \n+
    389 void *work;
    \n+
    390 int lwork;
    \n+
    391 bool first, verbose, reusevector;
    \n+
    392 };
    \n+
    \n+
    393
    \n+
    394 template<typename M>
    \n+
    395 SuperLU<M>
    \n+
    \n+
    396 ::~SuperLU()
    \n+
    397 {
    \n+
    398 if(mat.N()+mat.M()>0)
    \n+
    399 free();
    \n+
    400 }
    \n
    \n
    401
    \n-
    \n-\n-
    404 {
    \n-
    405 public:
    \n-
    \n-\n-
    408 : window_(nullptr,0)
    \n-
    409 {
    \n-
    410 i = 0;
    \n-
    411 }
    \n-
    \n-
    412
    \n-
    \n-
    414 ConstIterator (const B* data, size_type columns, size_type _i)
    \n-
    415 : i(_i),
    \n-
    416 window_(const_cast<B*>(data + _i * columns), columns)
    \n-
    417 {}
    \n-
    \n-
    418
    \n-
    \n-\n-
    421 : i(it.i), window_(it.window_.getptr(),it.window_.getsize())
    \n-
    422 {}
    \n-
    \n-
    423
    \n+
    402 template<typename M>
    \n+
    \n+\n+
    404 {
    \n+
    405 delete[] perm_c;
    \n+
    406 delete[] perm_r;
    \n+
    407 delete[] etree;
    \n+
    408 delete[] R;
    \n+
    409 delete[] C;
    \n+
    410 if(lwork>=0) {
    \n+
    411 Destroy_SuperNode_Matrix(&L);
    \n+
    412 Destroy_CompCol_Matrix(&U);
    \n+
    413 }
    \n+
    414 lwork=0;
    \n+
    415 if(!first && reusevector) {
    \n+
    416 SUPERLU_FREE(B.Store);
    \n+
    417 SUPERLU_FREE(X.Store);
    \n+
    418 }
    \n+
    419 mat.free();
    \n+
    420 }
    \n+
    \n+
    421
    \n+
    422 template<typename M>
    \n+\n
    \n-\n-
    425 {
    \n-
    426 i = other.i;
    \n-
    427 // Do NOT use window_.operator=, because that copies the window content, not just the window!
    \n-
    428 window_.set(other.window_.getsize(),other.window_.getptr());
    \n-
    429 return *this;
    \n-
    430 }
    \n+
    424 ::SuperLU(const Matrix& mat_, bool verbose_, bool reusevector_)
    \n+
    425 : work(0), lwork(0), first(true), verbose(verbose_),
    \n+
    426 reusevector(reusevector_)
    \n+
    427 {
    \n+
    428 setMatrix(mat_);
    \n+
    429
    \n+
    430 }
    \n
    \n-
    431
    \n+
    431 template<typename M>
    \n
    \n-\n-
    433 {
    \n-
    434 i = other.i;
    \n-
    435 // Do NOT use window_.operator=, because that copies the window content, not just the window!
    \n-
    436 window_.set(other.window_.getsize(),other.window_.getptr());
    \n-
    437 return *this;
    \n-
    438 }
    \n-
    \n-
    439
    \n-
    \n-\n-
    442 {
    \n-
    443 ++i;
    \n-
    444 window_.setptr(window_.getptr()+window_.getsize());
    \n-
    445 return *this;
    \n-
    446 }
    \n-
    \n-
    447
    \n-
    \n-\n-
    450 {
    \n-
    451 --i;
    \n-
    452 window_.setptr(window_.getptr()-window_.getsize());
    \n-
    453 return *this;
    \n-
    454 }
    \n-
    \n-
    455
    \n+\n+
    433 : work(0), lwork(0),verbose(false),
    \n+
    434 reusevector(false)
    \n+
    435 {}
    \n+
    \n+
    436 template<typename M>
    \n+
    \n+\n+
    438 {
    \n+
    439 verbose=v;
    \n+
    440 }
    \n+
    \n+
    441
    \n+
    442 template<typename M>
    \n+
    \n+\n+
    444 {
    \n+
    445 if(mat.N()+mat.M()>0) {
    \n+
    446 free();
    \n+
    447 }
    \n+
    448 lwork=0;
    \n+
    449 work=0;
    \n+
    450 //a=&mat_;
    \n+
    451 mat=mat_;
    \n+
    452 decompose();
    \n+
    453 }
    \n+
    \n+
    454
    \n+
    455 template<typename M>
    \n+
    456 template<class S>
    \n
    \n-
    457 bool operator== (const ConstIterator& it) const
    \n-
    458 {
    \n-
    459 return window_.getptr() == it.window_.getptr();
    \n-
    460 }
    \n-
    \n-
    461
    \n-
    \n-
    463 bool operator!= (const ConstIterator& it) const
    \n-
    464 {
    \n-
    465 return window_.getptr() != it.window_.getptr();
    \n-
    466 }
    \n-
    \n-
    467
    \n-
    \n-
    469 bool operator== (const Iterator& it) const
    \n-
    470 {
    \n-
    471 return window_.getptr() == it.window_.getptr();
    \n-
    472 }
    \n-
    \n+\n+
    458 const S& mrs)
    \n+
    459 {
    \n+
    460 if(mat.N()+mat.M()>0) {
    \n+
    461 free();
    \n+
    462 }
    \n+
    463 lwork=0;
    \n+
    464 work=0;
    \n+
    465 //a=&mat_;
    \n+
    466 mat.setMatrix(mat_,mrs);
    \n+
    467 decompose();
    \n+
    468 }
    \n+
    \n+
    469
    \n+
    470 template<typename M>
    \n+\n+
    472 {
    \n
    473
    \n-
    \n-
    475 bool operator!= (const Iterator& it) const
    \n-
    476 {
    \n-
    477 return window_.getptr() != it.window_.getptr();
    \n-
    478 }
    \n-
    \n-
    479
    \n-
    \n-
    481 const window_type& operator* () const
    \n-
    482 {
    \n-
    483 return window_;
    \n-
    484 }
    \n-
    \n-
    485
    \n-
    \n-\n-
    488 {
    \n-
    489 return &window_;
    \n-
    490 }
    \n-
    \n-
    491
    \n-
    492 // return index corresponding to pointer
    \n-
    \n-\n-
    494 {
    \n-
    495 return i;
    \n-
    496 }
    \n-
    \n-
    497
    \n-
    498 friend class Iterator;
    \n-
    499
    \n-
    500 private:
    \n-
    501 size_type i;
    \n-
    502 mutable window_type window_;
    \n-
    503 };
    \n-
    \n-
    504
    \n-\n-
    507
    \n-\n+
    474 first = true;
    \n+
    475 perm_c = new int[mat.M()];
    \n+
    476 perm_r = new int[mat.N()];
    \n+
    477 etree = new int[mat.M()];
    \n+
    478 R = new typename GetSuperLUType<T>::float_type[mat.N()];
    \n+
    479 C = new typename GetSuperLUType<T>::float_type[mat.M()];
    \n+
    480
    \n+
    481 set_default_options(&options);
    \n+
    482 // Do the factorization
    \n+
    483 B.ncol=0;
    \n+
    484 B.Stype=SLU_DN;
    \n+\n+
    486 B.Mtype= SLU_GE;
    \n+
    487 DNformat fakeFormat;
    \n+
    488 fakeFormat.lda=mat.N();
    \n+
    489 B.Store=&fakeFormat;
    \n+
    490 X.Stype=SLU_DN;
    \n+\n+
    492 X.Mtype= SLU_GE;
    \n+
    493 X.ncol=0;
    \n+
    494 X.Store=&fakeFormat;
    \n+
    495
    \n+
    496 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr=1e10;
    \n+
    497 int info;
    \n+
    498 mem_usage_t memusage;
    \n+
    499 SuperLUStat_t stat;
    \n+
    500
    \n+
    501 StatInit(&stat);
    \n+
    502 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
    \n+
    503 &L, &U, work, lwork, &B, &X, &rpg, &rcond, &ferr,
    \n+
    504 &berr, &memusage, &stat, &info);
    \n+
    505
    \n+
    506 if(verbose) {
    \n+
    507 dinfo<<"LU factorization: dgssvx() returns info "<< info<<std::endl;
    \n+
    508
    \n+
    509 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
    \n
    510
    \n-
    \n-\n-
    513 {
    \n-
    514 return ConstIterator(this->p, columns_, 0);
    \n-
    515 }
    \n-
    \n-
    516
    \n-
    \n-\n-
    519 {
    \n-
    520 return ConstIterator(this->p, columns_, rows_);
    \n-
    521 }
    \n-
    \n-
    522
    \n-
    \n-\n-
    526 {
    \n-
    527 return ConstIterator(this->p, columns_, rows_-1);
    \n-
    528 }
    \n-
    \n-
    529
    \n-
    \n-\n-
    532 {
    \n-
    533 return ConstIterator(this->p, columns_, -1);
    \n-
    534 }
    \n-
    \n-
    535
    \n-
    536 //===== sizes
    \n-
    537
    \n-
    \n-
    539 size_type N () const
    \n-
    540 {
    \n-
    541 return rows_;
    \n-
    542 }
    \n-
    \n-
    543
    \n-
    544
    \n-
    545 private:
    \n-
    546 size_type rows_; // number of matrix rows
    \n-
    547 size_type columns_; // number of matrix columns
    \n-
    548
    \n-
    549 A allocator_;
    \n-
    550 };
    \n-
    \n-
    551
    \n-
    552} // namespace MatrixImp
    \n-
    \n-
    553
    \n-
    559 template<class T, class A=std::allocator<T> >
    \n-
    \n-
    560 class Matrix
    \n-
    561 {
    \n-
    562 public:
    \n-
    563
    \n-
    565 using field_type = typename Imp::BlockTraits<T>::field_type;
    \n-
    566
    \n-
    568 typedef T block_type;
    \n-
    569
    \n-
    571 typedef A allocator_type;
    \n-
    572
    \n-\n-
    575
    \n-
    577 typedef typename A::size_type size_type;
    \n-
    578
    \n-\n-
    581
    \n-
    583 typedef typename row_type::iterator ColIterator;
    \n-
    584
    \n-\n-
    587
    \n-
    589 typedef typename row_type::const_iterator ConstColIterator;
    \n-
    590
    \n-
    \n-
    592 Matrix() : data_(0,0), cols_(0)
    \n-
    593 {}
    \n-
    \n-
    594
    \n-
    \n-
    597 Matrix(size_type rows, size_type cols) : data_(rows,cols), cols_(cols)
    \n-
    598 {}
    \n-
    \n-
    599
    \n-
    \n-
    604 void setSize(size_type rows, size_type cols) {
    \n-
    605 data_.resize(rows,cols);
    \n-
    606 cols_ = cols;
    \n-
    607 }
    \n-
    \n-
    608
    \n-
    \n-\n-
    611 {
    \n-
    612 return data_.begin();
    \n-
    613 }
    \n-
    \n-
    614
    \n-
    \n-\n-
    617 {
    \n-
    618 return data_.end();
    \n-
    619 }
    \n-
    \n-
    620
    \n-
    \n-\n-
    624 {
    \n-
    625 return data_.beforeEnd();
    \n-
    626 }
    \n-
    \n+
    511 if ( info == 0 || info == nSuperLUCol+1 ) {
    \n+
    512
    \n+
    513 if ( options.PivotGrowth )
    \n+
    514 dinfo<<"Recip. pivot growth = "<<rpg<<std::endl;
    \n+
    515 if ( options.ConditionNumber )
    \n+
    516 dinfo<<"Recip. condition number = %e\\n"<< rcond<<std::endl;
    \n+
    517 SCformat* Lstore = (SCformat *) L.Store;
    \n+
    518 NCformat* Ustore = (NCformat *) U.Store;
    \n+
    519 dinfo<<"No of nonzeros in factor L = "<< Lstore->nnz<<std::endl;
    \n+
    520 dinfo<<"No of nonzeros in factor U = "<< Ustore->nnz<<std::endl;
    \n+
    521 dinfo<<"No of nonzeros in L+U = "<< Lstore->nnz + Ustore->nnz - nSuperLUCol<<std::endl;
    \n+
    522 QuerySpaceChooser<T>::querySpace(&L, &U, &memusage);
    \n+
    523 dinfo<<"L\\\\U MB "<<memusage.for_lu/1e6<<" \\ttotal MB needed "<<memusage.total_needed/1e6
    \n+
    524 <<" \\texpansions ";
    \n+
    525 std::cout<<stat.expansions<<std::endl;
    \n+
    526
    \n+
    527 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
    \n+
    528 dinfo<<"** Estimated memory: "<< info - nSuperLUCol<<std::endl;
    \n+
    529 }
    \n+
    530 if ( options.PrintStat ) StatPrint(&stat);
    \n+
    531 }
    \n+
    532 StatFree(&stat);
    \n+
    533 /*
    \n+
    534 NCformat* Ustore = (NCformat *) U.Store;
    \n+
    535 int k=0;
    \n+
    536 dPrint_CompCol_Matrix("U", &U);
    \n+
    537 for(int i=0; i < U.ncol; ++i, ++k){
    \n+
    538 std::cout<<i<<": ";
    \n+
    539 for(int c=Ustore->colptr[i]; c < Ustore->colptr[i+1]; ++c)
    \n+
    540 //if(Ustore->rowind[c]==i)
    \n+
    541 std::cout<<Ustore->rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" ";
    \n+
    542 if(k==0){
    \n+
    543 //
    \n+
    544 k=-1;
    \n+
    545 }std::cout<<std::endl;
    \n+
    546 }
    \n+
    547 dPrint_SuperNode_Matrix("L", &L);
    \n+
    548 for(int i=0; i < U.ncol; ++i, ++k){
    \n+
    549 std::cout<<i<<": ";
    \n+
    550 for(int c=Ustore->colptr[i]; c < Ustore->colptr[i+1]; ++c)
    \n+
    551 //if(Ustore->rowind[c]==i)
    \n+
    552 std::cout<<Ustore->rowind[c]<<"->"<<((double*)Ustore->nzval)[c]<<" ";
    \n+
    553 if(k==0){
    \n+
    554 //
    \n+
    555 k=-1;
    \n+
    556 }std::cout<<std::endl;
    \n+
    557 } */
    \n+
    558 options.Fact = FACTORED;
    \n+
    559 }
    \n+
    560
    \n+
    561 template<typename M>
    \n+
    562 void SuperLU<M>
    \n+
    \n+\n+
    564 {
    \n+
    565 if (mat.N() != b.dim())
    \n+
    566 DUNE_THROW(ISTLError, "Size of right-hand-side vector b does not match the number of matrix rows!");
    \n+
    567 if (mat.M() != x.dim())
    \n+
    568 DUNE_THROW(ISTLError, "Size of solution vector x does not match the number of matrix columns!");
    \n+
    569 if (mat.M()+mat.N()==0)
    \n+
    570 DUNE_THROW(ISTLError, "Matrix of SuperLU is null!");
    \n+
    571
    \n+
    572 SuperMatrix* mB = &B;
    \n+
    573 SuperMatrix* mX = &X;
    \n+
    574 SuperMatrix rB, rX;
    \n+
    575 if (reusevector) {
    \n+
    576 if(first) {
    \n+
    577 SuperLUDenseMatChooser<T>::create(&B, (int)mat.N(), 1, reinterpret_cast<T*>(&b[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
    \n+
    578 SuperLUDenseMatChooser<T>::create(&X, (int)mat.N(), 1, reinterpret_cast<T*>(&x[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
    \n+
    579 first=false;
    \n+
    580 }else{
    \n+
    581 ((DNformat*)B.Store)->nzval=&b[0];
    \n+
    582 ((DNformat*)X.Store)->nzval=&x[0];
    \n+
    583 }
    \n+
    584 } else {
    \n+
    585 SuperLUDenseMatChooser<T>::create(&rB, (int)mat.N(), 1, reinterpret_cast<T*>(&b[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
    \n+
    586 SuperLUDenseMatChooser<T>::create(&rX, (int)mat.N(), 1, reinterpret_cast<T*>(&x[0]), (int)mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
    \n+
    587 mB = &rB;
    \n+
    588 mX = &rX;
    \n+
    589 }
    \n+
    590 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr;
    \n+
    591 int info;
    \n+
    592 mem_usage_t memusage;
    \n+
    593 SuperLUStat_t stat;
    \n+
    594 /* Initialize the statistics variables. */
    \n+
    595 StatInit(&stat);
    \n+
    596 /*
    \n+
    597 range_type d=b;
    \n+
    598 a->usmv(-1, x, d);
    \n+
    599
    \n+
    600 double def0=d.two_norm();
    \n+
    601 */
    \n+
    602 options.IterRefine=SLU_DOUBLE;
    \n+
    603
    \n+
    604 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
    \n+
    605 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,
    \n+
    606 &memusage, &stat, &info);
    \n+
    607
    \n+
    608 res.iterations=1;
    \n+
    609
    \n+
    610 /*
    \n+
    611 if(options.Equil==YES)
    \n+
    612 // undo scaling of right hand side
    \n+
    613 std::transform(reinterpret_cast<T*>(&b[0]),reinterpret_cast<T*>(&b[0])+mat.M(),
    \n+
    614 C, reinterpret_cast<T*>(&d[0]), std::divides<T>());
    \n+
    615 else
    \n+
    616 d=b;
    \n+
    617 a->usmv(-1, x, d);
    \n+
    618 res.reduction=d.two_norm()/def0;
    \n+
    619 res.conv_rate = res.reduction;
    \n+
    620 res.converged=(res.reduction<1e-10||d.two_norm()<1e-18);
    \n+
    621 */
    \n+
    622 res.converged=true;
    \n+
    623
    \n+
    624 if(verbose) {
    \n+
    625
    \n+
    626 dinfo<<"Triangular solve: dgssvx() returns info "<< info<<std::endl;
    \n
    627
    \n-
    \n-\n-
    631 {
    \n-
    632 return data_.beforeBegin();
    \n-
    633 }
    \n-
    \n-
    634
    \n-
    \n-\n-
    637 {
    \n-
    638 return data_.begin();
    \n-
    639 }
    \n-
    \n+
    628 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
    \n+
    629
    \n+
    630 if ( info == 0 || info == nSuperLUCol+1 ) {
    \n+
    631
    \n+
    632 if ( options.IterRefine ) {
    \n+
    633 std::cout<<"Iterative Refinement: steps="
    \n+
    634 <<stat.RefineSteps<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
    \n+
    635 }else
    \n+
    636 std::cout<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
    \n+
    637 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
    \n+
    638 std::cout<<"** Estimated memory: "<< info - nSuperLUCol<<" bytes"<<std::endl;
    \n+
    639 }
    \n
    640
    \n-
    \n-\n-
    643 {
    \n-
    644 return data_.end();
    \n-
    645 }
    \n-
    \n-
    646
    \n-
    \n-\n-
    650 {
    \n-
    651 return data_.beforeEnd();
    \n-
    652 }
    \n-
    \n-
    653
    \n-
    \n-\n-
    657 {
    \n-
    658 return data_.beforeBegin();
    \n-
    659 }
    \n-
    \n-
    660
    \n-
    \n-\n-
    663 {
    \n-
    664 data_ = t;
    \n-
    665 return *this;
    \n-
    666 }
    \n-
    \n-
    667
    \n-
    \n-\n-
    670#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    671 if (row<0)
    \n-
    672 DUNE_THROW(ISTLError, "Can't access negative rows!");
    \n-
    673 if (row>=N())
    \n-
    674 DUNE_THROW(ISTLError, "Row index out of range!");
    \n-
    675#endif
    \n-
    676 return data_[row];
    \n-
    677 }
    \n-
    \n-
    678
    \n-
    \n-
    680 const row_type operator[](size_type row) const {
    \n-
    681#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    682 if (row<0)
    \n-
    683 DUNE_THROW(ISTLError, "Can't access negative rows!");
    \n-
    684 if (row>=N())
    \n-
    685 DUNE_THROW(ISTLError, "Row index out of range!");
    \n-
    686#endif
    \n-
    687 return data_[row];
    \n-
    688 }
    \n-
    \n-
    689
    \n-
    \n-
    691 size_type N() const {
    \n-
    692 return data_.N();
    \n-
    693 }
    \n-
    \n-
    694
    \n-
    \n-
    696 size_type M() const {
    \n-
    697 return cols_;
    \n-
    698 }
    \n-
    \n-
    699
    \n-
    \n-\n-
    702 data_ *= scalar;
    \n-
    703 return (*this);
    \n-
    704 }
    \n-
    \n-
    705
    \n-
    \n-\n-
    708 data_ /= scalar;
    \n-
    709 return (*this);
    \n-
    710 }
    \n-
    \n-
    711
    \n-
    \n-\n-
    718#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    719 if(N()!=b.N() || M() != b.M())
    \n-
    720 DUNE_THROW(RangeError, "Matrix sizes do not match!");
    \n-
    721#endif
    \n-
    722 data_ += b.data_;
    \n-
    723 return (*this);
    \n-
    724 }
    \n-
    \n-
    725
    \n-
    \n-\n-
    732#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    733 if(N()!=b.N() || M() != b.M())
    \n-
    734 DUNE_THROW(RangeError, "Matrix sizes do not match!");
    \n-
    735#endif
    \n-
    736 data_ -= b.data_;
    \n-
    737 return (*this);
    \n-
    738 }
    \n-
    \n-
    739
    \n-
    \n-\n-
    742 Matrix out(M(), N());
    \n-
    743 for (size_type i=0; i<N(); i++)
    \n-
    744 for (size_type j=0; j<M(); j++)
    \n-
    745 out[j][i] = (*this)[i][j];
    \n-
    746
    \n-
    747 return out;
    \n-
    748 }
    \n-
    \n-
    749
    \n-
    \n-
    751 friend Matrix<T> operator*(const Matrix<T>& m1, const Matrix<T>& m2) {
    \n-
    752 Matrix<T> out(m1.N(), m2.M());
    \n-
    753 out = 0;
    \n+
    641 if ( options.PrintStat ) StatPrint(&stat);
    \n+
    642 }
    \n+
    643 StatFree(&stat);
    \n+
    644 if (!reusevector) {
    \n+
    645 SUPERLU_FREE(rB.Store);
    \n+
    646 SUPERLU_FREE(rX.Store);
    \n+
    647 }
    \n+
    648 }
    \n+
    \n+
    649
    \n+
    650 template<typename M>
    \n+
    651 void SuperLU<M>
    \n+
    \n+
    652 ::apply(T* x, T* b)
    \n+
    653 {
    \n+
    654 if(mat.N()+mat.M()==0)
    \n+
    655 DUNE_THROW(ISTLError, "Matrix of SuperLU is null!");
    \n+
    656
    \n+
    657 SuperMatrix* mB = &B;
    \n+
    658 SuperMatrix* mX = &X;
    \n+
    659 SuperMatrix rB, rX;
    \n+
    660 if (reusevector) {
    \n+
    661 if(first) {
    \n+
    662 SuperLUDenseMatChooser<T>::create(&B, mat.N(), 1, b, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
    \n+
    663 SuperLUDenseMatChooser<T>::create(&X, mat.N(), 1, x, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
    \n+
    664 first=false;
    \n+
    665 }else{
    \n+
    666 ((DNformat*) B.Store)->nzval=b;
    \n+
    667 ((DNformat*)X.Store)->nzval=x;
    \n+
    668 }
    \n+
    669 } else {
    \n+
    670 SuperLUDenseMatChooser<T>::create(&rB, mat.N(), 1, b, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
    \n+
    671 SuperLUDenseMatChooser<T>::create(&rX, mat.N(), 1, x, mat.N(), SLU_DN, GetSuperLUType<T>::type, SLU_GE);
    \n+
    672 mB = &rB;
    \n+
    673 mX = &rX;
    \n+
    674 }
    \n+
    675
    \n+
    676 typename GetSuperLUType<T>::float_type rpg, rcond, ferr=1e10, berr;
    \n+
    677 int info;
    \n+
    678 mem_usage_t memusage;
    \n+
    679 SuperLUStat_t stat;
    \n+
    680 /* Initialize the statistics variables. */
    \n+
    681 StatInit(&stat);
    \n+
    682
    \n+
    683 options.IterRefine=SLU_DOUBLE;
    \n+
    684
    \n+
    685 SuperLUSolveChooser<T>::solve(&options, &static_cast<SuperMatrix&>(mat), perm_c, perm_r, etree, &equed, R, C,
    \n+
    686 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,
    \n+
    687 &memusage, &stat, &info);
    \n+
    688
    \n+
    689 if(verbose) {
    \n+
    690 dinfo<<"Triangular solve: dgssvx() returns info "<< info<<std::endl;
    \n+
    691
    \n+
    692 auto nSuperLUCol = static_cast<SuperMatrix&>(mat).ncol;
    \n+
    693
    \n+
    694 if ( info == 0 || info == nSuperLUCol+1 ) { // Factorization has succeeded
    \n+
    695
    \n+
    696 if ( options.IterRefine ) {
    \n+
    697 dinfo<<"Iterative Refinement: steps="
    \n+
    698 <<stat.RefineSteps<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
    \n+
    699 }else
    \n+
    700 dinfo<<" FERR="<<ferr<<" BERR="<<berr<<std::endl;
    \n+
    701 } else if ( info > 0 && lwork == -1 ) { // Memory allocation failed
    \n+
    702 dinfo<<"** Estimated memory: "<< info - nSuperLUCol<<" bytes"<<std::endl;
    \n+
    703 }
    \n+
    704 if ( options.PrintStat ) StatPrint(&stat);
    \n+
    705 }
    \n+
    706
    \n+
    707 StatFree(&stat);
    \n+
    708 if (!reusevector) {
    \n+
    709 SUPERLU_FREE(rB.Store);
    \n+
    710 SUPERLU_FREE(rX.Store);
    \n+
    711 }
    \n+
    712 }
    \n+
    \n+
    715 template<typename T, typename A>
    \n+
    \n+\n+
    717 {
    \n+
    718 enum { value=true};
    \n+
    719 };
    \n+
    \n+
    720
    \n+
    721 template<typename T, typename A>
    \n+
    \n+\n+
    723 {
    \n+
    724 enum { value = true };
    \n+
    725 };
    \n+
    \n+
    726
    \n+
    \n+\n+
    728 template<class> struct isValidBlock : std::false_type{};
    \n+
    729 template<int k> struct isValidBlock<Dune::FieldVector<double,k>> : std::true_type{};
    \n+
    730 template<int k> struct isValidBlock<Dune::FieldVector<std::complex<double>,k>> : std::true_type{};
    \n+
    731 template<typename TL, typename M>
    \n+
    732 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n+
    733 typename Dune::TypeListElement<2, TL>::type>>
    \n+
    \n+
    734 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
    \n+
    735 std::enable_if_t<isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n+
    736 {
    \n+
    737 int verbose = config.get("verbose", 0);
    \n+
    738 return std::make_shared<Dune::SuperLU<M>>(mat,verbose);
    \n+
    739 }
    \n+
    \n+
    740
    \n+
    741 // second version with SFINAE to validate the template parameters of SuperLU
    \n+
    742 template<typename TL, typename M>
    \n+
    743 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n+
    744 typename Dune::TypeListElement<2, TL>::type>>
    \n+
    \n+
    745 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
    \n+
    746 std::enable_if_t<!isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n+
    747 {
    \n+
    748 DUNE_THROW(UnsupportedType,
    \n+
    749 "Unsupported Type in SuperLU (only double and std::complex<double> supported)");
    \n+
    750 }
    \n+
    \n+
    751 };
    \n+
    \n+
    752 template<> struct SuperLUCreator::isValidBlock<double> : std::true_type{};
    \n+
    753 template<> struct SuperLUCreator::isValidBlock<std::complex<double>> : std::true_type{};
    \n
    754
    \n-
    755 for (size_type i=0; i<out.N(); i++ ) {
    \n-
    756 for ( size_type j=0; j<out.M(); j++ )
    \n-
    757 for (size_type k=0; k<m1.M(); k++)
    \n-
    758 out[i][j] += m1[i][k]*m2[k][j];
    \n-
    759 }
    \n-
    760
    \n-
    761 return out;
    \n-
    762 }
    \n-
    \n-
    763
    \n-
    765 template <class X, class Y>
    \n-
    \n-
    766 friend Y operator*(const Matrix<T>& m, const X& vec) {
    \n-
    767#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    768 if (m.M()!=vec.size())
    \n-
    769 DUNE_THROW(ISTLError, "Vector size doesn't match the number of matrix columns!");
    \n-
    770#endif
    \n-
    771 Y out(m.N());
    \n-
    772 out = 0;
    \n-
    773
    \n-
    774 for (size_type i=0; i<out.size(); i++ ) {
    \n-
    775 for ( size_type j=0; j<vec.size(); j++ )
    \n-
    776 out[i] += m[i][j]*vec[j];
    \n-
    777 }
    \n-
    778
    \n-
    779 return out;
    \n-
    780 }
    \n-
    \n-
    781
    \n-
    783 template <class X, class Y>
    \n-
    \n-
    784 void mv(const X& x, Y& y) const
    \n-
    785 {
    \n-
    786#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    787 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    788 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    789#endif
    \n-
    790 for (size_type i=0; i<data_.N(); i++) {
    \n-
    791 y[i]=0;
    \n-
    792 for (size_type j=0; j<cols_; j++)
    \n-
    793 {
    \n-
    794 auto&& xj = Impl::asVector(x[j]);
    \n-
    795 auto&& yi = Impl::asVector(y[i]);
    \n-
    796 Impl::asMatrix((*this)[i][j]).umv(xj, yi);
    \n-
    797 }
    \n-
    798 }
    \n-
    799 }
    \n-
    \n-
    800
    \n-
    802 template<class X, class Y>
    \n-
    \n-
    803 void mtv (const X& x, Y& y) const
    \n-
    804 {
    \n-
    805#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    806 if (x.N()!=N()) DUNE_THROW(ISTLError,"index out of range");
    \n-
    807 if (y.N()!=M()) DUNE_THROW(ISTLError,"index out of range");
    \n-
    808#endif
    \n-
    809 for(size_type i=0; i<y.N(); ++i)
    \n-
    810 y[i]=0;
    \n-
    811 umtv(x,y);
    \n-
    812 }
    \n-
    \n-
    813
    \n-
    815 template <class X, class Y>
    \n-
    \n-
    816 void umv(const X& x, Y& y) const
    \n-
    817 {
    \n-
    818#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    819 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    820 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    821#endif
    \n-
    822 for (size_type i=0; i<data_.N(); i++)
    \n-
    823 for (size_type j=0; j<cols_; j++)
    \n-
    824 {
    \n-
    825 auto&& xj = Impl::asVector(x[j]);
    \n-
    826 auto&& yi = Impl::asVector(y[i]);
    \n-
    827 Impl::asMatrix((*this)[i][j]).umv(xj, yi);
    \n-
    828 }
    \n-
    829 }
    \n-
    \n-
    830
    \n-
    832 template<class X, class Y>
    \n-
    \n-
    833 void mmv (const X& x, Y& y) const
    \n-
    834 {
    \n-
    835#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    836 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    837 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    838#endif
    \n-
    839 for (size_type i=0; i<data_.N(); i++)
    \n-
    840 for (size_type j=0; j<cols_; j++)
    \n-
    841 {
    \n-
    842 auto&& xj = Impl::asVector(x[j]);
    \n-
    843 auto&& yi = Impl::asVector(y[i]);
    \n-
    844 Impl::asMatrix((*this)[i][j]).mmv(xj, yi);
    \n-
    845 }
    \n-
    846 }
    \n-
    \n-
    847
    \n-
    849 template <class X, class Y>
    \n-
    \n-
    850 void usmv(const field_type& alpha, const X& x, Y& y) const
    \n-
    851 {
    \n-
    852#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    853 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    854 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    855#endif
    \n-
    856 for (size_type i=0; i<data_.N(); i++)
    \n-
    857 for (size_type j=0; j<cols_; j++)
    \n-
    858 {
    \n-
    859 auto&& xj = Impl::asVector(x[j]);
    \n-
    860 auto&& yi = Impl::asVector(y[i]);
    \n-
    861 Impl::asMatrix((*this)[i][j]).usmv(alpha, xj, yi);
    \n-
    862 }
    \n-
    863 }
    \n-
    \n-
    864
    \n-
    866 template<class X, class Y>
    \n-
    \n-
    867 void umtv (const X& x, Y& y) const
    \n-
    868 {
    \n-
    869#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    870 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    871 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    872#endif
    \n-
    873 for (size_type i=0; i<data_.N(); i++)
    \n-
    874 for (size_type j=0; j<cols_; j++)
    \n-
    875 {
    \n-
    876 auto&& xi = Impl::asVector(x[i]);
    \n-
    877 auto&& yj = Impl::asVector(y[j]);
    \n-
    878 Impl::asMatrix((*this)[i][j]).umtv(xi, yj);
    \n-
    879 }
    \n-
    880 }
    \n-
    \n-
    881
    \n-
    883 template<class X, class Y>
    \n-
    \n-
    884 void mmtv (const X& x, Y& y) const
    \n-
    885 {
    \n-
    886#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    887 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    888 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    889#endif
    \n-
    890 for (size_type i=0; i<data_.N(); i++)
    \n-
    891 for (size_type j=0; j<cols_; j++)
    \n-
    892 {
    \n-
    893 auto&& xi = Impl::asVector(x[i]);
    \n-
    894 auto&& yj = Impl::asVector(y[j]);
    \n-
    895 Impl::asMatrix((*this)[i][j]).mmtv(xi, yj);
    \n-
    896 }
    \n-
    897 }
    \n-
    \n-
    898
    \n-
    900 template<class X, class Y>
    \n-
    \n-
    901 void usmtv (const field_type& alpha, const X& x, Y& y) const
    \n-
    902 {
    \n-
    903#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    904 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    905 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    906#endif
    \n-
    907 for (size_type i=0; i<data_.N(); i++)
    \n-
    908 for (size_type j=0; j<cols_; j++)
    \n-
    909 {
    \n-
    910 auto&& xi = Impl::asVector(x[i]);
    \n-
    911 auto&& yj = Impl::asVector(y[j]);
    \n-
    912 Impl::asMatrix((*this)[i][j]).usmtv(alpha, xi, yj);
    \n-
    913 }
    \n-
    914 }
    \n-
    \n-
    915
    \n-
    917 template<class X, class Y>
    \n-
    \n-
    918 void umhv (const X& x, Y& y) const
    \n-
    919 {
    \n-
    920#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    921 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    922 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    923#endif
    \n-
    924 for (size_type i=0; i<data_.N(); i++)
    \n-
    925 for (size_type j=0; j<cols_; j++)
    \n-
    926 {
    \n-
    927 auto&& xi = Impl::asVector(x[i]);
    \n-
    928 auto&& yj = Impl::asVector(y[j]);
    \n-
    929 Impl::asMatrix((*this)[i][j]).umhv(xi,yj);
    \n-
    930 }
    \n-
    931 }
    \n-
    \n-
    932
    \n-
    934 template<class X, class Y>
    \n-
    \n-
    935 void mmhv (const X& x, Y& y) const
    \n-
    936 {
    \n-
    937#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    938 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    939 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    940#endif
    \n-
    941 for (size_type i=0; i<data_.N(); i++)
    \n-
    942 for (size_type j=0; j<cols_; j++)
    \n-
    943 {
    \n-
    944 auto&& xi = Impl::asVector(x[i]);
    \n-
    945 auto&& yj = Impl::asVector(y[j]);
    \n-
    946 Impl::asMatrix((*this)[i][j]).mmhv(xi,yj);
    \n-
    947 }
    \n-
    948 }
    \n-
    \n-
    949
    \n-
    951 template<class X, class Y>
    \n-
    \n-
    952 void usmhv (const field_type& alpha, const X& x, Y& y) const
    \n-
    953 {
    \n-
    954#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    955 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    956 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n-
    957#endif
    \n-
    958 for (size_type i=0; i<data_.N(); i++)
    \n-
    959 for (size_type j=0; j<cols_; j++)
    \n-
    960 {
    \n-
    961 auto&& xi = Impl::asVector(x[i]);
    \n-
    962 auto&& yj = Impl::asVector(y[j]);
    \n-
    963 Impl::asMatrix((*this)[i][j]).usmhv(alpha,xi,yj);
    \n-
    964 }
    \n-
    965 }
    \n-
    \n-
    966
    \n-
    967 //===== norms
    \n-
    968
    \n-
    \n-
    970 typename FieldTraits<field_type>::real_type frobenius_norm () const
    \n-
    971 {
    \n-
    972 return std::sqrt(frobenius_norm2());
    \n-
    973 }
    \n-
    \n-
    974
    \n-
    \n-
    976 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
    \n-
    977 {
    \n-
    978 typename FieldTraits<field_type>::real_type sum=0;
    \n-
    979 for (size_type i=0; i<this->N(); i++)
    \n-
    980 for (size_type j=0; j<this->M(); j++)
    \n-
    981 sum += Impl::asMatrix(data_[i][j]).frobenius_norm2();
    \n-
    982 return sum;
    \n-
    983 }
    \n-
    \n-
    984
    \n-
    986 template <typename ft = field_type,
    \n-
    987 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n-
    \n-
    988 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n-
    989 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    990 using std::max;
    \n-
    991
    \n-
    992 real_type norm = 0;
    \n-
    993 for (auto const &x : *this) {
    \n-
    994 real_type sum = 0;
    \n-
    995 for (auto const &y : x)
    \n-
    996 sum += Impl::asMatrix(y).infinity_norm();
    \n-
    997 norm = max(sum, norm);
    \n-
    998 isNaN += sum;
    \n-
    999 }
    \n-
    1000
    \n-
    1001 return norm;
    \n-
    1002 }
    \n-
    \n-
    1003
    \n-
    1005 template <typename ft = field_type,
    \n-
    1006 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n-
    \n-
    1007 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n-
    1008 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    1009 using std::max;
    \n-
    1010
    \n-
    1011 real_type norm = 0;
    \n-
    1012 for (auto const &x : *this) {
    \n-
    1013 real_type sum = 0;
    \n-
    1014 for (auto const &y : x)
    \n-
    1015 sum += Impl::asMatrix(y).infinity_norm_real();
    \n-
    1016 norm = max(sum, norm);
    \n-
    1017 }
    \n-
    1018 return norm;
    \n-
    1019 }
    \n-
    \n-
    1020
    \n-
    1022 template <typename ft = field_type,
    \n-
    1023 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n-
    \n-
    1024 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n-
    1025 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    1026 using std::max;
    \n-
    1027
    \n-
    1028 real_type norm = 0;
    \n-
    1029 real_type isNaN = 1;
    \n-
    1030 for (auto const &x : *this) {
    \n-
    1031 real_type sum = 0;
    \n-
    1032 for (auto const &y : x)
    \n-
    1033 sum += Impl::asMatrix(y).infinity_norm();
    \n-
    1034 norm = max(sum, norm);
    \n-
    1035 isNaN += sum;
    \n-
    1036 }
    \n-
    1037
    \n-
    1038 return norm * (isNaN / isNaN);
    \n-
    1039 }
    \n-
    \n-
    1040
    \n-
    1042 template <typename ft = field_type,
    \n-
    1043 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n-
    \n-
    1044 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n-
    1045 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    1046 using std::max;
    \n-
    1047
    \n-
    1048 real_type norm = 0;
    \n-
    1049 real_type isNaN = 1;
    \n-
    1050 for (auto const &x : *this) {
    \n-
    1051 real_type sum = 0;
    \n-
    1052 for (auto const &y : x)
    \n-
    1053 sum += Impl::asMatrix(y).infinity_norm_real();
    \n-
    1054 norm = max(sum, norm);
    \n-
    1055 isNaN += sum;
    \n-
    1056 }
    \n-
    1057
    \n-
    1058 return norm * (isNaN / isNaN);
    \n-
    1059 }
    \n-
    \n-
    1060
    \n-
    1061 //===== query
    \n-
    1062
    \n-
    \n-
    1064 bool exists ([[maybe_unused]] size_type i, [[maybe_unused]] size_type j) const
    \n-
    1065 {
    \n-
    1066#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1067 if (i<0 || i>=N()) DUNE_THROW(ISTLError,"row index out of range");
    \n-
    1068 if (j<0 || i>=M()) DUNE_THROW(ISTLError,"column index out of range");
    \n-
    1069#endif
    \n-
    1070 return true;
    \n-
    1071 }
    \n-
    \n-
    1072
    \n-
    1073 protected:
    \n-
    1074
    \n-\n-
    1078
    \n-\n-
    1085 };
    \n-
    \n-
    1086
    \n-
    1087 template<class T, class A>
    \n-
    \n-
    1088 struct FieldTraits< Matrix<T, A> >
    \n-
    1089 {
    \n-\n-
    1091 using real_type = typename FieldTraits<field_type>::real_type;
    \n-
    1092 };
    \n-
    \n-
    1093
    \n-
    1095} // end namespace Dune
    \n-
    1096
    \n-
    1097#endif
    \n-
    Helper functions for determining the vector/matrix block level.
    \n-\n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+\n+
    756} // end namespace DUNE
    \n+
    757
    \n+
    758// undefine macros from SuperLU's slu_util.h
    \n+
    759#undef FIRSTCOL_OF_SNODE
    \n+
    760#undef NO_MARKER
    \n+
    761#undef NUM_TEMPV
    \n+
    762#undef USER_ABORT
    \n+
    763#undef USER_MALLOC
    \n+
    764#undef SUPERLU_MALLOC
    \n+
    765#undef USER_FREE
    \n+
    766#undef SUPERLU_FREE
    \n+
    767#undef CHECK_MALLOC
    \n+
    768#undef SUPERLU_MAX
    \n+
    769#undef SUPERLU_MIN
    \n+
    770#undef L_SUB_START
    \n+
    771#undef L_SUB
    \n+
    772#undef L_NZ_START
    \n+
    773#undef L_FST_SUPC
    \n+
    774#undef U_NZ_START
    \n+
    775#undef U_SUB
    \n+
    776#undef TRUE
    \n+
    777#undef FALSE
    \n+
    778#undef EMPTY
    \n+
    779#undef NODROP
    \n+
    780#undef DROP_BASIC
    \n+
    781#undef DROP_PROWS
    \n+
    782#undef DROP_COLUMN
    \n+
    783#undef DROP_AREA
    \n+
    784#undef DROP_SECONDARY
    \n+
    785#undef DROP_DYNAMIC
    \n+
    786#undef DROP_INTERP
    \n+
    787#undef MILU_ALPHA
    \n+
    788
    \n+
    789#endif // HAVE_SUPERLU
    \n+
    790#endif // DUNE_SUPERLU_HH
    \n+
    Implementation of the BCRSMatrix class.
    \n+\n+
    Implementations of the inverse operator interface.
    \n+\n+
    Templates characterizing the type of a solver.
    \n+
    #define DUNE_REGISTER_DIRECT_SOLVER(name,...)
    Definition solverregistry.hh:13
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+\n+\n+
    void setSubMatrix(const Matrix &mat, const S &rowIndexSet)
    Definition superlu.hh:457
    \n+
    void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
    Apply inverse operator,.
    Definition superlu.hh:563
    \n+
    void setVerbosity(bool v)
    Definition superlu.hh:437
    \n+
    void free()
    free allocated space.
    Definition superlu.hh:403
    \n+
    ~SuperLU()
    Definition superlu.hh:396
    \n+
    SuperLU()
    Empty default constructor.
    Definition superlu.hh:432
    \n+
    void setMatrix(const Matrix &mat)
    Initialize data from given matrix.
    Definition superlu.hh:443
    \n+
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    STL namespace.
    \n
    Definition allocator.hh:11
    \n-
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n+
    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
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    A Vector of blocks with different blocksizes.
    Definition matrix.hh:44
    \n-
    Imp::BlockVectorWindow< B, A > window_type
    Definition matrix.hh:70
    \n-
    BlockVector< B, A > block_type
    Same as value_type, here for historical reasons.
    Definition matrix.hh:67
    \n-
    DenseMatrixBase & operator=(const DenseMatrixBase &a)
    assignment
    Definition matrix.hh:182
    \n-
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition matrix.hh:50
    \n-
    Iterator beforeBegin() const
    Definition matrix.hh:385
    \n-
    void resize(size_type rows, size_type columns)
    same effect as constructor with same argument
    Definition matrix.hh:153
    \n-
    const window_type const_reference
    Definition matrix.hh:74
    \n-
    DenseMatrixBase(size_type rows, size_type columns)
    Definition matrix.hh:95
    \n-
    Iterator end()
    end Iterator
    Definition matrix.hh:371
    \n-
    reference operator[](size_type i)
    random access to blocks
    Definition matrix.hh:241
    \n-
    BlockVector< B, A > value_type
    Type of the elements of the outer vector, i.e., dynamic vectors of B.
    Definition matrix.hh:63
    \n-
    Iterator find(size_type i)
    random access returning iterator (end if not contained)
    Definition matrix.hh:391
    \n-
    size_type N() const
    number of blocks in the vector (are of variable size here)
    Definition matrix.hh:539
    \n-
    ConstIterator beforeEnd() const
    Definition matrix.hh:525
    \n-
    ConstIterator end() const
    end ConstIterator
    Definition matrix.hh:518
    \n-
    window_type reference
    Definition matrix.hh:72
    \n-
    ConstIterator rend() const
    end ConstIterator
    Definition matrix.hh:531
    \n-
    Iterator beforeEnd()
    Definition matrix.hh:378
    \n-
    ConstIterator begin() const
    begin ConstIterator
    Definition matrix.hh:512
    \n-
    A allocator_type
    export the allocator type
    Definition matrix.hh:53
    \n-
    DenseMatrixBase()
    Definition matrix.hh:82
    \n-
    ConstIterator find(size_type i) const
    random access returning iterator (end if not contained)
    Definition matrix.hh:397
    \n-
    A::size_type size_type
    The size type for the index access.
    Definition matrix.hh:56
    \n-
    ~DenseMatrixBase()
    free dynamic memory
    Definition matrix.hh:142
    \n-
    Iterator begin()
    begin Iterator
    Definition matrix.hh:365
    \n-
    DenseMatrixBase(const DenseMatrixBase &a)
    copy constructor, has copy semantics
    Definition matrix.hh:116
    \n-
    Iterator class for sequential access.
    Definition matrix.hh:263
    \n-
    Iterator & operator--()
    prefix decrement
    Definition matrix.hh:308
    \n-
    size_type index() const
    Definition matrix.hh:352
    \n-\n-\n-
    bool operator!=(const Iterator &it) const
    inequality
    Definition matrix.hh:322
    \n-
    Iterator & operator=(Iterator &&other)
    Move assignment.
    Definition matrix.hh:282
    \n-
    Iterator & operator++()
    prefix increment
    Definition matrix.hh:300
    \n-
    Iterator()
    constructor, no arguments
    Definition matrix.hh:266
    \n-
    window_type & operator*() const
    dereferencing
    Definition matrix.hh:340
    \n-
    bool operator==(const Iterator &it) const
    equality
    Definition matrix.hh:316
    \n-
    Iterator & operator=(Iterator &other)
    Copy assignment.
    Definition matrix.hh:291
    \n-
    Iterator(B *data, size_type columns, size_type _i)
    constructor
    Definition matrix.hh:276
    \n-
    window_type * operator->() const
    arrow
    Definition matrix.hh:346
    \n-
    ConstIterator class for sequential access.
    Definition matrix.hh:404
    \n-
    const window_type * operator->() const
    arrow
    Definition matrix.hh:487
    \n-
    const window_type & operator*() const
    dereferencing
    Definition matrix.hh:481
    \n-
    ConstIterator & operator++()
    prefix increment
    Definition matrix.hh:441
    \n-
    ConstIterator(const B *data, size_type columns, size_type _i)
    constructor from pointer
    Definition matrix.hh:414
    \n-
    ConstIterator & operator--()
    prefix decrement
    Definition matrix.hh:449
    \n-
    ConstIterator(const Iterator &it)
    constructor from non_const iterator
    Definition matrix.hh:420
    \n-
    bool operator!=(const ConstIterator &it) const
    inequality
    Definition matrix.hh:463
    \n-
    ConstIterator()
    constructor
    Definition matrix.hh:407
    \n-
    bool operator==(const ConstIterator &it) const
    equality
    Definition matrix.hh:457
    \n-
    size_type index() const
    Definition matrix.hh:493
    \n-
    ConstIterator & operator=(Iterator &&other)
    Definition matrix.hh:424
    \n-
    ConstIterator & operator=(Iterator &other)
    Definition matrix.hh:432
    \n+
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n+
    Definition overlappingschwarz.hh:694
    \n
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n-
    size_type cols_
    Number of columns of the matrix.
    Definition matrix.hh:1084
    \n-
    FieldTraits< ft >::real_type infinity_norm() const
    infinity norm (row sum norm, how to generalize for blocks?)
    Definition matrix.hh:988
    \n-
    A allocator_type
    Export the allocator.
    Definition matrix.hh:571
    \n-
    FieldTraits< ft >::real_type infinity_norm_real() const
    simplified infinity norm (uses Manhattan norm for complex values)
    Definition matrix.hh:1007
    \n-
    void usmhv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^H x
    Definition matrix.hh:952
    \n-
    void usmv(const field_type &alpha, const X &x, Y &y) const
    Definition matrix.hh:850
    \n-
    A::size_type size_type
    Type for indices and sizes.
    Definition matrix.hh:577
    \n-
    MatrixImp::DenseMatrixBase< T, A > data_
    Abuse DenseMatrixBase as an engine for a 2d array ISTL-style.
    Definition matrix.hh:1077
    \n-
    Matrix transpose() const
    Return the transpose of the matrix.
    Definition matrix.hh:741
    \n-
    void mtv(const X &x, Y &y) const
    y = A^T x
    Definition matrix.hh:803
    \n-
    void umv(const X &x, Y &y) const
    y += A x
    Definition matrix.hh:816
    \n-
    void mv(const X &x, Y &y) const
    y = A x
    Definition matrix.hh:784
    \n-
    MatrixImp::DenseMatrixBase< T, A >::ConstIterator ConstRowIterator
    Const iterator over the matrix rows.
    Definition matrix.hh:586
    \n-
    void setSize(size_type rows, size_type cols)
    Change the matrix size.
    Definition matrix.hh:604
    \n-
    RowIterator beforeBegin()
    Definition matrix.hh:630
    \n-
    RowIterator beforeEnd()
    Definition matrix.hh:623
    \n-
    Matrix()
    Create empty matrix.
    Definition matrix.hh:592
    \n-
    Matrix & operator-=(const Matrix &b)
    Subtract the entries of another matrix from this one.
    Definition matrix.hh:731
    \n-
    FieldTraits< field_type >::real_type frobenius_norm2() const
    square of frobenius norm, need for block recursion
    Definition matrix.hh:976
    \n-
    row_type::iterator ColIterator
    Iterator for the entries of each row.
    Definition matrix.hh:583
    \n-
    ConstRowIterator beforeEnd() const
    Definition matrix.hh:649
    \n-
    Matrix & operator=(const field_type &t)
    Assignment from scalar.
    Definition matrix.hh:662
    \n-
    RowIterator end()
    Get iterator to one beyond last row.
    Definition matrix.hh:616
    \n-
    const row_type operator[](size_type row) const
    The const index operator.
    Definition matrix.hh:680
    \n-
    ConstRowIterator end() const
    Get const iterator to one beyond last row.
    Definition matrix.hh:642
    \n-
    friend Y operator*(const Matrix< T > &m, const X &vec)
    Generic matrix-vector multiplication.
    Definition matrix.hh:766
    \n-
    Matrix< T > & operator*=(const field_type &scalar)
    Multiplication with a scalar.
    Definition matrix.hh:701
    \n-
    row_type operator[](size_type row)
    The index operator.
    Definition matrix.hh:669
    \n-
    void mmv(const X &x, Y &y) const
    y -= A x
    Definition matrix.hh:833
    \n-
    Matrix & operator+=(const Matrix &b)
    Add the entries of another matrix to this one.
    Definition matrix.hh:717
    \n-
    ConstRowIterator begin() const
    Get const iterator to first row.
    Definition matrix.hh:636
    \n-
    void mmhv(const X &x, Y &y) const
    y -= A^H x
    Definition matrix.hh:935
    \n-
    RowIterator begin()
    Get iterator to first row.
    Definition matrix.hh:610
    \n-
    typename Imp::BlockTraits< T >::field_type field_type
    Export the type representing the underlying field.
    Definition matrix.hh:565
    \n-
    row_type::const_iterator ConstColIterator
    Const iterator for the entries of each row.
    Definition matrix.hh:589
    \n
    size_type M() const
    Return the number of columns.
    Definition matrix.hh:696
    \n-
    T block_type
    Export the type representing the components.
    Definition matrix.hh:568
    \n-
    bool exists(size_type i, size_type j) const
    return true if (i,j) is in pattern
    Definition matrix.hh:1064
    \n-
    Matrix< T > & operator/=(const field_type &scalar)
    Division by a scalar.
    Definition matrix.hh:707
    \n-
    friend Matrix< T > operator*(const Matrix< T > &m1, const Matrix< T > &m2)
    Generic matrix multiplication.
    Definition matrix.hh:751
    \n-
    void umtv(const X &x, Y &y) const
    y += A^T x
    Definition matrix.hh:867
    \n-
    void mmtv(const X &x, Y &y) const
    y -= A^T x
    Definition matrix.hh:884
    \n-
    MatrixImp::DenseMatrixBase< T, A >::window_type row_type
    The type implementing a matrix row.
    Definition matrix.hh:574
    \n-
    FieldTraits< field_type >::real_type frobenius_norm() const
    frobenius norm: sqrt(sum over squared values of entries)
    Definition matrix.hh:970
    \n-
    void usmtv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^T x
    Definition matrix.hh:901
    \n-
    void umhv(const X &x, Y &y) const
    y += A^H x
    Definition matrix.hh:918
    \n
    size_type N() const
    Return the number of rows.
    Definition matrix.hh:691
    \n-
    ConstRowIterator beforeBegin() const
    Definition matrix.hh:656
    \n-
    Matrix(size_type rows, size_type cols)
    Create uninitialized matrix of size rows x cols.
    Definition matrix.hh:597
    \n-
    MatrixImp::DenseMatrixBase< T, A >::Iterator RowIterator
    Iterator over the matrix rows.
    Definition matrix.hh:580
    \n-
    typename Matrix< T, A >::field_type field_type
    Definition matrix.hh:1090
    \n-
    typename FieldTraits< field_type >::real_type real_type
    Definition matrix.hh:1091
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    int iterations
    Number of iterations.
    Definition solver.hh:69
    \n+
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n+
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    Definition solverregistry.hh:77
    \n+
    Definition solvertype.hh:16
    \n+
    @ value
    Whether this is a direct solver.
    Definition solvertype.hh:24
    \n+
    Definition solvertype.hh:30
    \n+
    @ value
    whether the solver internally uses column compressed storage
    Definition solvertype.hh:36
    \n+
    Definition superlu.hh:45
    \n+
    Definition superlu.hh:49
    \n+
    Definition superlu.hh:53
    \n+
    Definition superlu.hh:57
    \n+
    SuperLu Solver.
    Definition superlu.hh:271
    \n+
    SuperLUMatrix::size_type nnz() const
    Definition superlu.hh:355
    \n+
    void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
    apply inverse operator, with given convergence criteria.
    Definition superlu.hh:342
    \n+
    typename Impl::SuperLUVectorChooser< M >::range_type range_type
    The type of the range of the solver.
    Definition superlu.hh:284
    \n+
    M matrix_type
    Definition superlu.hh:276
    \n+
    SuperMatrixInitializer< Matrix > MatrixInitializer
    Type of an associated initializer class.
    Definition superlu.hh:280
    \n+
    M Matrix
    The matrix type.
    Definition superlu.hh:275
    \n+
    typename Impl::SuperLUVectorChooser< M >::domain_type domain_type
    The type of the domain of the solver.
    Definition superlu.hh:282
    \n+
    const char * name()
    Definition superlu.hh:371
    \n+
    virtual SolverCategory::Category category() const
    Category of the solver (see SolverCategory::Category)
    Definition superlu.hh:287
    \n+
    Dune::SuperLUMatrix< Matrix > SuperLUMatrix
    The corresponding SuperLU Matrix type.
    Definition superlu.hh:278
    \n+
    SuperLU(const Matrix &mat, const ParameterTree &config)
    Constructs the SuperLU solver.
    Definition superlu.hh:320
    \n+
    Definition superlu.hh:727
    \n+
    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
    \n+
    Definition superlu.hh:728
    \n+
    Definition supermatrix.hh:132
    \n+
    Utility class for converting an ISTL Matrix into a SuperLU Matrix.
    Definition supermatrix.hh:175
    \n+
    Definition supermatrix.hh:179
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1371 +1,947 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-matrix.hh\n+superlu.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_MATRIX_HH\n-6#define DUNE_ISTL_MATRIX_HH\n+5#ifndef DUNE_ISTL_SUPERLU_HH\n+6#define DUNE_ISTL_SUPERLU_HH\n 7\n-12#include \n-13#include \n-14\n-15#include \n-16#include \n-17#include \n-18#include \n-19\n-20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-21#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-22#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+8#if HAVE_SUPERLU\n+9\n+10#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\n+11#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n+12#include \"_\bs_\bu_\bp_\be_\br_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+13#include \n+14#include \n+15#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+16#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+17#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+18#include \n+19#include \n+20#include \n+21#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+22#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n 23\n-24namespace _\bD_\bu_\bn_\be {\n-25\n-_\b2_\b6namespace MatrixImp\n-27{\n-39 template >\n-_\b4_\b0 class _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be : public Imp::block_vector_unmanaged\n-41 // this derivation gives us all the blas level 1 and norms\n-42 // on the large array. However, access operators have to be\n-43 // overwritten.\n-44 {\n-45 public:\n+24namespace _\bD_\bu_\bn_\be\n+25{\n+26\n+37 template\n+38 class SeqOverlappingSchwarz;\n+39\n+40 template\n+41 struct SeqOverlappingSchwarzAssemblerHelper;\n+42\n+43 template\n+_\b4_\b4 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n+45 {};\n 46\n-47 //===== type definitions and constants\n-48\n-_\b5_\b0 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n-51\n-_\b5_\b3 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n+47 template\n+_\b4_\b8 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br\n+49 {};\n+50\n+51 template\n+_\b5_\b2 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bQ_\bu_\be_\br_\by_\bC_\bh_\bo_\bo_\bs_\be_\br\n+53 {};\n 54\n-_\b5_\b6 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-57\n-_\b6_\b3 typedef _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bB_\b,_\bA_\b> _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-64\n-_\b6_\b7 typedef _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bB_\b,_\bA_\b> _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-68\n-69 // just a shorthand\n-_\b7_\b0 typedef Imp::BlockVectorWindow _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be;\n-71\n-_\b7_\b2 typedef _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-73\n-_\b7_\b4 typedef const _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-75\n-76\n-77 //===== constructors and such\n-78\n-_\b8_\b2 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be () : Imp::block_vector_unmanaged()\n-83 {\n-84 // nothing is known ...\n-85 rows_ = 0;\n-86 columns_ = 0;\n+55 template\n+_\b5_\b6 struct _\bQ_\bu_\be_\br_\by_\bS_\bp_\ba_\bc_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n+57 {};\n+58\n+59#if __has_include(\"slu_sdefs.h\")\n+60 template<>\n+61 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br\n+62 {\n+63 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, float *dat, int n1,\n+64 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n+65 {\n+66 sCreate_Dense_Matrix(_\bm_\ba_\bt, n, m, dat, n1, stype, dtype, mtype);\n+67\n+68 }\n+69\n+70 static void destroy(SuperMatrix*)\n+71 {}\n+72\n+73 };\n+74 template<>\n+75 struct SuperLUSolveChooser\n+76 {\n+77 static void solve(superlu_options_t *options, SuperMatrix *_\bm_\ba_\bt, int *perm_c,\n+int *perm_r, int *etree,\n+78 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,\n+79 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,\n+80 float *rpg, float *rcond, float *ferr, float *berr,\n+81 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)\n+82 {\n+83 GlobalLU_t gLU;\n+84 sgssvx(options, _\bm_\ba_\bt, perm_c, perm_r, etree, equed, R, C,\n+85 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,\n+86 &gLU, memusage, stat, info);\n 87 }\n-88\n-_\b9_\b5 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns) : Imp::\n-block_vector_unmanaged()\n-96 {\n-97 // and we can allocate the big array in the base class\n-98 this->n = rows*columns;\n-99 columns_ = columns;\n-100 if (this->n>0)\n-101 {\n-102 this->p = allocator_.allocate(this->n);\n-103 new (this->p)B[this->n];\n-104 }\n-105 else\n-106 {\n-107 this->n = 0;\n-108 this->p = 0;\n-109 }\n+88 };\n+89\n+90 template<>\n+91 struct QuerySpaceChooser\n+92 {\n+93 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t*\n+memusage)\n+94 {\n+95 sQuerySpace(L,U,memusage);\n+96 }\n+97 };\n+98\n+99#endif\n+100\n+101#if __has_include(\"slu_ddefs.h\")\n+102\n+103 template<>\n+104 struct SuperLUDenseMatChooser\n+105 {\n+106 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, double *dat, int n1,\n+107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n+108 {\n+109 dCreate_Dense_Matrix(_\bm_\ba_\bt, n, m, dat, n1, stype, dtype, mtype);\n 110\n-111 // we can allocate the windows now\n-112 rows_ = rows;\n-113 }\n-114\n-_\b1_\b1_\b6 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be& a)\n-117 {\n-118 // allocate the big array in the base class\n-119 this->n = a.n;\n-120 columns_ = a.columns_;\n-121 if (this->n>0)\n-122 {\n-123 // allocate and construct objects\n-124 this->p = allocator_.allocate(this->n);\n-125 new (this->p)B[this->n];\n-126\n-127 // copy data\n-128 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; in; i++)\n-129 this->p[i]=a.p[i];\n-130 }\n-131 else\n-132 {\n-133 this->n = 0;\n-134 this->p = nullptr;\n-135 }\n-136\n-137 // we can allocate the windows now\n-138 rows_ = a.rows_;\n-139 }\n-140\n-_\b1_\b4_\b2 _\b~_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be ()\n-143 {\n-144 if (this->n>0) {\n-145 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=this->n;\n-146 while (i)\n-147 this->p[--i].~B();\n-148 allocator_.deallocate(this->p,this->n);\n-149 }\n-150 }\n-151\n-_\b1_\b5_\b3 void _\br_\be_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns)\n-154 {\n-155 // deconstruct objects and deallocate memory if necessary\n-156 if (this->n>0) {\n-157 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=this->n;\n-158 while (i)\n-159 this->p[--i].~B();\n-160 allocator_.deallocate(this->p,this->n);\n-161 }\n-162\n-163 // and we can allocate the big array in the base class\n-164 this->n = rows*columns;\n-165 if (this->n>0)\n-166 {\n-167 this->p = allocator_.allocate(this->n);\n-168 new (this->p)B[this->n];\n-169 }\n-170 else\n-171 {\n-172 this->n = 0;\n-173 this->p = nullptr;\n-174 }\n-175\n-176 // we can allocate the windows now\n-177 rows_ = rows;\n-178 columns_ = columns;\n+111 }\n+112\n+113 static void destroy(SuperMatrix * /* mat */)\n+114 {}\n+115 };\n+116 template<>\n+117 struct SuperLUSolveChooser\n+118 {\n+119 static void solve(superlu_options_t *options, SuperMatrix *_\bm_\ba_\bt, int\n+*perm_c, int *perm_r, int *etree,\n+120 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,\n+121 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,\n+122 double *rpg, double *rcond, double *ferr, double *berr,\n+123 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)\n+124 {\n+125 GlobalLU_t gLU;\n+126 dgssvx(options, _\bm_\ba_\bt, perm_c, perm_r, etree, equed, R, C,\n+127 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,\n+128 &gLU, memusage, stat, info);\n+129 }\n+130 };\n+131\n+132 template<>\n+133 struct QuerySpaceChooser\n+134 {\n+135 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t*\n+memusage)\n+136 {\n+137 dQuerySpace(L,U,memusage);\n+138 }\n+139 };\n+140#endif\n+141\n+142#if __has_include(\"slu_zdefs.h\")\n+143 template<>\n+144 struct SuperLUDenseMatChooser<_\bs_\bt_\bd::complex >\n+145 {\n+146 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, std::complex\n+*dat, int n1,\n+147 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n+148 {\n+149 zCreate_Dense_Matrix(_\bm_\ba_\bt, n, m, reinterpret_cast(dat), n1,\n+stype, dtype, mtype);\n+150\n+151 }\n+152\n+153 static void destroy(SuperMatrix*)\n+154 {}\n+155 };\n+156\n+157 template<>\n+158 struct SuperLUSolveChooser<_\bs_\bt_\bd::complex >\n+159 {\n+160 static void solve(superlu_options_t *options, SuperMatrix *_\bm_\ba_\bt, int\n+*perm_c, int *perm_r, int *etree,\n+161 char *equed, double *R, double *C, SuperMatrix *L, SuperMatrix *U,\n+162 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,\n+163 double *rpg, double *rcond, double *ferr, double *berr,\n+164 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)\n+165 {\n+166 GlobalLU_t gLU;\n+167 zgssvx(options, _\bm_\ba_\bt, perm_c, perm_r, etree, equed, R, C,\n+168 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,\n+169 &gLU, memusage, stat, info);\n+170 }\n+171 };\n+172\n+173 template<>\n+174 struct QuerySpaceChooser<_\bs_\bt_\bd::complex >\n+175 {\n+176 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t*\n+memusage)\n+177 {\n+178 zQuerySpace(L,U,memusage);\n 179 }\n-180\n-_\b1_\b8_\b2 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be& a)\n-183 {\n-184 if (&a!=this) // check if this and a are different objects\n-185 {\n-186 columns_ = a.columns_;\n-187 // reallocate arrays if necessary\n-188 // Note: still the block sizes may vary !\n-189 if (this->n!=a.n || rows_!=a.rows_)\n-190 {\n-191 // deconstruct objects and deallocate memory if necessary\n-192 if (this->n>0) {\n-193 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=this->n;\n-194 while (i)\n-195 this->p[--i].~B();\n-196 allocator_.deallocate(this->p,this->n);\n-197 }\n-198\n-199 // allocate the big array in the base class\n-200 this->n = a.n;\n-201 if (this->n>0)\n-202 {\n-203 // allocate and construct objects\n-204 this->p = allocator_.allocate(this->n);\n-205 new (this->p)B[this->n];\n-206 }\n-207 else\n-208 {\n-209 this->n = 0;\n-210 this->p = nullptr;\n+180 };\n+181#endif\n+182\n+183#if __has_include(\"slu_cdefs.h\")\n+184 template<>\n+185 struct SuperLUDenseMatChooser<_\bs_\bt_\bd::complex >\n+186 {\n+187 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, std::complex\n+*dat, int n1,\n+188 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n+189 {\n+190 cCreate_Dense_Matrix(_\bm_\ba_\bt, n, m, reinterpret_cast< ::complex*>(dat), n1,\n+stype, dtype, mtype);\n+191\n+192 }\n+193\n+194 static void destroy(SuperMatrix* /* mat */)\n+195 {}\n+196 };\n+197\n+198 template<>\n+199 struct SuperLUSolveChooser<_\bs_\bt_\bd::complex >\n+200 {\n+201 static void solve(superlu_options_t *options, SuperMatrix *_\bm_\ba_\bt, int\n+*perm_c, int *perm_r, int *etree,\n+202 char *equed, float *R, float *C, SuperMatrix *L, SuperMatrix *U,\n+203 void *work, int lwork, SuperMatrix *B, SuperMatrix *X,\n+204 float *rpg, float *rcond, float *ferr, float *berr,\n+205 mem_usage_t *memusage, SuperLUStat_t *stat, int *info)\n+206 {\n+207 GlobalLU_t gLU;\n+208 cgssvx(options, _\bm_\ba_\bt, perm_c, perm_r, etree, equed, R, C,\n+209 L, U, work, lwork, B, X, rpg, rcond, ferr, berr,\n+210 &gLU, memusage, stat, info);\n 211 }\n-212\n-213 // Copy number of rows\n-214 rows_ = a.rows_;\n-215 }\n-216\n-217 // and copy the data\n-218 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; in; i++)\n-219 this->p[i]=a.p[i];\n+212 };\n+213\n+214 template<>\n+215 struct QuerySpaceChooser<_\bs_\bt_\bd::complex >\n+216 {\n+217 static void querySpace(SuperMatrix* L, SuperMatrix* U, mem_usage_t*\n+memusage)\n+218 {\n+219 cQuerySpace(L,U,memusage);\n 220 }\n-221\n-222 return *this;\n-223 }\n-224\n-225\n-226 //===== assignment from scalar\n-227\n-_\b2_\b2_\b9 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n-230 {\n-231 (static_cast&>(*this)) = k;\n-232 return *this;\n-233 }\n-234\n-235\n-236 //===== access to components\n-237 // has to be overwritten from base class because it must\n-238 // return access to the windows\n-239\n-_\b2_\b4_\b1 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-242 {\n-243#ifdef DUNE_ISTL_WITH_CHECKING\n-244 if (i>=rows_) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n-245#endif\n-246 return _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be(this->p + i*columns_, columns_);\n-247 }\n-248\n-_\b2_\b5_\b0 _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-251 {\n-252#ifdef DUNE_ISTL_WITH_CHECKING\n-253 if (i<0 || i>=rows_) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n-254#endif\n-255 return _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be(this->p + i*columns_, columns_);\n-256 }\n-257\n-258 // forward declaration\n-259 class ConstIterator;\n-260\n-_\b2_\b6_\b2 class _\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-263 {\n-264 public:\n-_\b2_\b6_\b6 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br ()\n-267 : window_(nullptr,0)\n-268 {\n-269 i = 0;\n-270 }\n-271\n-_\b2_\b7_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br (_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) = default;\n-_\b2_\b7_\b3 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br (_\bI_\bt_\be_\br_\ba_\bt_\bo_\br&& other) = default;\n-274\n-_\b2_\b7_\b6 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br (B* data, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _i)\n-277 : i(_i),\n-278 window_(data + _i*columns, columns)\n-279 {}\n-280\n-_\b2_\b8_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bI_\bt_\be_\br_\ba_\bt_\bo_\br&& other)\n-283 {\n-284 i = other.i;\n-285 // Do NOT use window_.operator=, because that copies the window content,\n-not just the window!\n-286 window_.set(other.window_.getsize(),other.window_.getptr());\n-287 return *this;\n-288 }\n-289\n-_\b2_\b9_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other)\n-292 {\n-293 i = other.i;\n-294 // Do NOT use window_.operator=, because that copies the window content,\n-not just the window!\n-295 window_.set(other.window_.getsize(),other.window_.getptr());\n-296 return *this;\n-297 }\n-298\n-_\b3_\b0_\b0 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-301 {\n-302 ++i;\n-303 window_.setptr(window_.getptr()+window_.getsize());\n-304 return *this;\n-305 }\n-306\n-_\b3_\b0_\b8 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-()\n-309 {\n-310 --i;\n-311 window_.setptr(window_.getptr()-window_.getsize());\n-312 return *this;\n-313 }\n-314\n-_\b3_\b1_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n-317 {\n-318 return window_.getptr() == it.window_.getptr();\n-319 }\n-320\n-_\b3_\b2_\b2 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n-323 {\n-324 return window_.getptr() != it.window_.getptr();\n-325 }\n-326\n-_\b3_\b2_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n-329 {\n-330 return window_.getptr() == it.window_.getptr();\n-331 }\n-332\n-_\b3_\b3_\b4 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n-335 {\n-336 return window_.getptr() != it.window_.getptr();\n-337 }\n+221 };\n+222#endif\n+223\n+224 namespace Impl\n+225 {\n+226 template\n+227 struct SuperLUVectorChooser\n+228 {};\n+229\n+230 template\n+231 struct SuperLUVectorChooser,A > >\n+232 {\n+234 using domain_type = BlockVector<\n+235 FieldVector,\n+236 typename std::allocator_traits::template rebind_alloc >\n+>;\n+238 using range_type = BlockVector<\n+239 FieldVector,\n+240 typename std::allocator_traits::template rebind_alloc >\n+>;\n+241 };\n+242\n+243 template\n+244 struct SuperLUVectorChooser >\n+245 {\n+247 using domain_type = BlockVector;\n+249 using range_type = BlockVector;\n+250 };\n+251 }\n+252\n+266 template\n+_\b2_\b6_\b7 class _\bS_\bu_\bp_\be_\br_\bL_\bU\n+268 : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br<\n+269 typename Impl::SuperLUVectorChooser::domain_type,\n+270 typename Impl::SuperLUVectorChooser::range_type >\n+271 {\n+272 using T = typename M::field_type;\n+273 public:\n+_\b2_\b7_\b5 using _\bM_\ba_\bt_\br_\bi_\bx = M;\n+_\b2_\b7_\b6 using _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be = M;\n+_\b2_\b7_\b8 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx;\n+_\b2_\b8_\b0 typedef _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n+_\b2_\b8_\b2 using _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be = typename Impl::SuperLUVectorChooser::domain_type;\n+_\b2_\b8_\b4 using _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be = typename Impl::SuperLUVectorChooser::range_type;\n+285\n+_\b2_\b8_\b7 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+288 {\n+289 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+290 }\n+291\n+306 explicit _\bS_\bu_\bp_\be_\br_\bL_\bU(const _\bM_\ba_\bt_\br_\bi_\bx& mat, bool verbose=false,\n+307 bool reusevector=true);\n+308\n+309\n+_\b3_\b2_\b0 _\bS_\bu_\bp_\be_\br_\bL_\bU(const _\bM_\ba_\bt_\br_\bi_\bx& mat, const ParameterTree& config)\n+321 : _\bS_\bu_\bp_\be_\br_\bL_\bU(_\bm_\ba_\bt, config._\bg_\be_\bt(\"verbose\", false), config._\bg_\be_\bt\n+(\"reuseVector\", true))\n+322 {}\n+323\n+330 _\bS_\bu_\bp_\be_\br_\bL_\bU();\n+331\n+332 _\b~_\bS_\bu_\bp_\be_\br_\bL_\bU();\n+333\n+337 void _\ba_\bp_\bp_\bl_\by(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res);\n 338\n-_\b3_\b4_\b0 _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b () const\n-341 {\n-342 return window_;\n-343 }\n-344\n-_\b3_\b4_\b6 _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>_\b () const\n-347 {\n-348 return &window_;\n-349 }\n-350\n-351 // return index corresponding to pointer\n-_\b3_\b5_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bi_\bn_\bd_\be_\bx () const\n-353 {\n-354 return i;\n-355 }\n-356\n-_\b3_\b5_\b7 friend class _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-358\n-359 private:\n-360 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i;\n-361 mutable _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be window_;\n-362 };\n-363\n-_\b3_\b6_\b5 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n-366 {\n-367 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, 0);\n-368 }\n-369\n-_\b3_\b7_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n-372 {\n-373 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, rows_);\n-374 }\n-375\n-_\b3_\b7_\b8 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n-379 {\n-380 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, rows_-1);\n-381 }\n-382\n-_\b3_\b8_\b5 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n-386 {\n-387 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, -1);\n-388 }\n-389\n-_\b3_\b9_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-392 {\n-393 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, std::min(i,rows_));\n-394 }\n-395\n-_\b3_\b9_\b7 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-398 {\n-399 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, std::min(i,rows_));\n+_\b3_\b4_\b2 void _\ba_\bp_\bp_\bl_\by (_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, [[maybe_unused]] double\n+reduction, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+343 {\n+344 _\ba_\bp_\bp_\bl_\by(x,b,res);\n+345 }\n+346\n+350 void _\ba_\bp_\bp_\bl_\by(T* x, T* b);\n+351\n+353 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& mat);\n+354\n+_\b3_\b5_\b5 typename SuperLUMatrix::size_type _\bn_\bn_\bz() const\n+356 {\n+357 return mat.nonzeroes();\n+358 }\n+359\n+360 template\n+361 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& mat, const S& rowIndexSet);\n+362\n+363 void _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(bool v);\n+364\n+369 void _\bf_\br_\be_\be();\n+370\n+_\b3_\b7_\b1 const char* _\bn_\ba_\bm_\be() { return \"SuperLU\"; }\n+372 private:\n+373 template\n+_\b3_\b7_\b4 friend class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n+375 friend struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bS_\bu_\bp_\be_\br_\bL_\bU<_\bM_\ba_\bt_\br_\bi_\bx>,true>;\n+376\n+377 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx& getInternalMatrix() { return _\bm_\ba_\bt; }\n+378\n+380 void decompose();\n+381\n+382 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx _\bm_\ba_\bt;\n+383 SuperMatrix L, U, B, X;\n+384 int *perm_c, *perm_r, *etree;\n+385 typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be *R, *C;\n+386 T *bstore;\n+387 superlu_options_t options;\n+388 char equed;\n+389 void *work;\n+390 int lwork;\n+391 bool first, verbose, reusevector;\n+392 };\n+393\n+394 template\n+395 SuperLU\n+_\b3_\b9_\b6 ::~SuperLU()\n+397 {\n+398 if(_\bm_\ba_\bt._\bN()+_\bm_\ba_\bt._\bM()>0)\n+399 free();\n 400 }\n 401\n-_\b4_\b0_\b3 class _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+402 template\n+_\b4_\b0_\b3 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bf_\br_\be_\be()\n 404 {\n-405 public:\n-_\b4_\b0_\b7 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ()\n-408 : window_(nullptr,0)\n-409 {\n-410 i = 0;\n-411 }\n-412\n-_\b4_\b1_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br (const B* data, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _i)\n-415 : i(_i),\n-416 window_(const_cast(data + _i * columns), columns)\n-417 {}\n-418\n-_\b4_\b2_\b0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br (const _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it)\n-421 : i(it.i), window_(it.window_.getptr(),it.window_.getsize())\n-422 {}\n-423\n-_\b4_\b2_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bI_\bt_\be_\br_\ba_\bt_\bo_\br&& other)\n-425 {\n-426 i = other.i;\n-427 // Do NOT use window_.operator=, because that copies the window content,\n-not just the window!\n-428 window_.set(other.window_.getsize(),other.window_.getptr());\n-429 return *this;\n+405 delete[] perm_c;\n+406 delete[] perm_r;\n+407 delete[] etree;\n+408 delete[] R;\n+409 delete[] C;\n+410 if(lwork>=0) {\n+411 Destroy_SuperNode_Matrix(&L);\n+412 Destroy_CompCol_Matrix(&U);\n+413 }\n+414 lwork=0;\n+415 if(!first && reusevector) {\n+416 SUPERLU_FREE(B.Store);\n+417 SUPERLU_FREE(X.Store);\n+418 }\n+419 _\bm_\ba_\bt.free();\n+420 }\n+421\n+422 template\n+423 _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>\n+_\b4_\b2_\b4_\b _\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU(const _\bM_\ba_\bt_\br_\bi_\bx& mat_, bool verbose_, bool reusevector_)\n+425 : work(0), lwork(0), first(true), verbose(verbose_),\n+426 reusevector(reusevector_)\n+427 {\n+428 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(mat_);\n+429\n 430 }\n-431\n-_\b4_\b3_\b2 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other)\n-433 {\n-434 i = other.i;\n-435 // Do NOT use window_.operator=, because that copies the window content,\n-not just the window!\n-436 window_.set(other.window_.getsize(),other.window_.getptr());\n-437 return *this;\n-438 }\n-439\n-_\b4_\b4_\b1 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-442 {\n-443 ++i;\n-444 window_.setptr(window_.getptr()+window_.getsize());\n-445 return *this;\n-446 }\n-447\n-_\b4_\b4_\b9 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-()\n-450 {\n-451 --i;\n-452 window_.setptr(window_.getptr()-window_.getsize());\n-453 return *this;\n-454 }\n-455\n-_\b4_\b5_\b7 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n-458 {\n-459 return window_.getptr() == it.window_.getptr();\n-460 }\n-461\n-_\b4_\b6_\b3 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n-464 {\n-465 return window_.getptr() != it.window_.getptr();\n-466 }\n-467\n-_\b4_\b6_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n-470 {\n-471 return window_.getptr() == it.window_.getptr();\n-472 }\n+431 template\n+_\b4_\b3_\b2 _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU()\n+433 : work(0), lwork(0),verbose(false),\n+434 reusevector(false)\n+435 {}\n+436 template\n+_\b4_\b3_\b7 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(bool v)\n+438 {\n+439 verbose=v;\n+440 }\n+441\n+442 template\n+_\b4_\b4_\b3 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& mat_)\n+444 {\n+445 if(_\bm_\ba_\bt._\bN()+_\bm_\ba_\bt._\bM()>0) {\n+446 free();\n+447 }\n+448 lwork=0;\n+449 work=0;\n+450 //a=&mat_;\n+451 _\bm_\ba_\bt=mat_;\n+452 decompose();\n+453 }\n+454\n+455 template\n+456 template\n+_\b4_\b5_\b7 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& mat_,\n+458 const S& mrs)\n+459 {\n+460 if(_\bm_\ba_\bt._\bN()+_\bm_\ba_\bt._\bM()>0) {\n+461 free();\n+462 }\n+463 lwork=0;\n+464 work=0;\n+465 //a=&mat_;\n+466 _\bm_\ba_\bt.setMatrix(mat_,mrs);\n+467 decompose();\n+468 }\n+469\n+470 template\n+471 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>_\b:_\b:_\bd_\be_\bc_\bo_\bm_\bp_\bo_\bs_\be()\n+472 {\n 473\n-_\b4_\b7_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n-476 {\n-477 return window_.getptr() != it.window_.getptr();\n-478 }\n-479\n-_\b4_\b8_\b1 const _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b () const\n-482 {\n-483 return window_;\n-484 }\n-485\n-_\b4_\b8_\b7 const _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>_\b () const\n-488 {\n-489 return &window_;\n-490 }\n-491\n-492 // return index corresponding to pointer\n-_\b4_\b9_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bi_\bn_\bd_\be_\bx () const\n-494 {\n-495 return i;\n-496 }\n-497\n-_\b4_\b9_\b8 friend class _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-499\n-500 private:\n-501 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i;\n-502 mutable _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be window_;\n-503 };\n-504\n-_\b5_\b0_\b6 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br = _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-507\n-_\b5_\b0_\b9 using _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br = _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+474 first = true;\n+475 perm_c = new int[_\bm_\ba_\bt._\bM()];\n+476 perm_r = new int[_\bm_\ba_\bt._\bN()];\n+477 etree = new int[_\bm_\ba_\bt._\bM()];\n+478 R = new typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be[_\bm_\ba_\bt._\bN()];\n+479 C = new typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be[_\bm_\ba_\bt._\bM()];\n+480\n+481 set_default_options(&options);\n+482 // Do the factorization\n+483 B.ncol=0;\n+484 B.Stype=SLU_DN;\n+485 B.Dtype=_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be;\n+486 B.Mtype= SLU_GE;\n+487 DNformat fakeFormat;\n+488 fakeFormat.lda=_\bm_\ba_\bt._\bN();\n+489 B.Store=&fakeFormat;\n+490 X.Stype=SLU_DN;\n+491 X.Dtype=_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be;\n+492 X.Mtype= SLU_GE;\n+493 X.ncol=0;\n+494 X.Store=&fakeFormat;\n+495\n+496 typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be rpg, rcond, ferr=1e10, berr=1e10;\n+497 int info;\n+498 mem_usage_t memusage;\n+499 SuperLUStat_t stat;\n+500\n+501 StatInit(&stat);\n+502 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be(&options, &static_cast(_\bm_\ba_\bt),\n+perm_c, perm_r, etree, &equed, R, C,\n+503 &L, &U, work, lwork, &B, &X, &rpg, &rcond, &ferr,\n+504 &berr, &memusage, &stat, &info);\n+505\n+506 if(verbose) {\n+507 dinfo<<\"LU factorization: dgssvx() returns info \"<< info<(_\bm_\ba_\bt).ncol;\n 510\n-_\b5_\b1_\b2 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n-513 {\n-514 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, 0);\n-515 }\n-516\n-_\b5_\b1_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n-519 {\n-520 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, rows_);\n-521 }\n-522\n-_\b5_\b2_\b5 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd() const\n-526 {\n-527 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, rows_-1);\n-528 }\n-529\n-_\b5_\b3_\b1 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\be_\bn_\bd () const\n-532 {\n-533 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, -1);\n-534 }\n-535\n-536 //===== sizes\n-537\n-_\b5_\b3_\b9 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN () const\n-540 {\n-541 return rows_;\n-542 }\n-543\n-544\n-545 private:\n-546 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows_; // number of matrix rows\n-547 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns_; // number of matrix columns\n-548\n-549 A allocator_;\n-550 };\n-551\n-552} // namespace MatrixImp\n-553\n-559 template >\n-_\b5_\b6_\b0 class _\bM_\ba_\bt_\br_\bi_\bx\n-561 {\n-562 public:\n-563\n-_\b5_\b6_\b5 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n-566\n-_\b5_\b6_\b8 typedef T _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-569\n-_\b5_\b7_\b1 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n-572\n-_\b5_\b7_\b4 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n-575\n-_\b5_\b7_\b7 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-578\n-_\b5_\b8_\b0 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-581\n-_\b5_\b8_\b3 typedef typename row_type::iterator _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-584\n-_\b5_\b8_\b6 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-587\n-_\b5_\b8_\b9 typedef typename row_type::const_iterator _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-590\n-_\b5_\b9_\b2 _\bM_\ba_\bt_\br_\bi_\bx() : _\bd_\ba_\bt_\ba_\b_(0,0), _\bc_\bo_\bl_\bs_\b_(0)\n-593 {}\n-594\n-_\b5_\b9_\b7 _\bM_\ba_\bt_\br_\bi_\bx(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be cols) : _\bd_\ba_\bt_\ba_\b_(rows,cols), _\bc_\bo_\bl_\bs_\b_(cols)\n-598 {}\n+511 if ( info == 0 || info == nSuperLUCol+1 ) {\n+512\n+513 if ( options.PivotGrowth )\n+514 dinfo<<\"Recip. pivot growth = \"<nnz<nnz<nnz + Ustore->nnz -\n+nSuperLUCol<_\b:_\b:_\bq_\bu_\be_\br_\by_\bS_\bp_\ba_\bc_\be(&L, &U, &memusage);\n+523 dinfo<<\"L\\\\U MB \"< 0 && lwork == -1 ) { // Memory allocation failed\n+528 dinfo<<\"** Estimated memory: \"<< info - nSuperLUCol<colptr[i]; c < Ustore->colptr[i+1]; ++c)\n+540 //if(Ustore->rowind[c]==i)\n+541 std::cout<rowind[c]<<\"->\"<<((double*)Ustore->nzval)[c]<<\" \";\n+542 if(k==0){\n+543 //\n+544 k=-1;\n+545 }std::cout<colptr[i]; c < Ustore->colptr[i+1]; ++c)\n+551 //if(Ustore->rowind[c]==i)\n+552 std::cout<rowind[c]<<\"->\"<<((double*)Ustore->nzval)[c]<<\" \";\n+553 if(k==0){\n+554 //\n+555 k=-1;\n+556 }std::cout<\n+562 void SuperLU\n+_\b5_\b6_\b3 ::apply(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+564 {\n+565 if (_\bm_\ba_\bt._\bN() != b.dim())\n+566 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Size of right-hand-side vector b does not match the\n+number of matrix rows!\");\n+567 if (_\bm_\ba_\bt._\bM() != x.dim())\n+568 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Size of solution vector x does not match the number\n+of matrix columns!\");\n+569 if (_\bm_\ba_\bt._\bM()+_\bm_\ba_\bt._\bN()==0)\n+570 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Matrix of SuperLU is null!\");\n+571\n+572 SuperMatrix* mB = &B;\n+573 SuperMatrix* mX = &X;\n+574 SuperMatrix rB, rX;\n+575 if (reusevector) {\n+576 if(first) {\n+577 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&B, (int)_\bm_\ba_\bt._\bN(), 1, reinterpret_cast\n+(&b[0]), (int)_\bm_\ba_\bt._\bN(), SLU_DN, _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n+578 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&X, (int)_\bm_\ba_\bt._\bN(), 1, reinterpret_cast\n+(&x[0]), (int)_\bm_\ba_\bt._\bN(), SLU_DN, _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n+579 first=false;\n+580 }else{\n+581 ((DNformat*)B.Store)->nzval=&b[0];\n+582 ((DNformat*)X.Store)->nzval=&x[0];\n+583 }\n+584 } else {\n+585 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&rB, (int)_\bm_\ba_\bt._\bN(), 1,\n+reinterpret_cast(&b[0]), (int)_\bm_\ba_\bt._\bN(), SLU_DN, _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be,\n+SLU_GE);\n+586 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&rX, (int)_\bm_\ba_\bt._\bN(), 1,\n+reinterpret_cast(&x[0]), (int)_\bm_\ba_\bt._\bN(), SLU_DN, _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be,\n+SLU_GE);\n+587 mB = &rB;\n+588 mX = &rX;\n+589 }\n+590 typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be rpg, rcond, ferr=1e10, berr;\n+591 int info;\n+592 mem_usage_t memusage;\n+593 SuperLUStat_t stat;\n+594 /* Initialize the statistics variables. */\n+595 StatInit(&stat);\n+596 /*\n+597 range_type d=b;\n+598 a->usmv(-1, x, d);\n 599\n-_\b6_\b0_\b4 void _\bs_\be_\bt_\bS_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be cols) {\n-605 _\bd_\ba_\bt_\ba_\b_.resize(rows,cols);\n-606 _\bc_\bo_\bl_\bs_\b_ = cols;\n-607 }\n-608\n-_\b6_\b1_\b0 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn()\n-611 {\n-612 return _\bd_\ba_\bt_\ba_\b_.begin();\n-613 }\n-614\n-_\b6_\b1_\b6 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd()\n-617 {\n-618 return _\bd_\ba_\bt_\ba_\b_.end();\n-619 }\n-620\n-_\b6_\b2_\b3 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n-624 {\n-625 return _\bd_\ba_\bt_\ba_\b_.beforeEnd();\n-626 }\n+600 double def0=d.two_norm();\n+601 */\n+602 options.IterRefine=SLU_DOUBLE;\n+603\n+604 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be(&options, &static_cast(_\bm_\ba_\bt),\n+perm_c, perm_r, etree, &equed, R, C,\n+605 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,\n+606 &memusage, &stat, &info);\n+607\n+608 res._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs=1;\n+609\n+610 /*\n+611 if(options.Equil==YES)\n+612 // undo scaling of right hand side\n+613 std::transform(reinterpret_cast(&b[0]),reinterpret_cast(&b\n+[0])+mat.M(),\n+614 C, reinterpret_cast(&d[0]), std::divides());\n+615 else\n+616 d=b;\n+617 a->usmv(-1, x, d);\n+618 res.reduction=d.two_norm()/def0;\n+619 res.conv_rate = res.reduction;\n+620 res.converged=(res.reduction<1e-10||d.two_norm()<1e-18);\n+621 */\n+622 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd=true;\n+623\n+624 if(verbose) {\n+625\n+626 dinfo<<\"Triangular solve: dgssvx() returns info \"<< info<(_\bm_\ba_\bt).ncol;\n+629\n+630 if ( info == 0 || info == nSuperLUCol+1 ) {\n+631\n+632 if ( options.IterRefine ) {\n+633 std::cout<<\"Iterative Refinement: steps=\"\n+634 < 0 && lwork == -1 ) { // Memory allocation failed\n+638 std::cout<<\"** Estimated memory: \"<< info - nSuperLUCol<<\" bytes\"<=_\bN())\n-674 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Row index out of range!\");\n-675#endif\n-676 return _\bd_\ba_\bt_\ba_\b_[row];\n-677 }\n-678\n-_\b6_\b8_\b0 const _\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row) const {\n-681#ifdef DUNE_ISTL_WITH_CHECKING\n-682 if (row<0)\n-683 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Can't access negative rows!\");\n-684 if (row>=_\bN())\n-685 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Row index out of range!\");\n-686#endif\n-687 return _\bd_\ba_\bt_\ba_\b_[row];\n-688 }\n-689\n-_\b6_\b9_\b1 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN() const {\n-692 return _\bd_\ba_\bt_\ba_\b_.N();\n-693 }\n-694\n-_\b6_\b9_\b6 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bM() const {\n-697 return _\bc_\bo_\bl_\bs_\b_;\n-698 }\n-699\n-_\b7_\b0_\b1 _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=(const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& scalar) {\n-702 _\bd_\ba_\bt_\ba_\b_ *= scalar;\n-703 return (*this);\n-704 }\n-705\n-_\b7_\b0_\b7 _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=(const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& scalar) {\n-708 _\bd_\ba_\bt_\ba_\b_ /= scalar;\n-709 return (*this);\n-710 }\n-711\n-_\b7_\b1_\b7 _\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bM_\ba_\bt_\br_\bi_\bx& b) {\n-718#ifdef DUNE_ISTL_WITH_CHECKING\n-719 if(_\bN()!=b._\bN() || _\bM() != b._\bM())\n-720 DUNE_THROW(RangeError, \"Matrix sizes do not match!\");\n-721#endif\n-722 _\bd_\ba_\bt_\ba_\b_ += b._\bd_\ba_\bt_\ba_\b_;\n-723 return (*this);\n-724 }\n-725\n-_\b7_\b3_\b1 _\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bM_\ba_\bt_\br_\bi_\bx& b) {\n-732#ifdef DUNE_ISTL_WITH_CHECKING\n-733 if(_\bN()!=b._\bN() || _\bM() != b._\bM())\n-734 DUNE_THROW(RangeError, \"Matrix sizes do not match!\");\n-735#endif\n-736 _\bd_\ba_\bt_\ba_\b_ -= b._\bd_\ba_\bt_\ba_\b_;\n-737 return (*this);\n-738 }\n-739\n-_\b7_\b4_\b1 _\bM_\ba_\bt_\br_\bi_\bx _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be() const {\n-742 _\bM_\ba_\bt_\br_\bi_\bx out(_\bM(), _\bN());\n-743 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bN(); i++)\n-744 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bM(); j++)\n-745 out[j][i] = (*this)[i][j];\n-746\n-747 return out;\n-748 }\n-749\n-_\b7_\b5_\b1 friend _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*(const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& m1, const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& m2) {\n-752 _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b> out(m1._\bN(), m2._\bM());\n-753 out = 0;\n+641 if ( options.PrintStat ) StatPrint(&stat);\n+642 }\n+643 StatFree(&stat);\n+644 if (!reusevector) {\n+645 SUPERLU_FREE(rB.Store);\n+646 SUPERLU_FREE(rX.Store);\n+647 }\n+648 }\n+649\n+650 template\n+651 void _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\bM_\b>\n+_\b6_\b5_\b2_\b _\b:_\b:_\ba_\bp_\bp_\bl_\by(T* x, T* b)\n+653 {\n+654 if(_\bm_\ba_\bt._\bN()+_\bm_\ba_\bt._\bM()==0)\n+655 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Matrix of SuperLU is null!\");\n+656\n+657 SuperMatrix* mB = &B;\n+658 SuperMatrix* mX = &X;\n+659 SuperMatrix rB, rX;\n+660 if (reusevector) {\n+661 if(first) {\n+662 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&B, _\bm_\ba_\bt._\bN(), 1, b, _\bm_\ba_\bt._\bN(), SLU_DN,\n+_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n+663 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&X, _\bm_\ba_\bt._\bN(), 1, x, _\bm_\ba_\bt._\bN(), SLU_DN,\n+_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n+664 first=false;\n+665 }else{\n+666 ((DNformat*) B.Store)->nzval=b;\n+667 ((DNformat*)X.Store)->nzval=x;\n+668 }\n+669 } else {\n+670 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&rB, _\bm_\ba_\bt._\bN(), 1, b, _\bm_\ba_\bt._\bN(), SLU_DN,\n+_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n+671 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&rX, _\bm_\ba_\bt._\bN(), 1, x, _\bm_\ba_\bt._\bN(), SLU_DN,\n+_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be, SLU_GE);\n+672 mB = &rB;\n+673 mX = &rX;\n+674 }\n+675\n+676 typename _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be rpg, rcond, ferr=1e10, berr;\n+677 int info;\n+678 mem_usage_t memusage;\n+679 SuperLUStat_t stat;\n+680 /* Initialize the statistics variables. */\n+681 StatInit(&stat);\n+682\n+683 options.IterRefine=SLU_DOUBLE;\n+684\n+685 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be(&options, &static_cast(_\bm_\ba_\bt),\n+perm_c, perm_r, etree, &equed, R, C,\n+686 &L, &U, work, lwork, mB, mX, &rpg, &rcond, &ferr, &berr,\n+687 &memusage, &stat, &info);\n+688\n+689 if(verbose) {\n+690 dinfo<<\"Triangular solve: dgssvx() returns info \"<< info<(_\bm_\ba_\bt).ncol;\n+693\n+694 if ( info == 0 || info == nSuperLUCol+1 ) { // Factorization has succeeded\n+695\n+696 if ( options.IterRefine ) {\n+697 dinfo<<\"Iterative Refinement: steps=\"\n+698 < 0 && lwork == -1 ) { // Memory allocation failed\n+702 dinfo<<\"** Estimated memory: \"<< info - nSuperLUCol<<\" bytes\"<\n+_\b7_\b1_\b6 struct _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br<_\bS_\bu_\bp_\be_\br_\bL_\bU<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx > >\n+717 {\n+_\b7_\b1_\b8 enum { _\bv_\ba_\bl_\bu_\be=true};\n+719 };\n+720\n+721 template\n+_\b7_\b2_\b2 struct _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd<_\bS_\bu_\bp_\be_\br_\bL_\bU<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx > >\n+723 {\n+_\b7_\b2_\b4 enum { _\bv_\ba_\bl_\bu_\be = true };\n+725 };\n+726\n+_\b7_\b2_\b7 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br {\n+_\b7_\b2_\b8 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::false_type{};\n+_\b7_\b2_\b9 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk<_\bD_\bu_\bn_\be::FieldVector> : std::\n+true_type{};\n+_\b7_\b3_\b0 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk<_\bD_\bu_\bn_\be::FieldVector,k>> : std::true_type{};\n+731 template\n+732 std::shared_ptr::type,\n+733 typename Dune::TypeListElement<2, TL>::type>>\n+_\b7_\b3_\b4 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& _\bm_\ba_\bt, const Dune::ParameterTree& config,\n+735 std::enable_if_t<_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk::type::\n+block_type>::value,int> = 0) const\n+736 {\n+737 int verbose = config.get(\"verbose\", 0);\n+738 return std::make_shared>(_\bm_\ba_\bt,verbose);\n+739 }\n+740\n+741 // second version with SFINAE to validate the template parameters of\n+SuperLU\n+742 template\n+743 std::shared_ptr::type,\n+744 typename Dune::TypeListElement<2, TL>::type>>\n+_\b7_\b4_\b5 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /\n+*config*/,\n+746 std::enable_if_t::\n+type::block_type>::value,int> = 0) const\n+747 {\n+748 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be,\n+749 \"Unsupported Type in SuperLU (only double and std::complex\n+supported)\");\n+750 }\n+751 };\n+_\b7_\b5_\b2 template<> struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::true_type{};\n+_\b7_\b5_\b3 template<> struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk<_\bs_\bt_\bd::complex> :\n+std::true_type{};\n 754\n-755 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b7_\b6_\b6 friend Y _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*(const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& m, const X& vec) {\n-767#ifdef DUNE_ISTL_WITH_CHECKING\n-768 if (m._\bM()!=vec.size())\n-769 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Vector size doesn't match the number of matrix\n-columns!\");\n-770#endif\n-771 Y out(m._\bN());\n-772 out = 0;\n-773\n-774 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b7_\b8_\b4 void _\bm_\bv(const X& x, Y& y) const\n-785 {\n-786#ifdef DUNE_ISTL_WITH_CHECKING\n-787 if (x.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-788 if (y.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-789#endif\n-790 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++) {\n-791 y[i]=0;\n-792 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n-793 {\n-794 auto&& xj = Impl::asVector(x[j]);\n-795 auto&& yi = Impl::asVector(y[i]);\n-796 Impl::asMatrix((*this)[i][j]).umv(xj, yi);\n-797 }\n-798 }\n-799 }\n-800\n-802 template\n-_\b8_\b0_\b3 void _\bm_\bt_\bv (const X& x, Y& y) const\n-804 {\n-805#ifdef DUNE_ISTL_WITH_CHECKING\n-806 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n-807 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n-808#endif\n-809 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b8_\b1_\b6 void _\bu_\bm_\bv(const X& x, Y& y) const\n-817 {\n-818#ifdef DUNE_ISTL_WITH_CHECKING\n-819 if (x.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-820 if (y.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-821#endif\n-822 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n-823 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n-824 {\n-825 auto&& xj = Impl::asVector(x[j]);\n-826 auto&& yi = Impl::asVector(y[i]);\n-827 Impl::asMatrix((*this)[i][j]).umv(xj, yi);\n-828 }\n-829 }\n-830\n-832 template\n-_\b8_\b3_\b3 void _\bm_\bm_\bv (const X& x, Y& y) const\n-834 {\n-835#ifdef DUNE_ISTL_WITH_CHECKING\n-836 if (x.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-837 if (y.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-838#endif\n-839 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n-840 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n-841 {\n-842 auto&& xj = Impl::asVector(x[j]);\n-843 auto&& yi = Impl::asVector(y[i]);\n-844 Impl::asMatrix((*this)[i][j]).mmv(xj, yi);\n-845 }\n-846 }\n-847\n-849 template \n-_\b8_\b5_\b0 void _\bu_\bs_\bm_\bv(const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const\n-851 {\n-852#ifdef DUNE_ISTL_WITH_CHECKING\n-853 if (x.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-854 if (y.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-855#endif\n-856 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n-857 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n-858 {\n-859 auto&& xj = Impl::asVector(x[j]);\n-860 auto&& yi = Impl::asVector(y[i]);\n-861 Impl::asMatrix((*this)[i][j]).usmv(alpha, xj, yi);\n-862 }\n-863 }\n-864\n-866 template\n-_\b8_\b6_\b7 void _\bu_\bm_\bt_\bv (const X& x, Y& y) const\n-868 {\n-869#ifdef DUNE_ISTL_WITH_CHECKING\n-870 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-871 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-872#endif\n-873 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n-874 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n-875 {\n-876 auto&& xi = Impl::asVector(x[i]);\n-877 auto&& yj = Impl::asVector(y[j]);\n-878 Impl::asMatrix((*this)[i][j]).umtv(xi, yj);\n-879 }\n-880 }\n-881\n-883 template\n-_\b8_\b8_\b4 void _\bm_\bm_\bt_\bv (const X& x, Y& y) const\n-885 {\n-886#ifdef DUNE_ISTL_WITH_CHECKING\n-887 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-888 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-889#endif\n-890 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n-891 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n-892 {\n-893 auto&& xi = Impl::asVector(x[i]);\n-894 auto&& yj = Impl::asVector(y[j]);\n-895 Impl::asMatrix((*this)[i][j]).mmtv(xi, yj);\n-896 }\n-897 }\n-898\n-900 template\n-_\b9_\b0_\b1 void _\bu_\bs_\bm_\bt_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const\n-902 {\n-903#ifdef DUNE_ISTL_WITH_CHECKING\n-904 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-905 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-906#endif\n-907 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n-908 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n-909 {\n-910 auto&& xi = Impl::asVector(x[i]);\n-911 auto&& yj = Impl::asVector(y[j]);\n-912 Impl::asMatrix((*this)[i][j]).usmtv(alpha, xi, yj);\n-913 }\n-914 }\n-915\n-917 template\n-_\b9_\b1_\b8 void _\bu_\bm_\bh_\bv (const X& x, Y& y) const\n-919 {\n-920#ifdef DUNE_ISTL_WITH_CHECKING\n-921 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-922 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-923#endif\n-924 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n-925 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n-926 {\n-927 auto&& xi = Impl::asVector(x[i]);\n-928 auto&& yj = Impl::asVector(y[j]);\n-929 Impl::asMatrix((*this)[i][j]).umhv(xi,yj);\n-930 }\n-931 }\n-932\n-934 template\n-_\b9_\b3_\b5 void _\bm_\bm_\bh_\bv (const X& x, Y& y) const\n-936 {\n-937#ifdef DUNE_ISTL_WITH_CHECKING\n-938 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-939 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-940#endif\n-941 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n-942 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n-943 {\n-944 auto&& xi = Impl::asVector(x[i]);\n-945 auto&& yj = Impl::asVector(y[j]);\n-946 Impl::asMatrix((*this)[i][j]).mmhv(xi,yj);\n-947 }\n-948 }\n-949\n-951 template\n-_\b9_\b5_\b2 void _\bu_\bs_\bm_\bh_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const\n-953 {\n-954#ifdef DUNE_ISTL_WITH_CHECKING\n-955 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-956 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n-957#endif\n-958 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n-959 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n-960 {\n-961 auto&& xi = Impl::asVector(x[i]);\n-962 auto&& yj = Impl::asVector(y[j]);\n-963 Impl::asMatrix((*this)[i][j]).usmhv(alpha,xi,yj);\n-964 }\n-965 }\n-966\n-967 //===== norms\n-968\n-_\b9_\b7_\b0 typename FieldTraits::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm () const\n-971 {\n-972 return std::sqrt(_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2());\n-973 }\n-974\n-_\b9_\b7_\b6 typename FieldTraits::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2 () const\n-977 {\n-978 typename FieldTraits::real_type sum=0;\n-979 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i_\bN(); i++)\n-980 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j_\bM(); j++)\n-981 sum += Impl::asMatrix(_\bd_\ba_\bt_\ba_\b_[i][j]).frobenius_norm2();\n-982 return sum;\n-983 }\n-984\n-986 template ::value, int>::type = 0>\n-_\b9_\b8_\b8 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n-989 using real_type = typename FieldTraits::real_type;\n-990 using std::max;\n-991\n-992 real_type norm = 0;\n-993 for (auto const &x : *this) {\n-994 real_type sum = 0;\n-995 for (auto const &y : x)\n-996 sum += Impl::asMatrix(y).infinity_norm();\n-997 norm = max(sum, norm);\n-998 isNaN += sum;\n-999 }\n-1000\n-1001 return norm;\n-1002 }\n-1003\n-1005 template ::value, int>::type = 0>\n-_\b1_\b0_\b0_\b7 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n-1008 using real_type = typename FieldTraits::real_type;\n-1009 using std::max;\n-1010\n-1011 real_type norm = 0;\n-1012 for (auto const &x : *this) {\n-1013 real_type sum = 0;\n-1014 for (auto const &y : x)\n-1015 sum += Impl::asMatrix(y).infinity_norm_real();\n-1016 norm = max(sum, norm);\n-1017 }\n-1018 return norm;\n-1019 }\n-1020\n-1022 template ::value, int>::type = 0>\n-_\b1_\b0_\b2_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n-1025 using real_type = typename FieldTraits::real_type;\n-1026 using std::max;\n-1027\n-1028 real_type norm = 0;\n-1029 real_type isNaN = 1;\n-1030 for (auto const &x : *this) {\n-1031 real_type sum = 0;\n-1032 for (auto const &y : x)\n-1033 sum += Impl::asMatrix(y).infinity_norm();\n-1034 norm = max(sum, norm);\n-1035 isNaN += sum;\n-1036 }\n-1037\n-1038 return norm * (isNaN / isNaN);\n-1039 }\n-1040\n-1042 template ::value, int>::type = 0>\n-_\b1_\b0_\b4_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n-1045 using real_type = typename FieldTraits::real_type;\n-1046 using std::max;\n-1047\n-1048 real_type norm = 0;\n-1049 real_type isNaN = 1;\n-1050 for (auto const &x : *this) {\n-1051 real_type sum = 0;\n-1052 for (auto const &y : x)\n-1053 sum += Impl::asMatrix(y).infinity_norm_real();\n-1054 norm = max(sum, norm);\n-1055 isNaN += sum;\n-1056 }\n-1057\n-1058 return norm * (isNaN / isNaN);\n-1059 }\n-1060\n-1061 //===== query\n-1062\n-_\b1_\b0_\b6_\b4 bool _\be_\bx_\bi_\bs_\bt_\bs ([[maybe_unused]] _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, [[maybe_unused]] _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n-const\n-1065 {\n-1066#ifdef DUNE_ISTL_WITH_CHECKING\n-1067 if (i<0 || i>=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"row index out of range\");\n-1068 if (j<0 || i>=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"column index out of range\");\n-1069#endif\n-1070 return true;\n-1071 }\n-1072\n-1073 protected:\n-1074\n-_\b1_\b0_\b7_\b7 _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\bT_\b,_\bA_\b> _\bd_\ba_\bt_\ba_\b_;\n-1078\n-_\b1_\b0_\b8_\b4 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bs_\b_;\n-1085 };\n-1086\n-1087 template\n-_\b1_\b0_\b8_\b8 struct FieldTraits< _\bM_\ba_\bt_\br_\bi_\bx >\n-1089 {\n-_\b1_\b0_\b9_\b0 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\b _\bA_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b1_\b0_\b9_\b1 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename FieldTraits::real_type;\n-1092 };\n-1093\n-1095} // end namespace Dune\n-1096\n-1097#endif\n-_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n-Helper functions for determining the vector/matrix block level.\n+_\b7_\b5_\b5 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"superlu\", _\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br());\n+756} // end namespace DUNE\n+757\n+758// undefine macros from SuperLU's slu_util.h\n+759#undef FIRSTCOL_OF_SNODE\n+760#undef NO_MARKER\n+761#undef NUM_TEMPV\n+762#undef USER_ABORT\n+763#undef USER_MALLOC\n+764#undef SUPERLU_MALLOC\n+765#undef USER_FREE\n+766#undef SUPERLU_FREE\n+767#undef CHECK_MALLOC\n+768#undef SUPERLU_MAX\n+769#undef SUPERLU_MIN\n+770#undef L_SUB_START\n+771#undef L_SUB\n+772#undef L_NZ_START\n+773#undef L_FST_SUPC\n+774#undef U_NZ_START\n+775#undef U_SUB\n+776#undef TRUE\n+777#undef FALSE\n+778#undef EMPTY\n+779#undef NODROP\n+780#undef DROP_BASIC\n+781#undef DROP_PROWS\n+782#undef DROP_COLUMN\n+783#undef DROP_AREA\n+784#undef DROP_SECONDARY\n+785#undef DROP_DYNAMIC\n+786#undef DROP_INTERP\n+787#undef MILU_ALPHA\n+788\n+789#endif // HAVE_SUPERLU\n+790#endif // DUNE_SUPERLU_HH\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n _\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n+Implementations of the inverse operator interface.\n+_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n+Templates characterizing the type of a solver.\n+_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR\n+#define DUNE_REGISTER_DIRECT_SOLVER(name,...)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:13\n _\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n This file implements a vector space as a tensor product of a given vector\n space. The number of compon...\n+_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+_\bs_\bu_\bp_\be_\br_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n+void setSubMatrix(const Matrix &mat, const S &rowIndexSet)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:457\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(domain_type &x, range_type &b, InverseOperatorResult &res)\n+Apply inverse operator,.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:563\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by\n+void setVerbosity(bool v)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:437\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bf_\br_\be_\be\n+void free()\n+free allocated space.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:403\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\b~_\bS_\bu_\bp_\be_\br_\bL_\bU\n+~SuperLU()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:396\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU\n+SuperLU()\n+Empty default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:432\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+void setMatrix(const Matrix &mat)\n+Initialize data from given matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:443\n+_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-A vector of blocks with memory management.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n derive error class from the base class in common\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be\n-A Vector of blocks with different blocksizes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be\n-Imp::BlockVectorWindow< B, A > window_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-BlockVector< B, A > block_type\n-Same as value_type, here for historical reasons.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-DenseMatrixBase & operator=(const DenseMatrixBase &a)\n-assignment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< B >::field_type field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-Iterator beforeBegin() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:385\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-void resize(size_type rows, size_type columns)\n-same effect as constructor with same argument\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-const window_type const_reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be\n-DenseMatrixBase(size_type rows, size_type columns)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\be_\bn_\bd\n-Iterator end()\n-end Iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:371\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-reference operator[](size_type i)\n-random access to blocks\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:241\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-BlockVector< B, A > value_type\n-Type of the elements of the outer vector, i.e., dynamic vectors of B.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bf_\bi_\bn_\bd\n-Iterator find(size_type i)\n-random access returning iterator (end if not contained)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:391\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bN\n-size_type N() const\n-number of blocks in the vector (are of variable size here)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:539\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-ConstIterator beforeEnd() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:525\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\be_\bn_\bd\n-ConstIterator end() const\n-end ConstIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:518\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-window_type reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\br_\be_\bn_\bd\n-ConstIterator rend() const\n-end ConstIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:531\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-Iterator beforeEnd()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:378\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-ConstIterator begin() const\n-begin ConstIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:512\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n-A allocator_type\n-export the allocator type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be\n-DenseMatrixBase()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bf_\bi_\bn_\bd\n-ConstIterator find(size_type i) const\n-random access returning iterator (end if not contained)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:397\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-The size type for the index access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\b~_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be\n-~DenseMatrixBase()\n-free dynamic memory\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-Iterator begin()\n-begin Iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:365\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be\n-DenseMatrixBase(const DenseMatrixBase &a)\n-copy constructor, has copy semantics\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:263\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-\n-Iterator & operator--()\n-prefix decrement\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:308\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n-size_type index() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:352\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator(Iterator &other)=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator(Iterator &&other)=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const Iterator &it) const\n-inequality\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:322\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-Iterator & operator=(Iterator &&other)\n-Move assignment.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:282\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-Iterator & operator++()\n-prefix increment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:300\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator()\n-constructor, no arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:266\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-window_type & operator*() const\n-dereferencing\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:340\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const Iterator &it) const\n-equality\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:316\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-Iterator & operator=(Iterator &other)\n-Copy assignment.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:291\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator(B *data, size_type columns, size_type _i)\n-constructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:276\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>\n-window_type * operator->() const\n-arrow\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:346\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:404\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>\n-const window_type * operator->() const\n-arrow\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:487\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-const window_type & operator*() const\n-dereferencing\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:481\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-ConstIterator & operator++()\n-prefix increment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:441\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator(const B *data, size_type columns, size_type _i)\n-constructor from pointer\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:414\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-\n-ConstIterator & operator--()\n-prefix decrement\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:449\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator(const Iterator &it)\n-constructor from non_const iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:420\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const ConstIterator &it) const\n-inequality\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:463\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator()\n-constructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:407\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const ConstIterator &it) const\n-equality\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:457\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n-size_type index() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:493\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-ConstIterator & operator=(Iterator &&other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:424\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-ConstIterator & operator=(Iterator &other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:432\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n+Sequential overlapping Schwarz preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n A generic dynamic dense matrix.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bl_\bs_\b_\n-size_type cols_\n-Number of columns of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1084\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n-FieldTraits< ft >::real_type infinity_norm() const\n-infinity norm (row sum norm, how to generalize for blocks?)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:988\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n-A allocator_type\n-Export the allocator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:571\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n-FieldTraits< ft >::real_type infinity_norm_real() const\n-simplified infinity norm (uses Manhattan norm for complex values)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1007\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bh_\bv\n-void usmhv(const field_type &alpha, const X &x, Y &y) const\n-y += alpha A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:952\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bv\n-void usmv(const field_type &alpha, const X &x, Y &y) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:850\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-Type for indices and sizes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:577\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\ba_\bt_\ba_\b_\n-MatrixImp::DenseMatrixBase< T, A > data_\n-Abuse DenseMatrixBase as an engine for a 2d array ISTL-style.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1077\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be\n-Matrix transpose() const\n-Return the transpose of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:741\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bt_\bv\n-void mtv(const X &x, Y &y) const\n-y = A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:803\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bv\n-void umv(const X &x, Y &y) const\n-y += A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:816\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n-void mv(const X &x, Y &y) const\n-y = A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:784\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-MatrixImp::DenseMatrixBase< T, A >::ConstIterator ConstRowIterator\n-Const iterator over the matrix rows.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:586\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n-void setSize(size_type rows, size_type cols)\n-Change the matrix size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:604\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-RowIterator beforeBegin()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:630\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-RowIterator beforeEnd()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:623\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-Matrix()\n-Create empty matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:592\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n-Matrix & operator-=(const Matrix &b)\n-Subtract the entries of another matrix from this one.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:731\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2\n-FieldTraits< field_type >::real_type frobenius_norm2() const\n-square of frobenius norm, need for block recursion\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:976\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::iterator ColIterator\n-Iterator for the entries of each row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:583\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-ConstRowIterator beforeEnd() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:649\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-Matrix & operator=(const field_type &t)\n-Assignment from scalar.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:662\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-RowIterator end()\n-Get iterator to one beyond last row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:616\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-const row_type operator[](size_type row) const\n-The const index operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:680\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-ConstRowIterator end() const\n-Get const iterator to one beyond last row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:642\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-friend Y operator*(const Matrix< T > &m, const X &vec)\n-Generic matrix-vector multiplication.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:766\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n-Matrix< T > & operator*=(const field_type &scalar)\n-Multiplication with a scalar.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:701\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-row_type operator[](size_type row)\n-The index operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:669\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bv\n-void mmv(const X &x, Y &y) const\n-y -= A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:833\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n-Matrix & operator+=(const Matrix &b)\n-Add the entries of another matrix to this one.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:717\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-ConstRowIterator begin() const\n-Get const iterator to first row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:636\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bh_\bv\n-void mmhv(const X &x, Y &y) const\n-y -= A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:935\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-RowIterator begin()\n-Get iterator to first row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:610\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< T >::field_type field_type\n-Export the type representing the underlying field.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:565\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::const_iterator ConstColIterator\n-Const iterator for the entries of each row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:589\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n size_type M() const\n Return the number of columns.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:696\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-T block_type\n-Export the type representing the components.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:568\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n-bool exists(size_type i, size_type j) const\n-return true if (i,j) is in pattern\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1064\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n-Matrix< T > & operator/=(const field_type &scalar)\n-Division by a scalar.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:707\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-friend Matrix< T > operator*(const Matrix< T > &m1, const Matrix< T > &m2)\n-Generic matrix multiplication.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:751\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bt_\bv\n-void umtv(const X &x, Y &y) const\n-y += A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:867\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bt_\bv\n-void mmtv(const X &x, Y &y) const\n-y -= A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:884\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n-MatrixImp::DenseMatrixBase< T, A >::window_type row_type\n-The type implementing a matrix row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:574\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm\n-FieldTraits< field_type >::real_type frobenius_norm() const\n-frobenius norm: sqrt(sum over squared values of entries)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:970\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bt_\bv\n-void usmtv(const field_type &alpha, const X &x, Y &y) const\n-y += alpha A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:901\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bh_\bv\n-void umhv(const X &x, Y &y) const\n-y += A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:918\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n size_type N() const\n Return the number of rows.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:691\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-ConstRowIterator beforeBegin() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:656\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-Matrix(size_type rows, size_type cols)\n-Create uninitialized matrix of size rows x cols.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:597\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-MatrixImp::DenseMatrixBase< T, A >::Iterator RowIterator\n-Iterator over the matrix rows.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:580\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Matrix< T, A >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1090\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-typename FieldTraits< field_type >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1091\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+int iterations\n+Number of iterations.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n+bool converged\n+True if convergence criterion has been met.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Abstract base class for all solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+@ value\n+Whether this is a direct solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+@ value\n+whether the solver internally uses column compressed storage\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bS_\bo_\bl_\bv_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\bC_\bh_\bo_\bo_\bs_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bQ_\bu_\be_\br_\by_\bC_\bh_\bo_\bo_\bs_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bQ_\bu_\be_\br_\by_\bS_\bp_\ba_\bc_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU\n+SuperLu Solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:271\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bn_\bn_\bz\n+SuperLUMatrix::size_type nnz() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:355\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(domain_type &x, range_type &b, double reduction,\n+InverseOperatorResult &res)\n+apply inverse operator, with given convergence criteria.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:342\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+typename Impl::SuperLUVectorChooser< M >::range_type range_type\n+The type of the range of the solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:284\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:276\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+SuperMatrixInitializer< Matrix > MatrixInitializer\n+Type of an associated initializer class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:280\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+M Matrix\n+The matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:275\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+typename Impl::SuperLUVectorChooser< M >::domain_type domain_type\n+The type of the domain of the solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:282\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bn_\ba_\bm_\be\n+const char * name()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:371\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the solver (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:287\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n+Dune::SuperLUMatrix< Matrix > SuperLUMatrix\n+The corresponding SuperLU Matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU\n+SuperLU(const Matrix &mat, const ParameterTree &config)\n+Constructs the SuperLU solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:320\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:727\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL\n+>::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const\n+M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock<\n+typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0)\n+const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:734\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:728\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n+Utility class for converting an ISTL Matrix into a SuperLU Matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:175\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:179\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00050.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00050.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: ilusubdomainsolver.hh File Reference\n+dune-istl: registry.hh File Reference\n \n \n \n \n \n \n \n@@ -65,55 +65,94 @@\n \n \n \n \n \n \n \n
    \n \n-
    ilusubdomainsolver.hh File Reference
    \n+Namespaces |\n+Macros
    \n+
    registry.hh File Reference
    \n \n
    \n-\n-

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

    \n-
    #include <map>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/istl/preconditioners.hh>
    \n-#include "matrix.hh"
    \n-#include <cmath>
    \n-#include <cstdlib>
    \n+
    #include <cstddef>
    \n+#include <iostream>
    \n+#include <memory>
    \n+#include <string>
    \n+#include <utility>
    \n+#include "counter.hh"
    \n+#include <dune/common/typelist.hh>
    \n+#include <dune/common/hybridutilities.hh>
    \n+#include <dune/common/parameterizedobject.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-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 >
     
    \n \n \n \n+

    \n Namespaces

    namespace  Dune
     
    \n+\n+\n+\n

    \n+Macros

    #define DUNE_REGISTRY_PUT(Tag, id, ...)
     
    \n-

    Detailed Description

    \n-

    Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.

    \n-
    Author
    Markus Blatt
    \n-
    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ DUNE_REGISTRY_PUT

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_REGISTRY_PUT( Tag,
     id,
     ... 
    )
    \n+
    \n+Value:
    namespace { \\
    \n+
    template<> \\
    \n+
    struct Registry<Tag, DUNE_GET_COUNTER(Tag)> \\
    \n+
    { \\
    \n+
    static auto getCreator() \\
    \n+
    { \\
    \n+
    return __VA_ARGS__; \\
    \n+
    } \\
    \n+
    static std::string name() { return id; } \\
    \n+
    }; \\
    \n+
    } \\
    \n+
    DUNE_INC_COUNTER(Tag)
    \n+
    #define DUNE_GET_COUNTER(Tag)
    Definition counter.hh:17
    \n+
    \n+
    \n+
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,35 +1,49 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-ilusubdomainsolver.hh File Reference\n-Various local subdomain solvers based on ILU for SeqOverlappingSchwarz. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n-#include \"_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-#include \n-#include \n+ * _\bc_\bo_\bm_\bm_\bo_\bn\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs\n+registry.hh File Reference\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bc_\bo_\bu_\bn_\bt_\be_\br_\b._\bh_\bh\"\n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0 base class encapsulating common algorithms of _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br and\n- _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0 Exact subdomain solver using _\bI_\bL_\bU_\b(_\bp_\b) with appropriate p. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.\n- Author\n- Markus Blatt\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT(Tag, id, ...)\n+\u00a0\n+*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_R\bRE\bEG\bGI\bIS\bST\bTR\bRY\bY_\b_P\bPU\bUT\bT *\b**\b**\b**\b**\b*\n+#define DUNE_REGISTRY_PUT ( \u00a0 Tag,\n+ \u00a0 id,\n+ \u00a0 .\b..\b..\b.\u00a0\n+ )\n+V\bVa\bal\blu\bue\be:\b:\n+namespace { \\\n+template<> \\\n+struct Registry \\\n+{ \\\n+static auto getCreator() \\\n+{ \\\n+return __VA_ARGS__; \\\n+} \\\n+static std::string name() { return id; } \\\n+}; \\\n+} \\\n+DUNE_INC_COUNTER(Tag)\n+_\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR\n+#define DUNE_GET_COUNTER(Tag)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn counter.hh:17\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00050_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00050_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: ilusubdomainsolver.hh Source File\n+dune-istl: registry.hh Source File\n \n \n \n \n \n \n \n@@ -70,239 +70,106 @@\n \n \n \n \n \n \n \n
    \n-
    ilusubdomainsolver.hh
    \n+
    registry.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_ILUSUBDOMAINSOLVER_HH
    \n-
    6#define DUNE_ISTL_ILUSUBDOMAINSOLVER_HH
    \n-
    7
    \n-
    8#include <map>
    \n-
    9#include <dune/common/typetraits.hh>
    \n-\n-
    11#include "matrix.hh"
    \n-
    12#include <cmath>
    \n-
    13#include <cstdlib>
    \n-
    14
    \n-
    15namespace Dune {
    \n-
    16
    \n-
    35 template<class M, class X, class Y>
    \n-
    \n-\n-
    37 public:
    \n-
    39 typedef typename std::remove_const<M>::type matrix_type;
    \n-
    41 typedef X domain_type;
    \n-
    43 typedef Y range_type;
    \n-
    44
    \n-
    51 virtual void apply (X& v, const Y& d) =0;
    \n-
    52
    \n-
    \n-\n-
    54 {}
    \n-
    \n-
    55
    \n-
    56 protected:
    \n-
    62 template<class S>
    \n-
    63 std::size_t copyToLocalMatrix(const M& A, S& rowset);
    \n-
    64
    \n-
    66 // for ILUN
    \n-\n-
    68 };
    \n-
    \n-
    69
    \n-
    76 template<class M, class X, class Y>
    \n-
    \n-\n-
    78 : public ILUSubdomainSolver<M,X,Y>{
    \n-
    79 public:
    \n-
    81 typedef typename std::remove_const<M>::type matrix_type;
    \n-
    82 typedef typename std::remove_const<M>::type rilu_type;
    \n-
    84 typedef X domain_type;
    \n-
    86 typedef Y range_type;
    \n-
    87
    \n-
    88
    \n-
    \n-
    93 void apply (X& v, const Y& d)
    \n-
    94 {
    \n-
    95 ILU::blockILUBacksolve(this->ILU,v,d);
    \n-
    96 }
    \n-
    \n-
    104 template<class S>
    \n-
    105 void setSubMatrix(const M& A, S& rowset);
    \n-
    106
    \n-
    107 };
    \n-
    \n-
    108
    \n-
    109 template<class M, class X, class Y>
    \n-
    \n-\n-
    111 : public ILUSubdomainSolver<M,X,Y>{
    \n-
    112 public:
    \n-
    114 typedef typename std::remove_const<M>::type matrix_type;
    \n-
    115 typedef typename std::remove_const<M>::type rilu_type;
    \n-
    117 typedef X domain_type;
    \n-
    119 typedef Y range_type;
    \n-
    120
    \n-
    \n-
    125 void apply (X& v, const Y& d)
    \n-
    126 {
    \n-
    127 ILU::blockILUBacksolve(RILU,v,d);
    \n-
    128 }
    \n-
    \n-
    129
    \n-
    137 template<class S>
    \n-
    138 void setSubMatrix(const M& A, S& rowset);
    \n-
    139
    \n-
    140 private:
    \n-
    144 rilu_type RILU;
    \n-
    145 };
    \n-
    \n-
    146
    \n-
    147
    \n-
    148
    \n-
    149 template<class M, class X, class Y>
    \n-
    150 template<class S>
    \n-
    \n-
    151 std::size_t ILUSubdomainSolver<M,X,Y>::copyToLocalMatrix(const M& A, S& rowSet)
    \n-
    152 {
    \n-
    153 // Calculate consecutive indices for local problem
    \n-
    154 // while preserving the ordering
    \n-
    155 typedef typename M::size_type size_type;
    \n-
    156 typedef std::map<typename S::value_type,size_type> IndexMap;
    \n-
    157 typedef typename IndexMap::iterator IMIter;
    \n-
    158 IndexMap indexMap;
    \n-
    159 IMIter guess = indexMap.begin();
    \n-
    160 size_type localIndex=0;
    \n-
    161
    \n-
    162 typedef typename S::const_iterator SIter;
    \n-
    163 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
    \n-
    164 rowIdx!= rowEnd; ++rowIdx, ++localIndex)
    \n-
    165 guess = indexMap.insert(guess,
    \n-
    166 std::make_pair(*rowIdx,localIndex));
    \n-
    167
    \n-
    168
    \n-
    169 // Build Matrix for local subproblem
    \n-
    170 ILU.setSize(rowSet.size(),rowSet.size());
    \n-
    171 ILU.setBuildMode(matrix_type::row_wise);
    \n-
    172
    \n-
    173 // Create sparsity pattern
    \n-
    174 typedef typename matrix_type::CreateIterator CIter;
    \n-
    175 CIter rowCreator = ILU.createbegin();
    \n-
    176 std::size_t offset=0;
    \n-
    177 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
    \n-
    178 rowIdx!= rowEnd; ++rowIdx, ++rowCreator) {
    \n-
    179 // See which row entries are in our subset and add them to
    \n-
    180 // the sparsity pattern
    \n-
    181 guess = indexMap.begin();
    \n-
    182
    \n-
    183 for(typename matrix_type::ConstColIterator col=A[*rowIdx].begin(),
    \n-
    184 endcol=A[*rowIdx].end(); col != endcol; ++col) {
    \n-
    185 // search for the entry in the row set
    \n-
    186 guess = indexMap.find(col.index());
    \n-
    187 if(guess!=indexMap.end()) {
    \n-
    188 // add local index to row
    \n-
    189 rowCreator.insert(guess->second);
    \n-
    190 offset=std::max(offset,(std::size_t)std::abs((int)(guess->second-rowCreator.index())));
    \n-
    191 }
    \n-
    192 }
    \n-
    193
    \n-
    194 }
    \n-
    195
    \n-
    196 // Insert the matrix values for the local problem
    \n-
    197 typename matrix_type::iterator iluRow=ILU.begin();
    \n-
    198
    \n-
    199 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
    \n-
    200 rowIdx!= rowEnd; ++rowIdx, ++iluRow) {
    \n-
    201 // See which row entries are in our subset and add them to
    \n-
    202 // the sparsity pattern
    \n-
    203 typename matrix_type::ColIterator localCol=iluRow->begin();
    \n-
    204 for(typename matrix_type::ConstColIterator col=A[*rowIdx].begin(),
    \n-
    205 endcol=A[*rowIdx].end(); col != endcol; ++col) {
    \n-
    206 // search for the entry in the row set
    \n-
    207 guess = indexMap.find(col.index());
    \n-
    208 if(guess!=indexMap.end()) {
    \n-
    209 // set local value
    \n-
    210 (*localCol)=(*col);
    \n-
    211 ++localCol;
    \n-
    212 }
    \n-
    213 }
    \n-
    214 }
    \n-
    215 return offset;
    \n-
    216 }
    \n-
    \n-
    217
    \n-
    218
    \n-
    219 template<class M, class X, class Y>
    \n-
    220 template<class S>
    \n-
    \n-\n-
    222 {
    \n-
    223 this->copyToLocalMatrix(A,rowSet);
    \n-\n-
    225 }
    \n-
    \n-
    226
    \n-
    227 template<class M, class X, class Y>
    \n-
    228 template<class S>
    \n-
    \n-\n-
    230 {
    \n-
    231 std::size_t offset=copyToLocalMatrix(A,rowSet);
    \n-
    232 RILU.setSize(rowSet.size(),rowSet.size(), (1+2*offset)*rowSet.size());
    \n-
    233 RILU.setBuildMode(matrix_type::row_wise);
    \n-
    234 ILU::blockILUDecomposition(this->ILU, (offset+1)/2, RILU);
    \n-
    235 }
    \n-
    \n-
    236
    \n-
    238} // end name space DUNE
    \n-
    239
    \n-
    240
    \n-
    241#endif
    \n-
    Define general preconditioner interface.
    \n-
    A dynamic dense block matrix class.
    \n-
    std::size_t copyToLocalMatrix(const M &A, S &rowset)
    Copy the local part of the global matrix to ILU.
    Definition ilusubdomainsolver.hh:151
    \n-
    void setSubMatrix(const M &A, S &rowset)
    Set the data of the local problem.
    Definition ilusubdomainsolver.hh:229
    \n-
    void setSubMatrix(const M &A, S &rowset)
    Set the data of the local problem.
    Definition ilusubdomainsolver.hh:221
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n+
    3#ifndef DUNE_ISTL_COMMON_REGISTRY_HH
    \n+
    4#define DUNE_ISTL_COMMON_REGISTRY_HH
    \n+
    5
    \n+
    6#include <cstddef>
    \n+
    7#include <iostream>
    \n+
    8#include <memory>
    \n+
    9#include <string>
    \n+
    10#include <utility>
    \n+
    11
    \n+
    12#include "counter.hh"
    \n+
    13
    \n+
    14#include <dune/common/typelist.hh>
    \n+
    15#include <dune/common/hybridutilities.hh>
    \n+
    16#include <dune/common/parameterizedobject.hh>
    \n+
    17
    \n+
    \n+
    18#define DUNE_REGISTRY_PUT(Tag, id, ...) \\
    \n+
    19 namespace { \\
    \n+
    20 template<> \\
    \n+
    21 struct Registry<Tag, DUNE_GET_COUNTER(Tag)> \\
    \n+
    22 { \\
    \n+
    23 static auto getCreator() \\
    \n+
    24 { \\
    \n+
    25 return __VA_ARGS__; \\
    \n+
    26 } \\
    \n+
    27 static std::string name() { return id; } \\
    \n+
    28 }; \\
    \n+
    29 } \\
    \n+
    30 DUNE_INC_COUNTER(Tag)
    \n+
    \n+
    31
    \n+
    32
    \n+
    33namespace Dune {
    \n+
    34 namespace {
    \n+
    35 template<class Tag, std::size_t index>
    \n+
    36 struct Registry;
    \n+
    37 }
    \n+
    38
    \n+
    39 namespace {
    \n+
    40 template<template<class> class Base, class V, class Tag, typename... Args>
    \n+
    41 auto registryGet(Tag , std::string name, Args... args)
    \n+
    42 {
    \n+
    43 constexpr auto count = DUNE_GET_COUNTER(Tag);
    \n+
    44 std::shared_ptr<Base<V> > result;
    \n+
    45 Dune::Hybrid::forEach(std::make_index_sequence<count>{},
    \n+
    46 [&](auto index) {
    \n+
    47 using Reg = Registry<Tag, index>;
    \n+
    48 if(!result && Reg::name() == name) {
    \n+
    49 result = Reg::getCreator()(Dune::MetaType<V>{}, args...);
    \n+
    50 }
    \n+
    51 });
    \n+
    52 return result;
    \n+
    53 }
    \n+
    54
    \n+
    55 /*
    \n+
    56 Register all creators from the registry in the Parameterizedobjectfactory An
    \n+
    57 object of V is passed in the creator and should be used to determine the
    \n+
    58 template arguments.
    \n+
    59 */
    \n+
    60 template<class V, class Type, class Tag, class... Args>
    \n+
    61 int addRegistryToFactory(Dune::ParameterizedObjectFactory<Type(Args...), std::string>& factory,
    \n+
    62 Tag){
    \n+
    63 constexpr auto count = DUNE_GET_COUNTER(Tag);
    \n+
    64 Dune::Hybrid::forEach(std::make_index_sequence<count>{},
    \n+
    65 [&](auto index) {
    \n+
    66 // we first get the generic lambda
    \n+
    67 // and later specialize it with given parameters.
    \n+
    68 // doing all at once leads to an ICE with g++-6
    \n+
    69 using Reg = Registry<Tag, index>;
    \n+
    70 auto genericcreator = Reg::getCreator();
    \n+
    71 factory.define(Reg::name(), [genericcreator](Args... args){
    \n+
    72 return genericcreator(V{}, args...);
    \n+
    73 });
    \n+
    74 });
    \n+
    75 return count;
    \n+
    76 }
    \n+
    77 } // end anonymous namespace
    \n+
    78} // end namespace Dune
    \n+
    79
    \n+
    80#endif // DUNE_ISTL_COMMON_REGISTRY_HH
    \n+\n+
    #define DUNE_GET_COUNTER(Tag)
    Definition counter.hh:17
    \n
    Definition allocator.hh:11
    \n-
    void blockILUBacksolve(const M &A, X &v, const Y &d)
    LU backsolve with stored inverse.
    Definition ilu.hh:94
    \n-
    void blockILU0Decomposition(M &A)
    compute ILU decomposition of A. A is overwritten by its decomposition
    Definition ilu.hh:33
    \n-
    void blockILUDecomposition(const M &A, int n, M &ILU)
    Definition ilu.hh:167
    \n-
    base class encapsulating common algorithms of ILU0SubdomainSolver and ILUNSubdomainSolver.
    Definition ilusubdomainsolver.hh:36
    \n-
    matrix_type ILU
    The ILU0 decomposition of the matrix, or the local matrix.
    Definition ilusubdomainsolver.hh:67
    \n-
    X domain_type
    The domain type of the preconditioner.
    Definition ilusubdomainsolver.hh:41
    \n-
    virtual ~ILUSubdomainSolver()
    Definition ilusubdomainsolver.hh:53
    \n-
    Y range_type
    The range type of the preconditioner.
    Definition ilusubdomainsolver.hh:43
    \n-
    std::remove_const< M >::type matrix_type
    The matrix type the preconditioner is for.
    Definition ilusubdomainsolver.hh:39
    \n-
    virtual void apply(X &v, const Y &d)=0
    Apply the subdomain solver.
    \n-
    Exact subdomain solver using ILU(p) with appropriate p.
    Definition ilusubdomainsolver.hh:78
    \n-
    X domain_type
    The domain type of the preconditioner.
    Definition ilusubdomainsolver.hh:84
    \n-
    Y range_type
    The range type of the preconditioner.
    Definition ilusubdomainsolver.hh:86
    \n-
    std::remove_const< M >::type rilu_type
    Definition ilusubdomainsolver.hh:82
    \n-
    std::remove_const< M >::type matrix_type
    The matrix type the preconditioner is for.
    Definition ilusubdomainsolver.hh:81
    \n-
    void apply(X &v, const Y &d)
    Apply the subdomain solver.
    Definition ilusubdomainsolver.hh:93
    \n-
    Definition ilusubdomainsolver.hh:111
    \n-
    X domain_type
    The domain type of the preconditioner.
    Definition ilusubdomainsolver.hh:117
    \n-
    std::remove_const< M >::type matrix_type
    The matrix type the preconditioner is for.
    Definition ilusubdomainsolver.hh:114
    \n-
    std::remove_const< M >::type rilu_type
    Definition ilusubdomainsolver.hh:115
    \n-
    void apply(X &v, const Y &d)
    Apply the subdomain solver.
    Definition ilusubdomainsolver.hh:125
    \n-
    Y range_type
    The range type of the preconditioner.
    Definition ilusubdomainsolver.hh:119
    \n-
    RowIterator end()
    Get iterator to one beyond last row.
    Definition matrix.hh:616
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,288 +1,99 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-ilusubdomainsolver.hh\n+ * _\bc_\bo_\bm_\bm_\bo_\bn\n+registry.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_ILUSUBDOMAINSOLVER_HH\n-6#define DUNE_ISTL_ILUSUBDOMAINSOLVER_HH\n-7\n-8#include \n-9#include \n-10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n-11#include \"_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-12#include \n-13#include \n-14\n-15namespace _\bD_\bu_\bn_\be {\n-16\n-35 template\n-_\b3_\b6 class _\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br {\n-37 public:\n-_\b3_\b9 typedef typename std::remove_const::type _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b4_\b1 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b4_\b3 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-44\n-_\b5_\b1 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d) =0;\n-52\n-_\b5_\b3 virtual _\b~_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br()\n-54 {}\n-55\n-56 protected:\n-62 template\n-63 std::size_t _\bc_\bo_\bp_\by_\bT_\bo_\bL_\bo_\bc_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S& rowset);\n-64\n-66 // for ILUN\n-_\b6_\b7 _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be _\bI_\bL_\bU;\n-68 };\n-69\n-76 template\n-_\b7_\b7 class _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n-78 : public _\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br{\n-79 public:\n-_\b8_\b1 typedef typename std::remove_const::type _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b8_\b2 typedef typename std::remove_const::type _\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be;\n-_\b8_\b4 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b8_\b6 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-87\n-88\n-_\b9_\b3 void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n-94 {\n-95 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be(this->_\bI_\bL_\bU,v,d);\n-96 }\n-104 template\n-105 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S& rowset);\n-106\n-107 };\n-108\n-109 template\n-_\b1_\b1_\b0 class _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n-111 : public _\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br{\n-112 public:\n-_\b1_\b1_\b4 typedef typename std::remove_const::type _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b1_\b1_\b5 typedef typename std::remove_const::type _\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be;\n-_\b1_\b1_\b7 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b1_\b1_\b9 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-120\n-_\b1_\b2_\b5 void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n-126 {\n-127 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be(RILU,v,d);\n-128 }\n-129\n-137 template\n-138 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S& rowset);\n-139\n-140 private:\n-144 _\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be RILU;\n-145 };\n-146\n-147\n-148\n-149 template\n-150 template\n-_\b1_\b5_\b1 std::size_t _\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bc_\bo_\bp_\by_\bT_\bo_\bL_\bo_\bc_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S&\n-rowSet)\n-152 {\n-153 // Calculate consecutive indices for local problem\n-154 // while preserving the ordering\n-155 typedef typename M::size_type size_type;\n-156 typedef std::map IndexMap;\n-157 typedef typename IndexMap::iterator IMIter;\n-158 IndexMap indexMap;\n-159 IMIter guess = indexMap.begin();\n-160 size_type localIndex=0;\n-161\n-162 typedef typename S::const_iterator SIter;\n-163 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();\n-164 rowIdx!= rowEnd; ++rowIdx, ++localIndex)\n-165 guess = indexMap.insert(guess,\n-166 std::make_pair(*rowIdx,localIndex));\n-167\n-168\n-169 // Build Matrix for local subproblem\n-170 ILU.setSize(rowSet.size(),rowSet.size());\n-171 ILU.setBuildMode(matrix_type::row_wise);\n-172\n-173 // Create sparsity pattern\n-174 typedef typename matrix_type::CreateIterator CIter;\n-175 CIter rowCreator = ILU.createbegin();\n-176 std::size_t offset=0;\n-177 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();\n-178 rowIdx!= rowEnd; ++rowIdx, ++rowCreator) {\n-179 // See which row entries are in our subset and add them to\n-180 // the sparsity pattern\n-181 guess = indexMap.begin();\n-182\n-183 for(typename matrix_type::ConstColIterator _\bc_\bo_\bl=A[*rowIdx].begin(),\n-184 endcol=A[*rowIdx]._\be_\bn_\bd(); _\bc_\bo_\bl != endcol; ++_\bc_\bo_\bl) {\n-185 // search for the entry in the row set\n-186 guess = indexMap.find(_\bc_\bo_\bl.index());\n-187 if(guess!=indexMap.end()) {\n-188 // add local index to row\n-189 rowCreator.insert(guess->second);\n-190 offset=std::max(offset,(std::size_t)std::abs((int)(guess->second-\n-rowCreator.index())));\n-191 }\n-192 }\n-193\n-194 }\n-195\n-196 // Insert the matrix values for the local problem\n-197 typename matrix_type::iterator iluRow=ILU.begin();\n-198\n-199 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();\n-200 rowIdx!= rowEnd; ++rowIdx, ++iluRow) {\n-201 // See which row entries are in our subset and add them to\n-202 // the sparsity pattern\n-203 typename matrix_type::ColIterator localCol=iluRow->begin();\n-204 for(typename matrix_type::ConstColIterator _\bc_\bo_\bl=A[*rowIdx].begin(),\n-205 endcol=A[*rowIdx]._\be_\bn_\bd(); _\bc_\bo_\bl != endcol; ++_\bc_\bo_\bl) {\n-206 // search for the entry in the row set\n-207 guess = indexMap.find(_\bc_\bo_\bl.index());\n-208 if(guess!=indexMap.end()) {\n-209 // set local value\n-210 (*localCol)=(*col);\n-211 ++localCol;\n-212 }\n-213 }\n-214 }\n-215 return offset;\n-216 }\n-217\n-218\n-219 template\n-220 template\n-_\b2_\b2_\b1 void _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S& rowSet)\n-222 {\n-223 this->copyToLocalMatrix(A,rowSet);\n-224 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(this->ILU);\n-225 }\n-226\n-227 template\n-228 template\n-_\b2_\b2_\b9 void _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S& rowSet)\n-230 {\n-231 std::size_t offset=copyToLocalMatrix(A,rowSet);\n-232 RILU.setSize(rowSet.size(),rowSet.size(), (1+2*offset)*rowSet.size());\n-233 RILU.setBuildMode(matrix_type::row_wise);\n-234 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(this->ILU, (offset+1)/2, RILU);\n-235 }\n-236\n-238} // end name space DUNE\n-239\n-240\n-241#endif\n-_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n-Define general preconditioner interface.\n-_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-A dynamic dense block matrix class.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bc_\bo_\bp_\by_\bT_\bo_\bL_\bo_\bc_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n-std::size_t copyToLocalMatrix(const M &A, S &rowset)\n-Copy the local part of the global matrix to ILU.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n-void setSubMatrix(const M &A, S &rowset)\n-Set the data of the local problem.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:229\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n-void setSubMatrix(const M &A, S &rowset)\n-Set the data of the local problem.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:221\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+3#ifndef DUNE_ISTL_COMMON_REGISTRY_HH\n+4#define DUNE_ISTL_COMMON_REGISTRY_HH\n+5\n+6#include \n+7#include \n+8#include \n+9#include \n+10#include \n+11\n+12#include \"_\bc_\bo_\bu_\bn_\bt_\be_\br_\b._\bh_\bh\"\n+13\n+14#include \n+15#include \n+16#include \n+17\n+_\b1_\b8#define DUNE_REGISTRY_PUT(Tag, id, ...) \\\n+19 namespace { \\\n+20 template<> \\\n+21 struct Registry \\\n+22 { \\\n+23 static auto getCreator() \\\n+24 { \\\n+25 return __VA_ARGS__; \\\n+26 } \\\n+27 static std::string name() { return id; } \\\n+28 }; \\\n+29 } \\\n+30 DUNE_INC_COUNTER(Tag)\n+31\n+32\n+33namespace _\bD_\bu_\bn_\be {\n+34 namespace {\n+35 template\n+36 struct Registry;\n+37 }\n+38\n+39 namespace {\n+40 template class Base, class V, class Tag, typename... Args>\n+41 auto registryGet(Tag , std::string name, Args... args)\n+42 {\n+43 constexpr auto count = _\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR(Tag);\n+44 std::shared_ptr > result;\n+45 Dune::Hybrid::forEach(std::make_index_sequence{},\n+46 [&](auto index) {\n+47 using Reg = Registry;\n+48 if(!result && Reg::name() == name) {\n+49 result = Reg::getCreator()(Dune::MetaType{}, args...);\n+50 }\n+51 });\n+52 return result;\n+53 }\n+54\n+55 /*\n+56 Register all creators from the registry in the Parameterizedobjectfactory An\n+57 object of V is passed in the creator and should be used to determine the\n+58 template arguments.\n+59 */\n+60 template\n+61 int addRegistryToFactory(Dune::ParameterizedObjectFactory& factory,\n+62 Tag){\n+63 constexpr auto count = _\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR(Tag);\n+64 Dune::Hybrid::forEach(std::make_index_sequence{},\n+65 [&](auto index) {\n+66 // we first get the generic lambda\n+67 // and later specialize it with given parameters.\n+68 // doing all at once leads to an ICE with g++-6\n+69 using Reg = Registry;\n+70 auto genericcreator = Reg::getCreator();\n+71 factory.define(Reg::name(), [genericcreator](Args... args){\n+72 return genericcreator(V{}, args...);\n+73 });\n+74 });\n+75 return count;\n+76 }\n+77 } // end anonymous namespace\n+78} // end namespace Dune\n+79\n+80#endif // DUNE_ISTL_COMMON_REGISTRY_HH\n+_\bc_\bo_\bu_\bn_\bt_\be_\br_\b._\bh_\bh\n+_\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR\n+#define DUNE_GET_COUNTER(Tag)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn counter.hh:17\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n-void blockILUBacksolve(const M &A, X &v, const Y &d)\n-LU backsolve with stored inverse.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:94\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-void blockILU0Decomposition(M &A)\n-compute ILU decomposition of A. A is overwritten by its decomposition\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-void blockILUDecomposition(const M &A, int n, M &ILU)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:167\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n-base class encapsulating common algorithms of ILU0SubdomainSolver and\n-ILUNSubdomainSolver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bL_\bU\n-matrix_type ILU\n-The ILU0 decomposition of the matrix, or the local matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b~_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n-virtual ~ILUSubdomainSolver()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-std::remove_const< M >::type matrix_type\n-The matrix type the preconditioner is for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &v, const Y &d)=0\n-Apply the subdomain solver.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n-Exact subdomain solver using ILU(p) with appropriate p.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be\n-std::remove_const< M >::type rilu_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-std::remove_const< M >::type matrix_type\n-The matrix type the preconditioner is for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(X &v, const Y &d)\n-Apply the subdomain solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:117\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-std::remove_const< M >::type matrix_type\n-The matrix type the preconditioner is for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be\n-std::remove_const< M >::type rilu_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:115\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(X &v, const Y &d)\n-Apply the subdomain solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:119\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-RowIterator end()\n-Get iterator to one beyond last row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:616\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00053.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00053.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: dilu.hh File Reference\n+dune-istl: counter.hh File Reference\n \n \n \n \n \n \n \n@@ -65,56 +65,125 @@\n \n \n \n \n \n \n \n
    \n \n-
    dilu.hh File Reference
    \n+Macros |\n+Variables
    \n+
    counter.hh File Reference
    \n \n
    \n-\n-

    The diagonal incomplete LU factorization kernels. \n-More...

    \n-
    #include <cmath>
    \n-#include <complex>
    \n-#include <map>
    \n-#include <vector>
    \n-#include <dune/common/fmatrix.hh>
    \n-#include <dune/common/scalarvectorview.hh>
    \n-#include <dune/common/scalarmatrixview.hh>
    \n-#include "istlexception.hh"
    \n+
    #include <cassert>
    \n+#include <typeinfo>
    \n+#include <iostream>
    \n+#include <memory>
    \n+#include <tuple>
    \n+#include <utility>
    \n+#include <dune/common/typeutilities.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n \n \n-\n+\n \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::DILU
    namespace  Dune::CounterImpl
     
    \n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+

    \n-Functions

    template<class M >
    void Dune::DILU::blockDILUDecomposition (M &A, std::vector< typename M::block_type > &Dinv_)
     
    template<class M , class X , class Y >
    void Dune::DILU::blockDILUBacksolve (const M &A, const std::vector< typename M::block_type > Dinv_, X &v, const Y &d)
     

    \n+Macros

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

    \n+Variables

    constexpr std::size_t maxcount = 100
     
    \n-

    Detailed Description

    \n-

    The diagonal incomplete LU factorization kernels.

    \n-
    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ DUNE_GET_COUNTER

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

    ◆ DUNE_INC_COUNTER

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

    Variable Documentation

    \n+\n+

    ◆ maxcount

    \n+\n+
    \n+
    \n+\n+ \n+ \n+ \n+ \n+
    \n+ \n+ \n+ \n+ \n+
    constexpr std::size_t maxcount = 100
    \n+
    \n+constexpr
    \n+
    \n+\n+
    \n+
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,36 +1,56 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-dilu.hh File Reference\n-The diagonal incomplete LU factorization kernels. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+ * _\bc_\bo_\bm_\bm_\bo_\bn\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n+counter.hh File Reference\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\bI_\bm_\bp_\bl\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn (M &A, std::vector< typename M::\n- block_type > &Dinv_)\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR(Tag)\u00a0\u00a0\u00a0 (counterFunc(Dune::PriorityTag<_\bm_\ba_\bx_\bc_\bo_\bu_\bn_\bt>{},\n+ Tag{}, Dune::CounterImpl::ADLTag{}))\n \u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const M &A, const std::vector< typename\n- M::block_type > Dinv_, X &v, const Y &d)\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bC_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR(Tag)\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-The diagonal incomplete LU factorization kernels.\n+V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n+constexpr std::size_t\u00a0 _\bm_\ba_\bx_\bc_\bo_\bu_\bn_\bt = 100\n+\u00a0\n+*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_G\bGE\bET\bT_\b_C\bCO\bOU\bUN\bNT\bTE\bER\bR *\b**\b**\b**\b**\b*\n+#define DUNE_GET_COUNTER ( \u00a0 Tag ) \u00a0\u00a0\u00a0 (counterFunc(Dune::PriorityTag<_\bm_\ba_\bx_\bc_\bo_\bu_\bn_\bt>\n+ {}, Tag{}, Dune::CounterImpl::ADLTag{}))\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_I\bIN\bNC\bC_\b_C\bCO\bOU\bUN\bNT\bTE\bER\bR *\b**\b**\b**\b**\b*\n+#define DUNE_INC_COUNTER ( \u00a0 Tag )\n+V\bVa\bal\blu\bue\be:\b:\n+namespace { \\\n+namespace CounterImpl { \\\n+constexpr std::size_t \\\n+counterFunc(Dune::PriorityTag<_\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR(Tag)+1> p, Tag, ADLTag) \\\n+{ \\\n+return p.value; \\\n+} \\\n+} \\\n+} \\\n+static_assert(true, \"unfudge indentation\")\n+_\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR\n+#define DUNE_GET_COUNTER(Tag)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn counter.hh:17\n+*\b**\b**\b**\b**\b* V\bVa\bar\bri\bia\bab\bbl\ble\be D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0m\bma\bax\bxc\bco\bou\bun\bnt\bt *\b**\b**\b**\b**\b*\n+constexpr std::size_t maxcount = 100 constexpr\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00053_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00053_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: dilu.hh Source File\n+dune-istl: counter.hh Source File\n \n \n \n \n \n \n \n@@ -70,150 +70,77 @@\n \n \n \n \n \n \n \n
    \n-
    dilu.hh
    \n+
    counter.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_DILU_HH
    \n-
    6#define DUNE_ISTL_DILU_HH
    \n-
    7
    \n-
    8#include <cmath>
    \n-
    9#include <complex>
    \n-
    10#include <map>
    \n-
    11#include <vector>
    \n+
    3#ifndef DUNE_ISTL_COMMON_COUNTER_HH
    \n+
    4#define DUNE_ISTL_COMMON_COUNTER_HH
    \n+
    5
    \n+
    6#include <cassert>
    \n+
    7#include <typeinfo>
    \n+
    8#include <iostream>
    \n+
    9#include <memory>
    \n+
    10#include <tuple>
    \n+
    11#include <utility>
    \n
    12
    \n-
    13#include <dune/common/fmatrix.hh>
    \n-
    14#include <dune/common/scalarvectorview.hh>
    \n-
    15#include <dune/common/scalarmatrixview.hh>
    \n+
    13#include <dune/common/typeutilities.hh>
    \n+
    14
    \n+
    15constexpr std::size_t maxcount = 100;
    \n
    16
    \n-
    17#include "istlexception.hh"
    \n-
    18
    \n-
    23namespace Dune
    \n-
    24{
    \n-
    25
    \n-
    \n-
    30 namespace DILU
    \n-
    31 {
    \n-
    32
    \n-
    50 template <class M>
    \n-
    \n-
    51 void blockDILUDecomposition(M &A, std::vector<typename M::block_type> &Dinv_)
    \n-
    52 {
    \n-
    53 auto endi = A.end();
    \n-
    54 for (auto row = A.begin(); row != endi; ++row)
    \n-
    55 {
    \n-
    56 const auto row_i = row.index();
    \n-
    57 const auto col = row->find(row_i);
    \n-
    58 // initialise Dinv[i] = A[i, i]
    \n-
    59 Dinv_[row_i] = *col;
    \n-
    60 }
    \n-
    61
    \n-
    62 for (auto row = A.begin(); row != endi; ++row)
    \n-
    63 {
    \n-
    64 const auto row_i = row.index();
    \n-
    65 for (auto a_ij = row->begin(); a_ij.index() < row_i; ++a_ij)
    \n-
    66 {
    \n-
    67 const auto col_j = a_ij.index();
    \n-
    68 const auto a_ji = A[col_j].find(row_i);
    \n-
    69 // if A[i, j] != 0 and A[j, i] != 0
    \n-
    70 if (a_ji != A[col_j].end())
    \n-
    71 {
    \n-
    72 // Dinv[i] -= A[i, j] * d[j] * A[j, i]
    \n-
    73 Dinv_[row_i] -= (*a_ij) * Dinv_[col_j] * (*a_ji);
    \n-
    74 }
    \n-
    75 }
    \n-
    76
    \n-
    77 // store the inverse
    \n-
    78 try
    \n-
    79 {
    \n-
    80 Impl::asMatrix(Dinv_[row_i]).invert(); // compute inverse of diagonal block
    \n-
    81 }
    \n-
    82 catch (Dune::FMatrixError &e)
    \n-
    83 {
    \n-
    84 DUNE_THROW(MatrixBlockError, "DILU failed to invert matrix block D[" << row_i << "]"
    \n-
    85 << e.what();
    \n-
    86 th__ex.r = row_i;);
    \n-
    87 }
    \n-
    88 }
    \n-
    89 }
    \n-
    \n-
    90
    \n-
    106 template <class M, class X, class Y>
    \n-
    \n-
    107 void blockDILUBacksolve(const M &A, const std::vector<typename M::block_type> Dinv_, X &v, const Y &d)
    \n-
    108 {
    \n-
    109 using dblock = typename Y::block_type;
    \n-
    110 using vblock = typename X::block_type;
    \n-
    111
    \n-
    112 // lower triangular solve: (D + L_A) y = d
    \n-
    113 auto endi = A.end();
    \n-
    114 for (auto row = A.begin(); row != endi; ++row)
    \n-
    115 {
    \n-
    116 const auto row_i = row.index();
    \n-
    117 dblock rhsValue(d[row_i]);
    \n-
    118 auto &&rhs = Impl::asVector(rhsValue);
    \n-
    119 for (auto a_ij = (*row).begin(); a_ij.index() < row_i; ++a_ij)
    \n-
    120 {
    \n-
    121 // if A[i][j] != 0
    \n-
    122 // rhs -= A[i][j]* y[j], where v_j stores y_j
    \n-
    123 const auto col_j = a_ij.index();
    \n-
    124 Impl::asMatrix(*a_ij).mmv(v[col_j], rhs);
    \n-
    125 }
    \n-
    126 // y_i = Dinv_i * rhs
    \n-
    127 // storing y_i in v_i
    \n-
    128 auto &&vi = Impl::asVector(v[row_i]);
    \n-
    129 Impl::asMatrix(Dinv_[row_i]).mv(rhs, vi); // (D + L_A)_ii = D_i
    \n-
    130 }
    \n-
    131
    \n-
    132 // upper triangular solve: (D + U_A) v = Dy
    \n-
    133 auto rendi = A.beforeBegin();
    \n-
    134 for (auto row = A.beforeEnd(); row != rendi; --row)
    \n-
    135 {
    \n-
    136 const auto row_i = row.index();
    \n-
    137 // rhs = 0
    \n-
    138 vblock rhs(0.0);
    \n-
    139 for (auto a_ij = (*row).beforeEnd(); a_ij.index() > row_i; --a_ij)
    \n-
    140 {
    \n-
    141 // if A[i][j] != 0
    \n-
    142 // rhs += A[i][j]*v[j]
    \n-
    143 const auto col_j = a_ij.index();
    \n-
    144 Impl::asMatrix(*a_ij).umv(v[col_j], rhs);
    \n-
    145 }
    \n-
    146 // calculate update v = M^-1*d
    \n-
    147 // v_i = y_i - Dinv_i*rhs
    \n-
    148 // before update v_i is y_i
    \n-
    149 auto &&vi = Impl::asVector(v[row_i]);
    \n-
    150 Impl::asMatrix(Dinv_[row_i]).mmv(rhs, vi);
    \n-
    151 }
    \n-
    152 }
    \n-
    \n-
    153 } // end namespace DILU
    \n-
    \n-
    154
    \n-
    157} // end namespace
    \n-
    158
    \n-
    159#endif
    \n-\n-
    Col col
    Definition matrixmatrix.hh:351
    \n+
    \n+
    17#define DUNE_GET_COUNTER(Tag) \\
    \n+
    18 (counterFunc(Dune::PriorityTag<maxcount>{}, Tag{}, Dune::CounterImpl::ADLTag{}))
    \n+
    \n+
    19
    \n+
    \n+
    20#define DUNE_INC_COUNTER(Tag) \\
    \n+
    21 namespace { \\
    \n+
    22 namespace CounterImpl { \\
    \n+
    23 constexpr std::size_t \\
    \n+
    24 counterFunc(Dune::PriorityTag<DUNE_GET_COUNTER(Tag)+1> p, Tag, ADLTag) \\
    \n+
    25 { \\
    \n+
    26 return p.value; \\
    \n+
    27 } \\
    \n+
    28 } \\
    \n+
    29 } \\
    \n+
    30 static_assert(true, "unfudge indentation")
    \n+
    \n+
    31
    \n+
    32namespace Dune {
    \n+
    33 namespace {
    \n+
    34
    \n+
    \n+
    35 namespace CounterImpl {
    \n+
    36
    \n+
    37 struct ADLTag {};
    \n+
    38
    \n+
    39 template<class Tag>
    \n+
    40 constexpr std::size_t counterFunc(Dune::PriorityTag<0>, Tag, ADLTag)
    \n+
    41 {
    \n+
    42 return 0;
    \n+
    43 }
    \n+
    44
    \n+
    45 } // end namespace CounterImpl
    \n+
    \n+
    46 } // end empty namespace
    \n+
    47} // end namespace Dune
    \n+
    48#endif // DUNE_ISTL_COMMON_COUNTER_HH
    \n+
    constexpr std::size_t maxcount
    Definition counter.hh:15
    \n
    Definition allocator.hh:11
    \n-
    void blockDILUDecomposition(M &A, std::vector< typename M::block_type > &Dinv_)
    Definition dilu.hh:51
    \n-
    void blockDILUBacksolve(const M &A, const std::vector< typename M::block_type > Dinv_, X &v, const Y &d)
    Definition dilu.hh:107
    \n-
    Error when performing an operation on a matrix block.
    Definition istlexception.hh:52
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,147 +1,66 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-dilu.hh\n+ * _\bc_\bo_\bm_\bm_\bo_\bn\n+counter.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_DILU_HH\n-6#define DUNE_ISTL_DILU_HH\n-7\n-8#include \n-9#include \n-10#include \n-11#include \n+3#ifndef DUNE_ISTL_COMMON_COUNTER_HH\n+4#define DUNE_ISTL_COMMON_COUNTER_HH\n+5\n+6#include \n+7#include \n+8#include \n+9#include \n+10#include \n+11#include \n 12\n-13#include \n-14#include \n-15#include \n+13#include \n+14\n+_\b1_\b5constexpr std::size_t _\bm_\ba_\bx_\bc_\bo_\bu_\bn_\bt = 100;\n 16\n-17#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-18\n-23namespace _\bD_\bu_\bn_\be\n-24{\n-25\n-_\b3_\b0 namespace DILU\n-31 {\n-32\n-50 template \n-_\b5_\b1 void _\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(M &A, std::vector\n-&Dinv_)\n-52 {\n-53 auto endi = A.end();\n-54 for (auto row = A.begin(); row != endi; ++row)\n-55 {\n-56 const auto row_i = row.index();\n-57 const auto _\bc_\bo_\bl = row->find(row_i);\n-58 // initialise Dinv[i] = A[i, i]\n-59 Dinv_[row_i] = *_\bc_\bo_\bl;\n-60 }\n-61\n-62 for (auto row = A.begin(); row != endi; ++row)\n-63 {\n-64 const auto row_i = row.index();\n-65 for (auto a_ij = row->begin(); a_ij.index() < row_i; ++a_ij)\n-66 {\n-67 const auto col_j = a_ij.index();\n-68 const auto a_ji = A[col_j].find(row_i);\n-69 // if A[i, j] != 0 and A[j, i] != 0\n-70 if (a_ji != A[col_j].end())\n-71 {\n-72 // Dinv[i] -= A[i, j] * d[j] * A[j, i]\n-73 Dinv_[row_i] -= (*a_ij) * Dinv_[col_j] * (*a_ji);\n-74 }\n-75 }\n-76\n-77 // store the inverse\n-78 try\n-79 {\n-80 Impl::asMatrix(Dinv_[row_i]).invert(); // compute inverse of diagonal block\n-81 }\n-82 catch (Dune::FMatrixError &e)\n-83 {\n-84 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br, \"DILU failed to invert matrix block D[\" <<\n-row_i << \"]\"\n-85 << e.what();\n-86 th__ex.r = row_i;);\n-87 }\n-88 }\n-89 }\n-90\n-106 template \n-_\b1_\b0_\b7 void _\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be(const M &A, const std::vector Dinv_, X &v, const Y &d)\n-108 {\n-109 using dblock = typename Y::block_type;\n-110 using vblock = typename X::block_type;\n-111\n-112 // lower triangular solve: (D + L_A) y = d\n-113 auto endi = A.end();\n-114 for (auto row = A.begin(); row != endi; ++row)\n-115 {\n-116 const auto row_i = row.index();\n-117 dblock rhsValue(d[row_i]);\n-118 auto &&rhs = Impl::asVector(rhsValue);\n-119 for (auto a_ij = (*row).begin(); a_ij.index() < row_i; ++a_ij)\n-120 {\n-121 // if A[i][j] != 0\n-122 // rhs -= A[i][j]* y[j], where v_j stores y_j\n-123 const auto col_j = a_ij.index();\n-124 Impl::asMatrix(*a_ij).mmv(v[col_j], rhs);\n-125 }\n-126 // y_i = Dinv_i * rhs\n-127 // storing y_i in v_i\n-128 auto &&vi = Impl::asVector(v[row_i]);\n-129 Impl::asMatrix(Dinv_[row_i]).mv(rhs, vi); // (D + L_A)_ii = D_i\n-130 }\n-131\n-132 // upper triangular solve: (D + U_A) v = Dy\n-133 auto rendi = A.beforeBegin();\n-134 for (auto row = A.beforeEnd(); row != rendi; --row)\n-135 {\n-136 const auto row_i = row.index();\n-137 // rhs = 0\n-138 vblock rhs(0.0);\n-139 for (auto a_ij = (*row).beforeEnd(); a_ij.index() > row_i; --a_ij)\n-140 {\n-141 // if A[i][j] != 0\n-142 // rhs += A[i][j]*v[j]\n-143 const auto col_j = a_ij.index();\n-144 Impl::asMatrix(*a_ij).umv(v[col_j], rhs);\n-145 }\n-146 // calculate update v = M^-1*d\n-147 // v_i = y_i - Dinv_i*rhs\n-148 // before update v_i is y_i\n-149 auto &&vi = Impl::asVector(v[row_i]);\n-150 Impl::asMatrix(Dinv_[row_i]).mmv(rhs, vi);\n-151 }\n-152 }\n-153 } // end namespace DILU\n-154\n-157} // end namespace\n-158\n-159#endif\n-_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\b1_\b7#define DUNE_GET_COUNTER(Tag) \\\n+18 (counterFunc(Dune::PriorityTag{}, Tag{}, Dune::CounterImpl::ADLTag\n+{}))\n+19\n+_\b2_\b0#define DUNE_INC_COUNTER(Tag) \\\n+21 namespace { \\\n+22 namespace CounterImpl { \\\n+23 constexpr std::size_t \\\n+24 counterFunc(Dune::PriorityTag p, Tag, ADLTag) \\\n+25 { \\\n+26 return p.value; \\\n+27 } \\\n+28 } \\\n+29 } \\\n+30 static_assert(true, \"unfudge indentation\")\n+31\n+32namespace _\bD_\bu_\bn_\be {\n+33 namespace {\n+34\n+_\b3_\b5 namespace CounterImpl {\n+36\n+37 struct ADLTag {};\n+38\n+39 template\n+40 constexpr std::size_t counterFunc(Dune::PriorityTag<0>, Tag, ADLTag)\n+41 {\n+42 return 0;\n+43 }\n+44\n+45 } // end namespace CounterImpl\n+46 } // end empty namespace\n+47} // end namespace Dune\n+48#endif // DUNE_ISTL_COMMON_COUNTER_HH\n+_\bm_\ba_\bx_\bc_\bo_\bu_\bn_\bt\n+constexpr std::size_t maxcount\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn counter.hh:15\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-void blockDILUDecomposition(M &A, std::vector< typename M::block_type > &Dinv_)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dilu.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n-void blockDILUBacksolve(const M &A, const std::vector< typename M::block_type >\n-Dinv_, X &v, const Y &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dilu.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br\n-Error when performing an operation on a matrix block.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:52\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00056.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00056.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: solvercategory.hh File Reference\n+dune-istl: ildl.hh File Reference\n \n \n \n \n \n \n \n@@ -70,36 +70,55 @@\n
    \n \n
    \n \n
    \n \n-
    solvercategory.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    ildl.hh File Reference
    \n \n
    \n-
    #include <dune/common/exceptions.hh>
    \n+\n+

    Incomplete LDL decomposition. \n+More...

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

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-\n-\n-

    \n-Classes

    struct  Dune::SolverCategory
     Categories for the solvers. More...
     
    class  Dune::InvalidSolverCategory
     
    \n \n \n \n+

    \n Namespaces

    namespace  Dune
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+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)
     
    \n-
    \n+

    Detailed Description

    \n+

    Incomplete LDL decomposition.

    \n+
    Author
    Martin Nolte
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,21 +1,44 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-solvercategory.hh File Reference\n-#include \n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+ildl.hh File Reference\n+Incomplete LDL decomposition. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-\u00a0 Categories for the solvers. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, m, n > &B, const\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, m, n > &CT, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, m, n > &A)\n+\u00a0\n+template\n+static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT (const K &B, const K &CT, K &A, typename\n+ std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)\n+\u00a0\n+template\n+static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT (const _\bM_\ba_\bt_\br_\bi_\bx &B, const _\bM_\ba_\bt_\br_\bi_\bx &CT, _\bM_\ba_\bt_\br_\bi_\bx\n+ &A, typename std::enable_if_t::value >\n+ *sfinae=nullptr)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bd_\be_\bc_\bo_\bm_\bp_\bo_\bs_\be (_\bM_\ba_\bt_\br_\bi_\bx &A)\n+\u00a0 compute ILDL decomposition of a symmetric matrix A\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bb_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const _\bM_\ba_\bt_\br_\bi_\bx &A, X &v, const Y &d, bool\n+ isLowerTriangular=false)\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Incomplete LDL decomposition.\n+ Author\n+ Martin Nolte\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00056_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00056_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: solvercategory.hh Source File\n+dune-istl: ildl.hh Source File\n \n \n \n \n \n \n \n@@ -74,77 +74,246 @@\n \n
    \n \n
    \n \n
    \n-
    solvercategory.hh
    \n+
    ildl.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_SOLVERCATEGORY_HH
    \n-
    6#define DUNE_ISTL_SOLVERCATEGORY_HH
    \n-
    7
    \n-
    8#include <dune/common/exceptions.hh>
    \n+
    3#ifndef DUNE_ISTL_ILDL_HH
    \n+
    4#define DUNE_ISTL_ILDL_HH
    \n+
    5
    \n+
    6#include <dune/common/scalarvectorview.hh>
    \n+
    7#include <dune/common/scalarmatrixview.hh>
    \n+
    8#include "ilu.hh"
    \n
    9
    \n-
    10
    \n-
    11namespace Dune {
    \n-
    12
    \n-
    \n-\n-
    22 {
    \n-
    \n-
    23 enum Category {
    \n-\n-\n-\n-
    30 };
    \n-
    \n-
    31
    \n-
    33 template<typename OP>
    \n-
    \n-
    34 static Category category(const OP& op, decltype(op.category())* = nullptr)
    \n-
    35 {
    \n-
    36 return op.category();
    \n-
    37 }
    \n-
    \n-
    38
    \n-
    39#ifndef DOXYGEN
    \n-
    40 // template<typename OP>
    \n-
    41 // static Category category(const OP& op, decltype(op.getSolverCategory())* = nullptr)
    \n-
    42 // {
    \n-
    43 // return op.getSolverCategory();
    \n-
    44 // }
    \n-
    45
    \n-
    46 template<typename OP>
    \n-
    47 static Category category(const OP& op, decltype(op.category)* = nullptr)
    \n+
    17namespace Dune
    \n+
    18{
    \n+
    19
    \n+
    20 // bildl_subtractBCT
    \n+
    21 // -----------------
    \n+
    22
    \n+
    23 template< class K, int m, int n >
    \n+
    \n+\n+
    25 {
    \n+
    26 for( int i = 0; i < m; ++i )
    \n+
    27 {
    \n+
    28 for( int j = 0; j < n; ++j )
    \n+
    29 {
    \n+
    30 for( int k = 0; k < n; ++k )
    \n+
    31 A[ i ][ j ] -= B[ i ][ k ] * CT[ j ][ k ];
    \n+
    32 }
    \n+
    33 }
    \n+
    34 }
    \n+
    \n+
    35
    \n+
    36 template< class K >
    \n+
    \n+
    37 inline static void bildl_subtractBCT ( const K &B, const K &CT, K &A,
    \n+
    38 typename std::enable_if_t<Dune::IsNumber<K>::value>* sfinae = nullptr )
    \n+
    39 {
    \n+
    40 A -= B * CT;
    \n+
    41 }
    \n+
    \n+
    42
    \n+
    43 template< class Matrix >
    \n+
    \n+
    44 inline static void bildl_subtractBCT ( const Matrix &B, const Matrix &CT, Matrix &A,
    \n+
    45 typename std::enable_if_t<!Dune::IsNumber<Matrix>::value>* sfinae = nullptr )
    \n+
    46 {
    \n+
    47 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n
    48 {
    \n-
    49 return OP::category;
    \n-
    50 }
    \n-
    51#endif
    \n-
    52 };
    \n-
    \n-
    53
    \n-
    54 class InvalidSolverCategory : public InvalidStateException{};
    \n-
    55
    \n-
    58} // end namespace
    \n-
    59
    \n-
    60#endif
    \n+
    49 auto &&A_i = *i;
    \n+
    50 auto &&B_i = B[ i.index() ];
    \n+
    51 const auto ikend = B_i.end();
    \n+
    52 for( auto j = A_i.begin(), jend = A_i.end(); j != jend; ++j )
    \n+
    53 {
    \n+
    54 auto &&A_ij = *j;
    \n+
    55 auto &&CT_j = CT[ j.index() ];
    \n+
    56 const auto jkend = CT_j.end();
    \n+
    57 for( auto ik = B_i.begin(), jk = CT_j.begin(); (ik != ikend) && (jk != jkend); )
    \n+
    58 {
    \n+
    59 if( ik.index() == jk.index() )
    \n+
    60 {
    \n+
    61 bildl_subtractBCT( *ik, *jk, A_ij );
    \n+
    62 ++ik; ++jk;
    \n+
    63 }
    \n+
    64 else if( ik.index() < jk.index() )
    \n+
    65 ++ik;
    \n+
    66 else
    \n+
    67 ++jk;
    \n+
    68 }
    \n+
    69 }
    \n+
    70 }
    \n+
    71 }
    \n+
    \n+
    72
    \n+
    73
    \n+
    74
    \n+
    75 // bildl_decompose
    \n+
    76 // ---------------
    \n+
    77
    \n+
    87 template< class Matrix >
    \n+
    \n+
    88 inline void bildl_decompose ( Matrix &A )
    \n+
    89 {
    \n+
    90 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n+
    91 {
    \n+
    92 auto &&A_i = *i;
    \n+
    93
    \n+
    94 auto ij = A_i.begin();
    \n+
    95 for( ; ij.index() < i.index(); ++ij )
    \n+
    96 {
    \n+
    97 auto &&A_ij = *ij;
    \n+
    98 auto &&A_j = A[ ij.index() ];
    \n+
    99
    \n+
    100 // store L_ij Dj in A_ij (note: for k < i: A_kj = L_kj)
    \n+
    101 // L_ij Dj = A_ij - \\sum_{k < j} (L_ik D_k) L_jk^T
    \n+
    102 auto ik = A_i.begin();
    \n+
    103 auto jk = A_j.begin();
    \n+
    104 while( (ik != ij) && (jk.index() < ij.index()) )
    \n+
    105 {
    \n+
    106 if( ik.index() == jk.index() )
    \n+
    107 {
    \n+
    108 bildl_subtractBCT(*ik, *jk, A_ij);
    \n+
    109 ++ik; ++jk;
    \n+
    110 }
    \n+
    111 else if( ik.index() < jk.index() )
    \n+
    112 ++ik;
    \n+
    113 else
    \n+
    114 ++jk;
    \n+
    115 }
    \n+
    116 }
    \n+
    117
    \n+
    118 if( ij.index() != i.index() )
    \n+
    119 DUNE_THROW( ISTLError, "diagonal entry missing" );
    \n+
    120
    \n+
    121 // update diagonal and multiply A_ij by D_j^{-1}
    \n+
    122 auto &&A_ii = *ij;
    \n+
    123 for( auto ik = A_i.begin(); ik != ij; ++ik )
    \n+
    124 {
    \n+
    125 auto &&A_ik = *ik;
    \n+
    126 const auto &A_k = A[ ik.index() ];
    \n+
    127
    \n+
    128 auto B = A_ik;
    \n+
    129 Impl::asMatrix(A_ik).rightmultiply( Impl::asMatrix(*A_k.find( ik.index() )) );
    \n+
    130 bildl_subtractBCT( B, A_ik, A_ii );
    \n+
    131 }
    \n+
    132 try
    \n+
    133 {
    \n+
    134 Impl::asMatrix(A_ii).invert();
    \n+
    135 }
    \n+
    136 catch( const Dune::FMatrixError &e )
    \n+
    137 {
    \n+
    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() );
    \n+
    139 }
    \n+
    140 }
    \n+
    141 }
    \n+
    \n+
    142
    \n+
    143
    \n+
    144
    \n+
    145 // bildl_backsolve
    \n+
    146 // ---------------
    \n+
    147
    \n+
    148 template< class Matrix, class X, class Y >
    \n+
    \n+
    149 inline void bildl_backsolve ( const Matrix &A, X &v, const Y &d, bool isLowerTriangular = false )
    \n+
    150 {
    \n+
    151 // solve L v = d, note: Lii = I
    \n+
    152 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n+
    153 {
    \n+
    154 const auto &A_i = *i;
    \n+
    155 v[ i.index() ] = d[ i.index() ];
    \n+
    156 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij )
    \n+
    157 {
    \n+
    158 auto&& vi = Impl::asVector( v[ i.index() ] );
    \n+
    159 Impl::asMatrix(*ij).mmv(Impl::asVector( v[ ij.index() ] ), vi);
    \n+
    160 }
    \n+
    161 }
    \n+
    162
    \n+
    163 // solve D w = v, note: diagonal stores Dii^{-1}
    \n+
    164 if( isLowerTriangular )
    \n+
    165 {
    \n+
    166 // The matrix is lower triangular, so the diagonal entry is the
    \n+
    167 // last one in each row.
    \n+
    168 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n+
    169 {
    \n+
    170 const auto &A_i = *i;
    \n+
    171 const auto ii = A_i.beforeEnd();
    \n+
    172 assert( ii.index() == i.index() );
    \n+
    173 // We need to be careful here: Directly using
    \n+
    174 // auto rhs = Impl::asVector(v[ i.index() ]);
    \n+
    175 // is not OK in case this is a proxy. Hence
    \n+
    176 // we first have to copy the value. Notice that
    \n+
    177 // this is still not OK, if the vector type itself returns
    \n+
    178 // proxy references.
    \n+
    179 auto rhsValue = v[ i.index() ];
    \n+
    180 auto&& rhs = Impl::asVector(rhsValue);
    \n+
    181 auto&& vi = Impl::asVector( v[ i.index() ] );
    \n+
    182 Impl::asMatrix(*ii).mv(rhs, vi);
    \n+
    183 }
    \n+
    184 }
    \n+
    185 else
    \n+
    186 {
    \n+
    187 // Without assumptions on the sparsity pattern we have to search
    \n+
    188 // for the diagonal entry in each row.
    \n+
    189 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n+
    190 {
    \n+
    191 const auto &A_i = *i;
    \n+
    192 const auto ii = A_i.find( i.index() );
    \n+
    193 assert( ii.index() == i.index() );
    \n+
    194 // We need to be careful here: Directly using
    \n+
    195 // auto rhs = Impl::asVector(v[ i.index() ]);
    \n+
    196 // is not OK in case this is a proxy. Hence
    \n+
    197 // we first have to copy the value. Notice that
    \n+
    198 // this is still not OK, if the vector type itself returns
    \n+
    199 // proxy references.
    \n+
    200 auto rhsValue = v[ i.index() ];
    \n+
    201 auto&& rhs = Impl::asVector(rhsValue);
    \n+
    202 auto&& vi = Impl::asVector( v[ i.index() ] );
    \n+
    203 Impl::asMatrix(*ii).mv(rhs, vi);
    \n+
    204 }
    \n+
    205 }
    \n+
    206
    \n+
    207 // solve L^T v = w, note: only L is stored
    \n+
    208 // note: we perform the operation column-wise from right to left
    \n+
    209 for( auto i = A.beforeEnd(), iend = A.beforeBegin(); i != iend; --i )
    \n+
    210 {
    \n+
    211 const auto &A_i = *i;
    \n+
    212 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij )
    \n+
    213 {
    \n+
    214 auto&& vij = Impl::asVector( v[ ij.index() ] );
    \n+
    215 Impl::asMatrix(*ij).mmtv(Impl::asVector( v[ i.index() ] ), vij);
    \n+
    216 }
    \n+
    217 }
    \n+
    218 }
    \n+
    \n+
    219
    \n+
    220} // namespace Dune
    \n+
    221
    \n+
    222#endif // #ifndef DUNE_ISTL_ILDL_HH
    \n+
    The incomplete LU factorization kernels.
    \n
    Definition allocator.hh:11
    \n-
    Categories for the solvers.
    Definition solvercategory.hh:22
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n-
    @ nonoverlapping
    Category for non-overlapping solvers.
    Definition solvercategory.hh:27
    \n-
    @ overlapping
    Category for overlapping solvers.
    Definition solvercategory.hh:29
    \n-
    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
    \n-
    Definition solvercategory.hh:54
    \n+
    void bildl_decompose(Matrix &A)
    compute ILDL decomposition of a symmetric matrix A
    Definition ildl.hh:88
    \n+
    void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool isLowerTriangular=false)
    Definition ildl.hh:149
    \n+
    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
    \n+
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    Error when performing an operation on a matrix block.
    Definition istlexception.hh:52
    \n+
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    RowIterator beforeBegin()
    Definition matrix.hh:630
    \n+
    RowIterator beforeEnd()
    Definition matrix.hh:623
    \n+
    RowIterator end()
    Get iterator to one beyond last row.
    Definition matrix.hh:616
    \n+
    RowIterator begin()
    Get iterator to first row.
    Definition matrix.hh:610
    \n+
    Definition matrixutils.hh:27
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,85 +1,266 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-solvercategory.hh\n+ildl.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_SOLVERCATEGORY_HH\n-6#define DUNE_ISTL_SOLVERCATEGORY_HH\n-7\n-8#include \n+3#ifndef DUNE_ISTL_ILDL_HH\n+4#define DUNE_ISTL_ILDL_HH\n+5\n+6#include \n+7#include \n+8#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n 9\n-10\n-11namespace _\bD_\bu_\bn_\be {\n-12\n-_\b2_\b1 struct _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-22 {\n-_\b2_\b3 enum _\bC_\ba_\bt_\be_\bg_\bo_\br_\by {\n-_\b2_\b5 _\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl,\n-_\b2_\b7 _\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg,\n-29 _\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n-_\b3_\b0 };\n-31\n-33 template\n-_\b3_\b4 static _\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by(const OP& op, decltype(op.category())* = nullptr)\n-35 {\n-36 return op.category();\n-37 }\n-38\n-39#ifndef DOXYGEN\n-40 // template\n-41 // static Category category(const OP& op, decltype(op.getSolverCategory())*\n-= nullptr)\n-42 // {\n-43 // return op.getSolverCategory();\n-44 // }\n-45\n-46 template\n-47 static _\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by(const OP& op, decltype(op.category)* = nullptr)\n+17namespace _\bD_\bu_\bn_\be\n+18{\n+19\n+20 // bildl_subtractBCT\n+21 // -----------------\n+22\n+23 template< class K, int m, int n >\n+_\b2_\b4 inline static void _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bn_\b _\b> &B,\n+const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bn_\b _\b> &CT, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bn_\b _\b> &A )\n+25 {\n+26 for( int i = 0; i < m; ++i )\n+27 {\n+28 for( int j = 0; j < n; ++j )\n+29 {\n+30 for( int k = 0; k < n; ++k )\n+31 A[ i ][ j ] -= B[ i ][ k ] * CT[ j ][ k ];\n+32 }\n+33 }\n+34 }\n+35\n+36 template< class K >\n+_\b3_\b7 inline static void _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT ( const K &B, const K &CT, K &A,\n+38 typename std::enable_if_t::value>* sfinae = nullptr )\n+39 {\n+40 A -= B * CT;\n+41 }\n+42\n+43 template< class Matrix >\n+_\b4_\b4 inline static void _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT ( const _\bM_\ba_\bt_\br_\bi_\bx &B, const _\bM_\ba_\bt_\br_\bi_\bx &CT,\n+_\bM_\ba_\bt_\br_\bi_\bx &A,\n+45 typename std::enable_if_t::value>* sfinae = nullptr\n+)\n+46 {\n+47 for( auto i = A._\bb_\be_\bg_\bi_\bn(), iend = A._\be_\bn_\bd(); i != iend; ++i )\n 48 {\n-49 return OP::category;\n-50 }\n-51#endif\n-52 };\n-53\n-_\b5_\b4 class _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by : public InvalidStateException{};\n-55\n-58} // end namespace\n-59\n-60#endif\n+49 auto &&A_i = *i;\n+50 auto &&B_i = B[ i.index() ];\n+51 const auto ikend = B_i._\be_\bn_\bd();\n+52 for( auto j = A_i.begin(), jend = A_i.end(); j != jend; ++j )\n+53 {\n+54 auto &&A_ij = *j;\n+55 auto &&CT_j = CT[ j.index() ];\n+56 const auto jkend = CT_j._\be_\bn_\bd();\n+57 for( auto ik = B_i.begin(), jk = CT_j.begin(); (ik != ikend) && (jk !=\n+jkend); )\n+58 {\n+59 if( ik.index() == jk.index() )\n+60 {\n+61 _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT( *ik, *jk, A_ij );\n+62 ++ik; ++jk;\n+63 }\n+64 else if( ik.index() < jk.index() )\n+65 ++ik;\n+66 else\n+67 ++jk;\n+68 }\n+69 }\n+70 }\n+71 }\n+72\n+73\n+74\n+75 // bildl_decompose\n+76 // ---------------\n+77\n+87 template< class Matrix >\n+_\b8_\b8 inline void _\bb_\bi_\bl_\bd_\bl_\b__\bd_\be_\bc_\bo_\bm_\bp_\bo_\bs_\be ( _\bM_\ba_\bt_\br_\bi_\bx &A )\n+89 {\n+90 for( auto i = A._\bb_\be_\bg_\bi_\bn(), iend = A._\be_\bn_\bd(); i != iend; ++i )\n+91 {\n+92 auto &&A_i = *i;\n+93\n+94 auto ij = A_i.begin();\n+95 for( ; ij.index() < i.index(); ++ij )\n+96 {\n+97 auto &&A_ij = *ij;\n+98 auto &&A_j = A[ ij.index() ];\n+99\n+100 // store L_ij Dj in A_ij (note: for k < i: A_kj = L_kj)\n+101 // L_ij Dj = A_ij - \\sum_{k < j} (L_ik D_k) L_jk^T\n+102 auto ik = A_i._\bb_\be_\bg_\bi_\bn();\n+103 auto jk = A_j.begin();\n+104 while( (ik != ij) && (jk.index() < ij.index()) )\n+105 {\n+106 if( ik.index() == jk.index() )\n+107 {\n+108 _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT(*ik, *jk, A_ij);\n+109 ++ik; ++jk;\n+110 }\n+111 else if( ik.index() < jk.index() )\n+112 ++ik;\n+113 else\n+114 ++jk;\n+115 }\n+116 }\n+117\n+118 if( ij.index() != i.index() )\n+119 DUNE_THROW( _\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"diagonal entry missing\" );\n+120\n+121 // update diagonal and multiply A_ij by D_j^{-1}\n+122 auto &&A_ii = *ij;\n+123 for( auto ik = A_i.begin(); ik != ij; ++ik )\n+124 {\n+125 auto &&A_ik = *ik;\n+126 const auto &A_k = A[ ik.index() ];\n+127\n+128 auto B = A_ik;\n+129 Impl::asMatrix(A_ik).rightmultiply( Impl::asMatrix(*A_k.find( ik.index() ))\n+);\n+130 _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT( B, A_ik, A_ii );\n+131 }\n+132 try\n+133 {\n+134 Impl::asMatrix(A_ii).invert();\n+135 }\n+136 catch( const Dune::FMatrixError &e )\n+137 {\n+138 DUNE_THROW( _\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br, \"ILDL failed to invert matrix block A[\" <<\n+i.index() << \"][\" << ij.index() << \"]\" << e.what(); th__ex.r = i.index();\n+th__ex.c = ij.index() );\n+139 }\n+140 }\n+141 }\n+142\n+143\n+144\n+145 // bildl_backsolve\n+146 // ---------------\n+147\n+148 template< class Matrix, class X, class Y >\n+_\b1_\b4_\b9 inline void _\bb_\bi_\bl_\bd_\bl_\b__\bb_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be ( const _\bM_\ba_\bt_\br_\bi_\bx &A, X &v, const Y &d, bool\n+isLowerTriangular = false )\n+150 {\n+151 // solve L v = d, note: Lii = I\n+152 for( auto i = A._\bb_\be_\bg_\bi_\bn(), iend = A._\be_\bn_\bd(); i != iend; ++i )\n+153 {\n+154 const auto &A_i = *i;\n+155 v[ i.index() ] = d[ i.index() ];\n+156 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij )\n+157 {\n+158 auto&& vi = Impl::asVector( v[ i.index() ] );\n+159 Impl::asMatrix(*ij).mmv(Impl::asVector( v[ ij.index() ] ), vi);\n+160 }\n+161 }\n+162\n+163 // solve D w = v, note: diagonal stores Dii^{-1}\n+164 if( isLowerTriangular )\n+165 {\n+166 // The matrix is lower triangular, so the diagonal entry is the\n+167 // last one in each row.\n+168 for( auto i = A._\bb_\be_\bg_\bi_\bn(), iend = A._\be_\bn_\bd(); i != iend; ++i )\n+169 {\n+170 const auto &A_i = *i;\n+171 const auto ii = A_i.beforeEnd();\n+172 assert( ii.index() == i.index() );\n+173 // We need to be careful here: Directly using\n+174 // auto rhs = Impl::asVector(v[ i.index() ]);\n+175 // is not OK in case this is a proxy. Hence\n+176 // we first have to copy the value. Notice that\n+177 // this is still not OK, if the vector type itself returns\n+178 // proxy references.\n+179 auto rhsValue = v[ i.index() ];\n+180 auto&& rhs = Impl::asVector(rhsValue);\n+181 auto&& vi = Impl::asVector( v[ i.index() ] );\n+182 Impl::asMatrix(*ii).mv(rhs, vi);\n+183 }\n+184 }\n+185 else\n+186 {\n+187 // Without assumptions on the sparsity pattern we have to search\n+188 // for the diagonal entry in each row.\n+189 for( auto i = A._\bb_\be_\bg_\bi_\bn(), iend = A._\be_\bn_\bd(); i != iend; ++i )\n+190 {\n+191 const auto &A_i = *i;\n+192 const auto ii = A_i.find( i.index() );\n+193 assert( ii.index() == i.index() );\n+194 // We need to be careful here: Directly using\n+195 // auto rhs = Impl::asVector(v[ i.index() ]);\n+196 // is not OK in case this is a proxy. Hence\n+197 // we first have to copy the value. Notice that\n+198 // this is still not OK, if the vector type itself returns\n+199 // proxy references.\n+200 auto rhsValue = v[ i.index() ];\n+201 auto&& rhs = Impl::asVector(rhsValue);\n+202 auto&& vi = Impl::asVector( v[ i.index() ] );\n+203 Impl::asMatrix(*ii).mv(rhs, vi);\n+204 }\n+205 }\n+206\n+207 // solve L^T v = w, note: only L is stored\n+208 // note: we perform the operation column-wise from right to left\n+209 for( auto i = A._\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd(), iend = A._\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn(); i != iend; --i )\n+210 {\n+211 const auto &A_i = *i;\n+212 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij )\n+213 {\n+214 auto&& vij = Impl::asVector( v[ ij.index() ] );\n+215 Impl::asMatrix(*ij).mmtv(Impl::asVector( v[ i.index() ] ), vij);\n+216 }\n+217 }\n+218 }\n+219\n+220} // namespace Dune\n+221\n+222#endif // #ifndef DUNE_ISTL_ILDL_HH\n+_\bi_\bl_\bu_\b._\bh_\bh\n+The incomplete LU factorization kernels.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Categories for the solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:22\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n-@ nonoverlapping\n-Category for non-overlapping solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n-@ overlapping\n-Category for overlapping solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:29\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-static Category category(const OP &op, decltype(op.category()) *=nullptr)\n-Helperfunction to extract the solver category either from an enum, or from the\n-newly introduced virtu...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bd_\be_\bc_\bo_\bm_\bp_\bo_\bs_\be\n+void bildl_decompose(Matrix &A)\n+compute ILDL decomposition of a symmetric matrix A\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ildl.hh:88\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bb_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n+void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool\n+isLowerTriangular=false)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ildl.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT\n+static void bildl_subtractBCT(const FieldMatrix< K, m, n > &B, const\n+FieldMatrix< K, m, n > &CT, FieldMatrix< K, m, n > &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ildl.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+derive error class from the base class in common\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br\n+Error when performing an operation on a matrix block.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+A generic dynamic dense matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+RowIterator beforeBegin()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:630\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+RowIterator beforeEnd()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:623\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+RowIterator end()\n+Get iterator to one beyond last row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:616\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+RowIterator begin()\n+Get iterator to first row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:610\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00059.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00059.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: istlexception.hh File Reference\n+dune-istl: overlappingschwarz.hh File Reference\n \n \n \n \n \n \n \n@@ -71,46 +71,133 @@\n \n \n \n
    \n \n-
    istlexception.hh File Reference
    \n+Namespaces |\n+Typedefs
    \n+ \n \n
    \n-
    #include <dune/common/exceptions.hh>
    \n-#include <dune/common/fmatrix.hh>
    \n+\n+

    Contains one level overlapping Schwarz preconditioners. \n+More...

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

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::ISTLError
     derive error class from the base class in common More...
    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 > >
     
    class  Dune::BCRSMatrixError
     Error specific to BCRSMatrix. More...
    struct  Dune::AdderSelector< T, X, S >
     template meta program for choosing how to add the correction. More...
     
    class  Dune::ImplicitModeCompressionBufferExhausted
     Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted. More...
    struct  Dune::AdderSelector< AdditiveSchwarzMode, X, S >
     
    class  Dune::SolverAbort
     Thrown when a solver aborts due to some problem. More...
    struct  Dune::AdderSelector< MultiplicativeSchwarzMode, X, S >
     
    class  Dune::MatrixBlockError
     Error when performing an operation on a matrix block. More...
    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 > >
     
    \n \n \n \n+

    \n Namespaces

    namespace  Dune
     
    \n+\n+\n+\n+\n+\n+\n+\n

    \n+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 >
     
    \n-
    \n+

    Detailed Description

    \n+

    Contains one level overlapping Schwarz preconditioners.

    \n+
    Author
    Markus Blatt
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,33 +1,130 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-istlexception.hh File Reference\n-#include \n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs\n+overlappingschwarz.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+Contains one level overlapping Schwarz preconditioners. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n+#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n+#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh\"\n+#include \"_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh\"\n+#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+#include \"_\bi_\bl_\bu_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\"\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-\u00a0 derive error class from the base class in common _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bI_\b,_\b _\bS_\b,_\b _\bD_\b _\b>\n+\u00a0 Initializer for _\bS_\bu_\bp_\be_\br_\bL_\bU Matrices representing the subdomains. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n-\u00a0 Error specific to _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n+\u00a0 Tag that the tells the Schwarz method to be additive. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd\n-\u00a0 Thrown when the compression buffer used by the implicit _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n- construction is exhausted. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n+\u00a0 Tag that tells the Schwarz method to be multiplicative. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt\n-\u00a0 Thrown when a solver aborts due to some problem. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n+\u00a0 Tag that tells the Schwarz method to be multiplicative and symmetric.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br\n-\u00a0 Error when performing an operation on a matrix block. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bT_\b,_\b _\bt_\ba_\bg_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<\n+ _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be\n+ _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bT_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bT_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bX_\b,_\b _\bS_\b _\b>\n+\u00a0 template meta program for choosing how to add the correction. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\bo_\br_\bw_\ba_\br_\bd_\b _\b>\n+\u00a0 Helper template meta program for application of overlapping Schwarz.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bT_\b _\b>\n+\u00a0 Helper template meta program for application of overlapping Schwarz.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n+ _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bT_\bD_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bT_\b,_\b _\bt_\ba_\bg_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<\n+ _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,\n+ _\bt_\br_\bu_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,\n+ _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,\n+ _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bD_\b,_\b _\bT_\bA_\b _\b>\n+\u00a0 Sequential overlapping Schwarz preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be_\b<_\b _\bM_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br = _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br< T, _\bD_\bu_\bn_\be_\b:_\b:\n+ _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd< T >::value >\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br =\n+ _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br< T, _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd< T\n+ >::value >\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Contains one level overlapping Schwarz preconditioners.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00059_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00059_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: istlexception.hh Source File\n+dune-istl: overlappingschwarz.hh Source File\n \n \n \n \n \n \n \n@@ -74,65 +74,1666 @@\n \n
    \n \n
    \n \n
    \n-
    istlexception.hh
    \n+
    overlappingschwarz.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_ISTLEXCEPTION_HH
    \n-
    6#define DUNE_ISTL_ISTLEXCEPTION_HH
    \n-
    7
    \n-
    8#include <dune/common/exceptions.hh>
    \n-
    9#include <dune/common/fmatrix.hh>
    \n-
    10
    \n-
    11namespace Dune {
    \n-
    12
    \n-
    19 class ISTLError : public Dune::MathError {};
    \n-
    20
    \n-
    \n-\n-
    23 : public ISTLError
    \n-
    24 {};
    \n-
    \n-
    25
    \n-
    \n-\n-
    36 : public BCRSMatrixError
    \n-
    37 {};
    \n-
    \n-
    38
    \n-
    40
    \n-
    46 class SolverAbort : public ISTLError {};
    \n-
    47
    \n-
    49
    \n-
    \n-
    52 class MatrixBlockError : public virtual Dune::FMatrixError {
    \n-
    53 public:
    \n-
    54 int r, c; // row and column index of the entry from which the error resulted
    \n-
    55 };
    \n-
    \n-
    56
    \n-
    59} // end namespace
    \n+
    5#ifndef DUNE_ISTL_OVERLAPPINGSCHWARZ_HH
    \n+
    6#define DUNE_ISTL_OVERLAPPINGSCHWARZ_HH
    \n+
    7#include <cassert>
    \n+
    8#include <algorithm>
    \n+
    9#include <functional>
    \n+
    10#include <memory>
    \n+
    11#include <vector>
    \n+
    12#include <set>
    \n+
    13#include <dune/common/dynmatrix.hh>
    \n+
    14#include <dune/common/sllist.hh>
    \n+
    15
    \n+\n+
    17#include "preconditioners.hh"
    \n+
    18#include "superlu.hh"
    \n+
    19#include "umfpack.hh"
    \n+
    20#include "bvector.hh"
    \n+
    21#include "bcrsmatrix.hh"
    \n+
    22#include "ilusubdomainsolver.hh"
    \n+\n+
    24
    \n+
    25namespace Dune
    \n+
    26{
    \n+
    27
    \n+
    39 template<class M, class X, class TM, class TD, class TA>
    \n+
    40 class SeqOverlappingSchwarz;
    \n+
    41
    \n+
    45 template<class I, class S, class D>
    \n+
    \n+\n+
    47 {
    \n+
    48 public:
    \n+\n+
    51
    \n+
    52 typedef I InitializerList;
    \n+
    53 typedef typename InitializerList::value_type AtomInitializer;
    \n+
    54 typedef typename AtomInitializer::Matrix Matrix;
    \n+
    55 typedef typename Matrix::const_iterator Iter;
    \n+
    56 typedef typename Matrix::row_type::const_iterator CIter;
    \n+
    57
    \n+
    58 typedef S IndexSet;
    \n+
    59 typedef typename IndexSet::size_type size_type;
    \n
    60
    \n-
    61#endif
    \n+\n+
    62 const IndexSet& indices,
    \n+
    63 const subdomain_vector& domains);
    \n+
    64
    \n+
    65
    \n+
    66 void addRowNnz(const Iter& row);
    \n+
    67
    \n+
    68 void allocate();
    \n+
    69
    \n+
    70 void countEntries(const Iter& row, const CIter& col) const;
    \n+
    71
    \n+
    72 void calcColstart() const;
    \n+
    73
    \n+
    74 void copyValue(const Iter& row, const CIter& col) const;
    \n+
    75
    \n+
    76 void createMatrix() const;
    \n+
    77 private:
    \n+
    78 class IndexMap
    \n+
    79 {
    \n+
    80 public:
    \n+
    81 typedef typename S::size_type size_type;
    \n+
    82 typedef std::map<size_type,size_type> Map;
    \n+
    83 typedef typename Map::iterator iterator;
    \n+
    84 typedef typename Map::const_iterator const_iterator;
    \n+
    85
    \n+
    86 IndexMap();
    \n+
    87
    \n+
    88 void insert(size_type grow);
    \n+
    89
    \n+
    90 const_iterator find(size_type grow) const;
    \n+
    91
    \n+
    92 iterator find(size_type grow);
    \n+
    93
    \n+
    94 iterator begin();
    \n+
    95
    \n+
    96 const_iterator begin() const;
    \n+
    97
    \n+
    98 iterator end();
    \n+
    99
    \n+
    100 const_iterator end() const;
    \n+
    101
    \n+
    102 private:
    \n+
    103 std::map<size_type,size_type> map_;
    \n+
    104 size_type row;
    \n+
    105 };
    \n+
    106
    \n+
    107
    \n+
    108 typedef typename InitializerList::iterator InitIterator;
    \n+
    109 typedef typename IndexSet::const_iterator IndexIteratur;
    \n+
    110 InitializerList* initializers;
    \n+
    111 const IndexSet *indices;
    \n+
    112 mutable std::vector<IndexMap> indexMaps;
    \n+
    113 const subdomain_vector& domains;
    \n+
    114 };
    \n+
    \n+
    115
    \n+
    \n+\n+
    120 {};
    \n+
    \n+
    121
    \n+
    \n+\n+
    126 {};
    \n+
    \n+
    127
    \n+\n+
    134
    \n+
    139 template<class M, class X, class Y>
    \n+\n+
    141
    \n+
    142 // Specialization for BCRSMatrix
    \n+
    143 template<class K, class Al, class X, class Y>
    \n+
    \n+\n+
    145 {
    \n+
    146 typedef BCRSMatrix< K, Al> M;
    \n+
    147 public:
    \n+
    149 typedef typename std::remove_const<M>::type matrix_type;
    \n+
    150 typedef typename X::field_type field_type;
    \n+
    151 typedef typename std::remove_const<M>::type rilu_type;
    \n+
    153 typedef X domain_type;
    \n+
    155 typedef Y range_type;
    \n+
    156 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
    \n+
    157
    \n+
    \n+
    162 void apply (DynamicVector<field_type>& v, DynamicVector<field_type>& d)
    \n+
    163 {
    \n+
    164 assert(v.size() > 0);
    \n+
    165 assert(v.size() == d.size());
    \n+
    166 assert(A.rows() <= v.size());
    \n+
    167 assert(A.cols() <= v.size());
    \n+
    168 size_t sz = A.rows();
    \n+
    169 v.resize(sz);
    \n+
    170 d.resize(sz);
    \n+
    171 A.solve(v,d);
    \n+
    172 v.resize(v.capacity());
    \n+
    173 d.resize(d.capacity());
    \n+
    174 }
    \n+
    \n+
    175
    \n+
    183 template<class S>
    \n+
    \n+
    184 void setSubMatrix(const M& BCRS, S& rowset)
    \n+
    185 {
    \n+
    186 size_t sz = rowset.size();
    \n+
    187 A.resize(sz*n,sz*n);
    \n+
    188 typedef typename S::const_iterator SIter;
    \n+
    189 size_t r = 0;
    \n+
    190 for(SIter rowIdx = rowset.begin(), rowEnd=rowset.end();
    \n+
    191 rowIdx!= rowEnd; ++rowIdx, r++)
    \n+
    192 {
    \n+
    193 size_t c = 0;
    \n+
    194 for(SIter colIdx = rowset.begin(), colEnd=rowset.end();
    \n+
    195 colIdx!= colEnd; ++colIdx, c++)
    \n+
    196 {
    \n+
    197 if (BCRS[*rowIdx].find(*colIdx) == BCRS[*rowIdx].end())
    \n+
    198 continue;
    \n+
    199 for (size_t i=0; i<n; i++)
    \n+
    200 {
    \n+
    201 for (size_t j=0; j<n; j++)
    \n+
    202 {
    \n+
    203 A[r*n+i][c*n+j] = Impl::asMatrix(BCRS[*rowIdx][*colIdx])[i][j];
    \n+
    204 }
    \n+
    205 }
    \n+
    206 }
    \n+
    207 }
    \n+
    208 }
    \n+
    \n+
    209 private:
    \n+
    210 DynamicMatrix<K> A;
    \n+
    211 };
    \n+
    \n+
    212
    \n+
    213 template<typename T, bool tag>
    \n+
    \n+\n+
    215 {};
    \n+
    \n+
    216
    \n+
    217 template<typename T>
    \n+\n+
    219
    \n+
    220 // specialization for DynamicMatrix
    \n+
    221 template<class K, class Al, class X, class Y>
    \n+
    \n+\n+
    223 {
    \n+
    224 public:
    \n+\n+
    226 typedef typename X::field_type field_type;
    \n+
    227 typedef Y range_type;
    \n+
    228 typedef typename range_type::block_type block_type;
    \n+\n+
    230 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
    \n+
    238 OverlappingAssignerHelper(std::size_t maxlength, const BCRSMatrix<K, Al>& mat_, const X& b_, Y& x_);
    \n+
    239
    \n+
    243 inline
    \n+
    244 void deallocate();
    \n+
    245
    \n+
    249 inline
    \n+
    250 void resetIndexForNextDomain();
    \n+
    251
    \n+
    256 inline
    \n+
    257 DynamicVector<field_type> & lhs();
    \n+
    258
    \n+
    263 inline
    \n+
    264 DynamicVector<field_type> & rhs();
    \n+
    265
    \n+
    270 inline
    \n+
    271 void relaxResult(field_type relax);
    \n+
    272
    \n+
    277 void operator()(const size_type& domainIndex);
    \n+
    278
    \n+
    286 inline
    \n+
    287 void assignResult(block_type& res);
    \n+
    288
    \n+
    289 private:
    \n+
    293 const matrix_type* mat;
    \n+
    295 // we need a pointer, because we have to avoid deep copies
    \n+
    296 DynamicVector<field_type> * rhs_;
    \n+
    298 // we need a pointer, because we have to avoid deep copies
    \n+
    299 DynamicVector<field_type> * lhs_;
    \n+
    301 const range_type* b;
    \n+
    303 range_type* x;
    \n+
    305 std::size_t i;
    \n+
    307 std::size_t maxlength_;
    \n+
    308 };
    \n+
    \n+
    309
    \n+
    310#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n+
    311 template<template<class> class S, typename T, typename A>
    \n+
    \n+\n+
    313 {
    \n+\n+
    315 typedef typename S<BCRSMatrix<T, A>>::range_type range_type;
    \n+
    316 typedef typename range_type::field_type field_type;
    \n+
    317 typedef typename range_type::block_type block_type;
    \n+
    318
    \n+\n+
    320
    \n+
    321 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
    \n+
    322 static constexpr size_t m = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::cols;
    \n+
    330 OverlappingAssignerHelper(std::size_t maxlength, const matrix_type& mat,
    \n+
    331 const range_type& b, range_type& x);
    \n+
    337 void deallocate();
    \n+
    338
    \n+
    339 /*
    \n+
    340 * @brief Resets the local index to zero.
    \n+
    341 */
    \n+
    342 void resetIndexForNextDomain();
    \n+
    343
    \n+
    348 field_type* lhs();
    \n+
    349
    \n+
    354 field_type* rhs();
    \n+
    355
    \n+
    360 void relaxResult(field_type relax);
    \n+
    361
    \n+
    366 void operator()(const size_type& domain);
    \n+
    367
    \n+
    375 void assignResult(block_type& res);
    \n+
    376
    \n+
    377 private:
    \n+
    381 const matrix_type* mat;
    \n+
    383 field_type* rhs_;
    \n+
    385 field_type* lhs_;
    \n+
    387 const range_type* b;
    \n+
    389 range_type* x;
    \n+
    391 std::size_t i;
    \n+
    393 std::size_t maxlength_;
    \n+
    394 };
    \n+
    \n+
    395
    \n+
    396#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n+
    397
    \n+
    398 template<class M, class X, class Y>
    \n+
    \n+\n+
    400 {
    \n+
    401 public:
    \n+
    402 typedef M matrix_type;
    \n+
    403
    \n+
    404 typedef typename Y::field_type field_type;
    \n+
    405
    \n+
    406 typedef typename Y::block_type block_type;
    \n+
    407
    \n+
    408 typedef typename matrix_type::size_type size_type;
    \n+
    416 OverlappingAssignerILUBase(std::size_t maxlength, const M& mat,
    \n+
    417 const Y& b, X& x);
    \n+
    423 void deallocate();
    \n+
    424
    \n+\n+
    429
    \n+
    434 X& lhs();
    \n+
    435
    \n+
    440 Y& rhs();
    \n+
    441
    \n+
    446 void relaxResult(field_type relax);
    \n+
    447
    \n+
    452 void operator()(const size_type& domain);
    \n+
    453
    \n+
    461 void assignResult(block_type& res);
    \n+
    462
    \n+
    463 private:
    \n+
    467 const M* mat;
    \n+
    469 X* lhs_;
    \n+
    471 Y* rhs_;
    \n+
    473 const Y* b;
    \n+
    475 X* x;
    \n+
    477 size_type i;
    \n+
    478 };
    \n+
    \n+
    479
    \n+
    480 // specialization for ILU0
    \n+
    481 template<class M, class X, class Y>
    \n+
    \n+\n+
    483 : public OverlappingAssignerILUBase<M,X,Y>
    \n+
    484 {
    \n+
    485 public:
    \n+
    \n+
    493 OverlappingAssignerHelper(std::size_t maxlength, const M& mat,
    \n+
    494 const Y& b, X& x)
    \n+
    495 : OverlappingAssignerILUBase<M,X,Y>(maxlength, mat,b,x)
    \n+
    496 {}
    \n+
    \n+
    497 };
    \n+
    \n+
    498
    \n+
    499 // specialization for ILUN
    \n+
    500 template<class M, class X, class Y>
    \n+
    \n+\n+
    502 : public OverlappingAssignerILUBase<M,X,Y>
    \n+
    503 {
    \n+
    504 public:
    \n+
    \n+
    512 OverlappingAssignerHelper(std::size_t maxlength, const M& mat,
    \n+
    513 const Y& b, X& x)
    \n+
    514 : OverlappingAssignerILUBase<M,X,Y>(maxlength, mat,b,x)
    \n+
    515 {}
    \n+
    \n+
    516 };
    \n+
    \n+
    517
    \n+
    518 template<typename S, typename T>
    \n+
    \n+\n+
    520 {};
    \n+
    \n+
    521
    \n+
    522 template<typename S, typename T, typename A>
    \n+
    \n+
    523 struct AdditiveAdder<S, BlockVector<T,A> >
    \n+
    524 {
    \n+
    525 typedef typename A::size_type size_type;
    \n+
    526 typedef typename std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::field_type field_type;
    \n+\n+
    528 OverlappingAssigner<S>& assigner, const field_type& relax_);
    \n+
    529 void operator()(const size_type& domain);
    \n+
    530 void axpy();
    \n+
    531 static constexpr size_t n = std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::dimension;
    \n+
    532
    \n+
    533 private:
    \n+\n+\n+
    536 OverlappingAssigner<S>* assigner;
    \n+
    537 field_type relax;
    \n+
    538 };
    \n+
    \n+
    539
    \n+
    540 template<typename S,typename T>
    \n+
    \n+\n+
    542 {};
    \n+
    \n+
    543
    \n+
    544 template<typename S, typename T, typename A>
    \n+
    \n+\n+
    546 {
    \n+
    547 typedef typename A::size_type size_type;
    \n+
    548 typedef typename std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::field_type field_type;
    \n+\n+
    550 OverlappingAssigner<S>& assigner_, const field_type& relax_);
    \n+
    551 void operator()(const size_type& domain);
    \n+
    552 void axpy();
    \n+
    553 static constexpr size_t n = std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::dimension;
    \n+
    554
    \n+
    555 private:
    \n+\n+
    557 OverlappingAssigner<S>* assigner;
    \n+
    558 field_type relax;
    \n+
    559 };
    \n+
    \n+
    560
    \n+
    570 template<typename T, class X, class S>
    \n+
    \n+\n+
    572 {};
    \n+
    \n+
    573
    \n+
    574 template<class X, class S>
    \n+
    \n+\n+
    576 {
    \n+\n+
    578 };
    \n+
    \n+
    579
    \n+
    580 template<class X, class S>
    \n+
    \n+\n+
    582 {
    \n+\n+
    584 };
    \n+
    \n+
    585
    \n+
    586 template<class X, class S>
    \n+\n+
    591
    \n+
    603 template<typename T1, typename T2, bool forward>
    \n+
    \n+\n+
    605 {
    \n+
    606 typedef T1 solver_vector;
    \n+
    607 typedef typename solver_vector::iterator solver_iterator;
    \n+\n+
    609 typedef typename subdomain_vector::const_iterator domain_iterator;
    \n+
    610
    \n+
    \n+\n+
    612 {
    \n+
    613 return sv.begin();
    \n+
    614 }
    \n+
    \n+
    615
    \n+
    \n+\n+
    617 {
    \n+
    618 return sv.end();
    \n+
    619 }
    \n+
    \n+
    \n+\n+
    621 {
    \n+
    622 return sv.begin();
    \n+
    623 }
    \n+
    \n+
    624
    \n+
    \n+\n+
    626 {
    \n+
    627 return sv.end();
    \n+
    628 }
    \n+
    \n+
    629 };
    \n+
    \n+
    630
    \n+
    631 template<typename T1, typename T2>
    \n+
    \n+
    632 struct IteratorDirectionSelector<T1,T2,false>
    \n+
    633 {
    \n+
    634 typedef T1 solver_vector;
    \n+
    635 typedef typename solver_vector::reverse_iterator solver_iterator;
    \n+\n+
    637 typedef typename subdomain_vector::const_reverse_iterator domain_iterator;
    \n+
    638
    \n+
    \n+\n+
    640 {
    \n+
    641 return sv.rbegin();
    \n+
    642 }
    \n+
    \n+
    643
    \n+
    \n+\n+
    645 {
    \n+
    646 return sv.rend();
    \n+
    647 }
    \n+
    \n+
    \n+\n+
    649 {
    \n+
    650 return sv.rbegin();
    \n+
    651 }
    \n+
    \n+
    652
    \n+
    \n+\n+
    654 {
    \n+
    655 return sv.rend();
    \n+
    656 }
    \n+
    \n+
    657 };
    \n+
    \n+
    658
    \n+
    667 template<class T>
    \n+
    \n+\n+
    669 {
    \n+
    670 typedef T smoother;
    \n+
    671 typedef typename smoother::range_type range_type;
    \n+
    672
    \n+
    \n+
    673 static void apply(smoother& sm, range_type& v, const range_type& b)
    \n+
    674 {
    \n+
    675 sm.template apply<true>(v, b);
    \n+
    676 }
    \n+
    \n+
    677 };
    \n+
    \n+
    678
    \n+
    679 template<class M, class X, class TD, class TA>
    \n+
    \n+\n+
    681 {
    \n+\n+\n+
    684
    \n+
    \n+
    685 static void apply(smoother& sm, range_type& v, const range_type& b)
    \n+
    686 {
    \n+
    687 sm.template apply<true>(v, b);
    \n+
    688 sm.template apply<false>(v, b);
    \n+
    689 }
    \n+
    \n+
    690 };
    \n+
    \n+
    691
    \n+
    692 template<class T, bool tag>
    \n+\n+
    695
    \n+
    696 template<class T>
    \n+\n+
    698
    \n+
    699 template<class K, class Al, class X, class Y>
    \n+
    \n+\n+
    701 {
    \n+\n+
    703 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
    \n+
    704 template<class RowToDomain, class Solvers, class SubDomains>
    \n+
    705 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
    \n+
    706 Solvers& solvers, const SubDomains& domains,
    \n+
    707 bool onTheFly);
    \n+
    708 };
    \n+
    \n+
    709
    \n+
    710 template<template<class> class S, typename T, typename A>
    \n+
    \n+\n+
    712 {
    \n+\n+
    714 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
    \n+
    715 template<class RowToDomain, class Solvers, class SubDomains>
    \n+
    716 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
    \n+
    717 Solvers& solvers, const SubDomains& domains,
    \n+
    718 bool onTheFly);
    \n+
    719 };
    \n+
    \n+
    720
    \n+
    721 template<class M,class X, class Y>
    \n+
    \n+\n+
    723 {
    \n+
    724 typedef M matrix_type;
    \n+
    725 template<class RowToDomain, class Solvers, class SubDomains>
    \n+
    726 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
    \n+
    727 Solvers& solvers, const SubDomains& domains,
    \n+
    728 bool onTheFly);
    \n+
    729 };
    \n+
    \n+
    730
    \n+
    731 template<class M,class X, class Y>
    \n+
    \n+\n+\n+
    734 {};
    \n+
    \n+
    735
    \n+
    736 template<class M,class X, class Y>
    \n+
    \n+\n+\n+
    739 {};
    \n+
    \n+
    740
    \n+
    751 template<class M, class X, class TM=AdditiveSchwarzMode,
    \n+
    752 class TD=ILU0SubdomainSolver<M,X,X>, class TA=std::allocator<X> >
    \n+
    \n+\n+
    754 : public Preconditioner<X,X>
    \n+
    755 {
    \n+
    756 public:
    \n+
    760 typedef M matrix_type;
    \n+
    761
    \n+
    765 typedef X domain_type;
    \n+
    766
    \n+
    770 typedef X range_type;
    \n+
    771
    \n+
    778 typedef TM Mode;
    \n+
    779
    \n+
    783 typedef typename X::field_type field_type;
    \n+
    784
    \n+
    786 typedef typename matrix_type::size_type size_type;
    \n+
    787
    \n+
    789 typedef TA allocator;
    \n+
    790
    \n+
    792 typedef std::set<size_type, std::less<size_type>,
    \n+
    793 typename std::allocator_traits<TA>::template rebind_alloc<size_type> >
    \n+\n+
    795
    \n+
    797 typedef std::vector<subdomain_type, typename std::allocator_traits<TA>::template rebind_alloc<subdomain_type> > subdomain_vector;
    \n+
    798
    \n+\n+
    801
    \n+
    803 typedef std::vector<subdomain_list, typename std::allocator_traits<TA>::template rebind_alloc<subdomain_list> > rowtodomain_vector;
    \n+
    804
    \n+
    806 typedef TD slu;
    \n+
    807
    \n+
    809 typedef std::vector<slu, typename std::allocator_traits<TA>::template rebind_alloc<slu> > slu_vector;
    \n+
    810
    \n+
    \n+\n+
    825 field_type relaxationFactor=1, bool onTheFly_=true);
    \n+
    826
    \n+
    \n+\n+
    839 field_type relaxationFactor=1, bool onTheFly_=true);
    \n+
    840
    \n+
    \n+
    846 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] X& b)
    \n+
    847 {}
    \n+
    \n+
    848
    \n+
    \n+
    854 virtual void apply (X& v, const X& d);
    \n+
    855
    \n+
    \n+
    861 virtual void post ([[maybe_unused]] X& x)
    \n+
    862 {}
    \n+
    \n+
    863
    \n+
    864 template<bool forward>
    \n+
    \n+
    865 void apply(X& v, const X& d);
    \n+
    866
    \n+
    \n+\n+
    869 {
    \n+\n+
    871 }
    \n+
    \n+
    872
    \n+
    873 private:
    \n+
    874 const M& mat;
    \n+
    875 slu_vector solvers;
    \n+
    876 subdomain_vector subDomains;
    \n+
    877 field_type relax;
    \n+
    878
    \n+
    879 typename M::size_type maxlength;
    \n+
    880
    \n+
    881 bool onTheFly;
    \n+
    882 };
    \n+
    883
    \n+
    884
    \n+
    885
    \n+
    886 template<class I, class S, class D>
    \n+
    \n+\n+
    888 const IndexSet& idx,
    \n+
    889 const subdomain_vector& domains_)
    \n+
    890 : initializers(&il), indices(&idx), indexMaps(il.size()), domains(domains_)
    \n+
    891 {}
    \n+
    \n+
    892
    \n+
    893
    \n+
    894 template<class I, class S, class D>
    \n+
    \n+\n+
    896 {
    \n+
    897 typedef typename IndexSet::value_type::const_iterator iterator;
    \n+
    898 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)[row.index()].end(); ++domain) {
    \n+
    899 (*initializers)[*domain].addRowNnz(row, domains[*domain]);
    \n+
    900 indexMaps[*domain].insert(row.index());
    \n+
    901 }
    \n+
    902 }
    \n+
    \n+
    903
    \n+
    904 template<class I, class S, class D>
    \n+
    \n+\n+
    906 {
    \n+
    907 for(auto&& i: *initializers)
    \n+
    908 i.allocateMatrixStorage();
    \n+
    909 for(auto&& i: *initializers)
    \n+
    910 i.allocateMarker();
    \n+
    911 }
    \n+
    \n+
    912
    \n+
    913 template<class I, class S, class D>
    \n+
    \n+\n+
    915 {
    \n+
    916 typedef typename IndexSet::value_type::const_iterator iterator;
    \n+
    917 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)[row.index()].end(); ++domain) {
    \n+
    918 typename std::map<size_type,size_type>::const_iterator v = indexMaps[*domain].find(col.index());
    \n+
    919 if(v!= indexMaps[*domain].end()) {
    \n+
    920 (*initializers)[*domain].countEntries(indexMaps[*domain].find(col.index())->second);
    \n+
    921 }
    \n+
    922 }
    \n+
    923 }
    \n+
    \n+
    924
    \n+
    925 template<class I, class S, class D>
    \n+
    \n+\n+
    927 {
    \n+
    928 for(auto&& i : *initializers)
    \n+
    929 i.calcColstart();
    \n+
    930 }
    \n+
    \n+
    931
    \n+
    932 template<class I, class S, class D>
    \n+
    \n+\n+
    934 {
    \n+
    935 typedef typename IndexSet::value_type::const_iterator iterator;
    \n+
    936 for(iterator domain=(*indices)[row.index()].begin(); domain!= (*indices)[row.index()].end(); ++domain) {
    \n+
    937 typename std::map<size_type,size_type>::const_iterator v = indexMaps[*domain].find(col.index());
    \n+
    938 if(v!= indexMaps[*domain].end()) {
    \n+
    939 assert(indexMaps[*domain].end()!=indexMaps[*domain].find(row.index()));
    \n+
    940 (*initializers)[*domain].copyValue(col, indexMaps[*domain].find(row.index())->second,
    \n+
    941 v->second);
    \n+
    942 }
    \n+
    943 }
    \n+
    944 }
    \n+
    \n+
    945
    \n+
    946 template<class I, class S, class D>
    \n+
    \n+\n+
    948 {
    \n+
    949 std::vector<IndexMap>().swap(indexMaps);
    \n+
    950 for(auto&& i: *initializers)
    \n+
    951 i.createMatrix();
    \n+
    952 }
    \n+
    \n+
    953
    \n+
    954 template<class I, class S, class D>
    \n+\n+
    958
    \n+
    959 template<class I, class S, class D>
    \n+
    \n+\n+
    961 {
    \n+
    962 assert(map_.find(grow)==map_.end());
    \n+
    963 map_.insert(std::make_pair(grow, row++));
    \n+
    964 }
    \n+
    \n+
    965
    \n+
    966 template<class I, class S, class D>
    \n+
    967 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
    \n+
    \n+\n+
    969 {
    \n+
    970 return map_.find(grow);
    \n+
    971 }
    \n+
    \n+
    972
    \n+
    973 template<class I, class S, class D>
    \n+
    974 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
    \n+
    \n+\n+
    976 {
    \n+
    977 return map_.find(grow);
    \n+
    978 }
    \n+
    \n+
    979
    \n+
    980 template<class I, class S, class D>
    \n+
    981 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
    \n+
    \n+\n+
    983 {
    \n+
    984 return map_.end();
    \n+
    985 }
    \n+
    \n+
    986
    \n+
    987 template<class I, class S, class D>
    \n+
    988 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
    \n+
    \n+\n+
    990 {
    \n+
    991 return map_.end();
    \n+
    992 }
    \n+
    \n+
    993
    \n+
    994 template<class I, class S, class D>
    \n+
    995 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
    \n+
    \n+\n+
    997 {
    \n+
    998 return map_.begin();
    \n+
    999 }
    \n+
    \n+
    1000
    \n+
    1001 template<class I, class S, class D>
    \n+
    1002 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
    \n+
    \n+\n+
    1004 {
    \n+
    1005 return map_.begin();
    \n+
    1006 }
    \n+
    \n+
    1007
    \n+
    1008 template<class M, class X, class TM, class TD, class TA>
    \n+
    \n+\n+
    1010 field_type relaxationFactor, bool fly)
    \n+
    1011 : mat(mat_), relax(relaxationFactor), onTheFly(fly)
    \n+
    1012 {
    \n+
    1013 typedef typename rowtodomain_vector::const_iterator RowDomainIterator;
    \n+
    1014 typedef typename subdomain_list::const_iterator DomainIterator;
    \n+
    1015#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1016 assert(rowToDomain.size()==mat.N());
    \n+
    1017 assert(rowToDomain.size()==mat.M());
    \n+
    1018
    \n+
    1019 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter)
    \n+
    1020 assert(iter->size()>0);
    \n+
    1021
    \n+
    1022#endif
    \n+
    1023 // calculate the number of domains
    \n+
    1024 size_type domains=0;
    \n+
    1025 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter)
    \n+
    1026 for(DomainIterator d=iter->begin(); d != iter->end(); ++d)
    \n+
    1027 domains=std::max(domains, *d);
    \n+
    1028 ++domains;
    \n+
    1029
    \n+
    1030 solvers.resize(domains);
    \n+
    1031 subDomains.resize(domains);
    \n+
    1032
    \n+
    1033 // initialize subdomains to row mapping from row to subdomain mapping
    \n+
    1034 size_type row=0;
    \n+
    1035 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter, ++row)
    \n+
    1036 for(DomainIterator d=iter->begin(); d != iter->end(); ++d)
    \n+
    1037 subDomains[*d].insert(row);
    \n+
    1038
    \n+
    1039#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1040 size_type i=0;
    \n+
    1041 typedef typename subdomain_vector::const_iterator iterator;
    \n+
    1042 for(iterator iter=subDomains.begin(); iter != subDomains.end(); ++iter) {
    \n+
    1043 typedef typename subdomain_type::const_iterator entry_iterator;
    \n+
    1044 Dune::dvverb<<"domain "<<i++<<":";
    \n+
    1045 for(entry_iterator entry = iter->begin(); entry != iter->end(); ++entry) {
    \n+
    1046 Dune::dvverb<<" "<<*entry;
    \n+
    1047 }
    \n+
    1048 Dune::dvverb<<std::endl;
    \n+
    1049 }
    \n+
    1050#endif
    \n+\n+
    1052 ::assembleLocalProblems(rowToDomain, mat, solvers, subDomains, onTheFly);
    \n+
    1053 }
    \n+
    \n+
    1054
    \n+
    1055 template<class M, class X, class TM, class TD, class TA>
    \n+
    \n+\n+
    1057 const subdomain_vector& sd,
    \n+
    1058 field_type relaxationFactor,
    \n+
    1059 bool fly)
    \n+
    1060 : mat(mat_), solvers(sd.size()), subDomains(sd), relax(relaxationFactor),
    \n+
    1061 onTheFly(fly)
    \n+
    1062 {
    \n+
    1063 typedef typename subdomain_vector::const_iterator DomainIterator;
    \n+
    1064
    \n+
    1065#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1066 size_type i=0;
    \n+
    1067
    \n+
    1068 for(DomainIterator d=sd.begin(); d != sd.end(); ++d,++i) {
    \n+
    1069 //std::cout<<i<<": "<<d->size()<<std::endl;
    \n+
    1070 assert(d->size()>0);
    \n+
    1071 typedef typename DomainIterator::value_type::const_iterator entry_iterator;
    \n+
    1072 Dune::dvverb<<"domain "<<i<<":";
    \n+
    1073 for(entry_iterator entry = d->begin(); entry != d->end(); ++entry) {
    \n+
    1074 Dune::dvverb<<" "<<*entry;
    \n+
    1075 }
    \n+
    1076 Dune::dvverb<<std::endl;
    \n+
    1077 }
    \n+
    1078
    \n+
    1079#endif
    \n+
    1080
    \n+
    1081 // Create a row to subdomain mapping
    \n+\n+
    1083
    \n+\n+
    1085
    \n+
    1086 for(DomainIterator domain=sd.begin(); domain != sd.end(); ++domain, ++domainId) {
    \n+
    1087 typedef typename subdomain_type::const_iterator iterator;
    \n+
    1088 for(iterator row=domain->begin(); row != domain->end(); ++row)
    \n+
    1089 rowToDomain[*row].push_back(domainId);
    \n+
    1090 }
    \n+
    1091
    \n+\n+
    1093 ::assembleLocalProblems(rowToDomain, mat, solvers, subDomains, onTheFly);
    \n+
    1094 }
    \n+
    \n+
    1095
    \n+
    1102 template<class M>
    \n+\n+
    1104
    \n+
    1105 template<typename T, typename A>
    \n+
    \n+\n+
    1107 {
    \n+
    1108 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
    \n+
    1109 static constexpr size_t m = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::cols;
    \n+
    1110 template<class Domain>
    \n+
    \n+
    1111 static int size(const Domain & d)
    \n+
    1112 {
    \n+
    1113 assert(n==m);
    \n+
    1114 return m*d.size();
    \n+
    1115 }
    \n+
    \n+
    1116 };
    \n+
    \n+
    1117
    \n+
    1118 template<class K, class Al, class X, class Y>
    \n+
    1119 template<class RowToDomain, class Solvers, class SubDomains>
    \n+
    1120 std::size_t
    \n+
    \n+\n+
    1122 assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain,
    \n+
    1123 [[maybe_unused]] const matrix_type& mat,
    \n+
    1124 [[maybe_unused]] Solvers& solvers,
    \n+
    1125 const SubDomains& subDomains,
    \n+
    1126 [[maybe_unused]] bool onTheFly)
    \n+
    1127 {
    \n+
    1128 typedef typename SubDomains::const_iterator DomainIterator;
    \n+
    1129 std::size_t maxlength = 0;
    \n+
    1130
    \n+
    1131 assert(onTheFly);
    \n+
    1132
    \n+
    1133 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
    \n+
    1134 maxlength=std::max(maxlength, domain->size());
    \n+
    1135 maxlength*=n;
    \n+
    1136
    \n+
    1137 return maxlength;
    \n+
    1138 }
    \n+
    \n+
    1139
    \n+
    1140#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n+
    1141 template<template<class> class S, typename T, typename A>
    \n+
    1142 template<class RowToDomain, class Solvers, class SubDomains>
    \n+
    \n+
    1143 std::size_t SeqOverlappingSchwarzAssemblerHelper<S<BCRSMatrix<T,A>>,true>::assembleLocalProblems(const RowToDomain& rowToDomain,
    \n+
    1144 const matrix_type& mat,
    \n+
    1145 Solvers& solvers,
    \n+
    1146 const SubDomains& subDomains,
    \n+
    1147 bool onTheFly)
    \n+
    1148 {
    \n+
    1149 typedef typename S<BCRSMatrix<T,A>>::MatrixInitializer MatrixInitializer;
    \n+
    1150 typedef typename std::vector<MatrixInitializer>::iterator InitializerIterator;
    \n+
    1151 typedef typename SubDomains::const_iterator DomainIterator;
    \n+
    1152 typedef typename Solvers::iterator SolverIterator;
    \n+
    1153 std::size_t maxlength = 0;
    \n+
    1154
    \n+
    1155 if(onTheFly) {
    \n+
    1156 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
    \n+
    1157 maxlength=std::max(maxlength, domain->size());
    \n+
    1158 maxlength*=Impl::asMatrix(*mat[0].begin()).N();
    \n+
    1159 }else{
    \n+
    1160 // initialize the initializers
    \n+
    1161 DomainIterator domain=subDomains.begin();
    \n+
    1162
    \n+
    1163 // Create the initializers list.
    \n+
    1164 std::vector<MatrixInitializer> initializers(subDomains.size());
    \n+
    1165
    \n+
    1166 SolverIterator solver=solvers.begin();
    \n+
    1167 for(InitializerIterator initializer=initializers.begin(); initializer!=initializers.end();
    \n+
    1168 ++initializer, ++solver, ++domain) {
    \n+
    1169 solver->getInternalMatrix().N_=SeqOverlappingSchwarzDomainSize<matrix_type>::size(*domain);
    \n+
    1170 solver->getInternalMatrix().M_=SeqOverlappingSchwarzDomainSize<matrix_type>::size(*domain);
    \n+
    1171 //solver->setVerbosity(true);
    \n+
    1172 *initializer=MatrixInitializer(solver->getInternalMatrix());
    \n+
    1173 }
    \n+
    1174
    \n+
    1175 // Set up the supermatrices according to the subdomains
    \n+\n+
    1177 RowToDomain, SubDomains> Initializer;
    \n+
    1178
    \n+
    1179 Initializer initializer(initializers, rowToDomain, subDomains);
    \n+
    1180 copyToBCCSMatrix(initializer, mat);
    \n+
    1181
    \n+
    1182 // Calculate the LU decompositions
    \n+
    1183 for(auto&& s: solvers)
    \n+
    1184 s.decompose();
    \n+
    1185 for (SolverIterator solverIt = solvers.begin(); solverIt != solvers.end(); ++solverIt)
    \n+
    1186 {
    \n+
    1187 assert(solverIt->getInternalMatrix().N() == solverIt->getInternalMatrix().M());
    \n+
    1188 maxlength = std::max(maxlength, solverIt->getInternalMatrix().N());
    \n+
    1189 }
    \n+
    1190 }
    \n+
    1191 return maxlength;
    \n+
    1192 }
    \n+
    \n+
    1193
    \n+
    1194#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n+
    1195
    \n+
    1196 template<class M,class X,class Y>
    \n+
    1197 template<class RowToDomain, class Solvers, class SubDomains>
    \n+
    \n+
    1198 std::size_t SeqOverlappingSchwarzAssemblerILUBase<M,X,Y>::assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain,
    \n+
    1199 const matrix_type& mat,
    \n+
    1200 Solvers& solvers,
    \n+
    1201 const SubDomains& subDomains,
    \n+
    1202 bool onTheFly)
    \n+
    1203 {
    \n+
    1204 typedef typename SubDomains::const_iterator DomainIterator;
    \n+
    1205 typedef typename Solvers::iterator SolverIterator;
    \n+
    1206 std::size_t maxlength = 0;
    \n+
    1207
    \n+
    1208 if(onTheFly) {
    \n+
    1209 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
    \n+
    1210 maxlength=std::max(maxlength, domain->size());
    \n+
    1211 }else{
    \n+
    1212 // initialize the solvers of the local problems.
    \n+
    1213 SolverIterator solver=solvers.begin();
    \n+
    1214 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();
    \n+
    1215 ++domain, ++solver) {
    \n+
    1216 solver->setSubMatrix(mat, *domain);
    \n+
    1217 maxlength=std::max(maxlength, domain->size());
    \n+
    1218 }
    \n+
    1219 }
    \n+
    1220
    \n+
    1221 return maxlength;
    \n+
    1222
    \n+
    1223 }
    \n+
    \n+
    1224
    \n+
    1225
    \n+
    1226 template<class M, class X, class TM, class TD, class TA>
    \n+
    \n+\n+
    1228 {
    \n+\n+
    1230 }
    \n+
    \n+
    1231
    \n+
    1232 template<class M, class X, class TM, class TD, class TA>
    \n+
    1233 template<bool forward>
    \n+
    \n+\n+
    1235 {
    \n+
    1236 typedef slu_vector solver_vector;
    \n+\n+\n+
    1239 domain_iterator;
    \n+
    1240
    \n+
    1241 OverlappingAssigner<TD> assigner(maxlength, mat, b, x);
    \n+
    1242
    \n+\n+\n+
    1245 X v(x); // temporary for the update
    \n+
    1246 v=0;
    \n+
    1247
    \n+
    1248 typedef typename AdderSelector<TM,X,TD >::Adder Adder;
    \n+
    1249 Adder adder(v, x, assigner, relax);
    \n+
    1250
    \n+\n+
    1252 //Copy rhs to C-array for SuperLU
    \n+
    1253 std::for_each(domain->begin(), domain->end(), assigner);
    \n+
    1254 assigner.resetIndexForNextDomain();
    \n+
    1255 if(onTheFly) {
    \n+
    1256 // Create the subdomain solver
    \n+
    1257 slu sdsolver;
    \n+
    1258 sdsolver.setSubMatrix(mat, *domain);
    \n+
    1259 // Apply
    \n+
    1260 sdsolver.apply(assigner.lhs(), assigner.rhs());
    \n+
    1261 }else{
    \n+
    1262 solver->apply(assigner.lhs(), assigner.rhs());
    \n+
    1263 ++solver;
    \n+
    1264 }
    \n+
    1265
    \n+
    1266 //Add relaxed correction to from SuperLU to v
    \n+
    1267 std::for_each(domain->begin(), domain->end(), adder);
    \n+
    1268 assigner.resetIndexForNextDomain();
    \n+
    1269
    \n+
    1270 }
    \n+
    1271
    \n+
    1272 adder.axpy();
    \n+
    1273 assigner.deallocate();
    \n+
    1274 }
    \n+
    \n+
    \n+
    1275
    \n+
    1276 template<class K, class Al, class X, class Y>
    \n+\n+
    \n+
    1278 ::OverlappingAssignerHelper(std::size_t maxlength, const BCRSMatrix<K, Al>& mat_,
    \n+
    1279 const X& b_, Y& x_) :
    \n+
    1280 mat(&mat_),
    \n+
    1281 rhs_( new DynamicVector<field_type>(maxlength, 42) ),
    \n+
    1282 lhs_( new DynamicVector<field_type>(maxlength, -42) ),
    \n+
    1283 b(&b_),
    \n+
    1284 x(&x_),
    \n+
    1285 i(0),
    \n+
    1286 maxlength_(maxlength)
    \n+
    1287 {}
    \n+
    \n+
    1288
    \n+
    1289 template<class K, class Al, class X, class Y>
    \n+
    1290 void
    \n+\n+
    \n+
    1292 ::deallocate()
    \n+
    1293 {
    \n+
    1294 delete rhs_;
    \n+
    1295 delete lhs_;
    \n+
    1296 }
    \n+
    \n+
    1297
    \n+
    1298 template<class K, class Al, class X, class Y>
    \n+
    1299 void
    \n+\n+
    \n+
    1301 ::resetIndexForNextDomain()
    \n+
    1302 {
    \n+
    1303 i=0;
    \n+
    1304 }
    \n+
    \n+
    1305
    \n+
    1306 template<class K, class Al, class X, class Y>
    \n+
    1307 DynamicVector<typename X::field_type> &
    \n+\n+
    \n+
    1309 ::lhs()
    \n+
    1310 {
    \n+
    1311 return *lhs_;
    \n+
    1312 }
    \n+
    \n+
    1313
    \n+
    1314 template<class K, class Al, class X, class Y>
    \n+
    1315 DynamicVector<typename X::field_type> &
    \n+\n+
    \n+
    1317 ::rhs()
    \n+
    1318 {
    \n+
    1319 return *rhs_;
    \n+
    1320 }
    \n+
    \n+
    1321
    \n+
    1322 template<class K, class Al, class X, class Y>
    \n+
    1323 void
    \n+\n+
    \n+
    1325 ::relaxResult(field_type relax)
    \n+
    1326 {
    \n+
    1327 lhs() *= relax;
    \n+
    1328 }
    \n+
    \n+
    1329
    \n+
    1330 template<class K, class Al, class X, class Y>
    \n+
    1331 void
    \n+\n+
    \n+
    1333 ::operator()(const size_type& domainIndex)
    \n+
    1334 {
    \n+
    1335 lhs() = 0.0;
    \n+
    1336#if 0
    \n+
    1337 //assign right hand side of current domainindex block
    \n+
    1338 for(size_type j=0; j<n; ++j, ++i) {
    \n+
    1339 assert(i<maxlength_);
    \n+
    1340 rhs()[i]=(*b)[domainIndex][j];
    \n+
    1341 }
    \n+
    1342
    \n+
    1343 // loop over all Matrix row entries and calculate defect.
    \n+
    1344 typedef typename matrix_type::ConstColIterator col_iterator;
    \n+
    1345
    \n+
    1346 // calculate defect for current row index block
    \n+
    1347 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
    \n+
    1348 block_type tmp(0.0);
    \n+
    1349 (*col).mv((*x)[col.index()], tmp);
    \n+
    1350 i-=n;
    \n+
    1351 for(size_type j=0; j<n; ++j, ++i) {
    \n+
    1352 assert(i<maxlength_);
    \n+
    1353 rhs()[i]-=tmp[j];
    \n+
    1354 }
    \n+
    1355 }
    \n+
    1356#else
    \n+
    1357 //assign right hand side of current domainindex block
    \n+
    1358 for(size_type j=0; j<n; ++j, ++i) {
    \n+
    1359 assert(i<maxlength_);
    \n+
    1360 rhs()[i]=Impl::asVector((*b)[domainIndex])[j];
    \n+
    1361
    \n+
    1362 // loop over all Matrix row entries and calculate defect.
    \n+
    1363 typedef typename matrix_type::ConstColIterator col_iterator;
    \n+
    1364
    \n+
    1365 // calculate defect for current row index block
    \n+
    1366 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
    \n+
    1367 for(size_type k=0; k<n; ++k) {
    \n+
    1368 rhs()[i]-=Impl::asMatrix(*col)[j][k] * Impl::asVector((*x)[col.index()])[k];
    \n+
    1369 }
    \n+
    1370 }
    \n+
    1371 }
    \n+
    1372#endif
    \n+
    1373 }
    \n+
    \n+
    1374
    \n+
    1375 template<class K, class Al, class X, class Y>
    \n+
    1376 void
    \n+\n+
    \n+
    1378 ::assignResult(block_type& res)
    \n+
    1379 {
    \n+
    1380 // assign the result of the local solve to the global vector
    \n+
    1381 for(size_type j=0; j<n; ++j, ++i) {
    \n+
    1382 assert(i<maxlength_);
    \n+
    1383 Impl::asVector(res)[j]+=lhs()[i];
    \n+
    1384 }
    \n+
    1385 }
    \n+
    \n+
    1386
    \n+
    1387#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n+
    1388
    \n+
    1389 template<template<class> class S, typename T, typename A>
    \n+\n+
    \n+
    1391 ::OverlappingAssignerHelper(std::size_t maxlength,
    \n+
    1392 const BCRSMatrix<T,A>& mat_,
    \n+
    1393 const range_type& b_,
    \n+
    1394 range_type& x_)
    \n+
    1395 : mat(&mat_),
    \n+
    1396 b(&b_),
    \n+
    1397 x(&x_), i(0), maxlength_(maxlength)
    \n+
    1398 {
    \n+
    1399 rhs_ = new field_type[maxlength];
    \n+
    1400 lhs_ = new field_type[maxlength];
    \n+
    1401
    \n+
    1402 }
    \n+
    \n+
    1403
    \n+
    1404 template<template<class> class S, typename T, typename A>
    \n+
    \n+\n+
    1406 {
    \n+
    1407 delete[] rhs_;
    \n+
    1408 delete[] lhs_;
    \n+
    1409 }
    \n+
    \n+
    1410
    \n+
    1411 template<template<class> class S, typename T, typename A>
    \n+
    \n+
    1412 void OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::operator()(const size_type& domainIndex)
    \n+
    1413 {
    \n+
    1414 //assign right hand side of current domainindex block
    \n+
    1415 // rhs is an array of doubles!
    \n+
    1416 // rhs[starti] = b[domainindex]
    \n+
    1417 for(size_type j=0; j<n; ++j, ++i) {
    \n+
    1418 assert(i<maxlength_);
    \n+
    1419 rhs_[i]=Impl::asVector((*b)[domainIndex])[j];
    \n+
    1420 }
    \n+
    1421
    \n+
    1422
    \n+
    1423 // loop over all Matrix row entries and calculate defect.
    \n+
    1424 typedef typename matrix_type::ConstColIterator col_iterator;
    \n+
    1425
    \n+
    1426 // calculate defect for current row index block
    \n+
    1427 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
    \n+
    1428 block_type tmp;
    \n+
    1429 Impl::asMatrix(*col).mv((*x)[col.index()], tmp);
    \n+
    1430 i-=n;
    \n+
    1431 for(size_type j=0; j<n; ++j, ++i) {
    \n+
    1432 assert(i<maxlength_);
    \n+
    1433 rhs_[i]-=Impl::asVector(tmp)[j];
    \n+
    1434 }
    \n+
    1435
    \n+
    1436 }
    \n+
    1437
    \n+
    1438 }
    \n+
    \n+
    1439
    \n+
    1440 template<template<class> class S, typename T, typename A>
    \n+
    \n+\n+
    1442 {
    \n+
    1443 for(size_type j=i+n; i<j; ++i) {
    \n+
    1444 assert(i<maxlength_);
    \n+
    1445 lhs_[i]*=relax;
    \n+
    1446 }
    \n+
    1447 i-=n;
    \n+
    1448 }
    \n+
    \n+
    1449
    \n+
    1450 template<template<class> class S, typename T, typename A>
    \n+
    \n+\n+
    1452 {
    \n+
    1453 // assign the result of the local solve to the global vector
    \n+
    1454 for(size_type j=0; j<n; ++j, ++i) {
    \n+
    1455 assert(i<maxlength_);
    \n+
    1456 Impl::asVector(res)[j]+=lhs_[i];
    \n+
    1457 }
    \n+
    1458 }
    \n+
    \n+
    1459
    \n+
    1460 template<template<class> class S, typename T, typename A>
    \n+
    \n+
    1461 void OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::resetIndexForNextDomain()
    \n+
    1462 {
    \n+
    1463 i=0;
    \n+
    1464 }
    \n+
    \n+
    1465
    \n+
    1466 template<template<class> class S, typename T, typename A>
    \n+
    1467 typename OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::field_type*
    \n+
    \n+\n+
    1469 {
    \n+
    1470 return lhs_;
    \n+
    1471 }
    \n+
    \n+
    1472
    \n+
    1473 template<template<class> class S, typename T, typename A>
    \n+
    1474 typename OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::field_type*
    \n+
    \n+\n+
    1476 {
    \n+
    1477 return rhs_;
    \n+
    1478 }
    \n+
    \n+
    1479
    \n+
    1480#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n+
    1481
    \n+
    1482 template<class M, class X, class Y>
    \n+
    \n+\n+
    1484 const M& mat_,
    \n+
    1485 const Y& b_,
    \n+
    1486 X& x_)
    \n+
    1487 : mat(&mat_),
    \n+
    1488 b(&b_),
    \n+
    1489 x(&x_), i(0)
    \n+
    1490 {
    \n+
    1491 rhs_= new Y(maxlength);
    \n+
    1492 lhs_ = new X(maxlength);
    \n+
    1493 }
    \n+
    \n+
    1494
    \n+
    1495 template<class M, class X, class Y>
    \n+
    \n+\n+
    1497 {
    \n+
    1498 delete rhs_;
    \n+
    1499 delete lhs_;
    \n+
    1500 }
    \n+
    \n+
    1501
    \n+
    1502 template<class M, class X, class Y>
    \n+
    \n+\n+
    1504 {
    \n+
    1505 (*rhs_)[i]=(*b)[domainIndex];
    \n+
    1506
    \n+
    1507 // loop over all Matrix row entries and calculate defect.
    \n+
    1508 typedef typename matrix_type::ConstColIterator col_iterator;
    \n+
    1509
    \n+
    1510 // calculate defect for current row index block
    \n+
    1511 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
    \n+
    1512 Impl::asMatrix(*col).mmv((*x)[col.index()], (*rhs_)[i]);
    \n+
    1513 }
    \n+
    1514 // Goto next local index
    \n+
    1515 ++i;
    \n+
    1516 }
    \n+
    \n+
    1517
    \n+
    1518 template<class M, class X, class Y>
    \n+
    \n+\n+
    1520 {
    \n+
    1521 (*lhs_)[i]*=relax;
    \n+
    1522 }
    \n+
    \n+
    1523
    \n+
    1524 template<class M, class X, class Y>
    \n+
    \n+\n+
    1526 {
    \n+
    1527 res+=(*lhs_)[i++];
    \n+
    1528 }
    \n+
    \n+
    1529
    \n+
    1530 template<class M, class X, class Y>
    \n+
    \n+\n+
    1532 {
    \n+
    1533 return *lhs_;
    \n+
    1534 }
    \n+
    \n+
    1535
    \n+
    1536 template<class M, class X, class Y>
    \n+
    \n+\n+
    1538 {
    \n+
    1539 return *rhs_;
    \n+
    1540 }
    \n+
    \n+
    1541
    \n+
    1542 template<class M, class X, class Y>
    \n+
    \n+\n+
    1544 {
    \n+
    1545 i=0;
    \n+
    1546 }
    \n+
    \n+
    1547
    \n+
    1548 template<typename S, typename T, typename A>
    \n+
    \n+\n+
    1550 BlockVector<T,A>& x_,
    \n+
    1551 OverlappingAssigner<S>& assigner_,
    \n+
    1552 const field_type& relax_)
    \n+
    1553 : v(&v_), x(&x_), assigner(&assigner_), relax(relax_)
    \n+
    1554 {}
    \n+
    \n+
    1555
    \n+
    1556 template<typename S, typename T, typename A>
    \n+
    \n+
    1557 void AdditiveAdder<S,BlockVector<T,A> >::operator()(const size_type& domainIndex)
    \n+
    1558 {
    \n+
    1559 // add the result of the local solve to the current update
    \n+
    1560 assigner->assignResult((*v)[domainIndex]);
    \n+
    1561 }
    \n+
    \n+
    1562
    \n+
    1563
    \n+
    1564 template<typename S, typename T, typename A>
    \n+
    \n+\n+
    1566 {
    \n+
    1567 // relax the update and add it to the current guess.
    \n+
    1568 x->axpy(relax,*v);
    \n+
    1569 }
    \n+
    \n+
    1570
    \n+
    1571
    \n+
    1572 template<typename S, typename T, typename A>
    \n+\n+
    \n+
    1574 ::MultiplicativeAdder([[maybe_unused]] BlockVector<T,A>& v_,
    \n+
    1575 BlockVector<T,A>& x_,
    \n+
    1576 OverlappingAssigner<S>& assigner_, const field_type& relax_)
    \n+
    1577 : x(&x_), assigner(&assigner_), relax(relax_)
    \n+
    1578 {}
    \n+
    \n+
    1579
    \n+
    1580
    \n+
    1581 template<typename S,typename T, typename A>
    \n+
    \n+
    1582 void MultiplicativeAdder<S,BlockVector<T,A> >::operator()(const size_type& domainIndex)
    \n+
    1583 {
    \n+
    1584 // add the result of the local solve to the current guess
    \n+
    1585 assigner->relaxResult(relax);
    \n+
    1586 assigner->assignResult((*x)[domainIndex]);
    \n+
    1587 }
    \n+
    \n+
    1588
    \n+
    1589
    \n+
    1590 template<typename S,typename T, typename A>
    \n+
    \n+\n+
    1592 {
    \n+
    1593 // nothing to do, as the corrections already relaxed and added in operator()
    \n+
    1594 }
    \n+
    \n+
    1595
    \n+
    1596
    \n+
    1598}
    \n+
    1599
    \n+
    1600#endif
    \n+
    \n+
    \n+
    \n+
    \n+
    Implementation of the BCRSMatrix class.
    \n+
    Classes for using UMFPack with ISTL matrices.
    \n+
    Classes for using SuperLU with ISTL matrices.
    \n+\n+
    Define general preconditioner interface.
    \n+
    Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.
    \n+
    Templates characterizing the type of a solver.
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n+
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    void addRowNnz(const Iter &row)
    Definition overlappingschwarz.hh:895
    \n+
    void apply(X &v, const X &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition overlappingschwarz.hh:1234
    \n+
    X & lhs()
    Get the local left hand side.
    Definition overlappingschwarz.hh:1531
    \n+
    void calcColstart() const
    Definition overlappingschwarz.hh:926
    \n+
    Y & rhs()
    Get the local right hand side.
    Definition overlappingschwarz.hh:1537
    \n+
    iterator end()
    Definition overlappingschwarz.hh:989
    \n+
    void resetIndexForNextDomain()
    Resets the local index to zero.
    Definition overlappingschwarz.hh:1543
    \n+
    void copyValue(const Iter &row, const CIter &col) const
    Definition overlappingschwarz.hh:933
    \n+
    void createMatrix() const
    Definition overlappingschwarz.hh:947
    \n+
    iterator begin()
    Definition overlappingschwarz.hh:1003
    \n+
    OverlappingSchwarzInitializer(InitializerList &il, const IndexSet &indices, const subdomain_vector &domains)
    Definition overlappingschwarz.hh:887
    \n+
    IndexMap()
    Definition overlappingschwarz.hh:955
    \n+
    virtual void apply(X &v, const X &d)
    Apply the preconditioner.
    Definition overlappingschwarz.hh:1227
    \n+
    OverlappingAssignerILUBase(std::size_t maxlength, const M &mat, const Y &b, X &x)
    Constructor.
    Definition overlappingschwarz.hh:1483
    \n+
    const_iterator find(size_type grow) const
    Definition overlappingschwarz.hh:968
    \n+
    void operator()(const size_type &domain)
    calculate one entry of the local defect.
    Definition overlappingschwarz.hh:1503
    \n+
    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
    \n+
    void allocate()
    Definition overlappingschwarz.hh:905
    \n+
    void deallocate()
    Deallocates memory of the local vector.
    Definition overlappingschwarz.hh:1496
    \n+
    void insert(size_type grow)
    Definition overlappingschwarz.hh:960
    \n+
    void countEntries(const Iter &row, const CIter &col) const
    Definition overlappingschwarz.hh:914
    \n+
    static std::size_t assembleLocalProblems(const RowToDomain &rowToDomain, const matrix_type &mat, Solvers &solvers, const SubDomains &domains, bool onTheFly)
    Definition overlappingschwarz.hh:1198
    \n+
    void relaxResult(field_type relax)
    relax the result.
    Definition overlappingschwarz.hh:1519
    \n+
    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
    \n+
    SeqOverlappingSchwarz(const matrix_type &mat, const rowtodomain_vector &rowToDomain, field_type relaxationFactor=1, bool onTheFly_=true)
    Definition overlappingschwarz.hh:1009
    \n
    Definition allocator.hh:11
    \n-
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    Error specific to BCRSMatrix.
    Definition istlexception.hh:24
    \n-
    Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted.
    Definition istlexception.hh:37
    \n-
    Thrown when a solver aborts due to some problem.
    Definition istlexception.hh:46
    \n-
    Error when performing an operation on a matrix block.
    Definition istlexception.hh:52
    \n-
    int c
    Definition istlexception.hh:54
    \n-
    int r
    Definition istlexception.hh:54
    \n+
    Initializer for SuperLU Matrices representing the subdomains.
    Definition overlappingschwarz.hh:47
    \n+
    Matrix::row_type::const_iterator CIter
    Definition overlappingschwarz.hh:56
    \n+
    S IndexSet
    Definition overlappingschwarz.hh:58
    \n+
    Matrix::const_iterator Iter
    Definition overlappingschwarz.hh:55
    \n+
    IndexSet::size_type size_type
    Definition overlappingschwarz.hh:59
    \n+
    I InitializerList
    Definition overlappingschwarz.hh:52
    \n+
    AtomInitializer::Matrix Matrix
    Definition overlappingschwarz.hh:54
    \n+
    InitializerList::value_type AtomInitializer
    Definition overlappingschwarz.hh:53
    \n+
    D subdomain_vector
    The vector type containing the subdomain to row index mapping.
    Definition overlappingschwarz.hh:50
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    Iterator end()
    Get iterator to one beyond last row.
    Definition bcrsmatrix.hh:677
    \n+
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n+
    row_type::ConstIterator ConstColIterator
    Const iterator to the entries of a row.
    Definition bcrsmatrix.hh:737
    \n+
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n+
    Exact subdomain solver using ILU(p) with appropriate p.
    Definition ilusubdomainsolver.hh:78
    \n+
    Definition ilusubdomainsolver.hh:111
    \n+
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n+
    X::field_type field_type
    The field type of the preconditioner.
    Definition overlappingschwarz.hh:783
    \n+
    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
    \n+
    std::vector< slu, typename std::allocator_traits< TA >::template rebind_alloc< slu > > slu_vector
    The vector type containing subdomain solvers.
    Definition overlappingschwarz.hh:809
    \n+
    M matrix_type
    The type of the matrix to precondition.
    Definition overlappingschwarz.hh:760
    \n+
    TM Mode
    The mode (additive or multiplicative) of the Schwarz method.
    Definition overlappingschwarz.hh:778
    \n+
    X range_type
    The range type of the preconditioner.
    Definition overlappingschwarz.hh:770
    \n+
    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
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition overlappingschwarz.hh:765
    \n+
    TD slu
    The type for the subdomain solver in use.
    Definition overlappingschwarz.hh:806
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition overlappingschwarz.hh:868
    \n+
    virtual void pre(X &x, X &b)
    Prepare the preconditioner.
    Definition overlappingschwarz.hh:846
    \n+
    virtual void post(X &x)
    Postprocess the preconditioner.
    Definition overlappingschwarz.hh:861
    \n+
    TA allocator
    The allocator to use.
    Definition overlappingschwarz.hh:789
    \n+
    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
    \n+
    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
    \n+
    matrix_type::size_type size_type
    The return type of the size method.
    Definition overlappingschwarz.hh:786
    \n+
    Definition overlappingschwarz.hh:694
    \n+
    Tag that the tells the Schwarz method to be additive.
    Definition overlappingschwarz.hh:120
    \n+
    Tag that tells the Schwarz method to be multiplicative.
    Definition overlappingschwarz.hh:126
    \n+
    Tag that tells the Schwarz method to be multiplicative and symmetric.
    Definition overlappingschwarz.hh:133
    \n+
    Exact subdomain solver using Dune::DynamicMatrix<T>::solve.
    Definition overlappingschwarz.hh:140
    \n+
    std::remove_const< M >::type matrix_type
    The matrix type the preconditioner is for.
    Definition overlappingschwarz.hh:149
    \n+
    X::field_type field_type
    Definition overlappingschwarz.hh:150
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition overlappingschwarz.hh:153
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition overlappingschwarz.hh:155
    \n+
    void setSubMatrix(const M &BCRS, S &rowset)
    Set the data of the local problem.
    Definition overlappingschwarz.hh:184
    \n+
    void apply(DynamicVector< field_type > &v, DynamicVector< field_type > &d)
    Apply the subdomain solver.
    Definition overlappingschwarz.hh:162
    \n+
    std::remove_const< M >::type rilu_type
    Definition overlappingschwarz.hh:151
    \n+
    Definition overlappingschwarz.hh:215
    \n+\n+\n+\n+\n+\n+
    S< BCRSMatrix< T, A > >::range_type range_type
    Definition overlappingschwarz.hh:315
    \n+
    range_type::block_type block_type
    Definition overlappingschwarz.hh:317
    \n+
    range_type::field_type field_type
    Definition overlappingschwarz.hh:316
    \n+
    matrix_type::size_type size_type
    Definition overlappingschwarz.hh:319
    \n+
    BCRSMatrix< T, A > matrix_type
    Definition overlappingschwarz.hh:314
    \n+
    Definition overlappingschwarz.hh:400
    \n+
    matrix_type::size_type size_type
    Definition overlappingschwarz.hh:408
    \n+
    Y::field_type field_type
    Definition overlappingschwarz.hh:404
    \n+
    Y::block_type block_type
    Definition overlappingschwarz.hh:406
    \n+
    M matrix_type
    Definition overlappingschwarz.hh:402
    \n+
    OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X &x)
    Constructor.
    Definition overlappingschwarz.hh:493
    \n+
    OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X &x)
    Constructor.
    Definition overlappingschwarz.hh:512
    \n+
    Definition overlappingschwarz.hh:520
    \n+
    std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
    Definition overlappingschwarz.hh:526
    \n+
    A::size_type size_type
    Definition overlappingschwarz.hh:525
    \n+
    Definition overlappingschwarz.hh:542
    \n+
    A::size_type size_type
    Definition overlappingschwarz.hh:547
    \n+
    std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
    Definition overlappingschwarz.hh:548
    \n+
    template meta program for choosing how to add the correction.
    Definition overlappingschwarz.hh:572
    \n+
    AdditiveAdder< S, X > Adder
    Definition overlappingschwarz.hh:577
    \n+
    MultiplicativeAdder< S, X > Adder
    Definition overlappingschwarz.hh:583
    \n+
    MultiplicativeAdder< S, X > Adder
    Definition overlappingschwarz.hh:589
    \n+
    Helper template meta program for application of overlapping Schwarz.
    Definition overlappingschwarz.hh:605
    \n+
    static solver_iterator begin(solver_vector &sv)
    Definition overlappingschwarz.hh:611
    \n+
    solver_vector::iterator solver_iterator
    Definition overlappingschwarz.hh:607
    \n+
    static domain_iterator end(const subdomain_vector &sv)
    Definition overlappingschwarz.hh:625
    \n+
    subdomain_vector::const_iterator domain_iterator
    Definition overlappingschwarz.hh:609
    \n+
    T1 solver_vector
    Definition overlappingschwarz.hh:606
    \n+
    static domain_iterator begin(const subdomain_vector &sv)
    Definition overlappingschwarz.hh:620
    \n+
    T2 subdomain_vector
    Definition overlappingschwarz.hh:608
    \n+
    static solver_iterator end(solver_vector &sv)
    Definition overlappingschwarz.hh:616
    \n+
    T2 subdomain_vector
    Definition overlappingschwarz.hh:636
    \n+
    static solver_iterator end(solver_vector &sv)
    Definition overlappingschwarz.hh:644
    \n+
    solver_vector::reverse_iterator solver_iterator
    Definition overlappingschwarz.hh:635
    \n+
    subdomain_vector::const_reverse_iterator domain_iterator
    Definition overlappingschwarz.hh:637
    \n+
    static solver_iterator begin(solver_vector &sv)
    Definition overlappingschwarz.hh:639
    \n+
    T1 solver_vector
    Definition overlappingschwarz.hh:634
    \n+
    static domain_iterator begin(const subdomain_vector &sv)
    Definition overlappingschwarz.hh:648
    \n+
    static domain_iterator end(const subdomain_vector &sv)
    Definition overlappingschwarz.hh:653
    \n+
    Helper template meta program for application of overlapping Schwarz.
    Definition overlappingschwarz.hh:669
    \n+
    smoother::range_type range_type
    Definition overlappingschwarz.hh:671
    \n+
    T smoother
    Definition overlappingschwarz.hh:670
    \n+
    static void apply(smoother &sm, range_type &v, const range_type &b)
    Definition overlappingschwarz.hh:673
    \n+
    static void apply(smoother &sm, range_type &v, const range_type &b)
    Definition overlappingschwarz.hh:685
    \n+
    SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > smoother
    Definition overlappingschwarz.hh:682
    \n+\n+\n+
    BCRSMatrix< T, A > matrix_type
    Definition overlappingschwarz.hh:713
    \n+
    Definition overlappingschwarz.hh:723
    \n+
    M matrix_type
    Definition overlappingschwarz.hh:724
    \n+
    Definition overlappingschwarz.hh:1103
    \n+
    static int size(const Domain &d)
    Definition overlappingschwarz.hh:1111
    \n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,69 +1,1878 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-istlexception.hh\n+overlappingschwarz.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_ISTLEXCEPTION_HH\n-6#define DUNE_ISTL_ISTLEXCEPTION_HH\n-7\n-8#include \n-9#include \n-10\n-11namespace _\bD_\bu_\bn_\be {\n-12\n-_\b1_\b9 class _\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br : public Dune::MathError {};\n-20\n-_\b2_\b2 class _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n-23 : public _\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-24 {};\n-25\n-_\b3_\b5 class _\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd\n-36 : public _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n-37 {};\n-38\n-40\n-_\b4_\b6 class _\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt : public _\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br {};\n-47\n-49\n-_\b5_\b2 class _\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br : public virtual Dune::FMatrixError {\n-53 public:\n-_\b5_\b4 int _\br, _\bc; // row and column index of the entry from which the error resulted\n-55 };\n-56\n-59} // end namespace\n+5#ifndef DUNE_ISTL_OVERLAPPINGSCHWARZ_HH\n+6#define DUNE_ISTL_OVERLAPPINGSCHWARZ_HH\n+7#include \n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15\n+16#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n+17#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n+18#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh\"\n+19#include \"_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh\"\n+20#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+21#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+22#include \"_\bi_\bl_\bu_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\"\n+23#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+24\n+25namespace _\bD_\bu_\bn_\be\n+26{\n+27\n+39 template\n+40 class SeqOverlappingSchwarz;\n+41\n+45 template\n+_\b4_\b6 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+47 {\n+48 public:\n+_\b5_\b0 typedef D _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br;\n+51\n+_\b5_\b2 typedef I _\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\bL_\bi_\bs_\bt;\n+_\b5_\b3 typedef typename InitializerList::value_type _\bA_\bt_\bo_\bm_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n+_\b5_\b4 typedef typename AtomInitializer::Matrix _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b5_\b5 typedef typename Matrix::const_iterator _\bI_\bt_\be_\br;\n+_\b5_\b6 typedef typename Matrix::row_type::const_iterator _\bC_\bI_\bt_\be_\br;\n+57\n+_\b5_\b8 typedef S _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+_\b5_\b9 typedef typename IndexSet::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n 60\n-61#endif\n+61 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br(_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\bL_\bi_\bs_\bt& il,\n+62 const _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indices,\n+63 const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& domains);\n+64\n+65\n+66 void _\ba_\bd_\bd_\bR_\bo_\bw_\bN_\bn_\bz(const _\bI_\bt_\be_\br& row);\n+67\n+68 void _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be();\n+69\n+70 void _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(const _\bI_\bt_\be_\br& row, const _\bC_\bI_\bt_\be_\br& _\bc_\bo_\bl) const;\n+71\n+72 void _\bc_\ba_\bl_\bc_\bC_\bo_\bl_\bs_\bt_\ba_\br_\bt() const;\n+73\n+74 void _\bc_\bo_\bp_\by_\bV_\ba_\bl_\bu_\be(const _\bI_\bt_\be_\br& row, const _\bC_\bI_\bt_\be_\br& _\bc_\bo_\bl) const;\n+75\n+76 void _\bc_\br_\be_\ba_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx() const;\n+77 private:\n+78 class IndexMap\n+79 {\n+80 public:\n+81 typedef typename S::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+82 typedef std::map Map;\n+83 typedef typename Map::iterator iterator;\n+84 typedef typename Map::const_iterator const_iterator;\n+85\n+86 _\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp();\n+87\n+88 void _\bi_\bn_\bs_\be_\br_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be grow);\n+89\n+90 const_iterator _\bf_\bi_\bn_\bd(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be grow) const;\n+91\n+92 iterator _\bf_\bi_\bn_\bd(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be grow);\n+93\n+94 iterator _\bb_\be_\bg_\bi_\bn();\n+95\n+96 const_iterator _\bb_\be_\bg_\bi_\bn() const;\n+97\n+98 iterator _\be_\bn_\bd();\n+99\n+100 const_iterator _\be_\bn_\bd() const;\n+101\n+102 private:\n+103 std::map map_;\n+104 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row;\n+105 };\n+106\n+107\n+108 typedef typename InitializerList::iterator InitIterator;\n+109 typedef typename IndexSet::const_iterator IndexIteratur;\n+110 _\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\bL_\bi_\bs_\bt* initializers;\n+111 const _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt *indices;\n+112 mutable std::vector indexMaps;\n+113 const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& domains;\n+114 };\n+115\n+_\b1_\b1_\b9 struct _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n+120 {};\n+121\n+_\b1_\b2_\b5 struct _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n+126 {};\n+127\n+_\b1_\b3_\b2 struct _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n+133 {};\n+134\n+139 template\n+_\b1_\b4_\b0 class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br;\n+141\n+142 // Specialization for BCRSMatrix\n+143 template\n+_\b1_\b4_\b4 class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br< _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< K, Al>, X, Y >\n+145 {\n+146 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b> _\bM;\n+147 public:\n+_\b1_\b4_\b9 typedef typename std::remove_const::type _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b1_\b5_\b0 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b1_\b5_\b1 typedef typename std::remove_const::type _\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be;\n+_\b1_\b5_\b3 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b1_\b5_\b5 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b1_\b5_\b6 static constexpr size_t n = std::decay_t()))>::rows;\n+157\n+_\b1_\b6_\b2 void _\ba_\bp_\bp_\bl_\by (DynamicVector& v, DynamicVector& d)\n+163 {\n+164 assert(v.size() > 0);\n+165 assert(v.size() == d.size());\n+166 assert(A.rows() <= v.size());\n+167 assert(A.cols() <= v.size());\n+168 size_t sz = A.rows();\n+169 v.resize(sz);\n+170 d.resize(sz);\n+171 A.solve(v,d);\n+172 v.resize(v.capacity());\n+173 d.resize(d.capacity());\n+174 }\n+175\n+183 template\n+_\b1_\b8_\b4 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM& BCRS, S& rowset)\n+185 {\n+186 size_t sz = rowset.size();\n+187 A.resize(sz*n,sz*n);\n+188 typedef typename S::const_iterator SIter;\n+189 size_t r = 0;\n+190 for(SIter rowIdx = rowset.begin(), rowEnd=rowset.end();\n+191 rowIdx!= rowEnd; ++rowIdx, r++)\n+192 {\n+193 size_t c = 0;\n+194 for(SIter colIdx = rowset.begin(), colEnd=rowset.end();\n+195 colIdx!= colEnd; ++colIdx, c++)\n+196 {\n+197 if (BCRS[*rowIdx].find(*colIdx) == BCRS[*rowIdx]._\be_\bn_\bd())\n+198 continue;\n+199 for (size_t i=0; i A;\n+211 };\n+212\n+213 template\n+_\b2_\b1_\b4 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+215 {};\n+216\n+217 template\n+_\b2_\b1_\b8 using _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br = _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bT_\b,_\b _\bD_\bu_\bn_\be_\b:_\b:\n+_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be>;\n+219\n+220 // specialization for DynamicMatrix\n+221 template\n+_\b2_\b2_\b2 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br< _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br<\n+_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx, X, Y >,false>\n+223 {\n+224 public:\n+_\b2_\b2_\b5 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b2_\b2_\b6 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b2_\b2_\b7 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b2_\b2_\b8 typedef typename range_type::block_type _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+_\b2_\b2_\b9 typedef typename _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+_\b2_\b3_\b0 static constexpr size_t n = std::decay_t()))>::rows;\n+238 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br(std::size_t maxlength, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bA_\bl_\b>&\n+mat_, const X& b_, Y& x_);\n+239\n+243 inline\n+244 void deallocate();\n+245\n+249 inline\n+250 void resetIndexForNextDomain();\n+251\n+256 inline\n+257 DynamicVector & lhs();\n+258\n+263 inline\n+264 DynamicVector & rhs();\n+265\n+270 inline\n+271 void relaxResult(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax);\n+272\n+277 void operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domainIndex);\n+278\n+286 inline\n+287 void assignResult(_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& res);\n+288\n+289 private:\n+293 const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be* _\bm_\ba_\bt;\n+295 // we need a pointer, because we have to avoid deep copies\n+296 DynamicVector * rhs_;\n+298 // we need a pointer, because we have to avoid deep copies\n+299 DynamicVector * lhs_;\n+301 const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be* b;\n+303 _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be* x;\n+305 std::size_t i;\n+307 std::size_t maxlength_;\n+308 };\n+309\n+310#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK\n+311 template class S, typename T, typename A>\n+_\b3_\b1_\b2 struct _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br>, true>\n+313 {\n+_\b3_\b1_\b4 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\b _\bA_\b> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b3_\b1_\b5 typedef typename S>::range_type _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b3_\b1_\b6 typedef typename range_type::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b3_\b1_\b7 typedef typename range_type::block_type _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+318\n+_\b3_\b1_\b9 typedef typename _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+320\n+_\b3_\b2_\b1 static constexpr size_t n = std::decay_t()))>::rows;\n+_\b3_\b2_\b2 static constexpr size_t m = std::decay_t()))>::cols;\n+330 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br(std::size_t maxlength, const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n+331 const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& x);\n+337 void deallocate();\n+338\n+339 /*\n+340 * @brief Resets the local index to zero.\n+341 */\n+342 void resetIndexForNextDomain();\n+343\n+348 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be* lhs();\n+349\n+354 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be* rhs();\n+355\n+360 void relaxResult(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax);\n+361\n+366 void operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domain);\n+367\n+375 void assignResult(_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& res);\n+376\n+377 private:\n+381 const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be* _\bm_\ba_\bt;\n+383 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be* rhs_;\n+385 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be* lhs_;\n+387 const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be* b;\n+389 _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be* x;\n+391 std::size_t i;\n+393 std::size_t maxlength_;\n+394 };\n+395\n+396#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK\n+397\n+398 template\n+_\b3_\b9_\b9 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n+400 {\n+401 public:\n+_\b4_\b0_\b2 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+403\n+_\b4_\b0_\b4 typedef typename Y::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+405\n+_\b4_\b0_\b6 typedef typename Y::block_type _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+407\n+_\b4_\b0_\b8 typedef typename matrix_type::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+416 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be(std::size_t maxlength, const M& mat,\n+417 const Y& b, X& x);\n+423 void _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be();\n+424\n+428 void _\br_\be_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bF_\bo_\br_\bN_\be_\bx_\bt_\bD_\bo_\bm_\ba_\bi_\bn();\n+429\n+434 X& _\bl_\bh_\bs();\n+435\n+440 Y& _\br_\bh_\bs();\n+441\n+446 void _\br_\be_\bl_\ba_\bx_\bR_\be_\bs_\bu_\bl_\bt(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax);\n+447\n+452 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domain);\n+453\n+461 void _\ba_\bs_\bs_\bi_\bg_\bn_\bR_\be_\bs_\bu_\bl_\bt(_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& res);\n+462\n+463 private:\n+467 const M* mat;\n+469 X* lhs_;\n+471 Y* rhs_;\n+473 const Y* b;\n+475 X* x;\n+477 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i;\n+478 };\n+479\n+480 // specialization for ILU0\n+481 template\n+_\b4_\b8_\b2 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br, false>\n+483 : public _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n+484 {\n+485 public:\n+_\b4_\b9_\b3 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br(std::size_t maxlength, const M& _\bm_\ba_\bt,\n+494 const Y& b, X& x)\n+495 : _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be(maxlength, _\bm_\ba_\bt,b,x)\n+496 {}\n+497 };\n+498\n+499 // specialization for ILUN\n+500 template\n+_\b5_\b0_\b1 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br,false>\n+502 : public _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n+503 {\n+504 public:\n+_\b5_\b1_\b2 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br(std::size_t maxlength, const M& _\bm_\ba_\bt,\n+513 const Y& b, X& x)\n+514 : _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be(maxlength, _\bm_\ba_\bt,b,x)\n+515 {}\n+516 };\n+517\n+518 template\n+_\b5_\b1_\b9 struct _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br\n+520 {};\n+521\n+522 template\n+_\b5_\b2_\b3 struct _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br >\n+524 {\n+_\b5_\b2_\b5 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+_\b5_\b2_\b6 typedef typename std::decay_t\n+()))>::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+527 _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br(_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& v, _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& x,\n+528 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>& assigner, const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& relax_);\n+529 void operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domain);\n+530 void axpy();\n+_\b5_\b3_\b1 static constexpr size_t n = std::decay_t()))>::dimension;\n+532\n+533 private:\n+534 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>* v;\n+535 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>* x;\n+536 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>* assigner;\n+537 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax;\n+538 };\n+539\n+540 template\n+_\b5_\b4_\b1 struct _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br\n+542 {};\n+543\n+544 template\n+_\b5_\b4_\b5 struct _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br >\n+546 {\n+_\b5_\b4_\b7 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+_\b5_\b4_\b8 typedef typename std::decay_t\n+()))>::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+549 _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br(_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& v, _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& x,\n+550 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>& assigner_, const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& relax_);\n+551 void operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domain);\n+552 void axpy();\n+_\b5_\b5_\b3 static constexpr size_t n = std::decay_t()))>::dimension;\n+554\n+555 private:\n+556 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>* x;\n+557 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>* assigner;\n+558 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax;\n+559 };\n+560\n+570 template\n+_\b5_\b7_\b1 struct _\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+572 {};\n+573\n+574 template\n+_\b5_\b7_\b5 struct _\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br<_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be,X,S>\n+576 {\n+_\b5_\b7_\b7 typedef _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bX_\b> _\bA_\bd_\bd_\be_\br;\n+578 };\n+579\n+580 template\n+_\b5_\b8_\b1 struct _\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br<_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be,X,S>\n+582 {\n+_\b5_\b8_\b3 typedef _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bX_\b> _\bA_\bd_\bd_\be_\br;\n+584 };\n+585\n+586 template\n+_\b5_\b8_\b7 struct _\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br<_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be,X,S>\n+588 {\n+_\b5_\b8_\b9 typedef _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bX_\b> _\bA_\bd_\bd_\be_\br;\n+590 };\n+591\n+603 template\n+_\b6_\b0_\b4 struct _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+605 {\n+_\b6_\b0_\b6 typedef T1 _\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br;\n+_\b6_\b0_\b7 typedef typename solver_vector::iterator _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b6_\b0_\b8 typedef T2 _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br;\n+_\b6_\b0_\b9 typedef typename subdomain_vector::const_iterator _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+610\n+_\b6_\b1_\b1 static _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn(_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n+612 {\n+613 return sv.begin();\n+614 }\n+615\n+_\b6_\b1_\b6 static _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd(_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n+617 {\n+618 return sv.end();\n+619 }\n+_\b6_\b2_\b0 static _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn(const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n+621 {\n+622 return sv.begin();\n+623 }\n+624\n+_\b6_\b2_\b5 static _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd(const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n+626 {\n+627 return sv.end();\n+628 }\n+629 };\n+630\n+631 template\n+_\b6_\b3_\b2 struct _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+633 {\n+_\b6_\b3_\b4 typedef T1 _\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br;\n+_\b6_\b3_\b5 typedef typename solver_vector::reverse_iterator _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b6_\b3_\b6 typedef T2 _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br;\n+_\b6_\b3_\b7 typedef typename subdomain_vector::const_reverse_iterator _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+638\n+_\b6_\b3_\b9 static _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn(_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n+640 {\n+641 return sv.rbegin();\n+642 }\n+643\n+_\b6_\b4_\b4 static _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd(_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n+645 {\n+646 return sv.rend();\n+647 }\n+_\b6_\b4_\b8 static _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn(const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n+649 {\n+650 return sv.rbegin();\n+651 }\n+652\n+_\b6_\b5_\b3 static _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd(const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n+654 {\n+655 return sv.rend();\n+656 }\n+657 };\n+658\n+667 template\n+_\b6_\b6_\b8 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br\n+669 {\n+_\b6_\b7_\b0 typedef T _\bs_\bm_\bo_\bo_\bt_\bh_\be_\br;\n+_\b6_\b7_\b1 typedef typename smoother::range_type _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+672\n+_\b6_\b7_\b3 static void _\ba_\bp_\bp_\bl_\by(_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br& sm, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& v, const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b)\n+674 {\n+675 sm.template apply(v, b);\n+676 }\n+677 };\n+678\n+679 template\n+_\b6_\b8_\b0 struct\n+_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n+>\n+681 {\n+_\b6_\b8_\b2 typedef _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\bT_\bD_\b,_\bT_\bA_\b>\n+_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br;\n+_\b6_\b8_\b3 typedef typename _\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+684\n+_\b6_\b8_\b5 static void _\ba_\bp_\bp_\bl_\by(_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br& sm, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& v, const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b)\n+686 {\n+687 sm.template apply(v, b);\n+688 sm.template apply(v, b);\n+689 }\n+690 };\n+691\n+692 template\n+_\b6_\b9_\b3 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+694 {};\n+695\n+696 template\n+_\b6_\b9_\b7 using _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br =\n+_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bT_\b,_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be>;\n+698\n+699 template\n+_\b7_\b0_\b0 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br< _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br<\n+_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< K, Al>, X, Y >,false>\n+701 {\n+_\b7_\b0_\b2 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b7_\b0_\b3 static constexpr size_t n = std::decay_t()))>::rows;\n+704 template\n+705 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain,\n+const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n+706 Solvers& solvers, const SubDomains& domains,\n+707 bool onTheFly);\n+708 };\n+709\n+710 template class S, typename T, typename A>\n+_\b7_\b1_\b1 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br>,true>\n+712 {\n+_\b7_\b1_\b3 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b7_\b1_\b4 static constexpr size_t n = std::decay_t()))>::rows;\n+715 template\n+716 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain,\n+const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n+717 Solvers& solvers, const SubDomains& domains,\n+718 bool onTheFly);\n+719 };\n+720\n+721 template\n+_\b7_\b2_\b2 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n+723 {\n+_\b7_\b2_\b4 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+725 template\n+726 static std::size_t _\ba_\bs_\bs_\be_\bm_\bb_\bl_\be_\bL_\bo_\bc_\ba_\bl_\bP_\br_\bo_\bb_\bl_\be_\bm_\bs(const RowToDomain& rowToDomain,\n+const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n+727 Solvers& solvers, const SubDomains& domains,\n+728 bool onTheFly);\n+729 };\n+730\n+731 template\n+_\b7_\b3_\b2 struct\n+_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br,false>\n+733 : public _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n+734 {};\n+735\n+736 template\n+_\b7_\b3_\b7 struct\n+_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br,false>\n+738 : public _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n+739 {};\n+740\n+751 template, class TA=std::allocator >\n+_\b7_\b5_\b3 class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n+754 : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+755 {\n+756 public:\n+_\b7_\b6_\b0 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+761\n+_\b7_\b6_\b5 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+766\n+_\b7_\b7_\b0 typedef X _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+771\n+_\b7_\b7_\b8 typedef _\bT_\bM _\bM_\bo_\bd_\be;\n+779\n+_\b7_\b8_\b3 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+784\n+_\b7_\b8_\b6 typedef typename matrix_type::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+787\n+_\b7_\b8_\b9 typedef _\bT_\bA _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n+790\n+792 typedef std::set,\n+793 typename std::allocator_traits::template _\br_\be_\bb_\bi_\bn_\bd_\b__\ba_\bl_\bl_\bo_\bc_\b<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b> >\n+_\b7_\b9_\b4 _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+795\n+_\b7_\b9_\b7 typedef std::vector::\n+template _\br_\be_\bb_\bi_\bn_\bd_\b__\ba_\bl_\bl_\bo_\bc_\b<_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be_\b> > _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br;\n+798\n+_\b8_\b0_\b0 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\br_\ba_\bi_\bt_\bs_\b<_\bT_\bA_\b>_\b:_\b:_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be\n+_\br_\be_\bb_\bi_\bn_\bd_\b__\ba_\bl_\bl_\bo_\bc_\b<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b> > _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bl_\bi_\bs_\bt;\n+801\n+_\b8_\b0_\b3 typedef std::vector::\n+template _\br_\be_\bb_\bi_\bn_\bd_\b__\ba_\bl_\bl_\bo_\bc_\b<_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bl_\bi_\bs_\bt_\b> > _\br_\bo_\bw_\bt_\bo_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br;\n+804\n+_\b8_\b0_\b6 typedef _\bT_\bD _\bs_\bl_\bu;\n+807\n+_\b8_\b0_\b9 typedef std::vector::template\n+_\br_\be_\bb_\bi_\bn_\bd_\b__\ba_\bl_\bl_\bo_\bc_\b<_\bs_\bl_\bu_\b> > _\bs_\bl_\bu_\b__\bv_\be_\bc_\bt_\bo_\br;\n+810\n+_\b8_\b2_\b4 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz(const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& mat, const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br&\n+subDomains,\n+825 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relaxationFactor=1, bool _\bo_\bn_\bT_\bh_\be_\bF_\bl_\by_\b_=true);\n+826\n+_\b8_\b3_\b8 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz(const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& mat, const _\br_\bo_\bw_\bt_\bo_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br&\n+_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn,\n+839 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relaxationFactor=1, bool _\bo_\bn_\bT_\bh_\be_\bF_\bl_\by_\b_=true);\n+840\n+_\b8_\b4_\b6 virtual void _\bp_\br_\be ([[_\bm_\ba_\by_\bb_\be_\b__\bu_\bn_\bu_\bs_\be_\bd]] X& x, [[_\bm_\ba_\by_\bb_\be_\b__\bu_\bn_\bu_\bs_\be_\bd]] X& b)\n+847 {}\n+848\n+_\b8_\b5_\b4 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const X& _\bd);\n+855\n+_\b8_\b6_\b1 virtual void _\bp_\bo_\bs_\bt ([[_\bm_\ba_\by_\bb_\be_\b__\bu_\bn_\bu_\bs_\be_\bd]] X& x)\n+862 {}\n+863\n+864 template\n+_\b8_\b6_\b5 void _\ba_\bp_\bp_\bl_\by(X& v, const X& _\bd);\n+866\n+_\b8_\b6_\b8 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+869 {\n+870 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+871 }\n+872\n+873 private:\n+874 const M& mat;\n+875 _\bs_\bl_\bu_\b__\bv_\be_\bc_\bt_\bo_\br solvers;\n+876 _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br subDomains;\n+877 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax;\n+878\n+879 typename M::size_type maxlength;\n+880\n+881 bool onTheFly;\n+882 };\n+883\n+884\n+885\n+886 template\n+_\b8_\b8_\b7 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+(_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\bL_\bi_\bs_\bt& il,\n+888 const _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& idx,\n+889 const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& domains_)\n+890 : initializers(&il), indices(&idx), indexMaps(il.size()), domains(domains_)\n+891 {}\n+892\n+893\n+894 template\n+_\b8_\b9_\b5 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\ba_\bd_\bd_\bR_\bo_\bw_\bN_\bn_\bz(const _\bI_\bt_\be_\br& row)\n+896 {\n+897 typedef typename IndexSet::value_type::const_iterator iterator;\n+898 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)\n+[row.index()].end(); ++domain) {\n+899 (*initializers)[*domain].addRowNnz(row, domains[*domain]);\n+900 indexMaps[*domain].insert(row.index());\n+901 }\n+902 }\n+903\n+904 template\n+_\b9_\b0_\b5 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be()\n+906 {\n+907 for(auto&& i: *initializers)\n+908 i.allocateMatrixStorage();\n+909 for(auto&& i: *initializers)\n+910 i.allocateMarker();\n+911 }\n+912\n+913 template\n+_\b9_\b1_\b4 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(const _\bI_\bt_\be_\br& row,\n+const _\bC_\bI_\bt_\be_\br& _\bc_\bo_\bl) const\n+915 {\n+916 typedef typename IndexSet::value_type::const_iterator iterator;\n+917 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)\n+[row.index()].end(); ++domain) {\n+918 typename std::map::const_iterator v = indexMaps\n+[*domain].find(_\bc_\bo_\bl.index());\n+919 if(v!= indexMaps[*domain].end()) {\n+920 (*initializers)[*domain].countEntries(indexMaps[*domain].find(_\bc_\bo_\bl.index())-\n+>second);\n+921 }\n+922 }\n+923 }\n+924\n+925 template\n+_\b9_\b2_\b6 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bc_\ba_\bl_\bc_\bC_\bo_\bl_\bs_\bt_\ba_\br_\bt() const\n+927 {\n+928 for(auto&& i : *initializers)\n+929 i.calcColstart();\n+930 }\n+931\n+932 template\n+_\b9_\b3_\b3 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bc_\bo_\bp_\by_\bV_\ba_\bl_\bu_\be(const _\bI_\bt_\be_\br& row, const\n+_\bC_\bI_\bt_\be_\br& _\bc_\bo_\bl) const\n+934 {\n+935 typedef typename IndexSet::value_type::const_iterator iterator;\n+936 for(iterator domain=(*indices)[row.index()].begin(); domain!= (*indices)\n+[row.index()].end(); ++domain) {\n+937 typename std::map::const_iterator v = indexMaps\n+[*domain].find(_\bc_\bo_\bl.index());\n+938 if(v!= indexMaps[*domain].end()) {\n+939 assert(indexMaps[*domain].end()!=indexMaps[*domain].find(row.index()));\n+940 (*initializers)[*domain].copyValue(_\bc_\bo_\bl, indexMaps[*domain].find(row.index\n+())->second,\n+941 v->second);\n+942 }\n+943 }\n+944 }\n+945\n+946 template\n+_\b9_\b4_\b7 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx() const\n+948 {\n+949 std::vector().swap(indexMaps);\n+950 for(auto&& i: *initializers)\n+951 i.createMatrix();\n+952 }\n+953\n+954 template\n+_\b9_\b5_\b5 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp()\n+956 : row(0)\n+957 {}\n+958\n+959 template\n+_\b9_\b6_\b0 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(size_type grow)\n+961 {\n+962 assert(map_.find(grow)==map_.end());\n+963 map_.insert(std::make_pair(grow, row++));\n+964 }\n+965\n+966 template\n+967 typename OverlappingSchwarzInitializer::IndexMap::const_iterator\n+_\b9_\b6_\b8 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bf_\bi_\bn_\bd(size_type grow) const\n+969 {\n+970 return map_.find(grow);\n+971 }\n+972\n+973 template\n+974 typename OverlappingSchwarzInitializer::IndexMap::iterator\n+_\b9_\b7_\b5 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bf_\bi_\bn_\bd(size_type grow)\n+976 {\n+977 return map_.find(grow);\n+978 }\n+979\n+980 template\n+981 typename OverlappingSchwarzInitializer::IndexMap::const_iterator\n+_\b9_\b8_\b2 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd() const\n+983 {\n+984 return map_.end();\n+985 }\n+986\n+987 template\n+988 typename OverlappingSchwarzInitializer::IndexMap::iterator\n+_\b9_\b8_\b9 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd()\n+990 {\n+991 return map_.end();\n+992 }\n+993\n+994 template\n+995 typename OverlappingSchwarzInitializer::IndexMap::const_iterator\n+_\b9_\b9_\b6 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n+997 {\n+998 return map_.begin();\n+999 }\n+1000\n+1001 template\n+1002 typename OverlappingSchwarzInitializer::IndexMap::iterator\n+_\b1_\b0_\b0_\b3 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn()\n+1004 {\n+1005 return map_.begin();\n+1006 }\n+1007\n+1008 template\n+_\b1_\b0_\b0_\b9 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bD_\b,_\bT_\bA_\b>_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz(const\n+_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt_\b_, const _\br_\bo_\bw_\bt_\bo_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& _\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn,\n+1010 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relaxationFactor, bool _\bf_\bl_\by)\n+1011 : _\bm_\ba_\bt(_\bm_\ba_\bt_\b_), relax(relaxationFactor), onTheFly(_\bf_\bl_\by)\n+1012 {\n+1013 typedef typename rowtodomain_vector::const_iterator _\bR_\bo_\bw_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+1014 typedef typename subdomain_list::const_iterator _\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+1015#ifdef DUNE_ISTL_WITH_CHECKING\n+1016 _\ba_\bs_\bs_\be_\br_\bt(_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.size()==mat.N());\n+1017 _\ba_\bs_\bs_\be_\br_\bt(_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.size()==mat.M());\n+1018\n+1019 for(_\bR_\bo_\bw_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br=_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.begin(); _\bi_\bt_\be_\br != _\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.end();\n+++_\bi_\bt_\be_\br)\n+1020 _\ba_\bs_\bs_\be_\br_\bt(_\bi_\bt_\be_\br->size()>0);\n+1021\n+1022#endif\n+1023 // calculate the number of domains\n+1024 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be domains=0;\n+1025 for(_\bR_\bo_\bw_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br=_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.begin(); _\bi_\bt_\be_\br != _\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.end();\n+++_\bi_\bt_\be_\br)\n+1026 for(_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bd=_\bi_\bt_\be_\br->begin(); _\bd != _\bi_\bt_\be_\br->end(); ++_\bd)\n+1027 domains=std::max(domains, *_\bd);\n+1028 ++domains;\n+1029\n+1030 solvers.resize(domains);\n+1031 subDomains.resize(domains);\n+1032\n+1033 // initialize subdomains to row mapping from row to subdomain mapping\n+1034 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row=0;\n+1035 for(_\bR_\bo_\bw_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br=_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.begin(); _\bi_\bt_\be_\br != _\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.end();\n+++_\bi_\bt_\be_\br, ++row)\n+1036 for(_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bd=_\bi_\bt_\be_\br->begin(); _\bd != _\bi_\bt_\be_\br->end(); ++_\bd)\n+1037 subDomains[*_\bd].insert(row);\n+1038\n+1039#ifdef DUNE_ISTL_WITH_CHECKING\n+1040 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0;\n+1041 typedef typename subdomain_vector::const_iterator iterator;\n+1042 for(iterator _\bi_\bt_\be_\br=subDomains.begin(); _\bi_\bt_\be_\br != subDomains.end(); ++_\bi_\bt_\be_\br) {\n+1043 typedef typename subdomain_type::const_iterator _\be_\bn_\bt_\br_\by_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+1044 Dune::dvverb<<\"domain \"<begin(); entry != _\bi_\bt_\be_\br->end(); ++entry) {\n+1046 Dune::dvverb<<\" \"<<*entry;\n+1047 }\n+1048 Dune::dvverb<\n+1052_\b _\b:_\b:_\ba_\bs_\bs_\be_\bm_\bb_\bl_\be_\bL_\bo_\bc_\ba_\bl_\bP_\br_\bo_\bb_\bl_\be_\bm_\bs(_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn, mat, solvers, subDomains, onTheFly);\n+1053 }\n+1054\n+1055 template\n+_\b1_\b0_\b5_\b6 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bD_\b,_\bT_\bA_\b>_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz(const\n+_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt_\b_,\n+1057 const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& _\bs_\bd,\n+1058 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relaxationFactor,\n+1059 bool _\bf_\bl_\by)\n+1060 : _\bm_\ba_\bt(_\bm_\ba_\bt_\b_), solvers(_\bs_\bd.size()), subDomains(_\bs_\bd), relax(relaxationFactor),\n+1061 onTheFly(_\bf_\bl_\by)\n+1062 {\n+1063 typedef typename subdomain_vector::const_iterator _\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+1064\n+1065#ifdef DUNE_ISTL_WITH_CHECKING\n+1066 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0;\n+1067\n+1068 for(_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bd=_\bs_\bd.begin(); _\bd != _\bs_\bd.end(); ++_\bd,++i) {\n+1069 //std::cout<size()<size()>0);\n+1071 typedef typename DomainIterator::value_type::const_iterator\n+_\be_\bn_\bt_\br_\by_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+1072 Dune::dvverb<<\"domain \"<begin(); entry != _\bd->end(); ++entry) {\n+1074 Dune::dvverb<<\" \"<<*entry;\n+1075 }\n+1076 Dune::dvverb<begin(); row != _\bd_\bo_\bm_\ba_\bi_\bn->end(); ++row)\n+1089 _\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn[*row].push_back(_\bd_\bo_\bm_\ba_\bi_\bn_\bI_\bd);\n+1090 }\n+1091\n+1092 maxlength = _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\b<_\bs_\bl_\bu_\b>\n+1093_\b _\b:_\b:_\ba_\bs_\bs_\be_\bm_\bb_\bl_\be_\bL_\bo_\bc_\ba_\bl_\bP_\br_\bo_\bb_\bl_\be_\bm_\bs(_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn, mat, solvers, subDomains, onTheFly);\n+1094 }\n+1095\n+1102 template\n+_\b1_\b1_\b0_\b3 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be {};\n+1104\n+1105 template\n+_\b1_\b1_\b0_\b6 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n+1107 {\n+_\b1_\b1_\b0_\b8 static constexpr size_t n = std::decay_t()))>::rows;\n+_\b1_\b1_\b0_\b9 static constexpr size_t m = std::decay_t()))>::cols;\n+1110 template\n+_\b1_\b1_\b1_\b1 static int _\bs_\bi_\bz_\be(const Domain & d)\n+1112 {\n+1113 assert(n==m);\n+1114 return m*d.size();\n+1115 }\n+1116 };\n+1117\n+1118 template\n+1119 template\n+1120 std::size_t\n+_\b1_\b1_\b2_\b1 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<\n+_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b>, X, Y >,false>::\n+1122 assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain,\n+1123 [[maybe_unused]] const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n+1124 [[maybe_unused]] Solvers& solvers,\n+1125 const SubDomains& subDomains,\n+1126 [[maybe_unused]] bool onTheFly)\n+1127 {\n+1128 typedef typename SubDomains::const_iterator DomainIterator;\n+1129 std::size_t maxlength = 0;\n+1130\n+1131 assert(onTheFly);\n+1132\n+1133 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();\n+++domain)\n+1134 maxlength=std::max(maxlength, domain->size());\n+1135 maxlength*=n;\n+1136\n+1137 return maxlength;\n+1138 }\n+1139\n+1140#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK\n+1141 template class S, typename T, typename A>\n+1142 template\n+_\b1_\b1_\b4_\b3 std::size_t\n+_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::\n+assembleLocalProblems(const RowToDomain& rowToDomain,\n+1144 const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n+1145 Solvers& solvers,\n+1146 const SubDomains& subDomains,\n+1147 bool onTheFly)\n+1148 {\n+1149 typedef typename S>::MatrixInitializer MatrixInitializer;\n+1150 typedef typename std::vector::iterator\n+InitializerIterator;\n+1151 typedef typename SubDomains::const_iterator DomainIterator;\n+1152 typedef typename Solvers::iterator SolverIterator;\n+1153 std::size_t maxlength = 0;\n+1154\n+1155 if(onTheFly) {\n+1156 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();\n+++domain)\n+1157 maxlength=std::max(maxlength, domain->size());\n+1158 maxlength*=Impl::asMatrix(*_\bm_\ba_\bt[0].begin()).N();\n+1159 }else{\n+1160 // initialize the initializers\n+1161 DomainIterator domain=subDomains.begin();\n+1162\n+1163 // Create the initializers list.\n+1164 std::vector initializers(subDomains.size());\n+1165\n+1166 SolverIterator solver=solvers.begin();\n+1167 for(InitializerIterator initializer=initializers.begin();\n+initializer!=initializers.end();\n+1168 ++initializer, ++solver, ++domain) {\n+1169 solver->getInternalMatrix\n+().N_=_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be_\b<_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bs_\bi_\bz_\be(*domain);\n+1170 solver->getInternalMatrix\n+().M_=_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be_\b<_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bs_\bi_\bz_\be(*domain);\n+1171 //solver->setVerbosity(true);\n+1172 *initializer=MatrixInitializer(solver->getInternalMatrix());\n+1173 }\n+1174\n+1175 // Set up the supermatrices according to the subdomains\n+1176 typedef _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b>,\n+1177 RowToDomain, SubDomains> Initializer;\n+1178\n+1179 Initializer initializer(initializers, rowToDomain, subDomains);\n+1180 copyToBCCSMatrix(initializer, _\bm_\ba_\bt);\n+1181\n+1182 // Calculate the LU decompositions\n+1183 for(auto&& s: solvers)\n+1184 s.decompose();\n+1185 for (SolverIterator solverIt = solvers.begin(); solverIt != solvers.end();\n+++solverIt)\n+1186 {\n+1187 assert(solverIt->getInternalMatrix().N() == solverIt->getInternalMatrix\n+().M());\n+1188 maxlength = std::max(maxlength, solverIt->getInternalMatrix().N());\n+1189 }\n+1190 }\n+1191 return maxlength;\n+1192 }\n+1193\n+1194#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK\n+1195\n+1196 template\n+1197 template\n+_\b1_\b1_\b9_\b8 std::size_t _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:\n+_\ba_\bs_\bs_\be_\bm_\bb_\bl_\be_\bL_\bo_\bc_\ba_\bl_\bP_\br_\bo_\bb_\bl_\be_\bm_\bs([[maybe_unused]] const RowToDomain& rowToDomain,\n+1199 const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n+1200 Solvers& solvers,\n+1201 const SubDomains& subDomains,\n+1202 bool onTheFly)\n+1203 {\n+1204 typedef typename SubDomains::const_iterator DomainIterator;\n+1205 typedef typename Solvers::iterator SolverIterator;\n+1206 std::size_t maxlength = 0;\n+1207\n+1208 if(onTheFly) {\n+1209 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();\n+++domain)\n+1210 maxlength=std::max(maxlength, domain->size());\n+1211 }else{\n+1212 // initialize the solvers of the local problems.\n+1213 SolverIterator solver=solvers.begin();\n+1214 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();\n+1215 ++domain, ++solver) {\n+1216 solver->setSubMatrix(_\bm_\ba_\bt, *domain);\n+1217 maxlength=std::max(maxlength, domain->size());\n+1218 }\n+1219 }\n+1220\n+1221 return maxlength;\n+1222\n+1223 }\n+1224\n+1225\n+1226 template\n+_\b1_\b2_\b2_\b7 void _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bD_\b,_\bT_\bA_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(X& x, const X& b)\n+1228 {\n+1229 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(*this, x, b);\n+1230 }\n+1231\n+1232 template\n+1233 template\n+_\b1_\b2_\b3_\b4 void _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bD_\b,_\bT_\bA_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(X& x, const X& b)\n+1235 {\n+1236 typedef _\bs_\bl_\bu_\b__\bv_\be_\bc_\bt_\bo_\br solver_vector;\n+1237 typedef typename\n+_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bf_\bo_\br_\bw_\ba_\br_\bd_\b>_\b:_\b:\n+_\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br iterator;\n+1238 typedef typename\n+_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bf_\bo_\br_\bw_\ba_\br_\bd_\b>_\b:_\b:\n+_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+1239 domain_iterator;\n+1240\n+1241 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bT_\bD_\b> assigner(maxlength, _\bm_\ba_\bt, b, x);\n+1242\n+1243 domain_iterator\n+_\bd_\bo_\bm_\ba_\bi_\bn=_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bf_\bo_\br_\bw_\ba_\br_\bd_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+(subDomains);\n+1244 iterator solver =\n+_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bf_\bo_\br_\bw_\ba_\br_\bd_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+(solvers);\n+1245 X v(x); // temporary for the update\n+1246 v=0;\n+1247\n+1248 typedef typename _\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bT_\bM_\b,_\bX_\b,_\bT_\bD_\b _\b>_\b:_\b:_\bA_\bd_\bd_\be_\br Adder;\n+1249 Adder adder(v, x, assigner, relax);\n+1250\n+1251 for(; _\bd_\bo_\bm_\ba_\bi_\bn !=\n+_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bf_\bo_\br_\bw_\ba_\br_\bd_\b>_\b:_\b:_\be_\bn_\bd\n+(subDomains); ++_\bd_\bo_\bm_\ba_\bi_\bn) {\n+1252 //Copy rhs to C-array for SuperLU\n+1253 std::for_each(_\bd_\bo_\bm_\ba_\bi_\bn->begin(), _\bd_\bo_\bm_\ba_\bi_\bn->end(), assigner);\n+1254 assigner.resetIndexForNextDomain();\n+1255 if(onTheFly) {\n+1256 // Create the subdomain solver\n+1257 _\bs_\bl_\bu _\bs_\bd_\bs_\bo_\bl_\bv_\be_\br;\n+1258 _\bs_\bd_\bs_\bo_\bl_\bv_\be_\br.setSubMatrix(_\bm_\ba_\bt, *_\bd_\bo_\bm_\ba_\bi_\bn);\n+1259 // Apply\n+1260 _\bs_\bd_\bs_\bo_\bl_\bv_\be_\br.apply(assigner.lhs(), assigner.rhs());\n+1261 }else{\n+1262 solver->apply(assigner.lhs(), assigner.rhs());\n+1263 ++solver;\n+1264 }\n+1265\n+1266 //Add relaxed correction to from SuperLU to v\n+1267 std::for_each(_\bd_\bo_\bm_\ba_\bi_\bn->begin(), _\bd_\bo_\bm_\ba_\bi_\bn->end(), adder);\n+1268 assigner.resetIndexForNextDomain();\n+1269\n+1270 }\n+1271\n+1272 adder.axpy();\n+1273 assigner.deallocate();\n+1274 }\n+1275\n+1276 template\n+1277 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b>, X, Y >,false>\n+_\b1_\b2_\b7_\b8 ::OverlappingAssignerHelper(std::size_t maxlength, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,\n+_\bA_\bl_\b>& mat_,\n+1279 const X& b_, Y& x_) :\n+1280 _\bm_\ba_\bt(&mat_),\n+1281 rhs_( new DynamicVector<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>(maxlength, 42) ),\n+1282 lhs_( new DynamicVector<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>(maxlength, -42) ),\n+1283 b(&b_),\n+1284 x(&x_),\n+1285 i(0),\n+1286 maxlength_(maxlength)\n+1287 {}\n+1288\n+1289 template\n+1290 void\n+1291 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b>, X, Y >,false>\n+_\b1_\b2_\b9_\b2 ::deallocate()\n+1293 {\n+1294 delete rhs_;\n+1295 delete lhs_;\n+1296 }\n+1297\n+1298 template\n+1299 void\n+1300 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b>, X, Y >,false>\n+_\b1_\b3_\b0_\b1 ::resetIndexForNextDomain()\n+1302 {\n+1303 i=0;\n+1304 }\n+1305\n+1306 template\n+1307 DynamicVector &\n+1308 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b>, X, Y >,false>\n+_\b1_\b3_\b0_\b9 ::lhs()\n+1310 {\n+1311 return *lhs_;\n+1312 }\n+1313\n+1314 template\n+1315 DynamicVector &\n+1316 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b>, X, Y >,false>\n+_\b1_\b3_\b1_\b7 ::rhs()\n+1318 {\n+1319 return *rhs_;\n+1320 }\n+1321\n+1322 template\n+1323 void\n+1324 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b>, X, Y >,false>\n+_\b1_\b3_\b2_\b5 ::relaxResult(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax)\n+1326 {\n+1327 lhs() *= relax;\n+1328 }\n+1329\n+1330 template\n+1331 void\n+1332 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b>, X, Y >,false>\n+_\b1_\b3_\b3_\b3 ::operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domainIndex)\n+1334 {\n+1335 lhs() = 0.0;\n+1336#if 0\n+1337 //assign right hand side of current domainindex block\n+1338 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j\n+1376 void\n+1377 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b>, X, Y >,false>\n+_\b1_\b3_\b7_\b8 ::assignResult(_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& res)\n+1379 {\n+1380 // assign the result of the local solve to the global vector\n+1381 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j class S, typename T, typename A>\n+1390 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>\n+_\b1_\b3_\b9_\b1 ::OverlappingAssignerHelper(std::size_t maxlength,\n+1392 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>& mat_,\n+1393 const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b_,\n+1394 _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& x_)\n+1395 : _\bm_\ba_\bt(&mat_),\n+1396 b(&b_),\n+1397 x(&x_), i(0), maxlength_(maxlength)\n+1398 {\n+1399 rhs_ = new _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be[maxlength];\n+1400 lhs_ = new _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be[maxlength];\n+1401\n+1402 }\n+1403\n+1404 template class S, typename T, typename A>\n+_\b1_\b4_\b0_\b5 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b> >,true>::deallocate()\n+1406 {\n+1407 delete[] rhs_;\n+1408 delete[] lhs_;\n+1409 }\n+1410\n+1411 template class S, typename T, typename A>\n+_\b1_\b4_\b1_\b2 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::operator()(const\n+_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domainIndex)\n+1413 {\n+1414 //assign right hand side of current domainindex block\n+1415 // rhs is an array of doubles!\n+1416 // rhs[starti] = b[domainindex]\n+1417 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j class S, typename T, typename A>\n+_\b1_\b4_\b4_\b1 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::relaxResult\n+(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax)\n+1442 {\n+1443 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=i+n; i class S, typename T, typename A>\n+_\b1_\b4_\b5_\b1 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::assignResult\n+(_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& res)\n+1452 {\n+1453 // assign the result of the local solve to the global vector\n+1454 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j class S, typename T, typename A>\n+_\b1_\b4_\b6_\b1 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::\n+resetIndexForNextDomain()\n+1462 {\n+1463 i=0;\n+1464 }\n+1465\n+1466 template class S, typename T, typename A>\n+1467 typename _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::field_type*\n+_\b1_\b4_\b6_\b8 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::lhs()\n+1469 {\n+1470 return lhs_;\n+1471 }\n+1472\n+1473 template class S, typename T, typename A>\n+1474 typename _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::field_type*\n+_\b1_\b4_\b7_\b5 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::rhs()\n+1476 {\n+1477 return rhs_;\n+1478 }\n+1479\n+1480#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK\n+1481\n+1482 template\n+_\b1_\b4_\b8_\b3 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be(std::size_t\n+maxlength,\n+1484 const M& mat_,\n+1485 const Y& b_,\n+1486 X& x_)\n+1487 : _\bm_\ba_\bt(&mat_),\n+1488 b(&b_),\n+1489 x(&x_), i(0)\n+1490 {\n+1491 rhs_= new Y(maxlength);\n+1492 lhs_ = new X(maxlength);\n+1493 }\n+1494\n+1495 template\n+_\b1_\b4_\b9_\b6 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be()\n+1497 {\n+1498 delete rhs_;\n+1499 delete lhs_;\n+1500 }\n+1501\n+1502 template\n+_\b1_\b5_\b0_\b3 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be&\n+domainIndex)\n+1504 {\n+1505 (*rhs_)[i]=(*b)[domainIndex];\n+1506\n+1507 // loop over all Matrix row entries and calculate defect.\n+1508 typedef typename matrix_type::ConstColIterator col_iterator;\n+1509\n+1510 // calculate defect for current row index block\n+1511 for(col_iterator _\bc_\bo_\bl=(*_\bm_\ba_\bt)[domainIndex].begin(); _\bc_\bo_\bl!=(*mat)\n+[domainIndex].end(); ++_\bc_\bo_\bl) {\n+1512 Impl::asMatrix(*col).mmv((*x)[_\bc_\bo_\bl.index()], (*rhs_)[i]);\n+1513 }\n+1514 // Goto next local index\n+1515 ++i;\n+1516 }\n+1517\n+1518 template\n+_\b1_\b5_\b1_\b9 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\br_\be_\bl_\ba_\bx_\bR_\be_\bs_\bu_\bl_\bt(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax)\n+1520 {\n+1521 (*lhs_)[i]*=relax;\n+1522 }\n+1523\n+1524 template\n+_\b1_\b5_\b2_\b5 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\ba_\bs_\bs_\bi_\bg_\bn_\bR_\be_\bs_\bu_\bl_\bt(_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& res)\n+1526 {\n+1527 res+=(*lhs_)[i++];\n+1528 }\n+1529\n+1530 template\n+_\b1_\b5_\b3_\b1 X& _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bl_\bh_\bs()\n+1532 {\n+1533 return *lhs_;\n+1534 }\n+1535\n+1536 template\n+_\b1_\b5_\b3_\b7 Y& _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\br_\bh_\bs()\n+1538 {\n+1539 return *rhs_;\n+1540 }\n+1541\n+1542 template\n+_\b1_\b5_\b4_\b3 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\br_\be_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bF_\bo_\br_\bN_\be_\bx_\bt_\bD_\bo_\bm_\ba_\bi_\bn()\n+1544 {\n+1545 i=0;\n+1546 }\n+1547\n+1548 template\n+_\b1_\b5_\b4_\b9 _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >::AdditiveAdder(_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& v_,\n+1550 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& x_,\n+1551 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>& assigner_,\n+1552 const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& relax_)\n+1553 : v(&v_), x(&x_), assigner(&assigner_), relax(relax_)\n+1554 {}\n+1555\n+1556 template\n+_\b1_\b5_\b5_\b7 void _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >::operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be&\n+domainIndex)\n+1558 {\n+1559 // add the result of the local solve to the current update\n+1560 assigner->assignResult((*v)[domainIndex]);\n+1561 }\n+1562\n+1563\n+1564 template\n+_\b1_\b5_\b6_\b5 void _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >::axpy()\n+1566 {\n+1567 // relax the update and add it to the current guess.\n+1568 x->axpy(relax,*v);\n+1569 }\n+1570\n+1571\n+1572 template\n+1573 _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >\n+_\b1_\b5_\b7_\b4 ::MultiplicativeAdder([[maybe_unused]] _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& v_,\n+1575 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& x_,\n+1576 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>& assigner_, const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& relax_)\n+1577 : x(&x_), assigner(&assigner_), relax(relax_)\n+1578 {}\n+1579\n+1580\n+1581 template\n+_\b1_\b5_\b8_\b2 void _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >::operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be&\n+domainIndex)\n+1583 {\n+1584 // add the result of the local solve to the current guess\n+1585 assigner->relaxResult(relax);\n+1586 assigner->assignResult((*x)[domainIndex]);\n+1587 }\n+1588\n+1589\n+1590 template\n+_\b1_\b5_\b9_\b1 void _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >::axpy()\n+1592 {\n+1593 // nothing to do, as the corrections already relaxed and added in operator\n+()\n+1594 }\n+1595\n+1596\n+1598}\n+1599\n+1600#endif\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n+_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh\n+Classes for using UMFPack with ISTL matrices.\n+_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh\n+Classes for using SuperLU with ISTL matrices.\n+_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh\n+_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n+Define general preconditioner interface.\n+_\bi_\bl_\bu_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n+Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.\n+_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n+Templates characterizing the type of a solver.\n+_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+This file implements a vector space as a tensor product of a given vector\n+space. The number of compon...\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\ba_\bd_\bd_\bR_\bo_\bw_\bN_\bn_\bz\n+void addRowNnz(const Iter &row)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:895\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(X &v, const X &d)\n+Apply one step of the preconditioner to the system A(v)=d.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1234\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bl_\bh_\bs\n+X & lhs()\n+Get the local left hand side.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1531\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bc_\ba_\bl_\bc_\bC_\bo_\bl_\bs_\bt_\ba_\br_\bt\n+void calcColstart() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:926\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\br_\bh_\bs\n+Y & rhs()\n+Get the local right hand side.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1537\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n+iterator end()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:989\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\br_\be_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bF_\bo_\br_\bN_\be_\bx_\bt_\bD_\bo_\bm_\ba_\bi_\bn\n+void resetIndexForNextDomain()\n+Resets the local index to zero.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1543\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bc_\bo_\bp_\by_\bV_\ba_\bl_\bu_\be\n+void copyValue(const Iter &row, const CIter &col) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:933\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx\n+void createMatrix() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:947\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+iterator begin()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1003\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+OverlappingSchwarzInitializer(InitializerList &il, const IndexSet &indices,\n+const subdomain_vector &domains)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:887\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+IndexMap()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:955\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &v, const X &d)\n+Apply the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1227\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n+OverlappingAssignerILUBase(std::size_t maxlength, const M &mat, const Y &b, X\n+&x)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1483\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bf_\bi_\bn_\bd\n+const_iterator find(size_type grow) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:968\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const size_type &domain)\n+calculate one entry of the local defect.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1503\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n+SeqOverlappingSchwarz(const matrix_type &mat, const subdomain_vector\n+&subDomains, field_type relaxationFactor=1, bool onTheFly_=true)\n+Construct the overlapping Schwarz method.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1056\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n+void allocate()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:905\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n+void deallocate()\n+Deallocates memory of the local vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1496\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n+void insert(size_type grow)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:960\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs\n+void countEntries(const Iter &row, const CIter &col) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:914\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\ba_\bs_\bs_\be_\bm_\bb_\bl_\be_\bL_\bo_\bc_\ba_\bl_\bP_\br_\bo_\bb_\bl_\be_\bm_\bs\n+static std::size_t assembleLocalProblems(const RowToDomain &rowToDomain, const\n+matrix_type &mat, Solvers &solvers, const SubDomains &domains, bool onTheFly)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1198\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\br_\be_\bl_\ba_\bx_\bR_\be_\bs_\bu_\bl_\bt\n+void relaxResult(field_type relax)\n+relax the result.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1519\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\ba_\bs_\bs_\bi_\bg_\bn_\bR_\be_\bs_\bu_\bl_\bt\n+void assignResult(block_type &res)\n+Assigns the block to the current local index. At the same time the local defect\n+is calculated for the...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1525\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n+SeqOverlappingSchwarz(const matrix_type &mat, const rowtodomain_vector\n+&rowToDomain, field_type relaxationFactor=1, bool onTheFly_=true)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1009\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-derive error class from the base class in common\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n-Error specific to BCRSMatrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd\n-Thrown when the compression buffer used by the implicit BCRSMatrix construction\n-is exhausted.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt\n-Thrown when a solver aborts due to some problem.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br\n-Error when performing an operation on a matrix block.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br_\b:_\b:_\bc\n-int c\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br_\b:_\b:_\br\n-int r\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+Initializer for SuperLU Matrices representing the subdomains.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:47\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bC_\bI_\bt_\be_\br\n+Matrix::row_type::const_iterator CIter\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+S IndexSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bt_\be_\br\n+Matrix::const_iterator Iter\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+IndexSet::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\bL_\bi_\bs_\bt\n+I InitializerList\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+AtomInitializer::Matrix Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bA_\bt_\bo_\bm_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+InitializerList::value_type AtomInitializer\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n+D subdomain_vector\n+The vector type containing the subdomain to row index mapping.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+Iterator end()\n+Get iterator to one beyond last row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:677\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+The type for the index access and the size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::ConstIterator ConstColIterator\n+Const iterator to the entries of a row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:737\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A vector of blocks with memory management.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n+Exact subdomain solver using ILU(p) with appropriate p.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n+Sequential overlapping Schwarz preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:783\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bl_\bi_\bs_\bt\n+SLList< size_type, typename std::allocator_traits< TA >::template rebind_alloc<\n+size_type > > subdomain_list\n+The type for the row to subdomain mapping.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:800\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bl_\bu_\b__\bv_\be_\bc_\bt_\bo_\br\n+std::vector< slu, typename std::allocator_traits< TA >::template rebind_alloc<\n+slu > > slu_vector\n+The vector type containing subdomain solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:809\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+The type of the matrix to precondition.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:760\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bM_\bo_\bd_\be\n+TM Mode\n+The mode (additive or multiplicative) of the Schwarz method.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:778\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+X range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:770\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+std::set< size_type, std::less< size_type >, typename std::allocator_traits< TA\n+>::template rebind_alloc< size_type > > subdomain_type\n+The type for the subdomain to row index mapping.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:794\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:765\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bl_\bu\n+TD slu\n+The type for the subdomain solver in use.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:806\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:868\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bp_\br_\be\n+virtual void pre(X &x, X &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:846\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(X &x)\n+Postprocess the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:861\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+TA allocator\n+The allocator to use.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:789\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n+std::vector< subdomain_type, typename std::allocator_traits< TA >::template\n+rebind_alloc< subdomain_type > > subdomain_vector\n+The vector type containing the subdomain to row index mapping.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:797\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\br_\bo_\bw_\bt_\bo_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n+std::vector< subdomain_list, typename std::allocator_traits< TA >::template\n+rebind_alloc< subdomain_list > > rowtodomain_vector\n+The vector type containing the row index to subdomain mapping.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:803\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+matrix_type::size_type size_type\n+The return type of the size method.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:786\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n+Tag that the tells the Schwarz method to be additive.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n+Tag that tells the Schwarz method to be multiplicative.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n+Tag that tells the Schwarz method to be multiplicative and symmetric.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:133\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n+Exact subdomain solver using Dune::DynamicMatrix::solve.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:140\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+std::remove_const< M >::type matrix_type\n+The matrix type the preconditioner is for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n+void setSubMatrix(const M &BCRS, S &rowset)\n+Set the data of the local problem.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:184\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(DynamicVector< field_type > &v, DynamicVector< field_type > &d)\n+Apply the subdomain solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be\n+std::remove_const< M >::type rilu_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:215\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+matrix_type::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:229\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:226\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+BCRSMatrix< K, Al > matrix_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:225\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:227\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n+_\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+range_type::block_type block_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:228\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+S< BCRSMatrix< T, A > >::range_type range_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:315\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+range_type::block_type block_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:317\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+range_type::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:316\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+matrix_type::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:319\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+BCRSMatrix< T, A > matrix_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:314\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:400\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+matrix_type::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:408\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Y::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:404\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+Y::block_type block_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:406\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:402\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:\n+_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X\n+&x)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:493\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:\n+_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X\n+&x)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:512\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:520\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type\n+field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:526\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:525\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:542\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:547\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type\n+field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:548\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+template meta program for choosing how to add the correction.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:572\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>_\b:_\b:_\bA_\bd_\bd_\be_\br\n+AdditiveAdder< S, X > Adder\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:577\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>_\b:_\b:_\bA_\bd_\bd_\be_\br\n+MultiplicativeAdder< S, X > Adder\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:583\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>_\b:_\b:_\bA_\bd_\bd_\be_\br\n+MultiplicativeAdder< S, X > Adder\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:589\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+Helper template meta program for application of overlapping Schwarz.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:605\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+static solver_iterator begin(solver_vector &sv)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:611\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+solver_vector::iterator solver_iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:607\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+static domain_iterator end(const subdomain_vector &sv)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:625\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+subdomain_vector::const_iterator domain_iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:609\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br\n+T1 solver_vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:606\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+static domain_iterator begin(const subdomain_vector &sv)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:620\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n+T2 subdomain_vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:608\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+static solver_iterator end(solver_vector &sv)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:616\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n+T2 subdomain_vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:636\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\be_\bn_\bd\n+static solver_iterator end(solver_vector &sv)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:644\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+solver_vector::reverse_iterator solver_iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:635\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+subdomain_vector::const_reverse_iterator domain_iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:637\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+static solver_iterator begin(solver_vector &sv)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:639\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br\n+T1 solver_vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:634\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+static domain_iterator begin(const subdomain_vector &sv)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:648\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\be_\bn_\bd\n+static domain_iterator end(const subdomain_vector &sv)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:653\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br\n+Helper template meta program for application of overlapping Schwarz.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:669\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+smoother::range_type range_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:671\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br\n+T smoother\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:670\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+static void apply(smoother &sm, range_type &v, const range_type &b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:673\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bT_\bD_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+static void apply(smoother &sm, range_type &v, const range_type &b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:685\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bT_\bD_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br\n+SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA >\n+smoother\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:682\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bT_\bD_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+smoother::range_type range_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:683\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<\n+_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+BCRSMatrix< K, Al > matrix_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:702\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:\n+_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+BCRSMatrix< T, A > matrix_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:713\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:723\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:724\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1103\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be\n+static int size(const Domain &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00062.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00062.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixutils.hh File Reference\n+dune-istl: bccsmatrixinitializer.hh File Reference\n \n \n \n \n \n \n \n@@ -70,94 +70,33 @@\n
    \n \n
    \n \n \n+
    bccsmatrixinitializer.hh File Reference
    \n \n
    \n-\n-

    Some handy generic functions for ISTL matrices. \n-More...

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

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-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::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 >
     
    \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n

    \n-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::ISTL
     
    \n-

    Detailed Description

    \n-

    Some handy generic functions for ISTL matrices.

    \n-
    Author
    Markus Blatt
    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,80 +1,21 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-matrixutils.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bS_\bp_\ba_\br_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bc_\bl_\ba_\bs_\bs_\be_\bs\n-Some handy generic functions for ISTL matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+bccsmatrixinitializer.hh File Reference\n #include \n+#include \n #include \n-#include \n-#include \n-#include \n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b,_\b _\bl_\b _\b>\n-\u00a0 Check whether the a matrix has diagonal values on blocklevel recursion\n- levels. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\b0_\b,_\b _\bl_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b,\n- _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b,_\b _\bl_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>\n-\u00a0 Test whether a type is an _\bI_\bS_\bT_\bL _\bM_\ba_\bt_\br_\bi_\bx. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be_\b<_\b _\bT_\b _\b>\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs (const M &, typename std::enable_if_t< Dune::\n- IsNumber< M >::value > *sfinae=nullptr)\n-\u00a0 Get the number of nonzero fields in the matrix.\n-\u00a0\n-template\n-auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs (const M &matrix, typename std::enable_if_t::value > *sfinae=nullptr)\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bG_\bl_\bo_\bb_\ba_\bl_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx (const M &_\bm_\ba_\bt, C &ooc, std::ostream &os)\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Some handy generic functions for ISTL matrices.\n- Author\n- Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00062_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00062_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixutils.hh Source File\n+dune-istl: bccsmatrixinitializer.hh Source File\n \n \n \n \n \n \n \n@@ -74,717 +74,335 @@\n \n
    \n \n
    \n \n
    \n-
    matrixutils.hh
    \n+
    bccsmatrixinitializer.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_MATRIXUTILS_HH
    \n-
    6#define DUNE_ISTL_MATRIXUTILS_HH
    \n+
    5#ifndef DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH
    \n+
    6#define DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH
    \n
    7
    \n-
    8#include <set>
    \n-
    9#include <vector>
    \n-
    10#include <limits>
    \n+
    8#include <limits>
    \n+
    9#include <set>
    \n+
    10
    \n
    11#include <dune/common/typetraits.hh>
    \n-
    12#include <dune/common/fmatrix.hh>
    \n-
    13#include <dune/common/dynmatrix.hh>
    \n-
    14#include <dune/common/diagonalmatrix.hh>
    \n-
    15#include <dune/common/scalarmatrixview.hh>
    \n-\n-
    17#include "istlexception.hh"
    \n-
    18
    \n-
    19namespace Dune
    \n-
    20{
    \n+
    12#include <dune/common/scalarmatrixview.hh>
    \n+
    13
    \n+\n+
    15
    \n+
    16namespace Dune
    \n+
    17{
    \n+
    18 template<class I, class S, class D>
    \n+
    19 class OverlappingSchwarzInitializer;
    \n+
    20}
    \n
    21
    \n-
    22#ifndef DOYXGEN
    \n-
    23 template<typename B, typename A>
    \n-
    24 class BCRSMatrix;
    \n-
    25
    \n-
    26 template<typename K, int n, int m>
    \n-\n-
    28
    \n-
    29 template<class T, class A>
    \n-
    30 class Matrix;
    \n-
    31#endif
    \n-
    32
    \n-
    46 template<class Matrix, std::size_t blocklevel, std::size_t l=blocklevel>
    \n-
    \n-\n-
    48 {
    \n-
    \n-
    53 static void check([[maybe_unused]] const Matrix& mat)
    \n-
    54 {
    \n-
    55#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    56 typedef typename Matrix::ConstRowIterator Row;
    \n-
    57 typedef typename Matrix::ConstColIterator Entry;
    \n-
    58 for(Row row = mat.begin(); row!=mat.end(); ++row) {
    \n-
    59 Entry diagonal = row->find(row.index());
    \n-
    60 if(diagonal==row->end())
    \n-
    61 DUNE_THROW(ISTLError, "Missing diagonal value in row "<<row.index()
    \n-
    62 <<" at block recursion level "<<l-blocklevel);
    \n-
    63 else{
    \n-
    64 auto m = Impl::asMatrix(*diagonal);
    \n-
    65 CheckIfDiagonalPresent<decltype(m),blocklevel-1,l>::check(m);
    \n-
    66 }
    \n-
    67 }
    \n-
    68#endif
    \n-
    69 }
    \n-
    \n-
    70 };
    \n-
    \n-
    71
    \n-
    72 template<class Matrix, std::size_t l>
    \n-
    \n-\n-
    74 {
    \n-
    \n-
    75 static void check(const Matrix& mat)
    \n-
    76 {
    \n-
    77 typedef typename Matrix::ConstRowIterator Row;
    \n-
    78 for(Row row = mat.begin(); row!=mat.end(); ++row) {
    \n-
    79 if(row->find(row.index())==row->end())
    \n-
    80 DUNE_THROW(ISTLError, "Missing diagonal value in row "<<row.index()
    \n-
    81 <<" at block recursion level "<<l);
    \n-
    82 }
    \n-
    83 }
    \n-
    \n-
    84 };
    \n-
    \n-
    85
    \n-
    86 template<typename FirstRow, typename... Args>
    \n-
    87 class MultiTypeBlockMatrix;
    \n-
    88
    \n-
    89 template<std::size_t blocklevel, std::size_t l, typename T1, typename... Args>
    \n-
    \n-\n-
    91 blocklevel,l>
    \n-
    92 {
    \n-
    93 typedef MultiTypeBlockMatrix<T1,Args...> Matrix;
    \n-
    94
    \n-
    \n-
    99 static void check(const Matrix& /* mat */)
    \n-
    100 {
    \n-
    101#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    102 // TODO Implement check
    \n-
    103#endif
    \n-
    104 }
    \n-
    \n-
    105 };
    \n-
    \n-
    106
    \n-
    118 template<class M>
    \n-
    \n-
    119 inline auto countNonZeros(const M&,
    \n-
    120 [[maybe_unused]] typename std::enable_if_t<Dune::IsNumber<M>::value>* sfinae = nullptr)
    \n-
    121 {
    \n-
    122 return 1;
    \n-
    123 }
    \n-
    \n-
    124
    \n-
    125 template<class M>
    \n-
    \n-
    126 inline auto countNonZeros(const M& matrix,
    \n-
    127 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr)
    \n-
    128 {
    \n-
    129 typename M::size_type nonZeros = 0;
    \n-
    130 for(auto&& row : matrix)
    \n-
    131 for(auto&& entry : row)
    \n-
    132 nonZeros += countNonZeros(entry);
    \n-
    133 return nonZeros;
    \n-
    134 }
    \n-
    \n-
    135
    \n-
    136 /*
    \n-
    137 template<class M>
    \n-
    138 struct ProcessOnFieldsOfMatrix
    \n-
    139 */
    \n-
    140
    \n-
    142 namespace
    \n-
    143 {
    \n-
    144 struct CompPair {
    \n-
    145 template<class G,class M>
    \n-
    146 bool operator()(const std::pair<G,M>& p1, const std::pair<G,M>& p2) const
    \n-
    147 {
    \n-
    148 return p1.first<p2.first;
    \n-
    149 }
    \n-
    150 };
    \n+
    22namespace Dune::ISTL::Impl
    \n+
    23{
    \n+
    31 template<class M, class S>
    \n+
    32 class MatrixRowSubset
    \n+
    33 {
    \n+
    34 public:
    \n+
    36 typedef M Matrix;
    \n+
    38 typedef S RowIndexSet;
    \n+
    39
    \n+
    45 MatrixRowSubset(const Matrix& m, const RowIndexSet& s)
    \n+
    46 : m_(m), s_(s)
    \n+
    47 {}
    \n+
    48
    \n+
    49 const Matrix& matrix() const
    \n+
    50 {
    \n+
    51 return m_;
    \n+
    52 }
    \n+
    53
    \n+
    54 const RowIndexSet& rowIndexSet() const
    \n+
    55 {
    \n+
    56 return s_;
    \n+
    57 }
    \n+
    58
    \n+
    60 class const_iterator
    \n+
    61 : public ForwardIteratorFacade<const_iterator, const typename Matrix::row_type>
    \n+
    62 {
    \n+
    63 public:
    \n+
    64 const_iterator(typename Matrix::const_iterator firstRow,
    \n+
    65 typename RowIndexSet::const_iterator pos)
    \n+
    66 : firstRow_(firstRow), pos_(pos)
    \n+
    67 {}
    \n+
    68
    \n+
    69
    \n+
    70 const typename Matrix::row_type& dereference() const
    \n+
    71 {
    \n+
    72 return *(firstRow_+ *pos_);
    \n+
    73 }
    \n+
    74 bool equals(const const_iterator& o) const
    \n+
    75 {
    \n+
    76 return pos_==o.pos_;
    \n+
    77 }
    \n+
    78 void increment()
    \n+
    79 {
    \n+
    80 ++pos_;
    \n+
    81 }
    \n+
    82 typename RowIndexSet::value_type index() const
    \n+
    83 {
    \n+
    84 return *pos_;
    \n+
    85 }
    \n+
    86
    \n+
    87 private:
    \n+
    89 typename Matrix::const_iterator firstRow_;
    \n+
    91 typename RowIndexSet::const_iterator pos_;
    \n+
    92 };
    \n+
    93
    \n+
    95 const_iterator begin() const
    \n+
    96 {
    \n+
    97 return const_iterator(m_.begin(), s_.begin());
    \n+
    98 }
    \n+
    100 const_iterator end() const
    \n+
    101 {
    \n+
    102 return const_iterator(m_.begin(), s_.end());
    \n+
    103 }
    \n+
    104
    \n+
    105 private:
    \n+
    107 const Matrix& m_;
    \n+
    109 const RowIndexSet& s_;
    \n+
    110 };
    \n+
    111
    \n+
    118 template<class M, class I = typename M::size_type>
    \n+
    119 class BCCSMatrixInitializer
    \n+
    120 {
    \n+
    121 template<class IList, class S, class D>
    \n+\n+
    123 public:
    \n+
    124 using Matrix = M;
    \n+
    125 using Index = I;
    \n+
    126 typedef Dune::ISTL::Impl::BCCSMatrix<typename Matrix::field_type, I> OutputMatrix;
    \n+
    127 typedef typename Matrix::size_type size_type;
    \n+
    128
    \n+
    131 BCCSMatrixInitializer(OutputMatrix& mat_)
    \n+
    132 : mat(&mat_), cols(mat_.M())
    \n+
    133 {
    \n+
    134 if constexpr (Dune::IsNumber<typename M::block_type>::value)
    \n+
    135 {
    \n+
    136 n = m = 1;
    \n+
    137 }
    \n+
    138 else
    \n+
    139 {
    \n+
    140 // WARNING: This assumes that all blocks are dense and identical
    \n+
    141 n = M::block_type::rows;
    \n+
    142 m = M::block_type::cols;
    \n+
    143 }
    \n+
    144
    \n+
    145 mat->Nnz_=0;
    \n+
    146 }
    \n+
    147
    \n+
    148 BCCSMatrixInitializer()
    \n+
    149 : mat(0), cols(0), n(0), m(0)
    \n+
    150 {}
    \n
    151
    \n-
    152 }
    \n-
    153 template<class M, class C>
    \n-
    \n-
    154 void printGlobalSparseMatrix(const M& mat, C& ooc, std::ostream& os)
    \n-
    155 {
    \n-
    156 typedef typename C::ParallelIndexSet::const_iterator IIter;
    \n-
    157 typedef typename C::OwnerSet OwnerSet;
    \n-
    158 typedef typename C::ParallelIndexSet::GlobalIndex GlobalIndex;
    \n-
    159
    \n-
    160 GlobalIndex gmax=0;
    \n-
    161
    \n-
    162 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
    \n-
    163 idx!=eidx; ++idx)
    \n-
    164 gmax=std::max(gmax,idx->global());
    \n-
    165
    \n-
    166 gmax=ooc.communicator().max(gmax);
    \n-
    167 ooc.buildGlobalLookup();
    \n-
    168
    \n-
    169 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
    \n-
    170 idx!=eidx; ++idx) {
    \n-
    171 if(OwnerSet::contains(idx->local().attribute()))
    \n-
    172 {
    \n-
    173 typedef typename M::block_type Block;
    \n-
    174
    \n-
    175 std::set<std::pair<GlobalIndex,Block>,CompPair> entries;
    \n-
    176
    \n-
    177 // sort rows
    \n-
    178 typedef typename M::ConstColIterator CIter;
    \n-
    179 for(CIter c=mat[idx->local()].begin(), cend=mat[idx->local()].end();
    \n-
    180 c!=cend; ++c) {
    \n-
    181 const typename C::ParallelIndexSet::IndexPair* pair
    \n-
    182 =ooc.globalLookup().pair(c.index());
    \n-
    183 assert(pair);
    \n-
    184 entries.insert(std::make_pair(pair->global(), *c));
    \n-
    185 }
    \n-
    186
    \n-
    187 //wait until its the rows turn.
    \n-
    188 GlobalIndex rowidx = idx->global();
    \n-
    189 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
    \n-
    190 while(cur!=rowidx)
    \n-
    191 cur=ooc.communicator().min(rowidx);
    \n-
    192
    \n-
    193 // print rows
    \n-
    194 typedef typename std::set<std::pair<GlobalIndex,Block>,CompPair>::iterator SIter;
    \n-
    195 for(SIter s=entries.begin(), send=entries.end(); s!=send; ++s)
    \n-
    196 os<<idx->global()<<" "<<s->first<<" "<<s->second<<std::endl;
    \n-
    197
    \n-
    198
    \n-
    199 }
    \n-
    200 }
    \n-
    201
    \n-
    202 ooc.freeGlobalLookup();
    \n-
    203 // Wait until everybody is finished
    \n-
    204 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
    \n-
    205 while(cur!=ooc.communicator().min(cur)) ;
    \n-
    206 }
    \n-
    \n-
    207
    \n-
    208 // Default implementation for scalar types
    \n-
    209 template<typename M>
    \n-
    \n-\n-
    211 {
    \n-
    212 static_assert(IsNumber<M>::value, "MatrixDimension is not implemented for this type!");
    \n-
    213
    \n-
    \n-
    214 static auto rowdim(const M& A)
    \n-
    215 {
    \n-
    216 return 1;
    \n-
    217 }
    \n-
    \n-
    218
    \n-
    \n-
    219 static auto coldim(const M& A)
    \n-
    220 {
    \n-
    221 return 1;
    \n-
    222 }
    \n-
    \n-
    223 };
    \n-
    \n-
    224
    \n-
    225 // Default implementation for scalar types
    \n-
    226 template<typename B, typename TA>
    \n-
    \n-
    227 struct MatrixDimension<Matrix<B,TA> >
    \n-
    228 {
    \n-\n-\n-
    231
    \n-
    \n-\n-
    233 {
    \n-\n-
    235 }
    \n-
    \n-
    236
    \n-
    \n-\n-
    238 {
    \n-\n-
    240 }
    \n-
    \n+
    152 virtual ~BCCSMatrixInitializer()
    \n+
    153 {}
    \n+
    154
    \n+
    155 template<typename Iter>
    \n+
    156 void addRowNnz(const Iter& row) const
    \n+
    157 {
    \n+
    158 mat->Nnz_+=row->getsize();
    \n+
    159 }
    \n+
    160
    \n+
    161 template<typename Iter, typename FullMatrixIndex>
    \n+
    162 void addRowNnz(const Iter& row, const std::set<FullMatrixIndex>& indices) const
    \n+
    163 {
    \n+
    164 auto siter =indices.begin();
    \n+
    165 for (auto entry=row->begin(); entry!=row->end(); ++entry)
    \n+
    166 {
    \n+
    167 for(; siter!=indices.end() && *siter<entry.index(); ++siter) ;
    \n+
    168 if(siter==indices.end())
    \n+
    169 break;
    \n+
    170 if(*siter==entry.index())
    \n+
    171 // index is in subdomain
    \n+
    172 ++mat->Nnz_;
    \n+
    173 }
    \n+
    174 }
    \n+
    175
    \n+
    176 template<typename Iter, typename SubMatrixIndex>
    \n+
    177 void addRowNnz(const Iter& row, const std::vector<SubMatrixIndex>& indices) const
    \n+
    178 {
    \n+
    179 for (auto entry=row->begin(); entry!=row->end(); ++entry)
    \n+
    180 if (indices[entry.index()]!=std::numeric_limits<SubMatrixIndex>::max())
    \n+
    181 ++mat->Nnz_;
    \n+
    182 }
    \n+
    183
    \n+
    184 void allocate()
    \n+
    185 {
    \n+
    186 allocateMatrixStorage();
    \n+
    187 allocateMarker();
    \n+
    188 }
    \n+
    189
    \n+
    190 template<typename Iter, typename CIter>
    \n+
    191 void countEntries([[maybe_unused]] const Iter& row, const CIter& col) const
    \n+
    192 {
    \n+
    193 countEntries(col.index());
    \n+
    194 }
    \n+
    195
    \n+
    196 void countEntries(size_type colindex) const
    \n+
    197 {
    \n+
    198 for(size_type i=0; i < m; ++i)
    \n+
    199 {
    \n+
    200 assert(colindex*m+i<cols);
    \n+
    201 marker[colindex*m+i]+=n;
    \n+
    202 }
    \n+
    203 }
    \n+
    204
    \n+
    205 void calcColstart() const
    \n+
    206 {
    \n+
    207 mat->colstart[0]=0;
    \n+
    208 for(size_type i=0; i < cols; ++i) {
    \n+
    209 assert(i<cols);
    \n+
    210 mat->colstart[i+1]=mat->colstart[i]+marker[i];
    \n+
    211 marker[i]=mat->colstart[i];
    \n+
    212 }
    \n+
    213 }
    \n+
    214
    \n+
    215 template<typename Iter, typename CIter>
    \n+
    216 void copyValue(const Iter& row, const CIter& col) const
    \n+
    217 {
    \n+
    218 copyValue(col, row.index(), col.index());
    \n+
    219 }
    \n+
    220
    \n+
    221 template<typename CIter>
    \n+
    222 void copyValue(const CIter& col, size_type rowindex, size_type colindex) const
    \n+
    223 {
    \n+
    224 for(size_type i=0; i<n; i++) {
    \n+
    225 for(size_type j=0; j<m; j++) {
    \n+
    226 assert(colindex*m+j<cols-1 || (size_type)marker[colindex*m+j]<(size_type)mat->colstart[colindex*m+j+1]);
    \n+
    227 assert((size_type)marker[colindex*m+j]<mat->Nnz_);
    \n+
    228 mat->rowindex[marker[colindex*m+j]]=rowindex*n+i;
    \n+
    229 mat->values[marker[colindex*m+j]] = Dune::Impl::asMatrix(*col)[i][j];
    \n+
    230 ++marker[colindex*m+j]; // index for next entry in column
    \n+
    231 }
    \n+
    232 }
    \n+
    233 }
    \n+
    234
    \n+
    235 virtual void createMatrix() const
    \n+
    236 {
    \n+
    237 marker.clear();
    \n+
    238 }
    \n+
    239
    \n+
    240 protected:
    \n
    241
    \n-
    \n-
    242 static size_type rowdim (const Matrix<B,TA>& A)
    \n-
    243 {
    \n-
    244 size_type nn=0;
    \n-
    245 for (size_type i=0; i<A.N(); i++)
    \n-
    246 nn += rowdim(A,i);
    \n-
    247 return nn;
    \n-
    248 }
    \n-
    \n-
    249
    \n-
    \n-
    250 static size_type coldim (const Matrix<B,TA>& A)
    \n-
    251 {
    \n-
    252 size_type nn=0;
    \n-
    253 for (size_type i=0; i<A.M(); i++)
    \n-
    254 nn += coldim(A,i);
    \n-
    255 return nn;
    \n-
    256 }
    \n-
    \n-
    257 };
    \n-
    \n-
    258
    \n+
    242 void allocateMatrixStorage() const
    \n+
    243 {
    \n+
    244 mat->Nnz_*=n*m;
    \n+
    245 // initialize data
    \n+
    246 mat->values=new typename M::field_type[mat->Nnz_];
    \n+
    247 mat->rowindex=new I[mat->Nnz_];
    \n+
    248 mat->colstart=new I[cols+1];
    \n+
    249 }
    \n+
    250
    \n+
    251 void allocateMarker()
    \n+
    252 {
    \n+
    253 marker.resize(cols);
    \n+
    254 std::fill(marker.begin(), marker.end(), 0);
    \n+
    255 }
    \n+
    256
    \n+
    257 OutputMatrix* mat;
    \n+
    258 size_type cols;
    \n
    259
    \n-
    260 template<typename B, typename TA>
    \n-
    \n-\n-
    262 {
    \n-\n-\n-
    265 typedef typename Matrix::size_type size_type;
    \n+
    260 // Number of rows/columns of the matrix entries
    \n+
    261 // (assumed to be scalars or dense matrices)
    \n+
    262 size_type n, m;
    \n+
    263
    \n+
    264 mutable std::vector<size_type> marker;
    \n+
    265 };
    \n
    266
    \n-
    \n-
    267 static size_type rowdim (const Matrix& A, size_type i)
    \n-
    268 {
    \n-
    269 const B* row = A.r[i].getptr();
    \n-
    270 if(row)
    \n-\n-
    272 else
    \n-
    273 return 0;
    \n-
    274 }
    \n-
    \n-
    275
    \n-
    \n-
    276 static size_type coldim (const Matrix& A, size_type c)
    \n-
    277 {
    \n-
    278 // find an entry in column c
    \n-
    279 if (A.nnz_ > 0)
    \n-
    280 {
    \n-
    281 for (size_type k=0; k<A.nnz_; k++) {
    \n-
    282 if (A.j_.get()[k] == c) {
    \n-\n-
    284 }
    \n-
    285 }
    \n+
    267 template<class F, class Matrix>
    \n+
    268 void copyToBCCSMatrix(F& initializer, const Matrix& matrix)
    \n+
    269 {
    \n+
    270 for (auto row=matrix.begin(); row!= matrix.end(); ++row)
    \n+
    271 initializer.addRowNnz(row);
    \n+
    272
    \n+
    273 initializer.allocate();
    \n+
    274
    \n+
    275 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {
    \n+
    276
    \n+
    277 for (auto col=row->begin(); col != row->end(); ++col)
    \n+
    278 initializer.countEntries(row, col);
    \n+
    279 }
    \n+
    280
    \n+
    281 initializer.calcColstart();
    \n+
    282
    \n+
    283 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {
    \n+
    284 for (auto col=row->begin(); col != row->end(); ++col) {
    \n+
    285 initializer.copyValue(row, col);
    \n
    286 }
    \n-
    287 else
    \n-
    288 {
    \n-
    289 for (size_type i=0; i<A.N(); i++)
    \n-
    290 {
    \n-
    291 size_type* j = A.r[i].getindexptr();
    \n-
    292 B* a = A.r[i].getptr();
    \n-
    293 for (size_type k=0; k<A.r[i].getsize(); k++)
    \n-
    294 if (j[k]==c) {
    \n-\n-
    296 }
    \n-
    297 }
    \n-
    298 }
    \n-
    299
    \n-
    300 // not found
    \n-
    301 return 0;
    \n-
    302 }
    \n-
    \n+
    287
    \n+
    288 }
    \n+
    289 initializer.createMatrix();
    \n+
    290 }
    \n+
    291
    \n+
    292 template<class F, class M,class S>
    \n+
    293 void copyToBCCSMatrix(F& initializer, const MatrixRowSubset<M,S>& mrs)
    \n+
    294 {
    \n+
    295 typedef MatrixRowSubset<M,S> MRS;
    \n+
    296 typedef typename MRS::RowIndexSet SIS;
    \n+
    297 typedef typename SIS::const_iterator SIter;
    \n+
    298 typedef typename MRS::const_iterator Iter;
    \n+
    299 typedef typename std::iterator_traits<Iter>::value_type row_type;
    \n+
    300 typedef typename row_type::const_iterator CIter;
    \n+
    301
    \n+
    302 typedef typename MRS::Matrix::size_type size_type;
    \n
    303
    \n-
    \n-
    304 static size_type rowdim (const Matrix& A){
    \n-
    305 size_type nn=0;
    \n-
    306 for (size_type i=0; i<A.N(); i++)
    \n-
    307 nn += rowdim(A,i);
    \n-
    308 return nn;
    \n-
    309 }
    \n-
    \n-
    310
    \n-
    \n-
    311 static size_type coldim (const Matrix& A){
    \n-
    312 typedef typename Matrix::ConstRowIterator ConstRowIterator;
    \n-
    313 typedef typename Matrix::ConstColIterator ConstColIterator;
    \n-
    314
    \n-
    315 // The following code has a complexity of nnz, and
    \n-
    316 // typically a very small constant.
    \n-
    317 //
    \n-
    318 std::vector<size_type> coldims(A.M(),
    \n-
    319 std::numeric_limits<size_type>::max());
    \n-
    320
    \n-
    321 for (ConstRowIterator row=A.begin(); row!=A.end(); ++row)
    \n-
    322 for (ConstColIterator col=row->begin(); col!=row->end(); ++col)
    \n-
    323 // only compute blocksizes we don't already have
    \n-
    324 if (coldims[col.index()]==std::numeric_limits<size_type>::max())
    \n-
    325 coldims[col.index()] = MatrixDimension<block_type>::coldim(*col);
    \n+
    304 // A vector containing the corresponding indices in
    \n+
    305 // the to create submatrix.
    \n+
    306 // If an entry is the maximum of size_type then this index will not appear in
    \n+
    307 // the submatrix.
    \n+
    308 std::vector<size_type> subMatrixIndex(mrs.matrix().N(),
    \n+
    309 std::numeric_limits<size_type>::max());
    \n+
    310 size_type s=0;
    \n+
    311 for(SIter index = mrs.rowIndexSet().begin(); index!=mrs.rowIndexSet().end(); ++index)
    \n+
    312 subMatrixIndex[*index]=s++;
    \n+
    313
    \n+
    314 // Calculate upper Bound for nonzeros
    \n+
    315 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
    \n+
    316 initializer.addRowNnz(row, subMatrixIndex);
    \n+
    317
    \n+
    318 initializer.allocate();
    \n+
    319
    \n+
    320 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
    \n+
    321 for(CIter col=row->begin(); col != row->end(); ++col) {
    \n+
    322 if(subMatrixIndex[col.index()]!=std::numeric_limits<size_type>::max())
    \n+
    323 // This column is in our subset (use submatrix column index)
    \n+
    324 initializer.countEntries(subMatrixIndex[col.index()]);
    \n+
    325 }
    \n
    326
    \n-
    327 size_type sum = 0;
    \n-
    328 for (typename std::vector<size_type>::iterator it=coldims.begin();
    \n-
    329 it!=coldims.end(); ++it)
    \n-
    330 // skip rows for which no coldim could be determined
    \n-
    331 if ((*it)>=0)
    \n-
    332 sum += *it;
    \n-
    333
    \n-
    334 return sum;
    \n-
    335 }
    \n-
    \n-
    336 };
    \n-
    \n+
    327 initializer.calcColstart();
    \n+
    328
    \n+
    329 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
    \n+
    330 for(CIter col=row->begin(); col != row->end(); ++col) {
    \n+
    331 if(subMatrixIndex[col.index()]!=std::numeric_limits<size_type>::max())
    \n+
    332 // This value is in our submatrix -> copy (use submatrix indices
    \n+
    333 initializer.copyValue(col, subMatrixIndex[row.index()], subMatrixIndex[col.index()]);
    \n+
    334 }
    \n+
    335 initializer.createMatrix();
    \n+
    336 }
    \n
    337
    \n-
    338
    \n-
    339 template<typename B, int n, int m, typename TA>
    \n-
    \n-\n-
    341 {
    \n-\n-
    343 typedef typename Matrix::size_type size_type;
    \n-
    344
    \n-
    \n-
    345 static size_type rowdim (const Matrix& /*A*/, size_type /*i*/)
    \n-
    346 {
    \n-
    347 return n;
    \n-
    348 }
    \n-
    \n-
    349
    \n-
    \n-
    350 static size_type coldim (const Matrix& /*A*/, size_type /*c*/)
    \n-
    351 {
    \n-
    352 return m;
    \n-
    353 }
    \n-
    \n-
    354
    \n-
    \n-
    355 static size_type rowdim (const Matrix& A) {
    \n-
    356 return A.N()*n;
    \n-
    357 }
    \n-
    \n-
    358
    \n-
    \n-
    359 static size_type coldim (const Matrix& A) {
    \n-
    360 return A.M()*m;
    \n-
    361 }
    \n-
    \n-
    362 };
    \n-
    \n-
    363
    \n-
    364 template<typename K, int n, int m>
    \n-
    \n-\n-
    366 {
    \n-\n-
    368 typedef typename Matrix::size_type size_type;
    \n-
    369
    \n-
    \n-
    370 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
    \n-
    371 {
    \n-
    372 return 1;
    \n-
    373 }
    \n-
    \n-
    374
    \n-
    \n-
    375 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
    \n-
    376 {
    \n-
    377 return 1;
    \n-
    378 }
    \n-
    \n-
    379
    \n-
    \n-
    380 static size_type rowdim(const Matrix& /*A*/)
    \n-
    381 {
    \n-
    382 return n;
    \n-
    383 }
    \n-
    \n-
    384
    \n-
    \n-
    385 static size_type coldim(const Matrix& /*A*/)
    \n-
    386 {
    \n-
    387 return m;
    \n-
    388 }
    \n-
    \n-
    389 };
    \n-
    \n-
    390
    \n-
    391 template <class T>
    \n-
    \n-
    392 struct MatrixDimension<Dune::DynamicMatrix<T> >
    \n-
    393 {
    \n-
    394 typedef Dune::DynamicMatrix<T> MatrixType;
    \n-
    395 typedef typename MatrixType::size_type size_type;
    \n-
    396
    \n-
    \n-
    397 static size_type rowdim(const MatrixType& /*A*/, size_type /*r*/)
    \n-
    398 {
    \n-
    399 return 1;
    \n-
    400 }
    \n-
    \n-
    401
    \n-
    \n-
    402 static size_type coldim(const MatrixType& /*A*/, size_type /*r*/)
    \n-
    403 {
    \n-
    404 return 1;
    \n-
    405 }
    \n-
    \n-
    406
    \n-
    \n-
    407 static size_type rowdim(const MatrixType& A)
    \n-
    408 {
    \n-
    409 return A.N();
    \n-
    410 }
    \n-
    \n-
    411
    \n-
    \n-
    412 static size_type coldim(const MatrixType& A)
    \n-
    413 {
    \n-
    414 return A.M();
    \n-
    415 }
    \n-
    \n-
    416 };
    \n-
    \n-
    417
    \n-
    418 template<typename K, int n, int m, typename TA>
    \n-
    \n-
    419 struct MatrixDimension<Matrix<FieldMatrix<K,n,m>, TA> >
    \n-
    420 {
    \n-\n-\n-
    423
    \n-
    \n-
    424 static size_type rowdim(const ThisMatrix& /*A*/, size_type /*r*/)
    \n-
    425 {
    \n-
    426 return n;
    \n-
    427 }
    \n-
    \n-
    428
    \n-
    \n-
    429 static size_type coldim(const ThisMatrix& /*A*/, size_type /*r*/)
    \n-
    430 {
    \n-
    431 return m;
    \n-
    432 }
    \n-
    \n-
    433
    \n-
    \n-
    434 static size_type rowdim(const ThisMatrix& A)
    \n-
    435 {
    \n-
    436 return A.N()*n;
    \n-
    437 }
    \n-
    \n-
    438
    \n-
    \n-
    439 static size_type coldim(const ThisMatrix& A)
    \n-
    440 {
    \n-
    441 return A.M()*m;
    \n-
    442 }
    \n-
    \n-
    443 };
    \n-
    \n-
    444
    \n-
    445 template<typename K, int n>
    \n-
    \n-
    446 struct MatrixDimension<DiagonalMatrix<K,n> >
    \n-
    447 {
    \n-
    448 typedef DiagonalMatrix<K,n> Matrix;
    \n-
    449 typedef typename Matrix::size_type size_type;
    \n-
    450
    \n-
    \n-
    451 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
    \n-
    452 {
    \n-
    453 return 1;
    \n-
    454 }
    \n-
    \n-
    455
    \n-
    \n-
    456 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
    \n-
    457 {
    \n-
    458 return 1;
    \n-
    459 }
    \n-
    \n-
    460
    \n-
    \n-
    461 static size_type rowdim(const Matrix& /*A*/)
    \n-
    462 {
    \n-
    463 return n;
    \n-
    464 }
    \n-
    \n-
    465
    \n-
    \n-
    466 static size_type coldim(const Matrix& /*A*/)
    \n-
    467 {
    \n-
    468 return n;
    \n-
    469 }
    \n-
    \n-
    470 };
    \n-
    \n-
    471
    \n-
    472 template<typename K, int n>
    \n-
    \n-\n-
    474 {
    \n-\n-
    476 typedef typename Matrix::size_type size_type;
    \n-
    477
    \n-
    \n-
    478 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
    \n-
    479 {
    \n-
    480 return 1;
    \n-
    481 }
    \n-
    \n-
    482
    \n-
    \n-
    483 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
    \n-
    484 {
    \n-
    485 return 1;
    \n-
    486 }
    \n-
    \n-
    487
    \n-
    \n-
    488 static size_type rowdim(const Matrix& /*A*/)
    \n-
    489 {
    \n-
    490 return n;
    \n-
    491 }
    \n-
    \n-
    492
    \n-
    \n-
    493 static size_type coldim(const Matrix& /*A*/)
    \n-
    494 {
    \n-
    495 return n;
    \n-
    496 }
    \n-
    \n-
    497 };
    \n-
    \n-
    498
    \n-
    502 template<typename T>
    \n-
    \n-
    503 struct IsMatrix
    \n-
    504 {
    \n-
    505 enum {
    \n-
    509 value = false
    \n-
    510 };
    \n-
    511 };
    \n-
    \n-
    512
    \n-
    513 template<typename T>
    \n-
    \n-
    514 struct IsMatrix<DenseMatrix<T> >
    \n-
    515 {
    \n-
    516 enum {
    \n-
    520 value = true
    \n-
    521 };
    \n-
    522 };
    \n-
    \n-
    523
    \n-
    524
    \n-
    525 template<typename T, typename A>
    \n-
    \n-
    526 struct IsMatrix<BCRSMatrix<T,A> >
    \n-
    527 {
    \n-
    528 enum {
    \n-
    532 value = true
    \n-
    533 };
    \n-
    534 };
    \n-
    \n-
    535
    \n-
    536 template<typename T>
    \n-
    \n-\n-
    538 {
    \n-
    \n-
    539 bool operator()(const T* l, const T* r)
    \n-
    540 {
    \n-
    541 return *l < *r;
    \n-
    542 }
    \n-
    \n-
    543 };
    \n-
    \n-
    544
    \n-
    545}
    \n-
    546#endif
    \n-\n-
    This file implements a quadratic matrix of fixed size which is a multiple of the identity.
    \n+
    338}
    \n+
    339#endif
    \n+\n
    Col col
    Definition matrixmatrix.hh:351
    \n
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n-
    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
    \n+
    std::size_t countEntries(const BlockVector< T, A > &vector)
    Definition matrixmarket.hh:1076
    \n
    Definition allocator.hh:11
    \n-
    void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)
    Definition matrixutils.hh:154
    \n-
    Definition matrixutils.hh:211
    \n-
    static auto coldim(const M &A)
    Definition matrixutils.hh:219
    \n-
    static auto rowdim(const M &A)
    Definition matrixutils.hh:214
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n-
    row_type::ConstIterator ConstColIterator
    Const iterator to the entries of a row.
    Definition bcrsmatrix.hh:737
    \n-
    B block_type
    export the type representing the components
    Definition bcrsmatrix.hh:491
    \n-
    Iterator access to matrix rows
    Definition bcrsmatrix.hh:575
    \n-
    A Matrix class to support different block types.
    Definition multitypeblockmatrix.hh:46
    \n-
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    ConstIterator class for sequential access.
    Definition matrix.hh:404
    \n-
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    Initializer for SuperLU Matrices representing the subdomains.
    Definition overlappingschwarz.hh:47
    \n
    A::size_type size_type
    Type for indices and sizes.
    Definition matrix.hh:577
    \n-
    RowIterator end()
    Get iterator to one beyond last row.
    Definition matrix.hh:616
    \n-
    RowIterator begin()
    Get iterator to first row.
    Definition matrix.hh:610
    \n-
    row_type::const_iterator ConstColIterator
    Const iterator for the entries of each row.
    Definition matrix.hh:589
    \n-
    T block_type
    Export the type representing the components.
    Definition matrix.hh:568
    \n-
    Definition matrixutils.hh:27
    \n-
    Check whether the a matrix has diagonal values on blocklevel recursion levels.
    Definition matrixutils.hh:48
    \n-
    static void check(const Matrix &mat)
    Check whether the a matrix has diagonal values on blocklevel recursion levels.
    Definition matrixutils.hh:53
    \n-
    static void check(const Matrix &mat)
    Definition matrixutils.hh:75
    \n-
    static void check(const Matrix &)
    Check whether the a matrix has diagonal values on blocklevel recursion levels.
    Definition matrixutils.hh:99
    \n-
    MultiTypeBlockMatrix< T1, Args... > Matrix
    Definition matrixutils.hh:93
    \n-
    static size_type rowdim(const Matrix< B, TA > &A, size_type i)
    Definition matrixutils.hh:232
    \n-
    static size_type coldim(const Matrix< B, TA > &A)
    Definition matrixutils.hh:250
    \n-
    static size_type rowdim(const Matrix< B, TA > &A)
    Definition matrixutils.hh:242
    \n-
    typename Matrix< B, TA >::size_type size_type
    Definition matrixutils.hh:230
    \n-
    static size_type coldim(const Matrix< B, TA > &A, size_type c)
    Definition matrixutils.hh:237
    \n-
    typename Matrix< B, TA >::block_type block_type
    Definition matrixutils.hh:229
    \n-
    BCRSMatrix< B, TA > Matrix
    Definition matrixutils.hh:263
    \n-
    static size_type coldim(const Matrix &A)
    Definition matrixutils.hh:311
    \n-
    Matrix::block_type block_type
    Definition matrixutils.hh:264
    \n-
    static size_type coldim(const Matrix &A, size_type c)
    Definition matrixutils.hh:276
    \n-
    Matrix::size_type size_type
    Definition matrixutils.hh:265
    \n-
    static size_type rowdim(const Matrix &A, size_type i)
    Definition matrixutils.hh:267
    \n-
    static size_type rowdim(const Matrix &A)
    Definition matrixutils.hh:304
    \n-
    static size_type coldim(const Matrix &A)
    Definition matrixutils.hh:359
    \n-
    static size_type rowdim(const Matrix &, size_type)
    Definition matrixutils.hh:345
    \n-
    static size_type rowdim(const Matrix &A)
    Definition matrixutils.hh:355
    \n-
    Matrix::size_type size_type
    Definition matrixutils.hh:343
    \n-
    BCRSMatrix< FieldMatrix< B, n, m >,TA > Matrix
    Definition matrixutils.hh:342
    \n-
    static size_type coldim(const Matrix &, size_type)
    Definition matrixutils.hh:350
    \n-
    static size_type rowdim(const Matrix &, size_type)
    Definition matrixutils.hh:370
    \n-
    static size_type coldim(const Matrix &)
    Definition matrixutils.hh:385
    \n-
    Matrix::size_type size_type
    Definition matrixutils.hh:368
    \n-
    FieldMatrix< K, n, m > Matrix
    Definition matrixutils.hh:367
    \n-
    static size_type coldim(const Matrix &, size_type)
    Definition matrixutils.hh:375
    \n-
    static size_type rowdim(const Matrix &)
    Definition matrixutils.hh:380
    \n-
    static size_type coldim(const MatrixType &A)
    Definition matrixutils.hh:412
    \n-
    static size_type rowdim(const MatrixType &A)
    Definition matrixutils.hh:407
    \n-
    static size_type rowdim(const MatrixType &, size_type)
    Definition matrixutils.hh:397
    \n-
    MatrixType::size_type size_type
    Definition matrixutils.hh:395
    \n-
    static size_type coldim(const MatrixType &, size_type)
    Definition matrixutils.hh:402
    \n-
    Dune::DynamicMatrix< T > MatrixType
    Definition matrixutils.hh:394
    \n-
    static size_type coldim(const ThisMatrix &A)
    Definition matrixutils.hh:439
    \n-
    static size_type rowdim(const ThisMatrix &A)
    Definition matrixutils.hh:434
    \n-
    Matrix< FieldMatrix< K, n, m >, TA > ThisMatrix
    Definition matrixutils.hh:421
    \n-
    static size_type coldim(const ThisMatrix &, size_type)
    Definition matrixutils.hh:429
    \n-
    static size_type rowdim(const ThisMatrix &, size_type)
    Definition matrixutils.hh:424
    \n-
    ThisMatrix::size_type size_type
    Definition matrixutils.hh:422
    \n-
    static size_type coldim(const Matrix &, size_type)
    Definition matrixutils.hh:456
    \n-
    Matrix::size_type size_type
    Definition matrixutils.hh:449
    \n-
    static size_type coldim(const Matrix &)
    Definition matrixutils.hh:466
    \n-
    static size_type rowdim(const Matrix &)
    Definition matrixutils.hh:461
    \n-
    DiagonalMatrix< K, n > Matrix
    Definition matrixutils.hh:448
    \n-
    static size_type rowdim(const Matrix &, size_type)
    Definition matrixutils.hh:451
    \n-
    static size_type coldim(const Matrix &)
    Definition matrixutils.hh:493
    \n-
    static size_type rowdim(const Matrix &, size_type)
    Definition matrixutils.hh:478
    \n-
    static size_type coldim(const Matrix &, size_type)
    Definition matrixutils.hh:483
    \n-
    Matrix::size_type size_type
    Definition matrixutils.hh:476
    \n-
    ScaledIdentityMatrix< K, n > Matrix
    Definition matrixutils.hh:475
    \n-
    static size_type rowdim(const Matrix &)
    Definition matrixutils.hh:488
    \n-
    Test whether a type is an ISTL Matrix.
    Definition matrixutils.hh:504
    \n-
    @ value
    True if T is an ISTL matrix.
    Definition matrixutils.hh:509
    \n-
    Definition matrixutils.hh:538
    \n-
    bool operator()(const T *l, const T *r)
    Definition matrixutils.hh:539
    \n-
    A multiple of the identity matrix of static size.
    Definition scaledidmatrix.hh:30
    \n-
    std::size_t size_type
    The type used for the index access and size operations.
    Definition scaledidmatrix.hh:43
    \n+
    MatrixImp::DenseMatrixBase< T, A >::window_type row_type
    The type implementing a matrix row.
    Definition matrix.hh:574
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,782 +1,353 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-matrixutils.hh\n+bccsmatrixinitializer.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_MATRIXUTILS_HH\n-6#define DUNE_ISTL_MATRIXUTILS_HH\n+5#ifndef DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH\n+6#define DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH\n 7\n-8#include \n-9#include \n-10#include \n+8#include \n+9#include \n+10\n 11#include \n-12#include \n-13#include \n-14#include \n-15#include \n-16#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-17#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-18\n-19namespace _\bD_\bu_\bn_\be\n-20{\n+12#include \n+13\n+14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+15\n+16namespace _\bD_\bu_\bn_\be\n+17{\n+18 template\n+19 class OverlappingSchwarzInitializer;\n+20}\n 21\n-22#ifndef DOYXGEN\n-23 template\n-24 class BCRSMatrix;\n-25\n-26 template\n-_\b2_\b7 class _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx;\n-28\n-29 template\n-30 class _\bM_\ba_\bt_\br_\bi_\bx;\n-31#endif\n-32\n-46 template\n-_\b4_\b7 struct _\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt\n-48 {\n-_\b5_\b3 static void _\bc_\bh_\be_\bc_\bk([[maybe_unused]] const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt)\n-54 {\n-55#ifdef DUNE_ISTL_WITH_CHECKING\n-56 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Row;\n-57 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Entry;\n-58 for(Row row = _\bm_\ba_\bt.begin(); row!=_\bm_\ba_\bt.end(); ++row) {\n-59 Entry diagonal = row->find(row.index());\n-60 if(diagonal==row->end())\n-61 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Missing diagonal value in row \"<_\b:_\b:_\bc_\bh_\be_\bc_\bk(m);\n-66 }\n-67 }\n-68#endif\n-69 }\n-70 };\n-71\n-72 template\n-_\b7_\b3 struct _\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt<_\bM_\ba_\bt_\br_\bi_\bx,0,l>\n-74 {\n-_\b7_\b5 static void _\bc_\bh_\be_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt)\n-76 {\n-77 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Row;\n-78 for(Row row = _\bm_\ba_\bt.begin(); row!=_\bm_\ba_\bt.end(); ++row) {\n-79 if(row->find(row.index())==row->end())\n-80 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Missing diagonal value in row \"<\n-87 class MultiTypeBlockMatrix;\n-88\n-89 template\n-_\b9_\b0 struct _\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx,\n-91 blocklevel,l>\n-92 {\n-_\b9_\b3 typedef _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx _\bM_\ba_\bt_\br_\bi_\bx;\n-94\n-_\b9_\b9 static void _\bc_\bh_\be_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& /* mat */)\n-100 {\n-101#ifdef DUNE_ISTL_WITH_CHECKING\n-102 // TODO Implement check\n-103#endif\n-104 }\n-105 };\n-106\n-118 template\n-_\b1_\b1_\b9 inline auto _\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs(const M&,\n-120 [[maybe_unused]] typename std::enable_if_t::value>*\n-sfinae = nullptr)\n-121 {\n-122 return 1;\n-123 }\n-124\n-125 template\n-_\b1_\b2_\b6 inline auto _\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs(const M& matrix,\n-127 [[maybe_unused]] typename std::enable_if_t::value>*\n-sfinae = nullptr)\n-128 {\n-129 typename M::size_type nonZeros = 0;\n-130 for(auto&& row : matrix)\n-131 for(auto&& entry : row)\n-132 nonZeros += _\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs(entry);\n-133 return nonZeros;\n-134 }\n-135\n-136 /*\n-137 template\n-138 struct ProcessOnFieldsOfMatrix\n-139 */\n-140\n-142 namespace\n-143 {\n-144 struct CompPair {\n-145 template\n-146 bool operator()(const std::pair& p1, const std::pair& p2) const\n-147 {\n-148 return p1.first\n+32 class MatrixRowSubset\n+33 {\n+34 public:\n+36 typedef M Matrix;\n+38 typedef S RowIndexSet;\n+39\n+45 MatrixRowSubset(const Matrix& m, const RowIndexSet& s)\n+46 : m_(m), s_(s)\n+47 {}\n+48\n+49 const Matrix& matrix() const\n+50 {\n+51 return m_;\n+52 }\n+53\n+54 const RowIndexSet& rowIndexSet() const\n+55 {\n+56 return s_;\n+57 }\n+58\n+60 class const_iterator\n+61 : public ForwardIteratorFacade\n+62 {\n+63 public:\n+64 const_iterator(typename Matrix::const_iterator firstRow,\n+65 typename RowIndexSet::const_iterator pos)\n+66 : firstRow_(firstRow), pos_(pos)\n+67 {}\n+68\n+69\n+70 const typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be& dereference() const\n+71 {\n+72 return *(firstRow_+ *pos_);\n+73 }\n+74 bool equals(const const_iterator& o) const\n+75 {\n+76 return pos_==o.pos_;\n+77 }\n+78 void increment()\n+79 {\n+80 ++pos_;\n+81 }\n+82 typename RowIndexSet::value_type index() const\n+83 {\n+84 return *pos_;\n+85 }\n+86\n+87 private:\n+89 typename Matrix::const_iterator firstRow_;\n+91 typename RowIndexSet::const_iterator pos_;\n+92 };\n+93\n+95 const_iterator begin() const\n+96 {\n+97 return const_iterator(m_.begin(), s_.begin());\n+98 }\n+100 const_iterator end() const\n+101 {\n+102 return const_iterator(m_.begin(), s_.end());\n+103 }\n+104\n+105 private:\n+107 const Matrix& m_;\n+109 const RowIndexSet& s_;\n+110 };\n+111\n+118 template\n+119 class BCCSMatrixInitializer\n+120 {\n+121 template\n+122 friend class _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n+123 public:\n+124 using Matrix = M;\n+125 using Index = I;\n+126 typedef Dune::ISTL::Impl::BCCSMatrix\n+OutputMatrix;\n+127 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size_type;\n+128\n+131 BCCSMatrixInitializer(OutputMatrix& mat_)\n+132 : _\bm_\ba_\bt(&mat_), cols(mat_.M())\n+133 {\n+134 if constexpr (Dune::IsNumber::value)\n+135 {\n+136 n = m = 1;\n+137 }\n+138 else\n+139 {\n+140 // WARNING: This assumes that all blocks are dense and identical\n+141 n = M::block_type::rows;\n+142 m = M::block_type::cols;\n+143 }\n+144\n+145 _\bm_\ba_\bt->Nnz_=0;\n+146 }\n+147\n+148 BCCSMatrixInitializer()\n+149 : _\bm_\ba_\bt(0), cols(0), n(0), m(0)\n+150 {}\n 151\n-152 }\n-153 template\n-_\b1_\b5_\b4 void _\bp_\br_\bi_\bn_\bt_\bG_\bl_\bo_\bb_\ba_\bl_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx(const M& _\bm_\ba_\bt, C& ooc, std::ostream& os)\n-155 {\n-156 typedef typename C::ParallelIndexSet::const_iterator IIter;\n-157 typedef typename C::OwnerSet OwnerSet;\n-158 typedef typename C::ParallelIndexSet::GlobalIndex GlobalIndex;\n-159\n-160 GlobalIndex gmax=0;\n-161\n-162 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();\n-163 idx!=eidx; ++idx)\n-164 gmax=std::max(gmax,idx->global());\n-165\n-166 gmax=ooc.communicator().max(gmax);\n-167 ooc.buildGlobalLookup();\n-168\n-169 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();\n-170 idx!=eidx; ++idx) {\n-171 if(OwnerSet::contains(idx->local().attribute()))\n-172 {\n-173 typedef typename M::block_type Block;\n-174\n-175 std::set,CompPair> entries;\n-176\n-177 // sort rows\n-178 typedef typename M::ConstColIterator CIter;\n-179 for(CIter c=_\bm_\ba_\bt[idx->local()]._\bb_\be_\bg_\bi_\bn(), cend=_\bm_\ba_\bt[idx->local()]._\be_\bn_\bd();\n-180 c!=cend; ++c) {\n-181 const typename C::ParallelIndexSet::IndexPair* pair\n-182 =ooc.globalLookup().pair(c.index());\n-183 assert(pair);\n-184 entries.insert(std::make_pair(pair->global(), *c));\n-185 }\n-186\n-187 //wait until its the rows turn.\n-188 GlobalIndex rowidx = idx->global();\n-189 GlobalIndex cur=std::numeric_limits::max();\n-190 while(cur!=rowidx)\n-191 cur=ooc.communicator().min(rowidx);\n-192\n-193 // print rows\n-194 typedef typename std::set,CompPair>::iterator\n-SIter;\n-195 for(SIter s=entries.begin(), send=entries.end(); s!=send; ++s)\n-196 os<global()<<\" \"<first<<\" \"<second<::max();\n-205 while(cur!=ooc.communicator().min(cur)) ;\n-206 }\n-207\n-208 // Default implementation for scalar types\n-209 template\n-_\b2_\b1_\b0 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n-211 {\n-212 static_assert(IsNumber::value, \"MatrixDimension is not implemented for\n-this type!\");\n-213\n-_\b2_\b1_\b4 static auto _\br_\bo_\bw_\bd_\bi_\bm(const M& A)\n-215 {\n-216 return 1;\n-217 }\n-218\n-_\b2_\b1_\b9 static auto _\bc_\bo_\bl_\bd_\bi_\bm(const M& A)\n-220 {\n-221 return 1;\n-222 }\n-223 };\n-224\n-225 // Default implementation for scalar types\n-226 template\n-_\b2_\b2_\b7 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bM_\ba_\bt_\br_\bi_\bx >\n-228 {\n-_\b2_\b2_\b9 using _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be = typename _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-_\b2_\b3_\b0 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = typename _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-231\n-_\b2_\b3_\b2 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>& A, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-233 {\n-234 return _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(A[i][0]);\n-235 }\n-236\n-_\b2_\b3_\b7 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>& A, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be c)\n-238 {\n-239 return _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(A[0][c]);\n-240 }\n+152 virtual ~BCCSMatrixInitializer()\n+153 {}\n+154\n+155 template\n+156 void addRowNnz(const Iter& row) const\n+157 {\n+158 _\bm_\ba_\bt->Nnz_+=row->getsize();\n+159 }\n+160\n+161 template\n+162 void addRowNnz(const Iter& row, const std::set& indices)\n+const\n+163 {\n+164 auto siter =indices.begin();\n+165 for (auto entry=row->begin(); entry!=row->end(); ++entry)\n+166 {\n+167 for(; siter!=indices.end() && *siterNnz_;\n+173 }\n+174 }\n+175\n+176 template\n+177 void addRowNnz(const Iter& row, const std::vector& indices)\n+const\n+178 {\n+179 for (auto entry=row->begin(); entry!=row->end(); ++entry)\n+180 if (indices[entry.index()]!=std::numeric_limits::max())\n+181 ++_\bm_\ba_\bt->Nnz_;\n+182 }\n+183\n+184 void allocate()\n+185 {\n+186 allocateMatrixStorage();\n+187 allocateMarker();\n+188 }\n+189\n+190 template\n+191 void _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs([[maybe_unused]] const Iter& row, const CIter& _\bc_\bo_\bl) const\n+192 {\n+193 _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(_\bc_\bo_\bl.index());\n+194 }\n+195\n+196 void _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(size_type colindex) const\n+197 {\n+198 for(size_type i=0; i < m; ++i)\n+199 {\n+200 assert(colindex*m+icolstart[0]=0;\n+208 for(size_type i=0; i < cols; ++i) {\n+209 assert(icolstart[i+1]=_\bm_\ba_\bt->colstart[i]+marker[i];\n+211 marker[i]=_\bm_\ba_\bt->colstart[i];\n+212 }\n+213 }\n+214\n+215 template\n+216 void copyValue(const Iter& row, const CIter& _\bc_\bo_\bl) const\n+217 {\n+218 copyValue(_\bc_\bo_\bl, row.index(), _\bc_\bo_\bl.index());\n+219 }\n+220\n+221 template\n+222 void copyValue(const CIter& _\bc_\bo_\bl, size_type rowindex, size_type colindex)\n+const\n+223 {\n+224 for(size_type i=0; icolstart[colindex*m+j+1]);\n+227 assert((size_type)marker[colindex*m+j]<_\bm_\ba_\bt->Nnz_);\n+228 _\bm_\ba_\bt->rowindex[marker[colindex*m+j]]=rowindex*n+i;\n+229 _\bm_\ba_\bt->values[marker[colindex*m+j]] = Dune::Impl::asMatrix(*_\bc_\bo_\bl)[i][j];\n+230 ++marker[colindex*m+j]; // index for next entry in column\n+231 }\n+232 }\n+233 }\n+234\n+235 virtual void createMatrix() const\n+236 {\n+237 marker.clear();\n+238 }\n+239\n+240 protected:\n 241\n-_\b2_\b4_\b2 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>& A)\n+242 void allocateMatrixStorage() const\n 243 {\n-244 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nn=0;\n-245 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i& A)\n-251 {\n-252 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nn=0;\n-253 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; iNnz_*=n*m;\n+245 // initialize data\n+246 _\bm_\ba_\bt->values=new typename M::field_type[_\bm_\ba_\bt->Nnz_];\n+247 _\bm_\ba_\bt->rowindex=new I[_\bm_\ba_\bt->Nnz_];\n+248 _\bm_\ba_\bt->colstart=new I[cols+1];\n+249 }\n+250\n+251 void allocateMarker()\n+252 {\n+253 marker.resize(cols);\n+254 std::fill(marker.begin(), marker.end(), 0);\n+255 }\n+256\n+257 OutputMatrix* _\bm_\ba_\bt;\n+258 size_type cols;\n 259\n-260 template\n-_\b2_\b6_\b1 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n-262 {\n-_\b2_\b6_\b3 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b2_\b6_\b4 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-_\b2_\b6_\b5 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+260 // Number of rows/columns of the matrix entries\n+261 // (assumed to be scalars or dense matrices)\n+262 size_type n, m;\n+263\n+264 mutable std::vector marker;\n+265 };\n 266\n-_\b2_\b6_\b7 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& A, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-268 {\n-269 const B* row = A.r[i].getptr();\n-270 if(row)\n-271 return _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(*row);\n-272 else\n-273 return 0;\n-274 }\n-275\n-_\b2_\b7_\b6 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& A, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be c)\n-277 {\n-278 // find an entry in column c\n-279 if (A.nnz_ > 0)\n-280 {\n-281 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be k=0; k_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(A.a[k]);\n-284 }\n-285 }\n+267 template\n+268 void copyToBCCSMatrix(F& initializer, const Matrix& matrix)\n+269 {\n+270 for (auto row=matrix.begin(); row!= matrix.end(); ++row)\n+271 initializer.addRowNnz(row);\n+272\n+273 initializer.allocate();\n+274\n+275 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {\n+276\n+277 for (auto _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl)\n+278 initializer.countEntries(row, _\bc_\bo_\bl);\n+279 }\n+280\n+281 initializer.calcColstart();\n+282\n+283 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {\n+284 for (auto _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl) {\n+285 initializer.copyValue(row, _\bc_\bo_\bl);\n 286 }\n-287 else\n-288 {\n-289 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(a[k]);\n-296 }\n-297 }\n-298 }\n-299\n-300 // not found\n-301 return 0;\n-302 }\n+287\n+288 }\n+289 initializer.createMatrix();\n+290 }\n+291\n+292 template\n+293 void copyToBCCSMatrix(F& initializer, const MatrixRowSubset& mrs)\n+294 {\n+295 typedef MatrixRowSubset MRS;\n+296 typedef typename MRS::RowIndexSet SIS;\n+297 typedef typename SIS::const_iterator SIter;\n+298 typedef typename MRS::const_iterator Iter;\n+299 typedef typename std::iterator_traits::value_type row_type;\n+300 typedef typename row_type::const_iterator CIter;\n+301\n+302 typedef typename MRS::Matrix::size_type size_type;\n 303\n-_\b3_\b0_\b4 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& A){\n-305 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nn=0;\n-306 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i coldims(A.M(),\n-319 std::numeric_limits::max());\n-320\n-321 for (ConstRowIterator row=A.begin(); row!=A.end(); ++row)\n-322 for (ConstColIterator _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl!=row->end(); ++_\bc_\bo_\bl)\n-323 // only compute blocksizes we don't already have\n-324 if (coldims[_\bc_\bo_\bl.index()]==std::numeric_limits::max())\n-325 coldims[_\bc_\bo_\bl.index()] = _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(*_\bc_\bo_\bl);\n+304 // A vector containing the corresponding indices in\n+305 // the to create submatrix.\n+306 // If an entry is the maximum of size_type then this index will not appear\n+in\n+307 // the submatrix.\n+308 std::vector subMatrixIndex(mrs.matrix().N(),\n+309 std::numeric_limits::max());\n+310 size_type s=0;\n+311 for(SIter index = mrs.rowIndexSet().begin(); index!=mrs.rowIndexSet().end\n+(); ++index)\n+312 subMatrixIndex[*index]=s++;\n+313\n+314 // Calculate upper Bound for nonzeros\n+315 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)\n+316 initializer.addRowNnz(row, subMatrixIndex);\n+317\n+318 initializer.allocate();\n+319\n+320 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)\n+321 for(CIter _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl) {\n+322 if(subMatrixIndex[_\bc_\bo_\bl.index()]!=std::numeric_limits::max())\n+323 // This column is in our subset (use submatrix column index)\n+324 initializer.countEntries(subMatrixIndex[_\bc_\bo_\bl.index()]);\n+325 }\n 326\n-327 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be sum = 0;\n-328 for (typename std::vector::iterator it=coldims.begin();\n-329 it!=coldims.end(); ++it)\n-330 // skip rows for which no coldim could be determined\n-331 if ((*it)>=0)\n-332 sum += *it;\n-333\n-334 return sum;\n-335 }\n-336 };\n+327 initializer.calcColstart();\n+328\n+329 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)\n+330 for(CIter _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl) {\n+331 if(subMatrixIndex[_\bc_\bo_\bl.index()]!=std::numeric_limits::max())\n+332 // This value is in our submatrix -> copy (use submatrix indices\n+333 initializer.copyValue(_\bc_\bo_\bl, subMatrixIndex[row.index()], subMatrixIndex\n+[_\bc_\bo_\bl.index()]);\n+334 }\n+335 initializer.createMatrix();\n+336 }\n 337\n-338\n-339 template\n-_\b3_\b4_\b0 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx ,TA> >\n-341 {\n-_\b3_\b4_\b2 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bn_\b,_\bm_\b> ,TA> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b3_\b4_\b3 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-344\n-_\b3_\b4_\b5 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*i*/)\n-346 {\n-347 return n;\n-348 }\n-349\n-_\b3_\b5_\b0 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*c*/)\n-351 {\n-352 return m;\n-353 }\n-354\n-_\b3_\b5_\b5 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& A) {\n-356 return A.N()*n;\n-357 }\n-358\n-_\b3_\b5_\b9 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& A) {\n-360 return A.M()*m;\n-361 }\n-362 };\n-363\n-364 template\n-_\b3_\b6_\b5 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n-366 {\n-_\b3_\b6_\b7 typedef _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b,_\bm_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b3_\b6_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-369\n-_\b3_\b7_\b0 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n-371 {\n-372 return 1;\n-373 }\n-374\n-_\b3_\b7_\b5 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n-376 {\n-377 return 1;\n-378 }\n-379\n-_\b3_\b8_\b0 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n-381 {\n-382 return n;\n-383 }\n-384\n-_\b3_\b8_\b5 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n-386 {\n-387 return m;\n-388 }\n-389 };\n-390\n-391 template \n-_\b3_\b9_\b2 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bD_\bu_\bn_\be::DynamicMatrix >\n-393 {\n-_\b3_\b9_\b4 typedef Dune::DynamicMatrix _\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be;\n-_\b3_\b9_\b5 typedef typename MatrixType::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-396\n-_\b3_\b9_\b7 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n-398 {\n-399 return 1;\n-400 }\n-401\n-_\b4_\b0_\b2 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n-403 {\n-404 return 1;\n-405 }\n-406\n-_\b4_\b0_\b7 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be& A)\n-408 {\n-409 return A.N();\n-410 }\n-411\n-_\b4_\b1_\b2 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be& A)\n-413 {\n-414 return A.M();\n-415 }\n-416 };\n-417\n-418 template\n-_\b4_\b1_\b9 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx, TA> >\n-420 {\n-_\b4_\b2_\b1 typedef _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b,_\bm_\b>, TA> _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx;\n-_\b4_\b2_\b2 typedef typename _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-423\n-_\b4_\b2_\b4 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n-425 {\n-426 return n;\n-427 }\n-428\n-_\b4_\b2_\b9 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n-430 {\n-431 return m;\n-432 }\n-433\n-_\b4_\b3_\b4 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx& A)\n-435 {\n-436 return A.N()*n;\n-437 }\n-438\n-_\b4_\b3_\b9 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx& A)\n-440 {\n-441 return A.M()*m;\n-442 }\n-443 };\n-444\n-445 template\n-_\b4_\b4_\b6 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn >\n-447 {\n-_\b4_\b4_\b8 typedef DiagonalMatrix _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b4_\b4_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-450\n-_\b4_\b5_\b1 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n-452 {\n-453 return 1;\n-454 }\n-455\n-_\b4_\b5_\b6 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n-457 {\n-458 return 1;\n-459 }\n-460\n-_\b4_\b6_\b1 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n-462 {\n-463 return n;\n-464 }\n-465\n-_\b4_\b6_\b6 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n-467 {\n-468 return n;\n-469 }\n-470 };\n-471\n-472 template\n-_\b4_\b7_\b3 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx >\n-474 {\n-_\b4_\b7_\b5 typedef _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b4_\b7_\b6 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-477\n-_\b4_\b7_\b8 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n-479 {\n-480 return 1;\n-481 }\n-482\n-_\b4_\b8_\b3 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n-484 {\n-485 return 1;\n-486 }\n-487\n-_\b4_\b8_\b8 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n-489 {\n-490 return n;\n-491 }\n-492\n-_\b4_\b9_\b3 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n-494 {\n-495 return n;\n-496 }\n-497 };\n-498\n-502 template\n-_\b5_\b0_\b3 struct _\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx\n-504 {\n-505 enum {\n-509 _\bv_\ba_\bl_\bu_\be = false\n-_\b5_\b1_\b0 };\n-511 };\n-512\n-513 template\n-_\b5_\b1_\b4 struct _\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx >\n-515 {\n-516 enum {\n-520 _\bv_\ba_\bl_\bu_\be = true\n-_\b5_\b2_\b1 };\n-522 };\n-523\n-524\n-525 template\n-_\b5_\b2_\b6 struct _\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n-527 {\n-528 enum {\n-532 _\bv_\ba_\bl_\bu_\be = true\n-_\b5_\b3_\b3 };\n-534 };\n-535\n-536 template\n-_\b5_\b3_\b7 struct _\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be\n-538 {\n-_\b5_\b3_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T* l, const T* r)\n-540 {\n-541 return *l < *r;\n-542 }\n-543 };\n-544\n-545}\n-546#endif\n-_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-This file implements a quadratic matrix of fixed size which is a multiple of\n-the identity.\n+338}\n+339#endif\n+_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n _\bc_\bo_\bl\n Col col\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n _\bm_\ba_\bt\n Matrix & mat\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs\n-auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::\n-value > *sfinae=nullptr)\n-Get the number of nonzero fields in the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:119\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs\n+std::size_t countEntries(const BlockVector< T, A > &vector)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1076\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bG_\bl_\bo_\bb_\ba_\bl_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n-void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:154\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static auto coldim(const M &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static auto rowdim(const M &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:214\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-The type for the index access and the size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::ConstIterator ConstColIterator\n-Const iterator to the entries of a row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:737\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-B block_type\n-export the type representing the components\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:491\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator access to matrix rows\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:575\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx\n-A Matrix class to support different block types.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-derive error class from the base class in common\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:404\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-A generic dynamic dense matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+Initializer for SuperLU Matrices representing the subdomains.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:47\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n A::size_type size_type\n Type for indices and sizes.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:577\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-RowIterator end()\n-Get iterator to one beyond last row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:616\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-RowIterator begin()\n-Get iterator to first row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:610\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::const_iterator ConstColIterator\n-Const iterator for the entries of each row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:589\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-T block_type\n-Export the type representing the components.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:568\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt\n-Check whether the a matrix has diagonal values on blocklevel recursion levels.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk\n-static void check(const Matrix &mat)\n-Check whether the a matrix has diagonal values on blocklevel recursion levels.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\b0_\b,_\b _\bl_\b _\b>_\b:_\b:_\bc_\bh_\be_\bc_\bk\n-static void check(const Matrix &mat)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b,_\b _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b,\n-_\bl_\b _\b>_\b:_\b:_\bc_\bh_\be_\bc_\bk\n-static void check(const Matrix &)\n-Check whether the a matrix has diagonal values on blocklevel recursion levels.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:99\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b,_\b _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b,\n-_\bl_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-MultiTypeBlockMatrix< T1, Args... > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix< B, TA > &A, size_type i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:232\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix< B, TA > &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:250\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix< B, TA > &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:242\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-typename Matrix< B, TA >::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix< B, TA > &A, size_type c)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:237\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-typename Matrix< B, TA >::block_type block_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:229\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix< B, TA > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:263\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:311\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-Matrix::block_type block_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:264\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix &A, size_type c)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:276\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:265\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix &A, size_type i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:267\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:304\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:359\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:345\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:355\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:343\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix< FieldMatrix< B, n, m >,TA > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:342\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:350\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:370\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:385\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:368\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-FieldMatrix< K, n, m > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:367\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:375\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:380\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const MatrixType &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:412\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const MatrixType &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:407\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const MatrixType &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:397\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-MatrixType::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:395\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const MatrixType &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:402\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be\n-Dune::DynamicMatrix< T > MatrixType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:394\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const ThisMatrix &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:439\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const ThisMatrix &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:434\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx\n-Matrix< FieldMatrix< K, n, m >, TA > ThisMatrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:421\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const ThisMatrix &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:429\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const ThisMatrix &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:424\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-ThisMatrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:422\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:456\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:449\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:461\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-DiagonalMatrix< K, n > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:448\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:451\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:493\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:478\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n-static size_type coldim(const Matrix &, size_type)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:483\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:476\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-ScaledIdentityMatrix< K, n > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:475\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-static size_type rowdim(const Matrix &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:488\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx\n-Test whether a type is an ISTL Matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:504\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-@ value\n-True if T is an ISTL matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:509\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:538\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-bool operator()(const T *l, const T *r)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:539\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx\n-A multiple of the identity matrix of static size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-std::size_t size_type\n-The type used for the index access and size operations.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+MatrixImp::DenseMatrixBase< T, A >::window_type row_type\n+The type implementing a matrix row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:574\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00065.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00065.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: cholmod.hh File Reference\n+dune-istl: scalarproducts.hh File Reference\n \n \n \n \n \n \n \n@@ -73,54 +73,69 @@\n \n \n
    \n \n-
    cholmod.hh File Reference
    \n+ \n
    \n
    \n-
    #include <dune/common/fmatrix.hh>
    \n-#include <dune/common/fvector.hh>
    \n-#include <dune/istl/bcrsmatrix.hh>
    \n-#include <dune/istl/bvector.hh>
    \n-#include <dune/istl/solver.hh>
    \n-#include <dune/istl/solverfactory.hh>
    \n-#include <dune/istl/foreach.hh>
    \n-#include <vector>
    \n+\n+

    Define base class for scalar product and norm. \n+More...

    \n+
    #include <cmath>
    \n+#include <complex>
    \n+#include <iostream>
    \n+#include <iomanip>
    \n+#include <string>
    \n #include <memory>
    \n-#include <cholmod.h>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/shared_ptr.hh>
    \n+#include "bvector.hh"
    \n+#include "solvercategory.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n \n

    \n Classes

    class  Dune::Cholmod< Vector, Index >
     Dune wrapper for SuiteSparse/CHOLMOD solver. More...
    class  Dune::ScalarProduct< X >
     Base class for scalar product and norm computation. More...
     
    struct  Dune::CholmodCreator
    class  Dune::ParallelScalarProduct< X, C >
     Scalar product for overlapping Schwarz methods. More...
     
    struct  Dune::CholmodCreator::isValidBlock< F >
    class  Dune::SeqScalarProduct< X >
     Default implementation for the scalar case. More...
     
    struct  Dune::CholmodCreator::isValidBlock< FieldVector< double, k > >
    class  Dune::NonoverlappingSchwarzScalarProduct< X, C >
     Nonoverlapping Scalar Product with communication object. More...
     
    struct  Dune::CholmodCreator::isValidBlock< FieldVector< float, k > >
    class  Dune::OverlappingSchwarzScalarProduct< X, C >
     Scalar product for overlapping Schwarz methods. More...
     
    \n \n \n \n

    \n Namespaces

    namespace  Dune
     
    \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n

    \n Functions

     Dune::DUNE_REGISTER_DIRECT_SOLVER ("cholmod", Dune::CholmodCreator())
     
    template<class X , class Comm >
    std::shared_ptr< ScalarProduct< X > > Dune::makeScalarProduct (std::shared_ptr< const Comm > comm, SolverCategory::Category category)
     Choose the appropriate scalar product for a solver category.
     
    template<class X , class Comm >
    std::shared_ptr< ScalarProduct< X > > Dune::createScalarProduct (const Comm &comm, SolverCategory::Category category)
     
    \n-
    \n+

    Detailed Description

    \n+

    Define base class for scalar product and norm.

    \n+

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

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,39 +1,60 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-cholmod.hh File Reference\n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh>\n-#include \n+scalarproducts.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bS_\bc_\ba_\bl_\ba_\br_\b _\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs\n+Define base class for scalar product and norm. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n #include \n-#include \n+#include \n+#include \n+#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b<_\b _\bV_\be_\bc_\bt_\bo_\br_\b,_\b _\bI_\bn_\bd_\be_\bx_\b _\b>\n-\u00a0 _\bD_\bu_\bn_\be wrapper for SuiteSparse/CHOLMOD solver. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bX_\b _\b>\n+\u00a0 Base class for scalar product and norm computation. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bX_\b,_\b _\bC_\b _\b>\n+\u00a0 Scalar product for overlapping Schwarz methods. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bX_\b _\b>\n+\u00a0 Default implementation for the scalar case. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b,_\b _\bk_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bX_\b,_\b _\bC_\b _\b>\n+\u00a0 Nonoverlapping Scalar Product with communication object. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b,_\b _\bk_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bX_\b,_\b _\bC_\b _\b>\n+\u00a0 Scalar product for overlapping Schwarz methods. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"cholmod\", _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br())\n-\u00a0\n+template\n+std::shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (std::\n+ shared_ptr< const Comm > comm,\n+ _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category)\n+\u00a0 Choose the appropriate scalar product\n+ for a solver category.\n+\u00a0\n+template\n+std::shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const Comm\n+ &comm, _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+ category)\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Define base class for scalar product and norm.\n+These classes have to be implemented differently for different data\n+partitioning strategies. Default implementations for the sequential case are\n+provided.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00065_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00065_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: cholmod.hh Source File\n+dune-istl: scalarproducts.hh Source File\n \n \n \n \n \n \n \n@@ -74,570 +74,224 @@\n \n
    \n \n
    \n \n
    \n-
    cholmod.hh
    \n+
    scalarproducts.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#pragma once
    \n-
    6
    \n-
    7#if HAVE_SUITESPARSE_CHOLMOD || defined DOXYGEN
    \n-
    8
    \n-
    9#include <dune/common/fmatrix.hh>
    \n-
    10#include <dune/common/fvector.hh>
    \n-\n-
    12#include <dune/istl/bvector.hh>
    \n-
    13#include<dune/istl/solver.hh>
    \n-\n-
    15#include <dune/istl/foreach.hh>
    \n-
    16
    \n-
    17#include <vector>
    \n-
    18#include <memory>
    \n-
    19
    \n-
    20#include <cholmod.h>
    \n+
    5#ifndef DUNE_ISTL_SCALARPRODUCTS_HH
    \n+
    6#define DUNE_ISTL_SCALARPRODUCTS_HH
    \n+
    7
    \n+
    8#include <cmath>
    \n+
    9#include <complex>
    \n+
    10#include <iostream>
    \n+
    11#include <iomanip>
    \n+
    12#include <string>
    \n+
    13#include <memory>
    \n+
    14
    \n+
    15#include <dune/common/exceptions.hh>
    \n+
    16#include <dune/common/shared_ptr.hh>
    \n+
    17
    \n+
    18#include "bvector.hh"
    \n+
    19#include "solvercategory.hh"
    \n+
    20
    \n
    21
    \n
    22namespace Dune {
    \n-
    23
    \n-
    24namespace Impl{
    \n-
    25
    \n-
    34 struct NoIgnore
    \n-
    35 {
    \n-
    36 const NoIgnore& operator[](std::size_t) const { return *this; }
    \n-
    37 explicit operator bool() const { return false; }
    \n-
    38 static constexpr std::size_t size() { return 0; }
    \n-
    39
    \n-
    40 };
    \n-
    41
    \n-
    42
    \n-
    43 template<class BlockedVector, class FlatVector>
    \n-
    44 void copyToFlatVector(const BlockedVector& blockedVector, FlatVector& flatVector)
    \n-
    45 {
    \n-
    46 // traverse the vector once just to compute the size
    \n-
    47 std::size_t len = flatVectorForEach(blockedVector, [&](auto&&, auto...){});
    \n-
    48 flatVector.resize(len);
    \n-
    49
    \n-
    50 flatVectorForEach(blockedVector, [&](auto&& entry, auto offset){
    \n-
    51 flatVector[offset] = entry;
    \n-
    52 });
    \n-
    53 }
    \n-
    54
    \n-
    55 // special (dummy) case for NoIgnore
    \n-
    56 template<class FlatVector>
    \n-
    57 void copyToFlatVector(const NoIgnore&, FlatVector&)
    \n-
    58 {
    \n-
    59 // just do nothing
    \n-
    60 return;
    \n-
    61 }
    \n-
    62
    \n-
    63 template<class FlatVector, class BlockedVector>
    \n-
    64 void copyToBlockedVector(const FlatVector& flatVector, BlockedVector& blockedVector)
    \n-
    65 {
    \n-
    66 flatVectorForEach(blockedVector, [&](auto& entry, auto offset){
    \n-
    67 entry = flatVector[offset];
    \n-
    68 });
    \n-
    69 }
    \n-
    70
    \n-
    71 // wrapper class for C function calls to CHOLMOD itself.
    \n-
    72 // The CHOLMOD API has different functions for different index types.
    \n-
    73 template <class Index>
    \n-
    74 struct CholmodMethodChooser;
    \n+
    51 template<class X>
    \n+
    \n+\n+
    53 public:
    \n+
    55 typedef X domain_type;
    \n+
    56 typedef typename X::field_type field_type;
    \n+
    57 typedef typename FieldTraits<field_type>::real_type real_type;
    \n+
    58
    \n+
    \n+
    63 virtual field_type dot (const X& x, const X& y) const
    \n+
    64 {
    \n+
    65 return x.dot(y);
    \n+
    66 }
    \n+
    \n+
    67
    \n+
    \n+
    71 virtual real_type norm (const X& x) const
    \n+
    72 {
    \n+
    73 return x.two_norm();
    \n+
    74 }
    \n+
    \n
    75
    \n-
    76 // specialization using 'int' to store indices
    \n-
    77 template <>
    \n-
    78 struct CholmodMethodChooser<int>
    \n-
    79 {
    \n-
    80 [[nodiscard]]
    \n-
    81 static cholmod_dense* allocate_dense(size_t nrow, size_t ncol, size_t d, int xtype, cholmod_common *c)
    \n-
    82 {
    \n-
    83 return ::cholmod_allocate_dense(nrow,ncol,d,xtype,c);
    \n-
    84 }
    \n+
    \n+\n+
    78 {
    \n+\n+
    80 }
    \n+
    \n+
    81
    \n+
    83 virtual ~ScalarProduct () {}
    \n+
    84 };
    \n+
    \n
    85
    \n-
    86 [[nodiscard]]
    \n-
    87 static cholmod_sparse* allocate_sparse(size_t nrow, size_t ncol, size_t nzmax, int sorted, int packed, int stype, int xtype, cholmod_common *c)
    \n-
    88 {
    \n-
    89 return ::cholmod_allocate_sparse(nrow,ncol,nzmax,sorted,packed,stype,xtype,c);
    \n-
    90 }
    \n-
    91
    \n-
    92 [[nodiscard]]
    \n-
    93 static cholmod_factor* analyze(cholmod_sparse *A, cholmod_common *c)
    \n-
    94 {
    \n-
    95 return ::cholmod_analyze(A,c);
    \n-
    96 }
    \n-
    97
    \n-
    98 static int defaults(cholmod_common *c)
    \n-
    99 {
    \n-
    100 return ::cholmod_defaults(c);
    \n-
    101 }
    \n-
    102
    \n-
    103 static int factorize(cholmod_sparse *A, cholmod_factor *L, cholmod_common *c)
    \n-
    104 {
    \n-
    105 return ::cholmod_factorize(A,L,c);
    \n-
    106 }
    \n-
    107
    \n-
    108 static int finish(cholmod_common *c)
    \n-
    109 {
    \n-
    110 return ::cholmod_finish(c);
    \n-
    111 }
    \n-
    112
    \n-
    113 static int free_dense (cholmod_dense **X, cholmod_common *c)
    \n-
    114 {
    \n-
    115 return ::cholmod_free_dense(X,c);
    \n-
    116 }
    \n-
    117
    \n-
    118 static int free_factor(cholmod_factor **L, cholmod_common *c)
    \n-
    119 {
    \n-
    120 return ::cholmod_free_factor(L,c);
    \n-
    121 }
    \n-
    122
    \n-
    123 static int free_sparse(cholmod_sparse **A, cholmod_common *c)
    \n-
    124 {
    \n-
    125 return ::cholmod_free_sparse(A,c);
    \n-
    126 }
    \n-
    127
    \n-
    128 [[nodiscard]]
    \n-
    129 static cholmod_dense* solve(int sys, cholmod_factor *L, cholmod_dense *B, cholmod_common *c)
    \n-
    130 {
    \n-
    131 return ::cholmod_solve(sys,L,B,c);
    \n-
    132 }
    \n+
    97 template<class X, class C>
    \n+
    \n+\n+
    99 {
    \n+
    100 public:
    \n+
    105 typedef X domain_type;
    \n+
    107 typedef typename X::field_type field_type;
    \n+
    108 typedef typename FieldTraits<field_type>::real_type real_type;
    \n+\n+
    114
    \n+
    \n+
    120 ParallelScalarProduct (std::shared_ptr<const communication_type> com, SolverCategory::Category cat)
    \n+
    121 : _communication(com), _category(cat)
    \n+
    122 {}
    \n+
    \n+
    123
    \n+
    \n+\n+
    131 : ParallelScalarProduct(stackobject_to_shared_ptr(com), cat)
    \n+
    132 {}
    \n+
    \n
    133
    \n-
    134 static int start(cholmod_common *c)
    \n-
    135 {
    \n-
    136 return ::cholmod_start(c);
    \n-
    137 }
    \n-
    138 };
    \n-
    139
    \n-
    140 // specialization using 'SuiteSparse_long' to store indices
    \n-
    141 template <>
    \n-
    142 struct CholmodMethodChooser<SuiteSparse_long>
    \n-
    143 {
    \n-
    144 [[nodiscard]]
    \n-
    145 static cholmod_dense* allocate_dense(size_t nrow, size_t ncol, size_t d, int xtype, cholmod_common *c)
    \n-
    146 {
    \n-
    147 return ::cholmod_l_allocate_dense(nrow,ncol,d,xtype,c);
    \n-
    148 }
    \n-
    149
    \n-
    150 [[nodiscard]]
    \n-
    151 static cholmod_sparse* allocate_sparse(size_t nrow, size_t ncol, size_t nzmax, int sorted, int packed, int stype, int xtype, cholmod_common *c)
    \n-
    152 {
    \n-
    153 return ::cholmod_l_allocate_sparse(nrow,ncol,nzmax,sorted,packed,stype,xtype,c);
    \n-
    154 }
    \n-
    155
    \n-
    156 [[nodiscard]]
    \n-
    157 static cholmod_factor* analyze(cholmod_sparse *A, cholmod_common *c)
    \n-
    158 {
    \n-
    159 return ::cholmod_l_analyze(A,c);
    \n-
    160 }
    \n-
    161
    \n-
    162 static int defaults(cholmod_common *c)
    \n-
    163 {
    \n-
    164 return ::cholmod_l_defaults(c);
    \n-
    165 }
    \n-
    166
    \n-
    167 static int factorize(cholmod_sparse *A, cholmod_factor *L, cholmod_common *c)
    \n-
    168 {
    \n-
    169 return ::cholmod_l_factorize(A,L,c);
    \n-
    170 }
    \n+
    134
    \n+
    \n+
    139 virtual field_type dot (const X& x, const X& y) const override
    \n+
    140 {
    \n+
    141 field_type result(0);
    \n+
    142 _communication->dot(x,y,result); // explicitly loop and apply masking
    \n+
    143 return result;
    \n+
    144 }
    \n+
    \n+
    145
    \n+
    \n+
    149 virtual real_type norm (const X& x) const override
    \n+
    150 {
    \n+
    151 return _communication->norm(x);
    \n+
    152 }
    \n+
    \n+
    153
    \n+
    \n+
    155 virtual SolverCategory::Category category() const override
    \n+
    156 {
    \n+
    157 return _category;
    \n+
    158 }
    \n+
    \n+
    159
    \n+
    160 private:
    \n+
    161 std::shared_ptr<const communication_type> _communication;
    \n+
    162 SolverCategory::Category _category;
    \n+
    163 };
    \n+
    \n+
    164
    \n+
    166 template<class X>
    \n+
    \n+\n+
    168 {
    \n+
    169 using ScalarProduct<X>::ScalarProduct;
    \n+
    170 };
    \n+
    \n
    171
    \n-
    172 static int finish(cholmod_common *c)
    \n-
    173 {
    \n-
    174 return ::cholmod_l_finish(c);
    \n-
    175 }
    \n-
    176
    \n-
    177 static int free_dense (cholmod_dense **X, cholmod_common *c)
    \n-
    178 {
    \n-
    179 return ::cholmod_l_free_dense(X,c);
    \n-
    180 }
    \n-
    181
    \n-
    182 static int free_factor (cholmod_factor **L, cholmod_common *c)
    \n-
    183 {
    \n-
    184 return ::cholmod_l_free_factor(L,c);
    \n-
    185 }
    \n-
    186
    \n-
    187 static int free_sparse(cholmod_sparse **A, cholmod_common *c)
    \n-
    188 {
    \n-
    189 return ::cholmod_l_free_sparse(A,c);
    \n-
    190 }
    \n-
    191
    \n-
    192 [[nodiscard]]
    \n-
    193 static cholmod_dense* solve(int sys, cholmod_factor *L, cholmod_dense *B, cholmod_common *c)
    \n-
    194 {
    \n-
    195 return ::cholmod_l_solve(sys,L,B,c);
    \n-
    196 }
    \n-
    197
    \n-
    198 static int start(cholmod_common *c)
    \n-
    199 {
    \n-
    200 return ::cholmod_l_start(c);
    \n-
    201 }
    \n-
    202 };
    \n-
    203
    \n-
    204} //namespace Impl
    \n+
    177 template<class X, class C>
    \n+
    \n+\n+
    179 {
    \n+
    180 public:
    \n+
    \n+
    181 NonoverlappingSchwarzScalarProduct (std::shared_ptr<const C> comm) :
    \n+
    182 ParallelScalarProduct<X,C>(comm,SolverCategory::nonoverlapping) {}
    \n+
    \n+
    183
    \n+
    \n+\n+
    185 ParallelScalarProduct<X,C>(comm,SolverCategory::nonoverlapping) {}
    \n+
    \n+
    186 };
    \n+
    \n+
    187
    \n+
    199 template<class X, class C>
    \n+
    \n+\n+
    201 {
    \n+
    202 public:
    \n+
    \n+
    203 OverlappingSchwarzScalarProduct (std::shared_ptr<const C> comm) :
    \n+
    204 ParallelScalarProduct<X,C>(comm, SolverCategory::overlapping) {}
    \n+
    \n
    205
    \n-
    214template<class Vector, class Index=int>
    \n-
    \n-
    215class Cholmod : public InverseOperator<Vector, Vector>
    \n-
    216{
    \n-
    217 static_assert(std::is_same_v<Index,int> || std::is_same_v<Index,SuiteSparse_long>,
    \n-
    218 "Index type must be either 'int' or 'SuiteSparse_long'!");
    \n-
    219
    \n-
    220 using CholmodMethod = Impl::CholmodMethodChooser<Index>;
    \n-
    221
    \n-
    222public:
    \n-
    223
    \n-
    \n-\n-
    230 {
    \n-
    231 CholmodMethod::start(&c_);
    \n-
    232 }
    \n-
    \n-
    233
    \n-
    \n-\n-
    240 {
    \n-
    241 if (L_)
    \n-
    242 CholmodMethod::free_factor(&L_, &c_);
    \n-
    243 CholmodMethod::finish(&c_);
    \n-
    244 }
    \n-
    \n-
    245
    \n-
    246 // forbid copying to avoid freeing memory twice
    \n-
    247 Cholmod(const Cholmod&) = delete;
    \n-
    248 Cholmod& operator=(const Cholmod&) = delete;
    \n-
    249
    \n-
    250
    \n-
    \n-
    253 void apply (Vector& x, Vector& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
    \n-
    254 {
    \n-
    255 apply(x,b,res);
    \n-
    256 }
    \n-
    \n-
    257
    \n-
    \n-
    263 void apply(Vector& x, Vector& b, InverseOperatorResult& res)
    \n-
    264 {
    \n-
    265 // do nothing if N=0
    \n-
    266 if ( nIsZero_ )
    \n-
    267 {
    \n-
    268 return;
    \n-
    269 }
    \n-
    270
    \n-
    271 if (x.size() != b.size())
    \n-
    272 DUNE_THROW(Exception, "Error in apply(): sizes of x and b do not match!");
    \n-
    273
    \n-
    274 // cast to double array
    \n-
    275 auto b2 = std::make_unique<double[]>(L_->n);
    \n-
    276 auto x2 = std::make_unique<double[]>(L_->n);
    \n-
    277
    \n-
    278 // copy to cholmod
    \n-
    279 auto bp = b2.get();
    \n-
    280
    \n-
    281 flatVectorForEach(b, [&](auto&& entry, auto&& flatIndex){
    \n-
    282 if ( subIndices_.empty() )
    \n-
    283 bp[ flatIndex ] = entry;
    \n-
    284 else
    \n-
    285 if( subIndices_[ flatIndex ] != std::numeric_limits<std::size_t>::max() )
    \n-
    286 bp[ subIndices_[ flatIndex ] ] = entry;
    \n-
    287 });
    \n-
    288
    \n-
    289 // create a cholmod dense object
    \n-
    290 auto b3 = make_cholmod_dense(CholmodMethod::allocate_dense(L_->n, 1, L_->n, CHOLMOD_REAL, &c_), &c_);
    \n-
    291
    \n-
    292 // cast because void-ptr
    \n-
    293 auto b4 = static_cast<double*>(b3->x);
    \n-
    294 std::copy(b2.get(), b2.get() + L_->n, b4);
    \n-
    295
    \n-
    296 // solve for a cholmod x object
    \n-
    297 auto x3 = make_cholmod_dense(CholmodMethod::solve(CHOLMOD_A, L_, b3.get(), &c_), &c_);
    \n-
    298 // cast because void-ptr
    \n-
    299 auto xp = static_cast<double*>(x3->x);
    \n-
    300
    \n-
    301 // copy into x
    \n-
    302 flatVectorForEach(x, [&](auto&& entry, auto&& flatIndex){
    \n-
    303 if ( subIndices_.empty() )
    \n-
    304 entry = xp[ flatIndex ];
    \n-
    305 else
    \n-
    306 if( subIndices_[ flatIndex ] != std::numeric_limits<std::size_t>::max() )
    \n-
    307 entry = xp[ subIndices_[ flatIndex ] ];
    \n-
    308 });
    \n-
    309
    \n-
    310 // statistics for a direct solver
    \n-
    311 res.iterations = 1;
    \n-
    312 res.converged = true;
    \n-
    313 }
    \n-
    \n-
    314
    \n-
    315
    \n-
    321 template<class Matrix>
    \n-
    \n-
    322 void setMatrix(const Matrix& matrix)
    \n-
    323 {
    \n-
    324 const Impl::NoIgnore* noIgnore = nullptr;
    \n-
    325 setMatrix(matrix, noIgnore);
    \n-
    326 }
    \n-
    \n-
    327
    \n-
    342 template<class Matrix, class Ignore>
    \n-
    \n-
    343 void setMatrix(const Matrix& matrix, const Ignore* ignore)
    \n-
    344 {
    \n-
    345 // count the number of entries and diagonal entries
    \n-
    346 size_t nonZeros = 0;
    \n-
    347 size_t numberOfIgnoredDofs = 0;
    \n-
    348
    \n-
    349
    \n-
    350 auto [flatRows,flatCols] = flatMatrixForEach( matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&& flatColIndex){
    \n-
    351 if( flatRowIndex <= flatColIndex )
    \n-
    352 nonZeros++;
    \n-
    353 });
    \n-
    354
    \n-
    355 std::vector<bool> flatIgnore;
    \n-
    356
    \n-
    357 if ( ignore )
    \n-
    358 {
    \n-
    359 Impl::copyToFlatVector(*ignore,flatIgnore);
    \n-
    360 numberOfIgnoredDofs = std::count(flatIgnore.begin(),flatIgnore.end(),true);
    \n-
    361 }
    \n-
    362
    \n-
    363 nIsZero_ = (size_t(flatRows) <= numberOfIgnoredDofs);
    \n-
    364
    \n-
    365 if ( nIsZero_ )
    \n-
    366 {
    \n-
    367 return;
    \n-
    368 }
    \n-
    369
    \n-
    370 // Total number of rows
    \n-
    371 size_t N = flatRows - numberOfIgnoredDofs;
    \n-
    372
    \n-
    373 /*
    \n-
    374 * CHOLMOD uses compressed-column sparse matrices, but for symmetric
    \n-
    375 * matrices this is the same as the compressed-row sparse matrix used
    \n-
    376 * by DUNE. So we can just store M\u1d40 instead of M (as M = M\u1d40).
    \n-
    377 */
    \n-
    378 const auto deleter = [c = &this->c_](auto* p) {
    \n-
    379 CholmodMethod::free_sparse(&p, c);
    \n-
    380 };
    \n-
    381 auto M = std::unique_ptr<cholmod_sparse, decltype(deleter)>(
    \n-
    382 CholmodMethod::allocate_sparse(N, // # rows
    \n-
    383 N, // # cols
    \n-
    384 nonZeros, // # of nonzeroes
    \n-
    385 1, // indices are sorted ( 1 = true)
    \n-
    386 1, // matrix is "packed" ( 1 = true)
    \n-
    387 -1, // stype of matrix ( -1 = consider the lower part only )
    \n-
    388 CHOLMOD_REAL, // xtype of matrix ( CHOLMOD_REAL = single array, no complex numbers)
    \n-
    389 &c_ // cholmod_common ptr
    \n-
    390 ), deleter);
    \n-
    391
    \n-
    392 // copy the data of BCRS matrix to Cholmod Sparse matrix
    \n-
    393 Index* Ap = static_cast<Index*>(M->p);
    \n-
    394 Index* Ai = static_cast<Index*>(M->i);
    \n-
    395 double* Ax = static_cast<double*>(M->x);
    \n-
    396
    \n-
    397
    \n-
    398 if ( ignore )
    \n-
    399 {
    \n-
    400 // init the mapping
    \n-
    401 subIndices_.resize(flatRows,std::numeric_limits<std::size_t>::max());
    \n-
    402
    \n-
    403 std::size_t subIndexCounter = 0;
    \n-
    404
    \n-
    405 for ( std::size_t i=0; i<flatRows; i++ )
    \n-
    406 {
    \n-
    407 if ( not flatIgnore[ i ] )
    \n-
    408 {
    \n-
    409 subIndices_[ i ] = subIndexCounter++;
    \n-
    410 }
    \n-
    411 }
    \n-
    412 }
    \n-
    413
    \n-
    414 // at first, we need to compute the row starts "Ap"
    \n-
    415 // therefore, we count all (not ignored) entries in each row and in the end we accumulate everything
    \n-
    416 flatMatrixForEach(matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&& flatColIndex){
    \n-
    417
    \n-
    418 // stop if ignored
    \n-
    419 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) )
    \n-
    420 return;
    \n-
    421
    \n-
    422 // stop if in lower half
    \n-
    423 if ( flatRowIndex > flatColIndex )
    \n-
    424 return;
    \n-
    425
    \n-
    426 // ok, count the entry
    \n-
    427 auto idx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;
    \n-
    428 Ap[idx+1]++;
    \n-
    429
    \n-
    430 });
    \n-
    431
    \n-
    432 // now accumulate
    \n-
    433 Ap[0] = 0;
    \n-
    434 for ( size_t i=0; i<N; i++ )
    \n-
    435 {
    \n-
    436 Ap[i+1] += Ap[i];
    \n-
    437 }
    \n-
    438
    \n-
    439 // we need a compressed row position counter
    \n-
    440 std::vector<std::size_t> rowPosition(N,0);
    \n-
    441
    \n-
    442 // now we can set the entries
    \n-
    443 flatMatrixForEach(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&& flatColIndex){
    \n-
    444
    \n-
    445 // stop if ignored
    \n-
    446 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) )
    \n-
    447 return;
    \n-
    448
    \n-
    449 // stop if in lower half
    \n-
    450 if ( flatRowIndex > flatColIndex )
    \n-
    451 return;
    \n-
    452
    \n-
    453 // ok, set the entry
    \n-
    454 auto rowIdx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;
    \n-
    455 auto colIdx = ignore ? subIndices_[flatColIndex] : flatColIndex;
    \n-
    456 auto rowStart = Ap[rowIdx];
    \n-
    457 auto rowPos = rowPosition[rowIdx];
    \n-
    458 Ai[ rowStart + rowPos ] = colIdx;
    \n-
    459 Ax[ rowStart + rowPos ] = entry;
    \n-
    460 rowPosition[rowIdx]++;
    \n-
    461
    \n-
    462 });
    \n-
    463
    \n-
    464 // Now analyse the pattern and optimal row order
    \n-
    465 L_ = CholmodMethod::analyze(M.get(), &c_);
    \n-
    466
    \n-
    467 // Do the factorization (this may take some time)
    \n-
    468 CholmodMethod::factorize(M.get(), L_, &c_);
    \n-
    469 }
    \n-
    \n-
    470
    \n-
    \n-\n-
    472 {
    \n-\n-
    474 }
    \n-
    \n-
    475
    \n-
    \n-
    481 cholmod_common& cholmodCommonObject()
    \n-
    482 {
    \n-
    483 return c_;
    \n-
    484 }
    \n-
    \n-
    485
    \n-
    \n-
    491 cholmod_factor& cholmodFactor()
    \n-
    492 {
    \n-
    493 return *L_;
    \n-
    494 }
    \n-
    \n-
    495
    \n-
    \n-
    501 const cholmod_factor& cholmodFactor() const
    \n-
    502 {
    \n-
    503 return *L_;
    \n-
    504 }
    \n-
    \n-
    505private:
    \n-
    506
    \n-
    507 // create a std::unique_ptr to a cholmod_dense object with a deleter
    \n-
    508 // that calls the appropriate cholmod cleanup routine
    \n-
    509 auto make_cholmod_dense(cholmod_dense* x, cholmod_common* c)
    \n-
    510 {
    \n-
    511 const auto deleter = [c](auto* p) {
    \n-
    512 CholmodMethod::free_dense(&p, c);
    \n-
    513 };
    \n-
    514 return std::unique_ptr<cholmod_dense, decltype(deleter)>(x, deleter);
    \n-
    515 }
    \n-
    516
    \n-
    517 cholmod_common c_;
    \n-
    518 cholmod_factor* L_ = nullptr;
    \n-
    519
    \n-
    520 // indicator for a 0x0 problem (due to ignore dof's)
    \n-
    521 bool nIsZero_ = false;
    \n-
    522
    \n-
    523 // vector mapping all indices in flat order to the not ignored indices
    \n-
    524 std::vector<std::size_t> subIndices_;
    \n-
    525};
    \n-
    \n-
    526
    \n-
    \n-\n-
    528 template<class F> struct isValidBlock : std::false_type{};
    \n-
    529 template<int k> struct isValidBlock<FieldVector<double,k>> : std::true_type{};
    \n-
    530 template<int k> struct isValidBlock<FieldVector<float,k>> : std::true_type{};
    \n-
    531
    \n-
    532 template<class TL, typename M>
    \n-
    533 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n-
    534 typename Dune::TypeListElement<2, TL>::type>>
    \n-
    \n-
    535 operator()(TL /*tl*/, const M& mat, const Dune::ParameterTree& /*config*/,
    \n-
    536 std::enable_if_t<isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n-
    537 {
    \n-
    538 using D = typename Dune::TypeListElement<1, TL>::type;
    \n-
    539 auto solver = std::make_shared<Dune::Cholmod<D>>();
    \n-
    540 solver->setMatrix(mat);
    \n-
    541 return solver;
    \n-
    542 }
    \n-
    \n-
    543
    \n-
    544 // second version with SFINAE to validate the template parameters of Cholmod
    \n-
    545 template<typename TL, typename M>
    \n-
    546 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n-
    547 typename Dune::TypeListElement<2, TL>::type>>
    \n-
    \n-
    548 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
    \n-
    549 std::enable_if_t<!isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n-
    550 {
    \n-
    551 DUNE_THROW(UnsupportedType, "Unsupported Type in Cholmod");
    \n-
    552 }
    \n-
    \n-
    553 };
    \n-
    \n-\n-
    555
    \n-
    556} /* namespace Dune */
    \n-
    557
    \n-
    558#endif // HAVE_SUITESPARSE_CHOLMOD
    \n-
    #define DUNE_REGISTER_DIRECT_SOLVER(name,...)
    Definition solverregistry.hh:13
    \n-
    Implementation of the BCRSMatrix class.
    \n-
    Define general, extensible interface for inverse operators.
    \n-\n-\n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n-
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    \n+\n+
    207 ParallelScalarProduct<X,C>(comm,SolverCategory::overlapping) {}
    \n+
    \n+
    208 };
    \n+
    \n+
    209
    \n+
    223 template<class X, class Comm>
    \n+
    \n+
    224 std::shared_ptr<ScalarProduct<X>> makeScalarProduct(std::shared_ptr<const Comm> comm, SolverCategory::Category category)
    \n+
    225 {
    \n+
    226 switch(category)
    \n+
    227 {
    \n+\n+
    229 return
    \n+
    230 std::make_shared<ScalarProduct<X>>();
    \n+
    231 default:
    \n+
    232 return
    \n+
    233 std::make_shared<ParallelScalarProduct<X,Comm>>(comm,category);
    \n+
    234 }
    \n+
    235 }
    \n+
    \n+
    236
    \n+
    241 template<class X, class Comm>
    \n+
    \n+
    242 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const Comm& comm, SolverCategory::Category category)
    \n+
    243 { return makeScalarProduct<X>(stackobject_to_shared_ptr(comm), category); }
    \n+
    \n+
    244
    \n+
    245} // end namespace Dune
    \n+
    246
    \n+
    247#endif
    \n+\n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n
    Definition allocator.hh:11
    \n-
    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
    \n-
    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
    \n-
    Dune wrapper for SuiteSparse/CHOLMOD solver.
    Definition cholmod.hh:216
    \n-
    cholmod_common & cholmodCommonObject()
    return a reference to the CHOLMOD common object for advanced option settings
    Definition cholmod.hh:481
    \n-
    void setMatrix(const Matrix &matrix)
    Set matrix without ignore nodes.
    Definition cholmod.hh:322
    \n-
    cholmod_factor & cholmodFactor()
    The CHOLMOD data structure that stores the factorization.
    Definition cholmod.hh:491
    \n-
    ~Cholmod()
    Destructor.
    Definition cholmod.hh:239
    \n-
    Cholmod & operator=(const Cholmod &)=delete
    \n-
    virtual SolverCategory::Category category() const
    Category of the solver (see SolverCategory::Category)
    Definition cholmod.hh:471
    \n-
    void apply(Vector &x, Vector &b, InverseOperatorResult &res)
    solve the linear system Ax=b (possibly with respect to some ignore field)
    Definition cholmod.hh:263
    \n-
    Cholmod(const Cholmod &)=delete
    \n-
    const cholmod_factor & cholmodFactor() const
    The CHOLMOD data structure that stores the factorization.
    Definition cholmod.hh:501
    \n-
    void apply(Vector &x, Vector &b, double reduction, InverseOperatorResult &res)
    simple forward to apply(X&, Y&, InverseOperatorResult&)
    Definition cholmod.hh:253
    \n-
    Cholmod()
    Default constructor.
    Definition cholmod.hh:229
    \n-
    void setMatrix(const Matrix &matrix, const Ignore *ignore)
    Set matrix and ignore nodes.
    Definition cholmod.hh:343
    \n-
    Definition cholmod.hh:527
    \n-
    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 &, std::enable_if_t< isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
    Definition cholmod.hh:535
    \n-
    Definition cholmod.hh:528
    \n-
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n-
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n-
    int iterations
    Number of iterations.
    Definition solver.hh:69
    \n-
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n-
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n+
    std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, SolverCategory::Category category)
    Definition scalarproducts.hh:242
    \n+
    std::shared_ptr< ScalarProduct< X > > makeScalarProduct(std::shared_ptr< const Comm > comm, SolverCategory::Category category)
    Choose the appropriate scalar product for a solver category.
    Definition scalarproducts.hh:224
    \n+
    Base class for scalar product and norm computation.
    Definition scalarproducts.hh:52
    \n+
    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
    \n+
    virtual SolverCategory::Category category() const
    Category of the scalar product (see SolverCategory::Category)
    Definition scalarproducts.hh:77
    \n+
    X::field_type field_type
    Definition scalarproducts.hh:56
    \n+
    X domain_type
    export types, they come from the derived class
    Definition scalarproducts.hh:55
    \n+
    virtual ~ScalarProduct()
    every abstract base class has a virtual destructor
    Definition scalarproducts.hh:83
    \n+
    FieldTraits< field_type >::real_type real_type
    Definition scalarproducts.hh:57
    \n+
    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
    \n+
    Scalar product for overlapping Schwarz methods.
    Definition scalarproducts.hh:99
    \n+
    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
    \n+
    virtual SolverCategory::Category category() const override
    Category of the scalar product (see SolverCategory::Category)
    Definition scalarproducts.hh:155
    \n+
    FieldTraits< field_type >::real_type real_type
    Definition scalarproducts.hh:108
    \n+
    C communication_type
    The type of the communication object.
    Definition scalarproducts.hh:113
    \n+
    ParallelScalarProduct(const communication_type &com, SolverCategory::Category cat)
    Definition scalarproducts.hh:130
    \n+
    X domain_type
    The type of the vector to compute the scalar product on.
    Definition scalarproducts.hh:105
    \n+
    ParallelScalarProduct(std::shared_ptr< const communication_type > com, SolverCategory::Category cat)
    Definition scalarproducts.hh:120
    \n+
    X::field_type field_type
    The field type used by the vector type domain_type.
    Definition scalarproducts.hh:107
    \n+
    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
    \n+
    Default implementation for the scalar case.
    Definition scalarproducts.hh:168
    \n+
    Nonoverlapping Scalar Product with communication object.
    Definition scalarproducts.hh:179
    \n+
    NonoverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)
    Definition scalarproducts.hh:181
    \n+
    NonoverlappingSchwarzScalarProduct(const C &comm)
    Definition scalarproducts.hh:184
    \n+
    Scalar product for overlapping Schwarz methods.
    Definition scalarproducts.hh:201
    \n+
    OverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)
    Definition scalarproducts.hh:203
    \n+
    OverlappingSchwarzScalarProduct(const C &comm)
    Definition scalarproducts.hh:206
    \n+
    Categories for the solvers.
    Definition solvercategory.hh:22
    \n
    Category
    Definition solvercategory.hh:23
    \n
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n-
    Definition solverregistry.hh:77
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,640 +1,269 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-cholmod.hh\n+scalarproducts.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#pragma once\n-6\n-7#if HAVE_SUITESPARSE_CHOLMOD || defined DOXYGEN\n-8\n-9#include \n-10#include \n-11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-13#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh>\n-16\n-17#include \n-18#include \n-19\n-20#include \n+5#ifndef DUNE_ISTL_SCALARPRODUCTS_HH\n+6#define DUNE_ISTL_SCALARPRODUCTS_HH\n+7\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14\n+15#include \n+16#include \n+17\n+18#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+19#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n+20\n 21\n 22namespace _\bD_\bu_\bn_\be {\n-23\n-24namespace Impl{\n-25\n-34 struct NoIgnore\n-35 {\n-36 const NoIgnore& operator[](std::size_t) const { return *this; }\n-37 explicit operator bool() const { return false; }\n-38 static constexpr std::size_t size() { return 0; }\n-39\n-40 };\n-41\n-42\n-43 template\n-44 void copyToFlatVector(const BlockedVector& blockedVector, FlatVector&\n-flatVector)\n-45 {\n-46 // traverse the vector once just to compute the size\n-47 std::size_t len = _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(blockedVector, [&](auto&&, auto...){});\n-48 flatVector.resize(len);\n-49\n-50 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(blockedVector, [&](auto&& entry, auto offset){\n-51 flatVector[offset] = entry;\n-52 });\n-53 }\n-54\n-55 // special (dummy) case for NoIgnore\n-56 template\n-57 void copyToFlatVector(const NoIgnore&, FlatVector&)\n-58 {\n-59 // just do nothing\n-60 return;\n-61 }\n-62\n-63 template\n-64 void copyToBlockedVector(const FlatVector& flatVector, BlockedVector&\n-blockedVector)\n-65 {\n-66 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(blockedVector, [&](auto& entry, auto offset){\n-67 entry = flatVector[offset];\n-68 });\n-69 }\n-70\n-71 // wrapper class for C function calls to CHOLMOD itself.\n-72 // The CHOLMOD API has different functions for different index types.\n-73 template \n-74 struct CholmodMethodChooser;\n+51 template\n+_\b5_\b2 class _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt {\n+53 public:\n+_\b5_\b5 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b5_\b6 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b5_\b7 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+58\n+_\b6_\b3 virtual _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bd_\bo_\bt (const X& x, const X& y) const\n+64 {\n+65 return x.dot(y);\n+66 }\n+67\n+_\b7_\b1 virtual _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bn_\bo_\br_\bm (const X& x) const\n+72 {\n+73 return x.two_norm();\n+74 }\n 75\n-76 // specialization using 'int' to store indices\n-77 template <>\n-78 struct CholmodMethodChooser\n-79 {\n-80 [[nodiscard]]\n-81 static cholmod_dense* allocate_dense(size_t nrow, size_t ncol, size_t d, int\n-xtype, cholmod_common *c)\n-82 {\n-83 return ::cholmod_allocate_dense(nrow,ncol,d,xtype,c);\n-84 }\n+_\b7_\b7 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+78 {\n+79 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+80 }\n+81\n+_\b8_\b3 virtual _\b~_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt () {}\n+84 };\n 85\n-86 [[nodiscard]]\n-87 static cholmod_sparse* allocate_sparse(size_t nrow, size_t ncol, size_t\n-nzmax, int sorted, int packed, int stype, int xtype, cholmod_common *c)\n-88 {\n-89 return ::cholmod_allocate_sparse\n-(nrow,ncol,nzmax,sorted,packed,stype,xtype,c);\n-90 }\n-91\n-92 [[nodiscard]]\n-93 static cholmod_factor* analyze(cholmod_sparse *A, cholmod_common *c)\n-94 {\n-95 return ::cholmod_analyze(A,c);\n-96 }\n-97\n-98 static int defaults(cholmod_common *c)\n+97 template\n+_\b9_\b8 class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt : public _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n 99 {\n-100 return ::cholmod_defaults(c);\n-101 }\n-102\n-103 static int factorize(cholmod_sparse *A, cholmod_factor *L, cholmod_common\n-*c)\n-104 {\n-105 return ::cholmod_factorize(A,L,c);\n-106 }\n-107\n-108 static int finish(cholmod_common *c)\n-109 {\n-110 return ::cholmod_finish(c);\n-111 }\n-112\n-113 static int free_dense (cholmod_dense **X, cholmod_common *c)\n-114 {\n-115 return ::cholmod_free_dense(X,c);\n-116 }\n-117\n-118 static int free_factor(cholmod_factor **L, cholmod_common *c)\n-119 {\n-120 return ::cholmod_free_factor(L,c);\n-121 }\n-122\n-123 static int free_sparse(cholmod_sparse **A, cholmod_common *c)\n-124 {\n-125 return ::cholmod_free_sparse(A,c);\n-126 }\n-127\n-128 [[nodiscard]]\n-129 static cholmod_dense* solve(int sys, cholmod_factor *L, cholmod_dense *B,\n-cholmod_common *c)\n-130 {\n-131 return ::cholmod_solve(sys,L,B,c);\n-132 }\n+100 public:\n+_\b1_\b0_\b5 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b1_\b0_\b7 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b1_\b0_\b8 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+_\b1_\b1_\b3 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n+114\n+_\b1_\b2_\b0 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (std::shared_ptr com,\n+_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by cat)\n+121 : _communication(com), _category(cat)\n+122 {}\n+123\n+_\b1_\b3_\b0 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& com, _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:\n+_\bC_\ba_\bt_\be_\bg_\bo_\br_\by cat)\n+131 : _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(stackobject_to_shared_ptr(com), cat)\n+132 {}\n 133\n-134 static int start(cholmod_common *c)\n-135 {\n-136 return ::cholmod_start(c);\n-137 }\n-138 };\n-139\n-140 // specialization using 'SuiteSparse_long' to store indices\n-141 template <>\n-142 struct CholmodMethodChooser\n-143 {\n-144 [[nodiscard]]\n-145 static cholmod_dense* allocate_dense(size_t nrow, size_t ncol, size_t d,\n-int xtype, cholmod_common *c)\n-146 {\n-147 return ::cholmod_l_allocate_dense(nrow,ncol,d,xtype,c);\n-148 }\n-149\n-150 [[nodiscard]]\n-151 static cholmod_sparse* allocate_sparse(size_t nrow, size_t ncol, size_t\n-nzmax, int sorted, int packed, int stype, int xtype, cholmod_common *c)\n-152 {\n-153 return ::cholmod_l_allocate_sparse\n-(nrow,ncol,nzmax,sorted,packed,stype,xtype,c);\n-154 }\n-155\n-156 [[nodiscard]]\n-157 static cholmod_factor* analyze(cholmod_sparse *A, cholmod_common *c)\n-158 {\n-159 return ::cholmod_l_analyze(A,c);\n-160 }\n-161\n-162 static int defaults(cholmod_common *c)\n-163 {\n-164 return ::cholmod_l_defaults(c);\n-165 }\n-166\n-167 static int factorize(cholmod_sparse *A, cholmod_factor *L, cholmod_common\n-*c)\n+134\n+_\b1_\b3_\b9 virtual _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bd_\bo_\bt (const X& x, const X& y) const override\n+140 {\n+141 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be result(0);\n+142 _communication->dot(x,y,result); // explicitly loop and apply masking\n+143 return result;\n+144 }\n+145\n+_\b1_\b4_\b9 virtual _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bn_\bo_\br_\bm (const X& x) const override\n+150 {\n+151 return _communication->norm(x);\n+152 }\n+153\n+_\b1_\b5_\b5 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const override\n+156 {\n+157 return _category;\n+158 }\n+159\n+160 private:\n+161 std::shared_ptr _communication;\n+162 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _category;\n+163 };\n+164\n+166 template\n+_\b1_\b6_\b7 class _\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt : public _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n 168 {\n-169 return ::cholmod_l_factorize(A,L,c);\n-170 }\n+169 using _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt::ScalarProduct;\n+170 };\n 171\n-172 static int finish(cholmod_common *c)\n-173 {\n-174 return ::cholmod_l_finish(c);\n-175 }\n-176\n-177 static int free_dense (cholmod_dense **X, cholmod_common *c)\n-178 {\n-179 return ::cholmod_l_free_dense(X,c);\n-180 }\n-181\n-182 static int free_factor (cholmod_factor **L, cholmod_common *c)\n-183 {\n-184 return ::cholmod_l_free_factor(L,c);\n-185 }\n-186\n-187 static int free_sparse(cholmod_sparse **A, cholmod_common *c)\n-188 {\n-189 return ::cholmod_l_free_sparse(A,c);\n-190 }\n-191\n-192 [[nodiscard]]\n-193 static cholmod_dense* solve(int sys, cholmod_factor *L, cholmod_dense *B,\n-cholmod_common *c)\n-194 {\n-195 return ::cholmod_l_solve(sys,L,B,c);\n-196 }\n-197\n-198 static int start(cholmod_common *c)\n-199 {\n-200 return ::cholmod_l_start(c);\n-201 }\n-202 };\n-203\n-204} //namespace Impl\n+177 template\n+_\b1_\b7_\b8 class _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt : public\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+179 {\n+180 public:\n+_\b1_\b8_\b1 _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (std::shared_ptr comm) :\n+182 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(comm,_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::nonoverlapping) {}\n+183\n+_\b1_\b8_\b4 _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const C& comm) :\n+185 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(comm,_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::nonoverlapping) {}\n+186 };\n+187\n+199 template\n+_\b2_\b0_\b0 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt : public _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+201 {\n+202 public:\n+_\b2_\b0_\b3 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (std::shared_ptr comm) :\n+204 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(comm, _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::overlapping) {}\n 205\n-214template\n-_\b2_\b1_\b5class _\bC_\bh_\bo_\bl_\bm_\bo_\bd : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-216{\n-217 static_assert(std::is_same_v || std::\n-is_same_v,\n-218 \"Index type must be either 'int' or 'SuiteSparse_long'!\");\n-219\n-220 using CholmodMethod = Impl::CholmodMethodChooser;\n-221\n-222public:\n-223\n-_\b2_\b2_\b9 _\bC_\bh_\bo_\bl_\bm_\bo_\bd()\n-230 {\n-231 CholmodMethod::start(&c_);\n-232 }\n-233\n-_\b2_\b3_\b9 _\b~_\bC_\bh_\bo_\bl_\bm_\bo_\bd()\n-240 {\n-241 if (L_)\n-242 CholmodMethod::free_factor(&L_, &c_);\n-243 CholmodMethod::finish(&c_);\n-244 }\n-245\n-246 // forbid copying to avoid freeing memory twice\n-_\b2_\b4_\b7 _\bC_\bh_\bo_\bl_\bm_\bo_\bd(const _\bC_\bh_\bo_\bl_\bm_\bo_\bd&) = delete;\n-_\b2_\b4_\b8 _\bC_\bh_\bo_\bl_\bm_\bo_\bd& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bC_\bh_\bo_\bl_\bm_\bo_\bd&) = delete;\n-249\n-250\n-_\b2_\b5_\b3 void _\ba_\bp_\bp_\bl_\by (Vector& x, Vector& b, [[maybe_unused]] double reduction,\n-_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n-254 {\n-255 _\ba_\bp_\bp_\bl_\by(x,b,res);\n-256 }\n-257\n-_\b2_\b6_\b3 void _\ba_\bp_\bp_\bl_\by(Vector& x, Vector& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n-264 {\n-265 // do nothing if N=0\n-266 if ( nIsZero_ )\n-267 {\n-268 return;\n-269 }\n-270\n-271 if (x.size() != b.size())\n-272 DUNE_THROW(Exception, \"Error in apply(): sizes of x and b do not match!\");\n-273\n-274 // cast to double array\n-275 auto b2 = std::make_unique(L_->n);\n-276 auto x2 = std::make_unique(L_->n);\n-277\n-278 // copy to cholmod\n-279 auto bp = b2.get();\n-280\n-281 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(b, [&](auto&& entry, auto&& flatIndex){\n-282 if ( subIndices_.empty() )\n-283 bp[ flatIndex ] = entry;\n-284 else\n-285 if( subIndices_[ flatIndex ] != std::numeric_limits::max() )\n-286 bp[ subIndices_[ flatIndex ] ] = entry;\n-287 });\n-288\n-289 // create a cholmod dense object\n-290 auto b3 = make_cholmod_dense(CholmodMethod::allocate_dense(L_->n, 1, L_->n,\n-CHOLMOD_REAL, &c_), &c_);\n-291\n-292 // cast because void-ptr\n-293 auto b4 = static_cast(b3->x);\n-294 std::copy(b2.get(), b2.get() + L_->n, b4);\n-295\n-296 // solve for a cholmod x object\n-297 auto x3 = make_cholmod_dense(CholmodMethod::solve(CHOLMOD_A, L_, b3.get(),\n-&c_), &c_);\n-298 // cast because void-ptr\n-299 auto xp = static_cast(x3->x);\n-300\n-301 // copy into x\n-302 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(x, [&](auto&& entry, auto&& flatIndex){\n-303 if ( subIndices_.empty() )\n-304 entry = xp[ flatIndex ];\n-305 else\n-306 if( subIndices_[ flatIndex ] != std::numeric_limits::max() )\n-307 entry = xp[ subIndices_[ flatIndex ] ];\n-308 });\n-309\n-310 // statistics for a direct solver\n-311 res._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 1;\n-312 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = true;\n-313 }\n-314\n-315\n-321 template\n-_\b3_\b2_\b2 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix)\n-323 {\n-324 const Impl::NoIgnore* noIgnore = nullptr;\n-325 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(matrix, noIgnore);\n-326 }\n-327\n-342 template\n-_\b3_\b4_\b3 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const Ignore* ignore)\n-344 {\n-345 // count the number of entries and diagonal entries\n-346 size_t nonZeros = 0;\n-347 size_t numberOfIgnoredDofs = 0;\n-348\n-349\n-350 auto [flatRows,flatCols] = _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh( matrix, [&](auto&& /*entry*/,\n-auto&& flatRowIndex, auto&& flatColIndex){\n-351 if( flatRowIndex <= flatColIndex )\n-352 nonZeros++;\n-353 });\n-354\n-355 std::vector flatIgnore;\n-356\n-357 if ( ignore )\n-358 {\n-359 Impl::copyToFlatVector(*ignore,flatIgnore);\n-360 numberOfIgnoredDofs = std::count(flatIgnore.begin(),flatIgnore.end(),true);\n-361 }\n-362\n-363 nIsZero_ = (size_t(flatRows) <= numberOfIgnoredDofs);\n-364\n-365 if ( nIsZero_ )\n-366 {\n-367 return;\n-368 }\n-369\n-370 // Total number of rows\n-371 size_t N = flatRows - numberOfIgnoredDofs;\n-372\n-373 /*\n-374 * CHOLMOD uses compressed-column sparse matrices, but for symmetric\n-375 * matrices this is the same as the compressed-row sparse matrix used\n-376 * by DUNE. So we can just store M\u00e1\u00b5\u0080 instead of M (as M = M\u00e1\u00b5\u0080).\n-377 */\n-378 const auto deleter = [c = &this->c_](auto* p) {\n-379 CholmodMethod::free_sparse(&p, c);\n-380 };\n-381 auto M = std::unique_ptr(\n-382 CholmodMethod::allocate_sparse(N, // # rows\n-383 N, // # cols\n-384 nonZeros, // # of nonzeroes\n-385 1, // indices are sorted ( 1 = true)\n-386 1, // matrix is \"packed\" ( 1 = true)\n-387 -1, // stype of matrix ( -1 = consider the lower part only )\n-388 CHOLMOD_REAL, // xtype of matrix ( CHOLMOD_REAL = single array, no complex\n-numbers)\n-389 &c_ // cholmod_common ptr\n-390 ), deleter);\n-391\n-392 // copy the data of BCRS matrix to Cholmod Sparse matrix\n-393 Index* Ap = static_cast(M->p);\n-394 Index* Ai = static_cast(M->i);\n-395 double* Ax = static_cast(M->x);\n-396\n-397\n-398 if ( ignore )\n-399 {\n-400 // init the mapping\n-401 subIndices_.resize(flatRows,std::numeric_limits::max());\n-402\n-403 std::size_t subIndexCounter = 0;\n-404\n-405 for ( std::size_t i=0; i flatColIndex )\n-424 return;\n-425\n-426 // ok, count the entry\n-427 auto idx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;\n-428 Ap[idx+1]++;\n-429\n-430 });\n-431\n-432 // now accumulate\n-433 Ap[0] = 0;\n-434 for ( size_t i=0; i rowPosition(N,0);\n-441\n-442 // now we can set the entries\n-443 _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&&\n-flatColIndex){\n-444\n-445 // stop if ignored\n-446 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) )\n-447 return;\n-448\n-449 // stop if in lower half\n-450 if ( flatRowIndex > flatColIndex )\n-451 return;\n-452\n-453 // ok, set the entry\n-454 auto rowIdx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;\n-455 auto colIdx = ignore ? subIndices_[flatColIndex] : flatColIndex;\n-456 auto rowStart = Ap[rowIdx];\n-457 auto rowPos = rowPosition[rowIdx];\n-458 Ai[ rowStart + rowPos ] = colIdx;\n-459 Ax[ rowStart + rowPos ] = entry;\n-460 rowPosition[rowIdx]++;\n-461\n-462 });\n-463\n-464 // Now analyse the pattern and optimal row order\n-465 L_ = CholmodMethod::analyze(M.get(), &c_);\n-466\n-467 // Do the factorization (this may take some time)\n-468 CholmodMethod::factorize(M.get(), L_, &c_);\n-469 }\n-470\n-_\b4_\b7_\b1 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-472 {\n-473 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-474 }\n-475\n-_\b4_\b8_\b1 cholmod_common& _\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\bo_\bm_\bm_\bo_\bn_\bO_\bb_\bj_\be_\bc_\bt()\n-482 {\n-483 return c_;\n-484 }\n-485\n-_\b4_\b9_\b1 cholmod_factor& _\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bF_\ba_\bc_\bt_\bo_\br()\n-492 {\n-493 return *L_;\n-494 }\n-495\n-_\b5_\b0_\b1 const cholmod_factor& _\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bF_\ba_\bc_\bt_\bo_\br() const\n-502 {\n-503 return *L_;\n-504 }\n-505private:\n-506\n-507 // create a std::unique_ptr to a cholmod_dense object with a deleter\n-508 // that calls the appropriate cholmod cleanup routine\n-509 auto make_cholmod_dense(cholmod_dense* x, cholmod_common* c)\n-510 {\n-511 const auto deleter = [c](auto* p) {\n-512 CholmodMethod::free_dense(&p, c);\n-513 };\n-514 return std::unique_ptr(x, deleter);\n-515 }\n-516\n-517 cholmod_common c_;\n-518 cholmod_factor* L_ = nullptr;\n-519\n-520 // indicator for a 0x0 problem (due to ignore dof's)\n-521 bool nIsZero_ = false;\n-522\n-523 // vector mapping all indices in flat order to the not ignored indices\n-524 std::vector subIndices_;\n-525};\n-526\n-_\b5_\b2_\b7 struct _\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br{\n-_\b5_\b2_\b8 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::false_type{};\n-_\b5_\b2_\b9 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk> : std::true_type\n-{};\n-_\b5_\b3_\b0 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk> : std::true_type\n-{};\n-531\n-532 template\n-533 std::shared_ptr::type,\n-534 typename Dune::TypeListElement<2, TL>::type>>\n-_\b5_\b3_\b5 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(TL /*tl*/, const M& _\bm_\ba_\bt, const Dune::ParameterTree& /*config*/,\n-536 std::enable_if_t<_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk::type::\n-block_type>::value,int> = 0) const\n-537 {\n-538 using D = typename Dune::TypeListElement<1, TL>::type;\n-539 auto solver = std::make_shared>();\n-540 solver->setMatrix(_\bm_\ba_\bt);\n-541 return solver;\n-542 }\n-543\n-544 // second version with SFINAE to validate the template parameters of\n-Cholmod\n-545 template\n-546 std::shared_ptr::type,\n-547 typename Dune::TypeListElement<2, TL>::type>>\n-_\b5_\b4_\b8 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /\n-*config*/,\n-549 std::enable_if_t::\n-type::block_type>::value,int> = 0) const\n-550 {\n-551 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be, \"Unsupported Type in Cholmod\");\n-552 }\n-553 };\n-_\b5_\b5_\b4 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"cholmod\", _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br());\n-555\n-556} /* namespace Dune */\n-557\n-558#endif // HAVE_SUITESPARSE_CHOLMOD\n-_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR\n-#define DUNE_REGISTER_DIRECT_SOLVER(name,...)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:13\n-_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implementation of the BCRSMatrix class.\n-_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n-Define general, extensible interface for inverse operators.\n-_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh\n-_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh\n+_\b2_\b0_\b6 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const C& comm) :\n+207 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(comm,_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::overlapping) {}\n+208 };\n+209\n+223 template\n+_\b2_\b2_\b4 std::shared_ptr> _\bm_\ba_\bk_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(std::shared_ptr comm, _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category)\n+225 {\n+226 switch(category)\n+227 {\n+228 case _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl:\n+229 return\n+230 std::make_shared>();\n+231 default:\n+232 return\n+233 std::make_shared>(comm,category);\n+234 }\n+235 }\n+236\n+241 template\n+_\b2_\b4_\b2 std::shared_ptr> _\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(const Comm& comm,\n+_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category)\n+243 { return makeScalarProduct(stackobject_to_shared_ptr(comm), category); }\n+244\n+245} // end namespace Dune\n+246\n+247#endif\n+_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n _\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n This file implements a vector space as a tensor product of a given vector\n space. The number of compon...\n-_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh\n-std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f,\n-std::size_t rowOffset=0, std::size_t colOffset=0)\n-Traverse a blocked matrix and call a functor at each scalar entry.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh\n-std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0)\n-Traverse a blocked vector and call a functor at each scalar entry.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd\n-Dune wrapper for SuiteSparse/CHOLMOD solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\bo_\bm_\bm_\bo_\bn_\bO_\bb_\bj_\be_\bc_\bt\n-cholmod_common & cholmodCommonObject()\n-return a reference to the CHOLMOD common object for advanced option settings\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:481\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-void setMatrix(const Matrix &matrix)\n-Set matrix without ignore nodes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:322\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bF_\ba_\bc_\bt_\bo_\br\n-cholmod_factor & cholmodFactor()\n-The CHOLMOD data structure that stores the factorization.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:491\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\b~_\bC_\bh_\bo_\bl_\bm_\bo_\bd\n-~Cholmod()\n-Destructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:239\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-Cholmod & operator=(const Cholmod &)=delete\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm,\n+SolverCategory::Category category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:242\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bk_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+std::shared_ptr< ScalarProduct< X > > makeScalarProduct(std::shared_ptr< const\n+Comm > comm, SolverCategory::Category category)\n+Choose the appropriate scalar product for a solver category.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:224\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Base class for scalar product and norm computation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bd_\bo_\bt\n+virtual field_type dot(const X &x, const X &y) const\n+Dot product of two vectors. It is assumed that the vectors are consistent on\n+the interior+border part...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n virtual SolverCategory::Category category() const\n-Category of the solver (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:471\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(Vector &x, Vector &b, InverseOperatorResult &res)\n-solve the linear system Ax=b (possibly with respect to some ignore field)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:263\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd\n-Cholmod(const Cholmod &)=delete\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bF_\ba_\bc_\bt_\bo_\br\n-const cholmod_factor & cholmodFactor() const\n-The CHOLMOD data structure that stores the factorization.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:501\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(Vector &x, Vector &b, double reduction, InverseOperatorResult &res)\n-simple forward to apply(X&, Y&, InverseOperatorResult&)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:253\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd\n-Cholmod()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:229\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-void setMatrix(const Matrix &matrix, const Ignore *ignore)\n-Set matrix and ignore nodes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:343\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:527\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL\n->::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const\n-M &mat, const Dune::ParameterTree &, std::enable_if_t< isValidBlock< typename\n-Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:535\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:528\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-A generic dynamic dense matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-Statistics about the application of an inverse operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n-int iterations\n-Number of iterations.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n-bool converged\n-True if convergence criterion has been met.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Abstract base class for all solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n+Category of the scalar product (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+export types, they come from the derived class\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\b~_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+virtual ~ScalarProduct()\n+every abstract base class has a virtual destructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< field_type >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bn_\bo_\br_\bm\n+virtual real_type norm(const X &x) const\n+Norm of a right-hand side vector. The vector must be consistent on the\n+interior+border partition.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Scalar product for overlapping Schwarz methods.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:99\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bd_\bo_\bt\n+virtual field_type dot(const X &x, const X &y) const override\n+Dot product of two vectors. It is assumed that the vectors are consistent on\n+the interior+border part...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:139\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const override\n+Category of the scalar product (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< field_type >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:108\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n+C communication_type\n+The type of the communication object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+ParallelScalarProduct(const communication_type &com, SolverCategory::Category\n+cat)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:130\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The type of the vector to compute the scalar product on.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:105\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+ParallelScalarProduct(std::shared_ptr< const communication_type > com,\n+SolverCategory::Category cat)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type used by the vector type domain_type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bn_\bo_\br_\bm\n+virtual real_type norm(const X &x) const override\n+Norm of a right-hand side vector. The vector must be consistent on the\n+interior+border partition.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Default implementation for the scalar case.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:168\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Nonoverlapping Scalar Product with communication object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:179\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+NonoverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:181\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+NonoverlappingSchwarzScalarProduct(const C &comm)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:184\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Scalar product for overlapping Schwarz methods.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:201\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+OverlappingSchwarzScalarProduct(std::shared_ptr< const C > comm)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:203\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+OverlappingSchwarzScalarProduct(const C &comm)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:206\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Categories for the solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:22\n _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n Category\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n @ sequential\n Category for sequential solvers.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00068.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00068.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixmatrix.hh File Reference\n+dune-istl: solvers.hh File Reference\n \n \n \n \n \n \n \n@@ -73,67 +73,109 @@\n \n \n \n
    \n \n-

    provides functions for sparse matrix matrix multiplication. \n+

    Implementations of the inverse operator interface. \n More...

    \n-
    #include <tuple>
    \n-#include <dune/istl/bcrsmatrix.hh>
    \n-#include <dune/common/fmatrix.hh>
    \n+
    #include <array>
    \n+#include <cmath>
    \n+#include <complex>
    \n+#include <iostream>
    \n+#include <memory>
    \n+#include <type_traits>
    \n+#include <vector>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/math.hh>
    \n+#include <dune/common/simd/io.hh>
    \n+#include <dune/common/simd/simd.hh>
    \n+#include <dune/common/std/type_traits.hh>
    \n #include <dune/common/timer.hh>
    \n+#include <dune/istl/allocator.hh>
    \n+#include <dune/istl/bcrsmatrix.hh>
    \n+#include <dune/istl/eigenvalue/arpackpp.hh>
    \n+#include <dune/istl/istlexception.hh>
    \n+#include <dune/istl/operators.hh>
    \n+#include <dune/istl/preconditioner.hh>
    \n+#include <dune/istl/scalarproducts.hh>
    \n+#include <dune/istl/solver.hh>
    \n+#include <dune/istl/solverregistry.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n+\n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n 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::LoopSolver< X >
     Preconditioned loop solver. More...
     
    struct  Dune::MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >
    class  Dune::GradientSolver< X >
     gradient method More...
     
    struct  Dune::MatMultMatResult< BCRSMatrix< FieldMatrix< T, n, k >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > >
    class  Dune::CGSolver< X >
     conjugate gradient method More...
     
    struct  Dune::TransposedMatMultMatResult< M1, M2 >
     Helper TMP to get the result type of a sparse matrix matrix multiplication ( \"$C=A*B$\") More...
    class  Dune::BiCGSTABSolver< X >
     Bi-conjugate Gradient Stabilized (BiCG-STAB) More...
     
    struct  Dune::TransposedMatMultMatResult< FieldMatrix< T, k, n >, FieldMatrix< T, k, m > >
    class  Dune::MINRESSolver< X >
     Minimal Residual Method (MINRES) More...
     
    struct  Dune::TransposedMatMultMatResult< BCRSMatrix< FieldMatrix< T, k, n >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > >
    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...
     
    \n \n \n \n

    \n Namespaces

    namespace  Dune
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n 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$\").
     
     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 >())
     
    \n

    Detailed Description

    \n-

    provides functions for sparse matrix matrix multiplication.

    \n-
    Author
    Markus Blatt
    \n+

    Implementations of the inverse operator interface.

    \n+

    This file provides various preconditioned Krylov methods.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,66 +1,104 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-matrixmatrix.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bS_\bp_\ba_\br_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bc_\bl_\ba_\bs_\bs_\be_\bs\n-provides functions for sparse matrix matrix multiplication. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-#include \n+solvers.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs\n+Implementations of the inverse operator interface. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n #include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\be_\bi_\bg_\be_\bn_\bv_\ba_\bl_\bu_\be_\b/_\ba_\br_\bp_\ba_\bc_\bk_\bp_\bp_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bM_\b1_\b,_\b _\bM_\b2_\b _\b>\n-\u00a0 Helper TMP to get the result type of a sparse matrix matrix\n- multiplication ( [$C=A*B$]) _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b _\b>\n+\u00a0 Preconditioned loop solver. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\br_\ba_\bd_\bi_\be_\bn_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b _\b>\n+\u00a0 gradient method _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b _\b>\n+\u00a0 conjugate gradient method _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bk_\b _\b>_\b,_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>\n- _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bC_\bG_\bS_\bT_\bA_\bB_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b _\b>\n+\u00a0 Bi-conjugate Gradient Stabilized (BiCG-STAB) _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bk_\b _\b>_\b,_\b _\bA_\b _\b>_\b,\n- _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b1_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bI_\bN_\bR_\bE_\bS_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b _\b>\n+\u00a0 Minimal Residual Method (MINRES) _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bM_\b1_\b,_\b _\bM_\b2_\b _\b>\n-\u00a0 Helper TMP to get the result type of a sparse matrix matrix\n- multiplication ( [$C=A*B$]) _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bF_\b _\b>\n+\u00a0 implements the Generalized Minimal Residual (GMRes) method _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bn_\b _\b>_\b,_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<\n- _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bl_\be_\bx_\bi_\bb_\bl_\be_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bF_\b _\b>\n+\u00a0 implements the Flexible Generalized Minimal Residual (FGMRes) method\n+ (right preconditioned) _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bn_\b _\b>_\b,\n- _\bA_\b _\b>_\b,_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b1_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b _\b>\n+\u00a0 Generalized preconditioned conjugate gradient solver. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b _\b>\n+\u00a0 Accelerated flexible conjugate gradient method. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bl_\be_\bt_\be_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b _\b>\n+\u00a0 Complete flexible conjugate gradient method. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt (_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, n, k >, A > &res,\n- const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, n, m >, A1 > &_\bm_\ba_\bt, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, k, m >, A2 > &matt, bool tryHard=false)\n-\u00a0 Calculate product of a sparse matrix with a transposed sparse matrices (\n- [$C=A*B^T$]).\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt (_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, n, m >, A > &res, const\n- _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, n, k >, A1 > &_\bm_\ba_\bt, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, k, m >, A2 > &matt, bool tryHard=false)\n-\u00a0 Calculate product of two sparse matrices ( [$C=A*B$]).\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt (_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, n, m >, A > &res,\n- const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, k, n >, A1 > &_\bm_\ba_\bt, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< T, k, m >, A2 > &matt, bool tryHard=false)\n-\u00a0 Calculate product of a transposed sparse matrix with another sparse\n- matrices ( [$C=A^T*B$]).\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"loopsolver\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bo_\bl_\bv_\be_\br >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"gradientsolver\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bG_\br_\ba_\bd_\bi_\be_\bn_\bt_\bS_\bo_\bl_\bv_\be_\br >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"cgsolver\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"bicgstabsolver\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bC_\bG_\bS_\bT_\bA_\bB_\bS_\bo_\bl_\bv_\be_\br >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"minressolver\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bI_\bN_\bR_\bE_\bS_\bS_\bo_\bl_\bv_\be_\br >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"restartedgmressolver\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"restartedflexiblegmressolver\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bl_\be_\bx_\bi_\bb_\bl_\be_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"generalizedpcgsolver\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"restartedfcgsolver\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"completefcgsolver\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bl_\be_\bt_\be_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br >())\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-provides functions for sparse matrix matrix multiplication.\n- Author\n- Markus Blatt\n+Implementations of the inverse operator interface.\n+This file provides various preconditioned Krylov methods.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00068_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00068_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixmatrix.hh Source File\n+dune-istl: solvers.hh Source File\n \n \n \n \n \n \n \n@@ -74,622 +74,1669 @@\n \n
    \n \n
    \n
    \n
    \n-
    matrixmatrix.hh
    \n+
    solvers.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_MATRIXMATRIX_HH
    \n-
    6#define DUNE_ISTL_MATRIXMATRIX_HH
    \n-
    7
    \n-
    8#include <tuple>
    \n-
    9
    \n-\n-
    11#include <dune/common/fmatrix.hh>
    \n-
    12#include <dune/common/timer.hh>
    \n-
    13namespace Dune
    \n-
    14{
    \n-
    15
    \n-
    26 namespace
    \n-
    27 {
    \n-
    28
    \n-
    37 template<int b>
    \n-
    38 struct NonzeroPatternTraverser
    \n-
    39 {};
    \n-
    40
    \n-
    41
    \n-
    42 template<>
    \n-
    43 struct NonzeroPatternTraverser<0>
    \n-
    44 {
    \n-
    45 template<class T,class A1, class A2, class F, int n, int m, int k>
    \n-
    46 static void traverse(const Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>& A,
    \n-\n-
    48 F& func)
    \n-
    49 {
    \n-
    50 if(A.M()!=B.N())
    \n-
    51 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<A.M()<<"!="<<B.N());
    \n-
    52
    \n-
    53 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>::ConstRowIterator Row;
    \n-
    54 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>::ConstColIterator Col;
    \n-
    55 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>::ConstColIterator BCol;
    \n-
    56 for(Row row= A.begin(); row != A.end(); ++row) {
    \n-
    57 // Loop over all column entries
    \n-
    58 for(Col col = row->begin(); col != row->end(); ++col) {
    \n-
    59 // entry at i,k
    \n-
    60 // search for all nonzeros in row k
    \n-
    61 for(BCol bcol = B[col.index()].begin(); bcol != B[col.index()].end(); ++bcol) {
    \n-
    62 func(*col, *bcol, row.index(), bcol.index());
    \n-
    63 }
    \n-
    64 }
    \n-
    65 }
    \n-
    66 }
    \n-
    67
    \n-
    68 };
    \n-
    69
    \n-
    70 template<>
    \n-
    71 struct NonzeroPatternTraverser<1>
    \n-
    72 {
    \n-
    73 template<class T, class A1, class A2, class F, int n, int m, int k>
    \n-
    74 static void traverse(const Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>& A,
    \n-\n-
    76 F& func)
    \n-
    77 {
    \n-
    78
    \n-
    79 if(A.N()!=B.N())
    \n-
    80 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<A.N()<<"!="<<B.N());
    \n-
    81
    \n-
    82 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>::ConstRowIterator Row;
    \n-
    83 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>::ConstColIterator Col;
    \n-
    84 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>::ConstColIterator BCol;
    \n-
    85
    \n-
    86 for(Row row=A.begin(); row!=A.end(); ++row) {
    \n-
    87 for(Col col=row->begin(); col!=row->end(); ++col) {
    \n-
    88 for(BCol bcol = B[row.index()].begin(); bcol != B[row.index()].end(); ++bcol) {
    \n-
    89 func(*col, *bcol, col.index(), bcol.index());
    \n-
    90 }
    \n-
    91 }
    \n-
    92 }
    \n-
    93 }
    \n-
    94 };
    \n-
    95
    \n-
    96 template<>
    \n-
    97 struct NonzeroPatternTraverser<2>
    \n-
    98 {
    \n-
    99 template<class T, class A1, class A2, class F, int n, int m, int k>
    \n-
    100 static void traverse(const BCRSMatrix<FieldMatrix<T,n,m>,A1>& mat,
    \n-
    101 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt,
    \n-
    102 F& func)
    \n-
    103 {
    \n-
    104 if(mat.M()!=matt.M())
    \n-
    105 DUNE_THROW(ISTLError, "The sizes of the matrices do not match: "<<mat.M()<<"!="<<matt.M());
    \n-
    106
    \n-
    107 typedef typename BCRSMatrix<FieldMatrix<T,n,m>,A1>::ConstRowIterator row_iterator;
    \n-
    108 typedef typename BCRSMatrix<FieldMatrix<T,n,m>,A1>::ConstColIterator col_iterator;
    \n-
    109 typedef typename BCRSMatrix<FieldMatrix<T,k,m>,A2>::ConstRowIterator row_iterator_t;
    \n-
    110 typedef typename BCRSMatrix<FieldMatrix<T,k,m>,A2>::ConstColIterator col_iterator_t;
    \n-
    111
    \n-
    112 for(row_iterator mrow=mat.begin(); mrow != mat.end(); ++mrow) {
    \n-
    113 //iterate over the column entries
    \n-
    114 // mt is a transposed matrix crs therefore it is treated as a ccs matrix
    \n-
    115 // and the row_iterator iterates over the columns of the transposed matrix.
    \n-
    116 // search the row of the transposed matrix for an entry with the same index
    \n-
    117 // as the mcol iterator
    \n-
    118
    \n-
    119 for(row_iterator_t mtcol=matt.begin(); mtcol != matt.end(); ++mtcol) {
    \n-
    120 //Search for col entries in mat that have a corresponding row index in matt
    \n-
    121 // (i.e. corresponding col index in the as this is the transposed matrix
    \n-
    122 col_iterator_t mtrow=mtcol->begin();
    \n-
    123 bool funcCalled = false;
    \n-
    124 for(col_iterator mcol=mrow->begin(); mcol != mrow->end(); ++mcol) {
    \n-
    125 // search
    \n-
    126 // TODO: This should probably be substituted by a binary search
    \n-
    127 for( ; mtrow != mtcol->end(); ++mtrow)
    \n-
    128 if(mtrow.index()>=mcol.index())
    \n-
    129 break;
    \n-
    130 if(mtrow != mtcol->end() && mtrow.index()==mcol.index()) {
    \n-
    131 func(*mcol, *mtrow, mtcol.index());
    \n-
    132 funcCalled = true;
    \n-
    133 // In some cases we only search for one pair, then we break here
    \n-
    134 // and continue with the next column.
    \n-
    135 if(F::do_break)
    \n-
    136 break;
    \n-
    137 }
    \n-
    138 }
    \n-
    139 // move on with func only if func was called, otherwise they might
    \n-
    140 // get out of sync
    \n-
    141 if (funcCalled)
    \n-
    142 func.nextCol();
    \n-
    143 }
    \n-
    144 func.nextRow();
    \n-
    145 }
    \n-
    146 }
    \n-
    147 };
    \n+
    5
    \n+
    6#ifndef DUNE_ISTL_SOLVERS_HH
    \n+
    7#define DUNE_ISTL_SOLVERS_HH
    \n+
    8
    \n+
    9#include <array>
    \n+
    10#include <cmath>
    \n+
    11#include <complex>
    \n+
    12#include <iostream>
    \n+
    13#include <memory>
    \n+
    14#include <type_traits>
    \n+
    15#include <vector>
    \n+
    16
    \n+
    17#include <dune/common/exceptions.hh>
    \n+
    18#include <dune/common/math.hh>
    \n+
    19#include <dune/common/simd/io.hh>
    \n+
    20#include <dune/common/simd/simd.hh>
    \n+
    21#include <dune/common/std/type_traits.hh>
    \n+
    22#include <dune/common/timer.hh>
    \n+
    23
    \n+\n+\n+\n+\n+\n+\n+\n+
    31#include <dune/istl/solver.hh>
    \n+\n+
    33
    \n+
    34namespace Dune {
    \n+
    46 //=====================================================================
    \n+
    47 // Implementation of this interface
    \n+
    48 //=====================================================================
    \n+
    49
    \n+
    58 template<class X>
    \n+
    \n+
    59 class LoopSolver : public IterativeSolver<X,X> {
    \n+
    60 public:
    \n+\n+\n+\n+\n+
    65
    \n+
    66 // copy base class constructors
    \n+
    67 using IterativeSolver<X,X>::IterativeSolver;
    \n+
    68
    \n+
    69 // don't shadow four-argument version of apply defined in the base class
    \n+
    70 using IterativeSolver<X,X>::apply;
    \n+
    71
    \n+
    \n+
    73 virtual void apply (X& x, X& b, InverseOperatorResult& res)
    \n+
    74 {
    \n+
    75 Iteration iteration(*this, res);
    \n+
    76 _prec->pre(x,b);
    \n+
    77
    \n+
    78 // overwrite b with defect
    \n+
    79 _op->applyscaleadd(-1,x,b);
    \n+
    80
    \n+
    81 // compute norm, \\todo parallelization
    \n+
    82 real_type def = _sp->norm(b);
    \n+
    83 if(iteration.step(0, def)){
    \n+
    84 _prec->post(x);
    \n+
    85 return;
    \n+
    86 }
    \n+
    87 // prepare preconditioner
    \n+
    88
    \n+
    89 // allocate correction vector
    \n+
    90 X v(x);
    \n+
    91
    \n+
    92 // iteration loop
    \n+
    93 int i=1;
    \n+
    94 for ( ; i<=_maxit; i++ )
    \n+
    95 {
    \n+
    96 v = 0; // clear correction
    \n+
    97 _prec->apply(v,b); // apply preconditioner
    \n+
    98 x += v; // update solution
    \n+
    99 _op->applyscaleadd(-1,v,b); // update defect
    \n+
    100 def=_sp->norm(b); // comp defect norm
    \n+
    101 if(iteration.step(i, def))
    \n+
    102 break;
    \n+
    103 }
    \n+
    104
    \n+
    105 // postprocess preconditioner
    \n+
    106 _prec->post(x);
    \n+
    107 }
    \n+
    \n+
    108
    \n+
    109 protected:
    \n+
    110 using IterativeSolver<X,X>::_op;
    \n+
    111 using IterativeSolver<X,X>::_prec;
    \n+
    112 using IterativeSolver<X,X>::_sp;
    \n+\n+
    114 using IterativeSolver<X,X>::_maxit;
    \n+
    115 using IterativeSolver<X,X>::_verbose;
    \n+\n+
    117 };
    \n+
    \n+
    118 DUNE_REGISTER_ITERATIVE_SOLVER("loopsolver", defaultIterativeSolverCreator<Dune::LoopSolver>());
    \n+
    119
    \n+
    120
    \n+
    121 // all these solvers are taken from the SUMO library
    \n+
    123 template<class X>
    \n+
    \n+
    124 class GradientSolver : public IterativeSolver<X,X> {
    \n+
    125 public:
    \n+\n+\n+\n+
    129 using typename IterativeSolver<X,X>::real_type;
    \n+
    130
    \n+
    131 // copy base class constructors
    \n+
    132 using IterativeSolver<X,X>::IterativeSolver;
    \n+
    133
    \n+
    134 // don't shadow four-argument version of apply defined in the base class
    \n+
    135 using IterativeSolver<X,X>::apply;
    \n+
    136
    \n+
    \n+
    142 virtual void apply (X& x, X& b, InverseOperatorResult& res)
    \n+
    143 {
    \n+
    144 Iteration iteration(*this, res);
    \n+
    145 _prec->pre(x,b); // prepare preconditioner
    \n+
    146
    \n+
    147 _op->applyscaleadd(-1,x,b); // overwrite b with defec
    \n
    148
    \n-
    149
    \n-
    150
    \n-
    151 template<class T, class A, int n, int m>
    \n-
    152 class SparsityPatternInitializer
    \n-
    153 {
    \n-
    154 public:
    \n-
    155 enum {do_break=true};
    \n-\n-\n-
    158
    \n-
    159 SparsityPatternInitializer(CreateIterator iter)
    \n-
    160 : rowiter(iter)
    \n-
    161 {}
    \n-
    162
    \n-
    163 template<class T1, class T2>
    \n-
    164 void operator()(const T1&, const T2&, size_type j)
    \n-
    165 {
    \n-
    166 rowiter.insert(j);
    \n-
    167 }
    \n-
    168
    \n-
    169 void nextRow()
    \n-
    170 {
    \n-
    171 ++rowiter;
    \n-
    172 }
    \n-
    173 void nextCol()
    \n-
    174 {}
    \n-
    175
    \n-
    176 private:
    \n-
    177 CreateIterator rowiter;
    \n-
    178 };
    \n+
    149 real_type def = _sp->norm(b); // compute norm
    \n+
    150 if(iteration.step(0, def)){
    \n+
    151 _prec->post(x);
    \n+
    152 return;
    \n+
    153 }
    \n+
    154
    \n+
    155 X p(x); // create local vectors
    \n+
    156 X q(b);
    \n+
    157
    \n+
    158 int i=1; // loop variables
    \n+
    159 field_type lambda;
    \n+
    160 for ( ; i<=_maxit; i++ )
    \n+
    161 {
    \n+
    162 p = 0; // clear correction
    \n+
    163 _prec->apply(p,b); // apply preconditioner
    \n+
    164 _op->apply(p,q); // q=Ap
    \n+
    165 auto alpha = _sp->dot(q,p);
    \n+
    166 lambda = Simd::cond(def==field_type(0.),
    \n+
    167 field_type(0.), // no need for minimization if def is already 0
    \n+
    168 _sp->dot(p,b)/alpha); // minimization
    \n+
    169 x.axpy(lambda,p); // update solution
    \n+
    170 b.axpy(-lambda,q); // update defect
    \n+
    171
    \n+
    172 def =_sp->norm(b); // comp defect norm
    \n+
    173 if(iteration.step(i, def))
    \n+
    174 break;
    \n+
    175 }
    \n+
    176 // postprocess preconditioner
    \n+
    177 _prec->post(x);
    \n+
    178 }
    \n+
    \n
    179
    \n-
    180
    \n-
    181 template<int transpose, class T, class TA, int n, int m>
    \n-
    182 class MatrixInitializer
    \n-
    183 {
    \n-
    184 public:
    \n-
    185 enum {do_break=true};
    \n-\n-\n-
    188 typedef typename Matrix::size_type size_type;
    \n-
    189
    \n-
    190 MatrixInitializer(Matrix& A_, size_type)
    \n-
    191 : count(0), A(A_)
    \n-
    192 {}
    \n-
    193 template<class T1, class T2>
    \n-
    194 void operator()(const T1&, const T2&, int)
    \n-
    195 {
    \n-
    196 ++count;
    \n-
    197 }
    \n-
    198
    \n-
    199 void nextCol()
    \n-
    200 {}
    \n-
    201
    \n-
    202 void nextRow()
    \n-
    203 {}
    \n-
    204
    \n-
    205 std::size_t nonzeros()
    \n-
    206 {
    \n-
    207 return count;
    \n-
    208 }
    \n+
    180 protected:
    \n+
    181 using IterativeSolver<X,X>::_op;
    \n+
    182 using IterativeSolver<X,X>::_prec;
    \n+
    183 using IterativeSolver<X,X>::_sp;
    \n+\n+
    185 using IterativeSolver<X,X>::_maxit;
    \n+
    186 using IterativeSolver<X,X>::_verbose;
    \n+\n+
    188 };
    \n+
    \n+
    189 DUNE_REGISTER_ITERATIVE_SOLVER("gradientsolver", defaultIterativeSolverCreator<Dune::GradientSolver>());
    \n+
    190
    \n+
    192 template<class X>
    \n+
    \n+
    193 class CGSolver : public IterativeSolver<X,X> {
    \n+
    194 public:
    \n+\n+\n+\n+
    198 using typename IterativeSolver<X,X>::real_type;
    \n+
    199
    \n+
    200 // copy base class constructors
    \n+
    201 using IterativeSolver<X,X>::IterativeSolver;
    \n+
    202
    \n+
    203 private:
    \n+\n+
    205
    \n+
    206 protected:
    \n+
    207
    \n+
    208 static constexpr bool enableConditionEstimate = (std::is_same_v<field_type,float> || std::is_same_v<field_type,double>);
    \n
    209
    \n-
    210 template<class A1, class A2, int n2, int m2, int n3, int m3>
    \n-
    211 void initPattern(const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>& mat1,
    \n-
    212 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>& mat2)
    \n-
    213 {
    \n-
    214 SparsityPatternInitializer<T, TA, n, m> sparsity(A.createbegin());
    \n-
    215 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,sparsity);
    \n-
    216 }
    \n-
    217
    \n-
    218 private:
    \n-
    219 std::size_t count;
    \n-
    220 Matrix& A;
    \n-
    221 };
    \n-
    222
    \n-
    223 template<class T, class TA, int n, int m>
    \n-
    224 class MatrixInitializer<1,T,TA,n,m>
    \n+
    210 public:
    \n+
    211
    \n+
    212 // don't shadow four-argument version of apply defined in the base class
    \n+
    213 using IterativeSolver<X,X>::apply;
    \n+
    214
    \n+
    \n+\n+
    223 scalar_real_type reduction, int maxit, int verbose, bool condition_estimate) : IterativeSolver<X,X>(op, prec, reduction, maxit, verbose),
    \n+
    224 condition_estimate_(condition_estimate)
    \n
    225 {
    \n-
    226 public:
    \n-
    227 enum {do_break=false};
    \n-\n-\n-
    230 typedef typename Matrix::size_type size_type;
    \n+
    226 if (condition_estimate && !enableConditionEstimate) {
    \n+
    227 condition_estimate_ = false;
    \n+
    228 std::cerr << "WARNING: Condition estimate was disabled. It is only available for double and float field types!" << std::endl;
    \n+
    229 }
    \n+
    230 }
    \n+
    \n
    231
    \n-
    232 MatrixInitializer(Matrix& A_, size_type rows)
    \n-
    233 : A(A_), entries(rows)
    \n-
    234 {}
    \n-
    235
    \n-
    236 template<class T1, class T2>
    \n-
    237 void operator()(const T1&, const T2&, size_type i, size_type j)
    \n-
    238 {
    \n-
    239 entries[i].insert(j);
    \n-
    240 }
    \n-
    241
    \n-
    242 void nextCol()
    \n-
    243 {}
    \n-
    244
    \n-
    245 size_type nonzeros()
    \n-
    246 {
    \n-
    247 size_type nnz=0;
    \n-
    248 typedef typename std::vector<std::set<size_t> >::const_iterator Iter;
    \n-
    249 for(Iter iter = entries.begin(); iter != entries.end(); ++iter)
    \n-
    250 nnz+=(*iter).size();
    \n-
    251 return nnz;
    \n-
    252 }
    \n-
    253 template<class A1, class A2, int n2, int m2, int n3, int m3>
    \n-
    254 void initPattern(const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>&,
    \n-
    255 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>&)
    \n-
    256 {
    \n-
    257 typedef typename std::vector<std::set<size_t> >::const_iterator Iter;
    \n-
    258 CreateIterator citer = A.createbegin();
    \n-
    259 for(Iter iter = entries.begin(); iter != entries.end(); ++iter, ++citer) {
    \n-
    260 typedef std::set<size_t>::const_iterator SetIter;
    \n-
    261 for(SetIter index=iter->begin(); index != iter->end(); ++index)
    \n-
    262 citer.insert(*index);
    \n-
    263 }
    \n-
    264 }
    \n-
    265
    \n-
    266 private:
    \n-
    267 Matrix& A;
    \n-
    268 std::vector<std::set<size_t> > entries;
    \n-
    269 };
    \n-
    270
    \n-
    271 template<class T, class TA, int n, int m>
    \n-
    272 struct MatrixInitializer<0,T,TA,n,m>
    \n-
    273 : public MatrixInitializer<1,T,TA,n,m>
    \n-
    274 {
    \n-
    275 MatrixInitializer(Dune::BCRSMatrix<Dune::FieldMatrix<T,n,m>,TA>& A_,
    \n-\n-
    277 : MatrixInitializer<1,T,TA,n,m>(A_,rows)
    \n-
    278 {}
    \n-
    279 };
    \n-
    280
    \n-
    281
    \n-
    282 template<class T, class T1, class T2, int n, int m, int k>
    \n-
    283 void addMatMultTransposeMat(FieldMatrix<T,n,k>& res, const FieldMatrix<T1,n,m>& mat,
    \n-
    284 const FieldMatrix<T2,k,m>& matt)
    \n-
    285 {
    \n-
    286 typedef typename FieldMatrix<T,n,k>::size_type size_type;
    \n-
    287
    \n-
    288 for(size_type row=0; row<n; ++row)
    \n-
    289 for(size_type col=0; col<k; ++col) {
    \n-
    290 for(size_type i=0; i < m; ++i)
    \n-
    291 res[row][col]+=mat[row][i]*matt[col][i];
    \n-
    292 }
    \n-
    293 }
    \n+
    \n+\n+
    240 scalar_real_type reduction, int maxit, int verbose, bool condition_estimate) : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose),
    \n+
    241 condition_estimate_(condition_estimate)
    \n+
    242 {
    \n+
    243 if (condition_estimate && !(std::is_same<field_type,float>::value || std::is_same<field_type,double>::value)) {
    \n+
    244 condition_estimate_ = false;
    \n+
    245 std::cerr << "WARNING: Condition estimate was disabled. It is only available for double and float field types!" << std::endl;
    \n+
    246 }
    \n+
    247 }
    \n+
    \n+
    248
    \n+
    \n+
    256 CGSolver (std::shared_ptr<const LinearOperator<X,X>> op, std::shared_ptr<ScalarProduct<X>> sp,
    \n+
    257 std::shared_ptr<Preconditioner<X,X>> prec,
    \n+
    258 scalar_real_type reduction, int maxit, int verbose, bool condition_estimate)
    \n+
    259 : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose),
    \n+
    260 condition_estimate_(condition_estimate)
    \n+
    261 {
    \n+
    262 if (condition_estimate && !(std::is_same<field_type,float>::value || std::is_same<field_type,double>::value)) {
    \n+
    263 condition_estimate_ = false;
    \n+
    264 std::cerr << "WARNING: Condition estimate was disabled. It is only available for double and float field types!" << std::endl;
    \n+
    265 }
    \n+
    266 }
    \n+
    \n+
    267
    \n+
    \n+
    279 virtual void apply (X& x, X& b, InverseOperatorResult& res)
    \n+
    280 {
    \n+
    281 Iteration iteration(*this,res);
    \n+
    282 _prec->pre(x,b); // prepare preconditioner
    \n+
    283
    \n+
    284 _op->applyscaleadd(-1,x,b); // overwrite b with defect
    \n+
    285
    \n+
    286 real_type def = _sp->norm(b); // compute norm
    \n+
    287 if(iteration.step(0, def)){
    \n+
    288 _prec->post(x);
    \n+
    289 return;
    \n+
    290 }
    \n+
    291
    \n+
    292 X p(x); // the search direction
    \n+
    293 X q(x); // a temporary vector
    \n
    294
    \n-
    295 template<class T, class T1, class T2, int n, int m, int k>
    \n-
    296 void addTransposeMatMultMat(FieldMatrix<T,n,k>& res, const FieldMatrix<T1,m,n>& mat,
    \n-
    297 const FieldMatrix<T2,m,k>& matt)
    \n-
    298 {
    \n-
    299 typedef typename FieldMatrix<T,n,k>::size_type size_type;
    \n-
    300 for(size_type i=0; i<m; ++i)
    \n-
    301 for(size_type row=0; row<n; ++row) {
    \n-
    302 for(size_type col=0; col < k; ++col)
    \n-
    303 res[row][col]+=mat[i][row]*matt[i][col];
    \n-
    304 }
    \n-
    305 }
    \n+
    295 // Remember lambda and beta values for condition estimate
    \n+
    296 std::vector<real_type> lambdas(0);
    \n+
    297 std::vector<real_type> betas(0);
    \n+
    298
    \n+
    299 // some local variables
    \n+
    300 field_type rho,rholast,lambda,alpha,beta;
    \n+
    301
    \n+
    302 // determine initial search direction
    \n+
    303 p = 0; // clear correction
    \n+
    304 _prec->apply(p,b); // apply preconditioner
    \n+
    305 rholast = _sp->dot(p,b); // orthogonalization
    \n
    306
    \n-
    307 template<class T, class T1, class T2, int n, int m, int k>
    \n-
    308 void addMatMultMat(FieldMatrix<T,n,m>& res, const FieldMatrix<T1,n,k>& mat,
    \n-
    309 const FieldMatrix<T2,k,m>& matt)
    \n-
    310 {
    \n-
    311 typedef typename FieldMatrix<T,n,k>::size_type size_type;
    \n-
    312 for(size_type row=0; row<n; ++row)
    \n-
    313 for(size_type col=0; col<m; ++col) {
    \n-
    314 for(size_type i=0; i < k; ++i)
    \n-
    315 res[row][col]+=mat[row][i]*matt[i][col];
    \n-
    316 }
    \n-
    317 }
    \n-
    318
    \n-
    319
    \n-
    320 template<class T, class A, int n, int m>
    \n-
    321 class EntryAccumulatorFather
    \n-
    322 {
    \n-
    323 public:
    \n-
    324 enum {do_break=false};
    \n-\n-
    326 typedef typename Matrix::RowIterator Row;
    \n-
    327 typedef typename Matrix::ColIterator Col;
    \n-
    328
    \n-
    329 EntryAccumulatorFather(Matrix& mat_)
    \n-
    330 : mat(mat_), row(mat.begin())
    \n-
    331 {
    \n-
    332 mat=0;
    \n-
    333 col=row->begin();
    \n-
    334 }
    \n-
    335 void nextRow()
    \n-
    336 {
    \n-
    337 ++row;
    \n-
    338 if(row!=mat.end())
    \n-
    339 col=row->begin();
    \n-
    340 }
    \n-
    341
    \n-
    342 void nextCol()
    \n-
    343 {
    \n-
    344 ++this->col;
    \n-
    345 }
    \n-
    346 protected:
    \n-
    347 Matrix& mat;
    \n-
    348 private:
    \n-
    349 Row row;
    \n-
    350 protected:
    \n-\n-
    352 };
    \n-
    353
    \n-
    354 template<class T, class A, int n, int m, int transpose>
    \n-
    355 class EntryAccumulator
    \n-
    356 : public EntryAccumulatorFather<T,A,n,m>
    \n-
    357 {
    \n-
    358 public:
    \n-\n-
    360 typedef typename Matrix::size_type size_type;
    \n-
    361
    \n-
    362 EntryAccumulator(Matrix& mat_)
    \n-
    363 : EntryAccumulatorFather<T,A,n,m>(mat_)
    \n-
    364 {}
    \n-
    365
    \n-
    366 template<class T1, class T2>
    \n-
    367 void operator()(const T1& t1, const T2& t2, size_type i)
    \n-
    368 {
    \n-
    369 assert(this->col.index()==i);
    \n-
    370 addMatMultMat(*(this->col),t1,t2);
    \n-
    371 }
    \n-
    372 };
    \n+
    307 // the loop
    \n+
    308 int i=1;
    \n+
    309 for ( ; i<=_maxit; i++ )
    \n+
    310 {
    \n+
    311 // minimize in given search direction p
    \n+
    312 _op->apply(p,q); // q=Ap
    \n+
    313 alpha = _sp->dot(p,q); // scalar product
    \n+
    314 lambda = Simd::cond(def==field_type(0.), field_type(0.), rholast/alpha); // minimization
    \n+
    315 if constexpr (enableConditionEstimate)
    \n+
    316 if (condition_estimate_)
    \n+
    317 lambdas.push_back(std::real(lambda));
    \n+
    318 x.axpy(lambda,p); // update solution
    \n+
    319 b.axpy(-lambda,q); // update defect
    \n+
    320
    \n+
    321 // convergence test
    \n+
    322 def=_sp->norm(b); // comp defect norm
    \n+
    323 if(iteration.step(i, def))
    \n+
    324 break;
    \n+
    325
    \n+
    326 // determine new search direction
    \n+
    327 q = 0; // clear correction
    \n+
    328 _prec->apply(q,b); // apply preconditioner
    \n+
    329 rho = _sp->dot(q,b); // orthogonalization
    \n+
    330 beta = Simd::cond(def==field_type(0.), field_type(0.), rho/rholast); // scaling factor
    \n+
    331 if constexpr (enableConditionEstimate)
    \n+
    332 if (condition_estimate_)
    \n+
    333 betas.push_back(std::real(beta));
    \n+
    334 p *= beta; // scale old search direction
    \n+
    335 p += q; // orthogonalization with correction
    \n+
    336 rholast = rho; // remember rho for recurrence
    \n+
    337 }
    \n+
    338
    \n+
    339 _prec->post(x); // postprocess preconditioner
    \n+
    340
    \n+
    341 if (condition_estimate_) {
    \n+
    342#if HAVE_ARPACKPP
    \n+
    343 if constexpr (enableConditionEstimate) {
    \n+
    344 using std::sqrt;
    \n+
    345
    \n+
    346 // Build T matrix which has extreme eigenvalues approximating
    \n+
    347 // those of the original system
    \n+
    348 // (see Y. Saad, Iterative methods for sparse linear systems)
    \n+
    349
    \n+\n+
    351
    \n+
    352 for (auto row = T.createbegin(); row != T.createend(); ++row) {
    \n+
    353 if (row.index() > 0)
    \n+
    354 row.insert(row.index()-1);
    \n+
    355 row.insert(row.index());
    \n+
    356 if (row.index() < T.N() - 1)
    \n+
    357 row.insert(row.index()+1);
    \n+
    358 }
    \n+
    359 for (int row = 0; row < i; ++row) {
    \n+
    360 if (row > 0) {
    \n+
    361 T[row][row-1] = sqrt(betas[row-1]) / lambdas[row-1];
    \n+
    362 }
    \n+
    363
    \n+
    364 T[row][row] = 1.0 / lambdas[row];
    \n+
    365 if (row > 0) {
    \n+
    366 T[row][row] += betas[row-1] / lambdas[row-1];
    \n+
    367 }
    \n+
    368
    \n+
    369 if (row < i - 1) {
    \n+
    370 T[row][row+1] = sqrt(betas[row]) / lambdas[row];
    \n+
    371 }
    \n+
    372 }
    \n
    373
    \n-
    374 template<class T, class A, int n, int m>
    \n-
    375 class EntryAccumulator<T,A,n,m,0>
    \n-
    376 : public EntryAccumulatorFather<T,A,n,m>
    \n-
    377 {
    \n-
    378 public:
    \n-\n-
    380 typedef typename Matrix::size_type size_type;
    \n-
    381
    \n-
    382 EntryAccumulator(Matrix& mat_)
    \n-
    383 : EntryAccumulatorFather<T,A,n,m>(mat_)
    \n-
    384 {}
    \n-
    385
    \n-
    386 template<class T1, class T2>
    \n-
    387 void operator()(const T1& t1, const T2& t2, size_type i, size_type j)
    \n-
    388 {
    \n-
    389 addMatMultMat(this->mat[i][j], t1, t2);
    \n-
    390 }
    \n-
    391 };
    \n-
    392
    \n-
    393 template<class T, class A, int n, int m>
    \n-
    394 class EntryAccumulator<T,A,n,m,1>
    \n-
    395 : public EntryAccumulatorFather<T,A,n,m>
    \n-
    396 {
    \n-
    397 public:
    \n-\n-
    399 typedef typename Matrix::size_type size_type;
    \n+
    374 // Compute largest and smallest eigenvalue of T matrix and return as estimate
    \n+\n+
    376
    \n+
    377 real_type eps = 0.0;
    \n+
    378 COND_VEC eigv;
    \n+
    379 real_type min_eigv, max_eigv;
    \n+
    380 arpack.computeSymMinMagnitude (eps, eigv, min_eigv);
    \n+
    381 arpack.computeSymMaxMagnitude (eps, eigv, max_eigv);
    \n+
    382
    \n+
    383 res.condition_estimate = max_eigv / min_eigv;
    \n+
    384
    \n+
    385 if (this->_verbose > 0) {
    \n+
    386 std::cout << "Min eigv estimate: " << Simd::io(min_eigv) << '\\n';
    \n+
    387 std::cout << "Max eigv estimate: " << Simd::io(max_eigv) << '\\n';
    \n+
    388 std::cout << "Condition estimate: "
    \n+
    389 << Simd::io(max_eigv / min_eigv) << std::endl;
    \n+
    390 }
    \n+
    391 }
    \n+
    392#else
    \n+
    393 std::cerr << "WARNING: Condition estimate was requested. This requires ARPACK, but ARPACK was not found!" << std::endl;
    \n+
    394#endif
    \n+
    395 }
    \n+
    396 }
    \n+
    \n+
    397
    \n+
    398 private:
    \n+
    399 bool condition_estimate_ = false;
    \n
    400
    \n-
    401 EntryAccumulator(Matrix& mat_)
    \n-
    402 : EntryAccumulatorFather<T,A,n,m>(mat_)
    \n-
    403 {}
    \n+
    401 // Matrix and vector types used for condition estimate
    \n+\n+\n
    404
    \n-
    405 template<class T1, class T2>
    \n-
    406 void operator()(const T1& t1, const T2& t2, size_type i, size_type j)
    \n-
    407 {
    \n-
    408 addTransposeMatMultMat(this->mat[i][j], t1, t2);
    \n-
    409 }
    \n-
    410 };
    \n-
    411
    \n-
    412 template<class T, class A, int n, int m>
    \n-
    413 class EntryAccumulator<T,A,n,m,2>
    \n-
    414 : public EntryAccumulatorFather<T,A,n,m>
    \n-
    415 {
    \n-
    416 public:
    \n-\n-
    418 typedef typename Matrix::size_type size_type;
    \n-
    419
    \n-
    420 EntryAccumulator(Matrix& mat_)
    \n-
    421 : EntryAccumulatorFather<T,A,n,m>(mat_)
    \n-
    422 {}
    \n-
    423
    \n-
    424 template<class T1, class T2>
    \n-
    425 void operator()(const T1& t1, const T2& t2, [[maybe_unused]] size_type i)
    \n-
    426 {
    \n-
    427 assert(this->col.index()==i);
    \n-
    428 addMatMultTransposeMat(*this->col,t1,t2);
    \n-
    429 }
    \n-
    430 };
    \n+
    405 protected:
    \n+
    406 using IterativeSolver<X,X>::_op;
    \n+
    407 using IterativeSolver<X,X>::_prec;
    \n+
    408 using IterativeSolver<X,X>::_sp;
    \n+\n+
    410 using IterativeSolver<X,X>::_maxit;
    \n+
    411 using IterativeSolver<X,X>::_verbose;
    \n+\n+
    413 };
    \n+
    \n+
    414 DUNE_REGISTER_ITERATIVE_SOLVER("cgsolver", defaultIterativeSolverCreator<Dune::CGSolver>());
    \n+
    415
    \n+
    416 // Ronald Kriemanns BiCG-STAB implementation from Sumo
    \n+
    418 template<class X>
    \n+
    \n+
    419 class BiCGSTABSolver : public IterativeSolver<X,X> {
    \n+
    420 public:
    \n+\n+\n+\n+
    424 using typename IterativeSolver<X,X>::real_type;
    \n+
    425
    \n+
    426 // copy base class constructors
    \n+
    427 using IterativeSolver<X,X>::IterativeSolver;
    \n+
    428
    \n+
    429 // don't shadow four-argument version of apply defined in the base class
    \n+
    430 using IterativeSolver<X,X>::apply;
    \n
    431
    \n-
    432
    \n-
    433 template<int transpose>
    \n-
    434 struct SizeSelector
    \n-
    435 {};
    \n-
    436
    \n-
    437 template<>
    \n-
    438 struct SizeSelector<0>
    \n-
    439 {
    \n-
    440 template<class M1, class M2>
    \n-
    441 static std::tuple<typename M1::size_type, typename M2::size_type>
    \n-
    442 size(const M1& m1, const M2& m2)
    \n-
    443 {
    \n-
    444 return std::make_tuple(m1.N(), m2.M());
    \n-
    445 }
    \n-
    446 };
    \n+
    \n+
    439 virtual void apply (X& x, X& b, InverseOperatorResult& res)
    \n+
    440 {
    \n+
    441 using std::abs;
    \n+
    442 const Simd::Scalar<real_type> EPSILON=1e-80;
    \n+
    443 using std::abs;
    \n+
    444 double it;
    \n+
    445 field_type rho, rho_new, alpha, beta, h, omega;
    \n+
    446 real_type norm;
    \n
    447
    \n-
    448 template<>
    \n-
    449 struct SizeSelector<1>
    \n-
    450 {
    \n-
    451 template<class M1, class M2>
    \n-
    452 static std::tuple<typename M1::size_type, typename M2::size_type>
    \n-
    453 size(const M1& m1, const M2& m2)
    \n-
    454 {
    \n-
    455 return std::make_tuple(m1.M(), m2.M());
    \n-
    456 }
    \n-
    457 };
    \n-
    458
    \n-
    459
    \n-
    460 template<>
    \n-
    461 struct SizeSelector<2>
    \n-
    462 {
    \n-
    463 template<class M1, class M2>
    \n-
    464 static std::tuple<typename M1::size_type, typename M2::size_type>
    \n-
    465 size(const M1& m1, const M2& m2)
    \n-
    466 {
    \n-
    467 return std::make_tuple(m1.N(), m2.N());
    \n-
    468 }
    \n-
    469 };
    \n-
    470
    \n-
    471 template<int transpose, class T, class A, class A1, class A2, int n1, int m1, int n2, int m2, int n3, int m3>
    \n-
    472 void matMultMat(BCRSMatrix<FieldMatrix<T,n1,m1>,A>& res, const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>& mat1,
    \n-
    473 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>& mat2)
    \n-
    474 {
    \n-
    475 // First step is to count the number of nonzeros
    \n-
    476 typename BCRSMatrix<FieldMatrix<T,n1,m1>,A>::size_type rows, cols;
    \n-
    477 std::tie(rows,cols)=SizeSelector<transpose>::size(mat1, mat2);
    \n-
    478 MatrixInitializer<transpose,T,A,n1,m1> patternInit(res, rows);
    \n-
    479 Timer timer;
    \n-
    480 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,patternInit);
    \n-
    481 res.setSize(rows, cols, patternInit.nonzeros());
    \n-
    482 res.setBuildMode(BCRSMatrix<FieldMatrix<T,n1,m1>,A>::row_wise);
    \n-
    483
    \n-
    484 //std::cout<<"Counting nonzeros took "<<timer.elapsed()<<std::endl;
    \n-
    485 timer.reset();
    \n-
    486
    \n-
    487 // Second step is to allocate the storage for the result and initialize the nonzero pattern
    \n-
    488 patternInit.initPattern(mat1, mat2);
    \n-
    489
    \n-
    490 //std::cout<<"Setting up sparsity pattern took "<<timer.elapsed()<<std::endl;
    \n-
    491 timer.reset();
    \n-
    492 // As a last step calculate the entries
    \n-
    493 res = 0.0;
    \n-
    494 EntryAccumulator<T,A,n1,m1, transpose> entriesAccu(res);
    \n-
    495 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,entriesAccu);
    \n-
    496 //std::cout<<"Calculating entries took "<<timer.elapsed()<<std::endl;
    \n-
    497 }
    \n-
    498
    \n-
    499 }
    \n-
    500
    \n-
    508 template<typename M1, typename M2>
    \n-
    \n-\n-
    510 {};
    \n-
    \n-
    511
    \n-
    512 template<typename T, int n, int k, int m>
    \n-
    \n-\n-
    514 {
    \n-\n-
    516 };
    \n-
    \n+
    448 //
    \n+
    449 // get vectors and matrix
    \n+
    450 //
    \n+
    451 X& r=b;
    \n+
    452 X p(x);
    \n+
    453 X v(x);
    \n+
    454 X t(x);
    \n+
    455 X y(x);
    \n+
    456 X rt(x);
    \n+
    457
    \n+
    458 //
    \n+
    459 // begin iteration
    \n+
    460 //
    \n+
    461
    \n+
    462 // r = r - Ax; rt = r
    \n+
    463 Iteration<double> iteration(*this,res);
    \n+
    464 _prec->pre(x,r); // prepare preconditioner
    \n+
    465
    \n+
    466 _op->applyscaleadd(-1,x,r); // overwrite b with defect
    \n+
    467
    \n+
    468 rt=r;
    \n+
    469
    \n+
    470 norm = _sp->norm(r);
    \n+
    471 if(iteration.step(0, norm)){
    \n+
    472 _prec->post(x);
    \n+
    473 return;
    \n+
    474 }
    \n+
    475 p=0;
    \n+
    476 v=0;
    \n+
    477
    \n+
    478 rho = 1;
    \n+
    479 alpha = 1;
    \n+
    480 omega = 1;
    \n+
    481
    \n+
    482 //
    \n+
    483 // iteration
    \n+
    484 //
    \n+
    485
    \n+
    486 for (it = 0.5; it < _maxit; it+=.5)
    \n+
    487 {
    \n+
    488 //
    \n+
    489 // preprocess, set vecsizes etc.
    \n+
    490 //
    \n+
    491
    \n+
    492 // rho_new = < rt , r >
    \n+
    493 rho_new = _sp->dot(rt,r);
    \n+
    494
    \n+
    495 // look if breakdown occurred
    \n+
    496 if (Simd::allTrue(abs(rho) <= EPSILON))
    \n+
    497 DUNE_THROW(SolverAbort,"breakdown in BiCGSTAB - rho "
    \n+
    498 << Simd::io(rho) << " <= EPSILON " << EPSILON
    \n+
    499 << " after " << it << " iterations");
    \n+
    500 if (Simd::allTrue(abs(omega) <= EPSILON))
    \n+
    501 DUNE_THROW(SolverAbort,"breakdown in BiCGSTAB - omega "
    \n+
    502 << Simd::io(omega) << " <= EPSILON " << EPSILON
    \n+
    503 << " after " << it << " iterations");
    \n+
    504
    \n+
    505
    \n+
    506 if (it<1)
    \n+
    507 p = r;
    \n+
    508 else
    \n+
    509 {
    \n+
    510 beta = Simd::cond(norm==field_type(0.),
    \n+
    511 field_type(0.), // no need for orthogonalization if norm is already 0
    \n+
    512 ( rho_new / rho ) * ( alpha / omega ));
    \n+
    513 p.axpy(-omega,v); // p = r + beta (p - omega*v)
    \n+
    514 p *= beta;
    \n+
    515 p += r;
    \n+
    516 }
    \n
    517
    \n-
    518 template<typename T, typename A, typename A1, int n, int k, int m>
    \n-
    \n-\n-
    520 {
    \n-\n-
    522 std::allocator<typename MatMultMatResult<FieldMatrix<T,n,k>,FieldMatrix<T,k,m> >::type> > type;
    \n-
    523 };
    \n-
    \n+
    518 // y = W^-1 * p
    \n+
    519 y = 0;
    \n+
    520 _prec->apply(y,p); // apply preconditioner
    \n+
    521
    \n+
    522 // v = A * y
    \n+
    523 _op->apply(y,v);
    \n
    524
    \n-
    525
    \n-
    533 template<typename M1, typename M2>
    \n-
    \n-\n-
    535 {};
    \n-
    \n+
    525 // alpha = rho_new / < rt, v >
    \n+
    526 h = _sp->dot(rt,v);
    \n+
    527
    \n+
    528 if ( Simd::allTrue(abs(h) < EPSILON) )
    \n+
    529 DUNE_THROW(SolverAbort,"abs(h) < EPSILON in BiCGSTAB - abs(h) "
    \n+
    530 << Simd::io(abs(h)) << " < EPSILON " << EPSILON
    \n+
    531 << " after " << it << " iterations");
    \n+
    532
    \n+
    533 alpha = Simd::cond(norm==field_type(0.),
    \n+
    534 field_type(0.),
    \n+
    535 rho_new / h);
    \n
    536
    \n-
    537 template<typename T, int n, int k, int m>
    \n-
    \n-\n-
    539 {
    \n-\n-
    541 };
    \n-
    \n-
    542
    \n-
    543 template<typename T, typename A, typename A1, int n, int k, int m>
    \n-
    \n-\n-
    545 {
    \n-\n-
    547 std::allocator<typename MatMultMatResult<FieldMatrix<T,n,k>,FieldMatrix<T,k,m> >::type> > type;
    \n-
    548 };
    \n-
    \n-
    549
    \n-
    550
    \n-
    559 template<class T, class A, class A1, class A2, int n, int m, int k>
    \n-
    \n-\n-
    561 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, [[maybe_unused]] bool tryHard=false)
    \n-
    562 {
    \n-
    563 matMultMat<2>(res,mat, matt);
    \n-
    564 }
    \n-
    \n-
    565
    \n-
    574 template<class T, class A, class A1, class A2, int n, int m, int k>
    \n-
    \n-\n-
    576 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, bool tryHard=false)
    \n-
    577 {
    \n-
    578 matMultMat<0>(res,mat, matt);
    \n-
    579 }
    \n-
    \n+
    537 // apply first correction to x
    \n+
    538 // x <- x + alpha y
    \n+
    539 x.axpy(alpha,y);
    \n+
    540
    \n+
    541 // r = r - alpha*v
    \n+
    542 r.axpy(-alpha,v);
    \n+
    543
    \n+
    544 //
    \n+
    545 // test stop criteria
    \n+
    546 //
    \n+
    547
    \n+
    548 norm = _sp->norm(r);
    \n+
    549 if(iteration.step(it, norm)){
    \n+
    550 break;
    \n+
    551 }
    \n+
    552
    \n+
    553 it+=.5;
    \n+
    554
    \n+
    555 // y = W^-1 * r
    \n+
    556 y = 0;
    \n+
    557 _prec->apply(y,r);
    \n+
    558
    \n+
    559 // t = A * y
    \n+
    560 _op->apply(y,t);
    \n+
    561
    \n+
    562 // omega = < t, r > / < t, t >
    \n+
    563 h = _sp->dot(t,t);
    \n+
    564 omega = Simd::cond(norm==field_type(0.),
    \n+
    565 field_type(0.),
    \n+
    566 _sp->dot(t,r)/h);
    \n+
    567
    \n+
    568 // apply second correction to x
    \n+
    569 // x <- x + omega y
    \n+
    570 x.axpy(omega,y);
    \n+
    571
    \n+
    572 // r = s - omega*t (remember : r = s)
    \n+
    573 r.axpy(-omega,t);
    \n+
    574
    \n+
    575 rho = rho_new;
    \n+
    576
    \n+
    577 //
    \n+
    578 // test stop criteria
    \n+
    579 //
    \n
    580
    \n-
    589 template<class T, class A, class A1, class A2, int n, int m, int k>
    \n-
    \n-\n-
    591 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt, [[maybe_unused]] bool tryHard=false)
    \n-
    592 {
    \n-
    593 matMultMat<1>(res,mat, matt);
    \n-
    594 }
    \n-
    \n-
    595
    \n-
    596}
    \n-
    597#endif
    \n-
    Implementation of the BCRSMatrix class.
    \n-
    BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    Definition matrixmatrix.hh:379
    \n-
    FieldMatrix< T, n, m > type
    Definition matrixmatrix.hh:515
    \n-
    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
    \n-
    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
    \n-
    BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    Definition matrixmatrix.hh:359
    \n-
    Matrix::RowIterator Row
    Definition matrixmatrix.hh:326
    \n-
    BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    Definition matrixmatrix.hh:417
    \n-
    Dune::BCRSMatrix< Dune::FieldMatrix< T, n, m >, TA > Matrix
    Definition matrixmatrix.hh:228
    \n-
    Matrix::size_type size_type
    Definition matrixmatrix.hh:360
    \n-
    Matrix::size_type size_type
    Definition matrixmatrix.hh:380
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n-
    Matrix::ColIterator Col
    Definition matrixmatrix.hh:327
    \n-
    Matrix::size_type size_type
    Definition matrixmatrix.hh:188
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n-
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n-
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n-
    Matrix::size_type size_type
    Definition matrixmatrix.hh:230
    \n-\n-
    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
    \n-
    BCRSMatrix< FieldMatrix< T, n, m >, A >::CreateIterator CreateIterator
    Definition matrixmatrix.hh:156
    \n-
    BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    Definition matrixmatrix.hh:398
    \n-
    Dune::BCRSMatrix< FieldMatrix< T, n, m >, TA > Matrix
    Definition matrixmatrix.hh:186
    \n-
    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
    \n-
    Matrix::CreateIterator CreateIterator
    Definition matrixmatrix.hh:229
    \n-
    BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    Definition matrixmatrix.hh:325
    \n-
    Matrix::size_type size_type
    Definition matrixmatrix.hh:399
    \n-
    Matrix::CreateIterator CreateIterator
    Definition matrixmatrix.hh:187
    \n-
    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
    \n-
    Matrix::size_type size_type
    Definition matrixmatrix.hh:418
    \n-
    BCRSMatrix< FieldMatrix< T, n, m >, A >::size_type size_type
    Definition matrixmatrix.hh:157
    \n-
    @ do_break
    Definition matrixmatrix.hh:155
    \n-
    @ do_break
    Definition matrixmatrix.hh:185
    \n-
    @ do_break
    Definition matrixmatrix.hh:324
    \n+
    581 norm = _sp->norm(r);
    \n+
    582 if(iteration.step(it, norm)){
    \n+
    583 break;
    \n+
    584 }
    \n+
    585 } // end for
    \n+
    586
    \n+
    587 _prec->post(x); // postprocess preconditioner
    \n+
    588 }
    \n+
    \n+
    589
    \n+
    590 protected:
    \n+
    591 using IterativeSolver<X,X>::_op;
    \n+
    592 using IterativeSolver<X,X>::_prec;
    \n+
    593 using IterativeSolver<X,X>::_sp;
    \n+\n+
    595 using IterativeSolver<X,X>::_maxit;
    \n+
    596 using IterativeSolver<X,X>::_verbose;
    \n+
    597 template<class CountType>
    \n+\n+
    599 };
    \n+
    \n+
    600 DUNE_REGISTER_ITERATIVE_SOLVER("bicgstabsolver", defaultIterativeSolverCreator<Dune::BiCGSTABSolver>());
    \n+
    601
    \n+
    608 template<class X>
    \n+
    \n+
    609 class MINRESSolver : public IterativeSolver<X,X> {
    \n+
    610 public:
    \n+\n+\n+\n+
    614 using typename IterativeSolver<X,X>::real_type;
    \n+
    615
    \n+
    616 // copy base class constructors
    \n+
    617 using IterativeSolver<X,X>::IterativeSolver;
    \n+
    618
    \n+
    619 // don't shadow four-argument version of apply defined in the base class
    \n+
    620 using IterativeSolver<X,X>::apply;
    \n+
    621
    \n+
    \n+
    627 virtual void apply (X& x, X& b, InverseOperatorResult& res)
    \n+
    628 {
    \n+
    629 using std::sqrt;
    \n+
    630 using std::abs;
    \n+
    631 Iteration iteration(*this, res);
    \n+
    632 // prepare preconditioner
    \n+
    633 _prec->pre(x,b);
    \n+
    634
    \n+
    635 // overwrite rhs with defect
    \n+
    636 _op->applyscaleadd(-1.0,x,b); // b -= Ax
    \n+
    637
    \n+
    638 // some temporary vectors
    \n+
    639 X z(b), dummy(b);
    \n+
    640 z = 0.0;
    \n+
    641
    \n+
    642 // calculate preconditioned defect
    \n+
    643 _prec->apply(z,b); // r = W^-1 (b - Ax)
    \n+
    644 real_type def = _sp->norm(z);
    \n+
    645 if (iteration.step(0, def)){
    \n+
    646 _prec->post(x);
    \n+
    647 return;
    \n+
    648 }
    \n+
    649
    \n+
    650 // recurrence coefficients as computed in Lanczos algorithm
    \n+
    651 field_type alpha, beta;
    \n+
    652 // diagonal entries of givens rotation
    \n+
    653 std::array<real_type,2> c{{0.0,0.0}};
    \n+
    654 // off-diagonal entries of givens rotation
    \n+
    655 std::array<field_type,2> s{{0.0,0.0}};
    \n+
    656
    \n+
    657 // recurrence coefficients (column k of tridiag matrix T_k)
    \n+
    658 std::array<field_type,3> T{{0.0,0.0,0.0}};
    \n+
    659
    \n+
    660 // the rhs vector of the min problem
    \n+
    661 std::array<field_type,2> xi{{1.0,0.0}};
    \n+
    662
    \n+
    663 // beta is real and positive in exact arithmetic
    \n+
    664 // since it is the norm of the basis vectors (in unpreconditioned case)
    \n+
    665 beta = sqrt(_sp->dot(b,z));
    \n+
    666 field_type beta0 = beta;
    \n+
    667
    \n+
    668 // the search directions
    \n+
    669 std::array<X,3> p{{b,b,b}};
    \n+
    670 p[0] = 0.0;
    \n+
    671 p[1] = 0.0;
    \n+
    672 p[2] = 0.0;
    \n+
    673
    \n+
    674 // orthonormal basis vectors (in unpreconditioned case)
    \n+
    675 std::array<X,3> q{{b,b,b}};
    \n+
    676 q[0] = 0.0;
    \n+
    677 q[1] *= Simd::cond(def==field_type(0.),
    \n+
    678 field_type(0.),
    \n+
    679 real_type(1.0)/beta);
    \n+
    680 q[2] = 0.0;
    \n+
    681
    \n+
    682 z *= Simd::cond(def==field_type(0.),
    \n+
    683 field_type(0.),
    \n+
    684 real_type(1.0)/beta);
    \n+
    685
    \n+
    686 // the loop
    \n+
    687 int i = 1;
    \n+
    688 for( ; i<=_maxit; i++) {
    \n+
    689
    \n+
    690 dummy = z;
    \n+
    691 int i1 = i%3,
    \n+
    692 i0 = (i1+2)%3,
    \n+
    693 i2 = (i1+1)%3;
    \n+
    694
    \n+
    695 // symmetrically preconditioned Lanczos algorithm (see Greenbaum p.121)
    \n+
    696 _op->apply(z,q[i2]); // q[i2] = Az
    \n+
    697 q[i2].axpy(-beta,q[i0]);
    \n+
    698 // alpha is real since it is the diagonal entry of the hermitian tridiagonal matrix
    \n+
    699 // from the Lanczos Algorithm
    \n+
    700 // so the order in the scalar product doesn't matter even for the complex case
    \n+
    701 alpha = _sp->dot(z,q[i2]);
    \n+
    702 q[i2].axpy(-alpha,q[i1]);
    \n+
    703
    \n+
    704 z = 0.0;
    \n+
    705 _prec->apply(z,q[i2]);
    \n+
    706
    \n+
    707 // beta is real and positive in exact arithmetic
    \n+
    708 // since it is the norm of the basis vectors (in unpreconditioned case)
    \n+
    709 beta = sqrt(_sp->dot(q[i2],z));
    \n+
    710
    \n+
    711 q[i2] *= Simd::cond(def==field_type(0.),
    \n+
    712 field_type(0.),
    \n+
    713 real_type(1.0)/beta);
    \n+
    714 z *= Simd::cond(def==field_type(0.),
    \n+
    715 field_type(0.),
    \n+
    716 real_type(1.0)/beta);
    \n+
    717
    \n+
    718 // QR Factorization of recurrence coefficient matrix
    \n+
    719 // apply previous givens rotations to last column of T
    \n+
    720 T[1] = T[2];
    \n+
    721 if(i>2) {
    \n+
    722 T[0] = s[i%2]*T[1];
    \n+
    723 T[1] = c[i%2]*T[1];
    \n+
    724 }
    \n+
    725 if(i>1) {
    \n+
    726 T[2] = c[(i+1)%2]*alpha - s[(i+1)%2]*T[1];
    \n+
    727 T[1] = c[(i+1)%2]*T[1] + s[(i+1)%2]*alpha;
    \n+
    728 }
    \n+
    729 else
    \n+
    730 T[2] = alpha;
    \n+
    731
    \n+
    732 // update QR factorization
    \n+
    733 generateGivensRotation(T[2],beta,c[i%2],s[i%2]);
    \n+
    734 // to last column of T_k
    \n+
    735 T[2] = c[i%2]*T[2] + s[i%2]*beta;
    \n+
    736 // and to the rhs xi of the min problem
    \n+
    737 xi[i%2] = -s[i%2]*xi[(i+1)%2];
    \n+
    738 xi[(i+1)%2] *= c[i%2];
    \n+
    739
    \n+
    740 // compute correction direction
    \n+
    741 p[i2] = dummy;
    \n+
    742 p[i2].axpy(-T[1],p[i1]);
    \n+
    743 p[i2].axpy(-T[0],p[i0]);
    \n+
    744 p[i2] *= real_type(1.0)/T[2];
    \n+
    745
    \n+
    746 // apply correction/update solution
    \n+
    747 x.axpy(beta0*xi[(i+1)%2],p[i2]);
    \n+
    748
    \n+
    749 // remember beta_old
    \n+
    750 T[2] = beta;
    \n+
    751
    \n+
    752 // check for convergence
    \n+
    753 // the last entry in the rhs of the min-problem is the residual
    \n+
    754 def = abs(beta0*xi[i%2]);
    \n+
    755 if(iteration.step(i, def)){
    \n+
    756 break;
    \n+
    757 }
    \n+
    758 } // end for
    \n+
    759
    \n+
    760 // postprocess preconditioner
    \n+
    761 _prec->post(x);
    \n+
    762 }
    \n+
    \n+
    763
    \n+
    764 private:
    \n+
    765
    \n+
    766 void generateGivensRotation(field_type &dx, field_type &dy, real_type &cs, field_type &sn)
    \n+
    767 {
    \n+
    768 using std::sqrt;
    \n+
    769 using std::abs;
    \n+
    770 using std::max;
    \n+
    771 using std::min;
    \n+
    772 const real_type eps = 1e-15;
    \n+
    773 real_type norm_dx = abs(dx);
    \n+
    774 real_type norm_dy = abs(dy);
    \n+
    775 real_type norm_max = max(norm_dx, norm_dy);
    \n+
    776 real_type norm_min = min(norm_dx, norm_dy);
    \n+
    777 real_type temp = norm_min/norm_max;
    \n+
    778 // we rewrite the code in a vectorizable fashion
    \n+
    779 cs = Simd::cond(norm_dy < eps,
    \n+
    780 real_type(1.0),
    \n+
    781 Simd::cond(norm_dx < eps,
    \n+
    782 real_type(0.0),
    \n+
    783 Simd::cond(norm_dy > norm_dx,
    \n+
    784 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)*temp,
    \n+
    785 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)
    \n+
    786 )));
    \n+
    787 sn = Simd::cond(norm_dy < eps,
    \n+
    788 field_type(0.0),
    \n+
    789 Simd::cond(norm_dx < eps,
    \n+
    790 field_type(1.0),
    \n+
    791 Simd::cond(norm_dy > norm_dx,
    \n+
    792 // dy and dx are real in exact arithmetic
    \n+
    793 // thus dx*dy is real so we can explicitly enforce it
    \n+
    794 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*dx*dy/norm_dx/norm_dy,
    \n+
    795 // dy and dx is real in exact arithmetic
    \n+
    796 // so we don't have to conjugate both of them
    \n+
    797 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*dy/dx
    \n+
    798 )));
    \n+
    799 }
    \n+
    800
    \n+
    801 protected:
    \n+
    802 using IterativeSolver<X,X>::_op;
    \n+
    803 using IterativeSolver<X,X>::_prec;
    \n+
    804 using IterativeSolver<X,X>::_sp;
    \n+
    805 using IterativeSolver<X,X>::_reduction;
    \n+
    806 using IterativeSolver<X,X>::_maxit;
    \n+
    807 using IterativeSolver<X,X>::_verbose;
    \n+\n+
    809 };
    \n+
    \n+
    810 DUNE_REGISTER_ITERATIVE_SOLVER("minressolver", defaultIterativeSolverCreator<Dune::MINRESSolver>());
    \n+
    811
    \n+
    825 template<class X, class Y=X, class F = Y>
    \n+
    \n+\n+
    827 {
    \n+
    828 public:
    \n+\n+\n+\n+
    832 using typename IterativeSolver<X,Y>::real_type;
    \n+
    833
    \n+
    834 protected:
    \n+\n+
    836
    \n+\n+\n+
    841
    \n+
    842 public:
    \n+
    843
    \n+
    \n+
    850 RestartedGMResSolver (const LinearOperator<X,Y>& op, Preconditioner<X,Y>& prec, scalar_real_type reduction, int restart, int maxit, int verbose) :
    \n+
    851 IterativeSolver<X,Y>::IterativeSolver(op,prec,reduction,maxit,verbose),
    \n+
    852 _restart(restart)
    \n+
    853 {}
    \n+
    \n+
    854
    \n+
    \n+
    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) :
    \n+
    862 IterativeSolver<X,Y>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
    \n+
    863 _restart(restart)
    \n+
    864 {}
    \n+
    \n+
    865
    \n+
    \n+
    878 RestartedGMResSolver (std::shared_ptr<const LinearOperator<X,Y> > op, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
    \n+
    879 IterativeSolver<X,Y>::IterativeSolver(op,prec,configuration),
    \n+
    880 _restart(configuration.get<int>("restart"))
    \n+
    881 {}
    \n+
    \n+
    882
    \n+
    \n+
    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) :
    \n+
    884 IterativeSolver<X,Y>::IterativeSolver(op,sp,prec,configuration),
    \n+
    885 _restart(configuration.get<int>("restart"))
    \n+
    886 {}
    \n+
    \n+
    887
    \n+
    \n+
    894 RestartedGMResSolver (std::shared_ptr<const LinearOperator<X,Y>> op,
    \n+
    895 std::shared_ptr<const ScalarProduct<X>> sp,
    \n+
    896 std::shared_ptr<Preconditioner<X,Y>> prec,
    \n+
    897 scalar_real_type reduction, int restart, int maxit, int verbose) :
    \n+
    898 IterativeSolver<X,Y>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
    \n+
    899 _restart(restart)
    \n+
    900 {}
    \n+
    \n+
    901
    \n+
    \n+
    910 virtual void apply (X& x, Y& b, InverseOperatorResult& res)
    \n+
    911 {
    \n+
    912 apply(x,b,Simd::max(_reduction),res);
    \n+
    913 }
    \n+
    \n+
    914
    \n+
    \n+
    923 virtual void apply (X& x, Y& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
    \n+
    924 {
    \n+
    925 using std::abs;
    \n+
    926 const Simd::Scalar<real_type> EPSILON = 1e-80;
    \n+
    927 const int m = _restart;
    \n+
    928 real_type norm = 0.0;
    \n+
    929 int j = 1;
    \n+
    930 std::vector<field_type,fAlloc> s(m+1), sn(m);
    \n+
    931 std::vector<real_type,rAlloc> cs(m);
    \n+
    932 // need copy of rhs if GMRes has to be restarted
    \n+
    933 Y b2(b);
    \n+
    934 // helper vector
    \n+
    935 Y w(b);
    \n+
    936 std::vector< std::vector<field_type,fAlloc> > H(m+1,s);
    \n+
    937 std::vector<F> v(m+1,b);
    \n+
    938
    \n+
    939 Iteration iteration(*this,res);
    \n+
    940
    \n+
    941 // clear solver statistics and set res.converged to false
    \n+
    942 _prec->pre(x,b);
    \n+
    943
    \n+
    944 // calculate defect and overwrite rhs with it
    \n+
    945 _op->applyscaleadd(-1.0,x,b); // b -= Ax
    \n+
    946 // calculate preconditioned defect
    \n+
    947 v[0] = 0.0; _prec->apply(v[0],b); // r = W^-1 b
    \n+
    948 norm = _sp->norm(v[0]);
    \n+
    949 if(iteration.step(0, norm)){
    \n+
    950 _prec->post(x);
    \n+
    951 return;
    \n+
    952 }
    \n+
    953
    \n+
    954 while(j <= _maxit && res.converged != true) {
    \n+
    955
    \n+
    956 int i = 0;
    \n+
    957 v[0] *= Simd::cond(norm==real_type(0.),
    \n+
    958 real_type(0.),
    \n+
    959 real_type(1.0)/norm);
    \n+
    960 s[0] = norm;
    \n+
    961 for(i=1; i<m+1; i++)
    \n+
    962 s[i] = 0.0;
    \n+
    963
    \n+
    964 for(i=0; i < m && j <= _maxit && res.converged != true; i++, j++) {
    \n+
    965 w = 0.0;
    \n+
    966 // use v[i+1] as temporary vector
    \n+
    967 v[i+1] = 0.0;
    \n+
    968 // do Arnoldi algorithm
    \n+
    969 _op->apply(v[i],v[i+1]);
    \n+
    970 _prec->apply(w,v[i+1]);
    \n+
    971 for(int k=0; k<i+1; k++) {
    \n+
    972 // notice that _sp->dot(v[k],w) = v[k]\\adjoint w
    \n+
    973 // so one has to pay attention to the order
    \n+
    974 // in the scalar product for the complex case
    \n+
    975 // doing the modified Gram-Schmidt algorithm
    \n+
    976 H[k][i] = _sp->dot(v[k],w);
    \n+
    977 // w -= H[k][i] * v[k]
    \n+
    978 w.axpy(-H[k][i],v[k]);
    \n+
    979 }
    \n+
    980 H[i+1][i] = _sp->norm(w);
    \n+
    981 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON))
    \n+
    982 DUNE_THROW(SolverAbort,
    \n+
    983 "breakdown in GMRes - |w| == 0.0 after " << j << " iterations");
    \n+
    984
    \n+
    985 // normalize new vector
    \n+
    986 v[i+1] = w;
    \n+
    987 v[i+1] *= Simd::cond(norm==real_type(0.),
    \n+
    988 field_type(0.),
    \n+
    989 real_type(1.0)/H[i+1][i]);
    \n+
    990
    \n+
    991 // update QR factorization
    \n+
    992 for(int k=0; k<i; k++)
    \n+
    993 applyPlaneRotation(H[k][i],H[k+1][i],cs[k],sn[k]);
    \n+
    994
    \n+
    995 // compute new givens rotation
    \n+
    996 generatePlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
    \n+
    997 // finish updating QR factorization
    \n+
    998 applyPlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
    \n+
    999 applyPlaneRotation(s[i],s[i+1],cs[i],sn[i]);
    \n+
    1000
    \n+
    1001 // norm of the defect is the last component the vector s
    \n+
    1002 norm = abs(s[i+1]);
    \n+
    1003
    \n+
    1004 iteration.step(j, norm);
    \n+
    1005
    \n+
    1006 } // end for
    \n+
    1007
    \n+
    1008 // calculate update vector
    \n+
    1009 w = 0.0;
    \n+
    1010 update(w,i,H,s,v);
    \n+
    1011 // and current iterate
    \n+
    1012 x += w;
    \n+
    1013
    \n+
    1014 // restart GMRes if convergence was not achieved,
    \n+
    1015 // i.e. linear defect has not reached desired reduction
    \n+
    1016 // and if j < _maxit (do not restart on last iteration)
    \n+
    1017 if( res.converged != true && j < _maxit ) {
    \n+
    1018
    \n+
    1019 if(_verbose > 0)
    \n+
    1020 std::cout << "=== GMRes::restart" << std::endl;
    \n+
    1021 // get saved rhs
    \n+
    1022 b = b2;
    \n+
    1023 // calculate new defect
    \n+
    1024 _op->applyscaleadd(-1.0,x,b); // b -= Ax;
    \n+
    1025 // calculate preconditioned defect
    \n+
    1026 v[0] = 0.0;
    \n+
    1027 _prec->apply(v[0],b);
    \n+
    1028 norm = _sp->norm(v[0]);
    \n+
    1029 }
    \n+
    1030
    \n+
    1031 } //end while
    \n+
    1032
    \n+
    1033 // postprocess preconditioner
    \n+
    1034 _prec->post(x);
    \n+
    1035 }
    \n+
    \n+
    1036
    \n+
    1037 protected :
    \n+
    1038
    \n+
    \n+
    1039 void update(X& w, int i,
    \n+
    1040 const std::vector<std::vector<field_type,fAlloc> >& H,
    \n+
    1041 const std::vector<field_type,fAlloc>& s,
    \n+
    1042 const std::vector<X>& v) {
    \n+
    1043 // solution vector of the upper triangular system
    \n+
    1044 std::vector<field_type,fAlloc> y(s);
    \n+
    1045
    \n+
    1046 // backsolve
    \n+
    1047 for(int a=i-1; a>=0; a--) {
    \n+
    1048 field_type rhs(s[a]);
    \n+
    1049 for(int b=a+1; b<i; b++)
    \n+
    1050 rhs -= H[a][b]*y[b];
    \n+
    1051 y[a] = Simd::cond(rhs==field_type(0.),
    \n+
    1052 field_type(0.),
    \n+
    1053 rhs/H[a][a]);
    \n+
    1054
    \n+
    1055 // compute update on the fly
    \n+
    1056 // w += y[a]*v[a]
    \n+
    1057 w.axpy(y[a],v[a]);
    \n+
    1058 }
    \n+
    1059 }
    \n+
    \n+
    1060
    \n+
    1061 template<typename T>
    \n+
    \n+
    1062 typename std::enable_if<std::is_same<field_type,real_type>::value,T>::type conjugate(const T& t) {
    \n+
    1063 return t;
    \n+
    1064 }
    \n+
    \n+
    1065
    \n+
    1066 template<typename T>
    \n+
    \n+
    1067 typename std::enable_if<!std::is_same<field_type,real_type>::value,T>::type conjugate(const T& t) {
    \n+
    1068 using std::conj;
    \n+
    1069 return conj(t);
    \n+
    1070 }
    \n+
    \n+
    1071
    \n+
    1072 void
    \n+
    \n+\n+
    1074 {
    \n+
    1075 using std::sqrt;
    \n+
    1076 using std::abs;
    \n+
    1077 using std::max;
    \n+
    1078 using std::min;
    \n+
    1079 const real_type eps = 1e-15;
    \n+
    1080 real_type norm_dx = abs(dx);
    \n+
    1081 real_type norm_dy = abs(dy);
    \n+
    1082 real_type norm_max = max(norm_dx, norm_dy);
    \n+
    1083 real_type norm_min = min(norm_dx, norm_dy);
    \n+
    1084 real_type temp = norm_min/norm_max;
    \n+
    1085 // we rewrite the code in a vectorizable fashion
    \n+
    1086 cs = Simd::cond(norm_dy < eps,
    \n+
    1087 real_type(1.0),
    \n+
    1088 Simd::cond(norm_dx < eps,
    \n+
    1089 real_type(0.0),
    \n+
    1090 Simd::cond(norm_dy > norm_dx,
    \n+
    1091 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)*temp,
    \n+
    1092 real_type(1.0)/sqrt(real_type(1.0) + temp*temp)
    \n+
    1093 )));
    \n+
    1094 sn = Simd::cond(norm_dy < eps,
    \n+
    1095 field_type(0.0),
    \n+
    1096 Simd::cond(norm_dx < eps,
    \n+
    1097 field_type(1.0),
    \n+
    1098 Simd::cond(norm_dy > norm_dx,
    \n+
    1099 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*dx*conjugate(dy)/norm_dx/norm_dy,
    \n+
    1100 field_type(1.0)/sqrt(real_type(1.0) + temp*temp)*conjugate(dy/dx)
    \n+
    1101 )));
    \n+
    1102 }
    \n+
    \n+
    1103
    \n+
    1104
    \n+
    1105 void
    \n+
    \n+\n+
    1107 {
    \n+
    1108 field_type temp = cs * dx + sn * dy;
    \n+
    1109 dy = -conjugate(sn) * dx + cs * dy;
    \n+
    1110 dx = temp;
    \n+
    1111 }
    \n+
    \n+
    1112
    \n+
    1113 using IterativeSolver<X,Y>::_op;
    \n+
    1114 using IterativeSolver<X,Y>::_prec;
    \n+
    1115 using IterativeSolver<X,Y>::_sp;
    \n+
    1116 using IterativeSolver<X,Y>::_reduction;
    \n+
    1117 using IterativeSolver<X,Y>::_maxit;
    \n+
    1118 using IterativeSolver<X,Y>::_verbose;
    \n+\n+\n+
    1121 };
    \n+
    \n+
    1122 DUNE_REGISTER_ITERATIVE_SOLVER("restartedgmressolver", defaultIterativeSolverCreator<Dune::RestartedGMResSolver>());
    \n+
    1123
    \n+
    1137 template<class X, class Y=X, class F = Y>
    \n+
    \n+\n+
    1139 {
    \n+
    1140 public:
    \n+\n+\n+\n+\n+
    1145
    \n+
    1146 private:
    \n+\n+
    1148
    \n+
    1150 using fAlloc = typename RestartedGMResSolver<X,Y>::fAlloc;
    \n+
    1152 using rAlloc = typename RestartedGMResSolver<X,Y>::rAlloc;
    \n+
    1153
    \n+
    1154 public:
    \n+
    1155 // copy base class constructors
    \n+
    1156 using RestartedGMResSolver<X,Y>::RestartedGMResSolver;
    \n+
    1157
    \n+
    1158 // don't shadow four-argument version of apply defined in the base class
    \n+
    1159 using RestartedGMResSolver<X,Y>::apply;
    \n+
    1160
    \n+
    \n+
    1169 void apply (X& x, Y& b, [[maybe_unused]] double reduction, InverseOperatorResult& res) override
    \n+
    1170 {
    \n+
    1171 using std::abs;
    \n+
    1172 const Simd::Scalar<real_type> EPSILON = 1e-80;
    \n+
    1173 const int m = _restart;
    \n+
    1174 real_type norm = 0.0;
    \n+
    1175 int i, j = 1, k;
    \n+
    1176 std::vector<field_type,fAlloc> s(m+1), sn(m);
    \n+
    1177 std::vector<real_type,rAlloc> cs(m);
    \n+
    1178 // helper vector
    \n+
    1179 Y tmp(b);
    \n+
    1180 std::vector< std::vector<field_type,fAlloc> > H(m+1,s);
    \n+
    1181 std::vector<F> v(m+1,b);
    \n+
    1182 std::vector<X> w(m+1,b);
    \n+
    1183
    \n+
    1184 Iteration iteration(*this,res);
    \n+
    1185 // setup preconditioner if it does something in pre
    \n+
    1186
    \n+
    1187 // calculate residual and overwrite a copy of the rhs with it
    \n+
    1188 _prec->pre(x, b);
    \n+
    1189 v[0] = b;
    \n+
    1190 _op->applyscaleadd(-1.0, x, v[0]); // b -= Ax
    \n+
    1191
    \n+
    1192 norm = _sp->norm(v[0]); // the residual norm
    \n+
    1193 if(iteration.step(0, norm)){
    \n+
    1194 _prec->post(x);
    \n+
    1195 return;
    \n+
    1196 }
    \n+
    1197
    \n+
    1198 // start iterations
    \n+
    1199 res.converged = false;;
    \n+
    1200 while(j <= _maxit && res.converged != true)
    \n+
    1201 {
    \n+
    1202 v[0] *= (1.0 / norm);
    \n+
    1203 s[0] = norm;
    \n+
    1204 for(i=1; i<m+1; ++i)
    \n+
    1205 s[i] = 0.0;
    \n+
    1206
    \n+
    1207 // inner loop
    \n+
    1208 for(i=0; i < m && j <= _maxit && res.converged != true; i++, j++)
    \n+
    1209 {
    \n+
    1210 w[i] = 0.0;
    \n+
    1211 // compute wi = M^-1*vi (also called zi)
    \n+
    1212 _prec->apply(w[i], v[i]);
    \n+
    1213 // compute vi = A*wi
    \n+
    1214 // use v[i+1] as temporary vector for w
    \n+
    1215 _op->apply(w[i], v[i+1]);
    \n+
    1216 // do Arnoldi algorithm
    \n+
    1217 for(int kk=0; kk<i+1; kk++)
    \n+
    1218 {
    \n+
    1219 // notice that _sp->dot(v[k],v[i+1]) = v[k]\\adjoint v[i+1]
    \n+
    1220 // so one has to pay attention to the order
    \n+
    1221 // in the scalar product for the complex case
    \n+
    1222 // doing the modified Gram-Schmidt algorithm
    \n+
    1223 H[kk][i] = _sp->dot(v[kk],v[i+1]);
    \n+
    1224 // w -= H[k][i] * v[kk]
    \n+
    1225 v[i+1].axpy(-H[kk][i], v[kk]);
    \n+
    1226 }
    \n+
    1227 H[i+1][i] = _sp->norm(v[i+1]);
    \n+
    1228 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON))
    \n+
    1229 DUNE_THROW(SolverAbort, "breakdown in fGMRes - |w| (-> "
    \n+
    1230 << w[i] << ") == 0.0 after "
    \n+
    1231 << j << " iterations");
    \n+
    1232
    \n+
    1233 // v[i+1] = w*1/H[i+1][i]
    \n+
    1234 v[i+1] *= real_type(1.0)/H[i+1][i];
    \n+
    1235
    \n+
    1236 // update QR factorization
    \n+
    1237 for(k=0; k<i; k++)
    \n+
    1238 this->applyPlaneRotation(H[k][i],H[k+1][i],cs[k],sn[k]);
    \n+
    1239
    \n+
    1240 // compute new givens rotation
    \n+
    1241 this->generatePlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
    \n+
    1242
    \n+
    1243 // finish updating QR factorization
    \n+
    1244 this->applyPlaneRotation(H[i][i],H[i+1][i],cs[i],sn[i]);
    \n+
    1245 this->applyPlaneRotation(s[i],s[i+1],cs[i],sn[i]);
    \n+
    1246
    \n+
    1247 // norm of the residual is the last component of vector s
    \n+
    1248 using std::abs;
    \n+
    1249 norm = abs(s[i+1]);
    \n+
    1250 iteration.step(j, norm);
    \n+
    1251 } // end inner for loop
    \n+
    1252
    \n+
    1253 // calculate update vector
    \n+
    1254 tmp = 0.0;
    \n+
    1255 this->update(tmp, i, H, s, w);
    \n+
    1256 // and update current iterate
    \n+
    1257 x += tmp;
    \n+
    1258
    \n+
    1259 // restart fGMRes if convergence was not achieved,
    \n+
    1260 // i.e. linear residual has not reached desired reduction
    \n+
    1261 // and if still j < _maxit (do not restart on last iteration)
    \n+
    1262 if( res.converged != true && j < _maxit)
    \n+
    1263 {
    \n+
    1264 if (_verbose > 0)
    \n+
    1265 std::cout << "=== fGMRes::restart" << std::endl;
    \n+
    1266 // get rhs
    \n+
    1267 v[0] = b;
    \n+
    1268 // calculate new defect
    \n+
    1269 _op->applyscaleadd(-1.0, x,v[0]); // b -= Ax;
    \n+
    1270 // calculate preconditioned defect
    \n+
    1271 norm = _sp->norm(v[0]); // update the residual norm
    \n+
    1272 }
    \n+
    1273
    \n+
    1274 } // end outer while loop
    \n+
    1275
    \n+
    1276 // post-process preconditioner
    \n+
    1277 _prec->post(x);
    \n+
    1278 }
    \n+
    \n+
    1279
    \n+
    1280private:
    \n+
    1281 using RestartedGMResSolver<X,Y>::_op;
    \n+
    1282 using RestartedGMResSolver<X,Y>::_prec;
    \n+
    1283 using RestartedGMResSolver<X,Y>::_sp;
    \n+\n+\n+\n+\n+
    1288 using Iteration = typename IterativeSolver<X,X>::template Iteration<unsigned int>;
    \n+
    1289 };
    \n+
    \n+
    1290 DUNE_REGISTER_ITERATIVE_SOLVER("restartedflexiblegmressolver", defaultIterativeSolverCreator<Dune::RestartedFlexibleGMResSolver>());
    \n+
    1291
    \n+
    1305 template<class X>
    \n+
    \n+\n+
    1307 {
    \n+
    1308 public:
    \n+
    1309 using typename IterativeSolver<X,X>::domain_type;
    \n+
    1310 using typename IterativeSolver<X,X>::range_type;
    \n+
    1311 using typename IterativeSolver<X,X>::field_type;
    \n+
    1312 using typename IterativeSolver<X,X>::real_type;
    \n+
    1313
    \n+
    1314 private:
    \n+\n+
    1316
    \n+\n+
    1319
    \n+
    1320 public:
    \n+
    1321
    \n+
    1322 // don't shadow four-argument version of apply defined in the base class
    \n+
    1323 using IterativeSolver<X,X>::apply;
    \n+
    1324
    \n+
    \n+
    1331 GeneralizedPCGSolver (const LinearOperator<X,X>& op, Preconditioner<X,X>& prec, scalar_real_type reduction, int maxit, int verbose, int restart = 10) :
    \n+
    1332 IterativeSolver<X,X>::IterativeSolver(op,prec,reduction,maxit,verbose),
    \n+
    1333 _restart(restart)
    \n+
    1334 {}
    \n+
    \n+
    1335
    \n+
    \n+
    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) :
    \n+
    1344 IterativeSolver<X,X>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
    \n+
    1345 _restart(restart)
    \n+
    1346 {}
    \n+
    \n+
    1347
    \n+
    1348
    \n+
    \n+
    1361 GeneralizedPCGSolver (std::shared_ptr<const LinearOperator<X,X> > op, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
    \n+
    1362 IterativeSolver<X,X>::IterativeSolver(op,prec,configuration),
    \n+
    1363 _restart(configuration.get<int>("restart"))
    \n+
    1364 {}
    \n+
    \n+
    1365
    \n+
    \n+
    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) :
    \n+
    1367 IterativeSolver<X,X>::IterativeSolver(op,sp,prec,configuration),
    \n+
    1368 _restart(configuration.get<int>("restart"))
    \n+
    1369 {}
    \n+
    \n+
    \n+
    1377 GeneralizedPCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
    \n+
    1378 std::shared_ptr<const ScalarProduct<X>> sp,
    \n+
    1379 std::shared_ptr<Preconditioner<X,X>> prec,
    \n+
    1380 scalar_real_type reduction, int maxit, int verbose,
    \n+
    1381 int restart = 10) :
    \n+
    1382 IterativeSolver<X,X>::IterativeSolver(op,sp,prec,reduction,maxit,verbose),
    \n+
    1383 _restart(restart)
    \n+
    1384 {}
    \n+
    \n+
    1385
    \n+
    \n+
    1391 virtual void apply (X& x, X& b, InverseOperatorResult& res)
    \n+
    1392 {
    \n+
    1393 Iteration iteration(*this, res);
    \n+
    1394 _prec->pre(x,b); // prepare preconditioner
    \n+
    1395 _op->applyscaleadd(-1,x,b); // overwrite b with defect
    \n+
    1396
    \n+
    1397 std::vector<std::shared_ptr<X> > p(_restart);
    \n+
    1398 std::vector<field_type,fAlloc> pp(_restart);
    \n+
    1399 X q(x); // a temporary vector
    \n+
    1400 X prec_res(x); // a temporary vector for preconditioner output
    \n+
    1401
    \n+
    1402 p[0].reset(new X(x));
    \n+
    1403
    \n+
    1404 real_type def = _sp->norm(b); // compute norm
    \n+
    1405 if(iteration.step(0, def)){
    \n+
    1406 _prec->post(x);
    \n+
    1407 return;
    \n+
    1408 }
    \n+
    1409 // some local variables
    \n+
    1410 field_type rho, lambda;
    \n+
    1411
    \n+
    1412 int i=0;
    \n+
    1413 // determine initial search direction
    \n+
    1414 *(p[0]) = 0; // clear correction
    \n+
    1415 _prec->apply(*(p[0]),b); // apply preconditioner
    \n+
    1416 rho = _sp->dot(*(p[0]),b); // orthogonalization
    \n+
    1417 _op->apply(*(p[0]),q); // q=Ap
    \n+
    1418 pp[0] = _sp->dot(*(p[0]),q); // scalar product
    \n+
    1419 lambda = rho/pp[0]; // minimization
    \n+
    1420 x.axpy(lambda,*(p[0])); // update solution
    \n+
    1421 b.axpy(-lambda,q); // update defect
    \n+
    1422
    \n+
    1423 // convergence test
    \n+
    1424 def=_sp->norm(b); // comp defect norm
    \n+
    1425 ++i;
    \n+
    1426 if(iteration.step(i, def)){
    \n+
    1427 _prec->post(x);
    \n+
    1428 return;
    \n+
    1429 }
    \n+
    1430
    \n+
    1431 while(i<_maxit) {
    \n+
    1432 // the loop
    \n+
    1433 int end=std::min(_restart, _maxit-i+1);
    \n+
    1434 for (int ii = 1; ii < end; ++ii)
    \n+
    1435 {
    \n+
    1436 //std::cout<<" ii="<<ii<<" i="<<i<<std::endl;
    \n+
    1437 // compute next conjugate direction
    \n+
    1438 prec_res = 0; // clear correction
    \n+
    1439 _prec->apply(prec_res,b); // apply preconditioner
    \n+
    1440
    \n+
    1441 p[ii].reset(new X(prec_res));
    \n+
    1442 _op->apply(prec_res, q);
    \n+
    1443
    \n+
    1444 for(int j=0; j<ii; ++j) {
    \n+
    1445 rho =_sp->dot(q,*(p[j]))/pp[j];
    \n+
    1446 p[ii]->axpy(-rho, *(p[j]));
    \n+
    1447 }
    \n+
    1448
    \n+
    1449 // minimize in given search direction
    \n+
    1450 _op->apply(*(p[ii]),q); // q=Ap
    \n+
    1451 pp[ii] = _sp->dot(*(p[ii]),q); // scalar product
    \n+
    1452 rho = _sp->dot(*(p[ii]),b); // orthogonalization
    \n+
    1453 lambda = rho/pp[ii]; // minimization
    \n+
    1454 x.axpy(lambda,*(p[ii])); // update solution
    \n+
    1455 b.axpy(-lambda,q); // update defect
    \n+
    1456
    \n+
    1457 // convergence test
    \n+
    1458 def = _sp->norm(b); // comp defect norm
    \n+
    1459
    \n+
    1460 ++i;
    \n+
    1461 iteration.step(i, def);
    \n+
    1462 }
    \n+
    1463 if(res.converged)
    \n+
    1464 break;
    \n+
    1465 if(end==_restart) {
    \n+
    1466 *(p[0])=*(p[_restart-1]);
    \n+
    1467 pp[0]=pp[_restart-1];
    \n+
    1468 }
    \n+
    1469 }
    \n+
    1470
    \n+
    1471 // postprocess preconditioner
    \n+
    1472 _prec->post(x);
    \n+
    1473
    \n+
    1474 }
    \n+
    \n+
    1475
    \n+
    1476 private:
    \n+
    1477 using IterativeSolver<X,X>::_op;
    \n+
    1478 using IterativeSolver<X,X>::_prec;
    \n+
    1479 using IterativeSolver<X,X>::_sp;
    \n+
    1480 using IterativeSolver<X,X>::_reduction;
    \n+
    1481 using IterativeSolver<X,X>::_maxit;
    \n+
    1482 using IterativeSolver<X,X>::_verbose;
    \n+
    1483 using Iteration = typename IterativeSolver<X,X>::template Iteration<unsigned int>;
    \n+
    1484 int _restart;
    \n+
    1485 };
    \n+
    \n+
    1486 DUNE_REGISTER_ITERATIVE_SOLVER("generalizedpcgsolver", defaultIterativeSolverCreator<Dune::GeneralizedPCGSolver>());
    \n+
    1487
    \n+
    1499 template<class X>
    \n+
    \n+\n+
    1501 public:
    \n+
    1502 using typename IterativeSolver<X,X>::domain_type;
    \n+
    1503 using typename IterativeSolver<X,X>::range_type;
    \n+
    1504 using typename IterativeSolver<X,X>::field_type;
    \n+
    1505 using typename IterativeSolver<X,X>::real_type;
    \n+
    1506
    \n+
    1507 private:
    \n+\n+
    1509
    \n+
    1510 public:
    \n+
    1511 // don't shadow four-argument version of apply defined in the base class
    \n+
    1512 using IterativeSolver<X,X>::apply;
    \n+
    \n+\n+
    1519 scalar_real_type reduction, int maxit, int verbose, int mmax = 10) : IterativeSolver<X,X>(op, prec, reduction, maxit, verbose), _mmax(mmax)
    \n+
    1520 {
    \n+
    1521 }
    \n+
    \n+
    1522
    \n+
    \n+\n+
    1529 scalar_real_type reduction, int maxit, int verbose, int mmax = 10) : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose), _mmax(mmax)
    \n+
    1530 {
    \n+
    1531 }
    \n+
    \n+
    1532
    \n+
    \n+
    1538 RestartedFCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
    \n+
    1539 std::shared_ptr<const ScalarProduct<X>> sp,
    \n+
    1540 std::shared_ptr<Preconditioner<X,X>> prec,
    \n+
    1541 scalar_real_type reduction, int maxit, int verbose,
    \n+
    1542 int mmax = 10)
    \n+
    1543 : IterativeSolver<X,X>(op, sp, prec, reduction, maxit, verbose), _mmax(mmax)
    \n+
    1544 {}
    \n+
    \n+
    1545
    \n+
    \n+
    1558 RestartedFCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
    \n+
    1559 std::shared_ptr<Preconditioner<X,X>> prec,
    \n+
    1560 const ParameterTree& config)
    \n+
    1561 : IterativeSolver<X,X>(op, prec, config), _mmax(config.get("mmax", 10))
    \n+
    1562 {}
    \n+
    \n+
    1563
    \n+
    \n+
    1564 RestartedFCGSolver (std::shared_ptr<const LinearOperator<X,X>> op,
    \n+
    1565 std::shared_ptr<const ScalarProduct<X>> sp,
    \n+
    1566 std::shared_ptr<Preconditioner<X,X>> prec,
    \n+
    1567 const ParameterTree& config)
    \n+
    1568 : IterativeSolver<X,X>(op, sp, prec, config), _mmax(config.get("mmax", 10))
    \n+
    1569 {}
    \n+
    \n+
    1570
    \n+
    \n+
    1583 virtual void apply (X& x, X& b, InverseOperatorResult& res)
    \n+
    1584 {
    \n+\n+
    1586 res.clear();
    \n+
    1587 Iteration iteration(*this,res);
    \n+
    1588 _prec->pre(x,b); // prepare preconditioner
    \n+
    1589 _op->applyscaleadd(-1,x,b); // overwrite b with defect
    \n+
    1590
    \n+
    1591 //arrays for interim values:
    \n+
    1592 std::vector<X> d(_mmax+1, x); // array for directions
    \n+
    1593 std::vector<X> Ad(_mmax+1, x); // array for Ad[i]
    \n+
    1594 std::vector<field_type,rAlloc> ddotAd(_mmax+1,0); // array for <d[i],Ad[i]>
    \n+
    1595 X w(x);
    \n+
    1596
    \n+
    1597 real_type def = _sp->norm(b); // compute norm
    \n+
    1598 if(iteration.step(0, def)){
    \n+
    1599 _prec->post(x);
    \n+
    1600 return;
    \n+
    1601 }
    \n+
    1602
    \n+
    1603 // some local variables
    \n+
    1604 field_type alpha;
    \n+
    1605
    \n+
    1606 // the loop
    \n+
    1607 int i=1;
    \n+
    1608 int i_bounded=0;
    \n+
    1609 while(i<=_maxit && !res.converged) {
    \n+
    1610 for (; i_bounded <= _mmax && i<= _maxit; i_bounded++) {
    \n+
    1611 d[i_bounded] = 0; // reset search direction
    \n+
    1612 _prec->apply(d[i_bounded], b); // apply preconditioner
    \n+
    1613 w = d[i_bounded]; // copy of current d[i]
    \n+
    1614 // orthogonalization with previous directions
    \n+
    1615 orthogonalizations(i_bounded,Ad,w,ddotAd,d);
    \n+
    1616
    \n+
    1617 //saving interim values for future calculating
    \n+
    1618 _op->apply(d[i_bounded], Ad[i_bounded]); // save Ad[i]
    \n+
    1619 ddotAd[i_bounded]=_sp->dot(d[i_bounded],Ad[i_bounded]); // save <d[i],Ad[i]>
    \n+
    1620 alpha = _sp->dot(d[i_bounded], b)/ddotAd[i_bounded]; // <d[i],b>/<d[i],Ad[i]>
    \n+
    1621
    \n+
    1622 //update solution and defect
    \n+
    1623 x.axpy(alpha, d[i_bounded]);
    \n+
    1624 b.axpy(-alpha, Ad[i_bounded]);
    \n+
    1625
    \n+
    1626 // convergence test
    \n+
    1627 def = _sp->norm(b); // comp defect norm
    \n+
    1628
    \n+
    1629 iteration.step(i, def);
    \n+
    1630 i++;
    \n+
    1631 }
    \n+
    1632 //restart: exchange first and last stored values
    \n+
    1633 cycle(Ad,d,ddotAd,i_bounded);
    \n+
    1634 }
    \n+
    1635
    \n+
    1636 //correct i which is wrong if convergence was not achieved.
    \n+
    1637 i=std::min(_maxit,i);
    \n+
    1638
    \n+
    1639 _prec->post(x); // postprocess preconditioner
    \n+
    1640 }
    \n+
    \n+
    1641
    \n+
    1642 private:
    \n+
    1643 //This function is called every iteration to orthogonalize against the last search directions
    \n+
    1644 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) {
    \n+
    1645 // The RestartedFCGSolver uses only values with lower array index;
    \n+
    1646 for (int k = 0; k < i_bounded; k++) {
    \n+
    1647 d[i_bounded].axpy(-_sp->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= <<Ad[k],w>/<d[k],Ad[k]>>d[k]
    \n+
    1648 }
    \n+
    1649 }
    \n+
    1650
    \n+
    1651 // This function is called every mmax iterations to handle limited array sizes.
    \n+
    1652 virtual void cycle(std::vector<X>& Ad,std::vector<X>& d,std::vector<field_type,ReboundAllocatorType<X,field_type> >& ddotAd,int& i_bounded) {
    \n+
    1653 // Reset loop index and exchange the first and last arrays
    \n+
    1654 i_bounded = 1;
    \n+
    1655 std::swap(Ad[0], Ad[_mmax]);
    \n+
    1656 std::swap(d[0], d[_mmax]);
    \n+
    1657 std::swap(ddotAd[0], ddotAd[_mmax]);
    \n+
    1658 }
    \n+
    1659
    \n+
    1660 protected:
    \n+\n+
    1662 using IterativeSolver<X,X>::_op;
    \n+
    1663 using IterativeSolver<X,X>::_prec;
    \n+
    1664 using IterativeSolver<X,X>::_sp;
    \n+
    1665 using IterativeSolver<X,X>::_reduction;
    \n+
    1666 using IterativeSolver<X,X>::_maxit;
    \n+
    1667 using IterativeSolver<X,X>::_verbose;
    \n+\n+
    1669 };
    \n+
    \n+
    1670 DUNE_REGISTER_ITERATIVE_SOLVER("restartedfcgsolver", defaultIterativeSolverCreator<Dune::RestartedFCGSolver>());
    \n+
    1671
    \n+
    1678 template<class X>
    \n+
    \n+\n+
    1680 public:
    \n+\n+
    1682 using typename RestartedFCGSolver<X>::range_type;
    \n+
    1683 using typename RestartedFCGSolver<X>::field_type;
    \n+
    1684 using typename RestartedFCGSolver<X>::real_type;
    \n+
    1685
    \n+
    1686 // copy base class constructors
    \n+
    1687 using RestartedFCGSolver<X>::RestartedFCGSolver;
    \n+
    1688
    \n+
    1689 // don't shadow four-argument version of apply defined in the base class
    \n+\n+
    1691
    \n+
    1692 // just a minor part of the RestartedFCGSolver apply method will be modified
    \n+
    \n+
    1693 virtual void apply (X& x, X& b, InverseOperatorResult& res) override {
    \n+
    1694 // reset limiter of orthogonalization loop
    \n+
    1695 _k_limit = 0;
    \n+
    1696 this->RestartedFCGSolver<X>::apply(x,b,res);
    \n+
    1697 };
    \n+
    \n+
    1698
    \n+
    1699 private:
    \n+
    1700 // This function is called every iteration to orthogonalize against the last search directions.
    \n+
    1701 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 {
    \n+
    1702 // This FCGSolver uses values with higher array indexes too, if existent.
    \n+
    1703 for (int k = 0; k < _k_limit; k++) {
    \n+
    1704 if(i_bounded!=k)
    \n+
    1705 d[i_bounded].axpy(-_sp->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= <<Ad[k],w>/<d[k],Ad[k]>>d[k]
    \n+
    1706 }
    \n+
    1707 // The loop limit increase, if array is not completely filled.
    \n+
    1708 if(_k_limit<=i_bounded)
    \n+
    1709 _k_limit++;
    \n+
    1710
    \n+
    1711 };
    \n+
    1712
    \n+
    1713 // This function is called every mmax iterations to handle limited array sizes.
    \n+
    1714 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 {
    \n+
    1715 // Only the loop index i_bounded return to 0, if it reached mmax.
    \n+
    1716 i_bounded = 0;
    \n+
    1717 // Now all arrays are filled and the loop in void orthogonalizations can use the whole arrays.
    \n+
    1718 _k_limit = Ad.size();
    \n+
    1719 };
    \n+
    1720
    \n+
    1721 int _k_limit = 0;
    \n+
    1722
    \n+
    1723 protected:
    \n+\n+
    1725 using RestartedFCGSolver<X>::_op;
    \n+\n+
    1727 using RestartedFCGSolver<X>::_sp;
    \n+\n+\n+\n+
    1731 };
    \n+
    \n+
    1732 DUNE_REGISTER_ITERATIVE_SOLVER("completefcgsolver", defaultIterativeSolverCreator<Dune::CompleteFCGSolver>());
    \n+
    1734} // end namespace
    \n+
    1735
    \n+
    1736#endif
    \n+
    Implementation of the BCRSMatrix class.
    \n+\n+
    Define base class for scalar product and norm.
    \n+\n+\n+\n+
    #define DUNE_REGISTER_ITERATIVE_SOLVER(name,...)
    Definition solverregistry.hh:19
    \n+
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n+
    Define general, extensible interface for inverse operators.
    \n+\n
    Definition allocator.hh:11
    \n+
    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
    \n+
    typename std::allocator_traits< typename AllocatorTraits< T >::type >::template rebind_alloc< X > ReboundAllocatorType
    Definition allocator.hh:37
    \n
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    Iterator end()
    Get iterator to one beyond last row.
    Definition bcrsmatrix.hh:677
    \n-
    row_type::Iterator ColIterator
    Iterator for the entries of each row.
    Definition bcrsmatrix.hh:700
    \n-
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n+
    @ row_wise
    Build in a row-wise manner.
    Definition bcrsmatrix.hh:517
    \n+
    CreateIterator createend()
    get create iterator pointing to one after the last block
    Definition bcrsmatrix.hh:1100
    \n
    CreateIterator createbegin()
    get initial create iterator
    Definition bcrsmatrix.hh:1094
    \n-
    Iterator access to matrix rows
    Definition bcrsmatrix.hh:575
    \n-
    Iterator class for sequential creation of blocks
    Definition bcrsmatrix.hh:954
    \n-
    void insert(size_type j)
    put column index in row
    Definition bcrsmatrix.hh:1061
    \n-
    Helper TMP to get the result type of a sparse matrix matrix multiplication ( )
    Definition matrixmatrix.hh:510
    \n-
    Helper TMP to get the result type of a sparse matrix matrix multiplication ( )
    Definition matrixmatrix.hh:535
    \n-
    Definition matrixutils.hh:27
    \n+
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n+
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n+
    Wrapper to use a range of ARPACK++ eigenvalue solvers.
    Definition arpackpp.hh:245
    \n+
    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
    \n+
    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
    \n+
    Thrown when a solver aborts due to some problem.
    Definition istlexception.hh:46
    \n+
    A linear operator.
    Definition operators.hh:69
    \n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    Base class for scalar product and norm computation.
    Definition scalarproducts.hh:52
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    double condition_estimate
    Estimate of condition number.
    Definition solver.hh:81
    \n+
    void clear()
    Resets all data.
    Definition solver.hh:58
    \n+
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n+
    Simd::Scalar< real_type > scalar_real_type
    scalar type underlying the field_type
    Definition solver.hh:116
    \n+
    Y range_type
    Type of the range of the operator to be inverted.
    Definition solver.hh:107
    \n+
    X domain_type
    Type of the domain of the operator to be inverted.
    Definition solver.hh:104
    \n+
    X::field_type field_type
    The field type of the operator.
    Definition solver.hh:110
    \n+
    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:113
    \n+
    Base class for all implementations of iterative solvers.
    Definition solver.hh:205
    \n+
    std::shared_ptr< const ScalarProduct< X > > _sp
    Definition solver.hh:508
    \n+
    std::shared_ptr< const LinearOperator< X, X > > _op
    Definition solver.hh:506
    \n+
    int _maxit
    Definition solver.hh:510
    \n+
    int _verbose
    Definition solver.hh:511
    \n+
    scalar_real_type _reduction
    Definition solver.hh:509
    \n+
    std::shared_ptr< Preconditioner< X, X > > _prec
    Definition solver.hh:507
    \n+
    Preconditioned loop solver.
    Definition solvers.hh:59
    \n+
    virtual void apply(X &x, X &b, InverseOperatorResult &res)
    Apply inverse operator,.
    Definition solvers.hh:73
    \n+
    typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
    Definition solvers.hh:116
    \n+
    gradient method
    Definition solvers.hh:124
    \n+
    virtual void apply(X &x, X &b, InverseOperatorResult &res)
    Apply inverse operator.
    Definition solvers.hh:142
    \n+
    typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
    Definition solvers.hh:187
    \n+
    conjugate gradient method
    Definition solvers.hh:193
    \n+
    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
    \n+
    static constexpr bool enableConditionEstimate
    Definition solvers.hh:208
    \n+
    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
    \n+
    virtual void apply(X &x, X &b, InverseOperatorResult &res)
    Apply inverse operator.
    Definition solvers.hh:279
    \n+
    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
    \n+
    typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
    Definition solvers.hh:412
    \n+
    Bi-conjugate Gradient Stabilized (BiCG-STAB)
    Definition solvers.hh:419
    \n+
    typename IterativeSolver< X, X >::template Iteration< CountType > Iteration
    Definition solvers.hh:598
    \n+
    virtual void apply(X &x, X &b, InverseOperatorResult &res)
    Apply inverse operator.
    Definition solvers.hh:439
    \n+
    Minimal Residual Method (MINRES)
    Definition solvers.hh:609
    \n+
    virtual void apply(X &x, X &b, InverseOperatorResult &res)
    Apply inverse operator.
    Definition solvers.hh:627
    \n+
    typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
    Definition solvers.hh:808
    \n+
    implements the Generalized Minimal Residual (GMRes) method
    Definition solvers.hh:827
    \n+
    RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
    Constructor.
    Definition solvers.hh:878
    \n+
    std::enable_if<!std::is_same< field_type, real_type >::value, T >::type conjugate(const T &t)
    Definition solvers.hh:1067
    \n+
    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
    \n+
    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
    \n+
    std::enable_if< std::is_same< field_type, real_type >::value, T >::type conjugate(const T &t)
    Definition solvers.hh:1062
    \n+
    ReboundAllocatorType< X, field_type > fAlloc
    field_type Allocator retrieved from domain type
    Definition solvers.hh:838
    \n+
    int _restart
    Definition solvers.hh:1120
    \n+
    ReboundAllocatorType< X, real_type > rAlloc
    real_type Allocator retrieved from domain type
    Definition solvers.hh:840
    \n+
    virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)
    Apply inverse operator.
    Definition solvers.hh:923
    \n+
    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
    \n+
    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
    \n+
    void generatePlaneRotation(field_type &dx, field_type &dy, real_type &cs, field_type &sn)
    Definition solvers.hh:1073
    \n+
    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
    \n+
    virtual void apply(X &x, Y &b, InverseOperatorResult &res)
    Apply inverse operator.
    Definition solvers.hh:910
    \n+
    typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
    Definition solvers.hh:1119
    \n+
    void applyPlaneRotation(field_type &dx, field_type &dy, real_type &cs, field_type &sn)
    Definition solvers.hh:1106
    \n+
    implements the Flexible Generalized Minimal Residual (FGMRes) method (right preconditioned)
    Definition solvers.hh:1139
    \n+
    void apply(X &x, Y &b, double reduction, InverseOperatorResult &res) override
    Apply inverse operator.
    Definition solvers.hh:1169
    \n+
    Generalized preconditioned conjugate gradient solver.
    Definition solvers.hh:1307
    \n+
    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
    \n+
    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
    \n+
    virtual void apply(X &x, X &b, InverseOperatorResult &res)
    Apply inverse operator.
    Definition solvers.hh:1391
    \n+
    GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
    Constructor.
    Definition solvers.hh:1361
    \n+
    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
    \n+
    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
    \n+
    Accelerated flexible conjugate gradient method.
    Definition solvers.hh:1500
    \n+
    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:1518
    \n+
    RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &config)
    Constructor.
    Definition solvers.hh:1558
    \n+
    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:1538
    \n+
    int _mmax
    Definition solvers.hh:1661
    \n+
    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:1564
    \n+
    typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration
    Definition solvers.hh:1668
    \n+
    virtual void apply(X &x, X &b, InverseOperatorResult &res)
    Apply inverse operator.
    Definition solvers.hh:1583
    \n+
    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:1528
    \n+
    Complete flexible conjugate gradient method.
    Definition solvers.hh:1679
    \n+
    virtual void apply(X &x, X &b, InverseOperatorResult &res) override
    Apply inverse operator.
    Definition solvers.hh:1693
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,742 +1,1928 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-matrixmatrix.hh\n+solvers.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_MATRIXMATRIX_HH\n-6#define DUNE_ISTL_MATRIXMATRIX_HH\n-7\n-8#include \n-9\n-10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-11#include \n-12#include \n-13namespace _\bD_\bu_\bn_\be\n-14{\n-15\n-26 namespace\n-27 {\n-28\n-37 template\n-38 struct NonzeroPatternTraverser\n-39 {};\n-40\n-41\n-42 template<>\n-43 struct NonzeroPatternTraverser<0>\n-44 {\n-45 template\n-46 static void traverse(const _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,A1>& A,\n-47 const _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>& B,\n-48 F& func)\n-49 {\n-50 if(A.M()!=B.N())\n-51 DUNE_THROW(ISTLError, \"The sizes of the matrices do not match: \"<,A1>::\n-ConstRowIterator Row;\n-54 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,A1>::\n-ConstColIterator Col;\n-55 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>::\n-ConstColIterator BCol;\n-56 for(Row row= A.begin(); row != A.end(); ++row) {\n-57 // Loop over all column entries\n-58 for(Col _\bc_\bo_\bl = row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl) {\n-59 // entry at i,k\n-60 // search for all nonzeros in row k\n-61 for(BCol bcol = B[_\bc_\bo_\bl.index()].begin(); bcol != B[_\bc_\bo_\bl.index()].end();\n-++bcol) {\n-62 func(*_\bc_\bo_\bl, *bcol, row.index(), bcol.index());\n-63 }\n-64 }\n-65 }\n-66 }\n-67\n-68 };\n-69\n-70 template<>\n-71 struct NonzeroPatternTraverser<1>\n-72 {\n-73 template\n-74 static void traverse(const _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bn_\b>,A1>& A,\n-75 const _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>& B,\n-76 F& func)\n-77 {\n-78\n-79 if(A.N()!=B.N())\n-80 DUNE_THROW(ISTLError, \"The sizes of the matrices do not match: \"<,A1>::\n-ConstRowIterator Row;\n-83 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bn_\b>,A1>::\n-ConstColIterator Col;\n-84 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>::\n-ConstColIterator BCol;\n-85\n-86 for(Row row=A.begin(); row!=A.end(); ++row) {\n-87 for(Col _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl!=row->end(); ++_\bc_\bo_\bl) {\n-88 for(BCol bcol = B[row.index()].begin(); bcol != B[row.index()].end();\n-++bcol) {\n-89 func(*_\bc_\bo_\bl, *bcol, _\bc_\bo_\bl.index(), bcol.index());\n-90 }\n-91 }\n-92 }\n-93 }\n-94 };\n-95\n-96 template<>\n-97 struct NonzeroPatternTraverser<2>\n-98 {\n-99 template\n-100 static void traverse(const BCRSMatrix,A1>& _\bm_\ba_\bt,\n-101 const BCRSMatrix,A2>& matt,\n-102 F& func)\n-103 {\n-104 if(_\bm_\ba_\bt.M()!=matt.M())\n-105 DUNE_THROW(ISTLError, \"The sizes of the matrices do not match: \"<<_\bm_\ba_\bt.M\n-()<<\"!=\"<,A1>::ConstRowIterator\n-row_iterator;\n-108 typedef typename BCRSMatrix,A1>::ConstColIterator\n-col_iterator;\n-109 typedef typename BCRSMatrix,A2>::ConstRowIterator\n-row_iterator_t;\n-110 typedef typename BCRSMatrix,A2>::ConstColIterator\n-col_iterator_t;\n-111\n-112 for(row_iterator mrow=_\bm_\ba_\bt.begin(); mrow != _\bm_\ba_\bt.end(); ++mrow) {\n-113 //iterate over the column entries\n-114 // mt is a transposed matrix crs therefore it is treated as a ccs matrix\n-115 // and the row_iterator iterates over the columns of the transposed matrix.\n-116 // search the row of the transposed matrix for an entry with the same index\n-117 // as the mcol iterator\n-118\n-119 for(row_iterator_t mtcol=matt.begin(); mtcol != matt.end(); ++mtcol) {\n-120 //Search for col entries in mat that have a corresponding row index in matt\n-121 // (i.e. corresponding col index in the as this is the transposed matrix\n-122 col_iterator_t mtrow=mtcol->begin();\n-123 bool funcCalled = false;\n-124 for(col_iterator mcol=mrow->begin(); mcol != mrow->end(); ++mcol) {\n-125 // search\n-126 // TODO: This should probably be substituted by a binary search\n-127 for( ; mtrow != mtcol->end(); ++mtrow)\n-128 if(mtrow.index()>=mcol.index())\n-129 break;\n-130 if(mtrow != mtcol->end() && mtrow.index()==mcol.index()) {\n-131 func(*mcol, *mtrow, mtcol.index());\n-132 funcCalled = true;\n-133 // In some cases we only search for one pair, then we break here\n-134 // and continue with the next column.\n-135 if(F::do_break)\n-136 break;\n-137 }\n-138 }\n-139 // move on with func only if func was called, otherwise they might\n-140 // get out of sync\n-141 if (funcCalled)\n-142 func.nextCol();\n-143 }\n-144 func.nextRow();\n-145 }\n-146 }\n-147 };\n+5\n+6#ifndef DUNE_ISTL_SOLVERS_HH\n+7#define DUNE_ISTL_SOLVERS_HH\n+8\n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15#include \n+16\n+17#include \n+18#include \n+19#include \n+20#include \n+21#include \n+22#include \n+23\n+24#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b._\bh_\bh>\n+25#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+26#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\be_\bi_\bg_\be_\bn_\bv_\ba_\bl_\bu_\be_\b/_\ba_\br_\bp_\ba_\bc_\bk_\bp_\bp_\b._\bh_\bh>\n+27#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+28#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+29#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh>\n+30#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh>\n+31#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n+32#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh>\n+33\n+34namespace _\bD_\bu_\bn_\be {\n+46 //=====================================================================\n+47 // Implementation of this interface\n+48 //=====================================================================\n+49\n+58 template\n+_\b5_\b9 class _\bL_\bo_\bo_\bp_\bS_\bo_\bl_\bv_\be_\br : public _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br {\n+60 public:\n+61 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+62 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+63 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+64 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+65\n+66 // copy base class constructors\n+67 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::IterativeSolver;\n+68\n+69 // don't shadow four-argument version of apply defined in the base class\n+70 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by;\n+71\n+_\b7_\b3 virtual void _\ba_\bp_\bp_\bl_\by (X& x, X& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+74 {\n+75 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn iteration(*this, res);\n+76 _\b__\bp_\br_\be_\bc->pre(x,b);\n+77\n+78 // overwrite b with defect\n+79 _\b__\bo_\bp->applyscaleadd(-1,x,b);\n+80\n+81 // compute norm, \\todo parallelization\n+82 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be def = _\b__\bs_\bp->norm(b);\n+83 if(iteration.step(0, def)){\n+84 _\b__\bp_\br_\be_\bc->post(x);\n+85 return;\n+86 }\n+87 // prepare preconditioner\n+88\n+89 // allocate correction vector\n+90 X v(x);\n+91\n+92 // iteration loop\n+93 int i=1;\n+94 for ( ; i<=_\b__\bm_\ba_\bx_\bi_\bt; i++ )\n+95 {\n+96 v = 0; // clear correction\n+97 _\b__\bp_\br_\be_\bc->apply(v,b); // apply preconditioner\n+98 x += v; // update solution\n+99 _\b__\bo_\bp->applyscaleadd(-1,v,b); // update defect\n+100 def=_\b__\bs_\bp->norm(b); // comp defect norm\n+101 if(iteration.step(i, def))\n+102 break;\n+103 }\n+104\n+105 // postprocess preconditioner\n+106 _\b__\bp_\br_\be_\bc->post(x);\n+107 }\n+108\n+109 protected:\n+110 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bo_\bp;\n+111 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bp_\br_\be_\bc;\n+112 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bs_\bp;\n+113 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+114 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt;\n+115 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n+_\b1_\b1_\b6 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn = typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b<_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\b _\bi_\bn_\bt_\b>;\n+117 };\n+_\b1_\b1_\b8 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"loopsolver\",\n+defaultIterativeSolverCreator());\n+119\n+120\n+121 // all these solvers are taken from the SUMO library\n+123 template\n+_\b1_\b2_\b4 class _\bG_\br_\ba_\bd_\bi_\be_\bn_\bt_\bS_\bo_\bl_\bv_\be_\br : public _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br {\n+125 public:\n+126 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+127 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+128 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+129 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+130\n+131 // copy base class constructors\n+132 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::IterativeSolver;\n+133\n+134 // don't shadow four-argument version of apply defined in the base class\n+135 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by;\n+136\n+_\b1_\b4_\b2 virtual void _\ba_\bp_\bp_\bl_\by (X& x, X& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+143 {\n+144 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn iteration(*this, res);\n+145 _\b__\bp_\br_\be_\bc->pre(x,b); // prepare preconditioner\n+146\n+147 _\b__\bo_\bp->applyscaleadd(-1,x,b); // overwrite b with defec\n 148\n-149\n-150\n-151 template\n-152 class SparsityPatternInitializer\n-153 {\n-154 public:\n-_\b1_\b5_\b5 enum {_\bd_\bo_\b__\bb_\br_\be_\ba_\bk=true};\n-_\b1_\b5_\b6 typedef typename _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A>_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b1_\b5_\b7 typedef typename _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-158\n-159 SparsityPatternInitializer(_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iter)\n-160 : rowiter(iter)\n-161 {}\n-162\n-163 template\n-164 void operator()(const T1&, const T2&, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n-165 {\n-166 rowiter._\bi_\bn_\bs_\be_\br_\bt(j);\n-167 }\n-168\n-169 void nextRow()\n-170 {\n-171 ++rowiter;\n-172 }\n-173 void nextCol()\n-174 {}\n-175\n-176 private:\n-177 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br rowiter;\n-178 };\n+149 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be def = _\b__\bs_\bp->norm(b); // compute norm\n+150 if(iteration.step(0, def)){\n+151 _\b__\bp_\br_\be_\bc->post(x);\n+152 return;\n+153 }\n+154\n+155 X p(x); // create local vectors\n+156 X q(b);\n+157\n+158 int i=1; // loop variables\n+159 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be lambda;\n+160 for ( ; i<=_\b__\bm_\ba_\bx_\bi_\bt; i++ )\n+161 {\n+162 p = 0; // clear correction\n+163 _\b__\bp_\br_\be_\bc->apply(p,b); // apply preconditioner\n+164 _\b__\bo_\bp->apply(p,q); // q=Ap\n+165 auto alpha = _\b__\bs_\bp->dot(q,p);\n+166 lambda = Simd::cond(def==_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+167 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.), // no need for minimization if def is already 0\n+168 _\b__\bs_\bp->dot(p,b)/alpha); // minimization\n+169 x.axpy(lambda,p); // update solution\n+170 b.axpy(-lambda,q); // update defect\n+171\n+172 def =_\b__\bs_\bp->norm(b); // comp defect norm\n+173 if(iteration.step(i, def))\n+174 break;\n+175 }\n+176 // postprocess preconditioner\n+177 _\b__\bp_\br_\be_\bc->post(x);\n+178 }\n 179\n-180\n-181 template\n-182 class MatrixInitializer\n-183 {\n-184 public:\n-_\b1_\b8_\b5 enum {_\bd_\bo_\b__\bb_\br_\be_\ba_\bk=true};\n-_\b1_\b8_\b6 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,TA> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b1_\b8_\b7 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b1_\b8_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-189\n-190 MatrixInitializer(_\bM_\ba_\bt_\br_\bi_\bx& A_, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be)\n-191 : count(0), A(A_)\n-192 {}\n-193 template\n-194 void operator()(const T1&, const T2&, int)\n-195 {\n-196 ++count;\n-197 }\n-198\n-199 void nextCol()\n-200 {}\n-201\n-202 void nextRow()\n-203 {}\n-204\n-205 std::size_t nonzeros()\n-206 {\n-207 return count;\n-208 }\n+180 protected:\n+181 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bo_\bp;\n+182 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bp_\br_\be_\bc;\n+183 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bs_\bp;\n+184 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+185 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt;\n+186 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n+_\b1_\b8_\b7 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn = typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b<_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\b _\bi_\bn_\bt_\b>;\n+188 };\n+_\b1_\b8_\b9 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"gradientsolver\",\n+defaultIterativeSolverCreator());\n+190\n+192 template\n+_\b1_\b9_\b3 class _\bC_\bG_\bS_\bo_\bl_\bv_\be_\br : public _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br {\n+194 public:\n+195 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+196 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+197 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+198 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+199\n+200 // copy base class constructors\n+201 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::IterativeSolver;\n+202\n+203 private:\n+204 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+205\n+206 protected:\n+207\n+_\b2_\b0_\b8 static constexpr bool _\be_\bn_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\bE_\bs_\bt_\bi_\bm_\ba_\bt_\be = (std::\n+is_same_v || std::is_same_v);\n 209\n-210 template\n-211 void initPattern(const BCRSMatrix,A1>& mat1,\n-212 const BCRSMatrix,A2>& mat2)\n-213 {\n-214 SparsityPatternInitializer sparsity(A._\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn());\n-215 NonzeroPatternTraverser::traverse(mat1,mat2,sparsity);\n-216 }\n-217\n-218 private:\n-219 std::size_t count;\n-220 _\bM_\ba_\bt_\br_\bi_\bx& A;\n-221 };\n-222\n-223 template\n-224 class MatrixInitializer<1,T,TA,n,m>\n+210 public:\n+211\n+212 // don't shadow four-argument version of apply defined in the base class\n+213 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by;\n+214\n+_\b2_\b2_\b2 _\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (const _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bX_\b>& op, _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b>& prec,\n+223 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose, bool\n+condition_estimate) : _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op, prec, reduction, maxit,\n+verbose),\n+224 condition_estimate_(condition_estimate)\n 225 {\n-226 public:\n-_\b2_\b2_\b7 enum {_\bd_\bo_\b__\bb_\br_\be_\ba_\bk=false};\n-_\b2_\b2_\b8 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,TA> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b2_\b2_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b2_\b3_\b0 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+226 if (condition_estimate && !_\be_\bn_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\bE_\bs_\bt_\bi_\bm_\ba_\bt_\be) {\n+227 condition_estimate_ = false;\n+228 std::cerr << \"WARNING: Condition estimate was disabled. It is only\n+available for double and float field types!\" << std::endl;\n+229 }\n+230 }\n 231\n-232 MatrixInitializer(_\bM_\ba_\bt_\br_\bi_\bx& A_, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows)\n-233 : A(A_), entries(rows)\n-234 {}\n-235\n-236 template\n-237 void operator()(const T1&, const T2&, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n-238 {\n-239 entries[i].insert(j);\n-240 }\n-241\n-242 void nextCol()\n-243 {}\n-244\n-245 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nonzeros()\n-246 {\n-247 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nnz=0;\n-248 typedef typename std::vector >::const_iterator Iter;\n-249 for(Iter iter = entries.begin(); iter != entries.end(); ++iter)\n-250 nnz+=(*iter).size();\n-251 return nnz;\n-252 }\n-253 template\n-254 void initPattern(const BCRSMatrix,A1>&,\n-255 const BCRSMatrix,A2>&)\n-256 {\n-257 typedef typename std::vector >::const_iterator Iter;\n-258 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br citer = A._\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn();\n-259 for(Iter iter = entries.begin(); iter != entries.end(); ++iter, ++citer) {\n-260 typedef std::set::const_iterator SetIter;\n-261 for(SetIter index=iter->begin(); index != iter->end(); ++index)\n-262 citer._\bi_\bn_\bs_\be_\br_\bt(*index);\n-263 }\n-264 }\n-265\n-266 private:\n-267 _\bM_\ba_\bt_\br_\bi_\bx& A;\n-268 std::vector > entries;\n-269 };\n-270\n-271 template\n-272 struct MatrixInitializer<0,T,TA,n,m>\n-273 : public MatrixInitializer<1,T,TA,n,m>\n-274 {\n-275 MatrixInitializer(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,TA>& A_,\n-276 typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,TA>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows)\n-277 : MatrixInitializer<1,T,TA,n,m>(A_,rows)\n-278 {}\n-279 };\n-280\n-281\n-282 template\n-283 void addMatMultTransposeMat(FieldMatrix& res, const\n-FieldMatrix& _\bm_\ba_\bt,\n-284 const FieldMatrix& matt)\n-285 {\n-286 typedef typename FieldMatrix::size_type size_type;\n-287\n-288 for(size_type row=0; row& op, const _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bX_\b>& sp,\n+_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b>& prec,\n+240 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose, bool\n+condition_estimate) : _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op, sp, prec, reduction, maxit,\n+verbose),\n+241 condition_estimate_(condition_estimate)\n+242 {\n+243 if (condition_estimate && !(std::is_same::value || std::\n+is_same::value)) {\n+244 condition_estimate_ = false;\n+245 std::cerr << \"WARNING: Condition estimate was disabled. It is only\n+available for double and float field types!\" << std::endl;\n+246 }\n+247 }\n+248\n+_\b2_\b5_\b6 _\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr> op, std::\n+shared_ptr<_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bX_\b>> sp,\n+257 std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b>> prec,\n+258 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose, bool\n+condition_estimate)\n+259 : _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op, sp, prec, reduction, maxit, verbose),\n+260 condition_estimate_(condition_estimate)\n+261 {\n+262 if (condition_estimate && !(std::is_same::value || std::\n+is_same::value)) {\n+263 condition_estimate_ = false;\n+264 std::cerr << \"WARNING: Condition estimate was disabled. It is only\n+available for double and float field types!\" << std::endl;\n+265 }\n+266 }\n+267\n+_\b2_\b7_\b9 virtual void _\ba_\bp_\bp_\bl_\by (X& x, X& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+280 {\n+281 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn iteration(*this,res);\n+282 _\b__\bp_\br_\be_\bc->pre(x,b); // prepare preconditioner\n+283\n+284 _\b__\bo_\bp->applyscaleadd(-1,x,b); // overwrite b with defect\n+285\n+286 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be def = _\b__\bs_\bp->norm(b); // compute norm\n+287 if(iteration.step(0, def)){\n+288 _\b__\bp_\br_\be_\bc->post(x);\n+289 return;\n+290 }\n+291\n+292 X p(x); // the search direction\n+293 X q(x); // a temporary vector\n 294\n-295 template\n-296 void addTransposeMatMultMat(FieldMatrix& res, const\n-FieldMatrix& _\bm_\ba_\bt,\n-297 const FieldMatrix& matt)\n-298 {\n-299 typedef typename FieldMatrix::size_type size_type;\n-300 for(size_type i=0; i lambdas(0);\n+297 std::vector betas(0);\n+298\n+299 // some local variables\n+300 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be rho,rholast,lambda,alpha,beta;\n+301\n+302 // determine initial search direction\n+303 p = 0; // clear correction\n+304 _\b__\bp_\br_\be_\bc->apply(p,b); // apply preconditioner\n+305 rholast = _\b__\bs_\bp->dot(p,b); // orthogonalization\n 306\n-307 template\n-308 void addMatMultMat(FieldMatrix& res, const FieldMatrix& _\bm_\ba_\bt,\n-309 const FieldMatrix& matt)\n+307 // the loop\n+308 int i=1;\n+309 for ( ; i<=_\b__\bm_\ba_\bx_\bi_\bt; i++ )\n 310 {\n-311 typedef typename FieldMatrix::size_type size_type;\n-312 for(size_type row=0; row\n-321 class EntryAccumulatorFather\n-322 {\n-323 public:\n-_\b3_\b2_\b4 enum {_\bd_\bo_\b__\bb_\br_\be_\ba_\bk=false};\n-_\b3_\b2_\b5 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b3_\b2_\b6 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bR_\bo_\bw;\n-_\b3_\b2_\b7 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bl;\n-328\n-329 EntryAccumulatorFather(_\bM_\ba_\bt_\br_\bi_\bx& mat_)\n-330 : _\bm_\ba_\bt(mat_), row(_\bm_\ba_\bt.begin())\n-331 {\n-332 _\bm_\ba_\bt=0;\n-333 _\bc_\bo_\bl=row->begin();\n-334 }\n-335 void nextRow()\n-336 {\n-337 ++row;\n-338 if(row!=_\bm_\ba_\bt._\be_\bn_\bd())\n-339 _\bc_\bo_\bl=row->begin();\n-340 }\n-341\n-342 void nextCol()\n-343 {\n-344 ++this->_\bc_\bo_\bl;\n-345 }\n-346 protected:\n-_\b3_\b4_\b7 Matrix& _\bm_\ba_\bt;\n-348 private:\n-349 _\bR_\bo_\bw row;\n-350 protected:\n-_\b3_\b5_\b1 _\bC_\bo_\bl _\bc_\bo_\bl;\n-352 };\n-353\n-354 template\n-355 class EntryAccumulator\n-356 : public EntryAccumulatorFather\n-357 {\n-358 public:\n-_\b3_\b5_\b9 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b3_\b6_\b0 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-361\n-362 EntryAccumulator(_\bM_\ba_\bt_\br_\bi_\bx& mat_)\n-363 : EntryAccumulatorFather(mat_)\n-364 {}\n-365\n-366 template\n-367 void operator()(const T1& t1, const T2& t2, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-368 {\n-369 assert(this->_\bc_\bo_\bl.index()==i);\n-370 addMatMultMat(*(this->_\bc_\bo_\bl),t1,t2);\n+311 // minimize in given search direction p\n+312 _\b__\bo_\bp->apply(p,q); // q=Ap\n+313 alpha = _\b__\bs_\bp->dot(p,q); // scalar product\n+314 lambda = Simd::cond(def==_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.), _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.), rholast/alpha); /\n+/ minimization\n+315 if constexpr (_\be_\bn_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\bE_\bs_\bt_\bi_\bm_\ba_\bt_\be)\n+316 if (condition_estimate_)\n+317 lambdas.push_back(std::real(lambda));\n+318 x.axpy(lambda,p); // update solution\n+319 b.axpy(-lambda,q); // update defect\n+320\n+321 // convergence test\n+322 def=_\b__\bs_\bp->norm(b); // comp defect norm\n+323 if(iteration.step(i, def))\n+324 break;\n+325\n+326 // determine new search direction\n+327 q = 0; // clear correction\n+328 _\b__\bp_\br_\be_\bc->apply(q,b); // apply preconditioner\n+329 rho = _\b__\bs_\bp->dot(q,b); // orthogonalization\n+330 beta = Simd::cond(def==_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.), _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.), rho/rholast); /\n+/ scaling factor\n+331 if constexpr (_\be_\bn_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\bE_\bs_\bt_\bi_\bm_\ba_\bt_\be)\n+332 if (condition_estimate_)\n+333 betas.push_back(std::real(beta));\n+334 p *= beta; // scale old search direction\n+335 p += q; // orthogonalization with correction\n+336 rholast = rho; // remember rho for recurrence\n+337 }\n+338\n+339 _\b__\bp_\br_\be_\bc->post(x); // postprocess preconditioner\n+340\n+341 if (condition_estimate_) {\n+342#if HAVE_ARPACKPP\n+343 if constexpr (_\be_\bn_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\bE_\bs_\bt_\bi_\bm_\ba_\bt_\be) {\n+344 using std::sqrt;\n+345\n+346 // Build T matrix which has extreme eigenvalues approximating\n+347 // those of the original system\n+348 // (see Y. Saad, Iterative methods for sparse linear systems)\n+349\n+350 _\bC_\bO_\bN_\bD_\b__\bM_\bA_\bT T(i, i, _\bC_\bO_\bN_\bD_\b__\bM_\bA_\bT_\b:_\b:_\br_\bo_\bw_\b__\bw_\bi_\bs_\be);\n+351\n+352 for (auto row = T._\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn(); row != T._\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd(); ++row) {\n+353 if (row.index() > 0)\n+354 row.insert(row.index()-1);\n+355 row.insert(row.index());\n+356 if (row.index() < T._\bN() - 1)\n+357 row.insert(row.index()+1);\n+358 }\n+359 for (int row = 0; row < i; ++row) {\n+360 if (row > 0) {\n+361 T[row][row-1] = sqrt(betas[row-1]) / lambdas[row-1];\n+362 }\n+363\n+364 T[row][row] = 1.0 / lambdas[row];\n+365 if (row > 0) {\n+366 T[row][row] += betas[row-1] / lambdas[row-1];\n+367 }\n+368\n+369 if (row < i - 1) {\n+370 T[row][row+1] = sqrt(betas[row]) / lambdas[row];\n 371 }\n-372 };\n+372 }\n 373\n-374 template\n-375 class EntryAccumulator\n-376 : public EntryAccumulatorFather\n-377 {\n-378 public:\n-_\b3_\b7_\b9 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b3_\b8_\b0 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-381\n-382 EntryAccumulator(_\bM_\ba_\bt_\br_\bi_\bx& mat_)\n-383 : EntryAccumulatorFather(mat_)\n-384 {}\n-385\n-386 template\n-387 void operator()(const T1& t1, const T2& t2, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n-388 {\n-389 addMatMultMat(this->mat[i][j], t1, t2);\n+374 // Compute largest and smallest eigenvalue of T matrix and return as\n+estimate\n+375 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b<_\bC_\bO_\bN_\bD_\b__\bM_\bA_\bT_\b,_\b _\bC_\bO_\bN_\bD_\b__\bV_\bE_\bC_\b> arpack(T);\n+376\n+377 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be eps = 0.0;\n+378 _\bC_\bO_\bN_\bD_\b__\bV_\bE_\bC eigv;\n+379 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be min_eigv, max_eigv;\n+380 arpack._\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\bi_\bn_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be (eps, eigv, min_eigv);\n+381 arpack._\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\ba_\bx_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be (eps, eigv, max_eigv);\n+382\n+383 res._\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\b__\be_\bs_\bt_\bi_\bm_\ba_\bt_\be = max_eigv / min_eigv;\n+384\n+385 if (this->_\b__\bv_\be_\br_\bb_\bo_\bs_\be > 0) {\n+386 std::cout << \"Min eigv estimate: \" << Simd::io(min_eigv) << '\\n';\n+387 std::cout << \"Max eigv estimate: \" << Simd::io(max_eigv) << '\\n';\n+388 std::cout << \"Condition estimate: \"\n+389 << Simd::io(max_eigv / min_eigv) << std::endl;\n 390 }\n-391 };\n-392\n-393 template\n-394 class EntryAccumulator\n-395 : public EntryAccumulatorFather\n-396 {\n-397 public:\n-_\b3_\b9_\b8 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b3_\b9_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+391 }\n+392#else\n+393 std::cerr << \"WARNING: Condition estimate was requested. This requires\n+ARPACK, but ARPACK was not found!\" << std::endl;\n+394#endif\n+395 }\n+396 }\n+397\n+398 private:\n+399 bool condition_estimate_ = false;\n 400\n-401 EntryAccumulator(_\bM_\ba_\bt_\br_\bi_\bx& mat_)\n-402 : EntryAccumulatorFather(mat_)\n-403 {}\n+401 // Matrix and vector types used for condition estimate\n+402 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be_\b,_\b1_\b,_\b1_\b> > COND_MAT;\n+403 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be_\b,_\b1_\b> > COND_VEC;\n 404\n-405 template\n-406 void operator()(const T1& t1, const T2& t2, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n-407 {\n-408 addTransposeMatMultMat(this->mat[i][j], t1, t2);\n-409 }\n-410 };\n-411\n-412 template\n-413 class EntryAccumulator\n-414 : public EntryAccumulatorFather\n-415 {\n-416 public:\n-_\b4_\b1_\b7 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b4_\b1_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-419\n-420 EntryAccumulator(_\bM_\ba_\bt_\br_\bi_\bx& mat_)\n-421 : EntryAccumulatorFather(mat_)\n-422 {}\n-423\n-424 template\n-425 void operator()(const T1& t1, const T2& t2, [[maybe_unused]] _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-426 {\n-427 assert(this->_\bc_\bo_\bl.index()==i);\n-428 addMatMultTransposeMat(*this->_\bc_\bo_\bl,t1,t2);\n-429 }\n-430 };\n+405 protected:\n+406 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bo_\bp;\n+407 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bp_\br_\be_\bc;\n+408 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bs_\bp;\n+409 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+410 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt;\n+411 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n+_\b4_\b1_\b2 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn = typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b<_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\b _\bi_\bn_\bt_\b>;\n+413 };\n+_\b4_\b1_\b4 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"cgsolver\",\n+defaultIterativeSolverCreator());\n+415\n+416 // Ronald Kriemanns BiCG-STAB implementation from Sumo\n+418 template\n+_\b4_\b1_\b9 class _\bB_\bi_\bC_\bG_\bS_\bT_\bA_\bB_\bS_\bo_\bl_\bv_\be_\br : public _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br {\n+420 public:\n+421 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+422 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+423 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+424 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+425\n+426 // copy base class constructors\n+427 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::IterativeSolver;\n+428\n+429 // don't shadow four-argument version of apply defined in the base class\n+430 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by;\n 431\n-432\n-433 template\n-434 struct SizeSelector\n-435 {};\n-436\n-437 template<>\n-438 struct SizeSelector<0>\n-439 {\n-440 template\n-441 static std::tuple\n-442 size(const M1& m1, const M2& m2)\n-443 {\n-444 return std::make_tuple(m1.N(), m2.M());\n-445 }\n-446 };\n+_\b4_\b3_\b9 virtual void _\ba_\bp_\bp_\bl_\by (X& x, X& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+440 {\n+441 using std::abs;\n+442 const Simd::Scalar EPSILON=1e-80;\n+443 using std::abs;\n+444 double it;\n+445 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be rho, rho_new, alpha, beta, h, omega;\n+446 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm;\n 447\n-448 template<>\n-449 struct SizeSelector<1>\n-450 {\n-451 template\n-452 static std::tuple\n-453 size(const M1& m1, const M2& m2)\n-454 {\n-455 return std::make_tuple(m1.M(), m2.M());\n-456 }\n-457 };\n-458\n-459\n-460 template<>\n-461 struct SizeSelector<2>\n-462 {\n-463 template\n-464 static std::tuple\n-465 size(const M1& m1, const M2& m2)\n-466 {\n-467 return std::make_tuple(m1.N(), m2.N());\n-468 }\n-469 };\n-470\n-471 template\n-472 void _\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt(BCRSMatrix,A>& res, const\n-BCRSMatrix,A1>& mat1,\n-473 const BCRSMatrix,A2>& mat2)\n-474 {\n-475 // First step is to count the number of nonzeros\n-476 typename BCRSMatrix,A>::size_type rows, cols;\n-477 std::tie(rows,cols)=SizeSelector::size(mat1, mat2);\n-478 MatrixInitializer patternInit(res, rows);\n-479 Timer timer;\n-480 NonzeroPatternTraverser::traverse(mat1,mat2,patternInit);\n-481 res.setSize(rows, cols, patternInit.nonzeros());\n-482 res.setBuildMode(BCRSMatrix,A>::row_wise);\n-483\n-484 //std::cout<<\"Counting nonzeros took \"< entriesAccu(res);\n-495 NonzeroPatternTraverser::traverse(mat1,mat2,entriesAccu);\n-496 //std::cout<<\"Calculating entries took \"<\n-_\b5_\b0_\b9 struct _\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt\n-510 {};\n-511\n-512 template\n-_\b5_\b1_\b3 struct _\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n-514 {\n-_\b5_\b1_\b5 typedef _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b> _\bt_\by_\bp_\be;\n-516 };\n+448 //\n+449 // get vectors and matrix\n+450 //\n+451 X& r=b;\n+452 X p(x);\n+453 X v(x);\n+454 X t(x);\n+455 X y(x);\n+456 X rt(x);\n+457\n+458 //\n+459 // begin iteration\n+460 //\n+461\n+462 // r = r - Ax; rt = r\n+463 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b<_\bd_\bo_\bu_\bb_\bl_\be_\b> iteration(*this,res);\n+464 _\b__\bp_\br_\be_\bc->pre(x,r); // prepare preconditioner\n+465\n+466 _\b__\bo_\bp->applyscaleadd(-1,x,r); // overwrite b with defect\n+467\n+468 rt=r;\n+469\n+470 norm = _\b__\bs_\bp->norm(r);\n+471 if(iteration.step(0, norm)){\n+472 _\b__\bp_\br_\be_\bc->post(x);\n+473 return;\n+474 }\n+475 p=0;\n+476 v=0;\n+477\n+478 rho = 1;\n+479 alpha = 1;\n+480 omega = 1;\n+481\n+482 //\n+483 // iteration\n+484 //\n+485\n+486 for (it = 0.5; it < _\b__\bm_\ba_\bx_\bi_\bt; it+=.5)\n+487 {\n+488 //\n+489 // preprocess, set vecsizes etc.\n+490 //\n+491\n+492 // rho_new = < rt , r >\n+493 rho_new = _\b__\bs_\bp->dot(rt,r);\n+494\n+495 // look if breakdown occurred\n+496 if (Simd::allTrue(abs(rho) <= EPSILON))\n+497 DUNE_THROW(_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt,\"breakdown in BiCGSTAB - rho \"\n+498 << Simd::io(rho) << \" <= EPSILON \" << EPSILON\n+499 << \" after \" << it << \" iterations\");\n+500 if (Simd::allTrue(abs(omega) <= EPSILON))\n+501 DUNE_THROW(_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt,\"breakdown in BiCGSTAB - omega \"\n+502 << Simd::io(omega) << \" <= EPSILON \" << EPSILON\n+503 << \" after \" << it << \" iterations\");\n+504\n+505\n+506 if (it<1)\n+507 p = r;\n+508 else\n+509 {\n+510 beta = Simd::cond(norm==_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+511 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.), // no need for orthogonalization if norm is already 0\n+512 ( rho_new / rho ) * ( alpha / omega ));\n+513 p.axpy(-omega,v); // p = r + beta (p - omega*v)\n+514 p *= beta;\n+515 p += r;\n+516 }\n 517\n-518 template\n-_\b5_\b1_\b9 struct _\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A\n->,_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A1 > >\n-520 {\n-521 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be\n-_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b> >::type,\n-_\b5_\b2_\b2 std::allocator,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b> >::type> > _\bt_\by_\bp_\be;\n-523 };\n+518 // y = W^-1 * p\n+519 y = 0;\n+520 _\b__\bp_\br_\be_\bc->apply(y,p); // apply preconditioner\n+521\n+522 // v = A * y\n+523 _\b__\bo_\bp->apply(y,v);\n 524\n-525\n-533 template\n-_\b5_\b3_\b4 struct _\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt\n-535 {};\n+525 // alpha = rho_new / < rt, v >\n+526 h = _\b__\bs_\bp->dot(rt,v);\n+527\n+528 if ( Simd::allTrue(abs(h) < EPSILON) )\n+529 DUNE_THROW(_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt,\"abs(h) < EPSILON in BiCGSTAB - abs(h) \"\n+530 << Simd::io(abs(h)) << \" < EPSILON \" << EPSILON\n+531 << \" after \" << it << \" iterations\");\n+532\n+533 alpha = Simd::cond(norm==_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+534 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+535 rho_new / h);\n 536\n-537 template\n-_\b5_\b3_\b8 struct _\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n-539 {\n-_\b5_\b4_\b0 typedef _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b> _\bt_\by_\bp_\be;\n-541 };\n-542\n-543 template\n-_\b5_\b4_\b4 struct _\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A\n->,_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A1 > >\n-545 {\n-546 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be\n-_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b> >::type,\n-_\b5_\b4_\b7 std::allocator,_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b> >::type> > _\bt_\by_\bp_\be;\n-548 };\n-549\n-550\n-559 template\n-_\b5_\b6_\b0 void _\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,A>& res, const\n-_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A1>& _\bm_\ba_\bt,\n-561 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>& matt, [[maybe_unused]] bool\n-tryHard=false)\n-562 {\n-563 matMultMat<2>(res,_\bm_\ba_\bt, matt);\n-564 }\n-565\n-574 template\n-_\b5_\b7_\b5 void _\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A>& res, const\n-_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bk_\b>,A1>& _\bm_\ba_\bt,\n-576 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>& matt, bool tryHard=false)\n-577 {\n-578 matMultMat<0>(res,_\bm_\ba_\bt, matt);\n-579 }\n+537 // apply first correction to x\n+538 // x <- x + alpha y\n+539 x.axpy(alpha,y);\n+540\n+541 // r = r - alpha*v\n+542 r.axpy(-alpha,v);\n+543\n+544 //\n+545 // test stop criteria\n+546 //\n+547\n+548 norm = _\b__\bs_\bp->norm(r);\n+549 if(iteration.step(it, norm)){\n+550 break;\n+551 }\n+552\n+553 it+=.5;\n+554\n+555 // y = W^-1 * r\n+556 y = 0;\n+557 _\b__\bp_\br_\be_\bc->apply(y,r);\n+558\n+559 // t = A * y\n+560 _\b__\bo_\bp->apply(y,t);\n+561\n+562 // omega = < t, r > / < t, t >\n+563 h = _\b__\bs_\bp->dot(t,t);\n+564 omega = Simd::cond(norm==_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+565 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+566 _\b__\bs_\bp->dot(t,r)/h);\n+567\n+568 // apply second correction to x\n+569 // x <- x + omega y\n+570 x.axpy(omega,y);\n+571\n+572 // r = s - omega*t (remember : r = s)\n+573 r.axpy(-omega,t);\n+574\n+575 rho = rho_new;\n+576\n+577 //\n+578 // test stop criteria\n+579 //\n 580\n-589 template\n-_\b5_\b9_\b0 void _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A>& res, const\n-_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bn_\b>,A1>& _\bm_\ba_\bt,\n-591 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bk_\b,_\bm_\b>,A2>& matt, [[maybe_unused]] bool\n-tryHard=false)\n-592 {\n-593 matMultMat<1>(res,_\bm_\ba_\bt, matt);\n-594 }\n-595\n-596}\n-597#endif\n+581 norm = _\b__\bs_\bp->norm(r);\n+582 if(iteration.step(it, norm)){\n+583 break;\n+584 }\n+585 } // end for\n+586\n+587 _\b__\bp_\br_\be_\bc->post(x); // postprocess preconditioner\n+588 }\n+589\n+590 protected:\n+591 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bo_\bp;\n+592 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bp_\br_\be_\bc;\n+593 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bs_\bp;\n+594 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+595 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt;\n+596 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n+597 template\n+_\b5_\b9_\b8 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn = typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b<_\bC_\bo_\bu_\bn_\bt_\bT_\by_\bp_\be_\b>;\n+599 };\n+_\b6_\b0_\b0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"bicgstabsolver\",\n+defaultIterativeSolverCreator());\n+601\n+608 template\n+_\b6_\b0_\b9 class _\bM_\bI_\bN_\bR_\bE_\bS_\bS_\bo_\bl_\bv_\be_\br : public _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br {\n+610 public:\n+611 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+612 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+613 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+614 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+615\n+616 // copy base class constructors\n+617 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::IterativeSolver;\n+618\n+619 // don't shadow four-argument version of apply defined in the base class\n+620 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by;\n+621\n+_\b6_\b2_\b7 virtual void _\ba_\bp_\bp_\bl_\by (X& x, X& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+628 {\n+629 using std::sqrt;\n+630 using std::abs;\n+631 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn iteration(*this, res);\n+632 // prepare preconditioner\n+633 _\b__\bp_\br_\be_\bc->pre(x,b);\n+634\n+635 // overwrite rhs with defect\n+636 _\b__\bo_\bp->applyscaleadd(-1.0,x,b); // b -= Ax\n+637\n+638 // some temporary vectors\n+639 X z(b), dummy(b);\n+640 z = 0.0;\n+641\n+642 // calculate preconditioned defect\n+643 _\b__\bp_\br_\be_\bc->apply(z,b); // r = W^-1 (b - Ax)\n+644 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be def = _\b__\bs_\bp->norm(z);\n+645 if (iteration.step(0, def)){\n+646 _\b__\bp_\br_\be_\bc->post(x);\n+647 return;\n+648 }\n+649\n+650 // recurrence coefficients as computed in Lanczos algorithm\n+651 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha, beta;\n+652 // diagonal entries of givens rotation\n+653 std::array c{{0.0,0.0}};\n+654 // off-diagonal entries of givens rotation\n+655 std::array s{{0.0,0.0}};\n+656\n+657 // recurrence coefficients (column k of tridiag matrix T_k)\n+658 std::array T{{0.0,0.0,0.0}};\n+659\n+660 // the rhs vector of the min problem\n+661 std::array xi{{1.0,0.0}};\n+662\n+663 // beta is real and positive in exact arithmetic\n+664 // since it is the norm of the basis vectors (in unpreconditioned case)\n+665 beta = sqrt(_\b__\bs_\bp->dot(b,z));\n+666 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be beta0 = beta;\n+667\n+668 // the search directions\n+669 std::array p{{b,b,b}};\n+670 p[0] = 0.0;\n+671 p[1] = 0.0;\n+672 p[2] = 0.0;\n+673\n+674 // orthonormal basis vectors (in unpreconditioned case)\n+675 std::array q{{b,b,b}};\n+676 q[0] = 0.0;\n+677 q[1] *= Simd::cond(def==_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+678 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+679 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/beta);\n+680 q[2] = 0.0;\n+681\n+682 z *= Simd::cond(def==_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+683 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+684 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/beta);\n+685\n+686 // the loop\n+687 int i = 1;\n+688 for( ; i<=_\b__\bm_\ba_\bx_\bi_\bt; i++) {\n+689\n+690 dummy = z;\n+691 int i1 = i%3,\n+692 i0 = (i1+2)%3,\n+693 i2 = (i1+1)%3;\n+694\n+695 // symmetrically preconditioned Lanczos algorithm (see Greenbaum p.121)\n+696 _\b__\bo_\bp->apply(z,q[i2]); // q[i2] = Az\n+697 q[i2].axpy(-beta,q[i0]);\n+698 // alpha is real since it is the diagonal entry of the hermitian\n+tridiagonal matrix\n+699 // from the Lanczos Algorithm\n+700 // so the order in the scalar product doesn't matter even for the complex\n+case\n+701 alpha = _\b__\bs_\bp->dot(z,q[i2]);\n+702 q[i2].axpy(-alpha,q[i1]);\n+703\n+704 z = 0.0;\n+705 _\b__\bp_\br_\be_\bc->apply(z,q[i2]);\n+706\n+707 // beta is real and positive in exact arithmetic\n+708 // since it is the norm of the basis vectors (in unpreconditioned case)\n+709 beta = sqrt(_\b__\bs_\bp->dot(q[i2],z));\n+710\n+711 q[i2] *= Simd::cond(def==_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+712 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+713 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/beta);\n+714 z *= Simd::cond(def==_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+715 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+716 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/beta);\n+717\n+718 // QR Factorization of recurrence coefficient matrix\n+719 // apply previous givens rotations to last column of T\n+720 T[1] = T[2];\n+721 if(i>2) {\n+722 T[0] = s[i%2]*T[1];\n+723 T[1] = c[i%2]*T[1];\n+724 }\n+725 if(i>1) {\n+726 T[2] = c[(i+1)%2]*alpha - s[(i+1)%2]*T[1];\n+727 T[1] = c[(i+1)%2]*T[1] + s[(i+1)%2]*alpha;\n+728 }\n+729 else\n+730 T[2] = alpha;\n+731\n+732 // update QR factorization\n+733 generateGivensRotation(T[2],beta,c[i%2],s[i%2]);\n+734 // to last column of T_k\n+735 T[2] = c[i%2]*T[2] + s[i%2]*beta;\n+736 // and to the rhs xi of the min problem\n+737 xi[i%2] = -s[i%2]*xi[(i+1)%2];\n+738 xi[(i+1)%2] *= c[i%2];\n+739\n+740 // compute correction direction\n+741 p[i2] = dummy;\n+742 p[i2].axpy(-T[1],p[i1]);\n+743 p[i2].axpy(-T[0],p[i0]);\n+744 p[i2] *= _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/T[2];\n+745\n+746 // apply correction/update solution\n+747 x.axpy(beta0*xi[(i+1)%2],p[i2]);\n+748\n+749 // remember beta_old\n+750 T[2] = beta;\n+751\n+752 // check for convergence\n+753 // the last entry in the rhs of the min-problem is the residual\n+754 def = abs(beta0*xi[i%2]);\n+755 if(iteration.step(i, def)){\n+756 break;\n+757 }\n+758 } // end for\n+759\n+760 // postprocess preconditioner\n+761 _\b__\bp_\br_\be_\bc->post(x);\n+762 }\n+763\n+764 private:\n+765\n+766 void generateGivensRotation(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be &dx, _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be &dy, _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be &cs,\n+_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be &sn)\n+767 {\n+768 using std::sqrt;\n+769 using std::abs;\n+770 using std::max;\n+771 using std::min;\n+772 const _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be eps = 1e-15;\n+773 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm_dx = abs(dx);\n+774 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm_dy = abs(dy);\n+775 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm_max = max(norm_dx, norm_dy);\n+776 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm_min = min(norm_dx, norm_dy);\n+777 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be temp = norm_min/norm_max;\n+778 // we rewrite the code in a vectorizable fashion\n+779 cs = Simd::cond(norm_dy < eps,\n+780 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0),\n+781 Simd::cond(norm_dx < eps,\n+782 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(0.0),\n+783 Simd::cond(norm_dy > norm_dx,\n+784 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/sqrt(_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0) + temp*temp)*temp,\n+785 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/sqrt(_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0) + temp*temp)\n+786 )));\n+787 sn = Simd::cond(norm_dy < eps,\n+788 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.0),\n+789 Simd::cond(norm_dx < eps,\n+790 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(1.0),\n+791 Simd::cond(norm_dy > norm_dx,\n+792 // dy and dx are real in exact arithmetic\n+793 // thus dx*dy is real so we can explicitly enforce it\n+794 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(1.0)/sqrt(_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0) + temp*temp)*dx*dy/norm_dx/norm_dy,\n+795 // dy and dx is real in exact arithmetic\n+796 // so we don't have to conjugate both of them\n+797 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(1.0)/sqrt(_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0) + temp*temp)*dy/dx\n+798 )));\n+799 }\n+800\n+801 protected:\n+802 using IterativeSolver_\b:_\b:_\b__\bo_\bp;\n+803 using IterativeSolver_\b:_\b:_\b__\bp_\br_\be_\bc;\n+804 using IterativeSolver_\b:_\b:_\b__\bs_\bp;\n+805 using IterativeSolver_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+806 using IterativeSolver_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt;\n+807 using IterativeSolver_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n+_\b8_\b0_\b8 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn = typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b<_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\b _\bi_\bn_\bt_\b>;\n+809 };\n+_\b8_\b1_\b0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"minressolver\",\n+defaultIterativeSolverCreator());\n+811\n+825 template\n+_\b8_\b2_\b6 class _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br : public _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n+827 {\n+828 public:\n+829 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+830 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+831 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+832 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+833\n+834 protected:\n+835 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+836\n+_\b8_\b3_\b8 using _\bf_\bA_\bl_\bl_\bo_\bc = _\bR_\be_\bb_\bo_\bu_\bn_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be_\b<_\bX_\b,_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>;\n+_\b8_\b4_\b0 using _\br_\bA_\bl_\bl_\bo_\bc = _\bR_\be_\bb_\bo_\bu_\bn_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be_\b<_\bX_\b,_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be_\b>;\n+841\n+842 public:\n+843\n+_\b8_\b5_\b0 _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br (const _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>& op, _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b>&\n+prec, _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int restart, int maxit, int verbose) :\n+851 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,prec,reduction,maxit,verbose),\n+852 _\b__\br_\be_\bs_\bt_\ba_\br_\bt(restart)\n+853 {}\n+854\n+_\b8_\b6_\b1 _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br (const _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>& op, const\n+_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bX_\b>& sp, _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b>& prec, _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction,\n+int restart, int maxit, int verbose) :\n+862 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,sp,prec,reduction,maxit,verbose),\n+863 _\b__\br_\be_\bs_\bt_\ba_\br_\bt(restart)\n+864 {}\n+865\n+_\b8_\b7_\b8 _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr > op, std::\n+shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b> > prec, const ParameterTree& configuration) :\n+879 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,prec,configuration),\n+880 _\b__\br_\be_\bs_\bt_\ba_\br_\bt(configuration._\bg_\be_\bt(\"restart\"))\n+881 {}\n+882\n+_\b8_\b8_\b3 _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr > op, std::\n+shared_ptr > sp, std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b> >\n+prec, const ParameterTree& configuration) :\n+884 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,sp,prec,configuration),\n+885 _\b__\br_\be_\bs_\bt_\ba_\br_\bt(configuration._\bg_\be_\bt(\"restart\"))\n+886 {}\n+887\n+_\b8_\b9_\b4 _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr> op,\n+895 std::shared_ptr> sp,\n+896 std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b>> prec,\n+897 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int restart, int maxit, int verbose) :\n+898 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,sp,prec,reduction,maxit,verbose),\n+899 _\b__\br_\be_\bs_\bt_\ba_\br_\bt(restart)\n+900 {}\n+901\n+_\b9_\b1_\b0 virtual void _\ba_\bp_\bp_\bl_\by (X& x, Y& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+911 {\n+912 _\ba_\bp_\bp_\bl_\by(x,b,Simd::max(_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn),res);\n+913 }\n+914\n+_\b9_\b2_\b3 virtual void _\ba_\bp_\bp_\bl_\by (X& x, Y& b, [[maybe_unused]] double reduction,\n+_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+924 {\n+925 using std::abs;\n+926 const Simd::Scalar EPSILON = 1e-80;\n+927 const int m = _\b__\br_\be_\bs_\bt_\ba_\br_\bt;\n+928 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm = 0.0;\n+929 int j = 1;\n+930 std::vector s(m+1), sn(m);\n+931 std::vector cs(m);\n+932 // need copy of rhs if GMRes has to be restarted\n+933 Y b2(b);\n+934 // helper vector\n+935 Y w(b);\n+936 std::vector< std::vector > H(m+1,s);\n+937 std::vector v(m+1,b);\n+938\n+939 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn iteration(*this,res);\n+940\n+941 // clear solver statistics and set res.converged to false\n+942 _\b__\bp_\br_\be_\bc->pre(x,b);\n+943\n+944 // calculate defect and overwrite rhs with it\n+945 _\b__\bo_\bp->applyscaleadd(-1.0,x,b); // b -= Ax\n+946 // calculate preconditioned defect\n+947 v[0] = 0.0; _\b__\bp_\br_\be_\bc->apply(v[0],b); // r = W^-1 b\n+948 norm = _\b__\bs_\bp->norm(v[0]);\n+949 if(iteration.step(0, norm)){\n+950 _\b__\bp_\br_\be_\bc->post(x);\n+951 return;\n+952 }\n+953\n+954 while(j <= _\b__\bm_\ba_\bx_\bi_\bt && res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd != true) {\n+955\n+956 int i = 0;\n+957 v[0] *= Simd::cond(norm==_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(0.),\n+958 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(0.),\n+959 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/norm);\n+960 s[0] = norm;\n+961 for(i=1; iapply(v[i],v[i+1]);\n+970 _\b__\bp_\br_\be_\bc->apply(w,v[i+1]);\n+971 for(int k=0; kdot(v[k],w) = v[k]\\adjoint w\n+973 // so one has to pay attention to the order\n+974 // in the scalar product for the complex case\n+975 // doing the modified Gram-Schmidt algorithm\n+976 H[k][i] = _\b__\bs_\bp->dot(v[k],w);\n+977 // w -= H[k][i] * v[k]\n+978 w.axpy(-H[k][i],v[k]);\n+979 }\n+980 H[i+1][i] = _\b__\bs_\bp->norm(w);\n+981 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON))\n+982 DUNE_THROW(_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt,\n+983 \"breakdown in GMRes - |w| == 0.0 after \" << j << \" iterations\");\n+984\n+985 // normalize new vector\n+986 v[i+1] = w;\n+987 v[i+1] *= Simd::cond(norm==_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(0.),\n+988 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.),\n+989 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/H[i+1][i]);\n+990\n+991 // update QR factorization\n+992 for(int k=0; k 0)\n+1020 std::cout << \"=== GMRes::restart\" << std::endl;\n+1021 // get saved rhs\n+1022 b = b2;\n+1023 // calculate new defect\n+1024 _\b__\bo_\bp->applyscaleadd(-1.0,x,b); // b -= Ax;\n+1025 // calculate preconditioned defect\n+1026 v[0] = 0.0;\n+1027 _\b__\bp_\br_\be_\bc->apply(v[0],b);\n+1028 norm = _\b__\bs_\bp->norm(v[0]);\n+1029 }\n+1030\n+1031 } //end while\n+1032\n+1033 // postprocess preconditioner\n+1034 _\b__\bp_\br_\be_\bc->post(x);\n+1035 }\n+1036\n+1037 protected :\n+1038\n+_\b1_\b0_\b3_\b9 void _\bu_\bp_\bd_\ba_\bt_\be(X& w, int i,\n+1040 const std::vector >& H,\n+1041 const std::vector& s,\n+1042 const std::vector& v) {\n+1043 // solution vector of the upper triangular system\n+1044 std::vector y(s);\n+1045\n+1046 // backsolve\n+1047 for(int a=i-1; a>=0; a--) {\n+1048 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be rhs(s[a]);\n+1049 for(int b=a+1; b\n+_\b1_\b0_\b6_\b2 typename std::enable_if::value,T>::type\n+_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be(const T& t) {\n+1063 return t;\n+1064 }\n+1065\n+1066 template\n+_\b1_\b0_\b6_\b7 typename std::enable_if::value,T>::\n+type _\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be(const T& t) {\n+1068 using std::conj;\n+1069 return conj(t);\n+1070 }\n+1071\n+1072 void\n+_\b1_\b0_\b7_\b3 _\bg_\be_\bn_\be_\br_\ba_\bt_\be_\bP_\bl_\ba_\bn_\be_\bR_\bo_\bt_\ba_\bt_\bi_\bo_\bn(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be &dx, _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be &dy, _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be &cs,\n+_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be &sn)\n+1074 {\n+1075 using std::sqrt;\n+1076 using std::abs;\n+1077 using std::max;\n+1078 using std::min;\n+1079 const _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be eps = 1e-15;\n+1080 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm_dx = abs(dx);\n+1081 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm_dy = abs(dy);\n+1082 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm_max = max(norm_dx, norm_dy);\n+1083 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm_min = min(norm_dx, norm_dy);\n+1084 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be temp = norm_min/norm_max;\n+1085 // we rewrite the code in a vectorizable fashion\n+1086 cs = Simd::cond(norm_dy < eps,\n+1087 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0),\n+1088 Simd::cond(norm_dx < eps,\n+1089 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(0.0),\n+1090 Simd::cond(norm_dy > norm_dx,\n+1091 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/sqrt(_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0) + temp*temp)*temp,\n+1092 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/sqrt(_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0) + temp*temp)\n+1093 )));\n+1094 sn = Simd::cond(norm_dy < eps,\n+1095 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0.0),\n+1096 Simd::cond(norm_dx < eps,\n+1097 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(1.0),\n+1098 Simd::cond(norm_dy > norm_dx,\n+1099 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(1.0)/sqrt(_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0) + temp*temp)*dx*_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be(dy)/norm_dx/\n+norm_dy,\n+1100 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(1.0)/sqrt(_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0) + temp*temp)*_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be(dy/dx)\n+1101 )));\n+1102 }\n+1103\n+1104\n+1105 void\n+_\b1_\b1_\b0_\b6 _\ba_\bp_\bp_\bl_\by_\bP_\bl_\ba_\bn_\be_\bR_\bo_\bt_\ba_\bt_\bi_\bo_\bn(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be &dx, _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be &dy, _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be &cs,\n+_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be &sn)\n+1107 {\n+1108 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be temp = cs * dx + sn * dy;\n+1109 dy = -_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be(sn) * dx + cs * dy;\n+1110 dx = temp;\n+1111 }\n+1112\n+1113 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bo_\bp;\n+1114 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bp_\br_\be_\bc;\n+1115 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bs_\bp;\n+1116 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+1117 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt;\n+1118 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n+_\b1_\b1_\b1_\b9 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn = typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b<_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\b _\bi_\bn_\bt_\b>;\n+_\b1_\b1_\b2_\b0 int _\b__\br_\be_\bs_\bt_\ba_\br_\bt;\n+1121 };\n+_\b1_\b1_\b2_\b2 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"restartedgmressolver\",\n+defaultIterativeSolverCreator());\n+1123\n+1137 template\n+_\b1_\b1_\b3_\b8 class _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bl_\be_\bx_\bi_\bb_\bl_\be_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br : public _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br\n+1139 {\n+1140 public:\n+1141 using typename _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+1142 using typename _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+1143 using typename _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+1144 using typename _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+1145\n+1146 private:\n+1147 using typename _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+1148\n+1150 using fAlloc = typename _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bf_\bA_\bl_\bl_\bo_\bc;\n+1152 using rAlloc = typename _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\br_\bA_\bl_\bl_\bo_\bc;\n+1153\n+1154 public:\n+1155 // copy base class constructors\n+1156 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br::RestartedGMResSolver;\n+1157\n+1158 // don't shadow four-argument version of apply defined in the base class\n+1159 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by;\n+1160\n+_\b1_\b1_\b6_\b9 void _\ba_\bp_\bp_\bl_\by (X& x, Y& b, [[maybe_unused]] double reduction,\n+_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res) override\n+1170 {\n+1171 using std::abs;\n+1172 const Simd::Scalar EPSILON = 1e-80;\n+1173 const int m = _\b__\br_\be_\bs_\bt_\ba_\br_\bt;\n+1174 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm = 0.0;\n+1175 int i, j = 1, k;\n+1176 std::vector s(m+1), sn(m);\n+1177 std::vector cs(m);\n+1178 // helper vector\n+1179 Y tmp(b);\n+1180 std::vector< std::vector > H(m+1,s);\n+1181 std::vector v(m+1,b);\n+1182 std::vector w(m+1,b);\n+1183\n+1184 Iteration iteration(*this,res);\n+1185 // setup preconditioner if it does something in pre\n+1186\n+1187 // calculate residual and overwrite a copy of the rhs with it\n+1188 _\b__\bp_\br_\be_\bc->pre(x, b);\n+1189 v[0] = b;\n+1190 _\b__\bo_\bp->applyscaleadd(-1.0, x, v[0]); // b -= Ax\n+1191\n+1192 norm = _\b__\bs_\bp->norm(v[0]); // the residual norm\n+1193 if(iteration.step(0, norm)){\n+1194 _\b__\bp_\br_\be_\bc->post(x);\n+1195 return;\n+1196 }\n+1197\n+1198 // start iterations\n+1199 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = false;;\n+1200 while(j <= _\b__\bm_\ba_\bx_\bi_\bt && res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd != true)\n+1201 {\n+1202 v[0] *= (1.0 / norm);\n+1203 s[0] = norm;\n+1204 for(i=1; iapply(w[i], v[i]);\n+1213 // compute vi = A*wi\n+1214 // use v[i+1] as temporary vector for w\n+1215 _\b__\bo_\bp->apply(w[i], v[i+1]);\n+1216 // do Arnoldi algorithm\n+1217 for(int kk=0; kkdot(v[k],v[i+1]) = v[k]\\adjoint v[i+1]\n+1220 // so one has to pay attention to the order\n+1221 // in the scalar product for the complex case\n+1222 // doing the modified Gram-Schmidt algorithm\n+1223 H[kk][i] = _\b__\bs_\bp->dot(v[kk],v[i+1]);\n+1224 // w -= H[k][i] * v[kk]\n+1225 v[i+1].axpy(-H[kk][i], v[kk]);\n+1226 }\n+1227 H[i+1][i] = _\b__\bs_\bp->norm(v[i+1]);\n+1228 if(Simd::allTrue(abs(H[i+1][i]) < EPSILON))\n+1229 DUNE_THROW(_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt, \"breakdown in fGMRes - |w| (-> \"\n+1230 << w[i] << \") == 0.0 after \"\n+1231 << j << \" iterations\");\n+1232\n+1233 // v[i+1] = w*1/H[i+1][i]\n+1234 v[i+1] *= _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1.0)/H[i+1][i];\n+1235\n+1236 // update QR factorization\n+1237 for(k=0; k_\ba_\bp_\bp_\bl_\by_\bP_\bl_\ba_\bn_\be_\bR_\bo_\bt_\ba_\bt_\bi_\bo_\bn(H[k][i],H[k+1][i],cs[k],sn[k]);\n+1239\n+1240 // compute new givens rotation\n+1241 this->_\bg_\be_\bn_\be_\br_\ba_\bt_\be_\bP_\bl_\ba_\bn_\be_\bR_\bo_\bt_\ba_\bt_\bi_\bo_\bn(H[i][i],H[i+1][i],cs[i],sn[i]);\n+1242\n+1243 // finish updating QR factorization\n+1244 this->_\ba_\bp_\bp_\bl_\by_\bP_\bl_\ba_\bn_\be_\bR_\bo_\bt_\ba_\bt_\bi_\bo_\bn(H[i][i],H[i+1][i],cs[i],sn[i]);\n+1245 this->_\ba_\bp_\bp_\bl_\by_\bP_\bl_\ba_\bn_\be_\bR_\bo_\bt_\ba_\bt_\bi_\bo_\bn(s[i],s[i+1],cs[i],sn[i]);\n+1246\n+1247 // norm of the residual is the last component of vector s\n+1248 using std::abs;\n+1249 norm = abs(s[i+1]);\n+1250 iteration.step(j, norm);\n+1251 } // end inner for loop\n+1252\n+1253 // calculate update vector\n+1254 tmp = 0.0;\n+1255 this->_\bu_\bp_\bd_\ba_\bt_\be(tmp, i, H, s, w);\n+1256 // and update current iterate\n+1257 x += tmp;\n+1258\n+1259 // restart fGMRes if convergence was not achieved,\n+1260 // i.e. linear residual has not reached desired reduction\n+1261 // and if still j < _maxit (do not restart on last iteration)\n+1262 if( res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd != true && j < _\b__\bm_\ba_\bx_\bi_\bt)\n+1263 {\n+1264 if (_\b__\bv_\be_\br_\bb_\bo_\bs_\be > 0)\n+1265 std::cout << \"=== fGMRes::restart\" << std::endl;\n+1266 // get rhs\n+1267 v[0] = b;\n+1268 // calculate new defect\n+1269 _\b__\bo_\bp->applyscaleadd(-1.0, x,v[0]); // b -= Ax;\n+1270 // calculate preconditioned defect\n+1271 norm = _\b__\bs_\bp->norm(v[0]); // update the residual norm\n+1272 }\n+1273\n+1274 } // end outer while loop\n+1275\n+1276 // post-process preconditioner\n+1277 _\b__\bp_\br_\be_\bc->post(x);\n+1278 }\n+1279\n+1280private:\n+1281 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bo_\bp;\n+1282 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bp_\br_\be_\bc;\n+1283 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bs_\bp;\n+1284 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+1285 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt;\n+1286 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n+1287 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bs_\bt_\ba_\br_\bt;\n+1288 using Iteration = typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be\n+Iteration;\n+1289 };\n+_\b1_\b2_\b9_\b0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"restartedflexiblegmressolver\",\n+defaultIterativeSolverCreator());\n+1291\n+1305 template\n+_\b1_\b3_\b0_\b6 class _\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br : public _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n+1307 {\n+1308 public:\n+1309 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+1310 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+1311 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+1312 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+1313\n+1314 private:\n+1315 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+1316\n+1318 using fAlloc = _\bR_\be_\bb_\bo_\bu_\bn_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be_\b<_\bX_\b,_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>;\n+1319\n+1320 public:\n+1321\n+1322 // don't shadow four-argument version of apply defined in the base class\n+1323 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by;\n+1324\n+_\b1_\b3_\b3_\b1 _\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (const _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bX_\b>& op, _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b>&\n+prec, _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose, int restart = 10) :\n+1332 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,prec,reduction,maxit,verbose),\n+1333 _restart(restart)\n+1334 {}\n+1335\n+_\b1_\b3_\b4_\b3 _\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (const _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bX_\b>& op, const\n+_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bX_\b>& sp, _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b>& prec, _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction,\n+int maxit, int verbose, int restart = 10) :\n+1344 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,sp,prec,reduction,maxit,verbose),\n+1345 _restart(restart)\n+1346 {}\n+1347\n+1348\n+_\b1_\b3_\b6_\b1 _\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr > op,\n+std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b> > prec, const ParameterTree& configuration)\n+:\n+1362 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,prec,configuration),\n+1363 _restart(configuration._\bg_\be_\bt(\"restart\"))\n+1364 {}\n+1365\n+_\b1_\b3_\b6_\b6 _\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr > op,\n+std::shared_ptr > sp, std::\n+shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b> > prec, const ParameterTree& configuration) :\n+1367 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,sp,prec,configuration),\n+1368 _restart(configuration._\bg_\be_\bt(\"restart\"))\n+1369 {}\n+_\b1_\b3_\b7_\b7 _\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr> op,\n+1378 std::shared_ptr> sp,\n+1379 std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b>> prec,\n+1380 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose,\n+1381 int restart = 10) :\n+1382 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br::_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,sp,prec,reduction,maxit,verbose),\n+1383 _restart(restart)\n+1384 {}\n+1385\n+_\b1_\b3_\b9_\b1 virtual void _\ba_\bp_\bp_\bl_\by (X& x, X& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+1392 {\n+1393 Iteration iteration(*this, res);\n+1394 _\b__\bp_\br_\be_\bc->pre(x,b); // prepare preconditioner\n+1395 _\b__\bo_\bp->applyscaleadd(-1,x,b); // overwrite b with defect\n+1396\n+1397 std::vector > p(_restart);\n+1398 std::vector pp(_restart);\n+1399 X q(x); // a temporary vector\n+1400 X prec_res(x); // a temporary vector for preconditioner output\n+1401\n+1402 p[0].reset(new X(x));\n+1403\n+1404 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be def = _\b__\bs_\bp->norm(b); // compute norm\n+1405 if(iteration.step(0, def)){\n+1406 _\b__\bp_\br_\be_\bc->post(x);\n+1407 return;\n+1408 }\n+1409 // some local variables\n+1410 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be rho, lambda;\n+1411\n+1412 int i=0;\n+1413 // determine initial search direction\n+1414 *(p[0]) = 0; // clear correction\n+1415 _\b__\bp_\br_\be_\bc->apply(*(p[0]),b); // apply preconditioner\n+1416 rho = _\b__\bs_\bp->dot(*(p[0]),b); // orthogonalization\n+1417 _\b__\bo_\bp->apply(*(p[0]),q); // q=Ap\n+1418 pp[0] = _\b__\bs_\bp->dot(*(p[0]),q); // scalar product\n+1419 lambda = rho/pp[0]; // minimization\n+1420 x.axpy(lambda,*(p[0])); // update solution\n+1421 b.axpy(-lambda,q); // update defect\n+1422\n+1423 // convergence test\n+1424 def=_\b__\bs_\bp->norm(b); // comp defect norm\n+1425 ++i;\n+1426 if(iteration.step(i, def)){\n+1427 _\b__\bp_\br_\be_\bc->post(x);\n+1428 return;\n+1429 }\n+1430\n+1431 while(i<_\b__\bm_\ba_\bx_\bi_\bt) {\n+1432 // the loop\n+1433 int end=std::min(_restart, _\b__\bm_\ba_\bx_\bi_\bt-i+1);\n+1434 for (int ii = 1; ii < end; ++ii)\n+1435 {\n+1436 //std::cout<<\" ii=\"<apply(prec_res,b); // apply preconditioner\n+1440\n+1441 p[ii].reset(new X(prec_res));\n+1442 _\b__\bo_\bp->apply(prec_res, q);\n+1443\n+1444 for(int j=0; jdot(q,*(p[j]))/pp[j];\n+1446 p[ii]->axpy(-rho, *(p[j]));\n+1447 }\n+1448\n+1449 // minimize in given search direction\n+1450 _\b__\bo_\bp->apply(*(p[ii]),q); // q=Ap\n+1451 pp[ii] = _\b__\bs_\bp->dot(*(p[ii]),q); // scalar product\n+1452 rho = _\b__\bs_\bp->dot(*(p[ii]),b); // orthogonalization\n+1453 lambda = rho/pp[ii]; // minimization\n+1454 x.axpy(lambda,*(p[ii])); // update solution\n+1455 b.axpy(-lambda,q); // update defect\n+1456\n+1457 // convergence test\n+1458 def = _\b__\bs_\bp->norm(b); // comp defect norm\n+1459\n+1460 ++i;\n+1461 iteration.step(i, def);\n+1462 }\n+1463 if(res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd)\n+1464 break;\n+1465 if(end==_restart) {\n+1466 *(p[0])=*(p[_restart-1]);\n+1467 pp[0]=pp[_restart-1];\n+1468 }\n+1469 }\n+1470\n+1471 // postprocess preconditioner\n+1472 _\b__\bp_\br_\be_\bc->post(x);\n+1473\n+1474 }\n+1475\n+1476 private:\n+1477 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bo_\bp;\n+1478 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bp_\br_\be_\bc;\n+1479 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bs_\bp;\n+1480 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+1481 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt;\n+1482 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n+1483 using Iteration = typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be\n+Iteration;\n+1484 int _restart;\n+1485 };\n+_\b1_\b4_\b8_\b6 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"generalizedpcgsolver\",\n+defaultIterativeSolverCreator());\n+1487\n+1499 template\n+_\b1_\b5_\b0_\b0 class _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br : public _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br {\n+1501 public:\n+1502 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+1503 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+1504 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+1505 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+1506\n+1507 private:\n+1508 using typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+1509\n+1510 public:\n+1511 // don't shadow four-argument version of apply defined in the base class\n+1512 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by;\n+_\b1_\b5_\b1_\b8 _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (const _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bX_\b>& op, _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b>&\n+prec,\n+1519 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose, int mmax = 10) :\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op, prec, reduction, maxit, verbose), _\b__\bm_\bm_\ba_\bx(mmax)\n+1520 {\n+1521 }\n+1522\n+_\b1_\b5_\b2_\b8 _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (const _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bX_\b>& op, const _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bX_\b>&\n+sp, _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b>& prec,\n+1529 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose, int mmax = 10) :\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op, sp, prec, reduction, maxit, verbose), _\b__\bm_\bm_\ba_\bx(mmax)\n+1530 {\n+1531 }\n+1532\n+_\b1_\b5_\b3_\b8 _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr> op,\n+1539 std::shared_ptr> sp,\n+1540 std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b>> prec,\n+1541 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose,\n+1542 int mmax = 10)\n+1543 : _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op, sp, prec, reduction, maxit, verbose), _\b__\bm_\bm_\ba_\bx\n+(mmax)\n+1544 {}\n+1545\n+_\b1_\b5_\b5_\b8 _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr> op,\n+1559 std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b>> prec,\n+1560 const ParameterTree& config)\n+1561 : _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op, prec, config), _\b__\bm_\bm_\ba_\bx(config._\bg_\be_\bt(\"mmax\", 10))\n+1562 {}\n+1563\n+_\b1_\b5_\b6_\b4 _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr> op,\n+1565 std::shared_ptr> sp,\n+1566 std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b>> prec,\n+1567 const ParameterTree& config)\n+1568 : _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op, sp, prec, config), _\b__\bm_\bm_\ba_\bx(config._\bg_\be_\bt(\"mmax\",\n+10))\n+1569 {}\n+1570\n+_\b1_\b5_\b8_\b3 virtual void _\ba_\bp_\bp_\bl_\by (X& x, X& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+1584 {\n+1585 using rAlloc = _\bR_\be_\bb_\bo_\bu_\bn_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be_\b<_\bX_\b,_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>;\n+1586 res._\bc_\bl_\be_\ba_\br();\n+1587 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn iteration(*this,res);\n+1588 _\b__\bp_\br_\be_\bc->pre(x,b); // prepare preconditioner\n+1589 _\b__\bo_\bp->applyscaleadd(-1,x,b); // overwrite b with defect\n+1590\n+1591 //arrays for interim values:\n+1592 std::vector d(_\b__\bm_\bm_\ba_\bx+1, x); // array for directions\n+1593 std::vector Ad(_\b__\bm_\bm_\ba_\bx+1, x); // array for Ad[i]\n+1594 std::vector ddotAd(_\b__\bm_\bm_\ba_\bx+1,0); // array for \n+1595 X w(x);\n+1596\n+1597 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be def = _\b__\bs_\bp->norm(b); // compute norm\n+1598 if(iteration.step(0, def)){\n+1599 _\b__\bp_\br_\be_\bc->post(x);\n+1600 return;\n+1601 }\n+1602\n+1603 // some local variables\n+1604 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha;\n+1605\n+1606 // the loop\n+1607 int i=1;\n+1608 int i_bounded=0;\n+1609 while(i<=_\b__\bm_\ba_\bx_\bi_\bt && !res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd) {\n+1610 for (; i_bounded <= _\b__\bm_\bm_\ba_\bx && i<= _\b__\bm_\ba_\bx_\bi_\bt; i_bounded++) {\n+1611 d[i_bounded] = 0; // reset search direction\n+1612 _\b__\bp_\br_\be_\bc->apply(d[i_bounded], b); // apply preconditioner\n+1613 w = d[i_bounded]; // copy of current d[i]\n+1614 // orthogonalization with previous directions\n+1615 orthogonalizations(i_bounded,Ad,w,ddotAd,d);\n+1616\n+1617 //saving interim values for future calculating\n+1618 _\b__\bo_\bp->apply(d[i_bounded], Ad[i_bounded]); // save Ad[i]\n+1619 ddotAd[i_bounded]=_\b__\bs_\bp->dot(d[i_bounded],Ad[i_bounded]); // save \n+1620 alpha = _\b__\bs_\bp->dot(d[i_bounded], b)/ddotAd[i_bounded]; // /\n+1621\n+1622 //update solution and defect\n+1623 x.axpy(alpha, d[i_bounded]);\n+1624 b.axpy(-alpha, Ad[i_bounded]);\n+1625\n+1626 // convergence test\n+1627 def = _\b__\bs_\bp->norm(b); // comp defect norm\n+1628\n+1629 iteration.step(i, def);\n+1630 i++;\n+1631 }\n+1632 //restart: exchange first and last stored values\n+1633 cycle(Ad,d,ddotAd,i_bounded);\n+1634 }\n+1635\n+1636 //correct i which is wrong if convergence was not achieved.\n+1637 i=std::min(_\b__\bm_\ba_\bx_\bi_\bt,i);\n+1638\n+1639 _\b__\bp_\br_\be_\bc->post(x); // postprocess preconditioner\n+1640 }\n+1641\n+1642 private:\n+1643 //This function is called every iteration to orthogonalize against the\n+last search directions\n+1644 virtual void orthogonalizations(const int& i_bounded,const std::vector&\n+Ad, const X& w, const std::\n+vector<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be,_\bR_\be_\bb_\bo_\bu_\bn_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be_\b<_\bX_\b,_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>>& ddotAd,std::vector&\n+d) {\n+1645 // The RestartedFCGSolver uses only values with lower array index;\n+1646 for (int k = 0; k < i_bounded; k++) {\n+1647 d[i_bounded].axpy(-_\b__\bs_\bp->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= </>d[k]\n+1648 }\n+1649 }\n+1650\n+1651 // This function is called every mmax iterations to handle limited array\n+sizes.\n+1652 virtual void cycle(std::vector& Ad,std::vector& d,std::\n+vector<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be,ReboundAllocatorType >& ddotAd,int& i_bounded)\n+{\n+1653 // Reset loop index and exchange the first and last arrays\n+1654 i_bounded = 1;\n+1655 std::swap(Ad[0], Ad[_\b__\bm_\bm_\ba_\bx]);\n+1656 std::swap(d[0], d[_\b__\bm_\bm_\ba_\bx]);\n+1657 std::swap(ddotAd[0], ddotAd[_\b__\bm_\bm_\ba_\bx]);\n+1658 }\n+1659\n+1660 protected:\n+_\b1_\b6_\b6_\b1 int _\b__\bm_\bm_\ba_\bx;\n+1662 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bo_\bp;\n+1663 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bp_\br_\be_\bc;\n+1664 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bs_\bp;\n+1665 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+1666 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt;\n+1667 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n+_\b1_\b6_\b6_\b8 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn = typename _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b,_\bX_\b>_\b:_\b:_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b<_\bu_\bn_\bs_\bi_\bg_\bn_\be_\bd_\b _\bi_\bn_\bt_\b>;\n+1669 };\n+_\b1_\b6_\b7_\b0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"restartedfcgsolver\",\n+defaultIterativeSolverCreator());\n+1671\n+1678 template\n+_\b1_\b6_\b7_\b9 class _\bC_\bo_\bm_\bp_\bl_\be_\bt_\be_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br : public _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br {\n+1680 public:\n+1681 using typename _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+1682 using typename _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+1683 using typename _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+1684 using typename _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+1685\n+1686 // copy base class constructors\n+1687 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br::RestartedFCGSolver;\n+1688\n+1689 // don't shadow four-argument version of apply defined in the base class\n+1690 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by;\n+1691\n+1692 // just a minor part of the RestartedFCGSolver apply method will be\n+modified\n+_\b1_\b6_\b9_\b3 virtual void _\ba_\bp_\bp_\bl_\by (X& x, X& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res) override {\n+1694 // reset limiter of orthogonalization loop\n+1695 _k_limit = 0;\n+1696 this->_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b<_\bX_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(x,b,res);\n+1697 };\n+1698\n+1699 private:\n+1700 // This function is called every iteration to orthogonalize against the\n+last search directions.\n+1701 virtual void orthogonalizations(const int& i_bounded,const std::vector&\n+Ad, const X& w, const std::\n+vector<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be,_\bR_\be_\bb_\bo_\bu_\bn_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be_\b<_\bX_\b,_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>>& ddotAd,std::vector&\n+d) override {\n+1702 // This FCGSolver uses values with higher array indexes too, if existent.\n+1703 for (int k = 0; k < _k_limit; k++) {\n+1704 if(i_bounded!=k)\n+1705 d[i_bounded].axpy(-_\b__\bs_\bp->dot(Ad[k], w) / ddotAd[k], d[k]); // d[i] -= </>d[k]\n+1706 }\n+1707 // The loop limit increase, if array is not completely filled.\n+1708 if(_k_limit<=i_bounded)\n+1709 _k_limit++;\n+1710\n+1711 };\n+1712\n+1713 // This function is called every mmax iterations to handle limited array\n+sizes.\n+1714 virtual void cycle(std::vector& Ad, [[maybe_unused]] std::vector& d,\n+[[maybe_unused]] std::vector<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be,ReboundAllocatorType >&\n+ddotAd,int& i_bounded) override {\n+1715 // Only the loop index i_bounded return to 0, if it reached mmax.\n+1716 i_bounded = 0;\n+1717 // Now all arrays are filled and the loop in void orthogonalizations can\n+use the whole arrays.\n+1718 _k_limit = Ad.size();\n+1719 };\n+1720\n+1721 int _k_limit = 0;\n+1722\n+1723 protected:\n+1724 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\bm_\ba_\bx;\n+1725 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bo_\bp;\n+1726 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bp_\br_\be_\bc;\n+1727 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bs_\bp;\n+1728 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+1729 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt;\n+1730 using _\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n+1731 };\n+_\b1_\b7_\b3_\b2 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"completefcgsolver\",\n+defaultIterativeSolverCreator());\n+1734} // end namespace\n+1735\n+1736#endif\n _\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n Implementation of the BCRSMatrix class.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b0_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:379\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bk_\b _\b>_\b,_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-FieldMatrix< T, n, m > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:515\n-_\bD_\bu_\bn_\be_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt\n-void transposeMatMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const\n-BCRSMatrix< FieldMatrix< T, k, n >, A1 > &mat, const BCRSMatrix< FieldMatrix<\n-T, k, m >, A2 > &matt, bool tryHard=false)\n-Calculate product of a transposed sparse matrix with another sparse matrices\n-( ).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:590\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt\n-void matMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix<\n-FieldMatrix< T, n, k >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2\n-> &matt, bool tryHard=false)\n-Calculate product of two sparse matrices ( ).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:575\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:359\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bR_\bo_\bw\n-Matrix::RowIterator Row\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:326\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b2_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:417\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\b1_\b,_\b _\bT_\b,_\b _\bT_\bA_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-Dune::BCRSMatrix< Dune::FieldMatrix< T, n, m >, TA > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:228\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:360\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b0_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:380\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bC_\bo_\bl\n-Matrix::ColIterator Col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:327\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n-_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\b1_\b,_\b _\bT_\b,_\b _\bT_\bA_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bn_\b _\b>_\b,_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm\n-_\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-FieldMatrix< T, n, m > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:540\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bt_\bM_\bu_\bl_\bt_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bM_\ba_\bt\n-void matMultTransposeMat(BCRSMatrix< FieldMatrix< T, n, k >, A > &res, const\n-BCRSMatrix< FieldMatrix< T, n, m >, A1 > &mat, const BCRSMatrix< FieldMatrix<\n-T, k, m >, A2 > &matt, bool tryHard=false)\n-Calculate product of a sparse matrix with a transposed sparse matrices ( ).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-BCRSMatrix< FieldMatrix< T, n, m >, A >::CreateIterator CreateIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:156\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b1_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:398\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-Dune::BCRSMatrix< FieldMatrix< T, n, m >, TA > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:186\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bk_\b _\b>_\b,_\b _\bA_\b _\b>_\b,_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<\n-_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b1_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T,\n-k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k\n->, FieldMatrix< T, k, m > >::type > > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:522\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\b1_\b,_\b _\bT_\b,_\b _\bT_\bA_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Matrix::CreateIterator CreateIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:229\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:325\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b1_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:399\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Matrix::CreateIterator CreateIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:187\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bn_\b _\b>_\b,_\b _\bA_\b _\b>_\b,\n-_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bk_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b1_\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T,\n-k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k\n->, FieldMatrix< T, k, m > >::type > > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:547\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b,_\b _\bn_\b,_\b _\bm_\b,_\b _\b2_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:418\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-BCRSMatrix< FieldMatrix< T, n, m >, A >::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:157\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bd_\bo_\b__\bb_\br_\be_\ba_\bk\n-@ do_break\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bd_\bo_\b__\bb_\br_\be_\ba_\bk\n-@ do_break\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:185\n-_\bD_\bu_\bn_\be_\b:_\b:_\bE_\bn_\bt_\br_\by_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bo_\br_\bF_\ba_\bt_\bh_\be_\br_\b:_\b:_\bd_\bo_\b__\bb_\br_\be_\ba_\bk\n-@ do_break\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:324\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\n+Define base class for scalar product and norm.\n+_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b._\bh_\bh\n+_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh\n+_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR\n+#define DUNE_REGISTER_ITERATIVE_SOLVER(name,...)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:19\n+_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n+Define general, extensible interface for operators. The available\n+implementation wraps a matrix.\n+_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n+Define general, extensible interface for inverse operators.\n+_\ba_\br_\bp_\ba_\bc_\bk_\bp_\bp_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bb_\bo_\bu_\bn_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be\n+typename std::allocator_traits< typename AllocatorTraits< T >::type >::template\n+rebind_alloc< X > ReboundAllocatorType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:37\n _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n A sparse block matrix with compressed row storage.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-Iterator end()\n-Get iterator to one beyond last row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:677\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::Iterator ColIterator\n-Iterator for the entries of each row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:700\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-The type for the index access and the size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bw_\bi_\bs_\be\n+@ row_wise\n+Build in a row-wise manner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:517\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd\n+CreateIterator createend()\n+get create iterator pointing to one after the last block\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1100\n _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn\n CreateIterator createbegin()\n get initial create iterator\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1094\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator access to matrix rows\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:575\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator class for sequential creation of blocks\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:954\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n-void insert(size_type j)\n-put column index in row\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1061\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt\n-Helper TMP to get the result type of a sparse matrix matrix multiplication ( )\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:510\n-_\bD_\bu_\bn_\be_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be_\bd_\bM_\ba_\bt_\bM_\bu_\bl_\bt_\bM_\ba_\bt_\bR_\be_\bs_\bu_\bl_\bt\n-Helper TMP to get the result type of a sparse matrix matrix multiplication ( )\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:535\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+size_type N() const\n+number of rows (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A vector of blocks with memory management.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n+Wrapper to use a range of ARPACK++ eigenvalue solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:245\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\ba_\bx_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be\n+void computeSymMaxMagnitude(const Real &epsilon, BlockVector &x, Real &lambda)\n+const\n+Assume the matrix to be square, symmetric and perform IRLM to compute an\n+approximation lambda of its ...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:289\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\bi_\bn_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be\n+void computeSymMinMagnitude(const Real &epsilon, BlockVector &x, Real &lambda)\n+const\n+Assume the matrix to be square, symmetric and perform IRLM to compute an\n+approximation lambda of its ...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:391\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt\n+Thrown when a solver aborts due to some problem.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A linear operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Base class for scalar product and norm computation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\b__\be_\bs_\bt_\bi_\bm_\ba_\bt_\be\n+double condition_estimate\n+Estimate of condition number.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bl_\be_\ba_\br\n+void clear()\n+Resets all data.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n+bool converged\n+True if convergence criterion has been met.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+Simd::Scalar< real_type > scalar_real_type\n+scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+Type of the range of the operator to be inverted.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+Type of the domain of the operator to be inverted.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:104\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< field_type >::real_type real_type\n+The real type of the field type (is the same if using real numbers, but differs\n+for std::complex)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n+Base class for all implementations of iterative solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:205\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bX_\b _\b>_\b:_\b:_\b__\bs_\bp\n+std::shared_ptr< const ScalarProduct< X > > _sp\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:508\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bX_\b _\b>_\b:_\b:_\b__\bo_\bp\n+std::shared_ptr< const LinearOperator< X, X > > _op\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:506\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bX_\b _\b>_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt\n+int _maxit\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:510\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bX_\b _\b>_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be\n+int _verbose\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:511\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bX_\b _\b>_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn\n+scalar_real_type _reduction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:509\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bX_\b _\b>_\b:_\b:_\b__\bp_\br_\be_\bc\n+std::shared_ptr< Preconditioner< X, X > > _prec\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:507\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bo_\bl_\bv_\be_\br\n+Preconditioned loop solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, X &b, InverseOperatorResult &res)\n+Apply inverse operator,.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bo_\bo_\bp_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\br_\ba_\bd_\bi_\be_\bn_\bt_\bS_\bo_\bl_\bv_\be_\br\n+gradient method\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\br_\ba_\bd_\bi_\be_\bn_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, X &b, InverseOperatorResult &res)\n+Apply inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\br_\ba_\bd_\bi_\be_\bn_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:187\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+conjugate gradient method\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:193\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+CGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::shared_ptr<\n+ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X, X > > prec,\n+scalar_real_type reduction, int maxit, int verbose, bool condition_estimate)\n+Constructor to initialize a CG solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:256\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\be_\bn_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\bE_\bs_\bt_\bi_\bm_\ba_\bt_\be\n+static constexpr bool enableConditionEstimate\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:208\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+CGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X > &sp,\n+Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int\n+verbose, bool condition_estimate)\n+Constructor to initialize a CG solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:239\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, X &b, InverseOperatorResult &res)\n+Apply inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:279\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+CGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X > &prec,\n+scalar_real_type reduction, int maxit, int verbose, bool condition_estimate)\n+Constructor to initialize a CG solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:222\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:412\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bC_\bG_\bS_\bT_\bA_\bB_\bS_\bo_\bl_\bv_\be_\br\n+Bi-conjugate Gradient Stabilized (BiCG-STAB)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:419\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bC_\bG_\bS_\bT_\bA_\bB_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+typename IterativeSolver< X, X >::template Iteration< CountType > Iteration\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:598\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bC_\bG_\bS_\bT_\bA_\bB_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, X &b, InverseOperatorResult &res)\n+Apply inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:439\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bI_\bN_\bR_\bE_\bS_\bS_\bo_\bl_\bv_\be_\br\n+Minimal Residual Method (MINRES)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:609\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bI_\bN_\bR_\bE_\bS_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, X &b, InverseOperatorResult &res)\n+Apply inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:627\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bI_\bN_\bR_\bE_\bS_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:808\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br\n+implements the Generalized Minimal Residual (GMRes) method\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:827\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br\n+RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::\n+shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:878\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be\n+std::enable_if::value, T >::type\n+conjugate(const T &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1067\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br\n+RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::\n+shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X,\n+X > > prec, const ParameterTree &configuration)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:883\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bu_\bp_\bd_\ba_\bt_\be\n+void update(X &w, int i, const std::vector< std::vector< field_type, fAlloc > >\n+&H, const std::vector< field_type, fAlloc > &s, const std::vector< X > &v)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1039\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bc_\bo_\bn_\bj_\bu_\bg_\ba_\bt_\be\n+std::enable_if< std::is_same< field_type, real_type >::value, T >::type\n+conjugate(const T &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1062\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bf_\bA_\bl_\bl_\bo_\bc\n+ReboundAllocatorType< X, field_type > fAlloc\n+field_type Allocator retrieved from domain type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:838\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bs_\bt_\ba_\br_\bt\n+int _restart\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\br_\bA_\bl_\bl_\bo_\bc\n+ReboundAllocatorType< X, real_type > rAlloc\n+real_type Allocator retrieved from domain type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:840\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)\n+Apply inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:923\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br\n+RestartedGMResSolver(const LinearOperator< X, Y > &op, Preconditioner< X, Y >\n+&prec, scalar_real_type reduction, int restart, int maxit, int verbose)\n+Set up RestartedGMResSolver solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:850\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br\n+RestartedGMResSolver(const LinearOperator< X, Y > &op, const ScalarProduct< X >\n+&sp, Preconditioner< X, Y > &prec, scalar_real_type reduction, int restart, int\n+maxit, int verbose)\n+Set up RestartedGMResSolver solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:861\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bg_\be_\bn_\be_\br_\ba_\bt_\be_\bP_\bl_\ba_\bn_\be_\bR_\bo_\bt_\ba_\bt_\bi_\bo_\bn\n+void generatePlaneRotation(field_type &dx, field_type &dy, real_type &cs,\n+field_type &sn)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1073\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br\n+RestartedGMResSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::\n+shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X,\n+Y > > prec, scalar_real_type reduction, int restart, int maxit, int verbose)\n+Set up RestartedGMResSolver solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:894\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, Y &b, InverseOperatorResult &res)\n+Apply inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:910\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1119\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bP_\bl_\ba_\bn_\be_\bR_\bo_\bt_\ba_\bt_\bi_\bo_\bn\n+void applyPlaneRotation(field_type &dx, field_type &dy, real_type &cs,\n+field_type &sn)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bl_\be_\bx_\bi_\bb_\bl_\be_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br\n+implements the Flexible Generalized Minimal Residual (FGMRes) method (right\n+preconditioned)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1139\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bl_\be_\bx_\bi_\bb_\bl_\be_\bG_\bM_\bR_\be_\bs_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(X &x, Y &b, double reduction, InverseOperatorResult &res) override\n+Apply inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1169\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+Generalized preconditioned conjugate gradient solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1307\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+GeneralizedPCGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X >\n+&sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int\n+verbose, int restart=10)\n+Set up nonlinear preconditioned conjugate gradient solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1343\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+GeneralizedPCGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X >\n+&prec, scalar_real_type reduction, int maxit, int verbose, int restart=10)\n+Set up nonlinear preconditioned conjugate gradient solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1331\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, X &b, InverseOperatorResult &res)\n+Apply inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1391\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::\n+shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1361\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::\n+shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X,\n+X > > prec, scalar_real_type reduction, int maxit, int verbose, int restart=10)\n+Set up nonlinear preconditioned conjugate gradient solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1377\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+GeneralizedPCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::\n+shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X,\n+X > > prec, const ParameterTree &configuration)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1366\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+Accelerated flexible conjugate gradient method.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1500\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+RestartedFCGSolver(const LinearOperator< X, X > &op, Preconditioner< X, X >\n+&prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10)\n+Constructor to initialize a RestartedFCG solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1518\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::\n+shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &config)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1558\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::\n+shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X,\n+X > > prec, scalar_real_type reduction, int maxit, int verbose, int mmax=10)\n+Constructor to initialize a RestartedFCG solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1538\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\bm_\ba_\bx\n+int _mmax\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1661\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+RestartedFCGSolver(std::shared_ptr< const LinearOperator< X, X > > op, std::\n+shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X,\n+X > > prec, const ParameterTree &config)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1564\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+typename IterativeSolver< X, X >::template Iteration< unsigned int > Iteration\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1668\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, X &b, InverseOperatorResult &res)\n+Apply inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1583\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bR_\be_\bs_\bt_\ba_\br_\bt_\be_\bd_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+RestartedFCGSolver(const LinearOperator< X, X > &op, const ScalarProduct< X >\n+&sp, Preconditioner< X, X > &prec, scalar_real_type reduction, int maxit, int\n+verbose, int mmax=10)\n+Constructor to initialize a RestartedFCG solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1528\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bl_\be_\bt_\be_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+Complete flexible conjugate gradient method.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1679\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\bl_\be_\bt_\be_\bF_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, X &b, InverseOperatorResult &res) override\n+Apply inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1693\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00071.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00071.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: bcrsmatrix.hh File Reference\n+dune-istl: preconditioners.hh File Reference\n \n \n \n \n \n \n \n@@ -71,73 +71,105 @@\n \n
    \n \n
    \n \n-
    bcrsmatrix.hh File Reference
    \n+Namespaces |\n+Typedefs |\n+Functions
    \n+ \n \n
    \n \n-

    Implementation of the BCRSMatrix class. \n+

    Define general preconditioner interface. \n More...

    \n
    #include <cmath>
    \n #include <complex>
    \n-#include <set>
    \n #include <iostream>
    \n-#include <algorithm>
    \n-#include <numeric>
    \n-#include <vector>
    \n-#include <map>
    \n+#include <iomanip>
    \n #include <memory>
    \n-#include "istlexception.hh"
    \n-#include "bvector.hh"
    \n-#include "matrixutils.hh"
    \n-#include <dune/common/stdstreams.hh>
    \n-#include <dune/common/iteratorfacades.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/ftraits.hh>
    \n-#include <dune/common/scalarvectorview.hh>
    \n-#include <dune/common/scalarmatrixview.hh>
    \n-#include <dune/istl/blocklevel.hh>
    \n+#include <string>
    \n+#include <dune/common/simd/simd.hh>
    \n+#include <dune/common/parametertree.hh>
    \n+#include <dune/istl/solverregistry.hh>
    \n+#include "preconditioner.hh"
    \n+#include "solver.hh"
    \n+#include "solvercategory.hh"
    \n+#include "istlexception.hh"
    \n+#include "matrixutils.hh"
    \n+#include "gsetc.hh"
    \n+#include "dilu.hh"
    \n+#include "ildl.hh"
    \n+#include "ilu.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::CompressionStatistics< size_type >
     Statistics about compression achieved in implicit mode. More...
    class  Dune::InverseOperator2Preconditioner< O, c >
     Turns an InverseOperator into a Preconditioner. 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::SeqSSOR< M, X, Y, l >
     Sequential SSOR preconditioner. More...
     
    class  Dune::ImplicitMatrixBuilder< M_ >::row_object
     Proxy row object for entry access. More...
    class  Dune::SeqSOR< M, X, Y, l >
     Sequential SOR preconditioner. More...
     
    class  Dune::BCRSMatrix< B, A >
     A sparse block matrix with compressed row storage. More...
    class  Dune::SeqJac< M, X, Y, l >
     The sequential jacobian preconditioner. More...
     
    class  Dune::BCRSMatrix< B, A >::RealRowIterator< T >
     Iterator access to matrix rows More...
    class  Dune::SeqDILU< M, X, Y, l >
     Sequential DILU preconditioner. More...
     
    class  Dune::BCRSMatrix< B, A >::CreateIterator
     Iterator class for sequential creation of blocks More...
    class  Dune::SeqILU< M, X, Y, l >
     Sequential ILU preconditioner. More...
     
    struct  Dune::FieldTraits< BCRSMatrix< B, A > >
    class  Dune::Richardson< X, Y >
     Richardson preconditioner. More...
     
    class  Dune::SeqILDL< M, X, Y >
     sequential ILDL preconditioner More...
     
    \n \n \n \n+

    \n Namespaces

    namespace  Dune
     
    \n+\n+\n+\n+\n+\n+

    \n+Typedefs

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

    \n+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 ("dilu", defaultPreconditionerBlockLevelCreator< Dune::SeqDILU >())
     
     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 >())
     
    \n

    Detailed Description

    \n-

    Implementation of the BCRSMatrix class.

    \n+

    Define general preconditioner interface.

    \n+

    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.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,58 +1,96 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-bcrsmatrix.hh File Reference\n-Implementation of the BCRSMatrix class. _\bM_\bo_\br_\be_\b._\b._\b.\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+preconditioners.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+Define general preconditioner interface. _\bM_\bo_\br_\be_\b._\b._\b.\n #include \n #include \n-#include \n #include \n-#include \n-#include \n-#include \n-#include \n+#include \n #include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh>\n+#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\"\n+#include \"_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\"\n+#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n #include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n #include \"_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\"\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n+#include \"_\bd_\bi_\bl_\bu_\b._\bh_\bh\"\n+#include \"_\bi_\bl_\bd_\bl_\b._\bh_\bh\"\n+#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs_\b<_\b _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b _\b>\n-\u00a0 Statistics about compression achieved in implicit mode. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bO_\b,_\b _\bc_\b _\b>\n+\u00a0 Turns an _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br into a _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\b _\bM_\b__\b _\b>\n-\u00a0 A wrapper for uniform access to the _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx during and after the\n- build stage in implicit build mode. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n+\u00a0 Sequential SSOR preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\b _\bM_\b__\b _\b>_\b:_\b:_\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt\n-\u00a0 Proxy row object for entry access. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n+\u00a0 Sequential SOR preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n-\u00a0 A sparse block matrix with compressed row storage. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n+\u00a0 The sequential jacobian preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n-\u00a0 Iterator access to matrix rows _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n+\u00a0 Sequential _\bD_\bI_\bL_\bU preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-\u00a0 Iterator class for sequential creation of blocks _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n+\u00a0 Sequential _\bI_\bL_\bU preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0 _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0 sequential ILDL preconditioner _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bG_\bS = _\bS_\be_\bq_\bS_\bO_\bR< M, X, Y, l >\n+\u00a0 Sequential Gauss Seidel preconditioner.\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR (\"ssor\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR (\"sor\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR (\"gs\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bG_\bS >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR (\"jac\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR (\"dilu\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR (\"ilu\",\n+ _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU >())\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR (\"richardson\", [](auto tl, const auto &,\n+ const ParameterTree &config){ using D=typename Dune::TypeListElement< 1,\n+ decltype(tl)>::type;using R=typename Dune::TypeListElement< 2, decltype\n+ (tl)>::type;return std::make_shared< _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn< D, R > >(config);})\n+\u00a0\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR (\"ildl\", _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br<\n+ _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL >())\n+\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Implementation of the BCRSMatrix class.\n+Define general preconditioner interface.\n+Wrap the methods implemented by ISTL in this interface. However, the interface\n+is extensible such that new preconditioners can be implemented and used with\n+the solvers.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00071_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00071_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: bcrsmatrix.hh Source File\n+dune-istl: preconditioners.hh Source File\n \n \n \n \n \n \n \n@@ -74,2094 +74,840 @@\n \n
    \n \n
    \n
    \n
    \n-
    bcrsmatrix.hh
    \n+
    preconditioners.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5
    \n-
    6#ifndef DUNE_ISTL_BCRSMATRIX_HH
    \n-
    7#define DUNE_ISTL_BCRSMATRIX_HH
    \n-
    8
    \n-
    9#include <cmath>
    \n-
    10#include <complex>
    \n-
    11#include <set>
    \n-
    12#include <iostream>
    \n-
    13#include <algorithm>
    \n-
    14#include <numeric>
    \n-
    15#include <vector>
    \n-
    16#include <map>
    \n-
    17#include <memory>
    \n-
    18
    \n-
    19#include "istlexception.hh"
    \n-
    20#include "bvector.hh"
    \n-
    21#include "matrixutils.hh"
    \n-
    22#include <dune/common/stdstreams.hh>
    \n-
    23#include <dune/common/iteratorfacades.hh>
    \n-
    24#include <dune/common/typetraits.hh>
    \n-
    25#include <dune/common/ftraits.hh>
    \n-
    26#include <dune/common/scalarvectorview.hh>
    \n-
    27#include <dune/common/scalarmatrixview.hh>
    \n+
    5#ifndef DUNE_ISTL_PRECONDITIONERS_HH
    \n+
    6#define DUNE_ISTL_PRECONDITIONERS_HH
    \n+
    7
    \n+
    8#include <cmath>
    \n+
    9#include <complex>
    \n+
    10#include <iostream>
    \n+
    11#include <iomanip>
    \n+
    12#include <memory>
    \n+
    13#include <string>
    \n+
    14
    \n+
    15#include <dune/common/simd/simd.hh>
    \n+
    16#include <dune/common/parametertree.hh>
    \n+
    17
    \n+\n+
    19#include "preconditioner.hh"
    \n+
    20#include "solver.hh"
    \n+
    21#include "solvercategory.hh"
    \n+
    22#include "istlexception.hh"
    \n+
    23#include "matrixutils.hh"
    \n+
    24#include "gsetc.hh"
    \n+
    25#include "dilu.hh"
    \n+
    26#include "ildl.hh"
    \n+
    27#include "ilu.hh"
    \n
    28
    \n-\n-
    30
    \n-
    35namespace Dune {
    \n-
    36
    \n-
    76 template<typename M>
    \n-
    77 struct MatrixDimension;
    \n-
    78
    \n-
    80
    \n-
    86 template<typename size_type>
    \n-
    \n-\n-
    88 {
    \n-
    90 double avg;
    \n-
    92 size_type maximum;
    \n-
    94 size_type overflow_total;
    \n-
    96
    \n-
    99 double mem_ratio;
    \n-
    100 };
    \n+
    29
    \n+
    30namespace Dune {
    \n+
    73 template<class O, int c = -1>
    \n+
    \n+\n+
    75 public Preconditioner<typename O::domain_type, typename O::range_type>
    \n+
    76 {
    \n+
    77 public:
    \n+
    79 typedef typename O::domain_type domain_type;
    \n+
    81 typedef typename O::range_type range_type;
    \n+
    83 typedef typename range_type::field_type field_type;
    \n+
    85 typedef Simd::Scalar<field_type> scalar_field_type;
    \n+
    87 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
    \n+
    89 typedef O InverseOperator;
    \n+
    90
    \n+
    \n+\n+
    96 : inverse_operator_(inverse_operator)
    \n+
    97 {
    \n+
    98 if(c != -1 && SolverCategory::category(inverse_operator_) != c)
    \n+
    99 DUNE_THROW(InvalidStateException, "User-supplied solver category does not match that of the given inverse operator");
    \n+
    100 }
    \n
    \n
    101
    \n-
    103
    \n-
    115 template<class M_>
    \n-
    \n-\n-
    117 {
    \n-
    118
    \n-
    119 public:
    \n+
    \n+
    102 virtual void pre(domain_type&,range_type&)
    \n+
    103 {}
    \n+
    \n+
    104
    \n+
    \n+
    105 virtual void apply(domain_type& v, const range_type& d)
    \n+
    106 {
    \n+\n+
    108 range_type copy(d);
    \n+
    109 inverse_operator_.apply(v, copy, res);
    \n+
    110 }
    \n+
    \n+
    111
    \n+
    \n+
    112 virtual void post(domain_type&)
    \n+
    113 {}
    \n+
    \n+
    114
    \n+
    \n+\n+
    117 {
    \n+
    118 return SolverCategory::category(inverse_operator_);
    \n+
    119 }
    \n+
    \n
    120
    \n-
    122 typedef M_ Matrix;
    \n-
    123
    \n-\n-
    126
    \n-
    128 typedef typename Matrix::size_type size_type;
    \n+
    121 private:
    \n+
    122 InverseOperator& inverse_operator_;
    \n+
    123 };
    \n+
    \n+
    124
    \n+
    125 //=====================================================================
    \n+
    126 // Implementation of this interface for sequential ISTL-preconditioners
    \n+
    127 //=====================================================================
    \n+
    128
    \n
    129
    \n-
    131
    \n-
    \n-\n-
    137 {
    \n-
    138
    \n-
    139 public:
    \n-
    140
    \n-
    \n-\n-
    143 {
    \n-
    144 return _m.entry(_i,j);
    \n-
    145 }
    \n-
    \n-
    146
    \n-
    147#ifndef DOXYGEN
    \n-
    148
    \n-\n-
    150 : _m(m)
    \n-
    151 , _i(i)
    \n-
    152 {}
    \n-
    153
    \n-
    154#endif
    \n-
    155
    \n-
    156 private:
    \n-
    157
    \n-
    158 Matrix& _m;
    \n-\n-
    160
    \n-
    161 };
    \n-
    \n-
    162
    \n-
    164
    \n-
    \n-\n-
    171 : _m(m)
    \n-
    172 {
    \n-
    173 if (m.buildMode() != Matrix::implicit)
    \n-
    174 DUNE_THROW(BCRSMatrixError,"You can only create an ImplicitBuilder for a matrix in implicit build mode");
    \n-
    175 if (m.buildStage() != Matrix::building)
    \n-
    176 DUNE_THROW(BCRSMatrixError,"You can only create an ImplicitBuilder for a matrix with set size that has not been compressed() yet");
    \n-
    177 }
    \n-
    \n-
    178
    \n-
    180
    \n-
    \n-
    194 ImplicitMatrixBuilder(Matrix& m, size_type rows, size_type cols, size_type avg_cols_per_row, double overflow_fraction)
    \n-
    195 : _m(m)
    \n-
    196 {
    \n-
    197 if (m.buildStage() != Matrix::notAllocated)
    \n-
    198 DUNE_THROW(BCRSMatrixError,"You can only set up a matrix for this ImplicitBuilder if it has no memory allocated yet");
    \n-
    199 m.setBuildMode(Matrix::implicit);
    \n-
    200 m.setImplicitBuildModeParameters(avg_cols_per_row,overflow_fraction);
    \n-
    201 m.setSize(rows,cols);
    \n-
    202 }
    \n+
    141 template<class M, class X, class Y, int l=1>
    \n+
    \n+
    142 class SeqSSOR : public Preconditioner<X,Y> {
    \n+
    143 public:
    \n+
    145 typedef M matrix_type;
    \n+
    147 typedef X domain_type;
    \n+
    149 typedef Y range_type;
    \n+
    151 typedef typename X::field_type field_type;
    \n+
    153 typedef Simd::Scalar<field_type> scalar_field_type;
    \n+
    155 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
    \n+
    156
    \n+
    \n+
    164 SeqSSOR (const M& A, int n, real_field_type w)
    \n+
    165 : _A_(A), _n(n), _w(w)
    \n+
    166 {
    \n+\n+
    168 }
    \n+
    \n+
    169
    \n+
    \n+
    183 SeqSSOR (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
    \n+
    184 : SeqSSOR(A->getmat(), configuration)
    \n+
    185 {}
    \n+
    \n+
    186
    \n+
    \n+
    200 SeqSSOR (const M& A, const ParameterTree& configuration)
    \n+
    201 : SeqSSOR(A, configuration.get<int>("iterations",1), configuration.get<real_field_type>("relaxation",1.0))
    \n+
    202 {}
    \n
    \n
    203
    \n-
    \n-\n-
    206 {
    \n-
    207 return row_object(_m,i);
    \n-
    208 }
    \n-
    \n-
    209
    \n-
    \n-
    211 size_type N() const
    \n-
    212 {
    \n-
    213 return _m.N();
    \n-
    214 }
    \n+
    \n+
    209 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
    \n+
    210 {}
    \n
    \n-
    215
    \n+
    211
    \n
    \n-
    217 size_type M() const
    \n-
    218 {
    \n-
    219 return _m.M();
    \n-
    220 }
    \n-
    \n-
    221
    \n-
    222 private:
    \n-
    223
    \n-
    224 Matrix& _m;
    \n-
    225
    \n-
    226 };
    \n-
    \n-
    227
    \n-
    464 template<class B, class A=std::allocator<B> >
    \n-
    \n-\n-
    466 {
    \n-
    467 friend struct MatrixDimension<BCRSMatrix>;
    \n-
    468 public:
    \n-
    \n-\n-\n-\n-\n-\n-
    482 built=3
    \n-
    483 };
    \n-
    \n-
    484
    \n-
    485 //===== type definitions and constants
    \n-
    486
    \n-
    488 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n-
    489
    \n-
    491 typedef B block_type;
    \n-
    492
    \n-
    494 typedef A allocator_type;
    \n-
    495
    \n-
    497 typedef typename A::size_type size_type;
    \n-
    498
    \n-
    500 typedef Imp::CompressedBlockVectorWindow<B,size_type> row_type;
    \n-
    501
    \n-
    503 typedef ::Dune::CompressionStatistics<size_type> CompressionStatistics;
    \n-
    504
    \n-
    \n-\n-\n-\n-\n-
    539 unknown
    \n-
    540 };
    \n-
    \n-
    541
    \n-
    542 //===== random access interface to rows of the matrix
    \n-
    543
    \n-
    \n-\n-
    546 {
    \n-
    547#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    548 if (build_mode == implicit && ready != built)
    \n-
    549 DUNE_THROW(BCRSMatrixError,"You cannot use operator[] in implicit build mode before calling compress()");
    \n-
    550 if (r==0) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
    \n-
    551 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    552#endif
    \n-
    553 return r[i];
    \n-
    554 }
    \n-
    \n-
    555
    \n-
    \n-\n-
    558 {
    \n-
    559#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    560 if (build_mode == implicit && ready != built)
    \n-
    561 DUNE_THROW(BCRSMatrixError,"You cannot use operator[] in implicit build mode before calling compress()");
    \n-
    562 if (built!=ready) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
    \n-
    563 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    564#endif
    \n-
    565 return r[i];
    \n-
    566 }
    \n-
    \n-
    567
    \n-
    568
    \n-
    569 //===== iterator interface to rows of the matrix
    \n-
    570
    \n-
    572 template<class T>
    \n-
    \n-\n-
    574 : public RandomAccessIteratorFacade<RealRowIterator<T>, T>
    \n-
    575 {
    \n-
    576
    \n-
    577 public:
    \n-
    579 typedef typename std::remove_const<T>::type ValueType;
    \n-
    580
    \n-
    581 friend class RandomAccessIteratorFacade<RealRowIterator<const ValueType>, const ValueType>;
    \n-
    582 friend class RandomAccessIteratorFacade<RealRowIterator<ValueType>, ValueType>;
    \n-
    583 friend class RealRowIterator<const ValueType>;
    \n-
    584 friend class RealRowIterator<ValueType>;
    \n-
    585
    \n-
    \n-\n-
    588 : p(_p), i(_i)
    \n-
    589 {}
    \n-
    \n-
    590
    \n-
    \n-\n-
    593 : p(0), i(0)
    \n-
    594 {}
    \n-
    \n-
    595
    \n-
    \n-\n-
    597 : p(it.p), i(it.i)
    \n-
    598 {}
    \n+
    217 virtual void apply (X& v, const Y& d)
    \n+
    218 {
    \n+
    219 for (int i=0; i<_n; i++) {
    \n+
    220 bsorf(_A_,v,d,_w,BL<l>());
    \n+
    221 bsorb(_A_,v,d,_w,BL<l>());
    \n+
    222 }
    \n+
    223 }
    \n+
    \n+
    224
    \n+
    \n+
    230 virtual void post ([[maybe_unused]] X& x)
    \n+
    231 {}
    \n+
    \n+
    232
    \n+
    \n+\n+
    235 {
    \n+\n+
    237 }
    \n+
    \n+
    238
    \n+
    239 private:
    \n+
    241 const M& _A_;
    \n+
    243 int _n;
    \n+\n+
    246 };
    \n+
    \n+
    247 DUNE_REGISTER_PRECONDITIONER("ssor", defaultPreconditionerBlockLevelCreator<Dune::SeqSSOR>());
    \n+
    248
    \n+
    249
    \n+
    261 template<class M, class X, class Y, int l=1>
    \n+
    \n+
    262 class SeqSOR : public Preconditioner<X,Y> {
    \n+
    263 public:
    \n+
    265 typedef M matrix_type;
    \n+
    267 typedef X domain_type;
    \n+
    269 typedef Y range_type;
    \n+
    271 typedef typename X::field_type field_type;
    \n+
    273 typedef Simd::Scalar<field_type> scalar_field_type;
    \n+
    275 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
    \n+
    276
    \n+
    \n+
    284 SeqSOR (const M& A, int n, real_field_type w)
    \n+
    285 : _A_(A), _n(n), _w(w)
    \n+
    286 {
    \n+\n+
    288 }
    \n+
    \n+
    289
    \n+
    \n+
    303 SeqSOR (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
    \n+
    304 : SeqSOR(A->getmat(), configuration)
    \n+
    305 {}
    \n+
    \n+
    306
    \n+
    \n+
    320 SeqSOR (const M& A, const ParameterTree& configuration)
    \n+
    321 : SeqSOR(A, configuration.get<int>("iterations",1), configuration.get<real_field_type>("relaxation",1.0))
    \n+
    322 {}
    \n+
    \n+
    323
    \n+
    \n+
    329 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
    \n+
    330 {}
    \n+
    \n+
    331
    \n+
    \n+
    337 virtual void apply (X& v, const Y& d)
    \n+
    338 {
    \n+
    339 this->template apply<true>(v,d);
    \n+
    340 }
    \n+
    \n+
    341
    \n+
    350 template<bool forward>
    \n+
    \n+
    351 void apply(X& v, const Y& d)
    \n+
    352 {
    \n+
    353 if(forward)
    \n+
    354 for (int i=0; i<_n; i++) {
    \n+
    355 bsorf(_A_,v,d,_w,BL<l>());
    \n+
    356 }
    \n+
    357 else
    \n+
    358 for (int i=0; i<_n; i++) {
    \n+
    359 bsorb(_A_,v,d,_w,BL<l>());
    \n+
    360 }
    \n+
    361 }
    \n+
    \n+
    362
    \n+
    \n+
    368 virtual void post ([[maybe_unused]] X& x)
    \n+
    369 {}
    \n+
    \n+
    370
    \n+
    \n+\n+
    373 {
    \n+\n+
    375 }
    \n+
    \n+
    376
    \n+
    377 private:
    \n+
    379 const M& _A_;
    \n+
    381 int _n;
    \n+\n+
    384 };
    \n+
    \n+
    385 DUNE_REGISTER_PRECONDITIONER("sor", defaultPreconditionerBlockLevelCreator<Dune::SeqSOR>());
    \n+
    386
    \n+
    387
    \n+
    398 template<class M, class X, class Y, int l=1>
    \n+\n+
    400 DUNE_REGISTER_PRECONDITIONER("gs", defaultPreconditionerBlockLevelCreator<Dune::SeqGS>());
    \n+
    401
    \n+
    412 template<class M, class X, class Y, int l=1>
    \n+
    \n+\n+
    414 public:
    \n+
    416 typedef M matrix_type;
    \n+
    418 typedef X domain_type;
    \n+
    420 typedef Y range_type;
    \n+
    422 typedef typename X::field_type field_type;
    \n+
    424 typedef Simd::Scalar<field_type> scalar_field_type;
    \n+
    426 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
    \n+
    427
    \n+
    \n+
    435 SeqJac (const M& A, int n, real_field_type w)
    \n+
    436 : _A_(A), _n(n), _w(w)
    \n+
    437 {
    \n+\n+
    439 }
    \n+
    \n+
    440
    \n+
    \n+
    454 SeqJac (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
    \n+
    455 : SeqJac(A->getmat(), configuration)
    \n+
    456 {}
    \n+
    \n+
    457
    \n+
    \n+
    471 SeqJac (const M& A, const ParameterTree& configuration)
    \n+
    472 : SeqJac(A, configuration.get<int>("iterations",1), configuration.get<real_field_type>("relaxation",1.0))
    \n+
    473 {}
    \n+
    \n+
    474
    \n+
    \n+
    480 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
    \n+
    481 {}
    \n+
    \n+
    482
    \n+
    \n+
    488 virtual void apply (X& v, const Y& d)
    \n+
    489 {
    \n+
    490 for (int i=0; i<_n; i++) {
    \n+
    491 dbjac(_A_,v,d,_w,BL<l>());
    \n+
    492 }
    \n+
    493 }
    \n+
    \n+
    494
    \n+
    \n+
    500 virtual void post ([[maybe_unused]] X& x)
    \n+
    501 {}
    \n+
    \n+
    502
    \n+
    \n+\n+
    505 {
    \n+\n+
    507 }
    \n+
    \n+
    508
    \n+
    509 private:
    \n+
    511 const M& _A_;
    \n+
    513 int _n;
    \n+
    515 real_field_type _w;
    \n+
    516 };
    \n+
    \n+
    517 DUNE_REGISTER_PRECONDITIONER("jac", defaultPreconditionerBlockLevelCreator<Dune::SeqJac>());
    \n+
    518
    \n+
    562 template <class M, class X, class Y, int l = 1>
    \n+
    \n+\n+
    564 {
    \n+
    565 public:
    \n+
    567 using matrix_type = M;
    \n+
    569 using block_type = typename matrix_type::block_type;
    \n+
    571 using domain_type = X;
    \n+
    573 using range_type = Y;
    \n+
    574
    \n+
    576 using field_type = typename X::field_type;
    \n+
    577
    \n+
    579 using scalar_field_type = Simd::Scalar<field_type>;
    \n+
    581 using real_field_type = typename FieldTraits<scalar_field_type>::real_type;
    \n+
    582
    \n+
    \n+\n+
    590 : _A_(A),
    \n+
    591 _w(w),
    \n+
    592 wNotIdentity_([w]
    \n+
    593 {using std::abs; return abs(w - real_field_type(1)) > 1e-15; }())
    \n+
    594 {
    \n+
    595 Dinv_.resize(_A_.N());
    \n+\n+\n+
    598 }
    \n
    \n
    599
    \n-
    600
    \n-
    \n-\n-
    603 {
    \n-
    604 return i;
    \n-
    605 }
    \n-
    \n-
    606
    \n-
    \n-
    607 std::ptrdiff_t distanceTo(const RealRowIterator<ValueType>& other) const
    \n-
    608 {
    \n-
    609 assert(other.p==p);
    \n-
    610 return (other.i-i);
    \n-
    611 }
    \n-
    \n-
    612
    \n-
    \n-
    613 std::ptrdiff_t distanceTo(const RealRowIterator<const ValueType>& other) const
    \n-
    614 {
    \n-
    615 assert(other.p==p);
    \n-
    616 return (other.i-i);
    \n-
    617 }
    \n-
    \n-
    618
    \n-
    \n-
    620 bool equals (const RealRowIterator<ValueType>& other) const
    \n-
    621 {
    \n-
    622 assert(other.p==p);
    \n-
    623 return i==other.i;
    \n-
    624 }
    \n-
    \n-
    625
    \n-
    \n-
    627 bool equals (const RealRowIterator<const ValueType>& other) const
    \n-
    628 {
    \n-
    629 assert(other.p==p);
    \n-
    630 return i==other.i;
    \n-
    631 }
    \n-
    \n-
    632
    \n-
    633 private:
    \n-
    635 void increment()
    \n-
    636 {
    \n-
    637 ++i;
    \n-
    638 }
    \n-
    639
    \n-
    641 void decrement()
    \n-
    642 {
    \n-
    643 --i;
    \n-
    644 }
    \n-
    645
    \n-
    646 void advance(std::ptrdiff_t diff)
    \n-
    647 {
    \n-
    648 i+=diff;
    \n-
    649 }
    \n+
    \n+
    612 SeqDILU(const std::shared_ptr<const AssembledLinearOperator<M, X, Y>> &A, const ParameterTree &configuration)
    \n+
    613 : SeqDILU(A->getmat(), configuration)
    \n+
    614 {
    \n+
    615 }
    \n+
    \n+
    616
    \n+
    \n+
    629 SeqDILU(const M &A, const ParameterTree &config)
    \n+
    630 : SeqDILU(A, config.get<real_field_type>("relaxation", 1.0))
    \n+
    631 {
    \n+
    632 }
    \n+
    \n+
    633
    \n+
    \n+
    639 virtual void pre([[maybe_unused]] X &x, [[maybe_unused]] Y &b)
    \n+
    640 {
    \n+
    641 }
    \n+
    \n+
    642
    \n+
    \n+
    648 virtual void apply(X &v, const Y &d)
    \n+
    649 {
    \n
    650
    \n-
    651 T& elementAt(std::ptrdiff_t diff) const
    \n-
    652 {
    \n-
    653 return p[i+diff];
    \n-
    654 }
    \n-
    655
    \n-
    657 row_type& dereference () const
    \n-
    658 {
    \n-
    659 return p[i];
    \n-
    660 }
    \n-
    661
    \n-
    662 row_type* p;
    \n-
    663 size_type i;
    \n-
    664 };
    \n-
    \n-
    665
    \n-\n-\n-
    669
    \n-
    \n-\n-
    672 {
    \n-
    673 return Iterator(r,0);
    \n-
    674 }
    \n-
    \n-
    675
    \n-
    \n-\n-
    678 {
    \n-
    679 return Iterator(r,n);
    \n-
    680 }
    \n-
    \n-
    681
    \n-
    \n-\n-
    685 {
    \n-
    686 return Iterator(r,n-1);
    \n-
    687 }
    \n-
    \n-
    688
    \n-
    \n-\n-
    692 {
    \n-
    693 return Iterator(r,-1);
    \n-
    694 }
    \n-
    \n-
    695
    \n-\n-
    698
    \n-
    700 typedef typename row_type::Iterator ColIterator;
    \n-
    701
    \n-\n-\n-
    705
    \n-
    706
    \n-
    \n-\n-
    709 {
    \n-
    710 return ConstIterator(r,0);
    \n-
    711 }
    \n-
    \n-
    712
    \n-
    \n-\n-
    715 {
    \n-
    716 return ConstIterator(r,n);
    \n-
    717 }
    \n-
    \n+
    651 DILU::blockDILUBacksolve(_A_, Dinv_, v, d);
    \n+
    652
    \n+
    653 if (wNotIdentity_)
    \n+
    654 {
    \n+
    655 v *= _w;
    \n+
    656 }
    \n+
    657 }
    \n+
    \n+
    658
    \n+
    \n+
    664 virtual void post([[maybe_unused]] X &x)
    \n+
    665 {
    \n+
    666 }
    \n+
    \n+
    667
    \n+
    \n+\n+
    670 {
    \n+\n+
    672 }
    \n+
    \n+
    673
    \n+
    674 protected:
    \n+
    675 std::vector<block_type> Dinv_;
    \n+
    677 const M &_A_;
    \n+\n+
    681 const bool wNotIdentity_;
    \n+
    682 };
    \n+
    \n+
    683 DUNE_REGISTER_PRECONDITIONER("dilu", defaultPreconditionerBlockLevelCreator<Dune::SeqDILU>());
    \n+
    684
    \n+
    696 template<class M, class X, class Y, int l=1>
    \n+
    \n+
    697 class SeqILU : public Preconditioner<X,Y> {
    \n+
    698 public:
    \n+
    700 typedef typename std::remove_const<M>::type matrix_type;
    \n+
    702 typedef typename matrix_type :: block_type block_type;
    \n+
    704 typedef X domain_type;
    \n+
    706 typedef Y range_type;
    \n+
    707
    \n+
    709 typedef typename X::field_type field_type;
    \n+
    710
    \n+
    712 typedef Simd::Scalar<field_type> scalar_field_type;
    \n+
    714 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
    \n+
    715
    \n+\n
    718
    \n-
    \n-\n-
    722 {
    \n-
    723 return ConstIterator(r,n-1);
    \n-
    724 }
    \n-
    \n-
    725
    \n-
    \n-\n-
    729 {
    \n-
    730 return ConstIterator(r,-1);
    \n-
    731 }
    \n-
    \n-
    732
    \n-\n-
    735
    \n-
    737 typedef typename row_type::ConstIterator ConstColIterator;
    \n-
    738
    \n-
    739 //===== constructors & resizers
    \n-
    740
    \n-
    741 // we use a negative compressionBufferSize to indicate that the implicit
    \n-
    742 // mode parameters have not been set yet
    \n-
    743
    \n+
    \n+
    726 SeqILU (const M& A, real_field_type w, const bool resort = false )
    \n+
    727 : SeqILU( A, 0, w, resort ) // construct ILU(0)
    \n+
    728 {
    \n+
    729 }
    \n+
    \n+
    730
    \n
    \n-\n-
    746 : build_mode(unknown), ready(notAllocated), n(0), m(0), nnz_(0),
    \n-
    747 allocationSize_(0), r(0), a(0),
    \n-\n-
    749 {}
    \n-
    \n-
    750
    \n-
    \n-\n-
    753 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
    \n-
    754 allocationSize_(0), r(0), a(0),
    \n-\n-
    756 {
    \n-
    757 allocate(_n, _m, _nnz,true,false);
    \n-
    758 }
    \n-
    \n-
    759
    \n-
    \n-\n-
    762 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
    \n-
    763 allocationSize_(0), r(0), a(0),
    \n-\n-
    765 {
    \n-
    766 allocate(_n, _m,0,true,false);
    \n-
    767 }
    \n+
    745 SeqILU (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
    \n+
    746 : SeqILU(A->getmat(), configuration)
    \n+
    747 {}
    \n+
    \n+
    748
    \n+
    \n+
    763 SeqILU(const M& A, const ParameterTree& config)
    \n+
    764 : SeqILU(A, config.get("n", 0),
    \n+
    765 config.get<real_field_type>("relaxation", 1.0),
    \n+
    766 config.get("resort", false))
    \n+
    767 {}
    \n
    \n
    768
    \n-
    770
    \n-
    \n-
    781 BCRSMatrix (size_type _n, size_type _m, size_type _avg, double compressionBufferSize, BuildMode bm)
    \n-
    782 : build_mode(bm), ready(notAllocated), n(0), m(0), nnz_(0),
    \n-
    783 allocationSize_(0), r(0), a(0),
    \n-
    784 avg(_avg), compressionBufferSize_(compressionBufferSize)
    \n-
    785 {
    \n-
    786 if (bm != implicit)
    \n-
    787 DUNE_THROW(BCRSMatrixError,"Only call this constructor when using the implicit build mode");
    \n-
    788 // Prevent user from setting a negative compression buffer size:
    \n-
    789 // 1) It doesn't make sense
    \n-
    790 // 2) We use a negative value to indicate that the parameters
    \n-
    791 // have not been set yet
    \n-
    792 if (compressionBufferSize_ < 0.0)
    \n-
    793 DUNE_THROW(BCRSMatrixError,"You cannot set a negative overflow fraction");
    \n-
    794 implicit_allocate(_n,_m);
    \n-
    795 }
    \n-
    \n-
    796
    \n-
    \n-\n-
    803 : build_mode(Mat.build_mode), ready(notAllocated), n(0), m(0), nnz_(0),
    \n-
    804 allocationSize_(0), r(0), a(0),
    \n-\n-
    806 {
    \n-
    807 if (!(Mat.ready == notAllocated || Mat.ready == built))
    \n-
    808 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copy-constructed when source matrix is completely empty (size not set) or fully built)");
    \n-
    809
    \n-
    810 // deep copy in global array
    \n-
    811 size_type _nnz = Mat.nonzeroes();
    \n-
    812
    \n-
    813 j_ = Mat.j_; // enable column index sharing, release array in case of row-wise allocation
    \n-
    814 allocate(Mat.n, Mat.m, _nnz, true, true);
    \n-
    815
    \n-
    816 // build window structure
    \n-\n-
    818 }
    \n+
    \n+
    777 SeqILU (const M& A, int n, real_field_type w, const bool resort = false )
    \n+
    778 : ILU_(),
    \n+
    779 lower_(),
    \n+
    780 upper_(),
    \n+
    781 inv_(),
    \n+
    782 w_(w),
    \n+
    783 wNotIdentity_([w]{using std::abs; return abs(w - real_field_type(1)) > 1e-15;}() )
    \n+
    784 {
    \n+
    785 if( n == 0 )
    \n+
    786 {
    \n+
    787 // copy A
    \n+
    788 ILU_.reset( new matrix_type( A ) );
    \n+
    789 // create ILU(0) decomposition
    \n+\n+
    791 }
    \n+
    792 else
    \n+
    793 {
    \n+
    794 // create matrix in build mode
    \n+
    795 ILU_.reset( new matrix_type( A.N(), A.M(), matrix_type::row_wise) );
    \n+
    796 // create ILU(n) decomposition
    \n+\n+
    798 }
    \n+
    799
    \n+
    800 if( resort )
    \n+
    801 {
    \n+
    802 // store ILU in simple CRS format
    \n+\n+
    804 ILU_.reset();
    \n+
    805 }
    \n+
    806 }
    \n+
    \n+
    807
    \n+
    \n+
    813 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
    \n+
    814 {}
    \n
    \n-
    819
    \n+
    815
    \n
    \n-\n+
    821 virtual void apply (X& v, const Y& d)
    \n
    822 {
    \n-
    823 deallocate();
    \n-
    824 }
    \n+
    823 if( ILU_ )
    \n+
    824 {
    \n+\n+
    826 }
    \n+
    827 else
    \n+
    828 {
    \n+\n+
    830 }
    \n+
    831
    \n+
    832 if( wNotIdentity_ )
    \n+
    833 {
    \n+
    834 v *= w_;
    \n+
    835 }
    \n+
    836 }
    \n+
    \n+
    837
    \n+
    \n+
    843 virtual void post ([[maybe_unused]] X& x)
    \n+
    844 {}
    \n+
    \n+
    845
    \n+
    \n+\n+
    848 {
    \n+\n+
    850 }
    \n+
    \n+
    851
    \n+
    852 protected:
    \n+
    854 std::unique_ptr< matrix_type > ILU_;
    \n+
    855
    \n+\n+\n+
    859 std::vector< block_type, typename matrix_type::allocator_type > inv_;
    \n+
    860
    \n+\n+
    864 const bool wNotIdentity_;
    \n+
    865 };
    \n
    \n-
    825
    \n-
    \n-\n-
    831 {
    \n-
    832 if (ready == notAllocated)
    \n-
    833 {
    \n-
    834 build_mode = bm;
    \n-
    835 return;
    \n-
    836 }
    \n-
    837 if (ready == building && (build_mode == unknown || build_mode == random || build_mode == row_wise) && (bm == row_wise || bm == random))
    \n-
    838 build_mode = bm;
    \n-
    839 else
    \n-
    840 DUNE_THROW(InvalidStateException, "Matrix structure cannot be changed at this stage anymore (ready == "<<ready<<").");
    \n-
    841 }
    \n-
    \n-
    842
    \n-
    \n-
    858 void setSize(size_type rows, size_type columns, size_type nnz=0)
    \n-
    859 {
    \n-
    860 // deallocate already setup memory
    \n-
    861 deallocate();
    \n-
    862
    \n-
    863 if (build_mode == implicit)
    \n-
    864 {
    \n-
    865 if (nnz>0)
    \n-
    866 DUNE_THROW(Dune::BCRSMatrixError,"number of non-zeroes may not be set in implicit mode, use setImplicitBuildModeParameters() instead");
    \n+
    866 DUNE_REGISTER_PRECONDITIONER("ilu", defaultPreconditionerBlockLevelCreator<Dune::SeqILU>());
    \n
    867
    \n-
    868 // implicit allocates differently
    \n-
    869 implicit_allocate(rows,columns);
    \n-
    870 }
    \n-
    871 else
    \n-
    872 {
    \n-
    873 // allocate matrix memory
    \n-
    874 allocate(rows, columns, nnz, true, false);
    \n-
    875 }
    \n-
    876 }
    \n-
    \n-
    877
    \n-
    \n-
    886 void setImplicitBuildModeParameters(size_type _avg, double compressionBufferSize)
    \n-
    887 {
    \n-
    888 // Prevent user from setting a negative compression buffer size:
    \n-
    889 // 1) It doesn't make sense
    \n-
    890 // 2) We use a negative value to indicate that the parameters
    \n-
    891 // have not been set yet
    \n-
    892 if (compressionBufferSize < 0.0)
    \n-
    893 DUNE_THROW(BCRSMatrixError,"You cannot set a negative compressionBufferSize value");
    \n-
    894
    \n-
    895 // make sure the parameters aren't changed after memory has been allocated
    \n-
    896 if (ready != notAllocated)
    \n-
    897 DUNE_THROW(InvalidStateException,"You cannot modify build mode parameters at this stage anymore");
    \n-
    898 avg = _avg;
    \n-
    899 compressionBufferSize_ = compressionBufferSize;
    \n-
    900 }
    \n-
    \n-
    901
    \n-
    \n-\n-
    909 {
    \n-
    910 // return immediately when self-assignment
    \n-
    911 if (&Mat==this) return *this;
    \n-
    912
    \n-
    913 if (!((ready == notAllocated || ready == built) && (Mat.ready == notAllocated || Mat.ready == built)))
    \n-
    914 DUNE_THROW(InvalidStateException,"BCRSMatrix can only be copied when both target and source are empty or fully built)");
    \n-
    915
    \n-
    916 // make it simple: ALWAYS throw away memory for a and j_
    \n-
    917 // and deallocate rows only if n != Mat.n
    \n-
    918 deallocate(n!=Mat.n);
    \n-
    919
    \n-
    920 // reallocate the rows if required
    \n-
    921 if (n>0 && n!=Mat.n) {
    \n-
    922 // free rows
    \n-
    923 for(row_type *riter=r+(n-1), *rend=r-1; riter!=rend; --riter)
    \n-
    924 std::allocator_traits<decltype(rowAllocator_)>::destroy(rowAllocator_, riter);
    \n-
    925 rowAllocator_.deallocate(r,n);
    \n-
    926 }
    \n-
    927
    \n-
    928 nnz_ = Mat.nonzeroes();
    \n-
    929
    \n-
    930 // allocate a, share j_
    \n-
    931 j_ = Mat.j_;
    \n-
    932 allocate(Mat.n, Mat.m, nnz_, n!=Mat.n, true);
    \n+
    868
    \n+
    877 template<class X, class Y>
    \n+
    \n+
    878 class Richardson : public Preconditioner<X,Y> {
    \n+
    879 public:
    \n+
    881 typedef X domain_type;
    \n+
    883 typedef Y range_type;
    \n+
    885 typedef typename X::field_type field_type;
    \n+
    887 typedef Simd::Scalar<field_type> scalar_field_type;
    \n+
    889 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
    \n+
    890
    \n+
    \n+\n+
    897 _w(w)
    \n+
    898 {}
    \n+
    \n+
    899
    \n+
    \n+
    911 Richardson (const ParameterTree& configuration)
    \n+
    912 : Richardson(configuration.get<real_field_type>("relaxation", 1.0))
    \n+
    913 {}
    \n+
    \n+
    914
    \n+
    \n+
    920 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)
    \n+
    921 {}
    \n+
    \n+
    922
    \n+
    \n+
    928 virtual void apply (X& v, const Y& d)
    \n+
    929 {
    \n+
    930 v = d;
    \n+
    931 v *= _w;
    \n+
    932 }
    \n+
    \n
    933
    \n-
    934 // build window structure
    \n-\n-
    936 return *this;
    \n-
    937 }
    \n-
    \n-
    938
    \n-
    \n-\n-
    941 {
    \n-
    942
    \n-
    943 if (!(ready == notAllocated || ready == built))
    \n-
    944 DUNE_THROW(InvalidStateException,"Scalar assignment only works on fully built BCRSMatrix)");
    \n-
    945
    \n-
    946 for (size_type i=0; i<n; i++) r[i] = k;
    \n-
    947 return *this;
    \n-
    948 }
    \n-
    \n-
    949
    \n-
    950 //===== row-wise creation interface
    \n-
    951
    \n-
    \n-\n-
    954 {
    \n-
    955 public:
    \n-
    \n-\n-
    958 : Mat(_Mat), i(_i), nnz(0), current_row(nullptr, Mat.j_.get(), 0)
    \n-
    959 {
    \n-
    960 if (Mat.build_mode == unknown && Mat.ready == building)
    \n-
    961 {
    \n-
    962 Mat.build_mode = row_wise;
    \n-
    963 }
    \n-
    964 if (i==0 && Mat.ready != building)
    \n-
    965 DUNE_THROW(BCRSMatrixError,"creation only allowed for uninitialized matrix");
    \n-
    966 if(Mat.build_mode!=row_wise)
    \n-
    967 DUNE_THROW(BCRSMatrixError,"creation only allowed if row wise allocation was requested in the constructor");
    \n-
    968 if(i==0 && _Mat.N()==0)
    \n-
    969 // empty Matrix is always built.
    \n-
    970 Mat.ready = built;
    \n-
    971 }
    \n-
    \n-
    972
    \n-
    \n-\n-
    975 {
    \n-
    976 // this should only be called if matrix is in creation
    \n-
    977 if (Mat.ready != building)
    \n-
    978 DUNE_THROW(BCRSMatrixError,"matrix already built up");
    \n-
    979
    \n-
    980 // row i is defined through the pattern
    \n-
    981 // get memory for the row and initialize the j_ array
    \n-
    982 // this depends on the allocation mode
    \n-
    983
    \n-
    984 // compute size of the row
    \n-
    985 size_type s = pattern.size();
    \n-
    986
    \n-
    987 if(s>0) {
    \n-
    988 // update number of nonzeroes including this row
    \n-
    989 nnz += s;
    \n-
    990
    \n-
    991 // alloc memory / set window
    \n-
    992 if (Mat.nnz_ > 0)
    \n-
    993 {
    \n-
    994 // memory is allocated in one long array
    \n-
    995
    \n-
    996 // check if that memory is sufficient
    \n-
    997 if (nnz > Mat.nnz_)
    \n-
    998 DUNE_THROW(BCRSMatrixError,"allocated nnz too small");
    \n-
    999
    \n-
    1000 // set row i
    \n-
    1001 Mat.r[i].set(s,nullptr,current_row.getindexptr());
    \n-
    1002 current_row.setindexptr(current_row.getindexptr()+s);
    \n-
    1003 }else{
    \n-
    1004 // memory is allocated individually per row
    \n-
    1005 // allocate and set row i
    \n-
    1006 B* b = Mat.allocator_.allocate(s);
    \n-
    1007 // use placement new to call constructor that allocates
    \n-
    1008 // additional memory.
    \n-
    1009 new (b) B[s];
    \n-
    1010 size_type* j = Mat.sizeAllocator_.allocate(s);
    \n-
    1011 Mat.r[i].set(s,b,j);
    \n-
    1012 }
    \n-
    1013 }else
    \n-
    1014 // setup empty row
    \n-
    1015 Mat.r[i].set(0,nullptr,nullptr);
    \n-
    1016
    \n-
    1017 // initialize the j array for row i from pattern
    \n-
    1018 std::copy(pattern.cbegin(), pattern.cend(), Mat.r[i].getindexptr());
    \n-
    1019
    \n-
    1020 // now go to next row
    \n-
    1021 i++;
    \n-
    1022 pattern.clear();
    \n-
    1023
    \n-
    1024 // check if this was last row
    \n-
    1025 if (i==Mat.n)
    \n-
    1026 {
    \n-
    1027 Mat.ready = built;
    \n-
    1028 if(Mat.nnz_ > 0)
    \n-
    1029 {
    \n-
    1030 // Set nnz to the exact number of nonzero blocks inserted
    \n-
    1031 // as some methods rely on it
    \n-
    1032 Mat.nnz_ = nnz;
    \n-
    1033 // allocate data array
    \n-
    1034 Mat.allocateData();
    \n-
    1035 Mat.setDataPointers();
    \n-
    1036 }
    \n-
    1037 }
    \n-
    1038 // done
    \n-
    1039 return *this;
    \n-
    1040 }
    \n-
    \n-
    1041
    \n-
    \n-
    1043 bool operator!= (const CreateIterator& it) const
    \n-
    1044 {
    \n-
    1045 return (i!=it.i) || (&Mat!=&it.Mat);
    \n-
    1046 }
    \n-
    \n-
    1047
    \n-
    \n-
    1049 bool operator== (const CreateIterator& it) const
    \n-
    1050 {
    \n-
    1051 return (i==it.i) && (&Mat==&it.Mat);
    \n-
    1052 }
    \n-
    \n-
    1053
    \n-
    \n-\n-
    1056 {
    \n-
    1057 return i;
    \n-
    1058 }
    \n-
    \n-
    1059
    \n-
    \n-\n-
    1062 {
    \n-
    1063 pattern.insert(j);
    \n-
    1064 }
    \n-
    \n-
    1065
    \n-
    \n-\n-
    1068 {
    \n-
    1069 return pattern.find(j) != pattern.end();
    \n-
    1070 }
    \n-
    \n-
    \n-\n-
    1077 {
    \n-
    1078 return pattern.size();
    \n-
    1079 }
    \n-
    \n-
    1080
    \n-
    1081 private:
    \n-
    1082 BCRSMatrix& Mat; // the matrix we are defining
    \n-
    1083 size_type i; // current row to be defined
    \n-
    1084 size_type nnz; // count total number of nonzeros
    \n-
    1085 typedef std::set<size_type,std::less<size_type> > PatternType;
    \n-
    1086 PatternType pattern; // used to compile entries in a row
    \n-
    1087 row_type current_row; // row pointing to the current row to setup
    \n-
    1088 };
    \n+
    \n+
    939 virtual void post ([[maybe_unused]] X& x)
    \n+
    940 {}
    \n+
    \n+
    941
    \n+
    \n+\n+
    944 {
    \n+\n+
    946 }
    \n+
    \n+
    947
    \n+
    948 private:
    \n+\n+
    951 };
    \n+
    \n+
    952 DUNE_REGISTER_PRECONDITIONER("richardson", [](auto tl, const auto& /* mat */, const ParameterTree& config){
    \n+
    953 using D = typename Dune::TypeListElement<1, decltype(tl)>::type;
    \n+
    954 using R = typename Dune::TypeListElement<2, decltype(tl)>::type;
    \n+
    955 return std::make_shared<Richardson<D,R>>(config);
    \n+
    956 });
    \n+
    957
    \n+
    958
    \n+
    969 template< class M, class X, class Y >
    \n+
    \n+\n+
    971 : public Preconditioner< X, Y >
    \n+
    972 {
    \n+
    973 typedef SeqILDL< M, X, Y > This;
    \n+\n+
    975
    \n+
    976 public:
    \n+
    978 typedef std::remove_const_t< M > matrix_type;
    \n+
    980 typedef X domain_type;
    \n+
    982 typedef Y range_type;
    \n+
    984 typedef typename X::field_type field_type;
    \n+
    986 typedef Simd::Scalar<field_type> scalar_field_type;
    \n+
    988 typedef typename FieldTraits<scalar_field_type>::real_type real_field_type;
    \n+
    989
    \n+
    \n+
    1002 SeqILDL (const std::shared_ptr<const AssembledLinearOperator<M,X,Y>>& A, const ParameterTree& configuration)
    \n+
    1003 : SeqILDL(A->getmat(), configuration)
    \n+
    1004 {}
    \n+
    \n+
    1005
    \n+
    \n+
    1018 SeqILDL(const matrix_type& A, const ParameterTree& config)
    \n+
    1019 : SeqILDL(A, config.get<real_field_type>("relaxation", 1.0))
    \n+
    1020 {}
    \n+
    \n+
    1021
    \n+
    \n+
    1030 explicit SeqILDL ( const matrix_type &A, real_field_type relax = real_field_type( 1 ) )
    \n+
    1031 : decomposition_( A.N(), A.M(), matrix_type::random ),
    \n+
    1032 relax_( relax )
    \n+
    1033 {
    \n+
    1034 // setup row sizes for lower triangular matrix
    \n+
    1035 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n+
    1036 {
    \n+
    1037 const auto &A_i = *i;
    \n+
    1038 const auto ij = A_i.find( i.index() );
    \n+
    1039 if( ij != A_i.end() )
    \n+
    1040 decomposition_.setrowsize( i.index(), ij.offset()+1 );
    \n+
    1041 else
    \n+
    1042 DUNE_THROW( ISTLError, "diagonal entry missing" );
    \n+
    1043 }
    \n+
    1044 decomposition_.endrowsizes();
    \n+
    1045
    \n+
    1046 // setup row indices for lower triangular matrix
    \n+
    1047 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n+
    1048 {
    \n+
    1049 const auto &A_i = *i;
    \n+
    1050 for( auto ij = A_i.begin(); ij.index() < i.index() ; ++ij )
    \n+
    1051 decomposition_.addindex( i.index(), ij.index() );
    \n+
    1052 decomposition_.addindex( i.index(), i.index() );
    \n+
    1053 }
    \n+
    1054 decomposition_.endindices();
    \n+
    1055
    \n+
    1056 // copy values of lower triangular matrix
    \n+
    1057 auto i = A.begin();
    \n+
    1058 for( auto row = decomposition_.begin(), rowend = decomposition_.end(); row != rowend; ++row, ++i )
    \n+
    1059 {
    \n+
    1060 auto ij = i->begin();
    \n+
    1061 for( auto col = row->begin(), colend = row->end(); col != colend; ++col, ++ij )
    \n+
    1062 *col = *ij;
    \n+
    1063 }
    \n+
    1064
    \n+
    1065 // perform ILDL decomposition
    \n+
    1066 bildl_decompose( decomposition_ );
    \n+
    1067 }
    \n+
    \n+
    1068
    \n+
    \n+
    1070 void pre ([[maybe_unused]] X &x, [[maybe_unused]] Y &b) override
    \n+
    1071 {}
    \n+
    \n+
    1072
    \n+
    \n+
    1074 void apply ( X &v, const Y &d ) override
    \n+
    1075 {
    \n+
    1076 bildl_backsolve( decomposition_, v, d, true );
    \n+
    1077 v *= relax_;
    \n+
    1078 }
    \n+
    \n+
    1079
    \n+
    \n+
    1081 void post ([[maybe_unused]] X &x) override
    \n+
    1082 {}
    \n+
    \n+
    1083
    \n+\n+
    1086
    \n+
    1087 private:
    \n+
    1088 matrix_type decomposition_;
    \n+
    1089 real_field_type relax_;
    \n+
    1090 };
    \n
    \n-
    1089
    \n-
    1091 friend class CreateIterator;
    \n+
    1091 DUNE_REGISTER_PRECONDITIONER("ildl", defaultPreconditionerCreator<Dune::SeqILDL>());
    \n
    1092
    \n-
    \n-\n-
    1095 {
    \n-
    1096 return CreateIterator(*this,0);
    \n-
    1097 }
    \n-
    \n-
    1098
    \n-
    \n-\n-
    1101 {
    \n-
    1102 return CreateIterator(*this,n);
    \n-
    1103 }
    \n-
    \n-
    1104
    \n-
    1105
    \n-
    1106 //===== random creation interface
    \n-
    1107
    \n-
    \n-\n-
    1115 {
    \n-
    1116 if (build_mode!=random)
    \n-
    1117 DUNE_THROW(BCRSMatrixError,"requires random build mode");
    \n-
    1118 if (ready != building)
    \n-
    1119 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
    \n-
    1120
    \n-
    1121 r[i].setsize(s);
    \n-
    1122 }
    \n-
    \n-
    1123
    \n-
    \n-\n-
    1126 {
    \n-
    1127#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1128 if (r==0) DUNE_THROW(BCRSMatrixError,"row not initialized yet");
    \n-
    1129 if (i>=n) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1130#endif
    \n-
    1131 return r[i].getsize();
    \n-
    1132 }
    \n-
    \n-
    1133
    \n-
    \n-\n-
    1136 {
    \n-
    1137 if (build_mode!=random)
    \n-
    1138 DUNE_THROW(BCRSMatrixError,"requires random build mode");
    \n-
    1139 if (ready != building)
    \n-
    1140 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
    \n-
    1141
    \n-
    1142 r[i].setsize(r[i].getsize()+s);
    \n-
    1143 }
    \n-
    \n-
    1144
    \n-
    \n-\n-
    1147 {
    \n-
    1148 if (build_mode!=random)
    \n-
    1149 DUNE_THROW(BCRSMatrixError,"requires random build mode");
    \n-
    1150 if (ready != building)
    \n-
    1151 DUNE_THROW(BCRSMatrixError,"matrix row sizes already built up");
    \n-
    1152
    \n-
    1153 // compute total size, check positivity
    \n-
    1154 size_type total=0;
    \n-
    1155 for (size_type i=0; i<n; i++)
    \n-
    1156 {
    \n-
    1157 total += r[i].getsize();
    \n-
    1158 }
    \n-
    1159
    \n-
    1160 if(nnz_ == 0)
    \n-
    1161 // allocate/check memory
    \n-
    1162 allocate(n,m,total,false,false);
    \n-
    1163 else if(nnz_ < total)
    \n-
    1164 DUNE_THROW(BCRSMatrixError,"Specified number of nonzeros ("<<nnz_<<") not "
    \n-
    1165 <<"sufficient for calculated nonzeros ("<<total<<"! ");
    \n-
    1166
    \n-
    1167 // set the window pointers correctly
    \n-\n-
    1169
    \n-
    1170 // initialize j_ array with m (an invalid column index)
    \n-
    1171 // this indicates an unused entry
    \n-
    1172 for (size_type k=0; k<nnz_; k++)
    \n-
    1173 j_.get()[k] = m;
    \n-\n-
    1175 }
    \n-
    \n-
    1176
    \n-
    1178
    \n-
    \n-\n-
    1189 {
    \n-
    1190 if (build_mode!=random)
    \n-
    1191 DUNE_THROW(BCRSMatrixError,"requires random build mode");
    \n-
    1192 if (ready==built)
    \n-
    1193 DUNE_THROW(BCRSMatrixError,"matrix already built up");
    \n-
    1194 if (ready==building)
    \n-
    1195 DUNE_THROW(BCRSMatrixError,"matrix row sizes not built up yet");
    \n-
    1196 if (ready==notAllocated)
    \n-
    1197 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
    \n-
    1198
    \n-
    1199 if (col >= m)
    \n-
    1200 DUNE_THROW(BCRSMatrixError,"column index exceeds matrix size");
    \n-
    1201
    \n-
    1202 // get row range
    \n-
    1203 size_type* const first = r[row].getindexptr();
    \n-
    1204 size_type* const last = first + r[row].getsize();
    \n-
    1205
    \n-
    1206 // find correct insertion position for new column index
    \n-
    1207 size_type* pos = std::lower_bound(first,last,col);
    \n-
    1208
    \n-
    1209 // check if index is already in row
    \n-
    1210 if (pos!=last && *pos == col) return;
    \n-
    1211
    \n-
    1212 // find end of already inserted column indices
    \n-
    1213 size_type* end = std::lower_bound(pos,last,m);
    \n-
    1214 if (end==last)
    \n-
    1215 DUNE_THROW(BCRSMatrixError,"row is too small");
    \n-
    1216
    \n-
    1217 // insert new column index at correct position
    \n-
    1218 std::copy_backward(pos,end,end+1);
    \n-
    1219 *pos = col;
    \n-
    1220 }
    \n-
    \n-
    1221
    \n-
    1223
    \n-
    1231 template<typename It>
    \n-
    \n-\n-
    1233 {
    \n-
    1234 size_type row_size = r[row].size();
    \n-
    1235 size_type* col_begin = r[row].getindexptr();
    \n-
    1236 size_type* col_end;
    \n-
    1237 // consistency check between allocated row size and number of passed column indices
    \n-
    1238 if ((col_end = std::copy(begin,end,r[row].getindexptr())) != col_begin + row_size)
    \n-
    1239 DUNE_THROW(BCRSMatrixError,"Given size of row " << row
    \n-
    1240 << " (" << row_size
    \n-
    1241 << ") does not match number of passed entries (" << (col_end - col_begin) << ")");
    \n-
    1242 }
    \n-
    \n-
    1243
    \n-
    1244
    \n-
    1246
    \n-
    1254 template<typename It>
    \n-
    \n-
    1255 void setIndices(size_type row, It begin, It end)
    \n-
    1256 {
    \n-
    1257 size_type row_size = r[row].size();
    \n-
    1258 size_type* col_begin = r[row].getindexptr();
    \n-
    1259 size_type* col_end;
    \n-
    1260 // consistency check between allocated row size and number of passed column indices
    \n-
    1261 if ((col_end = std::copy(begin,end,r[row].getindexptr())) != col_begin + row_size)
    \n-
    1262 DUNE_THROW(BCRSMatrixError,"Given size of row " << row
    \n-
    1263 << " (" << row_size
    \n-
    1264 << ") does not match number of passed entries (" << (col_end - col_begin) << ")");
    \n-
    1265 std::sort(col_begin,col_end);
    \n-
    1266 }
    \n-
    \n-
    1267
    \n-
    \n-\n-
    1270 {
    \n-
    1271 if (build_mode!=random)
    \n-
    1272 DUNE_THROW(BCRSMatrixError,"requires random build mode");
    \n-
    1273 if (ready==built)
    \n-
    1274 DUNE_THROW(BCRSMatrixError,"matrix already built up");
    \n-
    1275 if (ready==building)
    \n-
    1276 DUNE_THROW(BCRSMatrixError,"row sizes are not built up yet");
    \n-
    1277 if (ready==notAllocated)
    \n-
    1278 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
    \n-
    1279
    \n-
    1280 // check if there are undefined indices
    \n-
    1281 RowIterator endi=end();
    \n-
    1282 for (RowIterator i=begin(); i!=endi; ++i)
    \n-
    1283 {
    \n-
    1284 ColIterator endj = (*i).end();
    \n-
    1285 for (ColIterator j=(*i).begin(); j!=endj; ++j) {
    \n-
    1286 if (j.index() >= m) {
    \n-
    1287 dwarn << "WARNING: size of row "<< i.index()<<" is "<<j.offset()<<". But was specified as being "<< (*i).end().offset()
    \n-
    1288 <<". This means you are wasting valuable space and creating additional cache misses!"<<std::endl;
    \n-
    1289 nnz_ -= ((*i).end().offset() - j.offset());
    \n-
    1290 r[i.index()].setsize(j.offset());
    \n-
    1291 break;
    \n-
    1292 }
    \n-
    1293 }
    \n-
    1294 }
    \n-
    1295
    \n-
    1296 allocateData();
    \n-\n-
    1298
    \n-
    1299 // if not, set matrix to built
    \n-
    1300 ready = built;
    \n-
    1301 }
    \n-
    \n-
    1302
    \n-
    1303 //===== implicit creation interface
    \n-
    1304
    \n-
    1306
    \n-
    \n-\n-
    1318 {
    \n-
    1319#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1320 if (build_mode!=implicit)
    \n-
    1321 DUNE_THROW(BCRSMatrixError,"requires implicit build mode");
    \n-
    1322 if (ready==built)
    \n-
    1323 DUNE_THROW(BCRSMatrixError,"matrix already built up, use operator[] for entry access now");
    \n-
    1324 if (ready==notAllocated)
    \n-
    1325 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
    \n-
    1326 if (ready!=building)
    \n-
    1327 DUNE_THROW(InvalidStateException,"You may only use entry() during the 'building' stage");
    \n-
    1328
    \n-
    1329 if (row >= n)
    \n-
    1330 DUNE_THROW(BCRSMatrixError,"row index exceeds matrix size");
    \n-
    1331 if (col >= m)
    \n-
    1332 DUNE_THROW(BCRSMatrixError,"column index exceeds matrix size");
    \n-
    1333#endif
    \n-
    1334
    \n-
    1335 size_type* begin = r[row].getindexptr();
    \n-
    1336 size_type* end = begin + r[row].getsize();
    \n-
    1337
    \n-
    1338 size_type* pos = std::find(begin, end, col);
    \n-
    1339
    \n-
    1340 //treat the case that there was a match in the array
    \n-
    1341 if (pos != end)
    \n-
    1342 if (*pos == col)
    \n-
    1343 {
    \n-
    1344 std::ptrdiff_t offset = pos - r[row].getindexptr();
    \n-
    1345 B* aptr = r[row].getptr() + offset;
    \n-
    1346
    \n-
    1347 return *aptr;
    \n-
    1348 }
    \n-
    1349
    \n-
    1350 //determine whether overflow has to be taken into account or not
    \n-
    1351 if (r[row].getsize() == avg)
    \n-
    1352 return overflow[std::make_pair(row,col)];
    \n-
    1353 else
    \n-
    1354 {
    \n-
    1355 //modify index array
    \n-
    1356 *end = col;
    \n-
    1357
    \n-
    1358 //do simultaneous operations on data array a
    \n-
    1359 std::ptrdiff_t offset = end - r[row].getindexptr();
    \n-
    1360 B* apos = r[row].getptr() + offset;
    \n-
    1361
    \n-
    1362 //increase rowsize
    \n-
    1363 r[row].setsize(r[row].getsize()+1);
    \n-
    1364
    \n-
    1365 //return reference to the newly created entry
    \n-
    1366 return *apos;
    \n-
    1367 }
    \n-
    1368 }
    \n-
    \n-
    1369
    \n-
    1371
    \n-
    \n-\n-
    1382 {
    \n-
    1383 if (build_mode!=implicit)
    \n-
    1384 DUNE_THROW(BCRSMatrixError,"requires implicit build mode");
    \n-
    1385 if (ready==built)
    \n-
    1386 DUNE_THROW(BCRSMatrixError,"matrix already built up, no more need for compression");
    \n-
    1387 if (ready==notAllocated)
    \n-
    1388 DUNE_THROW(BCRSMatrixError,"matrix size not set and no memory allocated yet");
    \n-
    1389 if (ready!=building)
    \n-
    1390 DUNE_THROW(InvalidStateException,"You may only call compress() at the end of the 'building' stage");
    \n-
    1391
    \n-
    1392 //calculate statistics
    \n-\n-
    1394 stats.overflow_total = overflow.size();
    \n-
    1395 stats.maximum = 0;
    \n-
    1396
    \n-
    1397 //get insertion iterators pointing to one before start (for later use of ++it)
    \n-
    1398 size_type* jiit = j_.get();
    \n-
    1399 B* aiit = a;
    \n-
    1400
    \n-
    1401 //get iterator to the smallest overflow element
    \n-
    1402 typename OverflowType::iterator oit = overflow.begin();
    \n-
    1403
    \n-
    1404 //store a copy of index pointers on which to perform sorting
    \n-
    1405 std::vector<size_type*> perm;
    \n-
    1406
    \n-
    1407 //iterate over all rows and copy elements into their position in the compressed array
    \n-
    1408 for (size_type i=0; i<n; i++)
    \n-
    1409 {
    \n-
    1410 //get old pointers into a and j and size without overflow changes
    \n-
    1411 size_type* begin = r[i].getindexptr();
    \n-
    1412 //B* apos = r[i].getptr();
    \n-
    1413 size_type size = r[i].getsize();
    \n-
    1414
    \n-
    1415 perm.resize(size);
    \n-
    1416
    \n-
    1417 typename std::vector<size_type*>::iterator it = perm.begin();
    \n-
    1418 for (size_type* iit = begin; iit < begin + size; ++iit, ++it)
    \n-
    1419 *it = iit;
    \n-
    1420
    \n-
    1421 //sort permutation array
    \n-
    1422 std::sort(perm.begin(),perm.end(),PointerCompare<size_type>());
    \n-
    1423
    \n-
    1424 //change row window pointer to their new positions
    \n-
    1425 r[i].setindexptr(jiit);
    \n-
    1426 r[i].setptr(aiit);
    \n-
    1427
    \n-
    1428 for (it = perm.begin(); it != perm.end(); ++it)
    \n-
    1429 {
    \n-
    1430 //check whether there are elements in the overflow area which take precedence
    \n-
    1431 while ((oit!=overflow.end()) && (oit->first < std::make_pair(i,**it)))
    \n-
    1432 {
    \n-
    1433 //check whether there is enough memory to write to
    \n-
    1434 if (jiit > begin)
    \n-\n-
    1436 "Allocated memory for BCRSMatrix exhausted during compress()!"
    \n-
    1437 "Please increase either the average number of entries per row or the compressionBufferSize value."
    \n-
    1438 );
    \n-
    1439 //copy an element from the overflow area to the insertion position in a and j
    \n-
    1440 *jiit = oit->first.second;
    \n-
    1441 ++jiit;
    \n-
    1442 *aiit = oit->second;
    \n-
    1443 ++aiit;
    \n-
    1444 ++oit;
    \n-
    1445 r[i].setsize(r[i].getsize()+1);
    \n-
    1446 }
    \n-
    1447
    \n-
    1448 //check whether there is enough memory to write to
    \n-
    1449 if (jiit > begin)
    \n-\n-
    1451 "Allocated memory for BCRSMatrix exhausted during compress()!"
    \n-
    1452 "Please increase either the average number of entries per row or the compressionBufferSize value."
    \n-
    1453 );
    \n-
    1454
    \n-
    1455 //copy element from array
    \n-
    1456 *jiit = **it;
    \n-
    1457 ++jiit;
    \n-
    1458 B* apos = *it - j_.get() + a;
    \n-
    1459 *aiit = *apos;
    \n-
    1460 ++aiit;
    \n-
    1461 }
    \n-
    1462
    \n-
    1463 //copy remaining elements from the overflow area
    \n-
    1464 while ((oit!=overflow.end()) && (oit->first.first == i))
    \n-
    1465 {
    \n-
    1466 //check whether there is enough memory to write to
    \n-
    1467 if (jiit > begin)
    \n-\n-
    1469 "Allocated memory for BCRSMatrix exhausted during compress()!"
    \n-
    1470 "Please increase either the average number of entries per row or the compressionBufferSize value."
    \n-
    1471 );
    \n-
    1472
    \n-
    1473 //copy and element from the overflow area to the insertion position in a and j
    \n-
    1474 *jiit = oit->first.second;
    \n-
    1475 ++jiit;
    \n-
    1476 *aiit = oit->second;
    \n-
    1477 ++aiit;
    \n-
    1478 ++oit;
    \n-
    1479 r[i].setsize(r[i].getsize()+1);
    \n-
    1480 }
    \n-
    1481
    \n-
    1482 // update maximum row size
    \n-
    1483 if (r[i].getsize()>stats.maximum)
    \n-
    1484 stats.maximum = r[i].getsize();
    \n-
    1485 }
    \n-
    1486
    \n-
    1487 // overflow area may be cleared
    \n-
    1488 overflow.clear();
    \n-
    1489
    \n-
    1490 //determine average number of entries and memory usage
    \n-
    1491 if ( n == 0)
    \n-
    1492 {
    \n-
    1493 stats.avg = 0;
    \n-
    1494 stats.mem_ratio = 1;
    \n-
    1495 }
    \n-
    1496 else
    \n-
    1497 {
    \n-
    1498 std::ptrdiff_t diff = (r[n-1].getindexptr() + r[n-1].getsize() - j_.get());
    \n-
    1499 nnz_ = diff;
    \n-
    1500 stats.avg = (double) (nnz_) / (double) n;
    \n-
    1501 stats.mem_ratio = (double) (nnz_) / (double) allocationSize_;
    \n-
    1502 }
    \n-
    1503
    \n-
    1504 //matrix is now built
    \n-
    1505 ready = built;
    \n-
    1506
    \n-
    1507 return stats;
    \n-
    1508 }
    \n-
    \n-
    1509
    \n-
    1510 //===== vector space arithmetic
    \n-
    1511
    \n-
    \n-\n-
    1514 {
    \n-
    1515#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1516 if (ready != built)
    \n-
    1517 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1518#endif
    \n-
    1519
    \n-
    1520 if (nnz_ > 0)
    \n-
    1521 {
    \n-
    1522 // process 1D array
    \n-
    1523 for (size_type i=0; i<nnz_; i++)
    \n-
    1524 a[i] *= k;
    \n-
    1525 }
    \n-
    1526 else
    \n-
    1527 {
    \n-
    1528 RowIterator endi=end();
    \n-
    1529 for (RowIterator i=begin(); i!=endi; ++i)
    \n-
    1530 {
    \n-
    1531 ColIterator endj = (*i).end();
    \n-
    1532 for (ColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1533 (*j) *= k;
    \n-
    1534 }
    \n-
    1535 }
    \n-
    1536
    \n-
    1537 return *this;
    \n-
    1538 }
    \n-
    \n-
    1539
    \n-
    \n-\n-
    1542 {
    \n-
    1543#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1544 if (ready != built)
    \n-
    1545 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1546#endif
    \n-
    1547
    \n-
    1548 if (nnz_ > 0)
    \n-
    1549 {
    \n-
    1550 // process 1D array
    \n-
    1551 for (size_type i=0; i<nnz_; i++)
    \n-
    1552 a[i] /= k;
    \n-
    1553 }
    \n-
    1554 else
    \n-
    1555 {
    \n-
    1556 RowIterator endi=end();
    \n-
    1557 for (RowIterator i=begin(); i!=endi; ++i)
    \n-
    1558 {
    \n-
    1559 ColIterator endj = (*i).end();
    \n-
    1560 for (ColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1561 (*j) /= k;
    \n-
    1562 }
    \n-
    1563 }
    \n-
    1564
    \n-
    1565 return *this;
    \n-
    1566 }
    \n-
    \n-
    1567
    \n-
    1568
    \n-
    \n-\n-
    1575 {
    \n-
    1576#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1577 if (ready != built || b.ready != built)
    \n-
    1578 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1579 if(N()!=b.N() || M() != b.M())
    \n-
    1580 DUNE_THROW(RangeError, "Matrix sizes do not match!");
    \n-
    1581#endif
    \n-
    1582 RowIterator endi=end();
    \n-
    1583 ConstRowIterator j=b.begin();
    \n-
    1584 for (RowIterator i=begin(); i!=endi; ++i, ++j) {
    \n-
    1585 i->operator+=(*j);
    \n-
    1586 }
    \n-
    1587
    \n-
    1588 return *this;
    \n-
    1589 }
    \n-
    \n-
    1590
    \n-
    \n-\n-
    1597 {
    \n-
    1598#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1599 if (ready != built || b.ready != built)
    \n-
    1600 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1601 if(N()!=b.N() || M() != b.M())
    \n-
    1602 DUNE_THROW(RangeError, "Matrix sizes do not match!");
    \n-
    1603#endif
    \n-
    1604 RowIterator endi=end();
    \n-
    1605 ConstRowIterator j=b.begin();
    \n-
    1606 for (RowIterator i=begin(); i!=endi; ++i, ++j) {
    \n-
    1607 i->operator-=(*j);
    \n-
    1608 }
    \n-
    1609
    \n-
    1610 return *this;
    \n-
    1611 }
    \n-
    \n-
    1612
    \n-
    \n-\n-
    1622 {
    \n-
    1623#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1624 if (ready != built || b.ready != built)
    \n-
    1625 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1626 if(N()!=b.N() || M() != b.M())
    \n-
    1627 DUNE_THROW(RangeError, "Matrix sizes do not match!");
    \n-
    1628#endif
    \n-
    1629 RowIterator endi=end();
    \n-
    1630 ConstRowIterator j=b.begin();
    \n-
    1631 for(RowIterator i=begin(); i!=endi; ++i, ++j)
    \n-
    1632 i->axpy(alpha, *j);
    \n-
    1633
    \n-
    1634 return *this;
    \n-
    1635 }
    \n-
    \n-
    1636
    \n-
    1637 //===== linear maps
    \n-
    1638
    \n-
    1640 template<class X, class Y>
    \n-
    \n-
    1641 void mv (const X& x, Y& y) const
    \n-
    1642 {
    \n-
    1643#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1644 if (ready != built)
    \n-
    1645 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1646 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,
    \n-
    1647 "Size mismatch: M: " << N() << "x" << M() << " x: " << x.N());
    \n-
    1648 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,
    \n-
    1649 "Size mismatch: M: " << N() << "x" << M() << " y: " << y.N());
    \n-
    1650#endif
    \n-
    1651 ConstRowIterator endi=end();
    \n-
    1652 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n-
    1653 {
    \n-
    1654 y[i.index()]=0;
    \n-
    1655 ConstColIterator endj = (*i).end();
    \n-
    1656 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1657 {
    \n-
    1658 auto&& xj = Impl::asVector(x[j.index()]);
    \n-
    1659 auto&& yi = Impl::asVector(y[i.index()]);
    \n-
    1660 Impl::asMatrix(*j).umv(xj, yi);
    \n-
    1661 }
    \n-
    1662 }
    \n-
    1663 }
    \n-
    \n-
    1664
    \n-
    1666 template<class X, class Y>
    \n-
    \n-
    1667 void umv (const X& x, Y& y) const
    \n-
    1668 {
    \n-
    1669#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1670 if (ready != built)
    \n-
    1671 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1672 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1673 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1674#endif
    \n-
    1675 ConstRowIterator endi=end();
    \n-
    1676 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n-
    1677 {
    \n-
    1678 ConstColIterator endj = (*i).end();
    \n-
    1679 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1680 {
    \n-
    1681 auto&& xj = Impl::asVector(x[j.index()]);
    \n-
    1682 auto&& yi = Impl::asVector(y[i.index()]);
    \n-
    1683 Impl::asMatrix(*j).umv(xj,yi);
    \n-
    1684 }
    \n-
    1685 }
    \n-
    1686 }
    \n-
    \n-
    1687
    \n-
    1689 template<class X, class Y>
    \n-
    \n-
    1690 void mmv (const X& x, Y& y) const
    \n-
    1691 {
    \n-
    1692#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1693 if (ready != built)
    \n-
    1694 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1695 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1696 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1697#endif
    \n-
    1698 ConstRowIterator endi=end();
    \n-
    1699 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n-
    1700 {
    \n-
    1701 ConstColIterator endj = (*i).end();
    \n-
    1702 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1703 {
    \n-
    1704 auto&& xj = Impl::asVector(x[j.index()]);
    \n-
    1705 auto&& yi = Impl::asVector(y[i.index()]);
    \n-
    1706 Impl::asMatrix(*j).mmv(xj,yi);
    \n-
    1707 }
    \n-
    1708 }
    \n-
    1709 }
    \n-
    \n-
    1710
    \n-
    1712 template<class X, class Y, class F>
    \n-
    \n-
    1713 void usmv (F&& alpha, const X& x, Y& y) const
    \n-
    1714 {
    \n-
    1715#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1716 if (ready != built)
    \n-
    1717 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1718 if (x.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1719 if (y.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1720#endif
    \n-
    1721 ConstRowIterator endi=end();
    \n-
    1722 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n-
    1723 {
    \n-
    1724 ConstColIterator endj = (*i).end();
    \n-
    1725 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1726 {
    \n-
    1727 auto&& xj = Impl::asVector(x[j.index()]);
    \n-
    1728 auto&& yi = Impl::asVector(y[i.index()]);
    \n-
    1729 Impl::asMatrix(*j).usmv(alpha,xj,yi);
    \n-
    1730 }
    \n-
    1731 }
    \n-
    1732 }
    \n-
    \n-
    1733
    \n-
    1735 template<class X, class Y>
    \n-
    \n-
    1736 void mtv (const X& x, Y& y) const
    \n-
    1737 {
    \n-
    1738#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1739 if (ready != built)
    \n-
    1740 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1741 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1742 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1743#endif
    \n-
    1744 for(size_type i=0; i<y.N(); ++i)
    \n-
    1745 y[i]=0;
    \n-
    1746 umtv(x,y);
    \n-
    1747 }
    \n-
    \n-
    1748
    \n-
    1750 template<class X, class Y>
    \n-
    \n-
    1751 void umtv (const X& x, Y& y) const
    \n-
    1752 {
    \n-
    1753#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1754 if (ready != built)
    \n-
    1755 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1756 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1757 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1758#endif
    \n-
    1759 ConstRowIterator endi=end();
    \n-
    1760 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n-
    1761 {
    \n-
    1762 ConstColIterator endj = (*i).end();
    \n-
    1763 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1764 {
    \n-
    1765 auto&& xi = Impl::asVector(x[i.index()]);
    \n-
    1766 auto&& yj = Impl::asVector(y[j.index()]);
    \n-
    1767 Impl::asMatrix(*j).umtv(xi,yj);
    \n-
    1768 }
    \n-
    1769 }
    \n-
    1770 }
    \n-
    \n-
    1771
    \n-
    1773 template<class X, class Y>
    \n-
    \n-
    1774 void mmtv (const X& x, Y& y) const
    \n-
    1775 {
    \n-
    1776#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1777 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1778 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1779#endif
    \n-
    1780 ConstRowIterator endi=end();
    \n-
    1781 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n-
    1782 {
    \n-
    1783 ConstColIterator endj = (*i).end();
    \n-
    1784 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1785 {
    \n-
    1786 auto&& xi = Impl::asVector(x[i.index()]);
    \n-
    1787 auto&& yj = Impl::asVector(y[j.index()]);
    \n-
    1788 Impl::asMatrix(*j).mmtv(xi,yj);
    \n-
    1789 }
    \n-
    1790 }
    \n-
    1791 }
    \n-
    \n-
    1792
    \n-
    1794 template<class X, class Y>
    \n-
    \n-
    1795 void usmtv (const field_type& alpha, const X& x, Y& y) const
    \n-
    1796 {
    \n-
    1797#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1798 if (ready != built)
    \n-
    1799 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1800 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1801 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1802#endif
    \n-
    1803 ConstRowIterator endi=end();
    \n-
    1804 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n-
    1805 {
    \n-
    1806 ConstColIterator endj = (*i).end();
    \n-
    1807 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1808 {
    \n-
    1809 auto&& xi = Impl::asVector(x[i.index()]);
    \n-
    1810 auto&& yj = Impl::asVector(y[j.index()]);
    \n-
    1811 Impl::asMatrix(*j).usmtv(alpha,xi,yj);
    \n-
    1812 }
    \n-
    1813 }
    \n-
    1814 }
    \n-
    \n-
    1815
    \n-
    1817 template<class X, class Y>
    \n-
    \n-
    1818 void umhv (const X& x, Y& y) const
    \n-
    1819 {
    \n-
    1820#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1821 if (ready != built)
    \n-
    1822 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1823 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1824 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1825#endif
    \n-
    1826 ConstRowIterator endi=end();
    \n-
    1827 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n-
    1828 {
    \n-
    1829 ConstColIterator endj = (*i).end();
    \n-
    1830 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1831 {
    \n-
    1832 auto&& xi = Impl::asVector(x[i.index()]);
    \n-
    1833 auto&& yj = Impl::asVector(y[j.index()]);
    \n-
    1834 Impl::asMatrix(*j).umhv(xi,yj);
    \n-
    1835 }
    \n-
    1836 }
    \n-
    1837 }
    \n-
    \n-
    1838
    \n-
    1840 template<class X, class Y>
    \n-
    \n-
    1841 void mmhv (const X& x, Y& y) const
    \n-
    1842 {
    \n-
    1843#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1844 if (ready != built)
    \n-
    1845 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1846 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1847 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1848#endif
    \n-
    1849 ConstRowIterator endi=end();
    \n-
    1850 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n-
    1851 {
    \n-
    1852 ConstColIterator endj = (*i).end();
    \n-
    1853 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1854 {
    \n-
    1855 auto&& xi = Impl::asVector(x[i.index()]);
    \n-
    1856 auto&& yj = Impl::asVector(y[j.index()]);
    \n-
    1857 Impl::asMatrix(*j).mmhv(xi,yj);
    \n-
    1858 }
    \n-
    1859 }
    \n-
    1860 }
    \n-
    \n-
    1861
    \n-
    1863 template<class X, class Y>
    \n-
    \n-
    1864 void usmhv (const field_type& alpha, const X& x, Y& y) const
    \n-
    1865 {
    \n-
    1866#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1867 if (ready != built)
    \n-
    1868 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1869 if (x.N()!=N()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1870 if (y.N()!=M()) DUNE_THROW(BCRSMatrixError,"index out of range");
    \n-
    1871#endif
    \n-
    1872 ConstRowIterator endi=end();
    \n-
    1873 for (ConstRowIterator i=this->begin(); i!=endi; ++i)
    \n-
    1874 {
    \n-
    1875 ConstColIterator endj = (*i).end();
    \n-
    1876 for (ConstColIterator j=(*i).begin(); j!=endj; ++j)
    \n-
    1877 {
    \n-
    1878 auto&& xi = Impl::asVector(x[i.index()]);
    \n-
    1879 auto&& yj = Impl::asVector(y[j.index()]);
    \n-
    1880 Impl::asMatrix(*j).usmhv(alpha,xi,yj);
    \n-
    1881 }
    \n-
    1882 }
    \n-
    1883 }
    \n-
    \n-
    1884
    \n-
    1885
    \n-
    1886 //===== norms
    \n-
    1887
    \n-
    \n-
    1889 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
    \n-
    1890 {
    \n-
    1891#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1892 if (ready != built)
    \n-
    1893 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1894#endif
    \n-
    1895
    \n-
    1896 typename FieldTraits<field_type>::real_type sum=0;
    \n-
    1897
    \n-
    1898 for (auto&& row : (*this))
    \n-
    1899 for (auto&& entry : row)
    \n-
    1900 sum += Impl::asMatrix(entry).frobenius_norm2();
    \n-
    1901
    \n-
    1902 return sum;
    \n-
    1903 }
    \n-
    \n-
    1904
    \n-
    \n-
    1906 typename FieldTraits<field_type>::real_type frobenius_norm () const
    \n-
    1907 {
    \n-
    1908 return sqrt(frobenius_norm2());
    \n-
    1909 }
    \n-
    \n-
    1910
    \n-
    1912 template <typename ft = field_type,
    \n-
    1913 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n-
    \n-
    1914 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n-
    1915 if (ready != built)
    \n-
    1916 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1917
    \n-
    1918 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    1919 using std::max;
    \n-
    1920
    \n-
    1921 real_type norm = 0;
    \n-
    1922 for (auto const &x : *this) {
    \n-
    1923 real_type sum = 0;
    \n-
    1924 for (auto const &y : x)
    \n-
    1925 sum += Impl::asMatrix(y).infinity_norm();
    \n-
    1926 norm = max(sum, norm);
    \n-
    1927 }
    \n-
    1928 return norm;
    \n-
    1929 }
    \n-
    \n-
    1930
    \n-
    1932 template <typename ft = field_type,
    \n-
    1933 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n-
    \n-
    1934 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n-
    1935 if (ready != built)
    \n-
    1936 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1937
    \n-
    1938 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    1939 using std::max;
    \n-
    1940
    \n-
    1941 real_type norm = 0;
    \n-
    1942 for (auto const &x : *this) {
    \n-
    1943 real_type sum = 0;
    \n-
    1944 for (auto const &y : x)
    \n-
    1945 sum += Impl::asMatrix(y).infinity_norm_real();
    \n-
    1946 norm = max(sum, norm);
    \n-
    1947 }
    \n-
    1948 return norm;
    \n-
    1949 }
    \n-
    \n-
    1950
    \n-
    1952 template <typename ft = field_type,
    \n-
    1953 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n-
    \n-
    1954 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n-
    1955 if (ready != built)
    \n-
    1956 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1957
    \n-
    1958 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    1959 using std::max;
    \n-
    1960
    \n-
    1961 real_type norm = 0;
    \n-
    1962 real_type isNaN = 1;
    \n-
    1963 for (auto const &x : *this) {
    \n-
    1964 real_type sum = 0;
    \n-
    1965 for (auto const &y : x)
    \n-
    1966 sum += Impl::asMatrix(y).infinity_norm();
    \n-
    1967 norm = max(sum, norm);
    \n-
    1968 isNaN += sum;
    \n-
    1969 }
    \n-
    1970
    \n-
    1971 return norm * (isNaN / isNaN);
    \n-
    1972 }
    \n-
    \n-
    1973
    \n-
    1975 template <typename ft = field_type,
    \n-
    1976 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n-
    \n-
    1977 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n-
    1978 if (ready != built)
    \n-
    1979 DUNE_THROW(BCRSMatrixError,"You can only call arithmetic operations on fully built BCRSMatrix instances");
    \n-
    1980
    \n-
    1981 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    1982 using std::max;
    \n-
    1983
    \n-
    1984 real_type norm = 0;
    \n-
    1985 real_type isNaN = 1;
    \n-
    1986
    \n-
    1987 for (auto const &x : *this) {
    \n-
    1988 real_type sum = 0;
    \n-
    1989 for (auto const &y : x)
    \n-
    1990 sum += Impl::asMatrix(y).infinity_norm_real();
    \n-
    1991 norm = max(sum, norm);
    \n-
    1992 isNaN += sum;
    \n-
    1993 }
    \n-
    1994
    \n-
    1995 return norm * (isNaN / isNaN);
    \n-
    1996 }
    \n-
    \n-
    1997
    \n-
    1998 //===== sizes
    \n-
    1999
    \n-
    \n-
    2001 size_type N () const
    \n-
    2002 {
    \n-
    2003 return n;
    \n-
    2004 }
    \n-
    \n-
    2005
    \n-
    \n-
    2007 size_type M () const
    \n-
    2008 {
    \n-
    2009 return m;
    \n-
    2010 }
    \n-
    \n-
    2011
    \n-
    \n-\n-
    2014 {
    \n-
    2015 // in case of row-wise allocation
    \n-
    2016 if( nnz_ <= 0 )
    \n-
    2017 nnz_ = std::accumulate( begin(), end(), size_type( 0 ), [] ( size_type s, const row_type &row ) { return s+row.getsize(); } );
    \n-
    2018 return nnz_;
    \n-
    2019 }
    \n-
    \n-
    2020
    \n-
    \n-\n-
    2023 {
    \n-
    2024 return ready;
    \n-
    2025 }
    \n-
    \n-
    2026
    \n-
    \n-\n-
    2029 {
    \n-
    2030 return build_mode;
    \n-
    2031 }
    \n-
    \n-
    2032
    \n-
    2033 //===== query
    \n-
    2034
    \n-
    \n-
    2036 bool exists (size_type i, size_type j) const
    \n-
    2037 {
    \n-
    2038#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    2039 if (i<0 || i>=n) DUNE_THROW(BCRSMatrixError,"row index out of range");
    \n-
    2040 if (j<0 || j>=m) DUNE_THROW(BCRSMatrixError,"column index out of range");
    \n-
    2041#endif
    \n-
    2042 return (r[i].size() && r[i].find(j) != r[i].end());
    \n-
    2043 }
    \n-
    \n-
    2044
    \n-
    2045
    \n-
    2046 protected:
    \n-
    2047 // state information
    \n-
    2048 BuildMode build_mode; // row wise or whole matrix
    \n-
    2049 BuildStage ready; // indicate the stage the matrix building is in
    \n-
    2050
    \n-
    2051 // The allocator used for memory management
    \n-
    2052 typename std::allocator_traits<A>::template rebind_alloc<B> allocator_;
    \n-
    2053
    \n-
    2054 typename std::allocator_traits<A>::template rebind_alloc<row_type> rowAllocator_;
    \n-
    2055
    \n-
    2056 typename std::allocator_traits<A>::template rebind_alloc<size_type> sizeAllocator_;
    \n-
    2057
    \n-
    2058 // size of the matrix
    \n-
    2059 size_type n; // number of rows
    \n-
    2060 size_type m; // number of columns
    \n-
    2061 mutable size_type nnz_; // number of nonzeroes contained in the matrix
    \n-
    2062 size_type allocationSize_; //allocated size of a and j arrays, except in implicit mode: nnz_==allocationsSize_
    \n-
    2063 // zero means that memory is allocated separately for each row.
    \n-
    2064
    \n-
    2065 // the rows are dynamically allocated
    \n-
    2066 row_type* r; // [n] the individual rows having pointers into a,j arrays
    \n-
    2067
    \n-
    2068 // dynamically allocated memory
    \n-
    2069 B* a; // [allocationSize] non-zero entries of the matrix in row-wise ordering
    \n-
    2070 // If a single array of column indices is used, it can be shared
    \n-
    2071 // between different matrices with the same sparsity pattern
    \n-
    2072 std::shared_ptr<size_type> j_; // [allocationSize] column indices of entries
    \n-
    2073
    \n-
    2074 // additional data is needed in implicit buildmode
    \n-\n-\n-
    2077
    \n-
    2078 typedef std::map<std::pair<size_type,size_type>, B> OverflowType;
    \n-\n-
    2080
    \n-
    \n-\n-
    2082 {
    \n-
    2083 row_type current_row(a,j_.get(),0); // Pointers to current row data
    \n-
    2084 for (size_type i=0; i<n; i++, ++row) {
    \n-
    2085 // set row i
    \n-
    2086 size_type s = row->getsize();
    \n-
    2087
    \n-
    2088 if (s>0) {
    \n-
    2089 // setup pointers and size
    \n-
    2090 r[i].set(s,current_row.getptr(), current_row.getindexptr());
    \n-
    2091 // update pointer for next row
    \n-
    2092 current_row.setptr(current_row.getptr()+s);
    \n-
    2093 current_row.setindexptr(current_row.getindexptr()+s);
    \n-
    2094 } else{
    \n-
    2095 // empty row
    \n-
    2096 r[i].set(0,nullptr,nullptr);
    \n-
    2097 }
    \n-
    2098 }
    \n-
    2099 }
    \n-
    \n-
    2100
    \n-
    2102
    \n-
    \n-\n-
    2107 {
    \n-
    2108 size_type* jptr = j_.get();
    \n-
    2109 for (size_type i=0; i<n; ++i, ++row) {
    \n-
    2110 // set row i
    \n-
    2111 size_type s = row->getsize();
    \n-
    2112
    \n-
    2113 if (s>0) {
    \n-
    2114 // setup pointers and size
    \n-
    2115 r[i].setsize(s);
    \n-
    2116 r[i].setindexptr(jptr);
    \n-
    2117 } else{
    \n-
    2118 // empty row
    \n-
    2119 r[i].set(0,nullptr,nullptr);
    \n-
    2120 }
    \n-
    2121
    \n-
    2122 // advance position in global array
    \n-
    2123 jptr += s;
    \n-
    2124 }
    \n-
    2125 }
    \n-
    \n-
    2126
    \n-
    2128
    \n-
    \n-\n-
    2133 {
    \n-
    2134 B* aptr = a;
    \n-
    2135 for (size_type i=0; i<n; ++i) {
    \n-
    2136 // set row i
    \n-
    2137 if (r[i].getsize() > 0) {
    \n-
    2138 // setup pointers and size
    \n-
    2139 r[i].setptr(aptr);
    \n-
    2140 } else{
    \n-
    2141 // empty row
    \n-
    2142 r[i].set(0,nullptr,nullptr);
    \n-
    2143 }
    \n-
    2144
    \n-
    2145 // advance position in global array
    \n-
    2146 aptr += r[i].getsize();
    \n-
    2147 }
    \n-
    2148 }
    \n-
    \n-
    2149
    \n-
    \n-\n-
    2152 {
    \n-
    2153 setWindowPointers(Mat.begin());
    \n-
    2154
    \n-
    2155 // copy data
    \n-
    2156 for (size_type i=0; i<n; i++) r[i] = Mat.r[i];
    \n-
    2157
    \n-
    2158 // finish off
    \n-
    2159 build_mode = row_wise; // dummy
    \n-
    2160 ready = built;
    \n-
    2161 }
    \n-
    \n-
    2162
    \n-
    \n-
    2168 void deallocate(bool deallocateRows=true)
    \n-
    2169 {
    \n-
    2170
    \n-
    2171 if (notAllocated)
    \n-
    2172 return;
    \n-
    2173
    \n-
    2174 if (allocationSize_>0)
    \n-
    2175 {
    \n-
    2176 // a,j_ have been allocated as one long vector
    \n-
    2177 j_.reset();
    \n-
    2178 if (a)
    \n-
    2179 {
    \n-
    2180 for(B *aiter=a+(allocationSize_-1), *aend=a-1; aiter!=aend; --aiter)
    \n-
    2181 std::allocator_traits<decltype(allocator_)>::destroy(allocator_, aiter);
    \n-
    2182 allocator_.deallocate(a,allocationSize_);
    \n-
    2183 a = nullptr;
    \n-
    2184 }
    \n-
    2185 }
    \n-
    2186 else if (r)
    \n-
    2187 {
    \n-
    2188 // check if memory for rows have been allocated individually
    \n-
    2189 for (size_type i=0; i<n; i++)
    \n-
    2190 if (r[i].getsize()>0)
    \n-
    2191 {
    \n-
    2192 for (B *col=r[i].getptr()+(r[i].getsize()-1),
    \n-
    2193 *colend = r[i].getptr()-1; col!=colend; --col) {
    \n-
    2194 std::allocator_traits<decltype(allocator_)>::destroy(allocator_, col);
    \n-
    2195 }
    \n-
    2196 sizeAllocator_.deallocate(r[i].getindexptr(),1);
    \n-
    2197 allocator_.deallocate(r[i].getptr(),1);
    \n-
    2198 // clear out row data in case we don't want to deallocate the rows
    \n-
    2199 // otherwise we might run into a double free problem here later
    \n-
    2200 r[i].set(0,nullptr,nullptr);
    \n-
    2201 }
    \n-
    2202 }
    \n-
    2203
    \n-
    2204 // deallocate the rows
    \n-
    2205 if (n>0 && deallocateRows && r) {
    \n-
    2206 for(row_type *riter=r+(n-1), *rend=r-1; riter!=rend; --riter)
    \n-
    2207 std::allocator_traits<decltype(rowAllocator_)>::destroy(rowAllocator_, riter);
    \n-
    2208 rowAllocator_.deallocate(r,n);
    \n-
    2209 r = nullptr;
    \n-
    2210 }
    \n-
    2211
    \n-
    2212 // Mark matrix as not built at all.
    \n-\n-
    2214
    \n-
    2215 }
    \n-
    \n-
    2216
    \n-
    \n-
    2235 void allocate(size_type rows, size_type columns, size_type allocationSize, bool allocateRows, bool allocate_data)
    \n-
    2236 {
    \n-
    2237 // Store size
    \n-
    2238 n = rows;
    \n-
    2239 m = columns;
    \n-
    2240 nnz_ = allocationSize;
    \n-
    2241 allocationSize_ = allocationSize;
    \n-
    2242
    \n-
    2243 // allocate rows
    \n-
    2244 if(allocateRows) {
    \n-
    2245 if (n>0) {
    \n-
    2246 if (r)
    \n-
    2247 DUNE_THROW(InvalidStateException,"Rows have already been allocated, cannot allocate a second time");
    \n-
    2248 r = rowAllocator_.allocate(rows);
    \n-
    2249 // initialize row entries
    \n-
    2250 for(row_type* ri=r; ri!=r+rows; ++ri)
    \n-
    2251 std::allocator_traits<decltype(rowAllocator_)>::construct(rowAllocator_, ri, row_type());
    \n-
    2252 }else{
    \n-
    2253 r = 0;
    \n-
    2254 }
    \n-
    2255 }
    \n-
    2256
    \n-
    2257 // allocate a and j_ array
    \n-
    2258 if (allocate_data)
    \n-
    2259 allocateData();
    \n-
    2260 // allocate column indices only if not yet present (enable sharing)
    \n-
    2261 if (allocationSize_>0) {
    \n-
    2262 // we copy allocator and size to the deleter since _j may outlive this class
    \n-
    2263 if (!j_.get())
    \n-
    2264 j_.reset(sizeAllocator_.allocate(allocationSize_),
    \n-
    2265 [alloc = sizeAllocator_, size = allocationSize_](auto ptr) mutable {
    \n-
    2266 alloc.deallocate(ptr, size);
    \n-
    2267 });
    \n-
    2268 }else{
    \n-
    2269 j_.reset();
    \n-
    2270 }
    \n-
    2271
    \n-
    2272 // Mark the matrix as not built.
    \n-
    2273 ready = building;
    \n-
    2274 }
    \n-
    \n-
    2275
    \n-
    \n-\n-
    2277 {
    \n-
    2278 if (a)
    \n-
    2279 DUNE_THROW(InvalidStateException,"Cannot allocate data array (already allocated)");
    \n-
    2280 if (allocationSize_>0) {
    \n-
    2281 a = allocator_.allocate(allocationSize_);
    \n-
    2282 // use placement new to call constructor that allocates
    \n-
    2283 // additional memory.
    \n-
    2284 new (a) B[allocationSize_];
    \n-
    2285 } else {
    \n-
    2286 a = nullptr;
    \n-
    2287 }
    \n-
    2288 }
    \n-
    \n-
    2289
    \n-
    \n-\n-
    2296 {
    \n-
    2297 if (build_mode != implicit)
    \n-
    2298 DUNE_THROW(InvalidStateException,"implicit_allocate() may only be called in implicit build mode");
    \n-
    2299 if (ready != notAllocated)
    \n-
    2300 DUNE_THROW(InvalidStateException,"memory has already been allocated");
    \n-
    2301
    \n-
    2302 // check to make sure the user has actually set the parameters
    \n-
    2303 if (compressionBufferSize_ < 0)
    \n-
    2304 DUNE_THROW(InvalidStateException,"You have to set the implicit build mode parameters before starting to build the matrix");
    \n-
    2305 //calculate size of overflow region, add buffer for row sort!
    \n-\n-
    2307 allocationSize_ = _n*avg + osize;
    \n-
    2308
    \n-
    2309 allocate(_n, _m, allocationSize_,true,true);
    \n-
    2310
    \n-
    2311 //set row pointers correctly
    \n-
    2312 size_type* jptr = j_.get() + osize;
    \n-
    2313 B* aptr = a + osize;
    \n-
    2314 for (size_type i=0; i<n; i++)
    \n-
    2315 {
    \n-
    2316 r[i].set(0,aptr,jptr);
    \n-
    2317 jptr = jptr + avg;
    \n-
    2318 aptr = aptr + avg;
    \n-
    2319 }
    \n-
    2320
    \n-
    2321 ready = building;
    \n-
    2322 }
    \n-
    \n-
    2323 };
    \n-
    \n-
    2324
    \n-
    2325
    \n-
    2326 template<class B, class A>
    \n-
    \n-
    2327 struct FieldTraits< BCRSMatrix<B, A> >
    \n-
    2328 {
    \n-\n-
    2330 using real_type = typename FieldTraits<field_type>::real_type;
    \n-
    2331 };
    \n-
    \n-
    2332
    \n-
    2335} // end namespace
    \n-
    2336
    \n-
    2337#endif
    \n-
    Helper functions for determining the vector/matrix block level.
    \n-\n-
    Some handy generic functions for ISTL matrices.
    \n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+
    1095} // end namespace
    \n+
    1096
    \n+
    1097
    \n+
    1098#endif
    \n+\n+
    The incomplete LU factorization kernels.
    \n+
    Incomplete LDL decomposition.
    \n+\n+\n+
    Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
    \n+
    The diagonal incomplete LU factorization kernels.
    \n+\n+
    #define DUNE_REGISTER_PRECONDITIONER(name,...)
    Definition solverregistry.hh:16
    \n+
    Define general, extensible interface for inverse operators.
    \n+
    Some handy generic functions for ISTL matrices.
    \n
    Col col
    Definition matrixmatrix.hh:351
    \n+
    void bsorb(const M &A, X &x, const Y &b, const K &w)
    SSOR step.
    Definition gsetc.hh:646
    \n+
    void dbjac(const M &A, X &x, const Y &b, const K &w)
    Jacobi step.
    Definition gsetc.hh:658
    \n+
    void bsorf(const M &A, X &x, const Y &b, const K &w)
    SOR step.
    Definition gsetc.hh:634
    \n
    Definition allocator.hh:11
    \n+
    void bildl_decompose(Matrix &A)
    compute ILDL decomposition of a symmetric matrix A
    Definition ildl.hh:88
    \n
    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
    \n-
    Definition matrixutils.hh:211
    \n-
    Statistics about compression achieved in implicit mode.
    Definition bcrsmatrix.hh:88
    \n-
    size_type overflow_total
    total number of elements written to the overflow area during construction.
    Definition bcrsmatrix.hh:94
    \n-
    size_type maximum
    maximum number of non-zeroes per row.
    Definition bcrsmatrix.hh:92
    \n-
    double avg
    average number of non-zeroes per row.
    Definition bcrsmatrix.hh:90
    \n-
    double mem_ratio
    fraction of wasted memory resulting from non-used overflow area.
    Definition bcrsmatrix.hh:99
    \n-
    A wrapper for uniform access to the BCRSMatrix during and after the build stage in implicit build mod...
    Definition bcrsmatrix.hh:117
    \n-
    Matrix::block_type block_type
    The block_type of the underlying matrix.
    Definition bcrsmatrix.hh:125
    \n-
    ImplicitMatrixBuilder(Matrix &m)
    Creates an ImplicitMatrixBuilder for matrix m.
    Definition bcrsmatrix.hh:170
    \n-
    M_ Matrix
    The underlying matrix.
    Definition bcrsmatrix.hh:122
    \n-
    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
    \n-
    size_type M() const
    The number of columns in the matrix.
    Definition bcrsmatrix.hh:217
    \n-
    Matrix::size_type size_type
    The size_type of the underlying matrix.
    Definition bcrsmatrix.hh:128
    \n-
    row_object operator[](size_type i) const
    Returns a proxy for entries in row i.
    Definition bcrsmatrix.hh:205
    \n-
    size_type N() const
    The number of rows in the matrix.
    Definition bcrsmatrix.hh:211
    \n-
    Proxy row object for entry access.
    Definition bcrsmatrix.hh:137
    \n-
    block_type & operator[](size_type j) const
    Returns entry in column j.
    Definition bcrsmatrix.hh:142
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bcrsmatrix.hh:488
    \n-
    std::allocator_traits< A >::template rebind_alloc< row_type > rowAllocator_
    Definition bcrsmatrix.hh:2054
    \n-
    bool exists(size_type i, size_type j) const
    return true if (i,j) is in pattern
    Definition bcrsmatrix.hh:2036
    \n-
    BuildStage buildStage() const
    The current build stage of the matrix.
    Definition bcrsmatrix.hh:2022
    \n-
    Iterator begin()
    Get iterator to first row.
    Definition bcrsmatrix.hh:671
    \n-
    void copyWindowStructure(const BCRSMatrix &Mat)
    Copy the window structure from another matrix.
    Definition bcrsmatrix.hh:2151
    \n-
    B & entry(size_type row, size_type col)
    Returns reference to entry (row,col) of the matrix.
    Definition bcrsmatrix.hh:1317
    \n-
    void mmhv(const X &x, Y &y) const
    y -= A^H x
    Definition bcrsmatrix.hh:1841
    \n-
    void usmhv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^H x
    Definition bcrsmatrix.hh:1864
    \n-
    void umtv(const X &x, Y &y) const
    y += A^T x
    Definition bcrsmatrix.hh:1751
    \n-
    double compressionBufferSize_
    Definition bcrsmatrix.hh:2076
    \n-
    size_type m
    Definition bcrsmatrix.hh:2060
    \n-
    RealRowIterator< const row_type > const_iterator
    The const iterator over the matrix rows.
    Definition bcrsmatrix.hh:703
    \n-
    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:2235
    \n-
    BCRSMatrix & axpy(field_type alpha, const BCRSMatrix &b)
    Add the scaled entries of another matrix to this one.
    Definition bcrsmatrix.hh:1621
    \n-
    FieldTraits< ft >::real_type infinity_norm_real() const
    simplified infinity norm (uses Manhattan norm for complex values)
    Definition bcrsmatrix.hh:1934
    \n-
    ~BCRSMatrix()
    destructor
    Definition bcrsmatrix.hh:821
    \n-
    void allocateData()
    Definition bcrsmatrix.hh:2276
    \n-
    void deallocate(bool deallocateRows=true)
    deallocate memory of the matrix.
    Definition bcrsmatrix.hh:2168
    \n-
    Iterator RowIterator
    rename the iterators for easier access
    Definition bcrsmatrix.hh:697
    \n-
    row_type & operator[](size_type i)
    random access to the rows
    Definition bcrsmatrix.hh:545
    \n-
    BCRSMatrix()
    an empty matrix
    Definition bcrsmatrix.hh:745
    \n-
    void endrowsizes()
    indicate that size of all rows is defined
    Definition bcrsmatrix.hh:1146
    \n-
    void incrementrowsize(size_type i, size_type s=1)
    increment size of row i by s (1 by default)
    Definition bcrsmatrix.hh:1135
    \n-
    void mtv(const X &x, Y &y) const
    y = A^T x
    Definition bcrsmatrix.hh:1736
    \n-
    void umhv(const X &x, Y &y) const
    y += A^H x
    Definition bcrsmatrix.hh:1818
    \n-
    size_type nonzeroes() const
    number of blocks that are stored (the number of blocks that possibly are nonzero)
    Definition bcrsmatrix.hh:2013
    \n-
    size_type allocationSize_
    Definition bcrsmatrix.hh:2062
    \n-
    ConstIterator ConstRowIterator
    rename the const row iterator for easier access
    Definition bcrsmatrix.hh:734
    \n-
    BuildStage ready
    Definition bcrsmatrix.hh:2049
    \n-
    void setIndicesNoSort(size_type row, It begin, It end)
    Set all column indices for row from the given iterator range.
    Definition bcrsmatrix.hh:1232
    \n-
    BuildMode build_mode
    Definition bcrsmatrix.hh:2048
    \n-
    void setrowsize(size_type i, size_type s)
    Set number of indices in row i to s.
    Definition bcrsmatrix.hh:1114
    \n-
    RealRowIterator< row_type > Iterator
    Definition bcrsmatrix.hh:668
    \n-
    size_type nnz_
    Definition bcrsmatrix.hh:2061
    \n-
    BCRSMatrix & operator*=(const field_type &k)
    vector space multiplication with scalar
    Definition bcrsmatrix.hh:1513
    \n-
    std::allocator_traits< A >::template rebind_alloc< size_type > sizeAllocator_
    Definition bcrsmatrix.hh:2056
    \n-
    RealRowIterator< row_type > iterator
    The iterator over the (mutable matrix rows.
    Definition bcrsmatrix.hh:667
    \n-
    void usmtv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^T x
    Definition bcrsmatrix.hh:1795
    \n-
    ConstIterator beforeBegin() const
    Definition bcrsmatrix.hh:728
    \n-
    RealRowIterator< const row_type > ConstIterator
    Definition bcrsmatrix.hh:704
    \n-
    Iterator beforeBegin()
    Definition bcrsmatrix.hh:691
    \n-
    B * a
    Definition bcrsmatrix.hh:2069
    \n-
    BuildMode
    we support two modes
    Definition bcrsmatrix.hh:506
    \n-
    @ implicit
    Build entries randomly with an educated guess for the number of entries per row.
    Definition bcrsmatrix.hh:535
    \n-
    @ unknown
    Build mode not set!
    Definition bcrsmatrix.hh:539
    \n-
    @ random
    Build entries randomly.
    Definition bcrsmatrix.hh:526
    \n-
    @ row_wise
    Build in a row-wise manner.
    Definition bcrsmatrix.hh:517
    \n-
    BCRSMatrix(size_type _n, size_type _m, size_type _nnz, BuildMode bm)
    matrix with known number of nonzeroes
    Definition bcrsmatrix.hh:752
    \n-
    Imp::CompressedBlockVectorWindow< B, size_type > row_type
    implement row_type with compressed vector
    Definition bcrsmatrix.hh:500
    \n-
    ::Dune::CompressionStatistics< size_type > CompressionStatistics
    The type for the statistics object returned by compress()
    Definition bcrsmatrix.hh:503
    \n-
    BCRSMatrix & operator-=(const BCRSMatrix &b)
    Subtract the entries of another matrix from this one.
    Definition bcrsmatrix.hh:1596
    \n-
    BCRSMatrix(const BCRSMatrix &Mat)
    copy constructor
    Definition bcrsmatrix.hh:802
    \n-
    Iterator end()
    Get iterator to one beyond last row.
    Definition bcrsmatrix.hh:677
    \n-
    row_type * r
    Definition bcrsmatrix.hh:2066
    \n-
    void setIndices(size_type row, It begin, It end)
    Set all column indices for row from the given iterator range.
    Definition bcrsmatrix.hh:1255
    \n-
    void addindex(size_type row, size_type col)
    add index (row,col) to the matrix
    Definition bcrsmatrix.hh:1188
    \n-
    std::map< std::pair< size_type, size_type >, B > OverflowType
    Definition bcrsmatrix.hh:2078
    \n-
    row_type::Iterator ColIterator
    Iterator for the entries of each row.
    Definition bcrsmatrix.hh:700
    \n-
    FieldTraits< field_type >::real_type frobenius_norm() const
    frobenius norm: sqrt(sum over squared values of entries)
    Definition bcrsmatrix.hh:1906
    \n-
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n-
    BCRSMatrix & operator/=(const field_type &k)
    vector space division by scalar
    Definition bcrsmatrix.hh:1541
    \n-
    OverflowType overflow
    Definition bcrsmatrix.hh:2079
    \n-
    BCRSMatrix & operator+=(const BCRSMatrix &b)
    Add the entries of another matrix to this one.
    Definition bcrsmatrix.hh:1574
    \n-
    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:781
    \n-
    CreateIterator createend()
    get create iterator pointing to one after the last block
    Definition bcrsmatrix.hh:1100
    \n-
    FieldTraits< field_type >::real_type frobenius_norm2() const
    square of frobenius norm, need for block recursion
    Definition bcrsmatrix.hh:1889
    \n-
    Iterator beforeEnd()
    Definition bcrsmatrix.hh:684
    \n-
    row_type::ConstIterator ConstColIterator
    Const iterator to the entries of a row.
    Definition bcrsmatrix.hh:737
    \n-
    void usmv(F &&alpha, const X &x, Y &y) const
    y += alpha A x
    Definition bcrsmatrix.hh:1713
    \n-
    size_type getrowsize(size_type i) const
    get current number of indices in row i
    Definition bcrsmatrix.hh:1125
    \n-
    size_type M() const
    number of columns (counted in blocks)
    Definition bcrsmatrix.hh:2007
    \n-
    size_type n
    Definition bcrsmatrix.hh:2059
    \n-
    CreateIterator createbegin()
    get initial create iterator
    Definition bcrsmatrix.hh:1094
    \n-
    BuildStage
    Definition bcrsmatrix.hh:469
    \n-
    @ rowSizesBuilt
    The row sizes of the matrix are known.
    Definition bcrsmatrix.hh:480
    \n-
    @ built
    The matrix structure is fully built.
    Definition bcrsmatrix.hh:482
    \n-
    @ notbuilt
    Matrix is not built at all, no memory has been allocated, build mode and size can still be set.
    Definition bcrsmatrix.hh:471
    \n-
    @ notAllocated
    Matrix is not built at all, no memory has been allocated, build mode and size can still be set.
    Definition bcrsmatrix.hh:473
    \n-
    @ building
    Matrix is currently being built, some memory has been allocated, build mode and size are fixed.
    Definition bcrsmatrix.hh:475
    \n-
    BuildMode buildMode() const
    The currently selected build mode of the matrix.
    Definition bcrsmatrix.hh:2028
    \n-
    void mmv(const X &x, Y &y) const
    y -= A x
    Definition bcrsmatrix.hh:1690
    \n-
    FieldTraits< ft >::real_type infinity_norm() const
    infinity norm (row sum norm, how to generalize for blocks?)
    Definition bcrsmatrix.hh:1914
    \n-
    void mv(const X &x, Y &y) const
    y = A x
    Definition bcrsmatrix.hh:1641
    \n-
    B block_type
    export the type representing the components
    Definition bcrsmatrix.hh:491
    \n-
    void mmtv(const X &x, Y &y) const
    y -= A^T x
    Definition bcrsmatrix.hh:1774
    \n-
    size_type avg
    Definition bcrsmatrix.hh:2075
    \n-
    void umv(const X &x, Y &y) const
    y += A x
    Definition bcrsmatrix.hh:1667
    \n-
    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:2295
    \n-
    void setImplicitBuildModeParameters(size_type _avg, double compressionBufferSize)
    Set parameters needed for creation in implicit build mode.
    Definition bcrsmatrix.hh:886
    \n-
    BCRSMatrix(size_type _n, size_type _m, BuildMode bm)
    matrix with unknown number of nonzeroes
    Definition bcrsmatrix.hh:761
    \n-
    void endindices()
    indicate that all indices are defined, check consistency
    Definition bcrsmatrix.hh:1269
    \n-
    CompressionStatistics compress()
    Finishes the buildstage in implicit mode.
    Definition bcrsmatrix.hh:1381
    \n-
    void setDataPointers()
    Set data pointers for all rows.
    Definition bcrsmatrix.hh:2132
    \n-
    std::allocator_traits< A >::template rebind_alloc< B > allocator_
    Definition bcrsmatrix.hh:2052
    \n-
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n-
    void setBuildMode(BuildMode bm)
    Sets the build mode of the matrix.
    Definition bcrsmatrix.hh:830
    \n-
    void setSize(size_type rows, size_type columns, size_type nnz=0)
    Set the size of the matrix.
    Definition bcrsmatrix.hh:858
    \n-
    std::shared_ptr< size_type > j_
    Definition bcrsmatrix.hh:2072
    \n-
    void setWindowPointers(ConstRowIterator row)
    Definition bcrsmatrix.hh:2081
    \n-
    BCRSMatrix & operator=(const BCRSMatrix &Mat)
    assignment
    Definition bcrsmatrix.hh:908
    \n-
    void setColumnPointers(ConstRowIterator row)
    Copy row sizes from iterator range starting at row and set column index pointers for all rows.
    Definition bcrsmatrix.hh:2106
    \n-
    ConstIterator end() const
    Get const iterator to one beyond last row.
    Definition bcrsmatrix.hh:714
    \n-
    ConstIterator begin() const
    Get const iterator to first row.
    Definition bcrsmatrix.hh:708
    \n-
    A allocator_type
    export the allocator type
    Definition bcrsmatrix.hh:494
    \n-
    ConstIterator beforeEnd() const
    Definition bcrsmatrix.hh:721
    \n-
    Iterator access to matrix rows
    Definition bcrsmatrix.hh:575
    \n-
    RealRowIterator()
    empty constructor, use with care!
    Definition bcrsmatrix.hh:592
    \n-
    bool equals(const RealRowIterator< ValueType > &other) const
    equality
    Definition bcrsmatrix.hh:620
    \n-
    std::remove_const< T >::type ValueType
    The unqualified value type.
    Definition bcrsmatrix.hh:579
    \n-
    RealRowIterator(const RealRowIterator< ValueType > &it)
    Definition bcrsmatrix.hh:596
    \n-
    bool equals(const RealRowIterator< const ValueType > &other) const
    equality
    Definition bcrsmatrix.hh:627
    \n-
    RealRowIterator(row_type *_p, size_type _i)
    constructor
    Definition bcrsmatrix.hh:587
    \n-
    std::ptrdiff_t distanceTo(const RealRowIterator< const ValueType > &other) const
    Definition bcrsmatrix.hh:613
    \n-
    size_type index() const
    return index
    Definition bcrsmatrix.hh:602
    \n-
    std::ptrdiff_t distanceTo(const RealRowIterator< ValueType > &other) const
    Definition bcrsmatrix.hh:607
    \n-
    Iterator class for sequential creation of blocks
    Definition bcrsmatrix.hh:954
    \n-
    bool operator==(const CreateIterator &it) const
    equality
    Definition bcrsmatrix.hh:1049
    \n-
    CreateIterator & operator++()
    prefix increment
    Definition bcrsmatrix.hh:974
    \n-
    size_type index() const
    The number of the row that the iterator currently points to.
    Definition bcrsmatrix.hh:1055
    \n-
    bool operator!=(const CreateIterator &it) const
    inequality
    Definition bcrsmatrix.hh:1043
    \n-
    CreateIterator(BCRSMatrix &_Mat, size_type _i)
    constructor
    Definition bcrsmatrix.hh:957
    \n-
    void insert(size_type j)
    put column index in row
    Definition bcrsmatrix.hh:1061
    \n-
    bool contains(size_type j)
    return true if column index is in row
    Definition bcrsmatrix.hh:1067
    \n-
    size_type size() const
    Get the current row size.
    Definition bcrsmatrix.hh:1076
    \n-
    typename BCRSMatrix< B, A >::field_type field_type
    Definition bcrsmatrix.hh:2329
    \n-
    typename FieldTraits< field_type >::real_type real_type
    Definition bcrsmatrix.hh:2330
    \n-
    Error specific to BCRSMatrix.
    Definition istlexception.hh:24
    \n-
    Thrown when the compression buffer used by the implicit BCRSMatrix construction is exhausted.
    Definition istlexception.hh:37
    \n-
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n-
    A::size_type size_type
    Type for indices and sizes.
    Definition matrix.hh:577
    \n-
    T block_type
    Export the type representing the components.
    Definition matrix.hh:568
    \n-
    Definition matrixutils.hh:538
    \n+
    void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool isLowerTriangular=false)
    Definition ildl.hh:149
    \n+
    void blockDILUDecomposition(M &A, std::vector< typename M::block_type > &Dinv_)
    Definition dilu.hh:51
    \n+
    void blockDILUBacksolve(const M &A, const std::vector< typename M::block_type > Dinv_, X &v, const Y &d)
    Definition dilu.hh:107
    \n+
    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
    \n+
    void blockILUBacksolve(const M &A, X &v, const Y &d)
    LU backsolve with stored inverse.
    Definition ilu.hh:94
    \n+
    void blockILU0Decomposition(M &A)
    compute ILU decomposition of A. A is overwritten by its decomposition
    Definition ilu.hh:33
    \n+
    void blockILUDecomposition(const M &A, int n, M &ILU)
    Definition ilu.hh:167
    \n+
    compile-time parameter for block recursion depth
    Definition gsetc.hh:45
    \n+
    a simple compressed row storage matrix class
    Definition ilu.hh:259
    \n+
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    static void check(const Matrix &mat)
    Check whether the a matrix has diagonal values on blocklevel recursion levels.
    Definition matrixutils.hh:53
    \n+
    A linear operator exporting itself in matrix form.
    Definition operators.hh:111
    \n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    Turns an InverseOperator into a Preconditioner.
    Definition preconditioners.hh:76
    \n+
    O::range_type range_type
    The range type of the preconditioner.
    Definition preconditioners.hh:81
    \n+
    O::domain_type domain_type
    The domain type of the preconditioner.
    Definition preconditioners.hh:79
    \n+
    virtual void post(domain_type &)
    Clean up.
    Definition preconditioners.hh:112
    \n+
    range_type::field_type field_type
    The field type of the preconditioner.
    Definition preconditioners.hh:83
    \n+
    FieldTraits< scalar_field_type >::real_type real_field_type
    real scalar type underlying the field_type
    Definition preconditioners.hh:87
    \n+
    Simd::Scalar< field_type > scalar_field_type
    scalar type underlying the field_type
    Definition preconditioners.hh:85
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition preconditioners.hh:116
    \n+
    virtual void pre(domain_type &, range_type &)
    Prepare the preconditioner.
    Definition preconditioners.hh:102
    \n+
    InverseOperator2Preconditioner(InverseOperator &inverse_operator)
    Construct the preconditioner from the solver.
    Definition preconditioners.hh:95
    \n+
    O InverseOperator
    type of the wrapped inverse operator
    Definition preconditioners.hh:89
    \n+
    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:105
    \n+
    Sequential SSOR preconditioner.
    Definition preconditioners.hh:142
    \n+
    virtual void post(X &x)
    Clean up.
    Definition preconditioners.hh:230
    \n+
    SeqSSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
    Constructor.
    Definition preconditioners.hh:183
    \n+
    SeqSSOR(const M &A, const ParameterTree &configuration)
    Constructor.
    Definition preconditioners.hh:200
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition preconditioners.hh:234
    \n+
    X::field_type field_type
    The field type of the preconditioner.
    Definition preconditioners.hh:151
    \n+
    Simd::Scalar< field_type > scalar_field_type
    scalar type underlying the field_type
    Definition preconditioners.hh:153
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition preconditioners.hh:147
    \n+
    M matrix_type
    The matrix type the preconditioner is for.
    Definition preconditioners.hh:145
    \n+
    virtual void apply(X &v, const Y &d)
    Apply the preconditioner.
    Definition preconditioners.hh:217
    \n+
    virtual void pre(X &x, Y &b)
    Prepare the preconditioner.
    Definition preconditioners.hh:209
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition preconditioners.hh:149
    \n+
    FieldTraits< scalar_field_type >::real_type real_field_type
    real scalar type underlying the field_type
    Definition preconditioners.hh:155
    \n+
    SeqSSOR(const M &A, int n, real_field_type w)
    Constructor.
    Definition preconditioners.hh:164
    \n+
    Sequential SOR preconditioner.
    Definition preconditioners.hh:262
    \n+
    SeqSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
    Constructor.
    Definition preconditioners.hh:303
    \n+
    M matrix_type
    The matrix type the preconditioner is for.
    Definition preconditioners.hh:265
    \n+
    FieldTraits< scalar_field_type >::real_type real_field_type
    real scalar type underlying the field_type
    Definition preconditioners.hh:275
    \n+
    void apply(X &v, const Y &d)
    Apply the preconditioner in a special direction.
    Definition preconditioners.hh:351
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition preconditioners.hh:267
    \n+
    virtual void post(X &x)
    Clean up.
    Definition preconditioners.hh:368
    \n+
    virtual void pre(X &x, Y &b)
    Prepare the preconditioner.
    Definition preconditioners.hh:329
    \n+
    Simd::Scalar< field_type > scalar_field_type
    scalar type underlying the field_type
    Definition preconditioners.hh:273
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition preconditioners.hh:372
    \n+
    virtual void apply(X &v, const Y &d)
    Apply the preconditioner.
    Definition preconditioners.hh:337
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition preconditioners.hh:269
    \n+
    SeqSOR(const M &A, const ParameterTree &configuration)
    Constructor.
    Definition preconditioners.hh:320
    \n+
    X::field_type field_type
    The field type of the preconditioner.
    Definition preconditioners.hh:271
    \n+
    SeqSOR(const M &A, int n, real_field_type w)
    Constructor.
    Definition preconditioners.hh:284
    \n+
    The sequential jacobian preconditioner.
    Definition preconditioners.hh:413
    \n+
    virtual void post(X &x)
    Clean up.
    Definition preconditioners.hh:500
    \n+
    SeqJac(const M &A, const ParameterTree &configuration)
    Constructor.
    Definition preconditioners.hh:471
    \n+
    virtual void apply(X &v, const Y &d)
    Apply the preconditioner.
    Definition preconditioners.hh:488
    \n+
    M matrix_type
    The matrix type the preconditioner is for.
    Definition preconditioners.hh:416
    \n+
    Simd::Scalar< field_type > scalar_field_type
    scalar type underlying the field_type
    Definition preconditioners.hh:424
    \n+
    SeqJac(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
    Constructor.
    Definition preconditioners.hh:454
    \n+
    X::field_type field_type
    The field type of the preconditioner.
    Definition preconditioners.hh:422
    \n+
    virtual void pre(X &x, Y &b)
    Prepare the preconditioner.
    Definition preconditioners.hh:480
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition preconditioners.hh:418
    \n+
    FieldTraits< scalar_field_type >::real_type real_field_type
    real scalar type underlying the field_type
    Definition preconditioners.hh:426
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition preconditioners.hh:504
    \n+
    SeqJac(const M &A, int n, real_field_type w)
    Constructor.
    Definition preconditioners.hh:435
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition preconditioners.hh:420
    \n+
    Sequential DILU preconditioner.
    Definition preconditioners.hh:564
    \n+
    const bool wNotIdentity_
    true if w != 1.0
    Definition preconditioners.hh:681
    \n+
    typename X::field_type field_type
    The field type of the preconditioner.
    Definition preconditioners.hh:576
    \n+
    const real_field_type _w
    The relaxation factor to use.
    Definition preconditioners.hh:679
    \n+
    const M & _A_
    The matrix we operate on.
    Definition preconditioners.hh:677
    \n+
    SeqDILU(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
    Constructor.
    Definition preconditioners.hh:612
    \n+
    Simd::Scalar< field_type > scalar_field_type
    scalar type underlying the field_type
    Definition preconditioners.hh:579
    \n+
    virtual void post(X &x)
    Clean up.
    Definition preconditioners.hh:664
    \n+
    typename FieldTraits< scalar_field_type >::real_type real_field_type
    real scalar type underlying the field_type
    Definition preconditioners.hh:581
    \n+
    M matrix_type
    The matrix type the preconditioner is for.
    Definition preconditioners.hh:567
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition preconditioners.hh:571
    \n+
    typename matrix_type::block_type block_type
    block type of matrix
    Definition preconditioners.hh:569
    \n+
    virtual void apply(X &v, const Y &d)
    Apply the preconditioner.
    Definition preconditioners.hh:648
    \n+
    virtual void pre(X &x, Y &b)
    Prepare the preconditioner.
    Definition preconditioners.hh:639
    \n+
    SeqDILU(const M &A, real_field_type w)
    Constructor.
    Definition preconditioners.hh:589
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition preconditioners.hh:669
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition preconditioners.hh:573
    \n+
    SeqDILU(const M &A, const ParameterTree &config)
    Constructor.
    Definition preconditioners.hh:629
    \n+
    std::vector< block_type > Dinv_
    Definition preconditioners.hh:675
    \n+
    Sequential ILU preconditioner.
    Definition preconditioners.hh:697
    \n+
    virtual void post(X &x)
    Clean up.
    Definition preconditioners.hh:843
    \n+
    SeqILU(const M &A, int n, real_field_type w, const bool resort=false)
    Constructor.
    Definition preconditioners.hh:777
    \n+
    virtual void pre(X &x, Y &b)
    Prepare the preconditioner.
    Definition preconditioners.hh:813
    \n+
    virtual void apply(X &v, const Y &d)
    Apply the preconditioner.
    Definition preconditioners.hh:821
    \n+
    ILU::CRS< block_type, typename M::allocator_type > CRS
    type of ILU storage
    Definition preconditioners.hh:717
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition preconditioners.hh:706
    \n+
    CRS lower_
    The ILU(n) decomposition of the matrix. As storage a CRS structure is used.
    Definition preconditioners.hh:857
    \n+
    const bool wNotIdentity_
    true if w != 1.0
    Definition preconditioners.hh:864
    \n+
    SeqILU(const M &A, const ParameterTree &config)
    Constructor.
    Definition preconditioners.hh:763
    \n+
    std::remove_const< M >::type matrix_type
    The matrix type the preconditioner is for.
    Definition preconditioners.hh:700
    \n+
    matrix_type::block_type block_type
    block type of matrix
    Definition preconditioners.hh:702
    \n+
    FieldTraits< scalar_field_type >::real_type real_field_type
    real scalar type underlying the field_type
    Definition preconditioners.hh:714
    \n+
    X::field_type field_type
    The field type of the preconditioner.
    Definition preconditioners.hh:709
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition preconditioners.hh:847
    \n+
    SeqILU(const M &A, real_field_type w, const bool resort=false)
    Constructor.
    Definition preconditioners.hh:726
    \n+
    const real_field_type w_
    The relaxation factor to use.
    Definition preconditioners.hh:862
    \n+
    SeqILU(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
    Constructor.
    Definition preconditioners.hh:745
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition preconditioners.hh:704
    \n+
    std::vector< block_type, typename matrix_type::allocator_type > inv_
    Definition preconditioners.hh:859
    \n+
    Simd::Scalar< field_type > scalar_field_type
    scalar type underlying the field_type
    Definition preconditioners.hh:712
    \n+
    std::unique_ptr< matrix_type > ILU_
    The ILU(n) decomposition of the matrix. As storage a BCRSMatrix is used.
    Definition preconditioners.hh:854
    \n+
    CRS upper_
    Definition preconditioners.hh:858
    \n+
    Richardson preconditioner.
    Definition preconditioners.hh:878
    \n+
    X::field_type field_type
    The field type of the preconditioner.
    Definition preconditioners.hh:885
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition preconditioners.hh:943
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition preconditioners.hh:883
    \n+
    virtual void pre(X &x, Y &b)
    Prepare the preconditioner.
    Definition preconditioners.hh:920
    \n+
    Richardson(real_field_type w=1.0)
    Constructor.
    Definition preconditioners.hh:896
    \n+
    virtual void post(X &x)
    Clean up.
    Definition preconditioners.hh:939
    \n+
    FieldTraits< scalar_field_type >::real_type real_field_type
    real scalar type underlying the field_type
    Definition preconditioners.hh:889
    \n+
    Simd::Scalar< field_type > scalar_field_type
    scalar type underlying the field_type
    Definition preconditioners.hh:887
    \n+
    Richardson(const ParameterTree &configuration)
    Constructor.
    Definition preconditioners.hh:911
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition preconditioners.hh:881
    \n+
    virtual void apply(X &v, const Y &d)
    Apply the precondioner.
    Definition preconditioners.hh:928
    \n+
    sequential ILDL preconditioner
    Definition preconditioners.hh:972
    \n+
    SeqILDL(const matrix_type &A, const ParameterTree &config)
    Constructor.
    Definition preconditioners.hh:1018
    \n+
    SeqILDL(const matrix_type &A, real_field_type relax=real_field_type(1))
    constructor
    Definition preconditioners.hh:1030
    \n+
    X domain_type
    domain type of the preconditioner
    Definition preconditioners.hh:980
    \n+
    void post(X &x) override
    Clean up.
    Definition preconditioners.hh:1081
    \n+
    Y range_type
    range type of the preconditioner
    Definition preconditioners.hh:982
    \n+
    std::remove_const_t< M > matrix_type
    type of matrix the preconditioner is for
    Definition preconditioners.hh:978
    \n+
    void apply(X &v, const Y &d) override
    Apply one step of the preconditioner to the system A(v)=d.
    Definition preconditioners.hh:1074
    \n+
    FieldTraits< scalar_field_type >::real_type real_field_type
    real scalar type underlying the field_type
    Definition preconditioners.hh:988
    \n+
    SeqILDL(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A, const ParameterTree &configuration)
    Constructor.
    Definition preconditioners.hh:1002
    \n+
    void pre(X &x, Y &b) override
    Prepare the preconditioner.
    Definition preconditioners.hh:1070
    \n+
    Simd::Scalar< field_type > scalar_field_type
    scalar type underlying the field_type
    Definition preconditioners.hh:986
    \n+
    X::field_type field_type
    field type of the preconditioner
    Definition preconditioners.hh:984
    \n+
    SolverCategory::Category category() const override
    Category of the preconditioner (see SolverCategory::Category)
    Definition preconditioners.hh:1085
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    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
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,2409 +1,1171 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-bcrsmatrix.hh\n+preconditioners.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5\n-6#ifndef DUNE_ISTL_BCRSMATRIX_HH\n-7#define DUNE_ISTL_BCRSMATRIX_HH\n-8\n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15#include \n-16#include \n-17#include \n-18\n-19#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-20#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-21#include \"_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\"\n-22#include \n-23#include \n-24#include \n-25#include \n-26#include \n-27#include \n+5#ifndef DUNE_ISTL_PRECONDITIONERS_HH\n+6#define DUNE_ISTL_PRECONDITIONERS_HH\n+7\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14\n+15#include \n+16#include \n+17\n+18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh>\n+19#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\"\n+20#include \"_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\"\n+21#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n+22#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+23#include \"_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\"\n+24#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n+25#include \"_\bd_\bi_\bl_\bu_\b._\bh_\bh\"\n+26#include \"_\bi_\bl_\bd_\bl_\b._\bh_\bh\"\n+27#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n 28\n-29#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n-30\n-35namespace _\bD_\bu_\bn_\be {\n-36\n-76 template\n-77 struct MatrixDimension;\n-78\n-80\n-86 template\n-_\b8_\b7 struct _\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs\n-88 {\n-_\b9_\b0 double _\ba_\bv_\bg;\n-_\b9_\b2 size_type _\bm_\ba_\bx_\bi_\bm_\bu_\bm;\n-_\b9_\b4 size_type _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw_\b__\bt_\bo_\bt_\ba_\bl;\n-96\n-_\b9_\b9 double _\bm_\be_\bm_\b__\br_\ba_\bt_\bi_\bo;\n-100 };\n+29\n+30namespace _\bD_\bu_\bn_\be {\n+73 template\n+_\b7_\b4 class _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br :\n+75 public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+76 {\n+77 public:\n+_\b7_\b9 typedef typename O::domain_type _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b8_\b1 typedef typename O::range_type _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b8_\b3 typedef typename range_type::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b8_\b5 typedef Simd::Scalar _\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b8_\b7 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b8_\b9 typedef O _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n+90\n+_\b9_\b5 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br(_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br& inverse_operator)\n+96 : inverse_operator_(inverse_operator)\n+97 {\n+98 if(c != -1 && _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(inverse_operator_) != c)\n+99 DUNE_THROW(InvalidStateException, \"User-supplied solver category does not\n+match that of the given inverse operator\");\n+100 }\n 101\n-103\n-115 template\n-_\b1_\b1_\b6 class _\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br\n+_\b1_\b0_\b2 virtual void _\bp_\br_\be(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be&,_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be&)\n+103 {}\n+104\n+_\b1_\b0_\b5 virtual void _\ba_\bp_\bp_\bl_\by(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& v, const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& d)\n+106 {\n+107 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt res;\n+108 _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be copy(d);\n+109 inverse_operator_.apply(v, copy, res);\n+110 }\n+111\n+_\b1_\b1_\b2 virtual void _\bp_\bo_\bs_\bt(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be&)\n+113 {}\n+114\n+_\b1_\b1_\b6 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n 117 {\n-118\n-119 public:\n+118 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(inverse_operator_);\n+119 }\n 120\n-_\b1_\b2_\b2 typedef M_ _\bM_\ba_\bt_\br_\bi_\bx;\n-123\n-_\b1_\b2_\b5 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-126\n-_\b1_\b2_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+121 private:\n+122 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br& inverse_operator_;\n+123 };\n+124\n+125 //=====================================================================\n+126 // Implementation of this interface for sequential ISTL-preconditioners\n+127 //=====================================================================\n+128\n 129\n-131\n-_\b1_\b3_\b6 class _\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt\n-137 {\n-138\n-139 public:\n-140\n-_\b1_\b4_\b2 _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j) const\n-143 {\n-144 return _m.entry(_i,j);\n-145 }\n-146\n-147#ifndef DOXYGEN\n-148\n-149 _\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt(_\bM_\ba_\bt_\br_\bi_\bx& m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-150 : _m(m)\n-151 , _i(i)\n-152 {}\n-153\n-154#endif\n-155\n-156 private:\n-157\n-158 _\bM_\ba_\bt_\br_\bi_\bx& _m;\n-_\b1_\b5_\b9 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _i;\n-160\n-161 };\n-162\n-164\n-_\b1_\b7_\b0 _\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br(_\bM_\ba_\bt_\br_\bi_\bx& m)\n-171 : _m(m)\n-172 {\n-173 if (m.buildMode() != Matrix::implicit)\n-174 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only create an ImplicitBuilder for a\n-matrix in implicit build mode\");\n-175 if (m.buildStage() != Matrix::building)\n-176 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only create an ImplicitBuilder for a\n-matrix with set size that has not been compressed() yet\");\n-177 }\n-178\n-180\n-_\b1_\b9_\b4 _\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br(_\bM_\ba_\bt_\br_\bi_\bx& m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be cols, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-avg_cols_per_row, double overflow_fraction)\n-195 : _m(m)\n-196 {\n-197 if (m.buildStage() != Matrix::notAllocated)\n-198 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only set up a matrix for this\n-ImplicitBuilder if it has no memory allocated yet\");\n-199 m.setBuildMode(Matrix::implicit);\n-200 m.setImplicitBuildModeParameters(avg_cols_per_row,overflow_fraction);\n-201 m.setSize(rows,cols);\n-202 }\n+141 template\n+_\b1_\b4_\b2 class _\bS_\be_\bq_\bS_\bS_\bO_\bR : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n+143 public:\n+_\b1_\b4_\b5 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b1_\b4_\b7 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b1_\b4_\b9 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b1_\b5_\b1 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b1_\b5_\b3 typedef Simd::Scalar _\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b1_\b5_\b5 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+156\n+_\b1_\b6_\b4 _\bS_\be_\bq_\bS_\bS_\bO_\bR (const M& A, int n, _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be w)\n+165 : _A_(A), _n(n), _w(w)\n+166 {\n+167 _\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\bM_\b,_\bl_\b>_\b:_\b:_\bc_\bh_\be_\bc_\bk(_A_);\n+168 }\n+169\n+_\b1_\b8_\b3 _\bS_\be_\bq_\bS_\bS_\bO_\bR (const std::shared_ptr>& A,\n+const ParameterTree& configuration)\n+184 : _\bS_\be_\bq_\bS_\bS_\bO_\bR(A->getmat(), configuration)\n+185 {}\n+186\n+_\b2_\b0_\b0 _\bS_\be_\bq_\bS_\bS_\bO_\bR (const M& A, const ParameterTree& configuration)\n+201 : _\bS_\be_\bq_\bS_\bS_\bO_\bR(A, configuration._\bg_\be_\bt(\"iterations\",1),\n+configuration._\bg_\be_\bt<_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>(\"relaxation\",1.0))\n+202 {}\n 203\n-_\b2_\b0_\b5 _\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-206 {\n-207 return _\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt(_m,i);\n-208 }\n-209\n-_\b2_\b1_\b1 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN() const\n-212 {\n-213 return _m.N();\n-214 }\n-215\n-_\b2_\b1_\b7 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bM() const\n+_\b2_\b0_\b9 virtual void _\bp_\br_\be ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)\n+210 {}\n+211\n+_\b2_\b1_\b7 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n 218 {\n-219 return _m.M();\n-220 }\n-221\n-222 private:\n-223\n-224 _\bM_\ba_\bt_\br_\bi_\bx& _m;\n-225\n-226 };\n-227\n-464 template >\n-_\b4_\b6_\b5 class _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-466 {\n-467 friend struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx>;\n-468 public:\n-_\b4_\b6_\b9 enum _\bB_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be {\n-_\b4_\b7_\b1 _\bn_\bo_\bt_\bb_\bu_\bi_\bl_\bt=0,\n-_\b4_\b7_\b3 _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd=0,\n-_\b4_\b7_\b5 _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg=1,\n-_\b4_\b8_\b0 _\br_\bo_\bw_\bS_\bi_\bz_\be_\bs_\bB_\bu_\bi_\bl_\bt=2,\n-482 _\bb_\bu_\bi_\bl_\bt=3\n-_\b4_\b8_\b3 };\n-484\n-485 //===== type definitions and constants\n-486\n-_\b4_\b8_\b8 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n-489\n-_\b4_\b9_\b1 typedef B _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-492\n-_\b4_\b9_\b4 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n-495\n-_\b4_\b9_\b7 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-498\n-_\b5_\b0_\b0 typedef Imp::CompressedBlockVectorWindow _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n-501\n-_\b5_\b0_\b3 typedef ::Dune::CompressionStatistics _\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs;\n-504\n-_\b5_\b0_\b6 enum _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be {\n-_\b5_\b1_\b7 _\br_\bo_\bw_\b__\bw_\bi_\bs_\be,\n-_\b5_\b2_\b6 _\br_\ba_\bn_\bd_\bo_\bm,\n-_\b5_\b3_\b5 _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt,\n-539 _\bu_\bn_\bk_\bn_\bo_\bw_\bn\n-_\b5_\b4_\b0 };\n-541\n-542 //===== random access interface to rows of the matrix\n-543\n-_\b5_\b4_\b5 _\br_\bo_\bw_\b__\bt_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-546 {\n-547#ifdef DUNE_ISTL_WITH_CHECKING\n-548 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt && _\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-549 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You cannot use operator[] in implicit build\n-mode before calling compress()\");\n-550 if (_\br==0) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row not initialized yet\");\n-551 if (i>=_\bn) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-552#endif\n-553 return _\br[i];\n-554 }\n-555\n-_\b5_\b5_\b7 const _\br_\bo_\bw_\b__\bt_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-558 {\n-559#ifdef DUNE_ISTL_WITH_CHECKING\n-560 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt && _\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-561 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You cannot use operator[] in implicit build\n-mode before calling compress()\");\n-562 if (_\bb_\bu_\bi_\bl_\bt!=_\br_\be_\ba_\bd_\by) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row not initialized yet\");\n-563 if (i>=_\bn) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-564#endif\n-565 return _\br[i];\n-566 }\n-567\n-568\n-569 //===== iterator interface to rows of the matrix\n-570\n-572 template\n-_\b5_\b7_\b3 class _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-574 : public RandomAccessIteratorFacade, T>\n-575 {\n-576\n-577 public:\n-_\b5_\b7_\b9 typedef typename std::remove_const::type _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be;\n-580\n-581 friend class RandomAccessIteratorFacade<_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br,\n-const _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be>;\n-582 friend class RandomAccessIteratorFacade<_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br<_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be>,\n-_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be>;\n-583 friend class _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-584 friend class _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br<_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be>;\n-585\n-_\b5_\b8_\b7 _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br (_\br_\bo_\bw_\b__\bt_\by_\bp_\be* _p, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _i)\n-588 : p(_p), i(_i)\n-589 {}\n-590\n-_\b5_\b9_\b2 _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ()\n-593 : p(0), i(0)\n-594 {}\n-595\n-_\b5_\b9_\b6 _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b>& it)\n-597 : p(it.p), i(it.i)\n-598 {}\n+219 for (int i=0; i<_n; i++) {\n+220 _\bb_\bs_\bo_\br_\bf(_A_,v,d,_w,_\bB_\bL_\b<_\bl_\b>());\n+221 _\bb_\bs_\bo_\br_\bb(_A_,v,d,_w,_\bB_\bL_\b<_\bl_\b>());\n+222 }\n+223 }\n+224\n+_\b2_\b3_\b0 virtual void _\bp_\bo_\bs_\bt ([[maybe_unused]] X& x)\n+231 {}\n+232\n+_\b2_\b3_\b4 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+235 {\n+236 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+237 }\n+238\n+239 private:\n+241 const M& _A_;\n+243 int _n;\n+245 _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _w;\n+246 };\n+_\b2_\b4_\b7 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(\"ssor\",\n+defaultPreconditionerBlockLevelCreator());\n+248\n+249\n+261 template\n+_\b2_\b6_\b2 class _\bS_\be_\bq_\bS_\bO_\bR : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n+263 public:\n+_\b2_\b6_\b5 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b2_\b6_\b7 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b2_\b6_\b9 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b2_\b7_\b1 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b2_\b7_\b3 typedef Simd::Scalar _\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b2_\b7_\b5 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+276\n+_\b2_\b8_\b4 _\bS_\be_\bq_\bS_\bO_\bR (const M& A, int n, _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be w)\n+285 : _A_(A), _n(n), _w(w)\n+286 {\n+287 _\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\bM_\b,_\bl_\b>_\b:_\b:_\bc_\bh_\be_\bc_\bk(_A_);\n+288 }\n+289\n+_\b3_\b0_\b3 _\bS_\be_\bq_\bS_\bO_\bR (const std::shared_ptr>& A,\n+const ParameterTree& configuration)\n+304 : _\bS_\be_\bq_\bS_\bO_\bR(A->getmat(), configuration)\n+305 {}\n+306\n+_\b3_\b2_\b0 _\bS_\be_\bq_\bS_\bO_\bR (const M& A, const ParameterTree& configuration)\n+321 : _\bS_\be_\bq_\bS_\bO_\bR(A, configuration._\bg_\be_\bt(\"iterations\",1),\n+configuration._\bg_\be_\bt<_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>(\"relaxation\",1.0))\n+322 {}\n+323\n+_\b3_\b2_\b9 virtual void _\bp_\br_\be ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)\n+330 {}\n+331\n+_\b3_\b3_\b7 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n+338 {\n+339 this->template apply(v,d);\n+340 }\n+341\n+350 template\n+_\b3_\b5_\b1 void _\ba_\bp_\bp_\bl_\by(X& v, const Y& d)\n+352 {\n+353 if(forward)\n+354 for (int i=0; i<_n; i++) {\n+355 _\bb_\bs_\bo_\br_\bf(_A_,v,d,_w,_\bB_\bL_\b<_\bl_\b>());\n+356 }\n+357 else\n+358 for (int i=0; i<_n; i++) {\n+359 _\bb_\bs_\bo_\br_\bb(_A_,v,d,_w,_\bB_\bL_\b<_\bl_\b>());\n+360 }\n+361 }\n+362\n+_\b3_\b6_\b8 virtual void _\bp_\bo_\bs_\bt ([[maybe_unused]] X& x)\n+369 {}\n+370\n+_\b3_\b7_\b2 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+373 {\n+374 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+375 }\n+376\n+377 private:\n+379 const M& _A_;\n+381 int _n;\n+383 _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _w;\n+384 };\n+_\b3_\b8_\b5 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(\"sor\",\n+defaultPreconditionerBlockLevelCreator());\n+386\n+387\n+398 template\n+_\b3_\b9_\b9 using _\bS_\be_\bq_\bG_\bS = _\bS_\be_\bq_\bS_\bO_\bR_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b>;\n+_\b4_\b0_\b0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(\"gs\",\n+defaultPreconditionerBlockLevelCreator());\n+401\n+412 template\n+_\b4_\b1_\b3 class _\bS_\be_\bq_\bJ_\ba_\bc : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b> {\n+414 public:\n+_\b4_\b1_\b6 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b4_\b1_\b8 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b4_\b2_\b0 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b4_\b2_\b2 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b4_\b2_\b4 typedef Simd::Scalar _\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b4_\b2_\b6 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+427\n+_\b4_\b3_\b5 _\bS_\be_\bq_\bJ_\ba_\bc (const M& A, int n, _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be w)\n+436 : _A_(A), _n(n), _w(w)\n+437 {\n+438 _\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\bM_\b,_\bl_\b>_\b:_\b:_\bc_\bh_\be_\bc_\bk(_A_);\n+439 }\n+440\n+_\b4_\b5_\b4 _\bS_\be_\bq_\bJ_\ba_\bc (const std::shared_ptr>& A,\n+const ParameterTree& configuration)\n+455 : _\bS_\be_\bq_\bJ_\ba_\bc(A->getmat(), configuration)\n+456 {}\n+457\n+_\b4_\b7_\b1 _\bS_\be_\bq_\bJ_\ba_\bc (const M& A, const ParameterTree& configuration)\n+472 : _\bS_\be_\bq_\bJ_\ba_\bc(A, configuration._\bg_\be_\bt(\"iterations\",1),\n+configuration._\bg_\be_\bt<_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>(\"relaxation\",1.0))\n+473 {}\n+474\n+_\b4_\b8_\b0 virtual void _\bp_\br_\be ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)\n+481 {}\n+482\n+_\b4_\b8_\b8 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n+489 {\n+490 for (int i=0; i<_n; i++) {\n+491 _\bd_\bb_\bj_\ba_\bc(_A_,v,d,_w,_\bB_\bL_\b<_\bl_\b>());\n+492 }\n+493 }\n+494\n+_\b5_\b0_\b0 virtual void _\bp_\bo_\bs_\bt ([[maybe_unused]] X& x)\n+501 {}\n+502\n+_\b5_\b0_\b4 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+505 {\n+506 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+507 }\n+508\n+509 private:\n+511 const M& _A_;\n+513 int _n;\n+515 real_field_type _w;\n+516 };\n+_\b5_\b1_\b7 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(\"jac\",\n+defaultPreconditionerBlockLevelCreator());\n+518\n+562 template \n+_\b5_\b6_\b3 class _\bS_\be_\bq_\bD_\bI_\bL_\bU : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\b _\bY_\b>\n+564 {\n+565 public:\n+_\b5_\b6_\b7 using _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be = M;\n+_\b5_\b6_\b9 using _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be = typename matrix_type::block_type;\n+_\b5_\b7_\b1 using _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be = X;\n+_\b5_\b7_\b3 using _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be = Y;\n+574\n+_\b5_\b7_\b6 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename X::field_type;\n+577\n+_\b5_\b7_\b9 using _\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = Simd::Scalar;\n+_\b5_\b8_\b1 using _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename FieldTraits::real_type;\n+582\n+_\b5_\b8_\b9 _\bS_\be_\bq_\bD_\bI_\bL_\bU(const M &A, _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be w)\n+590 : _A_(A),\n+591 _w(w),\n+592 wNotIdentity_([w]\n+593 {using std::abs; return abs(w - _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(1)) > 1e-15; }())\n+594 {\n+595 Dinv_.resize(_A_.N());\n+596 _\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\bM_\b,_\b _\bl_\b>_\b:_\b:_\bc_\bh_\be_\bc_\bk(_A_);\n+597 _\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(_A_, Dinv_);\n+598 }\n 599\n-600\n-_\b6_\b0_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bi_\bn_\bd_\be_\bx () const\n-603 {\n-604 return i;\n-605 }\n-606\n-_\b6_\b0_\b7 std::ptrdiff_t _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b>& other) const\n-608 {\n-609 assert(other.p==p);\n-610 return (other.i-i);\n-611 }\n-612\n-_\b6_\b1_\b3 std::ptrdiff_t _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b>& other)\n-const\n+_\b6_\b1_\b2 _\bS_\be_\bq_\bD_\bI_\bL_\bU(const std::shared_ptr> &A,\n+const ParameterTree &configuration)\n+613 : _\bS_\be_\bq_\bD_\bI_\bL_\bU(A->getmat(), configuration)\n 614 {\n-615 assert(other.p==p);\n-616 return (other.i-i);\n-617 }\n-618\n-_\b6_\b2_\b0 bool _\be_\bq_\bu_\ba_\bl_\bs (const _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b>& other) const\n-621 {\n-622 assert(other.p==p);\n-623 return i==other.i;\n-624 }\n-625\n-_\b6_\b2_\b7 bool _\be_\bq_\bu_\ba_\bl_\bs (const _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be_\b>& other) const\n-628 {\n-629 assert(other.p==p);\n-630 return i==other.i;\n-631 }\n-632\n-633 private:\n-635 void increment()\n-636 {\n-637 ++i;\n-638 }\n-639\n-641 void decrement()\n-642 {\n-643 --i;\n-644 }\n-645\n-646 void advance(std::ptrdiff_t diff)\n-647 {\n-648 i+=diff;\n-649 }\n+615 }\n+616\n+_\b6_\b2_\b9 _\bS_\be_\bq_\bD_\bI_\bL_\bU(const M &A, const ParameterTree &config)\n+630 : _\bS_\be_\bq_\bD_\bI_\bL_\bU(A, config._\bg_\be_\bt<_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>(\"relaxation\", 1.0))\n+631 {\n+632 }\n+633\n+_\b6_\b3_\b9 virtual void _\bp_\br_\be([[maybe_unused]] X &x, [[maybe_unused]] Y &b)\n+640 {\n+641 }\n+642\n+_\b6_\b4_\b8 virtual void _\ba_\bp_\bp_\bl_\by(X &v, const Y &d)\n+649 {\n 650\n-651 T& elementAt(std::ptrdiff_t diff) const\n-652 {\n-653 return p[i+diff];\n-654 }\n-655\n-657 _\br_\bo_\bw_\b__\bt_\by_\bp_\be& dereference () const\n-658 {\n-659 return p[i];\n-660 }\n-661\n-662 _\br_\bo_\bw_\b__\bt_\by_\bp_\be* p;\n-663 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i;\n-664 };\n-665\n-_\b6_\b6_\b7 typedef _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b> _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b6_\b6_\b8 typedef _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b> _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-669\n-_\b6_\b7_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n-672 {\n-673 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,0);\n-674 }\n-675\n-_\b6_\b7_\b7 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n-678 {\n-679 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,_\bn);\n-680 }\n-681\n-_\b6_\b8_\b4 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n-685 {\n-686 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,_\bn-1);\n-687 }\n-688\n-_\b6_\b9_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n-692 {\n-693 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,-1);\n-694 }\n-695\n-_\b6_\b9_\b7 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-698\n-_\b7_\b0_\b0 typedef typename row_type::Iterator _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-701\n-_\b7_\b0_\b3 typedef _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b> _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b7_\b0_\b4 typedef _\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\br_\bo_\bw_\b__\bt_\by_\bp_\be_\b> _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-705\n-706\n-_\b7_\b0_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n-709 {\n-710 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,0);\n-711 }\n-712\n-_\b7_\b1_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n-715 {\n-716 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,_\bn);\n-717 }\n+651 _\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be(_A_, Dinv_, v, d);\n+652\n+653 if (wNotIdentity_)\n+654 {\n+655 v *= _w;\n+656 }\n+657 }\n+658\n+_\b6_\b6_\b4 virtual void _\bp_\bo_\bs_\bt([[maybe_unused]] X &x)\n+665 {\n+666 }\n+667\n+_\b6_\b6_\b9 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+670 {\n+671 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+672 }\n+673\n+674 protected:\n+_\b6_\b7_\b5 std::vector _\bD_\bi_\bn_\bv_\b_;\n+_\b6_\b7_\b7 const M &_\b__\bA_\b_;\n+_\b6_\b7_\b9 const _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\b__\bw;\n+_\b6_\b8_\b1 const bool _\bw_\bN_\bo_\bt_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\b_;\n+682 };\n+_\b6_\b8_\b3 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(\"dilu\",\n+defaultPreconditionerBlockLevelCreator());\n+684\n+696 template\n+_\b6_\b9_\b7 class _\bS_\be_\bq_\bI_\bL_\bU : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n+698 public:\n+_\b7_\b0_\b0 typedef typename std::remove_const::type _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b7_\b0_\b2 typedef typename matrix_type :: block_type _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+_\b7_\b0_\b4 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b7_\b0_\b6 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+707\n+_\b7_\b0_\b9 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+710\n+_\b7_\b1_\b2 typedef Simd::Scalar _\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b7_\b1_\b4 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+715\n+_\b7_\b1_\b7 typedef typename _\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b<_\b _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b _\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be_\b> _\bC_\bR_\bS;\n 718\n-_\b7_\b2_\b1 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd() const\n-722 {\n-723 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,_\bn-1);\n-724 }\n-725\n-_\b7_\b2_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n-729 {\n-730 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(_\br,-1);\n-731 }\n-732\n-_\b7_\b3_\b4 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-735\n-_\b7_\b3_\b7 typedef typename row_type::ConstIterator _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-738\n-739 //===== constructors & resizers\n-740\n-741 // we use a negative compressionBufferSize to indicate that the implicit\n-742 // mode parameters have not been set yet\n-743\n-_\b7_\b4_\b5 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx ()\n-746 : _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be(_\bu_\bn_\bk_\bn_\bo_\bw_\bn), _\br_\be_\ba_\bd_\by(_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd), _\bn(0), _\bm(0), _\bn_\bn_\bz_\b_(0),\n-747 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_(0), _\br(0), _\ba(0),\n-748 _\ba_\bv_\bg(0), _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_(-1.0)\n-749 {}\n-750\n-_\b7_\b5_\b2 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _nnz, _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be bm)\n-753 : _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be(bm), _\br_\be_\ba_\bd_\by(_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd), _\bn(0), _\bm(0), _\bn_\bn_\bz_\b_(0),\n-754 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_(0), _\br(0), _\ba(0),\n-755 _\ba_\bv_\bg(0), _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_(-1.0)\n-756 {\n-757 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_n, _m, _nnz,true,false);\n-758 }\n-759\n-_\b7_\b6_\b1 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _m, _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be bm)\n-762 : _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be(bm), _\br_\be_\ba_\bd_\by(_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd), _\bn(0), _\bm(0), _\bn_\bn_\bz_\b_(0),\n-763 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_(0), _\br(0), _\ba(0),\n-764 _\ba_\bv_\bg(0), _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_(-1.0)\n-765 {\n-766 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_n, _m,0,true,false);\n-767 }\n+_\b7_\b2_\b6 _\bS_\be_\bq_\bI_\bL_\bU (const M& A, _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be w, const bool resort = false )\n+727 : _\bS_\be_\bq_\bI_\bL_\bU( A, 0, w, resort ) // construct ILU(0)\n+728 {\n+729 }\n+730\n+_\b7_\b4_\b5 _\bS_\be_\bq_\bI_\bL_\bU (const std::shared_ptr>& A,\n+const ParameterTree& configuration)\n+746 : _\bS_\be_\bq_\bI_\bL_\bU(A->getmat(), configuration)\n+747 {}\n+748\n+_\b7_\b6_\b3 _\bS_\be_\bq_\bI_\bL_\bU(const M& A, const ParameterTree& config)\n+764 : _\bS_\be_\bq_\bI_\bL_\bU(A, config._\bg_\be_\bt(\"n\", 0),\n+765 config._\bg_\be_\bt<_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>(\"relaxation\", 1.0),\n+766 config._\bg_\be_\bt(\"resort\", false))\n+767 {}\n 768\n-770\n-_\b7_\b8_\b1 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _avg, double\n-compressionBufferSize, _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be bm)\n-782 : _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be(bm), _\br_\be_\ba_\bd_\by(_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd), _\bn(0), _\bm(0), _\bn_\bn_\bz_\b_(0),\n-783 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_(0), _\br(0), _\ba(0),\n-784 _\ba_\bv_\bg(_avg), _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_(compressionBufferSize)\n-785 {\n-786 if (bm != _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt)\n-787 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"Only call this constructor when using the\n-implicit build mode\");\n-788 // Prevent user from setting a negative compression buffer size:\n-789 // 1) It doesn't make sense\n-790 // 2) We use a negative value to indicate that the parameters\n-791 // have not been set yet\n-792 if (_\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_ < 0.0)\n-793 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You cannot set a negative overflow fraction\");\n-794 _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\b__\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_n,_m);\n-795 }\n-796\n-_\b8_\b0_\b2 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& Mat)\n-803 : _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be(Mat._\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be), _\br_\be_\ba_\bd_\by(_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd), _\bn(0), _\bm(0), _\bn_\bn_\bz_\b_(0),\n-804 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_(0), _\br(0), _\ba(0),\n-805 _\ba_\bv_\bg(Mat._\ba_\bv_\bg), _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_(Mat._\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_)\n-806 {\n-807 if (!(Mat._\br_\be_\ba_\bd_\by == _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd || Mat._\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bt))\n-808 DUNE_THROW(InvalidStateException,\"BCRSMatrix can only be copy-constructed\n-when source matrix is completely empty (size not set) or fully built)\");\n-809\n-810 // deep copy in global array\n-811 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _nnz = Mat._\bn_\bo_\bn_\bz_\be_\br_\bo_\be_\bs();\n-812\n-813 _\bj_\b_ = Mat._\bj_\b_; // enable column index sharing, release array in case of row-\n-wise allocation\n-814 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(Mat._\bn, Mat._\bm, _nnz, true, true);\n+_\b7_\b7_\b7 _\bS_\be_\bq_\bI_\bL_\bU (const M& A, int n, _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be w, const bool resort = false )\n+778 : _\bI_\bL_\bU_\b_(),\n+779 _\bl_\bo_\bw_\be_\br_\b_(),\n+780 _\bu_\bp_\bp_\be_\br_\b_(),\n+781 _\bi_\bn_\bv_\b_(),\n+782 _\bw_\b_(w),\n+783 _\bw_\bN_\bo_\bt_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\b_([w]{using std::abs; return abs(w - _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(1)) > 1e-\n+15;}() )\n+784 {\n+785 if( n == 0 )\n+786 {\n+787 // copy A\n+788 _\bI_\bL_\bU_\b_.reset( new _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be( A ) );\n+789 // create ILU(0) decomposition\n+790 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn( *_\bI_\bL_\bU_\b_ );\n+791 }\n+792 else\n+793 {\n+794 // create matrix in build mode\n+795 _\bI_\bL_\bU_\b_.reset( new _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be( A.N(), A.M(), matrix_type::row_wise) );\n+796 // create ILU(n) decomposition\n+797 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn( A, n, *_\bI_\bL_\bU_\b_ );\n+798 }\n+799\n+800 if( resort )\n+801 {\n+802 // store ILU in simple CRS format\n+803 _\bI_\bL_\bU_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bt_\bT_\bo_\bC_\bR_\bS( *_\bI_\bL_\bU_\b_, _\bl_\bo_\bw_\be_\br_\b_, _\bu_\bp_\bp_\be_\br_\b_, _\bi_\bn_\bv_\b_ );\n+804 _\bI_\bL_\bU_\b_.reset();\n+805 }\n+806 }\n+807\n+_\b8_\b1_\b3 virtual void _\bp_\br_\be ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)\n+814 {}\n 815\n-816 // build window structure\n-817 _\bc_\bo_\bp_\by_\bW_\bi_\bn_\bd_\bo_\bw_\bS_\bt_\br_\bu_\bc_\bt_\bu_\br_\be(Mat);\n-818 }\n-819\n-_\b8_\b2_\b1 _\b~_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx ()\n+_\b8_\b2_\b1 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n 822 {\n-823 _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be();\n-824 }\n-825\n-_\b8_\b3_\b0 void _\bs_\be_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be(_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be bm)\n-831 {\n-832 if (_\br_\be_\ba_\bd_\by == _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n+823 if( _\bI_\bL_\bU_\b_ )\n+824 {\n+825 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be( *_\bI_\bL_\bU_\b_, v, d);\n+826 }\n+827 else\n+828 {\n+829 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be(_\bl_\bo_\bw_\be_\br_\b_, _\bu_\bp_\bp_\be_\br_\b_, _\bi_\bn_\bv_\b_, v, d);\n+830 }\n+831\n+832 if( _\bw_\bN_\bo_\bt_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\b_ )\n 833 {\n-834 _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be = bm;\n-835 return;\n+834 v *= _\bw_\b_;\n+835 }\n 836 }\n-837 if (_\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg && (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\bu_\bn_\bk_\bn_\bo_\bw_\bn || _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\br_\ba_\bn_\bd_\bo_\bm ||\n-_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\br_\bo_\bw_\b__\bw_\bi_\bs_\be) && (bm == _\br_\bo_\bw_\b__\bw_\bi_\bs_\be || bm == _\br_\ba_\bn_\bd_\bo_\bm))\n-838 _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be = bm;\n-839 else\n-840 DUNE_THROW(InvalidStateException, \"Matrix structure cannot be changed at\n-this stage anymore (ready == \"<<_\br_\be_\ba_\bd_\by<<\").\");\n-841 }\n-842\n-_\b8_\b5_\b8 void _\bs_\be_\bt_\bS_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nnz=0)\n-859 {\n-860 // deallocate already setup memory\n-861 _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be();\n-862\n-863 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt)\n-864 {\n-865 if (nnz>0)\n-866 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"number of non-zeroes may not be set in\n-implicit mode, use setImplicitBuildModeParameters() instead\");\n+837\n+_\b8_\b4_\b3 virtual void _\bp_\bo_\bs_\bt ([[maybe_unused]] X& x)\n+844 {}\n+845\n+_\b8_\b4_\b7 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+848 {\n+849 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+850 }\n+851\n+852 protected:\n+_\b8_\b5_\b4 std::unique_ptr< matrix_type > _\bI_\bL_\bU_\b_;\n+855\n+_\b8_\b5_\b7 _\bC_\bR_\bS _\bl_\bo_\bw_\be_\br_\b_;\n+_\b8_\b5_\b8 _\bC_\bR_\bS _\bu_\bp_\bp_\be_\br_\b_;\n+_\b8_\b5_\b9 std::vector< block_type, typename matrix_type::allocator_type > _\bi_\bn_\bv_\b_;\n+860\n+_\b8_\b6_\b2 const _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bw_\b_;\n+_\b8_\b6_\b4 const bool _\bw_\bN_\bo_\bt_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\b_;\n+865 };\n+_\b8_\b6_\b6 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(\"ilu\",\n+defaultPreconditionerBlockLevelCreator());\n 867\n-868 // implicit allocates differently\n-869 _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\b__\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(rows,columns);\n-870 }\n-871 else\n-872 {\n-873 // allocate matrix memory\n-874 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(rows, columns, nnz, true, false);\n-875 }\n-876 }\n-877\n-_\b8_\b8_\b6 void _\bs_\be_\bt_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _avg, double\n-compressionBufferSize)\n-887 {\n-888 // Prevent user from setting a negative compression buffer size:\n-889 // 1) It doesn't make sense\n-890 // 2) We use a negative value to indicate that the parameters\n-891 // have not been set yet\n-892 if (compressionBufferSize < 0.0)\n-893 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You cannot set a negative compressionBufferSize\n-value\");\n-894\n-895 // make sure the parameters aren't changed after memory has been allocated\n-896 if (_\br_\be_\ba_\bd_\by != _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n-897 DUNE_THROW(InvalidStateException,\"You cannot modify build mode parameters\n-at this stage anymore\");\n-898 _\ba_\bv_\bg = _avg;\n-899 _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_ = compressionBufferSize;\n-900 }\n-901\n-_\b9_\b0_\b8 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& Mat)\n-909 {\n-910 // return immediately when self-assignment\n-911 if (&Mat==this) return *this;\n-912\n-913 if (!((_\br_\be_\ba_\bd_\by == _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd || _\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bt) && (Mat._\br_\be_\ba_\bd_\by ==\n-_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd || Mat._\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bt)))\n-914 DUNE_THROW(InvalidStateException,\"BCRSMatrix can only be copied when both\n-target and source are empty or fully built)\");\n-915\n-916 // make it simple: ALWAYS throw away memory for a and j_\n-917 // and deallocate rows only if n != Mat.n\n-918 _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bn!=Mat._\bn);\n-919\n-920 // reallocate the rows if required\n-921 if (_\bn>0 && _\bn!=Mat._\bn) {\n-922 // free rows\n-923 for(_\br_\bo_\bw_\b__\bt_\by_\bp_\be *riter=_\br+(_\bn-1), *rend=_\br-1; riter!=rend; --riter)\n-924 std::allocator_traits::destroy(_\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_,\n-riter);\n-925 _\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.deallocate(_\br,_\bn);\n-926 }\n-927\n-928 _\bn_\bn_\bz_\b_ = Mat._\bn_\bo_\bn_\bz_\be_\br_\bo_\be_\bs();\n-929\n-930 // allocate a, share j_\n-931 _\bj_\b_ = Mat._\bj_\b_;\n-932 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(Mat._\bn, Mat._\bm, _\bn_\bn_\bz_\b_, _\bn!=Mat._\bn, true);\n+868\n+877 template\n+_\b8_\b7_\b8 class _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n+879 public:\n+_\b8_\b8_\b1 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b8_\b8_\b3 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b8_\b8_\b5 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b8_\b8_\b7 typedef Simd::Scalar _\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b8_\b8_\b9 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+890\n+_\b8_\b9_\b6 _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn (_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be w=1.0) :\n+897 _w(w)\n+898 {}\n+899\n+_\b9_\b1_\b1 _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn (const ParameterTree& configuration)\n+912 : _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn(configuration._\bg_\be_\bt<_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>(\"relaxation\", 1.0))\n+913 {}\n+914\n+_\b9_\b2_\b0 virtual void _\bp_\br_\be ([[maybe_unused]] X& x, [[maybe_unused]] Y& b)\n+921 {}\n+922\n+_\b9_\b2_\b8 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n+929 {\n+930 v = d;\n+931 v *= _w;\n+932 }\n 933\n-934 // build window structure\n-935 _\bc_\bo_\bp_\by_\bW_\bi_\bn_\bd_\bo_\bw_\bS_\bt_\br_\bu_\bc_\bt_\bu_\br_\be(Mat);\n-936 return *this;\n-937 }\n-938\n-_\b9_\b4_\b0 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n-941 {\n-942\n-943 if (!(_\br_\be_\ba_\bd_\by == _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd || _\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bt))\n-944 DUNE_THROW(InvalidStateException,\"Scalar assignment only works on fully\n-built BCRSMatrix)\");\n-945\n-946 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++) _\br[i] = k;\n-947 return *this;\n-948 }\n-949\n-950 //===== row-wise creation interface\n-951\n-_\b9_\b5_\b3 class _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-954 {\n-955 public:\n-_\b9_\b5_\b7 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br (_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _Mat, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _i)\n-958 : Mat(_Mat), i(_i), nnz(0), current_row(nullptr, Mat._\bj_\b_._\bg_\be_\bt(), 0)\n-959 {\n-960 if (Mat._\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be == _\bu_\bn_\bk_\bn_\bo_\bw_\bn && Mat._\br_\be_\ba_\bd_\by == _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n-961 {\n-962 Mat._\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be = _\br_\bo_\bw_\b__\bw_\bi_\bs_\be;\n-963 }\n-964 if (i==0 && Mat._\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n-965 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"creation only allowed for uninitialized\n-matrix\");\n-966 if(Mat._\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\br_\bo_\bw_\b__\bw_\bi_\bs_\be)\n-967 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"creation only allowed if row wise allocation\n-was requested in the constructor\");\n-968 if(i==0 && _Mat._\bN()==0)\n-969 // empty Matrix is always built.\n-970 Mat._\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bt;\n-971 }\n-972\n-_\b9_\b7_\b4 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-975 {\n-976 // this should only be called if matrix is in creation\n-977 if (Mat._\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n-978 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix already built up\");\n-979\n-980 // row i is defined through the pattern\n-981 // get memory for the row and initialize the j_ array\n-982 // this depends on the allocation mode\n-983\n-984 // compute size of the row\n-985 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s = pattern.size();\n-986\n-987 if(s>0) {\n-988 // update number of nonzeroes including this row\n-989 nnz += s;\n-990\n-991 // alloc memory / set window\n-992 if (Mat._\bn_\bn_\bz_\b_ > 0)\n-993 {\n-994 // memory is allocated in one long array\n-995\n-996 // check if that memory is sufficient\n-997 if (nnz > Mat._\bn_\bn_\bz_\b_)\n-998 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"allocated nnz too small\");\n-999\n-1000 // set row i\n-1001 Mat._\br[i].set(s,nullptr,current_row.getindexptr());\n-1002 current_row.setindexptr(current_row.getindexptr()+s);\n-1003 }else{\n-1004 // memory is allocated individually per row\n-1005 // allocate and set row i\n-1006 B* b = Mat._\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.allocate(s);\n-1007 // use placement new to call constructor that allocates\n-1008 // additional memory.\n-1009 new (b) B[s];\n-1010 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* j = Mat._\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.allocate(s);\n-1011 Mat._\br[i].set(s,b,j);\n-1012 }\n-1013 }else\n-1014 // setup empty row\n-1015 Mat._\br[i].set(0,nullptr,nullptr);\n-1016\n-1017 // initialize the j array for row i from pattern\n-1018 std::copy(pattern.cbegin(), pattern.cend(), Mat._\br[i].getindexptr());\n-1019\n-1020 // now go to next row\n-1021 i++;\n-1022 pattern.clear();\n-1023\n-1024 // check if this was last row\n-1025 if (i==Mat._\bn)\n-1026 {\n-1027 Mat._\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bt;\n-1028 if(Mat._\bn_\bn_\bz_\b_ > 0)\n-1029 {\n-1030 // Set nnz to the exact number of nonzero blocks inserted\n-1031 // as some methods rely on it\n-1032 Mat._\bn_\bn_\bz_\b_ = nnz;\n-1033 // allocate data array\n-1034 Mat._\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bD_\ba_\bt_\ba();\n-1035 Mat._\bs_\be_\bt_\bD_\ba_\bt_\ba_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs();\n-1036 }\n-1037 }\n-1038 // done\n-1039 return *this;\n-1040 }\n-1041\n-_\b1_\b0_\b4_\b3 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n-1044 {\n-1045 return (i!=it.i) || (&Mat!=&it.Mat);\n-1046 }\n-1047\n-_\b1_\b0_\b4_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n-1050 {\n-1051 return (i==it.i) && (&Mat==&it.Mat);\n-1052 }\n-1053\n-_\b1_\b0_\b5_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bi_\bn_\bd_\be_\bx () const\n-1056 {\n-1057 return i;\n-1058 }\n-1059\n-_\b1_\b0_\b6_\b1 void _\bi_\bn_\bs_\be_\br_\bt (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n-1062 {\n-1063 pattern.insert(j);\n-1064 }\n-1065\n-_\b1_\b0_\b6_\b7 bool _\bc_\bo_\bn_\bt_\ba_\bi_\bn_\bs (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n-1068 {\n-1069 return pattern.find(j) != pattern.end();\n-1070 }\n-_\b1_\b0_\b7_\b6 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const\n-1077 {\n-1078 return pattern.size();\n-1079 }\n-1080\n-1081 private:\n-1082 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& Mat; // the matrix we are defining\n-1083 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i; // current row to be defined\n-1084 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nnz; // count total number of nonzeros\n-1085 typedef std::set > PatternType;\n-1086 PatternType pattern; // used to compile entries in a row\n-1087 _\br_\bo_\bw_\b__\bt_\by_\bp_\be current_row; // row pointing to the current row to setup\n-1088 };\n-1089\n-_\b1_\b0_\b9_\b1 friend class _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b9_\b3_\b9 virtual void _\bp_\bo_\bs_\bt ([[maybe_unused]] X& x)\n+940 {}\n+941\n+_\b9_\b4_\b3 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+944 {\n+945 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+946 }\n+947\n+948 private:\n+950 _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _w;\n+951 };\n+_\b9_\b5_\b2 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(\"richardson\", [](auto tl, const auto& /* mat\n+*/, const ParameterTree& config){\n+953 using D = typename Dune::TypeListElement<1, decltype(tl)>::type;\n+954 using R = typename Dune::TypeListElement<2, decltype(tl)>::type;\n+955 return std::make_shared>(config);\n+956 });\n+957\n+958\n+969 template< class M, class X, class Y >\n+_\b9_\b7_\b0 class _\bS_\be_\bq_\bI_\bL_\bD_\bL\n+971 : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br< X, Y >\n+972 {\n+973 typedef _\bS_\be_\bq_\bI_\bL_\bD_\bL_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b> _\bT_\bh_\bi_\bs;\n+974 typedef _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b _\b> _\bB_\ba_\bs_\be;\n+975\n+976 public:\n+_\b9_\b7_\b8 typedef std::remove_const_t< M > _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b9_\b8_\b0 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b9_\b8_\b2 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b9_\b8_\b4 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b9_\b8_\b6 typedef Simd::Scalar _\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b9_\b8_\b8 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+989\n+_\b1_\b0_\b0_\b2 _\bS_\be_\bq_\bI_\bL_\bD_\bL (const std::shared_ptr>& A,\n+const ParameterTree& configuration)\n+1003 : _\bS_\be_\bq_\bI_\bL_\bD_\bL(A->getmat(), configuration)\n+1004 {}\n+1005\n+_\b1_\b0_\b1_\b8 _\bS_\be_\bq_\bI_\bL_\bD_\bL(const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& A, const ParameterTree& config)\n+1019 : _\bS_\be_\bq_\bI_\bL_\bD_\bL(A, config._\bg_\be_\bt<_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>(\"relaxation\", 1.0))\n+1020 {}\n+1021\n+_\b1_\b0_\b3_\b0 explicit _\bS_\be_\bq_\bI_\bL_\bD_\bL ( const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be &A, _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax =\n+_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be( 1 ) )\n+1031 : decomposition_( A.N(), A.M(), _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be::random ),\n+1032 relax_( relax )\n+1033 {\n+1034 // setup row sizes for lower triangular matrix\n+1035 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )\n+1036 {\n+1037 const auto &A_i = *i;\n+1038 const auto ij = A_i.find( i.index() );\n+1039 if( ij != A_i.end() )\n+1040 decomposition_.setrowsize( i.index(), ij.offset()+1 );\n+1041 else\n+1042 DUNE_THROW( _\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"diagonal entry missing\" );\n+1043 }\n+1044 decomposition_.endrowsizes();\n+1045\n+1046 // setup row indices for lower triangular matrix\n+1047 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )\n+1048 {\n+1049 const auto &A_i = *i;\n+1050 for( auto ij = A_i.begin(); ij.index() < i.index() ; ++ij )\n+1051 decomposition_.addindex( i.index(), ij.index() );\n+1052 decomposition_.addindex( i.index(), i.index() );\n+1053 }\n+1054 decomposition_.endindices();\n+1055\n+1056 // copy values of lower triangular matrix\n+1057 auto i = A.begin();\n+1058 for( auto row = decomposition_.begin(), rowend = decomposition_.end(); row\n+!= rowend; ++row, ++i )\n+1059 {\n+1060 auto ij = i->begin();\n+1061 for( auto _\bc_\bo_\bl = row->begin(), colend = row->end(); _\bc_\bo_\bl != colend; ++_\bc_\bo_\bl,\n+++ij )\n+1062 *_\bc_\bo_\bl = *ij;\n+1063 }\n+1064\n+1065 // perform ILDL decomposition\n+1066 _\bb_\bi_\bl_\bd_\bl_\b__\bd_\be_\bc_\bo_\bm_\bp_\bo_\bs_\be( decomposition_ );\n+1067 }\n+1068\n+_\b1_\b0_\b7_\b0 void _\bp_\br_\be ([[maybe_unused]] X &x, [[maybe_unused]] Y &b) override\n+1071 {}\n+1072\n+_\b1_\b0_\b7_\b4 void _\ba_\bp_\bp_\bl_\by ( X &v, const Y &d ) override\n+1075 {\n+1076 _\bb_\bi_\bl_\bd_\bl_\b__\bb_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be( decomposition_, v, d, true );\n+1077 v *= relax_;\n+1078 }\n+1079\n+_\b1_\b0_\b8_\b1 void _\bp_\bo_\bs_\bt ([[maybe_unused]] X &x) override\n+1082 {}\n+1083\n+_\b1_\b0_\b8_\b5 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by () const override { return\n+_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl; }\n+1086\n+1087 private:\n+1088 _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be decomposition_;\n+1089 _\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax_;\n+1090 };\n+_\b1_\b0_\b9_\b1 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(\"ildl\", defaultPreconditionerCreator());\n 1092\n-_\b1_\b0_\b9_\b4 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn ()\n-1095 {\n-1096 return _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,0);\n-1097 }\n-1098\n-_\b1_\b1_\b0_\b0 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd ()\n-1101 {\n-1102 return _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this,_\bn);\n-1103 }\n-1104\n-1105\n-1106 //===== random creation interface\n-1107\n-_\b1_\b1_\b1_\b4 void _\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s)\n-1115 {\n-1116 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\br_\ba_\bn_\bd_\bo_\bm)\n-1117 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"requires random build mode\");\n-1118 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n-1119 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix row sizes already built up\");\n-1120\n-1121 _\br[i].setsize(s);\n-1122 }\n-1123\n-_\b1_\b1_\b2_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bg_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-1126 {\n-1127#ifdef DUNE_ISTL_WITH_CHECKING\n-1128 if (_\br==0) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row not initialized yet\");\n-1129 if (i>=_\bn) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1130#endif\n-1131 return _\br[i].getsize();\n-1132 }\n-1133\n-_\b1_\b1_\b3_\b5 void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s = 1)\n-1136 {\n-1137 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\br_\ba_\bn_\bd_\bo_\bm)\n-1138 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"requires random build mode\");\n-1139 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n-1140 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix row sizes already built up\");\n-1141\n-1142 _\br[i].setsize(_\br[i].getsize()+s);\n-1143 }\n-1144\n-_\b1_\b1_\b4_\b6 void _\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs ()\n-1147 {\n-1148 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\br_\ba_\bn_\bd_\bo_\bm)\n-1149 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"requires random build mode\");\n-1150 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n-1151 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix row sizes already built up\");\n-1152\n-1153 // compute total size, check positivity\n-1154 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be total=0;\n-1155 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++)\n-1156 {\n-1157 total += _\br[i].getsize();\n-1158 }\n-1159\n-1160 if(_\bn_\bn_\bz_\b_ == 0)\n-1161 // allocate/check memory\n-1162 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bn,_\bm,total,false,false);\n-1163 else if(_\bn_\bn_\bz_\b_ < total)\n-1164 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"Specified number of nonzeros (\"<<_\bn_\bn_\bz_\b_<<\") not\n-\"\n-1165 <<\"sufficient for calculated nonzeros (\"<= _\bm)\n-1200 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"column index exceeds matrix size\");\n-1201\n-1202 // get row range\n-1203 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* const first = _\br[row].getindexptr();\n-1204 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* const last = first + _\br[row].getsize();\n-1205\n-1206 // find correct insertion position for new column index\n-1207 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* pos = std::lower_bound(first,last,_\bc_\bo_\bl);\n-1208\n-1209 // check if index is already in row\n-1210 if (pos!=last && *pos == _\bc_\bo_\bl) return;\n-1211\n-1212 // find end of already inserted column indices\n-1213 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* _\be_\bn_\bd = std::lower_bound(pos,last,_\bm);\n-1214 if (_\be_\bn_\bd==last)\n-1215 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row is too small\");\n-1216\n-1217 // insert new column index at correct position\n-1218 std::copy_backward(pos,_\be_\bn_\bd,_\be_\bn_\bd+1);\n-1219 *pos = _\bc_\bo_\bl;\n-1220 }\n-1221\n-1223\n-1231 template\n-_\b1_\b2_\b3_\b2 void _\bs_\be_\bt_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bN_\bo_\bS_\bo_\br_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row, It _\bb_\be_\bg_\bi_\bn, It _\be_\bn_\bd)\n-1233 {\n-1234 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row_size = _\br[row].size();\n-1235 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* col_begin = _\br[row].getindexptr();\n-1236 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* col_end;\n-1237 // consistency check between allocated row size and number of passed\n-column indices\n-1238 if ((col_end = std::copy(_\bb_\be_\bg_\bi_\bn,_\be_\bn_\bd,_\br[row].getindexptr())) != col_begin +\n-row_size)\n-1239 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"Given size of row \" << row\n-1240 << \" (\" << row_size\n-1241 << \") does not match number of passed entries (\" << (col_end - col_begin)\n-<< \")\");\n-1242 }\n-1243\n-1244\n-1246\n-1254 template\n-_\b1_\b2_\b5_\b5 void _\bs_\be_\bt_\bI_\bn_\bd_\bi_\bc_\be_\bs(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row, It _\bb_\be_\bg_\bi_\bn, It _\be_\bn_\bd)\n-1256 {\n-1257 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row_size = _\br[row].size();\n-1258 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* col_begin = _\br[row].getindexptr();\n-1259 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* col_end;\n-1260 // consistency check between allocated row size and number of passed\n-column indices\n-1261 if ((col_end = std::copy(_\bb_\be_\bg_\bi_\bn,_\be_\bn_\bd,_\br[row].getindexptr())) != col_begin +\n-row_size)\n-1262 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"Given size of row \" << row\n-1263 << \" (\" << row_size\n-1264 << \") does not match number of passed entries (\" << (col_end - col_begin)\n-<< \")\");\n-1265 std::sort(col_begin,col_end);\n-1266 }\n-1267\n-_\b1_\b2_\b6_\b9 void _\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs ()\n-1270 {\n-1271 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\br_\ba_\bn_\bd_\bo_\bm)\n-1272 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"requires random build mode\");\n-1273 if (_\br_\be_\ba_\bd_\by==_\bb_\bu_\bi_\bl_\bt)\n-1274 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix already built up\");\n-1275 if (_\br_\be_\ba_\bd_\by==_\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n-1276 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row sizes are not built up yet\");\n-1277 if (_\br_\be_\ba_\bd_\by==_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n-1278 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix size not set and no memory allocated\n-yet\");\n-1279\n-1280 // check if there are undefined indices\n-1281 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1282 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1283 {\n-1284 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1285 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j) {\n-1286 if (j.index() >= _\bm) {\n-1287 dwarn << \"WARNING: size of row \"<< i.index()<<\" is \"<= _\bn)\n-1330 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row index exceeds matrix size\");\n-1331 if (_\bc_\bo_\bl >= _\bm)\n-1332 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"column index exceeds matrix size\");\n-1333#endif\n-1334\n-1335 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* _\bb_\be_\bg_\bi_\bn = _\br[row].getindexptr();\n-1336 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* _\be_\bn_\bd = _\bb_\be_\bg_\bi_\bn + _\br[row].getsize();\n-1337\n-1338 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* pos = std::find(_\bb_\be_\bg_\bi_\bn, _\be_\bn_\bd, _\bc_\bo_\bl);\n-1339\n-1340 //treat the case that there was a match in the array\n-1341 if (pos != _\be_\bn_\bd)\n-1342 if (*pos == _\bc_\bo_\bl)\n-1343 {\n-1344 std::ptrdiff_t offset = pos - _\br[row].getindexptr();\n-1345 B* aptr = _\br[row].getptr() + offset;\n-1346\n-1347 return *aptr;\n-1348 }\n-1349\n-1350 //determine whether overflow has to be taken into account or not\n-1351 if (_\br[row].getsize() == _\ba_\bv_\bg)\n-1352 return _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw[std::make_pair(row,_\bc_\bo_\bl)];\n-1353 else\n-1354 {\n-1355 //modify index array\n-1356 *_\be_\bn_\bd = _\bc_\bo_\bl;\n-1357\n-1358 //do simultaneous operations on data array a\n-1359 std::ptrdiff_t offset = _\be_\bn_\bd - _\br[row].getindexptr();\n-1360 B* apos = _\br[row].getptr() + offset;\n-1361\n-1362 //increase rowsize\n-1363 _\br[row].setsize(_\br[row].getsize()+1);\n-1364\n-1365 //return reference to the newly created entry\n-1366 return *apos;\n-1367 }\n-1368 }\n-1369\n-1371\n-_\b1_\b3_\b8_\b1 _\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs()\n-1382 {\n-1383 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be!=_\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt)\n-1384 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"requires implicit build mode\");\n-1385 if (_\br_\be_\ba_\bd_\by==_\bb_\bu_\bi_\bl_\bt)\n-1386 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix already built up, no more need for\n-compression\");\n-1387 if (_\br_\be_\ba_\bd_\by==_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n-1388 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"matrix size not set and no memory allocated\n-yet\");\n-1389 if (_\br_\be_\ba_\bd_\by!=_\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg)\n-1390 DUNE_THROW(InvalidStateException,\"You may only call compress() at the end\n-of the 'building' stage\");\n-1391\n-1392 //calculate statistics\n-1393 _\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs stats;\n-1394 stats._\bo_\bv_\be_\br_\bf_\bl_\bo_\bw_\b__\bt_\bo_\bt_\ba_\bl = _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw.size();\n-1395 stats._\bm_\ba_\bx_\bi_\bm_\bu_\bm = 0;\n-1396\n-1397 //get insertion iterators pointing to one before start (for later use of\n-++it)\n-1398 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* jiit = _\bj_\b_.get();\n-1399 B* aiit = _\ba;\n-1400\n-1401 //get iterator to the smallest overflow element\n-1402 typename OverflowType::iterator oit = _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw.begin();\n-1403\n-1404 //store a copy of index pointers on which to perform sorting\n-1405 std::vector perm;\n-1406\n-1407 //iterate over all rows and copy elements into their position in the\n-compressed array\n-1408 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++)\n-1409 {\n-1410 //get old pointers into a and j and size without overflow changes\n-1411 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* _\bb_\be_\bg_\bi_\bn = _\br[i].getindexptr();\n-1412 //B* apos = r[i].getptr();\n-1413 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size = _\br[i].getsize();\n-1414\n-1415 perm.resize(size);\n-1416\n-1417 typename std::vector::iterator it = perm.begin();\n-1418 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* iit = _\bb_\be_\bg_\bi_\bn; iit < _\bb_\be_\bg_\bi_\bn + size; ++iit, ++it)\n-1419 *it = iit;\n-1420\n-1421 //sort permutation array\n-1422 std::sort(perm.begin(),perm.end(),_\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be_\b<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b>());\n-1423\n-1424 //change row window pointer to their new positions\n-1425 _\br[i].setindexptr(jiit);\n-1426 _\br[i].setptr(aiit);\n-1427\n-1428 for (it = perm.begin(); it != perm.end(); ++it)\n-1429 {\n-1430 //check whether there are elements in the overflow area which take\n-precedence\n-1431 while ((oit!=_\bo_\bv_\be_\br_\bf_\bl_\bo_\bw.end()) && (oit->first < std::make_pair(i,**it)))\n-1432 {\n-1433 //check whether there is enough memory to write to\n-1434 if (jiit > _\bb_\be_\bg_\bi_\bn)\n-1435 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd,\n-1436 \"Allocated memory for BCRSMatrix exhausted during compress()!\"\n-1437 \"Please increase either the average number of entries per row or the\n-compressionBufferSize value.\"\n-1438 );\n-1439 //copy an element from the overflow area to the insertion position in a\n-and j\n-1440 *jiit = oit->first.second;\n-1441 ++jiit;\n-1442 *aiit = oit->second;\n-1443 ++aiit;\n-1444 ++oit;\n-1445 _\br[i].setsize(_\br[i].getsize()+1);\n-1446 }\n-1447\n-1448 //check whether there is enough memory to write to\n-1449 if (jiit > _\bb_\be_\bg_\bi_\bn)\n-1450 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd,\n-1451 \"Allocated memory for BCRSMatrix exhausted during compress()!\"\n-1452 \"Please increase either the average number of entries per row or the\n-compressionBufferSize value.\"\n-1453 );\n-1454\n-1455 //copy element from array\n-1456 *jiit = **it;\n-1457 ++jiit;\n-1458 B* apos = *it - _\bj_\b_.get() + _\ba;\n-1459 *aiit = *apos;\n-1460 ++aiit;\n-1461 }\n-1462\n-1463 //copy remaining elements from the overflow area\n-1464 while ((oit!=_\bo_\bv_\be_\br_\bf_\bl_\bo_\bw.end()) && (oit->first.first == i))\n-1465 {\n-1466 //check whether there is enough memory to write to\n-1467 if (jiit > _\bb_\be_\bg_\bi_\bn)\n-1468 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd,\n-1469 \"Allocated memory for BCRSMatrix exhausted during compress()!\"\n-1470 \"Please increase either the average number of entries per row or the\n-compressionBufferSize value.\"\n-1471 );\n-1472\n-1473 //copy and element from the overflow area to the insertion position in a\n-and j\n-1474 *jiit = oit->first.second;\n-1475 ++jiit;\n-1476 *aiit = oit->second;\n-1477 ++aiit;\n-1478 ++oit;\n-1479 _\br[i].setsize(_\br[i].getsize()+1);\n-1480 }\n-1481\n-1482 // update maximum row size\n-1483 if (_\br[i].getsize()>stats._\bm_\ba_\bx_\bi_\bm_\bu_\bm)\n-1484 stats._\bm_\ba_\bx_\bi_\bm_\bu_\bm = _\br[i].getsize();\n-1485 }\n-1486\n-1487 // overflow area may be cleared\n-1488 _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw.clear();\n-1489\n-1490 //determine average number of entries and memory usage\n-1491 if ( _\bn == 0)\n-1492 {\n-1493 stats._\ba_\bv_\bg = 0;\n-1494 stats._\bm_\be_\bm_\b__\br_\ba_\bt_\bi_\bo = 1;\n-1495 }\n-1496 else\n-1497 {\n-1498 std::ptrdiff_t diff = (_\br[_\bn-1].getindexptr() + _\br[_\bn-1].getsize() - _\bj_\b_.get\n-());\n-1499 _\bn_\bn_\bz_\b_ = diff;\n-1500 stats._\ba_\bv_\bg = (double) (_\bn_\bn_\bz_\b_) / (double) _\bn;\n-1501 stats._\bm_\be_\bm_\b__\br_\ba_\bt_\bi_\bo = (double) (_\bn_\bn_\bz_\b_) / (double) _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_;\n-1502 }\n-1503\n-1504 //matrix is now built\n-1505 _\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bt;\n-1506\n-1507 return stats;\n-1508 }\n-1509\n-1510 //===== vector space arithmetic\n-1511\n-_\b1_\b5_\b1_\b3 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n-1514 {\n-1515#ifdef DUNE_ISTL_WITH_CHECKING\n-1516 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1517 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1518#endif\n-1519\n-1520 if (_\bn_\bn_\bz_\b_ > 0)\n-1521 {\n-1522 // process 1D array\n-1523 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn_\bn_\bz_\b_; i++)\n-1524 _\ba[i] *= k;\n-1525 }\n-1526 else\n-1527 {\n-1528 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1529 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1530 {\n-1531 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1532 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1533 (*j) *= k;\n-1534 }\n-1535 }\n-1536\n-1537 return *this;\n-1538 }\n-1539\n-_\b1_\b5_\b4_\b1 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n-1542 {\n-1543#ifdef DUNE_ISTL_WITH_CHECKING\n-1544 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1545 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1546#endif\n-1547\n-1548 if (_\bn_\bn_\bz_\b_ > 0)\n-1549 {\n-1550 // process 1D array\n-1551 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn_\bn_\bz_\b_; i++)\n-1552 _\ba[i] /= k;\n-1553 }\n-1554 else\n-1555 {\n-1556 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1557 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1558 {\n-1559 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1560 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1561 (*j) /= k;\n-1562 }\n-1563 }\n-1564\n-1565 return *this;\n-1566 }\n-1567\n-1568\n-_\b1_\b5_\b7_\b4 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& b)\n-1575 {\n-1576#ifdef DUNE_ISTL_WITH_CHECKING\n-1577 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt || b._\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1578 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1579 if(_\bN()!=b._\bN() || _\bM() != b._\bM())\n-1580 DUNE_THROW(RangeError, \"Matrix sizes do not match!\");\n-1581#endif\n-1582 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1583 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=b._\bb_\be_\bg_\bi_\bn();\n-1584 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i, ++j) {\n-1585 i->operator+=(*j);\n-1586 }\n-1587\n-1588 return *this;\n-1589 }\n-1590\n-_\b1_\b5_\b9_\b6 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& b)\n-1597 {\n-1598#ifdef DUNE_ISTL_WITH_CHECKING\n-1599 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt || b._\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1600 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1601 if(_\bN()!=b._\bN() || _\bM() != b._\bM())\n-1602 DUNE_THROW(RangeError, \"Matrix sizes do not match!\");\n-1603#endif\n-1604 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1605 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=b._\bb_\be_\bg_\bi_\bn();\n-1606 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i, ++j) {\n-1607 i->operator-=(*j);\n-1608 }\n-1609\n-1610 return *this;\n-1611 }\n-1612\n-_\b1_\b6_\b2_\b1 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\ba_\bx_\bp_\by(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& b)\n-1622 {\n-1623#ifdef DUNE_ISTL_WITH_CHECKING\n-1624 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt || b._\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1625 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1626 if(_\bN()!=b._\bN() || _\bM() != b._\bM())\n-1627 DUNE_THROW(RangeError, \"Matrix sizes do not match!\");\n-1628#endif\n-1629 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1630 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=b._\bb_\be_\bg_\bi_\bn();\n-1631 for(_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i, ++j)\n-1632 i->axpy(alpha, *j);\n-1633\n-1634 return *this;\n-1635 }\n-1636\n-1637 //===== linear maps\n-1638\n-1640 template\n-_\b1_\b6_\b4_\b1 void _\bm_\bv (const X& x, Y& y) const\n-1642 {\n-1643#ifdef DUNE_ISTL_WITH_CHECKING\n-1644 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1645 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1646 if (x.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\n-1647 \"Size mismatch: M: \" << _\bN() << \"x\" << _\bM() << \" x: \" << x.N());\n-1648 if (y.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\n-1649 \"Size mismatch: M: \" << _\bN() << \"x\" << _\bM() << \" y: \" << y.N());\n-1650#endif\n-1651 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1652 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1653 {\n-1654 y[i.index()]=0;\n-1655 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1656 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1657 {\n-1658 auto&& xj = Impl::asVector(x[j.index()]);\n-1659 auto&& yi = Impl::asVector(y[i.index()]);\n-1660 Impl::asMatrix(*j).umv(xj, yi);\n-1661 }\n-1662 }\n-1663 }\n-1664\n-1666 template\n-_\b1_\b6_\b6_\b7 void _\bu_\bm_\bv (const X& x, Y& y) const\n-1668 {\n-1669#ifdef DUNE_ISTL_WITH_CHECKING\n-1670 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1671 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1672 if (x.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1673 if (y.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1674#endif\n-1675 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1676 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1677 {\n-1678 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1679 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1680 {\n-1681 auto&& xj = Impl::asVector(x[j.index()]);\n-1682 auto&& yi = Impl::asVector(y[i.index()]);\n-1683 Impl::asMatrix(*j).umv(xj,yi);\n-1684 }\n-1685 }\n-1686 }\n-1687\n-1689 template\n-_\b1_\b6_\b9_\b0 void _\bm_\bm_\bv (const X& x, Y& y) const\n-1691 {\n-1692#ifdef DUNE_ISTL_WITH_CHECKING\n-1693 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1694 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1695 if (x.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1696 if (y.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1697#endif\n-1698 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1699 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1700 {\n-1701 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1702 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1703 {\n-1704 auto&& xj = Impl::asVector(x[j.index()]);\n-1705 auto&& yi = Impl::asVector(y[i.index()]);\n-1706 Impl::asMatrix(*j).mmv(xj,yi);\n-1707 }\n-1708 }\n-1709 }\n-1710\n-1712 template\n-_\b1_\b7_\b1_\b3 void _\bu_\bs_\bm_\bv (F&& alpha, const X& x, Y& y) const\n-1714 {\n-1715#ifdef DUNE_ISTL_WITH_CHECKING\n-1716 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1717 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1718 if (x.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1719 if (y.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1720#endif\n-1721 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1722 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1723 {\n-1724 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1725 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1726 {\n-1727 auto&& xj = Impl::asVector(x[j.index()]);\n-1728 auto&& yi = Impl::asVector(y[i.index()]);\n-1729 Impl::asMatrix(*j).usmv(alpha,xj,yi);\n-1730 }\n-1731 }\n-1732 }\n-1733\n-1735 template\n-_\b1_\b7_\b3_\b6 void _\bm_\bt_\bv (const X& x, Y& y) const\n-1737 {\n-1738#ifdef DUNE_ISTL_WITH_CHECKING\n-1739 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1740 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1741 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1742 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1743#endif\n-1744 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b1_\b7_\b5_\b1 void _\bu_\bm_\bt_\bv (const X& x, Y& y) const\n-1752 {\n-1753#ifdef DUNE_ISTL_WITH_CHECKING\n-1754 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1755 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1756 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1757 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1758#endif\n-1759 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1760 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1761 {\n-1762 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1763 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1764 {\n-1765 auto&& xi = Impl::asVector(x[i.index()]);\n-1766 auto&& yj = Impl::asVector(y[j.index()]);\n-1767 Impl::asMatrix(*j).umtv(xi,yj);\n-1768 }\n-1769 }\n-1770 }\n-1771\n-1773 template\n-_\b1_\b7_\b7_\b4 void _\bm_\bm_\bt_\bv (const X& x, Y& y) const\n-1775 {\n-1776#ifdef DUNE_ISTL_WITH_CHECKING\n-1777 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1778 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1779#endif\n-1780 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1781 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1782 {\n-1783 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1784 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1785 {\n-1786 auto&& xi = Impl::asVector(x[i.index()]);\n-1787 auto&& yj = Impl::asVector(y[j.index()]);\n-1788 Impl::asMatrix(*j).mmtv(xi,yj);\n-1789 }\n-1790 }\n-1791 }\n-1792\n-1794 template\n-_\b1_\b7_\b9_\b5 void _\bu_\bs_\bm_\bt_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const\n-1796 {\n-1797#ifdef DUNE_ISTL_WITH_CHECKING\n-1798 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1799 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1800 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1801 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1802#endif\n-1803 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1804 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1805 {\n-1806 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1807 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1808 {\n-1809 auto&& xi = Impl::asVector(x[i.index()]);\n-1810 auto&& yj = Impl::asVector(y[j.index()]);\n-1811 Impl::asMatrix(*j).usmtv(alpha,xi,yj);\n-1812 }\n-1813 }\n-1814 }\n-1815\n-1817 template\n-_\b1_\b8_\b1_\b8 void _\bu_\bm_\bh_\bv (const X& x, Y& y) const\n-1819 {\n-1820#ifdef DUNE_ISTL_WITH_CHECKING\n-1821 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1822 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1823 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1824 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1825#endif\n-1826 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1827 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1828 {\n-1829 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1830 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1831 {\n-1832 auto&& xi = Impl::asVector(x[i.index()]);\n-1833 auto&& yj = Impl::asVector(y[j.index()]);\n-1834 Impl::asMatrix(*j).umhv(xi,yj);\n-1835 }\n-1836 }\n-1837 }\n-1838\n-1840 template\n-_\b1_\b8_\b4_\b1 void _\bm_\bm_\bh_\bv (const X& x, Y& y) const\n-1842 {\n-1843#ifdef DUNE_ISTL_WITH_CHECKING\n-1844 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1845 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1846 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1847 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1848#endif\n-1849 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1850 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1851 {\n-1852 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1853 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1854 {\n-1855 auto&& xi = Impl::asVector(x[i.index()]);\n-1856 auto&& yj = Impl::asVector(y[j.index()]);\n-1857 Impl::asMatrix(*j).mmhv(xi,yj);\n-1858 }\n-1859 }\n-1860 }\n-1861\n-1863 template\n-_\b1_\b8_\b6_\b4 void _\bu_\bs_\bm_\bh_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const\n-1865 {\n-1866#ifdef DUNE_ISTL_WITH_CHECKING\n-1867 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1868 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1869 if (x.N()!=_\bN()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1870 if (y.N()!=_\bM()) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"index out of range\");\n-1871#endif\n-1872 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endi=_\be_\bn_\bd();\n-1873 for (_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i=this->_\bb_\be_\bg_\bi_\bn(); i!=endi; ++i)\n-1874 {\n-1875 _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endj = (*i).end();\n-1876 for (_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j=(*i).begin(); j!=endj; ++j)\n-1877 {\n-1878 auto&& xi = Impl::asVector(x[i.index()]);\n-1879 auto&& yj = Impl::asVector(y[j.index()]);\n-1880 Impl::asMatrix(*j).usmhv(alpha,xi,yj);\n-1881 }\n-1882 }\n-1883 }\n-1884\n-1885\n-1886 //===== norms\n-1887\n-_\b1_\b8_\b8_\b9 typename FieldTraits::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2 () const\n-1890 {\n-1891#ifdef DUNE_ISTL_WITH_CHECKING\n-1892 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1893 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1894#endif\n-1895\n-1896 typename FieldTraits::real_type sum=0;\n-1897\n-1898 for (auto&& row : (*this))\n-1899 for (auto&& _\be_\bn_\bt_\br_\by : row)\n-1900 sum += Impl::asMatrix(_\be_\bn_\bt_\br_\by).frobenius_norm2();\n-1901\n-1902 return sum;\n-1903 }\n-1904\n-_\b1_\b9_\b0_\b6 typename FieldTraits::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm () const\n-1907 {\n-1908 return sqrt(_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2());\n-1909 }\n-1910\n-1912 template ::value, int>::type = 0>\n-_\b1_\b9_\b1_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n-1915 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1916 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1917\n-1918 using real_type = typename FieldTraits::real_type;\n-1919 using std::max;\n-1920\n-1921 real_type norm = 0;\n-1922 for (auto const &x : *this) {\n-1923 real_type sum = 0;\n-1924 for (auto const &y : x)\n-1925 sum += Impl::asMatrix(y).infinity_norm();\n-1926 norm = max(sum, norm);\n-1927 }\n-1928 return norm;\n-1929 }\n-1930\n-1932 template ::value, int>::type = 0>\n-_\b1_\b9_\b3_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n-1935 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1936 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1937\n-1938 using real_type = typename FieldTraits::real_type;\n-1939 using std::max;\n-1940\n-1941 real_type norm = 0;\n-1942 for (auto const &x : *this) {\n-1943 real_type sum = 0;\n-1944 for (auto const &y : x)\n-1945 sum += Impl::asMatrix(y).infinity_norm_real();\n-1946 norm = max(sum, norm);\n-1947 }\n-1948 return norm;\n-1949 }\n-1950\n-1952 template ::value, int>::type = 0>\n-_\b1_\b9_\b5_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n-1955 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1956 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1957\n-1958 using real_type = typename FieldTraits::real_type;\n-1959 using std::max;\n-1960\n-1961 real_type norm = 0;\n-1962 real_type isNaN = 1;\n-1963 for (auto const &x : *this) {\n-1964 real_type sum = 0;\n-1965 for (auto const &y : x)\n-1966 sum += Impl::asMatrix(y).infinity_norm();\n-1967 norm = max(sum, norm);\n-1968 isNaN += sum;\n-1969 }\n-1970\n-1971 return norm * (isNaN / isNaN);\n-1972 }\n-1973\n-1975 template ::value, int>::type = 0>\n-_\b1_\b9_\b7_\b7 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n-1978 if (_\br_\be_\ba_\bd_\by != _\bb_\bu_\bi_\bl_\bt)\n-1979 DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"You can only call arithmetic operations on\n-fully built BCRSMatrix instances\");\n-1980\n-1981 using real_type = typename FieldTraits::real_type;\n-1982 using std::max;\n-1983\n-1984 real_type norm = 0;\n-1985 real_type isNaN = 1;\n-1986\n-1987 for (auto const &x : *this) {\n-1988 real_type sum = 0;\n-1989 for (auto const &y : x)\n-1990 sum += Impl::asMatrix(y).infinity_norm_real();\n-1991 norm = max(sum, norm);\n-1992 isNaN += sum;\n-1993 }\n-1994\n-1995 return norm * (isNaN / isNaN);\n-1996 }\n-1997\n-1998 //===== sizes\n-1999\n-_\b2_\b0_\b0_\b1 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN () const\n-2002 {\n-2003 return _\bn;\n-2004 }\n-2005\n-_\b2_\b0_\b0_\b7 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bM () const\n-2008 {\n-2009 return _\bm;\n-2010 }\n-2011\n-_\b2_\b0_\b1_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn_\bo_\bn_\bz_\be_\br_\bo_\be_\bs () const\n-2014 {\n-2015 // in case of row-wise allocation\n-2016 if( _\bn_\bn_\bz_\b_ <= 0 )\n-2017 _\bn_\bn_\bz_\b_ = std::accumulate( _\bb_\be_\bg_\bi_\bn(), _\be_\bn_\bd(), _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be( 0 ), [] ( _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s,\n-const _\br_\bo_\bw_\b__\bt_\by_\bp_\be &row ) { return s+row.getsize(); } );\n-2018 return _\bn_\bn_\bz_\b_;\n-2019 }\n-2020\n-_\b2_\b0_\b2_\b2 _\bB_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be _\bb_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be() const\n-2023 {\n-2024 return _\br_\be_\ba_\bd_\by;\n-2025 }\n-2026\n-_\b2_\b0_\b2_\b8 _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be _\bb_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be() const\n-2029 {\n-2030 return _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be;\n-2031 }\n-2032\n-2033 //===== query\n-2034\n-_\b2_\b0_\b3_\b6 bool _\be_\bx_\bi_\bs_\bt_\bs (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j) const\n-2037 {\n-2038#ifdef DUNE_ISTL_WITH_CHECKING\n-2039 if (i<0 || i>=_\bn) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"row index out of range\");\n-2040 if (j<0 || j>=_\bm) DUNE_THROW(_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br,\"column index out of range\");\n-2041#endif\n-2042 return (_\br[i].size() && _\br[i].find(j) != _\br[i]._\be_\bn_\bd());\n-2043 }\n-2044\n-2045\n-2046 protected:\n-2047 // state information\n-_\b2_\b0_\b4_\b8 _\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be; // row wise or whole matrix\n-_\b2_\b0_\b4_\b9 _\bB_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be _\br_\be_\ba_\bd_\by; // indicate the stage the matrix building is in\n-2050\n-2051 // The allocator used for memory management\n-_\b2_\b0_\b5_\b2 typename std::allocator_traits::template rebind_alloc _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_;\n-2053\n-_\b2_\b0_\b5_\b4 typename std::allocator_traits::template rebind_alloc\n-_\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_;\n-2055\n-_\b2_\b0_\b5_\b6 typename std::allocator_traits::template rebind_alloc\n-_\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_;\n-2057\n-2058 // size of the matrix\n-_\b2_\b0_\b5_\b9 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn; // number of rows\n-_\b2_\b0_\b6_\b0 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm; // number of columns\n-_\b2_\b0_\b6_\b1 mutable _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn_\bn_\bz_\b_; // number of nonzeroes contained in the matrix\n-_\b2_\b0_\b6_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_; //allocated size of a and j arrays, except in\n-implicit mode: nnz_==allocationsSize_\n-2063 // zero means that memory is allocated separately for each row.\n-2064\n-2065 // the rows are dynamically allocated\n-_\b2_\b0_\b6_\b6 _\br_\bo_\bw_\b__\bt_\by_\bp_\be* _\br; // [n] the individual rows having pointers into a,j arrays\n-2067\n-2068 // dynamically allocated memory\n-_\b2_\b0_\b6_\b9 B* _\ba; // [allocationSize] non-zero entries of the matrix in row-wise\n-ordering\n-2070 // If a single array of column indices is used, it can be shared\n-2071 // between different matrices with the same sparsity pattern\n-_\b2_\b0_\b7_\b2 std::shared_ptr _\bj_\b_; // [allocationSize] column indices of\n-entries\n-2073\n-2074 // additional data is needed in implicit buildmode\n-_\b2_\b0_\b7_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\ba_\bv_\bg;\n-_\b2_\b0_\b7_\b6 double _\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_;\n-2077\n-_\b2_\b0_\b7_\b8 typedef std::map, B> _\bO_\bv_\be_\br_\bf_\bl_\bo_\bw_\bT_\by_\bp_\be;\n-_\b2_\b0_\b7_\b9 _\bO_\bv_\be_\br_\bf_\bl_\bo_\bw_\bT_\by_\bp_\be _\bo_\bv_\be_\br_\bf_\bl_\bo_\bw;\n-2080\n-_\b2_\b0_\b8_\b1 void _\bs_\be_\bt_\bW_\bi_\bn_\bd_\bo_\bw_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br row)\n-2082 {\n-2083 _\br_\bo_\bw_\b__\bt_\by_\bp_\be current_row(_\ba,_\bj_\b_.get(),0); // Pointers to current row data\n-2084 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++, ++row) {\n-2085 // set row i\n-2086 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s = row->getsize();\n-2087\n-2088 if (s>0) {\n-2089 // setup pointers and size\n-2090 _\br[i].set(s,current_row.getptr(), current_row.getindexptr());\n-2091 // update pointer for next row\n-2092 current_row.setptr(current_row.getptr()+s);\n-2093 current_row.setindexptr(current_row.getindexptr()+s);\n-2094 } else{\n-2095 // empty row\n-2096 _\br[i].set(0,nullptr,nullptr);\n-2097 }\n-2098 }\n-2099 }\n-2100\n-2102\n-_\b2_\b1_\b0_\b6 void _\bs_\be_\bt_\bC_\bo_\bl_\bu_\bm_\bn_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br row)\n-2107 {\n-2108 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* jptr = _\bj_\b_.get();\n-2109 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; ++i, ++row) {\n-2110 // set row i\n-2111 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s = row->getsize();\n-2112\n-2113 if (s>0) {\n-2114 // setup pointers and size\n-2115 _\br[i].setsize(s);\n-2116 _\br[i].setindexptr(jptr);\n-2117 } else{\n-2118 // empty row\n-2119 _\br[i].set(0,nullptr,nullptr);\n-2120 }\n-2121\n-2122 // advance position in global array\n-2123 jptr += s;\n-2124 }\n-2125 }\n-2126\n-2128\n-_\b2_\b1_\b3_\b2 void _\bs_\be_\bt_\bD_\ba_\bt_\ba_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs()\n-2133 {\n-2134 B* aptr = _\ba;\n-2135 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; ++i) {\n-2136 // set row i\n-2137 if (_\br[i].getsize() > 0) {\n-2138 // setup pointers and size\n-2139 _\br[i].setptr(aptr);\n-2140 } else{\n-2141 // empty row\n-2142 _\br[i].set(0,nullptr,nullptr);\n-2143 }\n-2144\n-2145 // advance position in global array\n-2146 aptr += _\br[i].getsize();\n-2147 }\n-2148 }\n-2149\n-_\b2_\b1_\b5_\b1 void _\bc_\bo_\bp_\by_\bW_\bi_\bn_\bd_\bo_\bw_\bS_\bt_\br_\bu_\bc_\bt_\bu_\br_\be(const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& Mat)\n-2152 {\n-2153 _\bs_\be_\bt_\bW_\bi_\bn_\bd_\bo_\bw_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs(Mat._\bb_\be_\bg_\bi_\bn());\n-2154\n-2155 // copy data\n-2156 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++) _\br[i] = Mat._\br[i];\n-2157\n-2158 // finish off\n-2159 _\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be = _\br_\bo_\bw_\b__\bw_\bi_\bs_\be; // dummy\n-2160 _\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bt;\n-2161 }\n-2162\n-_\b2_\b1_\b6_\b8 void _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(bool deallocateRows=true)\n-2169 {\n-2170\n-2171 if (_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n-2172 return;\n-2173\n-2174 if (_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_>0)\n-2175 {\n-2176 // a,j_ have been allocated as one long vector\n-2177 _\bj_\b_.reset();\n-2178 if (_\ba)\n-2179 {\n-2180 for(B *aiter=_\ba+(_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_-1), *aend=_\ba-1; aiter!=aend; --aiter)\n-2181 std::allocator_traits::destroy(_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_, aiter);\n-2182 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.deallocate(_\ba,_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_);\n-2183 _\ba = nullptr;\n-2184 }\n-2185 }\n-2186 else if (_\br)\n-2187 {\n-2188 // check if memory for rows have been allocated individually\n-2189 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++)\n-2190 if (_\br[i].getsize()>0)\n-2191 {\n-2192 for (B *_\bc_\bo_\bl=_\br[i].getptr()+(_\br[i].getsize()-1),\n-2193 *colend = _\br[i].getptr()-1; _\bc_\bo_\bl!=colend; --_\bc_\bo_\bl) {\n-2194 std::allocator_traits::destroy(_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_, _\bc_\bo_\bl);\n-2195 }\n-2196 _\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.deallocate(_\br[i].getindexptr(),1);\n-2197 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.deallocate(_\br[i].getptr(),1);\n-2198 // clear out row data in case we don't want to deallocate the rows\n-2199 // otherwise we might run into a double free problem here later\n-2200 _\br[i].set(0,nullptr,nullptr);\n-2201 }\n-2202 }\n-2203\n-2204 // deallocate the rows\n-2205 if (_\bn>0 && deallocateRows && _\br) {\n-2206 for(_\br_\bo_\bw_\b__\bt_\by_\bp_\be *riter=_\br+(_\bn-1), *rend=_\br-1; riter!=rend; --riter)\n-2207 std::allocator_traits::destroy(_\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_,\n-riter);\n-2208 _\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.deallocate(_\br,_\bn);\n-2209 _\br = nullptr;\n-2210 }\n-2211\n-2212 // Mark matrix as not built at all.\n-2213 _\br_\be_\ba_\bd_\by=_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd;\n-2214\n-2215 }\n-2216\n-_\b2_\b2_\b3_\b5 void _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be allocationSize,\n-bool allocateRows, bool allocate_data)\n-2236 {\n-2237 // Store size\n-2238 _\bn = rows;\n-2239 _\bm = columns;\n-2240 _\bn_\bn_\bz_\b_ = allocationSize;\n-2241 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_ = allocationSize;\n-2242\n-2243 // allocate rows\n-2244 if(allocateRows) {\n-2245 if (_\bn>0) {\n-2246 if (_\br)\n-2247 DUNE_THROW(InvalidStateException,\"Rows have already been allocated, cannot\n-allocate a second time\");\n-2248 _\br = _\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.allocate(rows);\n-2249 // initialize row entries\n-2250 for(_\br_\bo_\bw_\b__\bt_\by_\bp_\be* ri=_\br; ri!=_\br+rows; ++ri)\n-2251 std::allocator_traits::construct(_\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_,\n-ri, _\br_\bo_\bw_\b__\bt_\by_\bp_\be());\n-2252 }else{\n-2253 _\br = 0;\n-2254 }\n-2255 }\n-2256\n-2257 // allocate a and j_ array\n-2258 if (allocate_data)\n-2259 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bD_\ba_\bt_\ba();\n-2260 // allocate column indices only if not yet present (enable sharing)\n-2261 if (_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_>0) {\n-2262 // we copy allocator and size to the deleter since _j may outlive this\n-class\n-2263 if (!_\bj_\b_.get())\n-2264 _\bj_\b_.reset(_\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.allocate(_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_),\n-2265 [alloc = _\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_, size = _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_](auto ptr) mutable {\n-2266 alloc.deallocate(ptr, size);\n-2267 });\n-2268 }else{\n-2269 _\bj_\b_.reset();\n-2270 }\n-2271\n-2272 // Mark the matrix as not built.\n-2273 _\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg;\n-2274 }\n-2275\n-_\b2_\b2_\b7_\b6 void _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bD_\ba_\bt_\ba()\n-2277 {\n-2278 if (_\ba)\n-2279 DUNE_THROW(InvalidStateException,\"Cannot allocate data array (already\n-allocated)\");\n-2280 if (_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_>0) {\n-2281 _\ba = _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_.allocate(_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_);\n-2282 // use placement new to call constructor that allocates\n-2283 // additional memory.\n-2284 new (_\ba) B[_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_];\n-2285 } else {\n-2286 _\ba = nullptr;\n-2287 }\n-2288 }\n-2289\n-_\b2_\b2_\b9_\b5 void _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\b__\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _m)\n-2296 {\n-2297 if (_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be != _\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt)\n-2298 DUNE_THROW(InvalidStateException,\"implicit_allocate() may only be called\n-in implicit build mode\");\n-2299 if (_\br_\be_\ba_\bd_\by != _\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd)\n-2300 DUNE_THROW(InvalidStateException,\"memory has already been allocated\");\n-2301\n-2302 // check to make sure the user has actually set the parameters\n-2303 if (_\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_ < 0)\n-2304 DUNE_THROW(InvalidStateException,\"You have to set the implicit build mode\n-parameters before starting to build the matrix\");\n-2305 //calculate size of overflow region, add buffer for row sort!\n-2306 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be osize = (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be) (_n*_\ba_\bv_\bg)*_\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_ + 4*_\ba_\bv_\bg;\n-2307 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_ = _n*_\ba_\bv_\bg + osize;\n-2308\n-2309 _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(_n, _m, _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_,true,true);\n-2310\n-2311 //set row pointers correctly\n-2312 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be* jptr = _\bj_\b_.get() + osize;\n-2313 B* aptr = _\ba + osize;\n-2314 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bn; i++)\n-2315 {\n-2316 _\br[i].set(0,aptr,jptr);\n-2317 jptr = jptr + _\ba_\bv_\bg;\n-2318 aptr = aptr + _\ba_\bv_\bg;\n-2319 }\n-2320\n-2321 _\br_\be_\ba_\bd_\by = _\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg;\n-2322 }\n-2323 };\n-2324\n-2325\n-2326 template\n-_\b2_\b3_\b2_\b7 struct FieldTraits< _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n-2328 {\n-_\b2_\b3_\b2_\b9 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\b _\bA_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b2_\b3_\b3_\b0 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename FieldTraits::real_type;\n-2331 };\n-2332\n-2335} // end namespace\n-2336\n-2337#endif\n-_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n-Helper functions for determining the vector/matrix block level.\n+1095} // end namespace\n+1096\n+1097\n+1098#endif\n _\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bi_\bl_\bu_\b._\bh_\bh\n+The incomplete LU factorization kernels.\n+_\bi_\bl_\bd_\bl_\b._\bh_\bh\n+Incomplete LDL decomposition.\n+_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n+_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\n+_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\n+Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n+generic way.\n+_\bd_\bi_\bl_\bu_\b._\bh_\bh\n+The diagonal incomplete LU factorization kernels.\n+_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh\n+_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR\n+#define DUNE_REGISTER_PRECONDITIONER(name,...)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:16\n+_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n+Define general, extensible interface for inverse operators.\n _\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\n Some handy generic functions for ISTL matrices.\n-_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-This file implements a vector space as a tensor product of a given vector\n-space. The number of compon...\n _\bc_\bo_\bl\n Col col\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bb\n+void bsorb(const M &A, X &x, const Y &b, const K &w)\n+SSOR step.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:646\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n+void dbjac(const M &A, X &x, const Y &b, const K &w)\n+Jacobi step.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:658\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bf\n+void bsorf(const M &A, X &x, const Y &b, const K &w)\n+SOR step.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:634\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bd_\be_\bc_\bo_\bm_\bp_\bo_\bs_\be\n+void bildl_decompose(Matrix &A)\n+compute ILDL decomposition of a symmetric matrix A\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ildl.hh:88\n _\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs\n-Statistics about compression achieved in implicit mode.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:88\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs_\b:_\b:_\bo_\bv_\be_\br_\bf_\bl_\bo_\bw_\b__\bt_\bo_\bt_\ba_\bl\n-size_type overflow_total\n-total number of elements written to the overflow area during construction.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:94\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs_\b:_\b:_\bm_\ba_\bx_\bi_\bm_\bu_\bm\n-size_type maximum\n-maximum number of non-zeroes per row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:92\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs_\b:_\b:_\ba_\bv_\bg\n-double avg\n-average number of non-zeroes per row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:90\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs_\b:_\b:_\bm_\be_\bm_\b__\br_\ba_\bt_\bi_\bo\n-double mem_ratio\n-fraction of wasted memory resulting from non-used overflow area.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:99\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br\n-A wrapper for uniform access to the BCRSMatrix during and after the build stage\n-in implicit build mod...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:117\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-Matrix::block_type block_type\n-The block_type of the underlying matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br\n-ImplicitMatrixBuilder(Matrix &m)\n-Creates an ImplicitMatrixBuilder for matrix m.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:170\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-M_ Matrix\n-The underlying matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:122\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br\n-ImplicitMatrixBuilder(Matrix &m, size_type rows, size_type cols, size_type\n-avg_cols_per_row, double overflow_fraction)\n-Sets up matrix m for implicit construction using the given parameters and\n-creates an ImplicitBmatrixu...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:194\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bM\n-size_type M() const\n-The number of columns in the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:217\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-The size_type of the underlying matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-row_object operator[](size_type i) const\n-Returns a proxy for entries in row i.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:205\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bN\n-size_type N() const\n-The number of rows in the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt\n-Proxy row object for entry access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:137\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\br_\bo_\bw_\b__\bo_\bb_\bj_\be_\bc_\bt_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-block_type & operator[](size_type j) const\n-Returns entry in column j.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< B >::field_type field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:488\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_\n-std::allocator_traits< A >::template rebind_alloc< row_type > rowAllocator_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2054\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n-bool exists(size_type i, size_type j) const\n-return true if (i,j) is in pattern\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2036\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be\n-BuildStage buildStage() const\n-The current build stage of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2022\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-Iterator begin()\n-Get iterator to first row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:671\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bp_\by_\bW_\bi_\bn_\bd_\bo_\bw_\bS_\bt_\br_\bu_\bc_\bt_\bu_\br_\be\n-void copyWindowStructure(const BCRSMatrix &Mat)\n-Copy the window structure from another matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bt_\br_\by\n-B & entry(size_type row, size_type col)\n-Returns reference to entry (row,col) of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1317\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bh_\bv\n-void mmhv(const X &x, Y &y) const\n-y -= A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1841\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bh_\bv\n-void usmhv(const field_type &alpha, const X &x, Y &y) const\n-y += alpha A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1864\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bt_\bv\n-void umtv(const X &x, Y &y) const\n-y += A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1751\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bS_\bi_\bz_\be_\b_\n-double compressionBufferSize_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2076\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm\n-size_type m\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2060\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-RealRowIterator< const row_type > const_iterator\n-The const iterator over the matrix rows.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:703\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n-void allocate(size_type rows, size_type columns, size_type allocationSize, bool\n-allocateRows, bool allocate_data)\n-Allocate memory for the matrix structure.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2235\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bx_\bp_\by\n-BCRSMatrix & axpy(field_type alpha, const BCRSMatrix &b)\n-Add the scaled entries of another matrix to this one.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1621\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n-FieldTraits< ft >::real_type infinity_norm_real() const\n-simplified infinity norm (uses Manhattan norm for complex values)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1934\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\b~_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-~BCRSMatrix()\n-destructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:821\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bD_\ba_\bt_\ba\n-void allocateData()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2276\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n-void deallocate(bool deallocateRows=true)\n-deallocate memory of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2168\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator RowIterator\n-rename the iterators for easier access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:697\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-row_type & operator[](size_type i)\n-random access to the rows\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:545\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix()\n-an empty matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:745\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs\n-void endrowsizes()\n-indicate that size of all rows is defined\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1146\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be\n-void incrementrowsize(size_type i, size_type s=1)\n-increment size of row i by s (1 by default)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1135\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bt_\bv\n-void mtv(const X &x, Y &y) const\n-y = A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1736\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bh_\bv\n-void umhv(const X &x, Y &y) const\n-y += A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1818\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bn_\bo_\bn_\bz_\be_\br_\bo_\be_\bs\n-size_type nonzeroes() const\n-number of blocks that are stored (the number of blocks that possibly are\n-nonzero)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2013\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bi_\bo_\bn_\bS_\bi_\bz_\be_\b_\n-size_type allocationSize_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2062\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator ConstRowIterator\n-rename the const row iterator for easier access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:734\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\be_\ba_\bd_\by\n-BuildStage ready\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2049\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bN_\bo_\bS_\bo_\br_\bt\n-void setIndicesNoSort(size_type row, It begin, It end)\n-Set all column indices for row from the given iterator range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1232\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\b__\bm_\bo_\bd_\be\n-BuildMode build_mode\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2048\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be\n-void setrowsize(size_type i, size_type s)\n-Set number of indices in row i to s.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-RealRowIterator< row_type > Iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:668\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bn_\bn_\bz_\b_\n-size_type nnz_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2061\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n-BCRSMatrix & operator*=(const field_type &k)\n-vector space multiplication with scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1513\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_\n-std::allocator_traits< A >::template rebind_alloc< size_type > sizeAllocator_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2056\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-RealRowIterator< row_type > iterator\n-The iterator over the (mutable matrix rows.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:667\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bt_\bv\n-void usmtv(const field_type &alpha, const X &x, Y &y) const\n-y += alpha A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1795\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-ConstIterator beforeBegin() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:728\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-RealRowIterator< const row_type > ConstIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:704\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-Iterator beforeBegin()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:691\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba\n-B * a\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2069\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be\n-BuildMode\n-we support two modes\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:506\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt\n-@ implicit\n-Build entries randomly with an educated guess for the number of entries per\n-row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:535\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn\n-@ unknown\n-Build mode not set!\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:539\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\ba_\bn_\bd_\bo_\bm\n-@ random\n-Build entries randomly.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:526\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bw_\bi_\bs_\be\n-@ row_wise\n-Build in a row-wise manner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:517\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix(size_type _n, size_type _m, size_type _nnz, BuildMode bm)\n-matrix with known number of nonzeroes\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:752\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n-Imp::CompressedBlockVectorWindow< B, size_type > row_type\n-implement row_type with compressed vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:500\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bS_\bt_\ba_\bt_\bi_\bs_\bt_\bi_\bc_\bs\n-::Dune::CompressionStatistics< size_type > CompressionStatistics\n-The type for the statistics object returned by compress()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:503\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n-BCRSMatrix & operator-=(const BCRSMatrix &b)\n-Subtract the entries of another matrix from this one.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1596\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix(const BCRSMatrix &Mat)\n-copy constructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:802\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-Iterator end()\n-Get iterator to one beyond last row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:677\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br\n-row_type * r\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2066\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-void setIndices(size_type row, It begin, It end)\n-Set all column indices for row from the given iterator range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1255\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx\n-void addindex(size_type row, size_type col)\n-add index (row,col) to the matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bO_\bv_\be_\br_\bf_\bl_\bo_\bw_\bT_\by_\bp_\be\n-std::map< std::pair< size_type, size_type >, B > OverflowType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2078\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::Iterator ColIterator\n-Iterator for the entries of each row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:700\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm\n-FieldTraits< field_type >::real_type frobenius_norm() const\n-frobenius norm: sqrt(sum over squared values of entries)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1906\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-The type for the index access and the size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n-BCRSMatrix & operator/=(const field_type &k)\n-vector space division by scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1541\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bv_\be_\br_\bf_\bl_\bo_\bw\n-OverflowType overflow\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2079\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n-BCRSMatrix & operator+=(const BCRSMatrix &b)\n-Add the entries of another matrix to this one.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1574\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix(size_type _n, size_type _m, size_type _avg, double\n-compressionBufferSize, BuildMode bm)\n-construct matrix with a known average number of entries per row\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:781\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd\n-CreateIterator createend()\n-get create iterator pointing to one after the last block\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2\n-FieldTraits< field_type >::real_type frobenius_norm2() const\n-square of frobenius norm, need for block recursion\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1889\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-Iterator beforeEnd()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:684\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::ConstIterator ConstColIterator\n-Const iterator to the entries of a row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:737\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bv\n-void usmv(F &&alpha, const X &x, Y &y) const\n-y += alpha A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1713\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bg_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be\n-size_type getrowsize(size_type i) const\n-get current number of indices in row i\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n-size_type M() const\n-number of columns (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2007\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bn\n-size_type n\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2059\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn\n-CreateIterator createbegin()\n-get initial create iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1094\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bu_\bi_\bl_\bd_\bS_\bt_\ba_\bg_\be\n-BuildStage\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:469\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bS_\bi_\bz_\be_\bs_\bB_\bu_\bi_\bl_\bt\n-@ rowSizesBuilt\n-The row sizes of the matrix are known.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:480\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bu_\bi_\bl_\bt\n-@ built\n-The matrix structure is fully built.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:482\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bn_\bo_\bt_\bb_\bu_\bi_\bl_\bt\n-@ notbuilt\n-Matrix is not built at all, no memory has been allocated, build mode and size\n-can still be set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:471\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bn_\bo_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\be_\bd\n-@ notAllocated\n-Matrix is not built at all, no memory has been allocated, build mode and size\n-can still be set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:473\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bi_\bn_\bg\n-@ building\n-Matrix is currently being built, some memory has been allocated, build mode and\n-size are fixed.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:475\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be\n-BuildMode buildMode() const\n-The currently selected build mode of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2028\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bv\n-void mmv(const X &x, Y &y) const\n-y -= A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1690\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n-FieldTraits< ft >::real_type infinity_norm() const\n-infinity norm (row sum norm, how to generalize for blocks?)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1914\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n-void mv(const X &x, Y &y) const\n-y = A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1641\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-B block_type\n-export the type representing the components\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:491\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bt_\bv\n-void mmtv(const X &x, Y &y) const\n-y -= A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1774\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bv_\bg\n-size_type avg\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2075\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bv\n-void umv(const X &x, Y &y) const\n-y += A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1667\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\b__\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n-void implicit_allocate(size_type _n, size_type _m)\n-organizes allocation implicit mode calculates correct array size to be\n-allocated and sets the the win...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2295\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-void setImplicitBuildModeParameters(size_type _avg, double\n-compressionBufferSize)\n-Set parameters needed for creation in implicit build mode.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:886\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-BCRSMatrix(size_type _n, size_type _m, BuildMode bm)\n-matrix with unknown number of nonzeroes\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:761\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs\n-void endindices()\n-indicate that all indices are defined, check consistency\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bm_\bp_\br_\be_\bs_\bs\n-CompressionStatistics compress()\n-Finishes the buildstage in implicit mode.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1381\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bD_\ba_\bt_\ba_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n-void setDataPointers()\n-Set data pointers for all rows.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b_\n-std::allocator_traits< A >::template rebind_alloc< B > allocator_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2052\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-size_type N() const\n-number of rows (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be\n-void setBuildMode(BuildMode bm)\n-Sets the build mode of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:830\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n-void setSize(size_type rows, size_type columns, size_type nnz=0)\n-Set the size of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:858\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bj_\b_\n-std::shared_ptr< size_type > j_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2072\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bW_\bi_\bn_\bd_\bo_\bw_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n-void setWindowPointers(ConstRowIterator row)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2081\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-BCRSMatrix & operator=(const BCRSMatrix &Mat)\n-assignment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:908\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bC_\bo_\bl_\bu_\bm_\bn_\bP_\bo_\bi_\bn_\bt_\be_\br_\bs\n-void setColumnPointers(ConstRowIterator row)\n-Copy row sizes from iterator range starting at row and set column index\n-pointers for all rows.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-ConstIterator end() const\n-Get const iterator to one beyond last row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:714\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-ConstIterator begin() const\n-Get const iterator to first row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:708\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n-A allocator_type\n-export the allocator type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:494\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-ConstIterator beforeEnd() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:721\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator access to matrix rows\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:575\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-RealRowIterator()\n-empty constructor, use with care!\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:592\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const RealRowIterator< ValueType > &other) const\n-equality\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:620\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n-std::remove_const< T >::type ValueType\n-The unqualified value type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:579\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-RealRowIterator(const RealRowIterator< ValueType > &it)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:596\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const RealRowIterator< const ValueType > &other) const\n-equality\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:627\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-RealRowIterator(row_type *_p, size_type _i)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bb_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n+void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool\n+isLowerTriangular=false)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ildl.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+void blockDILUDecomposition(M &A, std::vector< typename M::block_type > &Dinv_)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dilu.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n+void blockDILUBacksolve(const M &A, const std::vector< typename M::block_type >\n+Dinv_, X &v, const Y &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dilu.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bt_\bT_\bo_\bC_\bR_\bS\n+void convertToCRS(const M &A, CRS &lower, CRS &upper, InvVector &inv)\n+convert ILU decomposition into CRS format for lower and upper triangular and\n+inverse.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:307\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n+void blockILUBacksolve(const M &A, X &v, const Y &d)\n+LU backsolve with stored inverse.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:94\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+void blockILU0Decomposition(M &A)\n+compute ILU decomposition of A. A is overwritten by its decomposition\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+void blockILUDecomposition(const M &A, int n, M &ILU)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:167\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bL\n+compile-time parameter for block recursion depth\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS\n+a simple compressed row storage matrix class\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:259\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+derive error class from the base class in common\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk\n+static void check(const Matrix &mat)\n+Check whether the a matrix has diagonal values on blocklevel recursion levels.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A linear operator exporting itself in matrix form.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Turns an InverseOperator into a Preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+O::range_type range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+O::domain_type domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(domain_type &)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:112\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+range_type::field_type field_type\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< scalar_field_type >::real_type real_field_type\n+real scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Simd::Scalar< field_type > scalar_field_type\n+scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\br_\be\n+virtual void pre(domain_type &, range_type &)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:102\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+InverseOperator2Preconditioner(InverseOperator &inverse_operator)\n+Construct the preconditioner from the solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+O InverseOperator\n+type of the wrapped inverse operator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b2_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(domain_type &v, const range_type &d)\n+Apply one step of the preconditioner to the system A(v)=d.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:105\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n+Sequential SSOR preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(X &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n+SeqSSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n+const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:183\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n+SeqSSOR(const M &A, const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:200\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:234\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Simd::Scalar< field_type > scalar_field_type\n+scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:147\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+The matrix type the preconditioner is for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:145\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &v, const Y &d)\n+Apply the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:217\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bp_\br_\be\n+virtual void pre(X &x, Y &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:209\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< scalar_field_type >::real_type real_field_type\n+real scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n+SeqSSOR(const M &A, int n, real_field_type w)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:164\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR\n+Sequential SOR preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:262\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR\n+SeqSOR(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n+const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:303\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+The matrix type the preconditioner is for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:265\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< scalar_field_type >::real_type real_field_type\n+real scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:275\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(X &v, const Y &d)\n+Apply the preconditioner in a special direction.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:351\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:267\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(X &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:368\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bp_\br_\be\n+virtual void pre(X &x, Y &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:329\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Simd::Scalar< field_type > scalar_field_type\n+scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:273\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:372\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &v, const Y &d)\n+Apply the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:337\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:269\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR\n+SeqSOR(const M &A, const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:320\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:271\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR\n+SeqSOR(const M &A, int n, real_field_type w)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:284\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc\n+The sequential jacobian preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:413\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(X &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:500\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc\n+SeqJac(const M &A, const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:471\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &v, const Y &d)\n+Apply the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:488\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+The matrix type the preconditioner is for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:416\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Simd::Scalar< field_type > scalar_field_type\n+scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:424\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc\n+SeqJac(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n+const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:454\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:422\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bp_\br_\be\n+virtual void pre(X &x, Y &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:480\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:418\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< scalar_field_type >::real_type real_field_type\n+real scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:426\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:504\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc\n+SeqJac(const M &A, int n, real_field_type w)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:435\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:420\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU\n+Sequential DILU preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:564\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bw_\bN_\bo_\bt_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\b_\n+const bool wNotIdentity_\n+true if w != 1.0\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:681\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename X::field_type field_type\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:576\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\b__\bw\n+const real_field_type _w\n+The relaxation factor to use.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:679\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\b__\bA_\b_\n+const M & _A_\n+The matrix we operate on.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:677\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU\n+SeqDILU(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n+const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:612\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Simd::Scalar< field_type > scalar_field_type\n+scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:579\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(X &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:664\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename FieldTraits< scalar_field_type >::real_type real_field_type\n+real scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:581\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+The matrix type the preconditioner is for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:567\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:571\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+typename matrix_type::block_type block_type\n+block type of matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:569\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &v, const Y &d)\n+Apply the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:648\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bp_\br_\be\n+virtual void pre(X &x, Y &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:639\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU\n+SeqDILU(const M &A, real_field_type w)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:589\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:669\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:573\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU\n+SeqDILU(const M &A, const ParameterTree &config)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:629\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bD_\bI_\bL_\bU_\b:_\b:_\bD_\bi_\bn_\bv_\b_\n+std::vector< block_type > Dinv_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:675\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n+Sequential ILU preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:697\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(X &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:843\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n+SeqILU(const M &A, int n, real_field_type w, const bool resort=false)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:777\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bp_\br_\be\n+virtual void pre(X &x, Y &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:813\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &v, const Y &d)\n+Apply the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:821\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS\n+ILU::CRS< block_type, typename M::allocator_type > CRS\n+type of ILU storage\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:717\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:706\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bl_\bo_\bw_\be_\br_\b_\n+CRS lower_\n+The ILU(n) decomposition of the matrix. As storage a CRS structure is used.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:857\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bw_\bN_\bo_\bt_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\b_\n+const bool wNotIdentity_\n+true if w != 1.0\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:864\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n+SeqILU(const M &A, const ParameterTree &config)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:763\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+std::remove_const< M >::type matrix_type\n+The matrix type the preconditioner is for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:700\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+matrix_type::block_type block_type\n+block type of matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:702\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< scalar_field_type >::real_type real_field_type\n+real scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:714\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:709\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:847\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n+SeqILU(const M &A, real_field_type w, const bool resort=false)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:726\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bw_\b_\n+const real_field_type w_\n+The relaxation factor to use.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:862\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n+SeqILU(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n+const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:745\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:704\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bi_\bn_\bv_\b_\n+std::vector< block_type, typename matrix_type::allocator_type > inv_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:859\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Simd::Scalar< field_type > scalar_field_type\n+scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:712\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bI_\bL_\bU_\b_\n+std::unique_ptr< matrix_type > ILU_\n+The ILU(n) decomposition of the matrix. As storage a BCRSMatrix is used.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:854\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU_\b:_\b:_\bu_\bp_\bp_\be_\br_\b_\n+CRS upper_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:858\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn\n+Richardson preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:878\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:885\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:943\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:883\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bp_\br_\be\n+virtual void pre(X &x, Y &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:920\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn\n+Richardson(real_field_type w=1.0)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:896\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(X &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:939\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< scalar_field_type >::real_type real_field_type\n+real scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:889\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Simd::Scalar< field_type > scalar_field_type\n+scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:887\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn\n+Richardson(const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:911\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:881\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &v, const Y &d)\n+Apply the precondioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:928\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL\n+sequential ILDL preconditioner\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:972\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL\n+SeqILDL(const matrix_type &A, const ParameterTree &config)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1018\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL\n+SeqILDL(const matrix_type &A, real_field_type relax=real_field_type(1))\n constructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:587\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n-std::ptrdiff_t distanceTo(const RealRowIterator< const ValueType > &other)\n-const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:613\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n-size_type index() const\n-return index\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:602\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n-std::ptrdiff_t distanceTo(const RealRowIterator< ValueType > &other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:607\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator class for sequential creation of blocks\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:954\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const CreateIterator &it) const\n-equality\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1049\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-CreateIterator & operator++()\n-prefix increment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:974\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n-size_type index() const\n-The number of the row that the iterator currently points to.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1055\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const CreateIterator &it) const\n-inequality\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1043\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-CreateIterator(BCRSMatrix &_Mat, size_type _i)\n-constructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:957\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n-void insert(size_type j)\n-put column index in row\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1061\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bt_\ba_\bi_\bn_\bs\n-bool contains(size_type j)\n-return true if column index is in row\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1067\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n-size_type size() const\n-Get the current row size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1076\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename BCRSMatrix< B, A >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2329\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-typename FieldTraits< field_type >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2330\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\bE_\br_\br_\bo_\br\n-Error specific to BCRSMatrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bm_\bp_\bl_\bi_\bc_\bi_\bt_\bM_\bo_\bd_\be_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\bi_\bo_\bn_\bB_\bu_\bf_\bf_\be_\br_\bE_\bx_\bh_\ba_\bu_\bs_\bt_\be_\bd\n-Thrown when the compression buffer used by the implicit BCRSMatrix construction\n-is exhausted.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-A generic dynamic dense matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-Type for indices and sizes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:577\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-T block_type\n-Export the type representing the components.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:568\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:538\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1030\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+domain type of the preconditioner\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:980\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bp_\bo_\bs_\bt\n+void post(X &x) override\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1081\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+range type of the preconditioner\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:982\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+std::remove_const_t< M > matrix_type\n+type of matrix the preconditioner is for\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:978\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(X &v, const Y &d) override\n+Apply one step of the preconditioner to the system A(v)=d.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1074\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\br_\be_\ba_\bl_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< scalar_field_type >::real_type real_field_type\n+real scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:988\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL\n+SeqILDL(const std::shared_ptr< const AssembledLinearOperator< M, X, Y > > &A,\n+const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1002\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bp_\br_\be\n+void pre(X &x, Y &b) override\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1070\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Simd::Scalar< field_type > scalar_field_type\n+scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:986\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+field type of the preconditioner\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:984\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bD_\bL_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+SolverCategory::Category category() const override\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:1085\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Abstract base class for all solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+static Category category(const OP &op, decltype(op.category()) *=nullptr)\n+Helperfunction to extract the solver category either from an enum, or from the\n+newly introduced virtu...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00074.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00074.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: solvers.hh File Reference\n+dune-istl: allocator.hh File Reference\n \n \n \n \n \n \n \n@@ -72,110 +72,49 @@\n
  • dune
  • istl
  • \n
    \n
    \n \n+
    allocator.hh File Reference
    \n
    \n
    \n-\n-

    Implementations of the inverse operator interface. \n-More...

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

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n

    \n 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...
    struct  Dune::exists< T >
     
    class  Dune::GeneralizedPCGSolver< X >
     Generalized preconditioned conjugate gradient solver. More...
    struct  Dune::DefaultAllocatorTraits< T, typename >
     
    class  Dune::RestartedFCGSolver< X >
     Accelerated flexible conjugate gradient method. More...
    struct  Dune::DefaultAllocatorTraits< T, std::void_t< typename T::allocator_type > >
     
    class  Dune::CompleteFCGSolver< X >
     Complete flexible conjugate gradient method. More...
    struct  Dune::AllocatorTraits< T >
     
    \n \n \n \n

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n

    \n-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 >())
     

    \n+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 >
     
    \n-

    Detailed Description

    \n-

    Implementations of the inverse operator interface.

    \n-

    This file provides various preconditioned Krylov methods.

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

    Class for using SPQR with ISTL matrices. \n+More...

    \n+
    #include <complex>
    \n #include <type_traits>
    \n-#include <dune/common/typetraits.hh>
    \n+#include <SuiteSparseQR.hpp>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/istl/bccsmatrixinitializer.hh>
    \n+#include <dune/istl/solvers.hh>
    \n+#include <dune/istl/solvertype.hh>
    \n+#include <dune/istl/solverfactory.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n

    \n Classes

    struct  Dune::exists< T >
    class  Dune::SPQR< Matrix >
     Use the SPQR package to directly solve linear systems – empty default class. More...
     
    class  Dune::SPQR< BCRSMatrix< FieldMatrix< T, n, m >, A > >
     The SPQR direct sparse solver for matrices of type BCRSMatrix. More...
     
    struct  Dune::IsDirectSolver< SPQR< BCRSMatrix< T, A > > >
     
    struct  Dune::StoresColumnCompressed< SPQR< BCRSMatrix< T, A > > >
     
    struct  Dune::DefaultAllocatorTraits< T, typename >
    struct  Dune::SPQRCreator
     
    struct  Dune::DefaultAllocatorTraits< T, std::void_t< typename T::allocator_type > >
    struct  Dune::SPQRCreator::isValidBlock< class >
     
    struct  Dune::AllocatorTraits< T >
    struct  Dune::SPQRCreator::isValidBlock< FieldVector< double, 1 > >
     
    \n \n \n \n

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n

    \n-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 >
     

    \n+Functions

     Dune::DUNE_REGISTER_DIRECT_SOLVER ("spqr", Dune::SPQRCreator())
     
    \n-
    \n+

    Detailed Description

    \n+

    Class for using SPQR with ISTL matrices.

    \n+
    Author
    Marco Agnese, Andrea Sacconi
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,35 +1,49 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs\n-allocator.hh File Reference\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+spqr.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b)\n+Class for using SPQR with ISTL matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n #include \n-#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs_\b<_\b _\bT_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\b>\n+\u00a0 Use the SPQR package to directly solve linear systems \u2013 empty default\n+ class. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0 The SPQR direct sparse solver for matrices of type _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bT_\b:_\b:\n- _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\b _\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b,_\b _\b1_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be = typename _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs< T >::type\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bb_\bo_\bu_\bn_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be = typename std::allocator_traits< typename\n- _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs< T >::type >::template rebind_alloc< X >\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"spqr\", _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br())\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Class for using SPQR with ISTL matrices.\n+ Author\n+ Marco Agnese, Andrea Sacconi\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00077_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00077_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: allocator.hh Source File\n+dune-istl: spqr.hh Source File\n \n \n \n \n \n \n \n@@ -74,76 +74,400 @@\n \n
    \n \n
    \n \n
    \n-
    allocator.hh
    \n+
    spqr.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    3#ifndef DUNE_ISTL_ALLOCATOR_HH
    \n-
    4#define DUNE_ISTL_ALLOCATOR_HH
    \n-
    5
    \n-
    6#include <memory>
    \n-
    7#include <type_traits>
    \n-
    8
    \n-
    9#include <dune/common/typetraits.hh>
    \n-
    10
    \n-
    \n-
    11namespace Dune {
    \n+
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    4// vi: set et ts=4 sw=2 sts=2:
    \n+
    5#ifndef DUNE_ISTL_SPQR_HH
    \n+
    6#define DUNE_ISTL_SPQR_HH
    \n+
    7
    \n+
    8#if HAVE_SUITESPARSE_SPQR || defined DOXYGEN
    \n+
    9
    \n+
    10#include <complex>
    \n+
    11#include <type_traits>
    \n
    12
    \n-
    13 template<typename T>
    \n-
    \n-
    14 struct exists{
    \n-
    15 static const bool value = true;
    \n-
    16 };
    \n-
    \n-
    17
    \n-
    18 template<typename T, typename = void>
    \n-
    \n-\n-
    20 {
    \n-
    21 using type = std::allocator<T>;
    \n-
    22 };
    \n-
    \n-
    23
    \n-
    24 template<typename T>
    \n-
    \n-
    25 struct DefaultAllocatorTraits<T, std::void_t<typename T::allocator_type> >
    \n-
    26 {
    \n-
    27 using type = typename T::allocator_type;
    \n-
    28 };
    \n-
    \n-
    29
    \n-
    30 template<typename T>
    \n-\n-
    32
    \n-
    33 template<typename T>
    \n-\n-
    35
    \n-
    36 template<typename T, typename X>
    \n-
    37 using ReboundAllocatorType = typename std::allocator_traits<typename AllocatorTraits<T>::type>::template rebind_alloc<X>;
    \n-
    38
    \n-
    39} // end namespace Dune
    \n-
    \n+
    13#include <SuiteSparseQR.hpp>
    \n+
    14
    \n+
    15#include <dune/common/exceptions.hh>
    \n+
    16
    \n+\n+
    18#include <dune/istl/solvers.hh>
    \n+\n+\n+
    21
    \n+
    22namespace Dune {
    \n+
    34 // forward declarations
    \n+
    35 template<class M, class T, class TM, class TD, class TA>
    \n+
    36 class SeqOverlappingSchwarz;
    \n+
    37
    \n+
    38 template<class T, bool tag>
    \n+
    39 struct SeqOverlappingSchwarzAssemblerHelper;
    \n
    40
    \n-
    41#endif // DUNE_ISTL_ALLOCATOR_HH
    \n-
    STL namespace.
    \n+
    46 template<class Matrix>
    \n+
    \n+
    47 class SPQR
    \n+
    48 {};
    \n+
    \n+
    49
    \n+
    63 template<typename T, typename A, int n, int m>
    \n+
    \n+
    64 class SPQR<BCRSMatrix<FieldMatrix<T,n,m>,A > >
    \n+
    65 : public InverseOperator<BlockVector<FieldVector<T,m>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > >,
    \n+
    66 BlockVector<FieldVector<T,n>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > > >
    \n+
    67 {
    \n+
    68 public:
    \n+\n+\n+
    73 typedef ISTL::Impl::BCCSMatrix<T,int> SPQRMatrix;
    \n+
    75 typedef ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<FieldMatrix<T,n,m>,A>, int> MatrixInitializer;
    \n+
    77 typedef Dune::BlockVector<FieldVector<T,m>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > > domain_type;
    \n+
    79 typedef Dune::BlockVector<FieldVector<T,n>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > > range_type;
    \n+
    80
    \n+
    \n+\n+
    83 {
    \n+\n+
    85 }
    \n+
    \n+
    86
    \n+
    \n+
    95 SPQR(const Matrix& matrix, int verbose=0) : matrixIsLoaded_(false), verbose_(verbose)
    \n+
    96 {
    \n+
    97 //check whether T is a supported type
    \n+
    98 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n+
    99 "Unsupported Type in SPQR (only double and std::complex<double> supported)");
    \n+
    100 cc_ = new cholmod_common();
    \n+
    101 cholmod_l_start(cc_);
    \n+
    102 setMatrix(matrix);
    \n+
    103 }
    \n+
    \n+
    104
    \n+
    \n+
    113 SPQR(const Matrix& matrix, int verbose, bool) : matrixIsLoaded_(false), verbose_(verbose)
    \n+
    114 {
    \n+
    115 //check whether T is a supported type
    \n+
    116 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n+
    117 "Unsupported Type in SPQR (only double and std::complex<double> supported)");
    \n+
    118 cc_ = new cholmod_common();
    \n+
    119 cholmod_l_start(cc_);
    \n+
    120 setMatrix(matrix);
    \n+
    121 }
    \n+
    \n+
    122
    \n+
    \n+
    132 SPQR(const Matrix& matrix, const ParameterTree& config)
    \n+
    133 : SPQR(matrix, config.get<int>("verbose", 0))
    \n+
    134 {}
    \n+
    \n+
    135
    \n+
    \n+
    137 SPQR() : matrixIsLoaded_(false), verbose_(0)
    \n+
    138 {
    \n+
    139 //check whether T is a supported type
    \n+
    140 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n+
    141 "Unsupported Type in SPQR (only double and std::complex<double> supported)");
    \n+
    142 cc_ = new cholmod_common();
    \n+
    143 cholmod_l_start(cc_);
    \n+
    144 }
    \n+
    \n+
    145
    \n+
    \n+
    147 virtual ~SPQR()
    \n+
    148 {
    \n+
    149 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_)
    \n+
    150 free();
    \n+
    151 cholmod_l_finish(cc_);
    \n+
    152 }
    \n+
    \n+
    153
    \n+
    \n+\n+
    156 {
    \n+
    157 const std::size_t numRows(spqrMatrix_.N());
    \n+
    158 // fill B
    \n+
    159 for(std::size_t k = 0; k != numRows/n; ++k)
    \n+
    160 for (int l = 0; l < n; ++l)
    \n+
    161 (static_cast<T*>(B_->x))[n*k+l] = b[k][l];
    \n+
    162
    \n+
    163 cholmod_dense* BTemp = B_;
    \n+
    164 B_ = SuiteSparseQR_qmult<T>(0, spqrfactorization_, B_, cc_);
    \n+
    165 cholmod_dense* X = SuiteSparseQR_solve<T>(1, spqrfactorization_, B_, cc_);
    \n+
    166 cholmod_l_free_dense(&BTemp, cc_);
    \n+
    167
    \n+
    168 const std::size_t numCols(spqrMatrix_.M());
    \n+
    169 // fill x
    \n+
    170 for(std::size_t k = 0; k != numCols/m; ++k)
    \n+
    171 for (int l = 0; l < m; ++l)
    \n+
    172 x[k][l] = (static_cast<T*>(X->x))[m*k+l];
    \n+
    173
    \n+
    174 cholmod_l_free_dense(&X, cc_);
    \n+
    175 // this is a direct solver
    \n+
    176 res.iterations = 1;
    \n+
    177 res.converged = true;
    \n+
    178 if(verbose_ > 0)
    \n+
    179 {
    \n+
    180 std::cout<<std::endl<<"Solving with SuiteSparseQR"<<std::endl;
    \n+
    181 std::cout<<"Flops Taken: "<<cc_->SPQR_flopcount<<std::endl;
    \n+
    182 std::cout<<"Analysis Time: "<<cc_->SPQR_analyze_time<<" s"<<std::endl;
    \n+
    183 std::cout<<"Factorize Time: "<<cc_->SPQR_factorize_time<<" s"<<std::endl;
    \n+
    184 std::cout<<"Backsolve Time: "<<cc_->SPQR_solve_time<<" s"<<std::endl;
    \n+
    185 std::cout<<"Peak Memory Usage: "<<cc_->memory_usage<<" bytes"<<std::endl;
    \n+
    186 std::cout<<"Rank Estimate: "<<cc_->SPQR_istat[4]<<std::endl<<std::endl;
    \n+
    187 }
    \n+
    188 }
    \n+
    \n+
    189
    \n+
    \n+
    191 virtual void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
    \n+
    192 {
    \n+
    193 apply(x, b, res);
    \n+
    194 }
    \n+
    \n+
    195
    \n+
    \n+
    196 void setOption([[maybe_unused]] unsigned int option, [[maybe_unused]] double value)
    \n+
    197 {}
    \n+
    \n+
    198
    \n+
    \n+
    200 void setMatrix(const Matrix& matrix)
    \n+
    201 {
    \n+
    202 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_)
    \n+
    203 free();
    \n+
    204
    \n+
    205 if (spqrMatrix_.N() + spqrMatrix_.M() + spqrMatrix_.nonzeroes() != 0)
    \n+
    206 spqrMatrix_.free();
    \n+
    207 spqrMatrix_.setSize(MatrixDimension<Matrix>::rowdim(matrix),
    \n+\n+
    209 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(spqrMatrix_);
    \n+
    210
    \n+
    211 copyToBCCSMatrix(initializer, matrix);
    \n+
    212
    \n+
    213 decompose();
    \n+
    214 }
    \n+
    \n+
    215
    \n+
    216 template<class S>
    \n+
    \n+
    217 void setSubMatrix(const Matrix& matrix, const S& rowIndexSet)
    \n+
    218 {
    \n+
    219 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_)
    \n+
    220 free();
    \n+
    221
    \n+
    222 if (spqrMatrix_.N() + spqrMatrix_.M() + spqrMatrix_.nonzeroes() != 0)
    \n+
    223 spqrMatrix_.free();
    \n+
    224
    \n+
    225 spqrMatrix_.setSize(rowIndexSet.size()*MatrixDimension<Matrix>::rowdim(matrix) / matrix.N(),
    \n+
    226 rowIndexSet.size()*MatrixDimension<Matrix>::coldim(matrix) / matrix.M());
    \n+
    227 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(spqrMatrix_);
    \n+
    228
    \n+
    229 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(matrix,rowIndexSet));
    \n+
    230
    \n+
    231 decompose();
    \n+
    232 }
    \n+
    \n+
    233
    \n+
    \n+
    238 inline void setVerbosity(int v)
    \n+
    239 {
    \n+
    240 verbose_=v;
    \n+
    241 }
    \n+
    \n+
    242
    \n+
    \n+
    247 inline SuiteSparseQR_factorization<T>* getFactorization()
    \n+
    248 {
    \n+
    249 return spqrfactorization_;
    \n+
    250 }
    \n+
    \n+
    251
    \n+
    \n+\n+
    257 {
    \n+
    258 return spqrMatrix_;
    \n+
    259 }
    \n+
    \n+
    260
    \n+
    \n+
    265 void free()
    \n+
    266 {
    \n+
    267 cholmod_l_free_sparse(&A_, cc_);
    \n+
    268 cholmod_l_free_dense(&B_, cc_);
    \n+
    269 SuiteSparseQR_free<T>(&spqrfactorization_, cc_);
    \n+
    270 spqrMatrix_.free();
    \n+
    271 matrixIsLoaded_ = false;
    \n+
    272 }
    \n+
    \n+
    273
    \n+
    \n+
    275 inline const char* name()
    \n+
    276 {
    \n+
    277 return "SPQR";
    \n+
    278 }
    \n+
    \n+
    279
    \n+
    280 private:
    \n+
    281 template<class M,class X, class TM, class TD, class T1>
    \n+\n+
    283
    \n+\n+
    285
    \n+
    287 void decompose()
    \n+
    288 {
    \n+
    289 const std::size_t nrows(spqrMatrix_.N());
    \n+
    290 const std::size_t ncols(spqrMatrix_.M());
    \n+
    291 const std::size_t nnz(spqrMatrix_.getColStart()[ncols]);
    \n+
    292
    \n+
    293 // initialise the matrix A (sorted, packed, unsymmetric, real entries)
    \n+
    294 A_ = cholmod_l_allocate_sparse(nrows, ncols, nnz, 1, 1, 0, 1, cc_);
    \n+
    295
    \n+
    296 // copy all the entries of Ap, Ai, Ax
    \n+
    297 for(std::size_t k = 0; k != (ncols+1); ++k)
    \n+
    298 (static_cast<long int *>(A_->p))[k] = spqrMatrix_.getColStart()[k];
    \n+
    299
    \n+
    300 for(std::size_t k = 0; k != nnz; ++k)
    \n+
    301 {
    \n+
    302 (static_cast<long int*>(A_->i))[k] = spqrMatrix_.getRowIndex()[k];
    \n+
    303 (static_cast<T*>(A_->x))[k] = spqrMatrix_.getValues()[k];
    \n+
    304 }
    \n+
    305
    \n+
    306 // initialise the vector B
    \n+
    307 B_ = cholmod_l_allocate_dense(nrows, 1, nrows, A_->xtype, cc_);
    \n+
    308 // compute factorization of A
    \n+
    309 spqrfactorization_=SuiteSparseQR_factorize<T>(SPQR_ORDERING_DEFAULT,SPQR_DEFAULT_TOL,A_,cc_);
    \n+
    310 }
    \n+
    311
    \n+
    312 SPQRMatrix spqrMatrix_;
    \n+
    313 bool matrixIsLoaded_;
    \n+
    314 int verbose_;
    \n+
    315 cholmod_common* cc_;
    \n+
    316 cholmod_sparse* A_;
    \n+
    317 cholmod_dense* B_;
    \n+
    318 SuiteSparseQR_factorization<T>* spqrfactorization_;
    \n+
    319 };
    \n+
    \n+
    320
    \n+
    321 template<typename T, typename A>
    \n+
    \n+\n+
    323 {
    \n+
    324 enum {value = true};
    \n+
    325 };
    \n+
    \n+
    326
    \n+
    327 template<typename T, typename A>
    \n+
    \n+\n+
    329 {
    \n+
    330 enum {value = true};
    \n+
    331 };
    \n+
    \n+
    332
    \n+
    \n+
    333 struct SPQRCreator {
    \n+
    334 template<class> struct isValidBlock : std::false_type{};
    \n+
    335
    \n+
    336 template<typename TL, typename M>
    \n+
    337 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n+
    338 typename Dune::TypeListElement<2, TL>::type>>
    \n+
    \n+
    339 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
    \n+
    340 std::enable_if_t<
    \n+
    341 isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n+
    342 {
    \n+
    343 int verbose = config.get("verbose", 0);
    \n+
    344 return std::make_shared<Dune::SPQR<M>>(mat,verbose);
    \n+
    345 }
    \n+
    \n+
    346
    \n+
    347 // second version with SFINAE to validate the template parameters of SPQR
    \n+
    348 template<typename TL, typename M>
    \n+
    349 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n+
    350 typename Dune::TypeListElement<2, TL>::type>>
    \n+
    \n+
    351 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
    \n+
    352 std::enable_if_t<!isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n+
    353 {
    \n+
    354 DUNE_THROW(UnsupportedType,
    \n+
    355 "Unsupported Type in SPQR (only double and std::complex<double> supported)");
    \n+
    356 }
    \n+
    \n+
    357 };
    \n+
    \n+
    358 template<> struct SPQRCreator::isValidBlock<FieldVector<double,1>> : std::true_type{};
    \n+
    359 // std::complex is temporary disabled, because it fails if libc++ is used
    \n+
    360 //template<> struct SPQRCreator::isValidMatrixBlock<FieldMatrix<std::complex<double>,1,1>> : std::true_type{};
    \n+\n+
    362
    \n+
    363} // end namespace Dune
    \n+
    364
    \n+
    365
    \n+
    366#endif //HAVE_SUITESPARSE_SPQR
    \n+
    367#endif //DUNE_ISTL_SPQR_HH
    \n+\n+
    Implementations of the inverse operator interface.
    \n+\n+
    Templates characterizing the type of a solver.
    \n+
    #define DUNE_REGISTER_DIRECT_SOLVER(name,...)
    Definition solverregistry.hh:13
    \n+
    Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > matrix_type
    Definition spqr.hh:71
    \n+
    virtual ~SPQR()
    Destructor.
    Definition spqr.hh:147
    \n+
    SPQR(const Matrix &matrix, int verbose, bool)
    Constructor for compatibility with SuperLU standard constructor.
    Definition spqr.hh:113
    \n+
    virtual SolverCategory::Category category() const
    Category of the solver (see SolverCategory::Category)
    Definition spqr.hh:82
    \n+
    SPQRMatrix & getInternalMatrix()
    Return the column coppressed matrix.
    Definition spqr.hh:256
    \n+
    void setMatrix(const Matrix &matrix)
    Initialize data from given matrix.
    Definition spqr.hh:200
    \n+
    ISTL::Impl::BCCSMatrixInitializer< BCRSMatrix< FieldMatrix< T, n, m >, A >, int > MatrixInitializer
    Type of an associated initializer class.
    Definition spqr.hh:75
    \n+
    Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    The matrix type.
    Definition spqr.hh:70
    \n+
    SPQR()
    Default constructor.
    Definition spqr.hh:137
    \n+
    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 spqr.hh:339
    \n+
    const char * name()
    Get method name.
    Definition spqr.hh:275
    \n+
    SuiteSparseQR_factorization< T > * getFactorization()
    Return the matrix factorization.
    Definition spqr.hh:247
    \n+
    void setVerbosity(int v)
    Sets the verbosity level for the solver.
    Definition spqr.hh:238
    \n+
    ISTL::Impl::BCCSMatrix< T, int > SPQRMatrix
    The corresponding SuperLU Matrix type.
    Definition spqr.hh:73
    \n+
    virtual void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
    apply inverse operator, with given convergence criteria.
    Definition spqr.hh:191
    \n+
    void free()
    Free allocated space.
    Definition spqr.hh:265
    \n+
    SPQR(const Matrix &matrix, const ParameterTree &config)
    Constructs the SPQR solver.
    Definition spqr.hh:132
    \n+
    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.
    Definition spqr.hh:79
    \n+
    void setSubMatrix(const Matrix &matrix, const S &rowIndexSet)
    Definition spqr.hh:217
    \n+
    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.
    Definition spqr.hh:77
    \n+
    virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
    Apply inverse operator,.
    Definition spqr.hh:155
    \n+
    void setOption(unsigned int option, double value)
    Definition spqr.hh:196
    \n+
    SPQR(const Matrix &matrix, int verbose=0)
    Construct a solver object from a BCRSMatrix.
    Definition spqr.hh:95
    \n+
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n
    Definition allocator.hh:11
    \n-
    typename std::allocator_traits< typename AllocatorTraits< T >::type >::template rebind_alloc< X > ReboundAllocatorType
    Definition allocator.hh:37
    \n-
    typename AllocatorTraits< T >::type AllocatorType
    Definition allocator.hh:34
    \n-
    Definition allocator.hh:14
    \n-
    static const bool value
    Definition allocator.hh:15
    \n-
    Definition allocator.hh:20
    \n-
    std::allocator< T > type
    Definition allocator.hh:21
    \n-
    typename T::allocator_type type
    Definition allocator.hh:27
    \n-
    Definition allocator.hh:31
    \n+
    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
    \n+
    Definition matrixutils.hh:211
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    size_type M() const
    number of columns (counted in blocks)
    Definition bcrsmatrix.hh:2007
    \n+
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n+
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n+
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n+
    Definition overlappingschwarz.hh:694
    \n+
    Definition matrixutils.hh:27
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    int iterations
    Number of iterations.
    Definition solver.hh:69
    \n+
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n+
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    Definition solverregistry.hh:77
    \n+
    Definition solvertype.hh:16
    \n+
    @ value
    Whether this is a direct solver.
    Definition solvertype.hh:24
    \n+
    Definition solvertype.hh:30
    \n+
    @ value
    whether the solver internally uses column compressed storage
    Definition solvertype.hh:36
    \n+
    Use the SPQR package to directly solve linear systems \u2013 empty default class.
    Definition spqr.hh:48
    \n+
    Definition spqr.hh:333
    \n+
    Definition spqr.hh:334
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,80 +1,502 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-allocator.hh\n+spqr.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3#ifndef DUNE_ISTL_ALLOCATOR_HH\n-4#define DUNE_ISTL_ALLOCATOR_HH\n-5\n-6#include \n-7#include \n-8\n-9#include \n-10\n-_\b1_\b1namespace _\bD_\bu_\bn_\be {\n+3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+4// vi: set et ts=4 sw=2 sts=2:\n+5#ifndef DUNE_ISTL_SPQR_HH\n+6#define DUNE_ISTL_SPQR_HH\n+7\n+8#if HAVE_SUITESPARSE_SPQR || defined DOXYGEN\n+9\n+10#include \n+11#include \n 12\n-13 template\n-_\b1_\b4 struct _\be_\bx_\bi_\bs_\bt_\bs{\n-_\b1_\b5 static const bool _\bv_\ba_\bl_\bu_\be = true;\n-16 };\n-17\n-18 template\n-_\b1_\b9 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs\n-20 {\n-_\b2_\b1 using _\bt_\by_\bp_\be = std::allocator;\n-22 };\n-23\n-24 template\n-_\b2_\b5 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs >\n-26 {\n-_\b2_\b7 using _\bt_\by_\bp_\be = typename T::allocator_type;\n-28 };\n-29\n-30 template\n-_\b3_\b1 struct _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs {};\n-32\n-33 template\n-_\b3_\b4 using _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be = typename _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be;\n-35\n-36 template\n-_\b3_\b7 using _\bR_\be_\bb_\bo_\bu_\bn_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be = typename std::allocator_traits::type>::template rebind_alloc;\n-38\n-39} // end namespace Dune\n+13#include \n+14\n+15#include \n+16\n+17#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n+19#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n+21\n+22namespace _\bD_\bu_\bn_\be {\n+34 // forward declarations\n+35 template\n+36 class SeqOverlappingSchwarz;\n+37\n+38 template\n+39 struct SeqOverlappingSchwarzAssemblerHelper;\n 40\n-41#endif // DUNE_ISTL_ALLOCATOR_HH\n-_\bs_\bt_\bd\n-STL namespace.\n+46 template\n+_\b4_\b7 class _\bS_\bP_\bQ_\bR\n+48 {};\n+49\n+63 template\n+_\b6_\b4 class _\bS_\bP_\bQ_\bR<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A > >\n+65 : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br, typename std::\n+allocator_traits::template rebind_alloc > >,\n+66 BlockVector, typename std::allocator_traits::template\n+rebind_alloc > > >\n+67 {\n+68 public:\n+_\b7_\b0 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b7_\b1 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b7_\b3 typedef ISTL::Impl::BCCSMatrix _\bS_\bP_\bQ_\bR_\bM_\ba_\bt_\br_\bi_\bx;\n+_\b7_\b5 typedef ISTL::Impl::BCCSMatrixInitializer,A>,\n+int> _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n+_\b7_\b7 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bm_\b>, typename std::\n+allocator_traits::template rebind_alloc > > _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b7_\b9 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bn_\b>, typename std::\n+allocator_traits::template rebind_alloc > > _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+80\n+_\b8_\b2 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+83 {\n+84 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+85 }\n+86\n+_\b9_\b5 _\bS_\bP_\bQ_\bR(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose=0) : matrixIsLoaded_(false), verbose_\n+(verbose)\n+96 {\n+97 //check whether T is a supported type\n+98 static_assert((std::is_same::value) || (std::is_same >::value),\n+99 \"Unsupported Type in SPQR (only double and std::complex\n+supported)\");\n+100 cc_ = new cholmod_common();\n+101 cholmod_l_start(cc_);\n+102 setMatrix(matrix);\n+103 }\n+104\n+_\b1_\b1_\b3 _\bS_\bP_\bQ_\bR(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose, bool) : matrixIsLoaded_(false),\n+verbose_(verbose)\n+114 {\n+115 //check whether T is a supported type\n+116 static_assert((std::is_same::value) || (std::is_same >::value),\n+117 \"Unsupported Type in SPQR (only double and std::complex\n+supported)\");\n+118 cc_ = new cholmod_common();\n+119 cholmod_l_start(cc_);\n+120 setMatrix(matrix);\n+121 }\n+122\n+_\b1_\b3_\b2 _\bS_\bP_\bQ_\bR(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const ParameterTree& config)\n+133 : _\bS_\bP_\bQ_\bR(matrix, config._\bg_\be_\bt(\"verbose\", 0))\n+134 {}\n+135\n+_\b1_\b3_\b7 _\bS_\bP_\bQ_\bR() : matrixIsLoaded_(false), verbose_(0)\n+138 {\n+139 //check whether T is a supported type\n+140 static_assert((std::is_same::value) || (std::is_same >::value),\n+141 \"Unsupported Type in SPQR (only double and std::complex\n+supported)\");\n+142 cc_ = new cholmod_common();\n+143 cholmod_l_start(cc_);\n+144 }\n+145\n+_\b1_\b4_\b7 virtual _\b~_\bS_\bP_\bQ_\bR()\n+148 {\n+149 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_)\n+150 free();\n+151 cholmod_l_finish(cc_);\n+152 }\n+153\n+_\b1_\b5_\b5 virtual void _\ba_\bp_\bp_\bl_\by(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt&\n+res)\n+156 {\n+157 const std::size_t numRows(spqrMatrix_.N());\n+158 // fill B\n+159 for(std::size_t k = 0; k != numRows/n; ++k)\n+160 for (int l = 0; l < n; ++l)\n+161 (static_cast(B_->x))[n*k+l] = b[k][l];\n+162\n+163 cholmod_dense* BTemp = B_;\n+164 B_ = SuiteSparseQR_qmult(0, spqrfactorization_, B_, cc_);\n+165 cholmod_dense* X = SuiteSparseQR_solve(1, spqrfactorization_, B_, cc_);\n+166 cholmod_l_free_dense(&BTemp, cc_);\n+167\n+168 const std::size_t numCols(spqrMatrix_.M());\n+169 // fill x\n+170 for(std::size_t k = 0; k != numCols/m; ++k)\n+171 for (int l = 0; l < m; ++l)\n+172 x[k][l] = (static_cast(X->x))[m*k+l];\n+173\n+174 cholmod_l_free_dense(&X, cc_);\n+175 // this is a direct solver\n+176 res._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 1;\n+177 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = true;\n+178 if(verbose_ > 0)\n+179 {\n+180 std::cout<SPQR_flopcount<SPQR_analyze_time<<\" s\"<SPQR_factorize_time<<\" s\"<SPQR_solve_time<<\" s\"<memory_usage<<\" bytes\"<SPQR_istat[4]< 0) || matrixIsLoaded_)\n+203 free();\n+204\n+205 if (spqrMatrix_.N() + spqrMatrix_.M() + spqrMatrix_.nonzeroes() != 0)\n+206 spqrMatrix_.free();\n+207 spqrMatrix_.setSize(_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(matrix),\n+208 _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(matrix));\n+209 ISTL::Impl::BCCSMatrixInitializer initializer(spqrMatrix_);\n+210\n+211 copyToBCCSMatrix(initializer, matrix);\n+212\n+213 decompose();\n+214 }\n+215\n+216 template\n+_\b2_\b1_\b7 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const S& rowIndexSet)\n+218 {\n+219 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_)\n+220 free();\n+221\n+222 if (spqrMatrix_.N() + spqrMatrix_.M() + spqrMatrix_.nonzeroes() != 0)\n+223 spqrMatrix_.free();\n+224\n+225 spqrMatrix_.setSize(rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+(matrix) / matrix._\bN(),\n+226 rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(matrix) / matrix._\bM());\n+227 ISTL::Impl::BCCSMatrixInitializer initializer(spqrMatrix_);\n+228\n+229 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_\bM_\ba_\bt_\br_\bi_\bx,std::\n+set >(matrix,rowIndexSet));\n+230\n+231 decompose();\n+232 }\n+233\n+_\b2_\b3_\b8 inline void _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(int v)\n+239 {\n+240 verbose_=v;\n+241 }\n+242\n+_\b2_\b4_\b7 inline SuiteSparseQR_factorization* _\bg_\be_\bt_\bF_\ba_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn()\n+248 {\n+249 return spqrfactorization_;\n+250 }\n+251\n+_\b2_\b5_\b6 inline _\bS_\bP_\bQ_\bR_\bM_\ba_\bt_\br_\bi_\bx& _\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx()\n+257 {\n+258 return spqrMatrix_;\n+259 }\n+260\n+_\b2_\b6_\b5 void _\bf_\br_\be_\be()\n+266 {\n+267 cholmod_l_free_sparse(&A_, cc_);\n+268 cholmod_l_free_dense(&B_, cc_);\n+269 SuiteSparseQR_free(&spqrfactorization_, cc_);\n+270 spqrMatrix_.free();\n+271 matrixIsLoaded_ = false;\n+272 }\n+273\n+_\b2_\b7_\b5 inline const char* _\bn_\ba_\bm_\be()\n+276 {\n+277 return \"SPQR\";\n+278 }\n+279\n+280 private:\n+281 template\n+_\b2_\b8_\b2 friend class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n+283\n+284 friend struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bS_\bP_\bQ_\bR<_\bM_\ba_\bt_\br_\bi_\bx>,true>;\n+285\n+287 void decompose()\n+288 {\n+289 const std::size_t nrows(spqrMatrix_.N());\n+290 const std::size_t ncols(spqrMatrix_.M());\n+291 const std::size_t nnz(spqrMatrix_.getColStart()[ncols]);\n+292\n+293 // initialise the matrix A (sorted, packed, unsymmetric, real entries)\n+294 A_ = cholmod_l_allocate_sparse(nrows, ncols, nnz, 1, 1, 0, 1, cc_);\n+295\n+296 // copy all the entries of Ap, Ai, Ax\n+297 for(std::size_t k = 0; k != (ncols+1); ++k)\n+298 (static_cast(A_->p))[k] = spqrMatrix_.getColStart()[k];\n+299\n+300 for(std::size_t k = 0; k != nnz; ++k)\n+301 {\n+302 (static_cast(A_->i))[k] = spqrMatrix_.getRowIndex()[k];\n+303 (static_cast(A_->x))[k] = spqrMatrix_.getValues()[k];\n+304 }\n+305\n+306 // initialise the vector B\n+307 B_ = cholmod_l_allocate_dense(nrows, 1, nrows, A_->xtype, cc_);\n+308 // compute factorization of A\n+309 spqrfactorization_=SuiteSparseQR_factorize\n+(SPQR_ORDERING_DEFAULT,SPQR_DEFAULT_TOL,A_,cc_);\n+310 }\n+311\n+312 SPQRMatrix spqrMatrix_;\n+313 bool matrixIsLoaded_;\n+314 int verbose_;\n+315 cholmod_common* cc_;\n+316 cholmod_sparse* A_;\n+317 cholmod_dense* B_;\n+318 SuiteSparseQR_factorization* spqrfactorization_;\n+319 };\n+320\n+321 template\n+_\b3_\b2_\b2 struct _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br<_\bS_\bP_\bQ_\bR<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx > >\n+323 {\n+_\b3_\b2_\b4 enum {_\bv_\ba_\bl_\bu_\be = true};\n+325 };\n+326\n+327 template\n+_\b3_\b2_\b8 struct _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd<_\bS_\bP_\bQ_\bR<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx > >\n+329 {\n+_\b3_\b3_\b0 enum {_\bv_\ba_\bl_\bu_\be = true};\n+331 };\n+332\n+_\b3_\b3_\b3 struct _\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br {\n+_\b3_\b3_\b4 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::false_type{};\n+335\n+336 template\n+337 std::shared_ptr::type,\n+338 typename Dune::TypeListElement<2, TL>::type>>\n+_\b3_\b3_\b9 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& _\bm_\ba_\bt, const Dune::ParameterTree& config,\n+340 std::enable_if_t<\n+341 _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk::type::block_type>::\n+value,int> = 0) const\n+342 {\n+343 int verbose = config.get(\"verbose\", 0);\n+344 return std::make_shared>(_\bm_\ba_\bt,verbose);\n+345 }\n+346\n+347 // second version with SFINAE to validate the template parameters of SPQR\n+348 template\n+349 std::shared_ptr::type,\n+350 typename Dune::TypeListElement<2, TL>::type>>\n+_\b3_\b5_\b1 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /\n+*config*/,\n+352 std::enable_if_t::\n+type::block_type>::value,int> = 0) const\n+353 {\n+354 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be,\n+355 \"Unsupported Type in SPQR (only double and std::complex\n+supported)\");\n+356 }\n+357 };\n+_\b3_\b5_\b8 template<> struct _\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk> : std::\n+true_type{};\n+359 // std::complex is temporary disabled, because it fails if libc++ is used\n+360 //template<> struct SPQRCreator::isValidMatrixBlock,1,1>> : std::true_type{};\n+_\b3_\b6_\b1 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"spqr\", _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br());\n+362\n+363} // end namespace Dune\n+364\n+365\n+366#endif //HAVE_SUITESPARSE_SPQR\n+367#endif //DUNE_ISTL_SPQR_HH\n+_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n+Implementations of the inverse operator interface.\n+_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n+Templates characterizing the type of a solver.\n+_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR\n+#define DUNE_REGISTER_DIRECT_SOLVER(name,...)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > matrix_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\b~_\bS_\bP_\bQ_\bR\n+virtual ~SPQR()\n+Destructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:147\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bP_\bQ_\bR\n+SPQR(const Matrix &matrix, int verbose, bool)\n+Constructor for compatibility with SuperLU standard constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the solver (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n+SPQRMatrix & getInternalMatrix()\n+Return the column coppressed matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:256\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+void setMatrix(const Matrix &matrix)\n+Initialize data from given matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:200\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+ISTL::Impl::BCCSMatrixInitializer< BCRSMatrix< FieldMatrix< T, n, m >, A >, int\n+> MatrixInitializer\n+Type of an associated initializer class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n+The matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bP_\bQ_\bR\n+SPQR()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:137\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL\n+>::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const\n+M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock<\n+typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0)\n+const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:339\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bn_\ba_\bm_\be\n+const char * name()\n+Get method name.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:275\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bF_\ba_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn\n+SuiteSparseQR_factorization< T > * getFactorization()\n+Return the matrix factorization.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:247\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by\n+void setVerbosity(int v)\n+Sets the verbosity level for the solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bP_\bQ_\bR_\bM_\ba_\bt_\br_\bi_\bx\n+ISTL::Impl::BCCSMatrix< T, int > SPQRMatrix\n+The corresponding SuperLU Matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(domain_type &x, range_type &b, double reduction,\n+InverseOperatorResult &res)\n+apply inverse operator, with given convergence criteria.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:191\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\br_\be_\be\n+void free()\n+Free allocated space.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:265\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bP_\bQ_\bR\n+SPQR(const Matrix &matrix, const ParameterTree &config)\n+Constructs the SPQR solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Dune::BlockVector< FieldVector< T, n >, typename std::allocator_traits< A >::\n+template rebind_alloc< FieldVector< T, n > > > range_type\n+The type of the range of the solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n+void setSubMatrix(const Matrix &matrix, const S &rowIndexSet)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:217\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+Dune::BlockVector< FieldVector< T, m >, typename std::allocator_traits< A >::\n+template rebind_alloc< FieldVector< T, m > > > domain_type\n+The type of the domain of the solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)\n+Apply inverse operator,.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bO_\bp_\bt_\bi_\bo_\bn\n+void setOption(unsigned int option, double value)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:196\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bP_\bQ_\bR\n+SPQR(const Matrix &matrix, int verbose=0)\n+Construct a solver object from a BCRSMatrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:95\n+_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bb_\bo_\bu_\bn_\bd_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be\n-typename std::allocator_traits< typename AllocatorTraits< T >::type >::template\n-rebind_alloc< X > ReboundAllocatorType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\by_\bp_\be\n-typename AllocatorTraits< T >::type AllocatorType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:14\n-_\bD_\bu_\bn_\be_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-static const bool value\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:15\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:20\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bt_\by_\bp_\be\n-std::allocator< T > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:21\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\bo_\bi_\bd_\b__\bt_\b<_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bT_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be_\b _\b>_\b _\b>_\b:_\b:\n-_\bt_\by_\bp_\be\n-typename T::allocator_type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\bT_\br_\ba_\bi_\bt_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:31\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+size_type M() const\n+number of columns (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2007\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+size_type N() const\n+number of rows (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A vector of blocks with memory management.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n+Sequential overlapping Schwarz preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+int iterations\n+Number of iterations.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n+bool converged\n+True if convergence criterion has been met.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Abstract base class for all solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+@ value\n+Whether this is a direct solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+@ value\n+whether the solver internally uses column compressed storage\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR\n+Use the SPQR package to directly solve linear systems \u00e2\u0080\u0093 empty default class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:333\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:334\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00080.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00080.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: preconditioner.hh File Reference\n+dune-istl: blocklevel.hh File Reference\n \n \n \n \n \n \n \n@@ -70,36 +70,56 @@\n \n \n
    \n \n-
    preconditioner.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    blocklevel.hh File Reference
    \n \n
    \n-
    #include <dune-istl-config.hh>
    \n-#include <dune/common/exceptions.hh>
    \n-#include "solvercategory.hh"
    \n+\n+

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

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

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::Preconditioner< X, Y >
     Base class for matrix free definition of preconditioners. More...
     
    \n \n \n \n+

    \n Namespaces

    namespace  Dune
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+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.
     
    \n-
    \n+

    Detailed Description

    \n+

    Helper functions for determining the vector/matrix block level.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,21 +1,43 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-preconditioner.hh File Reference\n-#include \n-#include \n-#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+blocklevel.hh File Reference\n+Helper functions for determining the vector/matrix block level. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0 Base class for matrix free definition of preconditioners. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+constexpr std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bx_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl ()\n+\u00a0 Determine the maximum block level of a possibly nested\n+ vector/matrix type.\n+\u00a0\n+template\n+constexpr std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bi_\bn_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl ()\n+\u00a0 Determine the minimum block level of a possibly nested\n+ vector/matrix type.\n+\u00a0\n+template\n+ constexpr bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bU_\bn_\bi_\bq_\bu_\be_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl ()\n+\u00a0 Determine if a vector/matrix has a uniquely determinable\n+ block level.\n+\u00a0\n+template\n+constexpr std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl ()\n+\u00a0 Determine the block level of a possibly nested vector/\n+ matrix type.\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Helper functions for determining the vector/matrix block level.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00080_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00080_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: preconditioner.hh Source File\n+dune-istl: blocklevel.hh Source File\n \n \n \n \n \n \n \n@@ -74,74 +74,203 @@\n \n
    \n \n
    \n \n
    \n-
    preconditioner.hh
    \n+
    blocklevel.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_PRECONDITIONER_HH
    \n-
    6#define DUNE_ISTL_PRECONDITIONER_HH
    \n-
    7
    \n-
    8#include <dune-istl-config.hh> // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n-
    9#include <dune/common/exceptions.hh>
    \n-
    10
    \n-
    11#include "solvercategory.hh"
    \n-
    12
    \n-
    13namespace Dune {
    \n-
    18 //=====================================================================
    \n-
    31 //=====================================================================
    \n-
    32 template<class X, class Y>
    \n-
    \n-\n-
    34 public:
    \n-
    36 typedef X domain_type;
    \n-
    38 typedef Y range_type;
    \n-
    40 typedef typename X::field_type field_type;
    \n-
    41
    \n-
    70 virtual void pre (X& x, Y& b) = 0;
    \n+
    5
    \n+
    6#ifndef DUNE_ISTL_BLOCKLEVEL_HH
    \n+
    7#define DUNE_ISTL_BLOCKLEVEL_HH
    \n+
    8
    \n+
    9#include <algorithm>
    \n+
    10#include <type_traits>
    \n+
    11
    \n+
    12#include <dune/common/indices.hh>
    \n+
    13#include <dune/common/typetraits.hh>
    \n+
    14#include <dune/common/hybridutilities.hh>
    \n+
    15
    \n+
    21// forward declaration
    \n+
    22namespace Dune {
    \n+
    23template<typename... Args>
    \n+
    24class MultiTypeBlockVector;
    \n+
    25template<typename FirstRow, typename... Args>
    \n+
    26class MultiTypeBlockMatrix;
    \n+
    27} // end namespace Dune
    \n+
    28
    \n+
    29namespace Dune { namespace Impl {
    \n+
    30
    \n+
    31// forward declaration
    \n+
    32template<typename T> struct MaxBlockLevel;
    \n+
    33template<typename T> struct MinBlockLevel;
    \n+
    34
    \n+
    36template<typename M, template<typename B> typename BlockLevel, typename Op>
    \n+
    37constexpr std::size_t blockLevelMultiTypeBlockMatrix(const Op& op)
    \n+
    38{
    \n+
    39 // inialize with zeroth diagonal block
    \n+
    40 using namespace Dune::Indices;
    \n+
    41 using Block00 = typename std::decay_t<decltype(std::declval<M>()[_0][_0])>;
    \n+
    42 std::size_t blockLevel = BlockLevel<Block00>::value() + 1;
    \n+
    43 // iterate over all blocks to determine min/max block level
    \n+
    44 using namespace Dune::Hybrid;
    \n+
    45 forEach(integralRange(index_constant<M::N()>()), [&](auto&& i) {
    \n+
    46 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n+
    47 forEach(integralRange(index_constant<M::M()>()), [&](auto&& j) {
    \n+
    48 using Block = typename std::decay_t<decltype(std::declval<M>()[i][j])>;
    \n+
    49 blockLevel = op(blockLevel, BlockLevel<Block>::value() + 1);
    \n+
    50 });
    \n+
    51 });
    \n+
    52 return blockLevel;
    \n+
    53}
    \n+
    54
    \n+
    56template<typename V, template<typename B> typename BlockLevel, typename Op>
    \n+
    57constexpr std::size_t blockLevelMultiTypeBlockVector(const Op& op)
    \n+
    58{
    \n+
    59 // inialize with zeroth block
    \n+
    60 using namespace Dune::Indices;
    \n+
    61 using Block0 = typename std::decay_t<decltype(std::declval<V>()[_0])>;
    \n+
    62 std::size_t blockLevel = BlockLevel<Block0>::value() + 1;
    \n+
    63 // iterate over all blocks to determine min/max block level
    \n+
    64 using namespace Dune::Hybrid;
    \n+
    65 forEach(integralRange(index_constant<V::size()>()), [&](auto&& i) {
    \n+
    66 using Block = typename std::decay_t<decltype(std::declval<V>()[i])>;
    \n+
    67 blockLevel = op(blockLevel, BlockLevel<Block>::value() + 1);
    \n+
    68 });
    \n+
    69 return blockLevel;
    \n+
    70}
    \n
    71
    \n-
    82 virtual void apply (X& v, const Y& d) = 0;
    \n-
    83
    \n-
    92 virtual void post (X& x) = 0;
    \n-
    93
    \n-\n-
    96#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n-
    97 {
    \n-
    98 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method in a derived classes, in the future this method will pure virtual.");
    \n-
    99 }
    \n-
    100#else
    \n-
    101 = 0;
    \n-
    102#endif
    \n-
    103
    \n-
    105 virtual ~Preconditioner () {}
    \n-
    106
    \n-
    107 };
    \n-
    \n-
    108
    \n-
    112}
    \n-
    113#endif
    \n-\n+
    72template<typename T>
    \n+
    73struct MaxBlockLevel
    \n+
    74{
    \n+
    75 static constexpr std::size_t value(){
    \n+
    76 if constexpr (IsNumber<T>::value)
    \n+
    77 return 0;
    \n+
    78 else
    \n+
    79 return MaxBlockLevel<typename T::block_type>::value() + 1;
    \n+
    80 }
    \n+
    81};
    \n+
    82
    \n+
    83template<typename T>
    \n+
    84struct MinBlockLevel
    \n+
    85{
    \n+
    86 // the default implementation assumes minBlockLevel == maxBlockLevel
    \n+
    87 static constexpr std::size_t value()
    \n+
    88 { return MaxBlockLevel<T>::value(); }
    \n+
    89};
    \n+
    90
    \n+
    91// max block level for MultiTypeBlockMatrix
    \n+
    92template<typename FirstRow, typename... Args>
    \n+
    93struct MaxBlockLevel<Dune::MultiTypeBlockMatrix<FirstRow, Args...>>
    \n+
    94{
    \n+
    95 static constexpr std::size_t value()
    \n+
    96 {
    \n+
    97 using M = MultiTypeBlockMatrix<FirstRow, Args...>;
    \n+
    98 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b); };
    \n+
    99 return blockLevelMultiTypeBlockMatrix<M, MaxBlockLevel>(max);
    \n+
    100 }
    \n+
    101};
    \n+
    102
    \n+
    103// min block level for MultiTypeBlockMatrix
    \n+
    104template<typename FirstRow, typename... Args>
    \n+
    105struct MinBlockLevel<Dune::MultiTypeBlockMatrix<FirstRow, Args...>>
    \n+
    106{
    \n+
    107 static constexpr std::size_t value()
    \n+
    108 {
    \n+
    109 using M = MultiTypeBlockMatrix<FirstRow, Args...>;
    \n+
    110 constexpr auto min = [](const auto& a, const auto& b){ return std::min(a,b); };
    \n+
    111 return blockLevelMultiTypeBlockMatrix<M, MinBlockLevel>(min);
    \n+
    112 }
    \n+
    113};
    \n+
    114
    \n+
    115// max block level for MultiTypeBlockVector
    \n+
    116template<typename... Args>
    \n+
    117struct MaxBlockLevel<Dune::MultiTypeBlockVector<Args...>>
    \n+
    118{
    \n+
    119 static constexpr std::size_t value()
    \n+
    120 {
    \n+
    121 using V = MultiTypeBlockVector<Args...>;
    \n+
    122 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b); };
    \n+
    123 return blockLevelMultiTypeBlockVector<V, MaxBlockLevel>(max);
    \n+
    124 }
    \n+
    125};
    \n+
    126
    \n+
    127// min block level for MultiTypeBlockVector
    \n+
    128template<typename... Args>
    \n+
    129struct MinBlockLevel<Dune::MultiTypeBlockVector<Args...>>
    \n+
    130{
    \n+
    131 static constexpr std::size_t value()
    \n+
    132 {
    \n+
    133 using V = MultiTypeBlockVector<Args...>;
    \n+
    134 constexpr auto min = [](const auto& a, const auto& b){ return std::min(a,b); };
    \n+
    135 return blockLevelMultiTypeBlockVector<V, MinBlockLevel>(min);
    \n+
    136 }
    \n+
    137};
    \n+
    138
    \n+
    139// special case: empty MultiTypeBlockVector
    \n+
    140template<>
    \n+
    141struct MaxBlockLevel<Dune::MultiTypeBlockVector<>>
    \n+
    142{
    \n+
    143 static constexpr std::size_t value()
    \n+
    144 { return 0; };
    \n+
    145};
    \n+
    146
    \n+
    147// special case: empty MultiTypeBlockVector
    \n+
    148template<>
    \n+
    149struct MinBlockLevel<Dune::MultiTypeBlockVector<>>
    \n+
    150{
    \n+
    151 static constexpr std::size_t value()
    \n+
    152 { return 0; };
    \n+
    153};
    \n+
    154
    \n+
    155}} // end namespace Dune::Impl
    \n+
    156
    \n+
    157namespace Dune {
    \n+
    158
    \n+
    160template<typename T>
    \n+
    \n+
    161constexpr std::size_t maxBlockLevel()
    \n+
    162{ return Impl::MaxBlockLevel<T>::value(); }
    \n+
    \n+
    163
    \n+
    165template<typename T>
    \n+
    \n+
    166constexpr std::size_t minBlockLevel()
    \n+
    167{ return Impl::MinBlockLevel<T>::value(); }
    \n+
    \n+
    168
    \n+
    170template<typename T>
    \n+
    \n+
    171constexpr bool hasUniqueBlockLevel()
    \n+
    172{ return maxBlockLevel<T>() == minBlockLevel<T>(); }
    \n+
    \n+
    173
    \n+
    175template<typename T>
    \n+
    \n+
    176constexpr std::size_t blockLevel()
    \n+
    177{
    \n+
    178 static_assert(hasUniqueBlockLevel<T>(), "Block level cannot be uniquely determined!");
    \n+
    179 return Impl::MaxBlockLevel<T>::value();
    \n+
    180}
    \n+
    \n+
    181
    \n+
    182} // end namespace Dune
    \n+
    183
    \n+
    184#endif
    \n
    Definition allocator.hh:11
    \n-
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n-
    virtual void post(X &x)=0
    Clean up.
    \n-
    virtual void apply(X &v, const Y &d)=0
    Apply one step of the preconditioner to the system A(v)=d.
    \n-
    virtual ~Preconditioner()
    every abstract base class has a virtual destructor
    Definition preconditioner.hh:105
    \n-
    Y range_type
    The range type of the preconditioner.
    Definition preconditioner.hh:38
    \n-
    X domain_type
    The domain type of the preconditioner.
    Definition preconditioner.hh:36
    \n-
    virtual SolverCategory::Category category() const =0
    Category of the preconditioner (see SolverCategory::Category)
    \n-
    X::field_type field_type
    The field type of the preconditioner.
    Definition preconditioner.hh:40
    \n-
    virtual void pre(X &x, Y &b)=0
    Prepare the preconditioner.
    \n-
    Category
    Definition solvercategory.hh:23
    \n+
    constexpr bool hasUniqueBlockLevel()
    Determine if a vector/matrix has a uniquely determinable block level.
    Definition blocklevel.hh:171
    \n+
    constexpr std::size_t maxBlockLevel()
    Determine the maximum block level of a possibly nested vector/matrix type.
    Definition blocklevel.hh:161
    \n+
    constexpr std::size_t blockLevel()
    Determine the block level of a possibly nested vector/matrix type.
    Definition blocklevel.hh:176
    \n+
    constexpr std::size_t minBlockLevel()
    Determine the minimum block level of a possibly nested vector/matrix type.
    Definition blocklevel.hh:166
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,92 +1,207 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-preconditioner.hh\n+blocklevel.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_PRECONDITIONER_HH\n-6#define DUNE_ISTL_PRECONDITIONER_HH\n-7\n-8#include // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n-9#include \n-10\n-11#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n-12\n-13namespace _\bD_\bu_\bn_\be {\n-18 //=====================================================================\n-31 //=====================================================================\n-32 template\n-_\b3_\b3 class _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n-34 public:\n-_\b3_\b6 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b3_\b8 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b4_\b0 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-41\n-_\b7_\b0 virtual void _\bp_\br_\be (X& x, Y& b) = 0;\n+5\n+6#ifndef DUNE_ISTL_BLOCKLEVEL_HH\n+7#define DUNE_ISTL_BLOCKLEVEL_HH\n+8\n+9#include \n+10#include \n+11\n+12#include \n+13#include \n+14#include \n+15\n+21// forward declaration\n+22namespace _\bD_\bu_\bn_\be {\n+23template\n+24class MultiTypeBlockVector;\n+25template\n+26class MultiTypeBlockMatrix;\n+27} // end namespace Dune\n+28\n+29namespace _\bD_\bu_\bn_\be { namespace Impl {\n+30\n+31// forward declaration\n+32template struct MaxBlockLevel;\n+33template struct MinBlockLevel;\n+34\n+36template typename BlockLevel, typename Op>\n+37constexpr std::size_t blockLevelMultiTypeBlockMatrix(const Op& op)\n+38{\n+39 // inialize with zeroth diagonal block\n+40 using namespace Dune::Indices;\n+41 using Block00 = typename std::decay_t()[_0][_0])>;\n+42 std::size_t _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl = BlockLevel::value() + 1;\n+43 // iterate over all blocks to determine min/max block level\n+44 using namespace Dune::Hybrid;\n+45 forEach(integralRange(index_constant()), [&](auto&& i) {\n+46 using namespace Dune::Hybrid; // needed for icc, see issue #31\n+47 forEach(integralRange(index_constant()), [&](auto&& j) {\n+48 using Block = typename std::decay_t()[i][j])>;\n+49 _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl = op(_\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl, BlockLevel::value() + 1);\n+50 });\n+51 });\n+52 return _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl;\n+53}\n+54\n+56template typename BlockLevel, typename Op>\n+57constexpr std::size_t blockLevelMultiTypeBlockVector(const Op& op)\n+58{\n+59 // inialize with zeroth block\n+60 using namespace Dune::Indices;\n+61 using Block0 = typename std::decay_t()[_0])>;\n+62 std::size_t _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl = BlockLevel::value() + 1;\n+63 // iterate over all blocks to determine min/max block level\n+64 using namespace Dune::Hybrid;\n+65 forEach(integralRange(index_constant()), [&](auto&& i) {\n+66 using Block = typename std::decay_t()[i])>;\n+67 _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl = op(_\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl, BlockLevel::value() + 1);\n+68 });\n+69 return _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl;\n+70}\n 71\n-_\b8_\b2 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d) = 0;\n-83\n-_\b9_\b2 virtual void _\bp_\bo_\bs_\bt (X& x) = 0;\n-93\n-_\b9_\b5 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-96#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n-97 {\n-98 DUNE_THROW(Dune::Exception,\"It is necessary to implement the category method\n-in a derived classes, in the future this method will pure virtual.\");\n-99 }\n-100#else\n-101 = 0;\n-102#endif\n-103\n-_\b1_\b0_\b5 virtual _\b~_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br () {}\n-106\n-107 };\n-108\n-112}\n-113#endif\n-_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n+72template\n+73struct MaxBlockLevel\n+74{\n+75 static constexpr std::size_t value(){\n+76 if constexpr (IsNumber::value)\n+77 return 0;\n+78 else\n+79 return MaxBlockLevel::value() + 1;\n+80 }\n+81};\n+82\n+83template\n+84struct MinBlockLevel\n+85{\n+86 // the default implementation assumes minBlockLevel == maxBlockLevel\n+87 static constexpr std::size_t value()\n+88 { return MaxBlockLevel::value(); }\n+89};\n+90\n+91// max block level for MultiTypeBlockMatrix\n+92template\n+93struct MaxBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockMatrix>\n+94{\n+95 static constexpr std::size_t value()\n+96 {\n+97 using M = MultiTypeBlockMatrix;\n+98 constexpr auto max = [](const auto& a, const auto& b){ return std::max(a,b);\n+};\n+99 return blockLevelMultiTypeBlockMatrix(max);\n+100 }\n+101};\n+102\n+103// min block level for MultiTypeBlockMatrix\n+104template\n+105struct MinBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockMatrix>\n+106{\n+107 static constexpr std::size_t value()\n+108 {\n+109 using M = MultiTypeBlockMatrix;\n+110 constexpr auto min = [](const auto& a, const auto& b){ return std::min\n+(a,b); };\n+111 return blockLevelMultiTypeBlockMatrix(min);\n+112 }\n+113};\n+114\n+115// max block level for MultiTypeBlockVector\n+116template\n+117struct MaxBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockVector>\n+118{\n+119 static constexpr std::size_t value()\n+120 {\n+121 using V = MultiTypeBlockVector;\n+122 constexpr auto max = [](const auto& a, const auto& b){ return std::max\n+(a,b); };\n+123 return blockLevelMultiTypeBlockVector(max);\n+124 }\n+125};\n+126\n+127// min block level for MultiTypeBlockVector\n+128template\n+129struct MinBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockVector>\n+130{\n+131 static constexpr std::size_t value()\n+132 {\n+133 using V = MultiTypeBlockVector;\n+134 constexpr auto min = [](const auto& a, const auto& b){ return std::min\n+(a,b); };\n+135 return blockLevelMultiTypeBlockVector(min);\n+136 }\n+137};\n+138\n+139// special case: empty MultiTypeBlockVector\n+140template<>\n+141struct MaxBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockVector<>>\n+142{\n+143 static constexpr std::size_t value()\n+144 { return 0; };\n+145};\n+146\n+147// special case: empty MultiTypeBlockVector\n+148template<>\n+149struct MinBlockLevel<_\bD_\bu_\bn_\be::MultiTypeBlockVector<>>\n+150{\n+151 static constexpr std::size_t value()\n+152 { return 0; };\n+153};\n+154\n+155}} // end namespace Dune::Impl\n+156\n+157namespace _\bD_\bu_\bn_\be {\n+158\n+160template\n+_\b1_\b6_\b1constexpr std::size_t _\bm_\ba_\bx_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl()\n+162{ return Impl::MaxBlockLevel::value(); }\n+163\n+165template\n+_\b1_\b6_\b6constexpr std::size_t _\bm_\bi_\bn_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl()\n+167{ return Impl::MinBlockLevel::value(); }\n+168\n+170template\n+_\b1_\b7_\b1constexpr bool _\bh_\ba_\bs_\bU_\bn_\bi_\bq_\bu_\be_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl()\n+172{ return maxBlockLevel() == minBlockLevel(); }\n+173\n+175template\n+_\b1_\b7_\b6constexpr std::size_t _\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl()\n+177{\n+178 static_assert(hasUniqueBlockLevel(), \"Block level cannot be uniquely\n+determined!\");\n+179 return Impl::MaxBlockLevel::value();\n+180}\n+181\n+182} // end namespace Dune\n+183\n+184#endif\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Base class for matrix free definition of preconditioners.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(X &x)=0\n-Clean up.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &v, const Y &d)=0\n-Apply one step of the preconditioner to the system A(v)=d.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\b~_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-virtual ~Preconditioner()\n-every abstract base class has a virtual destructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const =0\n-Category of the preconditioner (see SolverCategory::Category)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\br_\be\n-virtual void pre(X &x, Y &b)=0\n-Prepare the preconditioner.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bh_\ba_\bs_\bU_\bn_\bi_\bq_\bu_\be_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl\n+constexpr bool hasUniqueBlockLevel()\n+Determine if a vector/matrix has a uniquely determinable block level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn blocklevel.hh:171\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\ba_\bx_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl\n+constexpr std::size_t maxBlockLevel()\n+Determine the maximum block level of a possibly nested vector/matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn blocklevel.hh:161\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl\n+constexpr std::size_t blockLevel()\n+Determine the block level of a possibly nested vector/matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn blocklevel.hh:176\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bi_\bn_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl\n+constexpr std::size_t minBlockLevel()\n+Determine the minimum block level of a possibly nested vector/matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn blocklevel.hh:166\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00083.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00083.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: parameters.hh File Reference\n+dune-istl: solvercategory.hh File Reference\n \n \n \n \n \n \n \n@@ -65,67 +65,41 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n \n+
    solvercategory.hh File Reference
    \n \n
    \n-\n-

    Parameter classes for customizing AMG. \n-More...

    \n-
    #include <cstddef>
    \n+
    #include <dune/common/exceptions.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n-\n-\n+\n \n

    \n Classes

    class  Dune::Amg::DependencyParameters
     Parameters needed to check whether a node depends on another. More...
     
    class  Dune::Amg::AggregationParameters
     Parameters needed for the aggregation process. More...
     
    class  Dune::Amg::CoarseningParameters
     Parameters for the complete coarsening process. More...
    struct  Dune::SolverCategory
     Categories for the solvers. More...
     
    class  Dune::Amg::Parameters
     All parameters for AMG. More...
    class  Dune::InvalidSolverCategory
     
    \n \n \n \n-\n-\n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n-\n-\n-\n-\n

    \n-Enumerations

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

    Detailed Description

    \n-

    Parameter classes for customizing AMG.

    \n-
    Author
    Markus Blatt
    \n-

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

    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,45 +1,21 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n-parameters.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Parameter classes for customizing AMG. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+solvercategory.hh File Reference\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-\u00a0 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs needed to check whether a node depends on another. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+\u00a0 Categories for the solvers. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-\u00a0 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs needed for the aggregation process. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-\u00a0 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs for the complete coarsening process. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-\u00a0 All parameters for _\bA_\bM_\bG. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n-E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bn_\bo_\bA_\bc_\bc_\bu = 0 , _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:\n- _\ba_\bt_\bO_\bn_\bc_\be_\bA_\bc_\bc_\bu =1 , _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu =2 }\n-\u00a0 Identifiers for the different accumulation modes. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Parameter classes for customizing AMG.\n- Author\n- Markus Blatt\n-All parameters of the AMG can be set by using the class Parameter, which can be\n-provided to CoarsenCriterion via its constructor.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00083_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00083_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: parameters.hh Source File\n+dune-istl: solvercategory.hh Source File\n \n \n \n \n \n \n \n@@ -70,414 +70,81 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    parameters.hh
    \n+
    solvercategory.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_PARAMETERS_HH
    \n-
    6#define DUNE_AMG_PARAMETERS_HH
    \n+
    5#ifndef DUNE_ISTL_SOLVERCATEGORY_HH
    \n+
    6#define DUNE_ISTL_SOLVERCATEGORY_HH
    \n
    7
    \n-
    8#include <cstddef>
    \n+
    8#include <dune/common/exceptions.hh>
    \n
    9
    \n-
    10namespace Dune
    \n-
    11{
    \n-
    12 namespace Amg
    \n-
    13 {
    \n-
    \n-\n-
    31 {
    \n-
    32 public:
    \n-
    \n-\n-
    35 : alpha_(1.0/3.0), beta_(1.0E-5)
    \n-
    36 {}
    \n-
    \n-
    37
    \n-
    \n-
    42 void setBeta(double b)
    \n-
    43 {
    \n-
    44 beta_ = b;
    \n-
    45 }
    \n-
    \n-
    46
    \n-
    \n-
    52 double beta() const
    \n-
    53 {
    \n-
    54 return beta_;
    \n-
    55 }
    \n-
    \n-
    56
    \n-
    \n-
    61 void setAlpha(double a)
    \n-
    62 {
    \n-
    63 alpha_ = a;
    \n-
    64 }
    \n-
    \n-
    65
    \n-
    \n-
    70 double alpha() const
    \n-
    71 {
    \n-
    72 return alpha_;
    \n-
    73 }
    \n-
    \n-
    74
    \n-
    75 private:
    \n-
    76 double alpha_, beta_;
    \n-
    77 };
    \n-
    \n-
    78
    \n-
    \n-\n-\n-
    84 {
    \n-
    85 public:
    \n-
    \n-\n-
    96 : maxDistance_(2), minAggregateSize_(4), maxAggregateSize_(6),
    \n-
    97 connectivity_(15), skipiso_(false)
    \n-
    98 {}
    \n-
    \n-
    99
    \n-
    \n-
    109 void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
    \n-
    110 {
    \n-
    111 maxDistance_=diameter-1;
    \n-
    112 std::size_t csize=1;
    \n-
    113
    \n-
    114 for(; dim>0; dim--) {
    \n-
    115 csize*=diameter;
    \n-
    116 maxDistance_+=diameter-1;
    \n-
    117 }
    \n-
    118 minAggregateSize_=csize;
    \n-
    119 maxAggregateSize_=static_cast<std::size_t>(csize*1.5);
    \n-
    120 }
    \n-
    \n-
    121
    \n-
    \n-
    132 void setDefaultValuesAnisotropic(std::size_t dim,std::size_t diameter=2)
    \n-
    133 {
    \n-
    134 setDefaultValuesIsotropic(dim, diameter);
    \n-
    135 maxDistance_+=dim-1;
    \n-
    136 }
    \n-
    \n-
    144 std::size_t maxDistance() const { return maxDistance_;}
    \n-
    145
    \n-
    154 void setMaxDistance(std::size_t distance) { maxDistance_ = distance;}
    \n-
    155
    \n-
    \n-
    161 bool skipIsolated() const
    \n-
    162 {
    \n-
    163 return skipiso_;
    \n-
    164 }
    \n-
    \n-
    165
    \n-
    \n-
    171 void setSkipIsolated(bool skip)
    \n-
    172 {
    \n-
    173 skipiso_=skip;
    \n-
    174 }
    \n-
    \n-
    175
    \n-
    180 std::size_t minAggregateSize() const { return minAggregateSize_;}
    \n-
    181
    \n-
    187 void setMinAggregateSize(std::size_t size){ minAggregateSize_=size;}
    \n-
    188
    \n-
    193 std::size_t maxAggregateSize() const { return maxAggregateSize_;}
    \n-
    194
    \n-
    201 void setMaxAggregateSize(std::size_t size){ maxAggregateSize_ = size;}
    \n-
    202
    \n-
    210 std::size_t maxConnectivity() const { return connectivity_;}
    \n-
    211
    \n-
    219 void setMaxConnectivity(std::size_t connectivity){ connectivity_ = connectivity;}
    \n-
    220
    \n-
    221 private:
    \n-
    222 std::size_t maxDistance_, minAggregateSize_, maxAggregateSize_, connectivity_;
    \n-
    223 bool skipiso_;
    \n-
    224
    \n-
    225 };
    \n-
    \n-
    226
    \n-
    227
    \n-
    \n-\n-\n-\n-\n-
    248 };
    \n-
    \n-
    249
    \n-
    250
    \n-
    251
    \n-
    252
    \n-
    \n-\n-
    257 {
    \n-
    258 public:
    \n-
    \n-
    262 void setMaxLevel(int l)
    \n-
    263 {
    \n-
    264 maxLevel_ = l;
    \n-
    265 }
    \n-
    \n-
    \n-
    269 int maxLevel() const
    \n-
    270 {
    \n-
    271 return maxLevel_;
    \n-
    272 }
    \n-
    \n-
    273
    \n-
    \n-
    277 void setCoarsenTarget(int nodes)
    \n-
    278 {
    \n-
    279 coarsenTarget_ = nodes;
    \n-
    280 }
    \n-
    \n-
    281
    \n-
    \n-
    285 int coarsenTarget() const
    \n-
    286 {
    \n-
    287 return coarsenTarget_;
    \n-
    288 }
    \n-
    \n-
    289
    \n-
    \n-
    295 void setMinCoarsenRate(double rate)
    \n-
    296 {
    \n-
    297 minCoarsenRate_ = rate;
    \n-
    298 }
    \n-
    \n-
    299
    \n-
    \n-
    303 double minCoarsenRate() const
    \n-
    304 {
    \n-
    305 return minCoarsenRate_;
    \n-
    306 }
    \n-
    \n-
    307
    \n-
    \n-\n-
    312 {
    \n-
    313 return accumulate_;
    \n-
    314 }
    \n-
    \n-
    \n-\n-
    319 {
    \n-
    320 accumulate_=accu;
    \n-
    321 }
    \n+
    10
    \n+
    11namespace Dune {
    \n+
    12
    \n+
    \n+\n+
    22 {
    \n+
    \n+
    23 enum Category {
    \n+\n+\n+\n+
    30 };
    \n
    \n-
    322
    \n-
    \n-
    323 void setAccumulate(bool accu){
    \n-
    324 accumulate_=accu ? successiveAccu : noAccu;
    \n-
    325 }
    \n-
    \n-
    326
    \n-
    \n-
    330 bool useFixedOrder() const
    \n-
    331 {
    \n-
    332 return useFixedOrder_;
    \n-
    333 }
    \n-
    \n-
    334
    \n-
    \n-\n-
    336 {
    \n-
    337 useFixedOrder_ = useFixedOrder;
    \n-
    338 }
    \n-
    \n-
    339
    \n-
    \n-\n-
    346 {
    \n-
    347 dampingFactor_ = d;
    \n-
    348 }
    \n-
    \n-
    349
    \n-
    \n-\n-
    356 {
    \n-
    357 return dampingFactor_;
    \n-
    358 }
    \n-
    \n-
    \n-\n-
    373 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu,
    \n-
    374 bool useFixedOrder = false)
    \n-
    375 : maxLevel_(maxLevel), coarsenTarget_(coarsenTarget), minCoarsenRate_(minCoarsenRate),
    \n-
    376 dampingFactor_(prolongDamp), accumulate_( accumulate), useFixedOrder_(useFixedOrder)
    \n-
    377 {}
    \n-
    \n-
    378
    \n-
    379 private:
    \n-
    383 int maxLevel_;
    \n-
    387 int coarsenTarget_;
    \n-
    391 double minCoarsenRate_;
    \n-
    395 double dampingFactor_;
    \n-
    400 AccumulationMode accumulate_;
    \n-
    406 bool useFixedOrder_;
    \n-
    407 };
    \n-
    \n-
    408
    \n-
    \n-\n-
    416 {
    \n-
    417 public:
    \n-
    \n-
    424 void setDebugLevel(int level)
    \n-
    425 {
    \n-
    426 debugLevel_ = level;
    \n-
    427 }
    \n-
    \n-
    428
    \n-
    \n-
    434 int debugLevel() const
    \n-
    435 {
    \n-
    436 return debugLevel_;
    \n-
    437 }
    \n-
    \n-
    438
    \n-
    \n-
    443 void setNoPreSmoothSteps(std::size_t steps)
    \n-
    444 {
    \n-
    445 preSmoothSteps_=steps;
    \n-
    446 }
    \n-
    \n-
    \n-
    451 std::size_t getNoPreSmoothSteps() const
    \n-
    452 {
    \n-
    453 return preSmoothSteps_;
    \n-
    454 }
    \n-
    \n-
    455
    \n-
    \n-
    460 void setNoPostSmoothSteps(std::size_t steps)
    \n-
    461 {
    \n-
    462 postSmoothSteps_=steps;
    \n-
    463 }
    \n-
    \n-
    \n-
    468 std::size_t getNoPostSmoothSteps() const
    \n-
    469 {
    \n-
    470 return postSmoothSteps_;
    \n-
    471 }
    \n-
    \n-
    472
    \n-
    \n-
    476 void setGamma(std::size_t gamma)
    \n-
    477 {
    \n-
    478 gamma_=gamma;
    \n-
    479 }
    \n-
    \n-
    \n-
    483 std::size_t getGamma() const
    \n-
    484 {
    \n-
    485 return gamma_;
    \n-
    486 }
    \n-
    \n-
    487
    \n-
    \n-
    492 void setAdditive(bool additive)
    \n-
    493 {
    \n-
    494 additive_=additive;
    \n-
    495 }
    \n-
    \n-
    496
    \n-
    \n-
    501 bool getAdditive() const
    \n-
    502 {
    \n-
    503 return additive_;
    \n-
    504 }
    \n-
    \n-
    505
    \n-
    \n-
    516 Parameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2,
    \n-
    517 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu, bool useFixedOrder = false)
    \n-\n-
    519 , debugLevel_(2), preSmoothSteps_(2), postSmoothSteps_(2), gamma_(1),
    \n-
    520 additive_(false)
    \n-
    521 {}
    \n-
    \n-
    522 private:
    \n-
    523 int debugLevel_;
    \n-
    524 std::size_t preSmoothSteps_;
    \n-
    525 std::size_t postSmoothSteps_;
    \n-
    526 std::size_t gamma_;
    \n-
    527 bool additive_;
    \n-
    528 };
    \n-
    \n-
    529
    \n-
    530 } //namespace AMG
    \n-
    531
    \n-
    532} //namespace Dune
    \n-
    533#endif
    \n-
    void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2)
    Sets reasonable default values for an anisotropic problem.
    Definition parameters.hh:132
    \n-
    void setAdditive(bool additive)
    Set whether to use additive multigrid.
    Definition parameters.hh:492
    \n-
    void setSkipIsolated(bool skip)
    Set whether isolated aggregates will not be represented on the coarse level.
    Definition parameters.hh:171
    \n-
    void setProlongationDampingFactor(double d)
    Set the damping factor for the prolongation.
    Definition parameters.hh:345
    \n-
    CoarseningParameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu, bool useFixedOrder=false)
    Constructor.
    Definition parameters.hh:372
    \n-
    double alpha() const
    Get the scaling value for marking connections as strong. Default value is 1/3.
    Definition parameters.hh:70
    \n-
    void setMaxAggregateSize(std::size_t size)
    Set the maximum number of nodes a aggregate is allowed to have.
    Definition parameters.hh:201
    \n-
    void setMinCoarsenRate(double rate)
    Set the minimum coarsening rate to be achieved in each coarsening.
    Definition parameters.hh:295
    \n-
    double minCoarsenRate() const
    Get the minimum coarsening rate to be achieved.
    Definition parameters.hh:303
    \n-
    std::size_t maxAggregateSize() const
    Get the maximum number of nodes a aggregate is allowed to have.
    Definition parameters.hh:193
    \n-
    void setAlpha(double a)
    Set the scaling value for marking connections as strong. Default value is 1/3.
    Definition parameters.hh:61
    \n-
    Parameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu, bool useFixedOrder=false)
    Constructor.
    Definition parameters.hh:516
    \n-
    double beta() const
    Get the threshold for marking nodes as isolated. The default value is 1.0E-5.
    Definition parameters.hh:52
    \n-
    std::size_t maxConnectivity() const
    Get the maximum number of connections a aggregate is allowed to have.
    Definition parameters.hh:210
    \n-
    int coarsenTarget() const
    Get the maximum number of unknowns allowed on the coarsest level.
    Definition parameters.hh:285
    \n-
    void setAccumulate(AccumulationMode accu)
    Set whether the data should be accumulated on fewer processes on coarser levels.
    Definition parameters.hh:318
    \n-
    double getProlongationDampingFactor() const
    Get the damping factor for the prolongation.
    Definition parameters.hh:355
    \n-
    AccumulationMode accumulate() const
    Whether the data should be accumulated on fewer processes on coarser levels.
    Definition parameters.hh:311
    \n-
    void setUseFixedOrder(bool useFixedOrder)
    Definition parameters.hh:335
    \n-
    bool useFixedOrder() const
    Check if the indices for the coarser levels should be created in a fixed order.
    Definition parameters.hh:330
    \n-
    void setMaxConnectivity(std::size_t connectivity)
    Set the maximum number of connections a aggregate is allowed to have.
    Definition parameters.hh:219
    \n-
    std::size_t minAggregateSize() const
    Get the minimum number of nodes a aggregate has to consist of.
    Definition parameters.hh:180
    \n-
    bool getAdditive() const
    Get whether to use additive multigrid.
    Definition parameters.hh:501
    \n-
    void setMaxLevel(int l)
    Set the maximum number of levels allowed in the hierarchy.
    Definition parameters.hh:262
    \n-
    void setDebugLevel(int level)
    Set the debugging level.
    Definition parameters.hh:424
    \n-
    std::size_t getGamma() const
    Get the value of gamma; 1 for V-cycle, 2 for W-cycle.
    Definition parameters.hh:483
    \n-
    void setNoPostSmoothSteps(std::size_t steps)
    Set the number of postsmoothing steps to apply.
    Definition parameters.hh:460
    \n-
    std::size_t getNoPreSmoothSteps() const
    Get the number of presmoothing steps to apply.
    Definition parameters.hh:451
    \n-
    DependencyParameters()
    Constructor.
    Definition parameters.hh:34
    \n-
    void setMinAggregateSize(std::size_t size)
    Set the minimum number of nodes a aggregate has to consist of.
    Definition parameters.hh:187
    \n-
    int maxLevel() const
    Get the maximum number of levels allowed in the hierarchy.
    Definition parameters.hh:269
    \n-
    void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
    Sets reasonable default values for an isotropic problem.
    Definition parameters.hh:109
    \n-
    AggregationParameters()
    Constructor.
    Definition parameters.hh:95
    \n-
    bool skipIsolated() const
    Whether isolated aggregates will not be represented on the coarse level.
    Definition parameters.hh:161
    \n-
    void setCoarsenTarget(int nodes)
    Set the maximum number of unknowns allowed on the coarsest level.
    Definition parameters.hh:277
    \n-
    void setNoPreSmoothSteps(std::size_t steps)
    Set the number of presmoothing steps to apply.
    Definition parameters.hh:443
    \n-
    AccumulationMode
    Identifiers for the different accumulation modes.
    Definition parameters.hh:231
    \n-
    void setBeta(double b)
    Set threshold for marking nodes as isolated. The default value is 1.0E-5.
    Definition parameters.hh:42
    \n-
    std::size_t maxDistance() const
    Get the maximal distance allowed between two nodes in a aggregate.
    Definition parameters.hh:144
    \n-
    void setGamma(std::size_t gamma)
    Set the value of gamma; 1 for V-cycle, 2 for W-cycle.
    Definition parameters.hh:476
    \n-
    void setAccumulate(bool accu)
    Definition parameters.hh:323
    \n-
    void setMaxDistance(std::size_t distance)
    Set the maximal distance allowed between two nodes in a aggregate.
    Definition parameters.hh:154
    \n-
    int debugLevel() const
    Get the debugging Level.
    Definition parameters.hh:434
    \n-
    std::size_t getNoPostSmoothSteps() const
    Get the number of postsmoothing steps to apply.
    Definition parameters.hh:468
    \n-
    @ atOnceAccu
    Accumulate data to one process at once.
    Definition parameters.hh:243
    \n-
    @ noAccu
    No data accumulution.
    Definition parameters.hh:237
    \n-
    @ successiveAccu
    Successively accumulate to fewer processes.
    Definition parameters.hh:247
    \n+
    31
    \n+
    33 template<typename OP>
    \n+
    \n+
    34 static Category category(const OP& op, decltype(op.category())* = nullptr)
    \n+
    35 {
    \n+
    36 return op.category();
    \n+
    37 }
    \n+
    \n+
    38
    \n+
    39#ifndef DOXYGEN
    \n+
    40 // template<typename OP>
    \n+
    41 // static Category category(const OP& op, decltype(op.getSolverCategory())* = nullptr)
    \n+
    42 // {
    \n+
    43 // return op.getSolverCategory();
    \n+
    44 // }
    \n+
    45
    \n+
    46 template<typename OP>
    \n+
    47 static Category category(const OP& op, decltype(op.category)* = nullptr)
    \n+
    48 {
    \n+
    49 return OP::category;
    \n+
    50 }
    \n+
    51#endif
    \n+
    52 };
    \n+
    \n+
    53
    \n+
    54 class InvalidSolverCategory : public InvalidStateException{};
    \n+
    55
    \n+
    58} // end namespace
    \n+
    59
    \n+
    60#endif
    \n
    Definition allocator.hh:11
    \n-
    Parameters needed to check whether a node depends on another.
    Definition parameters.hh:31
    \n-
    Parameters needed for the aggregation process.
    Definition parameters.hh:84
    \n-
    Parameters for the complete coarsening process.
    Definition parameters.hh:257
    \n-
    All parameters for AMG.
    Definition parameters.hh:416
    \n+
    Categories for the solvers.
    Definition solvercategory.hh:22
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    @ nonoverlapping
    Category for non-overlapping solvers.
    Definition solvercategory.hh:27
    \n+
    @ overlapping
    Category for overlapping solvers.
    Definition solvercategory.hh:29
    \n+
    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
    \n+
    Definition solvercategory.hh:54
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,486 +1,85 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-parameters.hh\n+solvercategory.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_PARAMETERS_HH\n-6#define DUNE_AMG_PARAMETERS_HH\n+5#ifndef DUNE_ISTL_SOLVERCATEGORY_HH\n+6#define DUNE_ISTL_SOLVERCATEGORY_HH\n 7\n-8#include \n+8#include \n 9\n-10namespace _\bD_\bu_\bn_\be\n-11{\n-12 namespace Amg\n-13 {\n-_\b3_\b0 class _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-31 {\n-32 public:\n-_\b3_\b4 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs()\n-35 : alpha_(1.0/3.0), beta_(1.0E-5)\n-36 {}\n-37\n-_\b4_\b2 void _\bs_\be_\bt_\bB_\be_\bt_\ba(double b)\n-43 {\n-44 beta_ = b;\n-45 }\n-46\n-_\b5_\b2 double _\bb_\be_\bt_\ba() const\n-53 {\n-54 return beta_;\n-55 }\n-56\n-_\b6_\b1 void _\bs_\be_\bt_\bA_\bl_\bp_\bh_\ba(double a)\n-62 {\n-63 alpha_ = a;\n-64 }\n-65\n-_\b7_\b0 double _\ba_\bl_\bp_\bh_\ba() const\n-71 {\n-72 return alpha_;\n-73 }\n-74\n-75 private:\n-76 double alpha_, beta_;\n-77 };\n-78\n-_\b8_\b2 class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs :\n-83 public _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-84 {\n-85 public:\n-_\b9_\b5 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs()\n-96 : maxDistance_(2), minAggregateSize_(4), maxAggregateSize_(6),\n-97 connectivity_(15), skipiso_(false)\n-98 {}\n-99\n-_\b1_\b0_\b9 void _\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bI_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc(std::size_t dim, std::size_t diameter=2)\n-110 {\n-111 maxDistance_=diameter-1;\n-112 std::size_t csize=1;\n-113\n-114 for(; dim>0; dim--) {\n-115 csize*=diameter;\n-116 maxDistance_+=diameter-1;\n-117 }\n-118 minAggregateSize_=csize;\n-119 maxAggregateSize_=static_cast(csize*1.5);\n-120 }\n-121\n-_\b1_\b3_\b2 void _\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bA_\bn_\bi_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc(std::size_t dim,std::size_t diameter=2)\n-133 {\n-134 _\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bI_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc(dim, diameter);\n-135 maxDistance_+=dim-1;\n-136 }\n-_\b1_\b4_\b4 std::size_t _\bm_\ba_\bx_\bD_\bi_\bs_\bt_\ba_\bn_\bc_\be() const { return maxDistance_;}\n-145\n-_\b1_\b5_\b4 void _\bs_\be_\bt_\bM_\ba_\bx_\bD_\bi_\bs_\bt_\ba_\bn_\bc_\be(std::size_t distance) { maxDistance_ = distance;}\n-155\n-_\b1_\b6_\b1 bool _\bs_\bk_\bi_\bp_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd() const\n-162 {\n-163 return skipiso_;\n-164 }\n-165\n-_\b1_\b7_\b1 void _\bs_\be_\bt_\bS_\bk_\bi_\bp_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd(bool skip)\n-172 {\n-173 skipiso_=skip;\n-174 }\n-175\n-_\b1_\b8_\b0 std::size_t _\bm_\bi_\bn_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be() const { return minAggregateSize_;}\n-181\n-_\b1_\b8_\b7 void _\bs_\be_\bt_\bM_\bi_\bn_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be(std::size_t size){ minAggregateSize_=size;}\n-188\n-_\b1_\b9_\b3 std::size_t _\bm_\ba_\bx_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be() const { return maxAggregateSize_;}\n-194\n-_\b2_\b0_\b1 void _\bs_\be_\bt_\bM_\ba_\bx_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be(std::size_t size){ maxAggregateSize_ = size;}\n-202\n-_\b2_\b1_\b0 std::size_t _\bm_\ba_\bx_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by() const { return connectivity_;}\n-211\n-_\b2_\b1_\b9 void _\bs_\be_\bt_\bM_\ba_\bx_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(std::size_t connectivity){ connectivity_ =\n-connectivity;}\n-220\n-221 private:\n-222 std::size_t maxDistance_, minAggregateSize_, maxAggregateSize_,\n-connectivity_;\n-223 bool skipiso_;\n-224\n-225 };\n-226\n-227\n-_\b2_\b3_\b1 enum _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be {\n-_\b2_\b3_\b7 _\bn_\bo_\bA_\bc_\bc_\bu = 0,\n-_\b2_\b4_\b3 _\ba_\bt_\bO_\bn_\bc_\be_\bA_\bc_\bc_\bu=1,\n-247 _\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu=2\n-_\b2_\b4_\b8 };\n-249\n-250\n-251\n-252\n-_\b2_\b5_\b6 class _\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs : public _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-257 {\n-258 public:\n-_\b2_\b6_\b2 void _\bs_\be_\bt_\bM_\ba_\bx_\bL_\be_\bv_\be_\bl(int l)\n-263 {\n-264 maxLevel_ = l;\n-265 }\n-_\b2_\b6_\b9 int _\bm_\ba_\bx_\bL_\be_\bv_\be_\bl() const\n-270 {\n-271 return maxLevel_;\n-272 }\n-273\n-_\b2_\b7_\b7 void _\bs_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bn_\bT_\ba_\br_\bg_\be_\bt(int nodes)\n-278 {\n-279 coarsenTarget_ = nodes;\n-280 }\n-281\n-_\b2_\b8_\b5 int _\bc_\bo_\ba_\br_\bs_\be_\bn_\bT_\ba_\br_\bg_\be_\bt() const\n-286 {\n-287 return coarsenTarget_;\n-288 }\n-289\n-_\b2_\b9_\b5 void _\bs_\be_\bt_\bM_\bi_\bn_\bC_\bo_\ba_\br_\bs_\be_\bn_\bR_\ba_\bt_\be(double rate)\n-296 {\n-297 minCoarsenRate_ = rate;\n-298 }\n-299\n-_\b3_\b0_\b3 double _\bm_\bi_\bn_\bC_\bo_\ba_\br_\bs_\be_\bn_\bR_\ba_\bt_\be() const\n-304 {\n-305 return minCoarsenRate_;\n-306 }\n-307\n-_\b3_\b1_\b1 _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be() const\n-312 {\n-313 return accumulate_;\n-314 }\n-_\b3_\b1_\b8 void _\bs_\be_\bt_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be(_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be accu)\n-319 {\n-320 accumulate_=accu;\n-321 }\n-322\n-_\b3_\b2_\b3 void _\bs_\be_\bt_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be(bool accu){\n-324 accumulate_=accu ? _\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu : _\bn_\bo_\bA_\bc_\bc_\bu;\n-325 }\n-326\n-_\b3_\b3_\b0 bool _\bu_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br() const\n-331 {\n-332 return useFixedOrder_;\n-333 }\n-334\n-_\b3_\b3_\b5 void _\bs_\be_\bt_\bU_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br(bool _\bu_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br)\n-336 {\n-337 useFixedOrder_ = _\bu_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br;\n-338 }\n-339\n-_\b3_\b4_\b5 void _\bs_\be_\bt_\bP_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\bi_\bo_\bn_\bD_\ba_\bm_\bp_\bi_\bn_\bg_\bF_\ba_\bc_\bt_\bo_\br(double d)\n-346 {\n-347 dampingFactor_ = d;\n-348 }\n-349\n-_\b3_\b5_\b5 double _\bg_\be_\bt_\bP_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\bi_\bo_\bn_\bD_\ba_\bm_\bp_\bi_\bn_\bg_\bF_\ba_\bc_\bt_\bo_\br() const\n-356 {\n-357 return dampingFactor_;\n-358 }\n-_\b3_\b7_\b2 _\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(int _\bm_\ba_\bx_\bL_\be_\bv_\be_\bl=100, int _\bc_\bo_\ba_\br_\bs_\be_\bn_\bT_\ba_\br_\bg_\be_\bt=1000, double\n-_\bm_\bi_\bn_\bC_\bo_\ba_\br_\bs_\be_\bn_\bR_\ba_\bt_\be=1.2,\n-373 double prolongDamp=1.6, _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be=_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu,\n-374 bool _\bu_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br = false)\n-375 : maxLevel_(_\bm_\ba_\bx_\bL_\be_\bv_\be_\bl), coarsenTarget_(_\bc_\bo_\ba_\br_\bs_\be_\bn_\bT_\ba_\br_\bg_\be_\bt), minCoarsenRate_\n-(_\bm_\bi_\bn_\bC_\bo_\ba_\br_\bs_\be_\bn_\bR_\ba_\bt_\be),\n-376 dampingFactor_(prolongDamp), accumulate_( _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be), useFixedOrder_\n-(_\bu_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br)\n-377 {}\n-378\n-379 private:\n-383 int maxLevel_;\n-387 int coarsenTarget_;\n-391 double minCoarsenRate_;\n-395 double dampingFactor_;\n-400 _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be accumulate_;\n-406 bool useFixedOrder_;\n-407 };\n-408\n-_\b4_\b1_\b5 class _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs : public _\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-416 {\n-417 public:\n-_\b4_\b2_\b4 void _\bs_\be_\bt_\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl(int level)\n-425 {\n-426 debugLevel_ = level;\n-427 }\n-428\n-_\b4_\b3_\b4 int _\bd_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl() const\n-435 {\n-436 return debugLevel_;\n-437 }\n-438\n-_\b4_\b4_\b3 void _\bs_\be_\bt_\bN_\bo_\bP_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh_\bS_\bt_\be_\bp_\bs(std::size_t steps)\n-444 {\n-445 preSmoothSteps_=steps;\n-446 }\n-_\b4_\b5_\b1 std::size_t _\bg_\be_\bt_\bN_\bo_\bP_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh_\bS_\bt_\be_\bp_\bs() const\n-452 {\n-453 return preSmoothSteps_;\n-454 }\n-455\n-_\b4_\b6_\b0 void _\bs_\be_\bt_\bN_\bo_\bP_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\bS_\bt_\be_\bp_\bs(std::size_t steps)\n-461 {\n-462 postSmoothSteps_=steps;\n-463 }\n-_\b4_\b6_\b8 std::size_t _\bg_\be_\bt_\bN_\bo_\bP_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\bS_\bt_\be_\bp_\bs() const\n-469 {\n-470 return postSmoothSteps_;\n-471 }\n-472\n-_\b4_\b7_\b6 void _\bs_\be_\bt_\bG_\ba_\bm_\bm_\ba(std::size_t gamma)\n-477 {\n-478 gamma_=gamma;\n-479 }\n-_\b4_\b8_\b3 std::size_t _\bg_\be_\bt_\bG_\ba_\bm_\bm_\ba() const\n-484 {\n-485 return gamma_;\n-486 }\n-487\n-_\b4_\b9_\b2 void _\bs_\be_\bt_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be(bool additive)\n-493 {\n-494 additive_=additive;\n-495 }\n-496\n-_\b5_\b0_\b1 bool _\bg_\be_\bt_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be() const\n-502 {\n-503 return additive_;\n-504 }\n-505\n-_\b5_\b1_\b6 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(int _\bm_\ba_\bx_\bL_\be_\bv_\be_\bl=100, int _\bc_\bo_\ba_\br_\bs_\be_\bn_\bT_\ba_\br_\bg_\be_\bt=1000, double\n-_\bm_\bi_\bn_\bC_\bo_\ba_\br_\bs_\be_\bn_\bR_\ba_\bt_\be=1.2,\n-517 double prolongDamp=1.6, _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be=_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu, bool\n-_\bu_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br = false)\n-518 : _\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(_\bm_\ba_\bx_\bL_\be_\bv_\be_\bl, _\bc_\bo_\ba_\br_\bs_\be_\bn_\bT_\ba_\br_\bg_\be_\bt, _\bm_\bi_\bn_\bC_\bo_\ba_\br_\bs_\be_\bn_\bR_\ba_\bt_\be,\n-prolongDamp, _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be, _\bu_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br)\n-519 , debugLevel_(2), preSmoothSteps_(2), postSmoothSteps_(2), gamma_(1),\n-520 additive_(false)\n-521 {}\n-522 private:\n-523 int debugLevel_;\n-524 std::size_t preSmoothSteps_;\n-525 std::size_t postSmoothSteps_;\n-526 std::size_t gamma_;\n-527 bool additive_;\n-528 };\n-529\n-530 } //namespace AMG\n-531\n-532} //namespace Dune\n-533#endif\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bA_\bn_\bi_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc\n-void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2)\n-Sets reasonable default values for an anisotropic problem.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be\n-void setAdditive(bool additive)\n-Set whether to use additive multigrid.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:492\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bS_\bk_\bi_\bp_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n-void setSkipIsolated(bool skip)\n-Set whether isolated aggregates will not be represented on the coarse level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:171\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bP_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\bi_\bo_\bn_\bD_\ba_\bm_\bp_\bi_\bn_\bg_\bF_\ba_\bc_\bt_\bo_\br\n-void setProlongationDampingFactor(double d)\n-Set the damping factor for the prolongation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:345\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-CoarseningParameters(int maxLevel=100, int coarsenTarget=1000, double\n-minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode\n-accumulate=successiveAccu, bool useFixedOrder=false)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:372\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\ba_\bl_\bp_\bh_\ba\n-double alpha() const\n-Get the scaling value for marking connections as strong. Default value is 1/3.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bx_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be\n-void setMaxAggregateSize(std::size_t size)\n-Set the maximum number of nodes a aggregate is allowed to have.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:201\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bM_\bi_\bn_\bC_\bo_\ba_\br_\bs_\be_\bn_\bR_\ba_\bt_\be\n-void setMinCoarsenRate(double rate)\n-Set the minimum coarsening rate to be achieved in each coarsening.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:295\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bm_\bi_\bn_\bC_\bo_\ba_\br_\bs_\be_\bn_\bR_\ba_\bt_\be\n-double minCoarsenRate() const\n-Get the minimum coarsening rate to be achieved.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:303\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bm_\ba_\bx_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be\n-std::size_t maxAggregateSize() const\n-Get the maximum number of nodes a aggregate is allowed to have.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:193\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bA_\bl_\bp_\bh_\ba\n-void setAlpha(double a)\n-Set the scaling value for marking connections as strong. Default value is 1/3.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-Parameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2,\n-double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu, bool\n-useFixedOrder=false)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:516\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bb_\be_\bt_\ba\n-double beta() const\n-Get the threshold for marking nodes as isolated. The default value is 1.0E-5.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bm_\ba_\bx_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by\n-std::size_t maxConnectivity() const\n-Get the maximum number of connections a aggregate is allowed to have.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:210\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn_\bT_\ba_\br_\bg_\be_\bt\n-int coarsenTarget() const\n-Get the maximum number of unknowns allowed on the coarsest level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:285\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be\n-void setAccumulate(AccumulationMode accu)\n-Set whether the data should be accumulated on fewer processes on coarser\n-levels.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:318\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bg_\be_\bt_\bP_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\bi_\bo_\bn_\bD_\ba_\bm_\bp_\bi_\bn_\bg_\bF_\ba_\bc_\bt_\bo_\br\n-double getProlongationDampingFactor() const\n-Get the damping factor for the prolongation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:355\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be\n-AccumulationMode accumulate() const\n-Whether the data should be accumulated on fewer processes on coarser levels.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:311\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bU_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br\n-void setUseFixedOrder(bool useFixedOrder)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:335\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bu_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br\n-bool useFixedOrder() const\n-Check if the indices for the coarser levels should be created in a fixed order.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:330\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bx_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by\n-void setMaxConnectivity(std::size_t connectivity)\n-Set the maximum number of connections a aggregate is allowed to have.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bm_\bi_\bn_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be\n-std::size_t minAggregateSize() const\n-Get the minimum number of nodes a aggregate has to consist of.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:180\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bg_\be_\bt_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be\n-bool getAdditive() const\n-Get whether to use additive multigrid.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:501\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bx_\bL_\be_\bv_\be_\bl\n-void setMaxLevel(int l)\n-Set the maximum number of levels allowed in the hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:262\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bD_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\n-void setDebugLevel(int level)\n-Set the debugging level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:424\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bg_\be_\bt_\bG_\ba_\bm_\bm_\ba\n-std::size_t getGamma() const\n-Get the value of gamma; 1 for V-cycle, 2 for W-cycle.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:483\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bN_\bo_\bP_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\bS_\bt_\be_\bp_\bs\n-void setNoPostSmoothSteps(std::size_t steps)\n-Set the number of postsmoothing steps to apply.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:460\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bg_\be_\bt_\bN_\bo_\bP_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh_\bS_\bt_\be_\bp_\bs\n-std::size_t getNoPreSmoothSteps() const\n-Get the number of presmoothing steps to apply.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:451\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-DependencyParameters()\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bM_\bi_\bn_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be\n-void setMinAggregateSize(std::size_t size)\n-Set the minimum number of nodes a aggregate has to consist of.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:187\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bm_\ba_\bx_\bL_\be_\bv_\be_\bl\n-int maxLevel() const\n-Get the maximum number of levels allowed in the hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bI_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc\n-void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)\n-Sets reasonable default values for an isotropic problem.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:109\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-AggregationParameters()\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\bk_\bi_\bp_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n-bool skipIsolated() const\n-Whether isolated aggregates will not be represented on the coarse level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:161\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bn_\bT_\ba_\br_\bg_\be_\bt\n-void setCoarsenTarget(int nodes)\n-Set the maximum number of unknowns allowed on the coarsest level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:277\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bN_\bo_\bP_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh_\bS_\bt_\be_\bp_\bs\n-void setNoPreSmoothSteps(std::size_t steps)\n-Set the number of presmoothing steps to apply.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:443\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be\n-AccumulationMode\n-Identifiers for the different accumulation modes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:231\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bB_\be_\bt_\ba\n-void setBeta(double b)\n-Set threshold for marking nodes as isolated. The default value is 1.0E-5.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bm_\ba_\bx_\bD_\bi_\bs_\bt_\ba_\bn_\bc_\be\n-std::size_t maxDistance() const\n-Get the maximal distance allowed between two nodes in a aggregate.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:144\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bG_\ba_\bm_\bm_\ba\n-void setGamma(std::size_t gamma)\n-Set the value of gamma; 1 for V-cycle, 2 for W-cycle.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:476\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be\n-void setAccumulate(bool accu)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:323\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bx_\bD_\bi_\bs_\bt_\ba_\bn_\bc_\be\n-void setMaxDistance(std::size_t distance)\n-Set the maximal distance allowed between two nodes in a aggregate.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:154\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bd_\be_\bb_\bu_\bg_\bL_\be_\bv_\be_\bl\n-int debugLevel() const\n-Get the debugging Level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:434\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b:_\b:_\bg_\be_\bt_\bN_\bo_\bP_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\bS_\bt_\be_\bp_\bs\n-std::size_t getNoPostSmoothSteps() const\n-Get the number of postsmoothing steps to apply.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:468\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\ba_\bt_\bO_\bn_\bc_\be_\bA_\bc_\bc_\bu\n-@ atOnceAccu\n-Accumulate data to one process at once.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:243\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bn_\bo_\bA_\bc_\bc_\bu\n-@ noAccu\n-No data accumulution.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:237\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu\n-@ successiveAccu\n-Successively accumulate to fewer processes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:247\n+10\n+11namespace _\bD_\bu_\bn_\be {\n+12\n+_\b2_\b1 struct _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+22 {\n+_\b2_\b3 enum _\bC_\ba_\bt_\be_\bg_\bo_\br_\by {\n+_\b2_\b5 _\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl,\n+_\b2_\b7 _\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg,\n+29 _\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n+_\b3_\b0 };\n+31\n+33 template\n+_\b3_\b4 static _\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by(const OP& op, decltype(op.category())* = nullptr)\n+35 {\n+36 return op.category();\n+37 }\n+38\n+39#ifndef DOXYGEN\n+40 // template\n+41 // static Category category(const OP& op, decltype(op.getSolverCategory())*\n+= nullptr)\n+42 // {\n+43 // return op.getSolverCategory();\n+44 // }\n+45\n+46 template\n+47 static _\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by(const OP& op, decltype(op.category)* = nullptr)\n+48 {\n+49 return OP::category;\n+50 }\n+51#endif\n+52 };\n+53\n+_\b5_\b4 class _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by : public InvalidStateException{};\n+55\n+58} // end namespace\n+59\n+60#endif\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-Parameters needed to check whether a node depends on another.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:31\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-Parameters needed for the aggregation process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-Parameters for the complete coarsening process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:257\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-All parameters for AMG.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Categories for the solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n+@ nonoverlapping\n+Category for non-overlapping solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n+@ overlapping\n+Category for overlapping solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+static Category category(const OP &op, decltype(op.category()) *=nullptr)\n+Helperfunction to extract the solver category either from an enum, or from the\n+newly introduced virtu...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:54\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00086.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00086.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: renumberer.hh File Reference\n+dune-istl: solverfactory.hh File Reference\n \n \n \n \n \n \n \n@@ -65,46 +65,94 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n-
    renumberer.hh File Reference
    \n+
    solverfactory.hh File Reference
    \n
    \n
    \n-
    #include "aggregates.hh"
    \n+
    #include <unordered_map>
    \n+#include <functional>
    \n+#include <memory>
    \n+#include <dune/common/parametertree.hh>
    \n+#include <dune/common/singleton.hh>
    \n+#include "solverregistry.hh"
    \n+#include <dune/istl/solver.hh>
    \n+#include <dune/istl/schwarz.hh>
    \n+#include <dune/istl/novlpschwarz.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n \n

    \n Classes

    class  Dune::Amg::AggregateRenumberer< G >
    class  Dune::SolverFactory< Operator >
     Factory to assembly solvers configured by a ParameterTree. More...
     
    \n \n \n \n-\n-\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+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 > > >
     
    \n \n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n 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)
     
    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.
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,26 +1,101 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-renumberer.hh File Reference\n-#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+solverfactory.hh File Reference\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh\"\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\b _\bG_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b>\n+\u00a0 Factory to assembly solvers configured by a ParameterTree. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr< _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< X, Y > >\n+ (const M &, const ParameterTree &)\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by = Singleton< ParameterizedObjectFactory<\n+ _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be< M, X, Y > > >\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br< X, Y >\n+ >(const std::shared_ptr< M > &, const ParameterTree &)\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by = Singleton< ParameterizedObjectFactory<\n+ _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be< M, X, Y > > >\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr< _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< X, Y\n+ > >(const std::shared_ptr< _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< X, Y > > &, const std::\n+ shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > > &, const std::shared_ptr<\n+ _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br< X, Y > >, const ParameterTree &)\n+\u00a0\n+template\n+using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by = Singleton< ParameterizedObjectFactory<\n+ _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be< X, Y > > >\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs (const G &graph, I index, I endIndex, V\n- &visitedMap, _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp< typename G::VertexDescriptor > &aggregates)\n+template\n+ std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl (const\n+ std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br > &prec,\n+ const O &)\n+\u00a0\n+template\n+ std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl (const\n+ std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br > &prec,\n+ const std::shared_ptr<\n+ _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< M, X, Y, C >\n+ > &op)\n+\u00a0\n+template\n+ std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl (const\n+ std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br > &prec,\n+ const std::shared_ptr<\n+ _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< M, X, Y,\n+ C > > &op)\n+\u00a0\n+template\n+std::shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const std::\n+ shared_ptr< _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br< M, X, Y > >\n+ &)\n+\u00a0\n+template\n+std::shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const std::\n+ shared_ptr< _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br<\n+ M, X, Y, C > > &op)\n+\u00a0\n+template\n+std::shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const std::\n+ shared_ptr<\n+ _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< M, X, Y,\n+ C > > &op)\n+\u00a0\n+template\n+ std::shared_ptr< _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\br_\bo_\bm_\bF_\ba_\bc_\bt_\bo_\br_\by (std::\n+ typename Operator::domain_type, shared_ptr< Operator > op, const\n+ typename Operator::range_type > >\u00a0 ParameterTree &config, std::shared_ptr<\n+ _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br< typename Operator::\n+ domain_type, typename Operator::\n+ range_type > > prec=nullptr)\n+ Instantiates an _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br from an\n+\u00a0 Operator and a configuration given as a\n+ ParameterTree.\n \u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00086_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00086_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: renumberer.hh Source File\n+dune-istl: solverfactory.hh Source File\n \n \n \n \n \n \n \n@@ -70,122 +70,244 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    renumberer.hh
    \n+
    solverfactory.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_RENUMBERER_HH
    \n-
    6#define DUNE_AMG_RENUMBERER_HH
    \n-
    7
    \n-
    8#include "aggregates.hh"
    \n-
    9
    \n-
    10namespace Dune
    \n-
    11{
    \n-
    12 namespace Amg
    \n-
    13 {
    \n-
    14 template<class G>
    \n-
    \n-\n-
    16 {
    \n-
    17 public:
    \n-
    19 typedef typename G::VertexDescriptor Vertex;
    \n+
    5
    \n+
    6#ifndef DUNE_ISTL_SOLVERFACTORY_HH
    \n+
    7#define DUNE_ISTL_SOLVERFACTORY_HH
    \n+
    8
    \n+
    9#include <unordered_map>
    \n+
    10#include <functional>
    \n+
    11#include <memory>
    \n+
    12
    \n+
    13#include <dune/common/parametertree.hh>
    \n+
    14#include <dune/common/singleton.hh>
    \n+
    15
    \n+
    16#include "solverregistry.hh"
    \n+
    17#include <dune/istl/solver.hh>
    \n+
    18#include <dune/istl/schwarz.hh>
    \n+\n
    20
    \n-\n-
    26
    \n-
    28 operator Vertex() const;
    \n-
    29
    \n-
    30 void operator()(const typename G::ConstEdgeIterator& edge);
    \n+
    21namespace Dune{
    \n+
    26 // Direct solver factory:
    \n+
    27 template<class M, class X, class Y>
    \n+
    28 using DirectSolverSignature = std::shared_ptr<InverseOperator<X,Y>>(const M&, const ParameterTree&);
    \n+
    29 template<class M, class X, class Y>
    \n+
    30 using DirectSolverFactory = Singleton<ParameterizedObjectFactory<DirectSolverSignature<M,X,Y>>>;
    \n
    31
    \n-
    32 void operator++();
    \n-
    33
    \n-
    34 protected:
    \n-\n-\n-
    37 };
    \n-
    \n-
    38
    \n-
    39 template<class G>
    \n-
    \n-\n-
    41 : number_(0), aggregates_(aggregates)
    \n-
    42 {}
    \n-
    \n+
    32 // Preconditioner factory:
    \n+
    33 template<class M, class X, class Y>
    \n+
    34 using PreconditionerSignature = std::shared_ptr<Preconditioner<X,Y>>(const std::shared_ptr<M>&, const ParameterTree&);
    \n+
    35 template<class M, class X, class Y>
    \n+
    36 using PreconditionerFactory = Singleton<ParameterizedObjectFactory<PreconditionerSignature<M,X,Y>>>;
    \n+
    37
    \n+
    38 // Iterative solver factory
    \n+
    39 template<class X, class Y>
    \n+
    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&);
    \n+
    41 template<class X, class Y>
    \n+
    42 using IterativeSolverFactory = Singleton<ParameterizedObjectFactory<IterativeSolverSignature<X,Y>>>;
    \n
    43
    \n-
    44 template<class G>
    \n-
    \n-\n-
    46 {
    \n-
    47 return number_;
    \n-
    48 }
    \n-
    \n-
    49
    \n-
    50 template<class G>
    \n-
    \n-
    51 void AggregateRenumberer<G>::operator()(const typename G::ConstEdgeIterator& edge)
    \n-
    52 {
    \n-
    53 aggregates_[edge.target()]=number_;
    \n-
    54 }
    \n-
    \n-
    55
    \n-
    56 template<class G>
    \n-
    \n-\n-
    58 {
    \n-
    59 ++number_;
    \n-
    60 }
    \n-
    \n-
    61
    \n-
    62 template<class G, class I, class V>
    \n-
    \n-
    63 void renumberAggregates(const G& graph, I index, I endIndex, V& visitedMap,
    \n-\n-
    65 {
    \n-
    66 AggregateRenumberer<G> renumberer(aggregates);
    \n-
    67
    \n-
    68 for(I index1=index; index1 != endIndex; ++index1)
    \n-
    69 if(aggregates[index1.index()]!=AggregatesMap<typename G::VertexDescriptor>::ISOLATED &&
    \n-
    70 !get(visitedMap, index1.index())) {
    \n-
    71
    \n-
    72 aggregates.template breadthFirstSearch<false>(index1.index(), aggregates[index1.index()],
    \n-
    73 graph, renumberer, visitedMap);
    \n-
    74 aggregates[index1.index()] = renumberer;
    \n-
    75 ++renumberer;
    \n-
    76 }
    \n-
    77 for(; index != endIndex; ++index)
    \n-
    78 put(visitedMap, index.index(), false);
    \n-
    79 }
    \n-
    \n-
    80
    \n-
    81 } // namespace AMG
    \n-
    82} // namespace Dune
    \n-
    83#endif
    \n-
    Provides classes for the Coloring process of AMG.
    \n+
    44 // initSolverFactories differs in different compilation units, so we have it
    \n+
    45 // in an anonymous namespace
    \n+
    46 namespace {
    \n+
    47
    \n+
    53 template<class O>
    \n+
    54 int initSolverFactories(){
    \n+
    55 using M = typename O::matrix_type;
    \n+
    56 using X = typename O::range_type;
    \n+
    57 using Y = typename O::domain_type;
    \n+
    58 using TL = Dune::TypeList<M,X,Y>;
    \n+\n+
    60 addRegistryToFactory<TL>(dsfac, DirectSolverTag{});
    \n+\n+
    62 addRegistryToFactory<TL>(pfac, PreconditionerTag{});
    \n+
    63 using TLS = Dune::TypeList<X,Y>;
    \n+\n+
    65 return addRegistryToFactory<TLS>(isfac, IterativeSolverTag{});
    \n+
    66 }
    \n+
    67 } // end anonymous namespace
    \n+
    68
    \n+
    69
    \n+
    70 template<class O, class Preconditioner>
    \n+
    \n+
    71 std::shared_ptr<Preconditioner> wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
    \n+
    72 const O&)
    \n+
    73 {
    \n+
    74 return prec;
    \n+
    75 }
    \n+
    \n+
    76
    \n+
    77 template<class M, class X, class Y, class C, class Preconditioner>
    \n+
    78 std::shared_ptr<Preconditioner>
    \n+
    \n+
    79 wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
    \n+
    80 const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C> >& op)
    \n+
    81 {
    \n+
    82 return std::make_shared<BlockPreconditioner<X,Y,C,Preconditioner> >(prec, op->getCommunication());
    \n+
    83 }
    \n+
    \n+
    84
    \n+
    85 template<class M, class X, class Y, class C, class Preconditioner>
    \n+
    86 std::shared_ptr<Preconditioner>
    \n+
    \n+
    87 wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
    \n+
    88 const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C> >& op)
    \n+
    89 {
    \n+
    90 return std::make_shared<NonoverlappingBlockPreconditioner<C,Preconditioner> >(prec, op->getCommunication());
    \n+
    91 }
    \n+
    \n+
    92
    \n+
    93 template<class M, class X, class Y>
    \n+
    \n+
    94 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<MatrixAdapter<M,X,Y> >&)
    \n+
    95 {
    \n+
    96 return std::make_shared<SeqScalarProduct<X>>();
    \n+
    97 }
    \n+
    \n+
    98 template<class M, class X, class Y, class C>
    \n+
    \n+
    99 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C> >& op)
    \n+
    100 {
    \n+
    101 return createScalarProduct<X>(op->getCommunication(), op->category());
    \n+
    102 }
    \n+
    \n+
    103
    \n+
    104 template<class M, class X, class Y, class C>
    \n+
    \n+
    105 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C> >& op)
    \n+
    106 {
    \n+
    107 return createScalarProduct<X>(op->getCommunication(), op->category());
    \n+
    108 }
    \n+
    \n+
    109
    \n+
    129 template<class Operator>
    \n+
    \n+\n+
    131 using Domain = typename Operator::domain_type;
    \n+
    132 using Range = typename Operator::range_type;
    \n+\n+\n+
    135
    \n+
    136 template<class O>
    \n+
    137 using _matrix_type = typename O::matrix_type;
    \n+
    138 using matrix_type = Std::detected_or_t<int, _matrix_type, Operator>;
    \n+
    139 static constexpr bool isAssembled = !std::is_same<matrix_type, int>::value;
    \n+
    140
    \n+
    141 static const matrix_type* getmat(std::shared_ptr<Operator> op){
    \n+
    142 std::shared_ptr<AssembledLinearOperator<matrix_type, Domain, Range>> aop
    \n+
    143 = std::dynamic_pointer_cast<AssembledLinearOperator<matrix_type, Domain, Range>>(op);
    \n+
    144 if(aop)
    \n+
    145 return &aop->getmat();
    \n+
    146 return nullptr;
    \n+
    147 }
    \n+
    148
    \n+
    149 public:
    \n+
    150
    \n+
    \n+
    153 static std::shared_ptr<Solver> get(std::shared_ptr<Operator> op,
    \n+
    154 const ParameterTree& config,
    \n+
    155 std::shared_ptr<Preconditioner> prec = nullptr){
    \n+
    156 std::string type = config.get<std::string>("type");
    \n+
    157 std::shared_ptr<Solver> result;
    \n+
    158 const matrix_type* mat = getmat(op);
    \n+
    159 if(mat){
    \n+\n+
    161 if(op->category()!=SolverCategory::sequential){
    \n+
    162 DUNE_THROW(NotImplemented, "The solver factory does not support parallel direct solvers!");
    \n+
    163 }
    \n+
    164 result = DirectSolverFactory<matrix_type, Domain, Range>::instance().create(type, *mat, config);
    \n+
    165 return result;
    \n+
    166 }
    \n+
    167 }
    \n+
    168 // if no direct solver is found it might be an iterative solver
    \n+\n+
    170 DUNE_THROW(Dune::InvalidStateException, "Solver not found in the factory.");
    \n+
    171 }
    \n+
    172 if(!prec){
    \n+
    173 const ParameterTree& precConfig = config.sub("preconditioner");
    \n+
    174 std::string prec_type = precConfig.get<std::string>("type");
    \n+
    175 prec = PreconditionerFactory<Operator, Domain, Range>::instance().create(prec_type, op, precConfig);
    \n+
    176 if (prec->category() != op->category() && prec->category() == SolverCategory::sequential)
    \n+
    177 // try to wrap to a parallel preconditioner
    \n+
    178 prec = wrapPreconditioner4Parallel(prec, op);
    \n+
    179 }
    \n+
    180 std::shared_ptr<ScalarProduct<Domain>> sp = createScalarProduct(op);
    \n+
    181 result = IterativeSolverFactory<Domain, Range>::instance().create(type, op, sp, prec, config);
    \n+
    182 return result;
    \n+
    183 }
    \n+
    \n+
    184
    \n+
    \n+
    188 static std::shared_ptr<Preconditioner> getPreconditioner(std::shared_ptr<Operator> op,
    \n+
    189 const ParameterTree& config){
    \n+
    190 const matrix_type* mat = getmat(op);
    \n+
    191 if(mat){
    \n+
    192 std::string prec_type = config.get<std::string>("type");
    \n+
    193 return PreconditionerFactory<Operator, Domain, Range>::instance().create(prec_type, op, config);
    \n+
    194 }else{
    \n+
    195 DUNE_THROW(InvalidStateException, "Could not obtain matrix from operator. Please pass in an AssembledLinearOperator.");
    \n+
    196 }
    \n+
    197 }
    \n+
    \n+
    198 };
    \n+
    \n+
    199
    \n+
    210 template<class Operator>
    \n+
    211 std::shared_ptr<InverseOperator<typename Operator::domain_type,
    \n+
    \n+
    212 typename Operator::range_type>> getSolverFromFactory(std::shared_ptr<Operator> op,
    \n+
    213 const ParameterTree& config,
    \n+
    214 std::shared_ptr<Preconditioner<typename Operator::domain_type,
    \n+
    215 typename Operator::range_type>> prec = nullptr){
    \n+
    216 return SolverFactory<Operator>::get(op, config, prec);
    \n+
    217 }
    \n+
    \n+
    218
    \n+
    222} // end namespace Dune
    \n+
    223
    \n+
    224
    \n+
    225#endif
    \n+\n+\n+\n+
    Define general, extensible interface for inverse operators.
    \n+
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    Singleton< ParameterizedObjectFactory< PreconditionerSignature< M, X, Y > > > PreconditionerFactory
    Definition solverfactory.hh:36
    \n+
    Singleton< ParameterizedObjectFactory< DirectSolverSignature< M, X, Y > > > DirectSolverFactory
    Definition solverfactory.hh:30
    \n+
    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
    \n+
    std::shared_ptr< Preconditioner > wrapPreconditioner4Parallel(const std::shared_ptr< Preconditioner > &prec, const O &)
    Definition solverfactory.hh:71
    \n+
    std::shared_ptr< InverseOperator< X, Y > >(const M &, const ParameterTree &) DirectSolverSignature
    Definition solverfactory.hh:28
    \n+
    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:212
    \n+
    Singleton< ParameterizedObjectFactory< IterativeSolverSignature< X, Y > > > IterativeSolverFactory
    Definition solverfactory.hh:42
    \n+
    std::shared_ptr< Preconditioner< X, Y > >(const std::shared_ptr< M > &, const ParameterTree &) PreconditionerSignature
    Definition solverfactory.hh:34
    \n
    Definition allocator.hh:11
    \n-
    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
    \n-
    void renumberAggregates(const G &graph, I index, I endIndex, V &visitedMap, AggregatesMap< typename G::VertexDescriptor > &aggregates)
    Definition renumberer.hh:63
    \n-
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n-
    Definition renumberer.hh:16
    \n-
    void operator++()
    Definition renumberer.hh:57
    \n-
    G::VertexDescriptor Vertex
    The vertex type.
    Definition renumberer.hh:19
    \n-
    void operator()(const typename G::ConstEdgeIterator &edge)
    Definition renumberer.hh:51
    \n-
    AggregatesMap< Vertex > & aggregates_
    Definition renumberer.hh:36
    \n-
    AggregateRenumberer(AggregatesMap< Vertex > &aggregates)
    Constructor.
    Definition renumberer.hh:40
    \n-
    Vertex number_
    Definition renumberer.hh:35
    \n+
    std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, SolverCategory::Category category)
    Definition scalarproducts.hh:242
    \n+
    A nonoverlapping operator with communication object.
    Definition novlpschwarz.hh:61
    \n+
    Adapter to turn a matrix into a linear operator.
    Definition operators.hh:136
    \n+
    An overlapping Schwarz operator.
    Definition schwarz.hh:75
    \n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+\n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    Factory to assembly solvers configured by a ParameterTree.
    Definition solverfactory.hh:130
    \n+
    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:153
    \n+
    static std::shared_ptr< Preconditioner > getPreconditioner(std::shared_ptr< Operator > op, const ParameterTree &config)
    Construct a Preconditioner for a given Operator.
    Definition solverfactory.hh:188
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,131 +1,298 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-renumberer.hh\n+solverfactory.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_RENUMBERER_HH\n-6#define DUNE_AMG_RENUMBERER_HH\n-7\n-8#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n-9\n-10namespace _\bD_\bu_\bn_\be\n-11{\n-12 namespace Amg\n-13 {\n-14 template\n-_\b1_\b5 class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n-16 {\n-17 public:\n-_\b1_\b9 typedef typename G::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n+5\n+6#ifndef DUNE_ISTL_SOLVERFACTORY_HH\n+7#define DUNE_ISTL_SOLVERFACTORY_HH\n+8\n+9#include \n+10#include \n+11#include \n+12\n+13#include \n+14#include \n+15\n+16#include \"_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh\"\n+17#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n+19#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n 20\n-25 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br(_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates);\n-26\n-28 operator _\bV_\be_\br_\bt_\be_\bx() const;\n-29\n-30 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename G::ConstEdgeIterator& edge);\n+21namespace _\bD_\bu_\bn_\be{\n+26 // Direct solver factory:\n+27 template\n+_\b2_\b8 using _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr>(const\n+M&, const ParameterTree&);\n+29 template\n+_\b3_\b0 using _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by =\n+Singleton>>;\n 31\n-32 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n-33\n-34 protected:\n-_\b3_\b5 _\bV_\be_\br_\bt_\be_\bx _\bn_\bu_\bm_\bb_\be_\br_\b_;\n-_\b3_\b6 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& _\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b_;\n-37 };\n-38\n-39 template\n-_\b4_\b0 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br(_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n-aggregates)\n-41 : number_(0), aggregates_(aggregates)\n-42 {}\n+32 // Preconditioner factory:\n+33 template\n+_\b3_\b4 using _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr>(const\n+std::shared_ptr&, const ParameterTree&);\n+35 template\n+_\b3_\b6 using _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by =\n+Singleton>>;\n+37\n+38 // Iterative solver factory\n+39 template\n+_\b4_\b0 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr>(const\n+std::shared_ptr>&, const std::\n+shared_ptr>&, const std::shared_ptr>,\n+const ParameterTree&);\n+41 template\n+_\b4_\b2 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by =\n+Singleton>>;\n 43\n-44 template\n-_\b4_\b5 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br _\bV_\be_\br_\bt_\be_\bx() const\n-46 {\n-47 return number_;\n-48 }\n-49\n-50 template\n-_\b5_\b1 void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename G::ConstEdgeIterator&\n-edge)\n-52 {\n-53 aggregates_[edge.target()]=number_;\n-54 }\n-55\n-56 template\n-_\b5_\b7 void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-58 {\n-59 ++number_;\n-60 }\n-61\n-62 template\n-_\b6_\b3 void _\br_\be_\bn_\bu_\bm_\bb_\be_\br_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs(const G& graph, I index, I endIndex, V& visitedMap,\n-64 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates)\n-65 {\n-66 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b> renumberer(aggregates);\n-67\n-68 for(I index1=index; index1 != endIndex; ++index1)\n-69 if(aggregates[index1.index()]!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:\n-_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD &&\n-70 !_\bg_\be_\bt(visitedMap, index1.index())) {\n-71\n-72 aggregates.template breadthFirstSearch(index1.index(), aggregates\n-[index1.index()],\n-73 graph, renumberer, visitedMap);\n-74 aggregates[index1.index()] = renumberer;\n-75 ++renumberer;\n-76 }\n-77 for(; index != endIndex; ++index)\n-78 put(visitedMap, index.index(), false);\n-79 }\n-80\n-81 } // namespace AMG\n-82} // namespace Dune\n-83#endif\n-_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n-Provides classes for the Coloring process of AMG.\n+44 // initSolverFactories differs in different compilation units, so we have it\n+45 // in an anonymous namespace\n+46 namespace {\n+47\n+53 template\n+54 int initSolverFactories(){\n+55 using M = typename O::matrix_type;\n+56 using X = typename O::range_type;\n+57 using Y = typename O::domain_type;\n+58 using TL = Dune::TypeList;\n+59 auto& dsfac=_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be();\n+60 addRegistryToFactory(dsfac, DirectSolverTag{});\n+61 auto& pfac=_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bO_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be();\n+62 addRegistryToFactory(pfac, PreconditionerTag{});\n+63 using TLS = Dune::TypeList;\n+64 auto& isfac=_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be();\n+65 return addRegistryToFactory(isfac, IterativeSolverTag{});\n+66 }\n+67 } // end anonymous namespace\n+68\n+69\n+70 template\n+_\b7_\b1 std::shared_ptr _\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl(const std::\n+shared_ptr& prec,\n+72 const O&)\n+73 {\n+74 return prec;\n+75 }\n+76\n+77 template\n+78 std::shared_ptr\n+_\b7_\b9 _\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl(const std::shared_ptr& prec,\n+80 const std::shared_ptr<_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b> >& op)\n+81 {\n+82 return std::make_shared >(prec,\n+op->getCommunication());\n+83 }\n+84\n+85 template\n+86 std::shared_ptr\n+_\b8_\b7 _\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl(const std::shared_ptr& prec,\n+88 const std::shared_ptr<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b> >& op)\n+89 {\n+90 return std::make_shared\n+>(prec, op->getCommunication());\n+91 }\n+92\n+93 template\n+_\b9_\b4 std::shared_ptr> _\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(const std::\n+shared_ptr<_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b> >&)\n+95 {\n+96 return std::make_shared>();\n+97 }\n+98 template\n+_\b9_\b9 std::shared_ptr> _\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(const std::\n+shared_ptr<_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b> >& op)\n+100 {\n+101 return createScalarProduct(op->getCommunication(), op->category());\n+102 }\n+103\n+104 template\n+_\b1_\b0_\b5 std::shared_ptr> _\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(const std::\n+shared_ptr<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b> >& op)\n+106 {\n+107 return createScalarProduct(op->getCommunication(), op->category());\n+108 }\n+109\n+129 template\n+_\b1_\b3_\b0 class _\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by {\n+131 using Domain = typename Operator::domain_type;\n+132 using Range = typename Operator::range_type;\n+133 using _\bS_\bo_\bl_\bv_\be_\br = _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bR_\ba_\bn_\bg_\be_\b>;\n+134 using _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br = _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>;\n+135\n+136 template\n+137 using _matrix_type = typename O::matrix_type;\n+138 using matrix_type = Std::detected_or_t;\n+139 static constexpr bool isAssembled = !std::is_same::value;\n+140\n+141 static const matrix_type* getmat(std::shared_ptr op){\n+142 std::shared_ptr> aop\n+143 = std::dynamic_pointer_cast>(op);\n+144 if(aop)\n+145 return &aop->getmat();\n+146 return nullptr;\n+147 }\n+148\n+149 public:\n+150\n+_\b1_\b5_\b3 static std::shared_ptr _\bg_\be_\bt(std::shared_ptr op,\n+154 const ParameterTree& config,\n+155 std::shared_ptr prec = nullptr){\n+156 std::string type = config.get(\"type\");\n+157 std::shared_ptr result;\n+158 const matrix_type* _\bm_\ba_\bt = getmat(op);\n+159 if(_\bm_\ba_\bt){\n+160 if (_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b,_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().contains\n+(type)) {\n+161 if(op->category()!=_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl){\n+162 DUNE_THROW(NotImplemented, \"The solver factory does not support parallel\n+direct solvers!\");\n+163 }\n+164 result = _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b,_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().create\n+(type, *_\bm_\ba_\bt, config);\n+165 return result;\n+166 }\n+167 }\n+168 // if no direct solver is found it might be an iterative solver\n+169 if (!_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().contains(type)) {\n+170 DUNE_THROW(Dune::InvalidStateException, \"Solver not found in the\n+factory.\");\n+171 }\n+172 if(!prec){\n+173 const ParameterTree& precConfig = config.sub(\"preconditioner\");\n+174 std::string prec_type = precConfig.get(\"type\");\n+175 prec = _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().create\n+(prec_type, op, precConfig);\n+176 if (prec->category() != op->category() && prec->category() ==\n+_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl)\n+177 // try to wrap to a parallel preconditioner\n+178 prec = _\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl(prec, op);\n+179 }\n+180 std::shared_ptr> sp = _\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(op);\n+181 result = _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().create(type, op,\n+sp, prec, config);\n+182 return result;\n+183 }\n+184\n+_\b1_\b8_\b8 static std::shared_ptr _\bg_\be_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br(std::\n+shared_ptr op,\n+189 const ParameterTree& config){\n+190 const matrix_type* _\bm_\ba_\bt = getmat(op);\n+191 if(_\bm_\ba_\bt){\n+192 std::string prec_type = config.get(\"type\");\n+193 return _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().create\n+(prec_type, op, config);\n+194 }else{\n+195 DUNE_THROW(InvalidStateException, \"Could not obtain matrix from operator.\n+Please pass in an AssembledLinearOperator.\");\n+196 }\n+197 }\n+198 };\n+199\n+210 template\n+211 std::shared_ptr> _\bg_\be_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\br_\bo_\bm_\bF_\ba_\bc_\bt_\bo_\br_\by(std::\n+shared_ptr op,\n+213 const ParameterTree& config,\n+214 std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br> prec = nullptr){\n+216 return _\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b:_\b:_\bg_\be_\bt(op, config, prec);\n+217 }\n+218\n+222} // end namespace Dune\n+223\n+224\n+225#endif\n+_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh\n+_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n+Define general, extensible interface for inverse operators.\n+_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n+Singleton< ParameterizedObjectFactory< PreconditionerSignature< M, X, Y > > >\n+PreconditionerFactory\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n+Singleton< ParameterizedObjectFactory< DirectSolverSignature< M, X, Y > > >\n+DirectSolverFactory\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be\n+std::shared_ptr< InverseOperator< X, Y > >(const std::shared_ptr<\n+LinearOperator< X, Y > > &, const std::shared_ptr< ScalarProduct< X > > &,\n+const std::shared_ptr< Preconditioner< X, Y > >, const ParameterTree &)\n+IterativeSolverSignature\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl\n+std::shared_ptr< Preconditioner > wrapPreconditioner4Parallel(const std::\n+shared_ptr< Preconditioner > &prec, const O &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be\n+std::shared_ptr< InverseOperator< X, Y > >(const M &, const ParameterTree &)\n+DirectSolverSignature\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\br_\bo_\bm_\bF_\ba_\bc_\bt_\bo_\br_\by\n+std::shared_ptr< InverseOperator< typename Operator::domain_type, typename\n+Operator::range_type > > getSolverFromFactory(std::shared_ptr< Operator > op,\n+const ParameterTree &config, std::shared_ptr< Preconditioner< typename\n+Operator::domain_type, typename Operator::range_type > > prec=nullptr)\n+Instantiates an InverseOperator from an Operator and a configuration given as a\n+ParameterTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:212\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n+Singleton< ParameterizedObjectFactory< IterativeSolverSignature< X, Y > > >\n+IterativeSolverFactory\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:42\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be\n+std::shared_ptr< Preconditioner< X, Y > >(const std::shared_ptr< M > &, const\n+ParameterTree &) PreconditionerSignature\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:34\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs\n-void renumberAggregates(const G &graph, I index, I endIndex, V &visitedMap,\n-AggregatesMap< typename G::VertexDescriptor > &aggregates)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-Class providing information about the mapping of the vertices onto aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-void operator++()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-G::VertexDescriptor Vertex\n-The vertex type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const typename G::ConstEdgeIterator &edge)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b_\n-AggregatesMap< Vertex > & aggregates_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n-AggregateRenumberer(AggregatesMap< Vertex > &aggregates)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bn_\bu_\bm_\bb_\be_\br_\b_\n-Vertex number_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm,\n+SolverCategory::Category category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:242\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A nonoverlapping operator with communication object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n+Adapter to turn a matrix into a linear operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+An overlapping Schwarz operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b _\b>\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n+Factory to assembly solvers configured by a ParameterTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:130\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b:_\b:_\bg_\be_\bt\n+static std::shared_ptr< Solver > get(std::shared_ptr< Operator > op, const\n+ParameterTree &config, std::shared_ptr< Preconditioner > prec=nullptr)\n+get a solver from the factory\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b:_\b:_\bg_\be_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+static std::shared_ptr< Preconditioner > getPreconditioner(std::shared_ptr<\n+Operator > op, const ParameterTree &config)\n+Construct a Preconditioner for a given Operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:188\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00089.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00089.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: construction.hh File Reference\n+dune-istl: matrixindexset.hh File Reference\n \n \n \n \n \n \n \n@@ -65,68 +65,45 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n- \n+
    matrixindexset.hh File Reference
    \n
    \n
    \n-\n-

    Helper classes for the construction of classes without empty constructor. \n-More...

    \n-
    #include <dune/istl/bvector.hh>
    \n-#include <dune/istl/operators.hh>
    \n-#include <dune/istl/owneroverlapcopy.hh>
    \n-#include <dune/istl/solvercategory.hh>
    \n-#include "pinfo.hh"
    \n+
    #include <algorithm>
    \n+#include <cstddef>
    \n+#include <cstdint>
    \n+#include <set>
    \n+#include <variant>
    \n+#include <vector>
    \n+#include <dune/common/overloadset.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    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::ConstructionTraits< SequentialInformation >
     
    struct  Dune::Amg::ConstructionTraits< OwnerOverlapCopyCommunication< T1, T2 > >
    class  Dune::MatrixIndexSet
     Stores the nonzero entries for creating a sparse matrix. More...
     
    \n \n \n \n-\n-\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n-

    Detailed Description

    \n-

    Helper classes for the construction of classes without empty constructor.

    \n-
    Author
    Markus Blatt
    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,54 +1,25 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-construction.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Helper classes for the construction of classes without empty constructor.\n-_\bM_\bo_\br_\be_\b._\b._\b.\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh>\n-#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n+matrixindexset.hh File Reference\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b<_\b _\bM_\b,_\b _\bC_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC\n- _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,\n- _\bC_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n- _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+\u00a0 Stores the nonzero entries for creating a sparse matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Helper classes for the construction of classes without empty constructor.\n- Author\n- Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00089_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00089_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: construction.hh Source File\n+dune-istl: matrixindexset.hh Source File\n \n \n \n \n \n \n \n@@ -70,260 +70,217 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    construction.hh
    \n+
    matrixindexset.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMGCONSTRUCTION_HH
    \n-
    6#define DUNE_AMGCONSTRUCTION_HH
    \n+
    5#ifndef DUNE_ISTL_MATRIXINDEXSET_HH
    \n+
    6#define DUNE_ISTL_MATRIXINDEXSET_HH
    \n
    7
    \n-\n-\n-\n-\n-
    12#include "pinfo.hh"
    \n-
    13
    \n-
    14namespace Dune
    \n-
    15{
    \n-
    16 namespace Amg
    \n-
    17 {
    \n+
    8#include <algorithm>
    \n+
    9#include <cstddef>
    \n+
    10#include <cstdint>
    \n+
    11#include <set>
    \n+
    12#include <variant>
    \n+
    13#include <vector>
    \n+
    14
    \n+
    15#include <dune/common/overloadset.hh>
    \n+
    16
    \n+
    17namespace Dune {
    \n
    18
    \n-
    37 template<typename T>
    \n-
    38 struct ConstructionTraits
    \n-
    39 {
    \n-
    44 typedef const void* Arguments;
    \n-
    45
    \n-
    \n-
    52 static inline std::shared_ptr<T> construct(Arguments& args)
    \n-
    53 {
    \n-
    54 return std::make_shared<T>();
    \n-
    55 }
    \n-
    \n-
    56 };
    \n-
    57
    \n-
    58 template<class T, class A>
    \n-
    \n-
    59 struct ConstructionTraits<BlockVector<T,A> >
    \n-
    60 {
    \n-
    61 typedef const int Arguments;
    \n-
    \n-
    62 static inline std::shared_ptr<BlockVector<T,A>> construct(Arguments& n)
    \n-
    63 {
    \n-
    64 return std::make_shared<BlockVector<T,A>>(n);
    \n-
    65 }
    \n-
    \n-
    66 };
    \n-
    \n-
    67
    \n-
    68 template<class M, class C>
    \n-
    \n-\n-
    70 {
    \n-
    \n-
    71 ParallelOperatorArgs(std::shared_ptr<M> matrix, const C& comm)
    \n-
    72 : matrix_(matrix), comm_(comm)
    \n-
    73 {}
    \n-
    \n-
    74
    \n-
    75 std::shared_ptr<M> matrix_;
    \n-
    76 const C& comm_;
    \n-
    77 };
    \n-
    \n-
    78
    \n-
    79#if HAVE_MPI
    \n-
    \n-\n-
    81 {
    \n-
    \n-\n-
    83 : comm_(comm), cat_(cat)
    \n-
    84 {}
    \n+
    19
    \n+
    \n+\n+
    37 {
    \n+
    38 using Index = std::uint_least32_t;
    \n+
    39
    \n+
    40 // A vector that partly mimics a std::set by staying
    \n+
    41 // sorted on insert() and having unique values.
    \n+
    42 class FlatSet : public std::vector<Index>
    \n+
    43 {
    \n+
    44 using Base = std::vector<Index>;
    \n+
    45 public:
    \n+
    46 using Base::Base;
    \n+
    47 using Base::begin;
    \n+
    48 using Base::end;
    \n+
    49 void insert(const Index& value) {
    \n+
    50 auto it = std::lower_bound(begin(), end(), value);
    \n+
    51 if ((it == end() or (*it != value)))
    \n+
    52 Base::insert(it, value);
    \n+
    53 }
    \n+
    54 bool contains(const Index& value) const {
    \n+
    55 return std::binary_search(begin(), end(), value);
    \n+
    56 }
    \n+
    57 };
    \n+
    58
    \n+
    59 using RowIndexSet = std::variant<FlatSet, std::set<Index>>;
    \n+
    60
    \n+
    61 public:
    \n+
    62
    \n+
    63 using size_type = Index;
    \n+
    64
    \n+
    76 static constexpr size_type defaultMaxVectorSize = 2048;
    \n+
    77
    \n+
    \n+
    83 MatrixIndexSet(size_type maxVectorSize=defaultMaxVectorSize) noexcept : rows_(0), cols_(0), maxVectorSize_(maxVectorSize)
    \n+
    84 {}
    \n
    \n
    85
    \n-
    86 MPI_Comm comm_;
    \n-\n-
    88 };
    \n-
    \n-
    89#endif
    \n-
    90
    \n-
    \n-\n-
    92 {
    \n
    \n-
    93 SequentialCommunicationArgs(Communication<void*> comm, [[maybe_unused]] int cat)
    \n-
    94 : comm_(comm)
    \n-
    95 {}
    \n-
    \n-
    96
    \n-
    97 Communication<void*> comm_;
    \n-
    98 };
    \n-
    \n-
    99
    \n-
    100 } // end Amg namspace
    \n-
    101
    \n-
    102 // forward declaration
    \n-
    103 template<class M, class X, class Y, class C>
    \n-\n-
    105
    \n-
    106 template<class M, class X, class Y, class C>
    \n-\n-
    108
    \n-
    109 namespace Amg
    \n-
    110 {
    \n-
    111 template<class M, class X, class Y, class C>
    \n-
    \n-
    112 struct ConstructionTraits<OverlappingSchwarzOperator<M,X,Y,C> >
    \n-
    113 {
    \n-\n-
    115
    \n-
    \n-
    116 static inline std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C>> construct(const Arguments& args)
    \n-
    117 {
    \n-
    118 return std::make_shared<OverlappingSchwarzOperator<M,X,Y,C>>
    \n-
    119 (args.matrix_, args.comm_);
    \n-
    120 }
    \n-
    \n-
    121 };
    \n-
    \n-
    122
    \n-
    123 template<class M, class X, class Y, class C>
    \n-
    \n-
    124 struct ConstructionTraits<NonoverlappingSchwarzOperator<M,X,Y,C> >
    \n-
    125 {
    \n-\n-
    127
    \n-
    \n-
    128 static inline std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C>> construct(const Arguments& args)
    \n-
    129 {
    \n-
    130 return std::make_shared<NonoverlappingSchwarzOperator<M,X,Y,C>>
    \n-
    131 (args.matrix_, args.comm_);
    \n-
    132 }
    \n-
    \n-
    133 };
    \n-
    \n-
    134
    \n-
    135 template<class M, class X, class Y>
    \n-
    \n-\n-
    137 {
    \n-
    \n-
    138 MatrixAdapterArgs(std::shared_ptr<M> matrix, const SequentialInformation)
    \n-
    139 : matrix_(matrix)
    \n-
    140 {}
    \n+
    93 MatrixIndexSet(size_type rows, size_type cols, size_type maxVectorSize=defaultMaxVectorSize) : rows_(rows), cols_(cols), maxVectorSize_(maxVectorSize)
    \n+
    94 {
    \n+
    95 indices_.resize(rows_, FlatSet());
    \n+
    96 }
    \n+
    \n+
    97
    \n+
    \n+\n+
    100 rows_ = rows;
    \n+
    101 cols_ = cols;
    \n+
    102 indices_.resize(rows_, FlatSet());
    \n+
    103 }
    \n+
    \n+
    104
    \n+
    \n+\n+
    113 return std::visit(Dune::overload(
    \n+
    114 // If row is stored as set, call insert directly
    \n+
    115 [&](std::set<size_type>& set) {
    \n+
    116 set.insert(col);
    \n+
    117 },
    \n+
    118 // If row is stored as vector only insert directly
    \n+
    119 // if maxVectorSize_ is not reached. Otherwise switch
    \n+
    120 // to set storage first.
    \n+
    121 [&](FlatSet& sortedVector) {
    \n+
    122 if (sortedVector.size() < maxVectorSize_)
    \n+
    123 sortedVector.insert(col);
    \n+
    124 else if (not sortedVector.contains(col))
    \n+
    125 {
    \n+
    126 std::set<size_type> set(sortedVector.begin(), sortedVector.end());
    \n+
    127 set.insert(col);
    \n+
    128 indices_[row] = std::move(set);
    \n+
    129 }
    \n+
    130 }
    \n+
    131 ), indices_[row]);
    \n+
    132 }
    \n+
    \n+
    133
    \n+
    \n+
    135 size_type size() const {
    \n+
    136 size_type entries = 0;
    \n+
    137 for (size_type i=0; i<rows_; i++)
    \n+
    138 entries += rowsize(i);
    \n+
    139 return entries;
    \n+
    140 }
    \n
    \n
    141
    \n-
    142 std::shared_ptr<M> matrix_;
    \n-
    143 };
    \n-
    \n+
    143 size_type rows() const {return rows_;}
    \n
    144
    \n-
    145 template<class M, class X, class Y>
    \n-
    \n-
    146 struct ConstructionTraits<MatrixAdapter<M,X,Y> >
    \n-
    147 {
    \n-\n-
    149
    \n-
    \n-
    150 static inline std::shared_ptr<MatrixAdapter<M,X,Y>> construct(Arguments& args)
    \n-
    151 {
    \n-
    152 return std::make_shared<MatrixAdapter<M,X,Y>>(args.matrix_);
    \n-
    153 }
    \n-
    \n-
    154 };
    \n-
    \n-
    155
    \n-
    156 template<>
    \n-
    \n-
    157 struct ConstructionTraits<SequentialInformation>
    \n-
    158 {
    \n-\n-
    \n-
    160 static inline std::shared_ptr<SequentialInformation> construct(Arguments& args)
    \n-
    161 {
    \n-
    162 return std::make_shared<SequentialInformation>(args.comm_);
    \n-
    163 }
    \n-
    \n-
    164 };
    \n-
    \n-
    165
    \n-
    166
    \n-
    167#if HAVE_MPI
    \n-
    168
    \n-
    169 template<class T1, class T2>
    \n-
    \n-
    170 struct ConstructionTraits<OwnerOverlapCopyCommunication<T1,T2> >
    \n-
    171 {
    \n-\n-
    173
    \n-
    \n-
    174 static inline std::shared_ptr<OwnerOverlapCopyCommunication<T1,T2>> construct(Arguments& args)
    \n-
    175 {
    \n-
    176 return std::make_shared<OwnerOverlapCopyCommunication<T1,T2>>(args.comm_, args.cat_);
    \n-
    177 }
    \n-
    \n-
    178 };
    \n-
    \n+
    146 size_type cols() const {return cols_;}
    \n+
    147
    \n+
    \n+
    157 const auto& columnIndices(size_type row) const {
    \n+
    158 return indices_[row];
    \n+
    159 }
    \n+
    \n+
    160
    \n+
    \n+\n+
    163 return std::visit([&](const auto& rowIndices) {
    \n+
    164 return rowIndices.size();
    \n+
    165 }, indices_[row]);
    \n+
    166 }
    \n+
    \n+
    167
    \n+
    174 template <class MatrixType>
    \n+
    \n+
    175 void import(const MatrixType& m, size_type rowOffset=0, size_type colOffset=0) {
    \n+
    176
    \n+
    177 typedef typename MatrixType::row_type RowType;
    \n+
    178 typedef typename RowType::ConstIterator ColumnIterator;
    \n
    179
    \n-
    180#endif
    \n+
    180 for (size_type rowIdx=0; rowIdx<m.N(); rowIdx++) {
    \n
    181
    \n-
    183 } // namespace Amg
    \n-
    184} // namespace Dune
    \n-
    185#endif
    \n-\n-\n-
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n-
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n-
    const int Arguments
    Definition construction.hh:61
    \n-
    SequentialCommunicationArgs(Communication< void * > comm, int cat)
    Definition construction.hh:93
    \n-
    OwnerOverlapCopyCommunicationArgs(MPI_Comm comm, SolverCategory::Category cat)
    Definition construction.hh:82
    \n-
    MPI_Comm comm_
    Definition construction.hh:86
    \n-
    SolverCategory::Category cat_
    Definition construction.hh:87
    \n-
    const C & comm_
    Definition construction.hh:76
    \n-
    ParallelOperatorArgs(std::shared_ptr< M > matrix, const C &comm)
    Definition construction.hh:71
    \n-
    std::shared_ptr< M > matrix_
    Definition construction.hh:75
    \n-
    const void * Arguments
    A type holding all the arguments needed to call the constructor.
    Definition construction.hh:44
    \n-
    static std::shared_ptr< T > construct(Arguments &args)
    Construct an object with the specified arguments.
    Definition construction.hh:52
    \n-
    Communication< void * > comm_
    Definition construction.hh:97
    \n-
    static std::shared_ptr< BlockVector< T, A > > construct(Arguments &n)
    Definition construction.hh:62
    \n+
    182 const RowType& row = m[rowIdx];
    \n+
    183
    \n+
    184 ColumnIterator cIt = row.begin();
    \n+
    185 ColumnIterator cEndIt = row.end();
    \n+
    186
    \n+
    187 for(; cIt!=cEndIt; ++cIt)
    \n+
    188 add(rowIdx+rowOffset, cIt.index()+colOffset);
    \n+
    189
    \n+
    190 }
    \n+
    191
    \n+
    192 }
    \n+
    \n+
    193
    \n+
    199 template <class MatrixType>
    \n+
    \n+
    200 void exportIdx(MatrixType& matrix) const {
    \n+
    201
    \n+
    202 matrix.setSize(rows_, cols_);
    \n+
    203 matrix.setBuildMode(MatrixType::random);
    \n+
    204
    \n+
    205 for (size_type row=0; row<rows_; row++)
    \n+
    206 matrix.setrowsize(row, rowsize(row));
    \n+
    207
    \n+
    208 matrix.endrowsizes();
    \n+
    209
    \n+
    210 for (size_type row=0; row<rows_; row++) {
    \n+
    211 std::visit([&](const auto& rowIndices) {
    \n+
    212 matrix.setIndicesNoSort(row, rowIndices.begin(), rowIndices.end());
    \n+
    213 }, indices_[row]);
    \n+
    214 }
    \n+
    215
    \n+
    216 matrix.endindices();
    \n+
    217
    \n+
    218 }
    \n+
    \n+
    219
    \n+
    220 private:
    \n+
    221
    \n+
    222 std::vector<RowIndexSet> indices_;
    \n+
    223
    \n+
    224 size_type rows_, cols_;
    \n+
    225 size_type maxVectorSize_;
    \n+
    226
    \n+
    227 };
    \n+
    \n+
    228
    \n+
    229
    \n+
    230} // end namespace Dune
    \n+
    231
    \n+
    232#endif
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n
    Definition allocator.hh:11
    \n-
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n-
    A nonoverlapping operator with communication object.
    Definition novlpschwarz.hh:61
    \n-
    Adapter to turn a matrix into a linear operator.
    Definition operators.hh:136
    \n-
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n-
    Definition construction.hh:70
    \n-\n-
    Definition construction.hh:92
    \n-
    An overlapping Schwarz operator.
    Definition schwarz.hh:75
    \n-
    ParallelOperatorArgs< M, C > Arguments
    Definition construction.hh:114
    \n-
    static std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > construct(const Arguments &args)
    Definition construction.hh:116
    \n-
    ParallelOperatorArgs< M, C > Arguments
    Definition construction.hh:126
    \n-
    static std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > construct(const Arguments &args)
    Definition construction.hh:128
    \n-
    Definition construction.hh:137
    \n-
    MatrixAdapterArgs(std::shared_ptr< M > matrix, const SequentialInformation)
    Definition construction.hh:138
    \n-
    std::shared_ptr< M > matrix_
    Definition construction.hh:142
    \n-
    static std::shared_ptr< MatrixAdapter< M, X, Y > > construct(Arguments &args)
    Definition construction.hh:150
    \n-
    const MatrixAdapterArgs< M, X, Y > Arguments
    Definition construction.hh:148
    \n-
    const SequentialCommunicationArgs Arguments
    Definition construction.hh:159
    \n-
    static std::shared_ptr< SequentialInformation > construct(Arguments &args)
    Definition construction.hh:160
    \n-
    static std::shared_ptr< OwnerOverlapCopyCommunication< T1, T2 > > construct(Arguments &args)
    Definition construction.hh:174
    \n-
    const OwnerOverlapCopyCommunicationArgs Arguments
    Definition construction.hh:172
    \n-
    Definition pinfo.hh:28
    \n-
    Category
    Definition solvercategory.hh:23
    \n+
    Stores the nonzero entries for creating a sparse matrix.
    Definition matrixindexset.hh:37
    \n+
    void resize(size_type rows, size_type cols)
    Reset the size of an index set.
    Definition matrixindexset.hh:99
    \n+
    static constexpr size_type defaultMaxVectorSize
    Default value for maxVectorSize.
    Definition matrixindexset.hh:76
    \n+
    Index size_type
    Definition matrixindexset.hh:63
    \n+
    size_type rows() const
    Return the number of rows.
    Definition matrixindexset.hh:143
    \n+
    void exportIdx(MatrixType &matrix) const
    Initializes a BCRSMatrix with the indices contained in this MatrixIndexSet.
    Definition matrixindexset.hh:200
    \n+
    void add(size_type row, size_type col)
    Add an index to the index set.
    Definition matrixindexset.hh:112
    \n+
    MatrixIndexSet(size_type rows, size_type cols, size_type maxVectorSize=defaultMaxVectorSize)
    Constructor setting the matrix size.
    Definition matrixindexset.hh:93
    \n+
    MatrixIndexSet(size_type maxVectorSize=defaultMaxVectorSize) noexcept
    Constructor with custom maxVectorSize.
    Definition matrixindexset.hh:83
    \n+
    const auto & columnIndices(size_type row) const
    Return column indices of entries in given row.
    Definition matrixindexset.hh:157
    \n+
    size_type rowsize(size_type row) const
    Return the number of entries in a given row.
    Definition matrixindexset.hh:162
    \n+
    size_type size() const
    Return the number of entries.
    Definition matrixindexset.hh:135
    \n+
    size_type cols() const
    Return the number of columns.
    Definition matrixindexset.hh:146
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,300 +1,232 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-construction.hh\n+matrixindexset.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMGCONSTRUCTION_HH\n-6#define DUNE_AMGCONSTRUCTION_HH\n+5#ifndef DUNE_ISTL_MATRIXINDEXSET_HH\n+6#define DUNE_ISTL_MATRIXINDEXSET_HH\n 7\n-8#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-9#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n-10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n-11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh>\n-12#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n-13\n-14namespace _\bD_\bu_\bn_\be\n-15{\n-16 namespace Amg\n-17 {\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14\n+15#include \n+16\n+17namespace _\bD_\bu_\bn_\be {\n 18\n-37 template\n-38 struct ConstructionTraits\n-39 {\n-_\b4_\b4 typedef const void* _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-45\n-_\b5_\b2 static inline std::shared_ptr _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-53 {\n-54 return std::make_shared();\n-55 }\n-56 };\n-57\n-58 template\n-_\b5_\b9 struct ConstructionTraits<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n-60 {\n-_\b6_\b1 typedef const int _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-_\b6_\b2 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& n)\n-63 {\n-64 return std::make_shared>(n);\n-65 }\n-66 };\n-67\n-68 template\n-_\b6_\b9 struct _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs\n-70 {\n-_\b7_\b1 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs(std::shared_ptr matrix, const C& comm)\n-72 : _\bm_\ba_\bt_\br_\bi_\bx_\b_(matrix), _\bc_\bo_\bm_\bm_\b_(comm)\n-73 {}\n-74\n-_\b7_\b5 std::shared_ptr _\bm_\ba_\bt_\br_\bi_\bx_\b_;\n-_\b7_\b6 const C& _\bc_\bo_\bm_\bm_\b_;\n-77 };\n-78\n-79#if HAVE_MPI\n-_\b8_\b0 struct _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-81 {\n-_\b8_\b2 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs(MPI_Comm comm, _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-cat)\n-83 : _\bc_\bo_\bm_\bm_\b_(comm), _\bc_\ba_\bt_\b_(cat)\n+19\n+_\b3_\b6 class _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+37 {\n+38 using Index = std::uint_least32_t;\n+39\n+40 // A vector that partly mimics a std::set by staying\n+41 // sorted on insert() and having unique values.\n+42 class FlatSet : public std::vector\n+43 {\n+44 using Base = std::vector;\n+45 public:\n+46 using Base::Base;\n+47 using Base::begin;\n+48 using Base::end;\n+49 void insert(const Index& value) {\n+50 auto it = std::lower_bound(begin(), end(), value);\n+51 if ((it == end() or (*it != value)))\n+52 Base::insert(it, value);\n+53 }\n+54 bool contains(const Index& value) const {\n+55 return std::binary_search(begin(), end(), value);\n+56 }\n+57 };\n+58\n+59 using RowIndexSet = std::variant>;\n+60\n+61 public:\n+62\n+_\b6_\b3 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = Index;\n+64\n+_\b7_\b6 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bM_\ba_\bx_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be = 2048;\n+77\n+_\b8_\b3 _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be maxVectorSize=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bM_\ba_\bx_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be) noexcept :\n+rows_(0), cols_(0), maxVectorSize_(maxVectorSize)\n 84 {}\n 85\n-_\b8_\b6 MPI_Comm _\bc_\bo_\bm_\bm_\b_;\n-_\b8_\b7 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\b_;\n-88 };\n-89#endif\n-90\n-_\b9_\b1 struct _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-92 {\n-_\b9_\b3 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs(Communication comm, [[maybe_unused]] int\n-cat)\n-94 : _\bc_\bo_\bm_\bm_\b_(comm)\n-95 {}\n-96\n-_\b9_\b7 Communication _\bc_\bo_\bm_\bm_\b_;\n-98 };\n-99\n-100 } // end Amg namspace\n-101\n-102 // forward declaration\n-103 template\n-104 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n-105\n-106 template\n-107 class _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n-108\n-109 namespace Amg\n-110 {\n-111 template\n-_\b1_\b1_\b2 struct ConstructionTraits<_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br >\n-113 {\n-_\b1_\b1_\b4 typedef _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b<_\bM_\b,_\bC_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-115\n-_\b1_\b1_\b6 static inline std::shared_ptr>\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(const _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-117 {\n-118 return std::make_shared>\n-119 (args._\bm_\ba_\bt_\br_\bi_\bx_\b_, args._\bc_\bo_\bm_\bm_\b_);\n-120 }\n-121 };\n-122\n-123 template\n-_\b1_\b2_\b4 struct ConstructionTraits<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br >\n+_\b9_\b3 _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bs, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bs, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+maxVectorSize=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bM_\ba_\bx_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be) : rows_(_\br_\bo_\bw_\bs), cols_(_\bc_\bo_\bl_\bs), maxVectorSize_\n+(maxVectorSize)\n+94 {\n+95 indices_.resize(rows_, FlatSet());\n+96 }\n+97\n+_\b9_\b9 void _\br_\be_\bs_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bs, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bs) {\n+100 rows_ = _\br_\bo_\bw_\bs;\n+101 cols_ = _\bc_\bo_\bl_\bs;\n+102 indices_.resize(rows_, FlatSet());\n+103 }\n+104\n+_\b1_\b1_\b2 void _\ba_\bd_\bd(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl) {\n+113 return std::visit(Dune::overload(\n+114 // If row is stored as set, call insert directly\n+115 [&](std::set& set) {\n+116 set.insert(_\bc_\bo_\bl);\n+117 },\n+118 // If row is stored as vector only insert directly\n+119 // if maxVectorSize_ is not reached. Otherwise switch\n+120 // to set storage first.\n+121 [&](FlatSet& sortedVector) {\n+122 if (sortedVector.size() < maxVectorSize_)\n+123 sortedVector.insert(_\bc_\bo_\bl);\n+124 else if (not sortedVector.contains(_\bc_\bo_\bl))\n 125 {\n-_\b1_\b2_\b6 typedef _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b<_\bM_\b,_\bC_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-127\n-_\b1_\b2_\b8 static inline std::shared_ptr>\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(const _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-129 {\n-130 return std::make_shared>\n-131 (args._\bm_\ba_\bt_\br_\bi_\bx_\b_, args._\bc_\bo_\bm_\bm_\b_);\n+126 std::set set(sortedVector.begin(), sortedVector.end());\n+127 set.insert(_\bc_\bo_\bl);\n+128 indices_[row] = std::move(set);\n+129 }\n+130 }\n+131 ), indices_[row]);\n 132 }\n-133 };\n-134\n-135 template\n-_\b1_\b3_\b6 struct _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs\n-137 {\n-_\b1_\b3_\b8 _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs(std::shared_ptr matrix, const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn)\n-139 : _\bm_\ba_\bt_\br_\bi_\bx_\b_(matrix)\n-140 {}\n+133\n+_\b1_\b3_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const {\n+136 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be entries = 0;\n+137 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i _\bm_\ba_\bt_\br_\bi_\bx_\b_;\n-143 };\n+_\b1_\b4_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bs() const {return rows_;}\n 144\n-145 template\n-_\b1_\b4_\b6 struct ConstructionTraits<_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br >\n-147 {\n-_\b1_\b4_\b8 typedef const _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs_\b<_\bM_\b,_\bX_\b,_\bY_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-149\n-_\b1_\b5_\b0 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs&\n-args)\n-151 {\n-152 return std::make_shared>(args._\bm_\ba_\bt_\br_\bi_\bx_\b_);\n-153 }\n-154 };\n-155\n-156 template<>\n-_\b1_\b5_\b7 struct ConstructionTraits<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn>\n-158 {\n-_\b1_\b5_\b9 typedef const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-_\b1_\b6_\b0 static inline std::shared_ptr _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs&\n-args)\n-161 {\n-162 return std::make_shared(args._\bc_\bo_\bm_\bm_\b_);\n-163 }\n-164 };\n-165\n-166\n-167#if HAVE_MPI\n-168\n-169 template\n-_\b1_\b7_\b0 struct ConstructionTraits<_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn >\n-171 {\n-_\b1_\b7_\b2 typedef const _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-173\n-_\b1_\b7_\b4 static inline std::shared_ptr>\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-175 {\n-176 return std::make_shared>(args._\bc_\bo_\bm_\bm_\b_,\n-args._\bc_\ba_\bt_\b_);\n-177 }\n-178 };\n+_\b1_\b4_\b6 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bs() const {return cols_;}\n+147\n+_\b1_\b5_\b7 const auto& _\bc_\bo_\bl_\bu_\bm_\bn_\bI_\bn_\bd_\bi_\bc_\be_\bs(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row) const {\n+158 return indices_[row];\n+159 }\n+160\n+_\b1_\b6_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bs_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row) const {\n+163 return std::visit([&](const auto& rowIndices) {\n+164 return rowIndices.size();\n+165 }, indices_[row]);\n+166 }\n+167\n+174 template \n+_\b1_\b7_\b5 void import(const MatrixType& m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rowOffset=0, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+colOffset=0) {\n+176\n+177 typedef typename MatrixType::row_type RowType;\n+178 typedef typename RowType::ConstIterator ColumnIterator;\n 179\n-180#endif\n+180 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rowIdx=0; rowIdx_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-const int Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-SequentialCommunicationArgs(Communication< void * > comm, int cat)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-OwnerOverlapCopyCommunicationArgs(MPI_Comm comm, SolverCategory::Category cat)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bc_\bo_\bm_\bm_\b_\n-MPI_Comm comm_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bc_\ba_\bt_\b_\n-SolverCategory::Category cat_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b:_\b:_\bc_\bo_\bm_\bm_\b_\n-const C & comm_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs\n-ParallelOperatorArgs(std::shared_ptr< M > matrix, const C &comm)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n-std::shared_ptr< M > matrix_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-const void * Arguments\n-A type holding all the arguments needed to call the constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< T > construct(Arguments &args)\n-Construct an object with the specified arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bc_\bo_\bm_\bm_\b_\n-Communication< void * > comm_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:97\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< BlockVector< T, A > > construct(Arguments &n)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:62\n+182 const RowType& row = m[rowIdx];\n+183\n+184 ColumnIterator cIt = row.begin();\n+185 ColumnIterator cEndIt = row.end();\n+186\n+187 for(; cIt!=cEndIt; ++cIt)\n+188 _\ba_\bd_\bd(rowIdx+rowOffset, cIt.index()+colOffset);\n+189\n+190 }\n+191\n+192 }\n+193\n+199 template \n+_\b2_\b0_\b0 void _\be_\bx_\bp_\bo_\br_\bt_\bI_\bd_\bx(MatrixType& matrix) const {\n+201\n+202 matrix.setSize(rows_, cols_);\n+203 matrix.setBuildMode(MatrixType::random);\n+204\n+205 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row=0; row indices_;\n+223\n+224 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows_, cols_;\n+225 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be maxVectorSize_;\n+226\n+227 };\n+228\n+229\n+230} // end namespace Dune\n+231\n+232#endif\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-A vector of blocks with memory management.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-A nonoverlapping operator with communication object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n-Adapter to turn a matrix into a linear operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-A class setting up standard communication for a two-valued attribute set with\n-owner/overlap/copy sema...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:92\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-An overlapping Schwarz operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-ParallelOperatorArgs< M, C > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > construct\n-(const Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-ParallelOperatorArgs< M, C > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > construct\n-(const Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:137\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs\n-MatrixAdapterArgs(std::shared_ptr< M > matrix, const SequentialInformation)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:138\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n-std::shared_ptr< M > matrix_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< MatrixAdapter< M, X, Y > > construct(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-const MatrixAdapterArgs< M, X, Y > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:148\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-const SequentialCommunicationArgs Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:159\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< SequentialInformation > construct(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:160\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>_\b:_\b:\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< OwnerOverlapCopyCommunication< T1, T2 > > construct\n-(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-const OwnerOverlapCopyCommunicationArgs Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:172\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+Stores the nonzero entries for creating a sparse matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(size_type rows, size_type cols)\n+Reset the size of an index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:99\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bM_\ba_\bx_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be\n+static constexpr size_type defaultMaxVectorSize\n+Default value for maxVectorSize.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Index size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\br_\bo_\bw_\bs\n+size_type rows() const\n+Return the number of rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:143\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bx_\bp_\bo_\br_\bt_\bI_\bd_\bx\n+void exportIdx(MatrixType &matrix) const\n+Initializes a BCRSMatrix with the indices contained in this MatrixIndexSet.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:200\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\bd_\bd\n+void add(size_type row, size_type col)\n+Add an index to the index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:112\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+MatrixIndexSet(size_type rows, size_type cols, size_type\n+maxVectorSize=defaultMaxVectorSize)\n+Constructor setting the matrix size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:93\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+MatrixIndexSet(size_type maxVectorSize=defaultMaxVectorSize) noexcept\n+Constructor with custom maxVectorSize.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bl_\bu_\bm_\bn_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+const auto & columnIndices(size_type row) const\n+Return column indices of entries in given row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:157\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\br_\bo_\bw_\bs_\bi_\bz_\be\n+size_type rowsize(size_type row) const\n+Return the number of entries in a given row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\bi_\bz_\be\n+size_type size() const\n+Return the number of entries.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:135\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bl_\bs\n+size_type cols() const\n+Return the number of columns.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:146\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00092.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00092.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: indicescoarsener.hh File Reference\n+dune-istl: ilusubdomainsolver.hh File Reference\n \n \n \n \n \n \n \n@@ -65,57 +65,54 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n- \n+
    ilusubdomainsolver.hh File Reference
    \n
    \n
    \n \n-

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

    Various local subdomain solvers based on ILU for SeqOverlappingSchwarz. \n More...

    \n-
    #include <dune/common/parallel/indicessyncer.hh>
    \n-#include <vector>
    \n-#include "renumberer.hh"
    \n-#include <dune/istl/owneroverlapcopy.hh>
    \n-#include "pinfo.hh"
    \n+
    #include <map>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/istl/preconditioners.hh>
    \n+#include "matrix.hh"
    \n+#include <cmath>
    \n+#include <cstdlib>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n \n-\n+\n+\n \n-\n-\n-\n-\n-\n+\n \n

    \n Classes

    class  Dune::Amg::IndicesCoarsener< T, E >
    class  Dune::ILUSubdomainSolver< M, X, Y >
     base class encapsulating common algorithms of ILU0SubdomainSolver and ILUNSubdomainSolver. More...
     
    class  Dune::Amg::ParallelIndicesCoarsener< T, E >
    class  Dune::ILU0SubdomainSolver< M, X, Y >
     Exact subdomain solver using ILU(p) with appropriate p. More...
     
    class  Dune::Amg::IndicesCoarsener< OwnerOverlapCopyCommunication< G, L >, E >
     Coarsen Indices in the parallel case. More...
     
    class  Dune::Amg::IndicesCoarsener< SequentialInformation, E >
     Coarsen Indices in the sequential case. More...
    class  Dune::ILUNSubdomainSolver< M, X, Y >
     
    \n \n \n \n-\n-\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n

    Detailed Description

    \n-

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

    \n+

    Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.

    \n
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,42 +1,35 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-indicescoarsener.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Provides a class for building the index set and remote indices on the coarse\n-level. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \"_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\"\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n-#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n+ilusubdomainsolver.hh File Reference\n+Various local subdomain solvers based on ILU for SeqOverlappingSchwarz. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n+#include \"_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\b _\bT_\b,_\b _\bE_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0 base class encapsulating common algorithms of _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br and\n+ _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\b _\bT_\b,_\b _\bE_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0 Exact subdomain solver using _\bI_\bL_\bU_\b(_\bp_\b) with appropriate p. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bG_\b,_\b _\bL_\b _\b>_\b,_\b _\bE_\b _\b>\n-\u00a0 Coarsen Indices in the parallel case. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bE_\b _\b>\n-\u00a0 Coarsen Indices in the sequential case. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides a class for building the index set and remote indices on the coarse\n-level.\n+Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.\n Author\n Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00092_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00092_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: indicescoarsener.hh Source File\n+dune-istl: ilusubdomainsolver.hh Source File\n \n \n \n \n \n \n \n@@ -70,446 +70,239 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    indicescoarsener.hh
    \n+
    ilusubdomainsolver.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_INDICESCOARSENER_HH
    \n-
    6#define DUNE_AMG_INDICESCOARSENER_HH
    \n+
    5#ifndef DUNE_ISTL_ILUSUBDOMAINSOLVER_HH
    \n+
    6#define DUNE_ISTL_ILUSUBDOMAINSOLVER_HH
    \n
    7
    \n-
    8#include <dune/common/parallel/indicessyncer.hh>
    \n-
    9#include <vector>
    \n-
    10#include "renumberer.hh"
    \n-
    11
    \n-
    12#if HAVE_MPI
    \n-\n-
    14#endif
    \n-
    15
    \n-
    16#include "pinfo.hh"
    \n-
    17
    \n-
    18namespace Dune
    \n-
    19{
    \n-
    20 namespace Amg
    \n-
    21 {
    \n-
    22
    \n-
    34 template<typename T, typename E>
    \n-
    \n-\n-
    36 {};
    \n-
    \n-
    37
    \n-
    38
    \n-
    39#if HAVE_MPI
    \n-
    40
    \n-
    41 template<typename T, typename E>
    \n-
    \n-\n-
    43 {
    \n-
    44 public:
    \n-\n-
    49
    \n-\n-
    54
    \n-
    55 typedef typename ParallelInformation::ParallelIndexSet ParallelIndexSet;
    \n-
    56
    \n-
    60 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
    \n-
    61
    \n-
    65 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
    \n-
    66
    \n-
    70 typedef typename LocalIndex::Attribute Attribute;
    \n-
    71
    \n-
    75 typedef Dune::RemoteIndices<ParallelIndexSet> RemoteIndices;
    \n-
    76
    \n-
    92 template<typename Graph, typename VM>
    \n-
    93 static typename Graph::VertexDescriptor
    \n-
    \n-\n-
    95 Graph& fineGraph,
    \n-
    96 VM& visitedMap,
    \n-\n-
    98 ParallelInformation& coarseInfo,
    \n-
    99 typename Graph::VertexDescriptor noAggregates,
    \n-
    100 bool useFixedOrder = false);
    \n-
    101
    \n-
    102 private:
    \n-
    103 template<typename G, typename I>
    \n-
    104 class ParallelAggregateRenumberer : public AggregateRenumberer<G>
    \n-
    105 {
    \n-
    106 typedef typename G::VertexDescriptor Vertex;
    \n-
    107
    \n-
    108 typedef I GlobalLookupIndexSet;
    \n-
    109
    \n-
    110 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;
    \n-
    111
    \n-
    112 typedef typename IndexPair::GlobalIndex GlobalIndex;
    \n-
    113
    \n-
    114 public:
    \n-
    \n-\n-
    116 : AggregateRenumberer<G>(aggregates), isPublic_(false), lookup_(lookup),
    \n-
    117 globalIndex_(std::numeric_limits<GlobalIndex>::max())
    \n-
    118 {}
    \n-
    \n-
    119
    \n+
    8#include <map>
    \n+
    9#include <dune/common/typetraits.hh>
    \n+\n+
    11#include "matrix.hh"
    \n+
    12#include <cmath>
    \n+
    13#include <cstdlib>
    \n+
    14
    \n+
    15namespace Dune {
    \n+
    16
    \n+
    35 template<class M, class X, class Y>
    \n+
    \n+\n+
    37 public:
    \n+
    39 typedef typename std::remove_const<M>::type matrix_type;
    \n+
    41 typedef X domain_type;
    \n+
    43 typedef Y range_type;
    \n+
    44
    \n+
    51 virtual void apply (X& v, const Y& d) =0;
    \n+
    52
    \n+
    \n+\n+
    54 {}
    \n+
    \n+
    55
    \n+
    56 protected:
    \n+
    62 template<class S>
    \n+
    63 std::size_t copyToLocalMatrix(const M& A, S& rowset);
    \n+
    64
    \n+
    66 // for ILUN
    \n+\n+
    68 };
    \n+
    \n+
    69
    \n+
    76 template<class M, class X, class Y>
    \n+
    \n+\n+
    78 : public ILUSubdomainSolver<M,X,Y>{
    \n+
    79 public:
    \n+
    81 typedef typename std::remove_const<M>::type matrix_type;
    \n+
    82 typedef typename std::remove_const<M>::type rilu_type;
    \n+
    84 typedef X domain_type;
    \n+
    86 typedef Y range_type;
    \n+
    87
    \n+
    88
    \n+
    \n+
    93 void apply (X& v, const Y& d)
    \n+
    94 {
    \n+
    95 ILU::blockILUBacksolve(this->ILU,v,d);
    \n+
    96 }
    \n+
    \n+
    104 template<class S>
    \n+
    105 void setSubMatrix(const M& A, S& rowset);
    \n+
    106
    \n+
    107 };
    \n+
    \n+
    108
    \n+
    109 template<class M, class X, class Y>
    \n+
    \n+\n+
    111 : public ILUSubdomainSolver<M,X,Y>{
    \n+
    112 public:
    \n+
    114 typedef typename std::remove_const<M>::type matrix_type;
    \n+
    115 typedef typename std::remove_const<M>::type rilu_type;
    \n+
    117 typedef X domain_type;
    \n+
    119 typedef Y range_type;
    \n
    120
    \n-
    \n-
    121 void operator()(const typename G::ConstEdgeIterator& edge)
    \n-
    122 {
    \n-\n-
    124 const IndexPair* pair= lookup_.pair(edge.target());
    \n-
    125 if(pair!=0) {
    \n-
    126 globalIndex(pair->global());
    \n-
    127 attribute(pair->local().attribute());
    \n-
    128 isPublic(pair->local().isPublic());
    \n-
    129 }
    \n-
    130 }
    \n-
    \n-
    131
    \n-
    \n-
    132 Vertex operator()([[maybe_unused]] const GlobalIndex& global)
    \n-
    133 {
    \n-
    134 Vertex current = this->number_;
    \n-
    135 this->operator++();
    \n-
    136 return current;
    \n-
    137 }
    \n-
    \n-
    138
    \n-
    \n-
    139 bool isPublic()
    \n-
    140 {
    \n-
    141 return isPublic_;
    \n-
    142 }
    \n-
    \n-
    143
    \n-
    \n-
    144 void isPublic(bool b)
    \n-
    145 {
    \n-
    146 isPublic_ = isPublic_ || b;
    \n-
    147 }
    \n+
    \n+
    125 void apply (X& v, const Y& d)
    \n+
    126 {
    \n+
    127 ILU::blockILUBacksolve(RILU,v,d);
    \n+
    128 }
    \n+
    \n+
    129
    \n+
    137 template<class S>
    \n+
    138 void setSubMatrix(const M& A, S& rowset);
    \n+
    139
    \n+
    140 private:
    \n+
    144 rilu_type RILU;
    \n+
    145 };
    \n
    \n+
    146
    \n+
    147
    \n
    148
    \n-
    \n-
    149 void reset()
    \n-
    150 {
    \n-
    151 globalIndex_ = std::numeric_limits<GlobalIndex>::max();
    \n-
    152 isPublic_=false;
    \n-
    153 }
    \n-
    \n-
    154
    \n-
    \n-\n-
    156 {
    \n-
    157 attribute_=attribute;
    \n-
    158 }
    \n-
    \n-
    159
    \n-
    \n-\n-
    161 {
    \n-
    162 return attribute_;
    \n-
    163 }
    \n-
    \n-
    164
    \n-
    \n-
    165 const GlobalIndex& globalIndex() const
    \n-
    166 {
    \n-
    167 return globalIndex_;
    \n-
    168 }
    \n-
    \n-
    169
    \n-
    \n-
    170 void globalIndex(const GlobalIndex& global)
    \n-
    171 {
    \n-
    172 globalIndex_ = global;
    \n-
    173 }
    \n-
    \n-
    174
    \n-
    175 private:
    \n-
    176 bool isPublic_;
    \n-
    177 Attribute attribute_;
    \n-
    178 const GlobalLookupIndexSet& lookup_;
    \n-
    179 GlobalIndex globalIndex_;
    \n-
    180 };
    \n-
    181
    \n-
    182 template<typename Graph, typename VM, typename I>
    \n-
    183 static void buildCoarseIndexSet(const ParallelInformation& pinfo,
    \n-
    184 Graph& fineGraph,
    \n-
    185 VM& visitedMap,
    \n-\n-
    187 ParallelIndexSet& coarseIndices,
    \n-
    188 ParallelAggregateRenumberer<Graph,I>& renumberer);
    \n-
    189
    \n-
    190 template<typename Graph,typename I>
    \n-
    191 static void buildCoarseRemoteIndices(const RemoteIndices& fineRemote,
    \n-\n-
    193 ParallelIndexSet& coarseIndices,
    \n-
    194 RemoteIndices& coarseRemote,
    \n-
    195 ParallelAggregateRenumberer<Graph,I>& renumberer,
    \n-
    196 bool useFixedOrder);
    \n-
    197
    \n-
    198 };
    \n-
    199
    \n-
    203 template<typename G, typename L, typename E>
    \n-
    \n-\n-
    205 : public ParallelIndicesCoarsener<OwnerOverlapCopyCommunication<G,L>,E>
    \n-
    206 {};
    \n-
    \n-
    207
    \n-
    208
    \n-
    209#endif
    \n-
    210
    \n-
    217 template<typename E>
    \n-
    \n-\n-
    219 {
    \n-
    220 public:
    \n-
    221 template<typename Graph, typename VM>
    \n-
    222 static typename Graph::VertexDescriptor
    \n-
    223 coarsen(const SequentialInformation & fineInfo,
    \n-
    224 Graph& fineGraph,
    \n-
    225 VM& visitedMap,
    \n-\n-
    227 SequentialInformation& coarseInfo,
    \n-
    228 typename Graph::VertexDescriptor noAggregates,
    \n-
    229 bool useFixedOrder = false);
    \n-
    230 };
    \n-
    \n-
    231
    \n-
    232#if HAVE_MPI
    \n-
    233 template<typename T, typename E>
    \n-
    234 template<typename Graph, typename VM>
    \n-
    235 inline typename Graph::VertexDescriptor
    \n-
    \n-\n-
    237 Graph& fineGraph,
    \n-
    238 VM& visitedMap,
    \n-\n-
    240 ParallelInformation& coarseInfo,
    \n-
    241 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates,
    \n-
    242 bool useFixedOrder)
    \n-
    243 {
    \n-
    244 ParallelAggregateRenumberer<Graph,typename ParallelInformation::GlobalLookupIndexSet> renumberer(aggregates, fineInfo.globalLookup());
    \n-
    245 buildCoarseIndexSet(fineInfo, fineGraph, visitedMap, aggregates,
    \n-
    246 coarseInfo.indexSet(), renumberer);
    \n-
    247 buildCoarseRemoteIndices(fineInfo.remoteIndices(), aggregates, coarseInfo.indexSet(),
    \n-
    248 coarseInfo.remoteIndices(), renumberer, useFixedOrder);
    \n-
    249
    \n-
    250 return renumberer;
    \n-
    251 }
    \n-
    \n-
    \n-
    252
    \n-
    253 template<typename T, typename E>
    \n-
    254 template<typename Graph, typename VM, typename I>
    \n-
    255 void ParallelIndicesCoarsener<T,E>::buildCoarseIndexSet(const ParallelInformation& pinfo,
    \n-
    256 Graph& fineGraph,
    \n-
    257 VM& visitedMap,
    \n-\n-
    259 ParallelIndexSet& coarseIndices,
    \n-
    260 ParallelAggregateRenumberer<Graph,I>& renumberer)
    \n-
    261 {
    \n-
    262 // fineGraph is the local subgraph corresponding to the vertices the process owns.
    \n-
    263 // i.e. no overlap/copy vertices can be visited traversing the graph
    \n-
    264 typedef typename Graph::ConstVertexIterator Iterator;
    \n-
    265 typedef typename ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet;
    \n-
    266
    \n-
    267 Iterator end = fineGraph.end();
    \n-
    268 const GlobalLookupIndexSet& lookup = pinfo.globalLookup();
    \n-
    269
    \n-
    270 coarseIndices.beginResize();
    \n-
    271
    \n-
    272 // Setup the coarse index set and renumber the aggregate consecutively
    \n-
    273 // ascending from zero according to the minimum global index belonging
    \n-
    274 // to the aggregate
    \n-
    275 for(Iterator index = fineGraph.begin(); index != end; ++index) {
    \n-\n-
    277 // Isolated vertices will not be represented on the next level.
    \n-
    278 // These should only be there if skipIsolated is activiated in
    \n-
    279 // the coarsening criterion as otherwise they will be aggregated
    \n-
    280 // and should have real aggregate number in the map right now.
    \n-
    281 if(!get(visitedMap, *index)) {
    \n-
    282 // This vertex was not visited by breadthFirstSearch yet.
    \n-
    283 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;
    \n-
    284 const IndexPair* pair= lookup.pair(*index);
    \n-
    285
    \n-
    286 renumberer.reset(); // reset attribute and global index.
    \n-
    287 if(pair!=0) {
    \n-
    288 // vertex is in the index set. Note that not all vertices have
    \n-
    289 // to be in the index set, just the ones where communication
    \n-
    290 // will happen.
    \n-
    291 assert(!ExcludedAttributes::contains(pair->local().attribute()));
    \n-
    292 renumberer.attribute(pair->local().attribute());
    \n-
    293 renumberer.isPublic(pair->local().isPublic());
    \n-
    294 renumberer.globalIndex(pair->global());
    \n-
    295 }
    \n-
    296
    \n-
    297 // Reconstruct aggregate and mark vertices as visited
    \n-
    298 aggregates.template breadthFirstSearch<false>(*index, aggregates[*index],
    \n-
    299 fineGraph, renumberer, visitedMap);
    \n-
    300
    \n-
    301 if(renumberer.globalIndex()!=std::numeric_limits<GlobalIndex>::max()) {
    \n-
    302 // vertex is in the index set.
    \n-
    303 //std::cout <<" Adding global="<< renumberer.globalIndex()<<" local="<<static_cast<std::size_t>(renumberer)<<std::endl;
    \n-
    304 coarseIndices.add(renumberer.globalIndex(),
    \n-
    305 LocalIndex(renumberer, renumberer.attribute(),
    \n-
    306 renumberer.isPublic()));
    \n-
    307 }
    \n-
    308
    \n-
    309 aggregates[*index] = renumberer;
    \n-
    310 ++renumberer;
    \n-
    311 }
    \n-
    312 }
    \n-
    313
    \n-
    314 coarseIndices.endResize();
    \n-
    315
    \n-
    316 assert(static_cast<std::size_t>(renumberer) >= coarseIndices.size());
    \n-
    317
    \n-
    318 // Reset the visited flags
    \n-
    319 for(Iterator vertex=fineGraph.begin(); vertex != end; ++vertex)
    \n-
    320 put(visitedMap, *vertex, false);
    \n-
    321 }
    \n-
    322
    \n-
    323 template<typename T, typename E>
    \n-
    324 template<typename Graph, typename I>
    \n-
    325 void ParallelIndicesCoarsener<T,E>::buildCoarseRemoteIndices(const RemoteIndices& fineRemote,
    \n-
    326 const AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
    \n-
    327 ParallelIndexSet& coarseIndices,
    \n-
    328 RemoteIndices& coarseRemote,
    \n-
    329 ParallelAggregateRenumberer<Graph,I>& renumberer,
    \n-
    330 bool useFixedOrder)
    \n-
    331 {
    \n-
    332 std::vector<char> attributes(static_cast<std::size_t>(renumberer));
    \n-
    333
    \n-
    334 GlobalLookupIndexSet<ParallelIndexSet> coarseLookup(coarseIndices, static_cast<std::size_t>(renumberer));
    \n-
    335
    \n-
    336 typedef typename RemoteIndices::const_iterator Iterator;
    \n-
    337 Iterator end = fineRemote.end();
    \n-
    338
    \n-
    339 for(Iterator neighbour = fineRemote.begin();
    \n-
    340 neighbour != end; ++neighbour) {
    \n-
    341 int process = neighbour->first;
    \n-
    342
    \n-
    343 assert(neighbour->second.first==neighbour->second.second);
    \n-
    344
    \n-
    345 // Mark all as not known
    \n-
    346 typedef typename std::vector<char>::iterator CIterator;
    \n-
    347
    \n-
    348 for(CIterator iter=attributes.begin(); iter!= attributes.end(); ++iter)
    \n-
    349 *iter = std::numeric_limits<char>::max();
    \n-
    350
    \n-
    351 auto riEnd = neighbour->second.second->end();
    \n-
    352
    \n-
    353 for(auto index = neighbour->second.second->begin();
    \n-
    354 index != riEnd; ++index) {
    \n-
    355 if(!E::contains(index->localIndexPair().local().attribute()) &&
    \n-
    356 aggregates[index->localIndexPair().local()] !=
    \n-\n-
    358 {
    \n-
    359 assert(aggregates[index->localIndexPair().local()]<attributes.size());
    \n-
    360 if (attributes[aggregates[index->localIndexPair().local()]] != 3)
    \n-
    361 attributes[aggregates[index->localIndexPair().local()]] = index->attribute();
    \n-
    362 }
    \n-
    363 }
    \n-
    364
    \n-
    365 // Build remote index list
    \n-
    366 typedef RemoteIndexListModifier<ParallelIndexSet,typename RemoteIndices::Allocator,false> Modifier;
    \n-
    367 typedef typename RemoteIndices::RemoteIndex RemoteIndex;
    \n-
    368 typedef typename ParallelIndexSet::const_iterator IndexIterator;
    \n-
    369
    \n-
    370 Modifier coarseList = coarseRemote.template getModifier<false,true>(process);
    \n-
    371
    \n-
    372 IndexIterator iend = coarseIndices.end();
    \n-
    373 for(IndexIterator index = coarseIndices.begin(); index != iend; ++index)
    \n-
    374 if(attributes[index->local()] != std::numeric_limits<char>::max()) {
    \n-
    375 // remote index is present
    \n-
    376 coarseList.insert(RemoteIndex(Attribute(attributes[index->local()]), &(*index)));
    \n-
    377 }
    \n-
    378 //std::cout<<coarseRemote<<std::endl;
    \n-
    379 }
    \n-
    380
    \n-
    381 // The number of neighbours should not change!
    \n-
    382 assert(coarseRemote.neighbours()==fineRemote.neighbours());
    \n-
    383
    \n-
    384 // sync the index set and the remote indices to recompute missing
    \n-
    385 // indices
    \n-
    386 IndicesSyncer<ParallelIndexSet> syncer(coarseIndices, coarseRemote);
    \n-
    387 syncer.sync(renumberer, useFixedOrder);
    \n-
    388
    \n-
    389 }
    \n-
    390
    \n-
    391#endif
    \n-
    392
    \n-
    393 template<typename E>
    \n-
    394 template<typename Graph, typename VM>
    \n-
    395 typename Graph::VertexDescriptor
    \n-
    \n-\n-
    397 [[maybe_unused]] const SequentialInformation& fineInfo,
    \n-
    398 [[maybe_unused]] Graph& fineGraph,
    \n-
    399 [[maybe_unused]] VM& visitedMap,
    \n-
    400 [[maybe_unused]] AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
    \n-
    401 [[maybe_unused]] SequentialInformation& coarseInfo,
    \n-
    402 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates,
    \n-
    403 [[maybe_unused]] bool useFixedOrder)
    \n-
    404 {
    \n-
    405 return noAggregates;
    \n-
    406 }
    \n-
    \n-
    407
    \n-
    408 } //namespace Amg
    \n-
    409} // namespace Dune
    \n-
    410#endif
    \n-
    \n-\n-\n-
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n-\n-
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition indicescoarsener.hh:70
    \n-
    void operator()(const typename G::ConstEdgeIterator &edge)
    Definition indicescoarsener.hh:121
    \n-
    void isPublic(bool b)
    Definition indicescoarsener.hh:144
    \n-
    ParallelInformation::ParallelIndexSet ParallelIndexSet
    Definition indicescoarsener.hh:55
    \n-\n-
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition indicescoarsener.hh:65
    \n-
    T ParallelInformation
    The type of the parallel information.
    Definition indicescoarsener.hh:53
    \n-
    Attribute attribute()
    Definition indicescoarsener.hh:160
    \n-
    Vertex operator()(const GlobalIndex &global)
    Definition indicescoarsener.hh:132
    \n-
    static const V ISOLATED
    Identifier of isolated vertices.
    Definition aggregates.hh:571
    \n-
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition indicescoarsener.hh:60
    \n-
    void attribute(const Attribute &attribute)
    Definition indicescoarsener.hh:155
    \n-
    E ExcludedAttributes
    The set of excluded attributes.
    Definition indicescoarsener.hh:48
    \n-
    void globalIndex(const GlobalIndex &global)
    Definition indicescoarsener.hh:170
    \n-
    Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
    The type of the remote indices.
    Definition indicescoarsener.hh:75
    \n-
    static Graph::VertexDescriptor coarsen(ParallelInformation &fineInfo, Graph &fineGraph, VM &visitedMap, AggregatesMap< typename Graph::VertexDescriptor > &aggregates, ParallelInformation &coarseInfo, typename Graph::VertexDescriptor noAggregates, bool useFixedOrder=false)
    Build the coarse index set after the aggregatio.
    Definition indicescoarsener.hh:236
    \n-
    ParallelAggregateRenumberer(AggregatesMap< Vertex > &aggregates, const I &lookup)
    Definition indicescoarsener.hh:115
    \n-
    const GlobalIndex & globalIndex() const
    Definition indicescoarsener.hh:165
    \n-
    STL namespace.
    \n+
    149 template<class M, class X, class Y>
    \n+
    150 template<class S>
    \n+
    \n+
    151 std::size_t ILUSubdomainSolver<M,X,Y>::copyToLocalMatrix(const M& A, S& rowSet)
    \n+
    152 {
    \n+
    153 // Calculate consecutive indices for local problem
    \n+
    154 // while preserving the ordering
    \n+
    155 typedef typename M::size_type size_type;
    \n+
    156 typedef std::map<typename S::value_type,size_type> IndexMap;
    \n+
    157 typedef typename IndexMap::iterator IMIter;
    \n+
    158 IndexMap indexMap;
    \n+
    159 IMIter guess = indexMap.begin();
    \n+
    160 size_type localIndex=0;
    \n+
    161
    \n+
    162 typedef typename S::const_iterator SIter;
    \n+
    163 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
    \n+
    164 rowIdx!= rowEnd; ++rowIdx, ++localIndex)
    \n+
    165 guess = indexMap.insert(guess,
    \n+
    166 std::make_pair(*rowIdx,localIndex));
    \n+
    167
    \n+
    168
    \n+
    169 // Build Matrix for local subproblem
    \n+
    170 ILU.setSize(rowSet.size(),rowSet.size());
    \n+
    171 ILU.setBuildMode(matrix_type::row_wise);
    \n+
    172
    \n+
    173 // Create sparsity pattern
    \n+
    174 typedef typename matrix_type::CreateIterator CIter;
    \n+
    175 CIter rowCreator = ILU.createbegin();
    \n+
    176 std::size_t offset=0;
    \n+
    177 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
    \n+
    178 rowIdx!= rowEnd; ++rowIdx, ++rowCreator) {
    \n+
    179 // See which row entries are in our subset and add them to
    \n+
    180 // the sparsity pattern
    \n+
    181 guess = indexMap.begin();
    \n+
    182
    \n+
    183 for(typename matrix_type::ConstColIterator col=A[*rowIdx].begin(),
    \n+
    184 endcol=A[*rowIdx].end(); col != endcol; ++col) {
    \n+
    185 // search for the entry in the row set
    \n+
    186 guess = indexMap.find(col.index());
    \n+
    187 if(guess!=indexMap.end()) {
    \n+
    188 // add local index to row
    \n+
    189 rowCreator.insert(guess->second);
    \n+
    190 offset=std::max(offset,(std::size_t)std::abs((int)(guess->second-rowCreator.index())));
    \n+
    191 }
    \n+
    192 }
    \n+
    193
    \n+
    194 }
    \n+
    195
    \n+
    196 // Insert the matrix values for the local problem
    \n+
    197 typename matrix_type::iterator iluRow=ILU.begin();
    \n+
    198
    \n+
    199 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();
    \n+
    200 rowIdx!= rowEnd; ++rowIdx, ++iluRow) {
    \n+
    201 // See which row entries are in our subset and add them to
    \n+
    202 // the sparsity pattern
    \n+
    203 typename matrix_type::ColIterator localCol=iluRow->begin();
    \n+
    204 for(typename matrix_type::ConstColIterator col=A[*rowIdx].begin(),
    \n+
    205 endcol=A[*rowIdx].end(); col != endcol; ++col) {
    \n+
    206 // search for the entry in the row set
    \n+
    207 guess = indexMap.find(col.index());
    \n+
    208 if(guess!=indexMap.end()) {
    \n+
    209 // set local value
    \n+
    210 (*localCol)=(*col);
    \n+
    211 ++localCol;
    \n+
    212 }
    \n+
    213 }
    \n+
    214 }
    \n+
    215 return offset;
    \n+
    216 }
    \n+
    \n+
    217
    \n+
    218
    \n+
    219 template<class M, class X, class Y>
    \n+
    220 template<class S>
    \n+
    \n+\n+
    222 {
    \n+
    223 this->copyToLocalMatrix(A,rowSet);
    \n+\n+
    225 }
    \n+
    \n+
    226
    \n+
    227 template<class M, class X, class Y>
    \n+
    228 template<class S>
    \n+
    \n+\n+
    230 {
    \n+
    231 std::size_t offset=copyToLocalMatrix(A,rowSet);
    \n+
    232 RILU.setSize(rowSet.size(),rowSet.size(), (1+2*offset)*rowSet.size());
    \n+
    233 RILU.setBuildMode(matrix_type::row_wise);
    \n+
    234 ILU::blockILUDecomposition(this->ILU, (offset+1)/2, RILU);
    \n+
    235 }
    \n+
    \n+
    236
    \n+
    238} // end name space DUNE
    \n+
    239
    \n+
    240
    \n+
    241#endif
    \n+
    Define general preconditioner interface.
    \n+
    A dynamic dense block matrix class.
    \n+
    std::size_t copyToLocalMatrix(const M &A, S &rowset)
    Copy the local part of the global matrix to ILU.
    Definition ilusubdomainsolver.hh:151
    \n+
    void setSubMatrix(const M &A, S &rowset)
    Set the data of the local problem.
    Definition ilusubdomainsolver.hh:229
    \n+
    void setSubMatrix(const M &A, S &rowset)
    Set the data of the local problem.
    Definition ilusubdomainsolver.hh:221
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n
    Definition allocator.hh:11
    \n-
    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
    \n-
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n-
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n-
    Definition indicescoarsener.hh:36
    \n-
    Definition indicescoarsener.hh:43
    \n-
    Definition pinfo.hh:28
    \n-
    Definition renumberer.hh:16
    \n-
    void operator++()
    Definition renumberer.hh:57
    \n-
    void operator()(const typename G::ConstEdgeIterator &edge)
    Definition renumberer.hh:51
    \n-
    Vertex number_
    Definition renumberer.hh:35
    \n+
    void blockILUBacksolve(const M &A, X &v, const Y &d)
    LU backsolve with stored inverse.
    Definition ilu.hh:94
    \n+
    void blockILU0Decomposition(M &A)
    compute ILU decomposition of A. A is overwritten by its decomposition
    Definition ilu.hh:33
    \n+
    void blockILUDecomposition(const M &A, int n, M &ILU)
    Definition ilu.hh:167
    \n+
    base class encapsulating common algorithms of ILU0SubdomainSolver and ILUNSubdomainSolver.
    Definition ilusubdomainsolver.hh:36
    \n+
    matrix_type ILU
    The ILU0 decomposition of the matrix, or the local matrix.
    Definition ilusubdomainsolver.hh:67
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition ilusubdomainsolver.hh:41
    \n+
    virtual ~ILUSubdomainSolver()
    Definition ilusubdomainsolver.hh:53
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition ilusubdomainsolver.hh:43
    \n+
    std::remove_const< M >::type matrix_type
    The matrix type the preconditioner is for.
    Definition ilusubdomainsolver.hh:39
    \n+
    virtual void apply(X &v, const Y &d)=0
    Apply the subdomain solver.
    \n+
    Exact subdomain solver using ILU(p) with appropriate p.
    Definition ilusubdomainsolver.hh:78
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition ilusubdomainsolver.hh:84
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition ilusubdomainsolver.hh:86
    \n+
    std::remove_const< M >::type rilu_type
    Definition ilusubdomainsolver.hh:82
    \n+
    std::remove_const< M >::type matrix_type
    The matrix type the preconditioner is for.
    Definition ilusubdomainsolver.hh:81
    \n+
    void apply(X &v, const Y &d)
    Apply the subdomain solver.
    Definition ilusubdomainsolver.hh:93
    \n+
    Definition ilusubdomainsolver.hh:111
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition ilusubdomainsolver.hh:117
    \n+
    std::remove_const< M >::type matrix_type
    The matrix type the preconditioner is for.
    Definition ilusubdomainsolver.hh:114
    \n+
    std::remove_const< M >::type rilu_type
    Definition ilusubdomainsolver.hh:115
    \n+
    void apply(X &v, const Y &d)
    Apply the subdomain solver.
    Definition ilusubdomainsolver.hh:125
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition ilusubdomainsolver.hh:119
    \n+
    RowIterator end()
    Get iterator to one beyond last row.
    Definition matrix.hh:616
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,491 +1,288 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-indicescoarsener.hh\n+ilusubdomainsolver.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_INDICESCOARSENER_HH\n-6#define DUNE_AMG_INDICESCOARSENER_HH\n+5#ifndef DUNE_ISTL_ILUSUBDOMAINSOLVER_HH\n+6#define DUNE_ISTL_ILUSUBDOMAINSOLVER_HH\n 7\n-8#include \n-9#include \n-10#include \"_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\"\n-11\n-12#if HAVE_MPI\n-13#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n-14#endif\n-15\n-16#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n-17\n-18namespace _\bD_\bu_\bn_\be\n-19{\n-20 namespace Amg\n-21 {\n-22\n-34 template\n-_\b3_\b5 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n-36 {};\n-37\n-38\n-39#if HAVE_MPI\n-40\n-41 template\n-_\b4_\b2 class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n-43 {\n-44 public:\n-_\b4_\b8 typedef E _\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bs;\n-49\n-_\b5_\b3 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n-54\n-_\b5_\b5 typedef typename ParallelInformation::ParallelIndexSet _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-56\n-_\b6_\b0 typedef typename ParallelIndexSet::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-61\n-_\b6_\b5 typedef typename ParallelIndexSet::LocalIndex _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-66\n-_\b7_\b0 typedef typename LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-71\n-_\b7_\b5 typedef Dune::RemoteIndices _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n-76\n-92 template\n-93 static typename Graph::VertexDescriptor\n-_\b9_\b4 _\bc_\bo_\ba_\br_\bs_\be_\bn(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& fineInfo,\n-95 Graph& fineGraph,\n-96 VM& visitedMap,\n-97 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-98 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& coarseInfo,\n-99 typename Graph::VertexDescriptor noAggregates,\n-100 bool useFixedOrder = false);\n-101\n-102 private:\n-103 template\n-104 class ParallelAggregateRenumberer : public _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n-105 {\n-106 typedef typename G::VertexDescriptor Vertex;\n-107\n-108 typedef I GlobalLookupIndexSet;\n-109\n-110 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;\n-111\n-112 typedef typename IndexPair::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-113\n-114 public:\n-_\b1_\b1_\b5 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br(_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, const I&\n-lookup)\n-116 : _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br(aggregates), isPublic_(false), lookup_(lookup),\n-117 globalIndex_(_\bs_\bt_\bd::numeric_limits::max())\n-118 {}\n-119\n+8#include \n+9#include \n+10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n+11#include \"_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+12#include \n+13#include \n+14\n+15namespace _\bD_\bu_\bn_\be {\n+16\n+35 template\n+_\b3_\b6 class _\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br {\n+37 public:\n+_\b3_\b9 typedef typename std::remove_const::type _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b4_\b1 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b4_\b3 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+44\n+_\b5_\b1 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d) =0;\n+52\n+_\b5_\b3 virtual _\b~_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br()\n+54 {}\n+55\n+56 protected:\n+62 template\n+63 std::size_t _\bc_\bo_\bp_\by_\bT_\bo_\bL_\bo_\bc_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S& rowset);\n+64\n+66 // for ILUN\n+_\b6_\b7 _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be _\bI_\bL_\bU;\n+68 };\n+69\n+76 template\n+_\b7_\b7 class _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n+78 : public _\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br{\n+79 public:\n+_\b8_\b1 typedef typename std::remove_const::type _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b8_\b2 typedef typename std::remove_const::type _\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be;\n+_\b8_\b4 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b8_\b6 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+87\n+88\n+_\b9_\b3 void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n+94 {\n+95 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be(this->_\bI_\bL_\bU,v,d);\n+96 }\n+104 template\n+105 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S& rowset);\n+106\n+107 };\n+108\n+109 template\n+_\b1_\b1_\b0 class _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n+111 : public _\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br{\n+112 public:\n+_\b1_\b1_\b4 typedef typename std::remove_const::type _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b1_\b1_\b5 typedef typename std::remove_const::type _\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be;\n+_\b1_\b1_\b7 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b1_\b1_\b9 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n 120\n-_\b1_\b2_\b1 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename G::ConstEdgeIterator& edge)\n-122 {\n-123 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(edge);\n-124 const IndexPair* pair= lookup_.pair(edge.target());\n-125 if(pair!=0) {\n-126 _\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx(pair->global());\n-127 _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(pair->local().attribute());\n-128 _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc(pair->local().isPublic());\n-129 }\n-130 }\n-131\n-_\b1_\b3_\b2 Vertex _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)([[maybe_unused]] const GlobalIndex& global)\n-133 {\n-134 Vertex current = this->_\bn_\bu_\bm_\bb_\be_\br_\b_;\n-135 this->_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n-136 return current;\n-137 }\n-138\n-_\b1_\b3_\b9 bool _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc()\n-140 {\n-141 return isPublic_;\n-142 }\n-143\n-_\b1_\b4_\b4 void _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc(bool b)\n-145 {\n-146 isPublic_ = isPublic_ || b;\n-147 }\n+_\b1_\b2_\b5 void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n+126 {\n+127 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be(RILU,v,d);\n+128 }\n+129\n+137 template\n+138 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S& rowset);\n+139\n+140 private:\n+144 _\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be RILU;\n+145 };\n+146\n+147\n 148\n-_\b1_\b4_\b9 void _\br_\be_\bs_\be_\bt()\n-150 {\n-151 globalIndex_ = std::numeric_limits::max();\n-152 isPublic_=false;\n-153 }\n-154\n-_\b1_\b5_\b5 void _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be)\n-156 {\n-157 attribute_=_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n-158 }\n-159\n-_\b1_\b6_\b0 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be()\n-161 {\n-162 return attribute_;\n-163 }\n-164\n-_\b1_\b6_\b5 const GlobalIndex& _\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx() const\n-166 {\n-167 return globalIndex_;\n-168 }\n-169\n-_\b1_\b7_\b0 void _\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx(const GlobalIndex& global)\n-171 {\n-172 globalIndex_ = global;\n-173 }\n-174\n-175 private:\n-176 bool isPublic_;\n-177 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be attribute_;\n-178 const GlobalLookupIndexSet& lookup_;\n-179 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx globalIndex_;\n-180 };\n-181\n-182 template\n-183 static void buildCoarseIndexSet(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n-184 Graph& fineGraph,\n-185 VM& visitedMap,\n-186 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-187 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& coarseIndices,\n-188 ParallelAggregateRenumberer& renumberer);\n-189\n-190 template\n-191 static void buildCoarseRemoteIndices(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& fineRemote,\n-192 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-193 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& coarseIndices,\n-194 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& coarseRemote,\n-195 ParallelAggregateRenumberer& renumberer,\n-196 bool useFixedOrder);\n-197\n-198 };\n-199\n-203 template\n-_\b2_\b0_\b4 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br<_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn,E>\n-205 : public _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br,E>\n-206 {};\n-207\n-208\n-209#endif\n-210\n-217 template\n-_\b2_\b1_\b8 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn,E>\n-219 {\n-220 public:\n-221 template\n-222 static typename Graph::VertexDescriptor\n-223 coarsen(const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn & fineInfo,\n-224 Graph& fineGraph,\n-225 VM& visitedMap,\n-226 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-227 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& coarseInfo,\n-228 typename Graph::VertexDescriptor noAggregates,\n-229 bool useFixedOrder = false);\n-230 };\n-231\n-232#if HAVE_MPI\n-233 template\n-234 template\n-235 inline typename Graph::VertexDescriptor\n-_\b2_\b3_\b6 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\bT_\b,_\bE_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& fineInfo,\n-237 Graph& fineGraph,\n-238 VM& visitedMap,\n-239 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-240 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& coarseInfo,\n-241 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates,\n-242 bool useFixedOrder)\n-243 {\n-244 ParallelAggregateRenumberer renumberer(aggregates, fineInfo.globalLookup());\n-245 buildCoarseIndexSet(fineInfo, fineGraph, visitedMap, aggregates,\n-246 coarseInfo.indexSet(), renumberer);\n-247 buildCoarseRemoteIndices(fineInfo.remoteIndices(), aggregates,\n-coarseInfo.indexSet(),\n-248 coarseInfo.remoteIndices(), renumberer, useFixedOrder);\n-249\n-250 return renumberer;\n-251 }\n-252\n-253 template\n-254 template\n-255 void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\bT_\b,_\bE_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bC_\bo_\ba_\br_\bs_\be_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const\n-ParallelInformation& pinfo,\n-256 Graph& fineGraph,\n-257 VM& visitedMap,\n-258 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-259 ParallelIndexSet& coarseIndices,\n-260 ParallelAggregateRenumberer& renumberer)\n-261 {\n-262 // fineGraph is the local subgraph corresponding to the vertices the\n-process owns.\n-263 // i.e. no overlap/copy vertices can be visited traversing the graph\n-264 typedef typename Graph::ConstVertexIterator Iterator;\n-265 typedef typename ParallelInformation::GlobalLookupIndexSet\n-GlobalLookupIndexSet;\n-266\n-267 Iterator end = fineGraph.end();\n-268 const GlobalLookupIndexSet& lookup = pinfo.globalLookup();\n-269\n-270 coarseIndices.beginResize();\n-271\n-272 // Setup the coarse index set and renumber the aggregate consecutively\n-273 // ascending from zero according to the minimum global index belonging\n-274 // to the aggregate\n-275 for(Iterator index = fineGraph.begin(); index != end; ++index) {\n-276 if(aggregates[*index]!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:\n-_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n-277 // Isolated vertices will not be represented on the next level.\n-278 // These should only be there if skipIsolated is activiated in\n-279 // the coarsening criterion as otherwise they will be aggregated\n-280 // and should have real aggregate number in the map right now.\n-281 if(!_\bg_\be_\bt(visitedMap, *index)) {\n-282 // This vertex was not visited by breadthFirstSearch yet.\n-283 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;\n-284 const IndexPair* pair= lookup.pair(*index);\n-285\n-286 renumberer.reset(); // reset attribute and global index.\n-287 if(pair!=0) {\n-288 // vertex is in the index set. Note that not all vertices have\n-289 // to be in the index set, just the ones where communication\n-290 // will happen.\n-291 assert(!ExcludedAttributes::contains(pair->local().attribute()));\n-292 renumberer.attribute(pair->local().attribute());\n-293 renumberer.isPublic(pair->local().isPublic());\n-294 renumberer.globalIndex(pair->global());\n-295 }\n-296\n-297 // Reconstruct aggregate and mark vertices as visited\n-298 aggregates.template breadthFirstSearch(*index, aggregates[*index],\n-299 fineGraph, renumberer, visitedMap);\n-300\n-301 if(renumberer.globalIndex()!=std::numeric_limits::max()) {\n-302 // vertex is in the index set.\n-303 //std::cout <<\" Adding global=\"<< renumberer.globalIndex()<<\"\n-local=\"<(renumberer)<(renumberer) >= coarseIndices.size());\n-317\n-318 // Reset the visited flags\n-319 for(Iterator vertex=fineGraph.begin(); vertex != end; ++vertex)\n-320 put(visitedMap, *vertex, false);\n-321 }\n-322\n-323 template\n-324 template\n-325 void ParallelIndicesCoarsener::buildCoarseRemoteIndices(const\n-RemoteIndices& fineRemote,\n-326 const AggregatesMap& aggregates,\n-327 ParallelIndexSet& coarseIndices,\n-328 RemoteIndices& coarseRemote,\n-329 ParallelAggregateRenumberer& renumberer,\n-330 bool useFixedOrder)\n-331 {\n-332 std::vector attributes(static_cast(renumberer));\n-333\n-334 GlobalLookupIndexSet coarseLookup(coarseIndices,\n-static_cast(renumberer));\n-335\n-336 typedef typename RemoteIndices::const_iterator Iterator;\n-337 Iterator end = fineRemote.end();\n-338\n-339 for(Iterator neighbour = fineRemote.begin();\n-340 neighbour != end; ++neighbour) {\n-341 int process = neighbour->first;\n-342\n-343 assert(neighbour->second.first==neighbour->second.second);\n-344\n-345 // Mark all as not known\n-346 typedef typename std::vector::iterator CIterator;\n-347\n-348 for(CIterator iter=attributes.begin(); iter!= attributes.end(); ++iter)\n-349 *iter = std::numeric_limits::max();\n-350\n-351 auto riEnd = neighbour->second.second->end();\n-352\n-353 for(auto index = neighbour->second.second->begin();\n-354 index != riEnd; ++index) {\n-355 if(!E::contains(index->localIndexPair().local().attribute()) &&\n-356 aggregates[index->localIndexPair().local()] !=\n-357 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n-358 {\n-359 assert(aggregates[index->localIndexPair().local()]localIndexPair().local()]] != 3)\n-361 attributes[aggregates[index->localIndexPair().local()]] = index->attribute\n-();\n-362 }\n-363 }\n-364\n-365 // Build remote index list\n-366 typedef RemoteIndexListModifier Modifier;\n-367 typedef typename RemoteIndices::RemoteIndex RemoteIndex;\n-368 typedef typename ParallelIndexSet::const_iterator IndexIterator;\n-369\n-370 Modifier coarseList = coarseRemote.template getModifier\n-(process);\n-371\n-372 IndexIterator iend = coarseIndices.end();\n-373 for(IndexIterator index = coarseIndices.begin(); index != iend; ++index)\n-374 if(attributes[index->local()] != std::numeric_limits::max()) {\n-375 // remote index is present\n-376 coarseList.insert(RemoteIndex(Attribute(attributes[index->local()]), &\n-(*index)));\n-377 }\n-378 //std::cout< syncer(coarseIndices, coarseRemote);\n-387 syncer.sync(renumberer, useFixedOrder);\n-388\n-389 }\n-390\n-391#endif\n-392\n-393 template\n-394 template\n-395 typename Graph::VertexDescriptor\n-_\b3_\b9_\b6 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bE_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn(\n-397 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& fineInfo,\n-398 [[maybe_unused]] Graph& fineGraph,\n-399 [[maybe_unused]] VM& visitedMap,\n-400 [[maybe_unused]] _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>&\n-aggregates,\n-401 [[maybe_unused]] _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& coarseInfo,\n-402 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates,\n-403 [[maybe_unused]] bool useFixedOrder)\n-404 {\n-405 return noAggregates;\n-406 }\n-407\n-408 } //namespace Amg\n-409} // namespace Dune\n-410#endif\n-_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\n-_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n-_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n-Classes providing communication interfaces for overlapping Schwarz methods.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\br_\be_\bs_\be_\bt\n-void reset()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:149\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-LocalIndex::Attribute Attribute\n-The type of the attribute.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const typename G::ConstEdgeIterator &edge)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:121\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc\n-void isPublic(bool b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:144\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-ParallelInformation::ParallelIndexSet ParallelIndexSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc\n-bool isPublic()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:139\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::LocalIndex LocalIndex\n-The type of the local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-T ParallelInformation\n-The type of the parallel information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-Attribute attribute()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:160\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-Vertex operator()(const GlobalIndex &global)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD\n-static const V ISOLATED\n-Identifier of isolated vertices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:571\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::GlobalIndex GlobalIndex\n-The type of the global index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n-void attribute(const Attribute &attribute)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bs\n-E ExcludedAttributes\n-The set of excluded attributes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-void globalIndex(const GlobalIndex &global)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:170\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-Dune::RemoteIndices< ParallelIndexSet > RemoteIndices\n-The type of the remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn\n-static Graph::VertexDescriptor coarsen(ParallelInformation &fineInfo, Graph\n-&fineGraph, VM &visitedMap, AggregatesMap< typename Graph::VertexDescriptor >\n-&aggregates, ParallelInformation &coarseInfo, typename Graph::VertexDescriptor\n-noAggregates, bool useFixedOrder=false)\n-Build the coarse index set after the aggregatio.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:236\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n-ParallelAggregateRenumberer(AggregatesMap< Vertex > &aggregates, const I\n-&lookup)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:115\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-const GlobalIndex & globalIndex() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:165\n-_\bs_\bt_\bd\n-STL namespace.\n+149 template\n+150 template\n+_\b1_\b5_\b1 std::size_t _\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bc_\bo_\bp_\by_\bT_\bo_\bL_\bo_\bc_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S&\n+rowSet)\n+152 {\n+153 // Calculate consecutive indices for local problem\n+154 // while preserving the ordering\n+155 typedef typename M::size_type size_type;\n+156 typedef std::map IndexMap;\n+157 typedef typename IndexMap::iterator IMIter;\n+158 IndexMap indexMap;\n+159 IMIter guess = indexMap.begin();\n+160 size_type localIndex=0;\n+161\n+162 typedef typename S::const_iterator SIter;\n+163 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();\n+164 rowIdx!= rowEnd; ++rowIdx, ++localIndex)\n+165 guess = indexMap.insert(guess,\n+166 std::make_pair(*rowIdx,localIndex));\n+167\n+168\n+169 // Build Matrix for local subproblem\n+170 ILU.setSize(rowSet.size(),rowSet.size());\n+171 ILU.setBuildMode(matrix_type::row_wise);\n+172\n+173 // Create sparsity pattern\n+174 typedef typename matrix_type::CreateIterator CIter;\n+175 CIter rowCreator = ILU.createbegin();\n+176 std::size_t offset=0;\n+177 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();\n+178 rowIdx!= rowEnd; ++rowIdx, ++rowCreator) {\n+179 // See which row entries are in our subset and add them to\n+180 // the sparsity pattern\n+181 guess = indexMap.begin();\n+182\n+183 for(typename matrix_type::ConstColIterator _\bc_\bo_\bl=A[*rowIdx].begin(),\n+184 endcol=A[*rowIdx]._\be_\bn_\bd(); _\bc_\bo_\bl != endcol; ++_\bc_\bo_\bl) {\n+185 // search for the entry in the row set\n+186 guess = indexMap.find(_\bc_\bo_\bl.index());\n+187 if(guess!=indexMap.end()) {\n+188 // add local index to row\n+189 rowCreator.insert(guess->second);\n+190 offset=std::max(offset,(std::size_t)std::abs((int)(guess->second-\n+rowCreator.index())));\n+191 }\n+192 }\n+193\n+194 }\n+195\n+196 // Insert the matrix values for the local problem\n+197 typename matrix_type::iterator iluRow=ILU.begin();\n+198\n+199 for(SIter rowIdx = rowSet.begin(), rowEnd=rowSet.end();\n+200 rowIdx!= rowEnd; ++rowIdx, ++iluRow) {\n+201 // See which row entries are in our subset and add them to\n+202 // the sparsity pattern\n+203 typename matrix_type::ColIterator localCol=iluRow->begin();\n+204 for(typename matrix_type::ConstColIterator _\bc_\bo_\bl=A[*rowIdx].begin(),\n+205 endcol=A[*rowIdx]._\be_\bn_\bd(); _\bc_\bo_\bl != endcol; ++_\bc_\bo_\bl) {\n+206 // search for the entry in the row set\n+207 guess = indexMap.find(_\bc_\bo_\bl.index());\n+208 if(guess!=indexMap.end()) {\n+209 // set local value\n+210 (*localCol)=(*col);\n+211 ++localCol;\n+212 }\n+213 }\n+214 }\n+215 return offset;\n+216 }\n+217\n+218\n+219 template\n+220 template\n+_\b2_\b2_\b1 void _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S& rowSet)\n+222 {\n+223 this->copyToLocalMatrix(A,rowSet);\n+224 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(this->ILU);\n+225 }\n+226\n+227 template\n+228 template\n+_\b2_\b2_\b9 void _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const M& A, S& rowSet)\n+230 {\n+231 std::size_t offset=copyToLocalMatrix(A,rowSet);\n+232 RILU.setSize(rowSet.size(),rowSet.size(), (1+2*offset)*rowSet.size());\n+233 RILU.setBuildMode(matrix_type::row_wise);\n+234 _\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(this->ILU, (offset+1)/2, RILU);\n+235 }\n+236\n+238} // end name space DUNE\n+239\n+240\n+241#endif\n+_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n+Define general preconditioner interface.\n+_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+A dynamic dense block matrix class.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bc_\bo_\bp_\by_\bT_\bo_\bL_\bo_\bc_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n+std::size_t copyToLocalMatrix(const M &A, S &rowset)\n+Copy the local part of the global matrix to ILU.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n+void setSubMatrix(const M &A, S &rowset)\n+Set the data of the local problem.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:229\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n+void setSubMatrix(const M &A, S &rowset)\n+Set the data of the local problem.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:221\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-A class setting up standard communication for a two-valued attribute set with\n-owner/overlap/copy sema...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-Class providing information about the mapping of the vertices onto aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-void operator++()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const typename G::ConstEdgeIterator &edge)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bn_\bu_\bm_\bb_\be_\br_\b_\n-Vertex number_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n+void blockILUBacksolve(const M &A, X &v, const Y &d)\n+LU backsolve with stored inverse.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:94\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+void blockILU0Decomposition(M &A)\n+compute ILU decomposition of A. A is overwritten by its decomposition\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+void blockILUDecomposition(const M &A, int n, M &ILU)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:167\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n+base class encapsulating common algorithms of ILU0SubdomainSolver and\n+ILUNSubdomainSolver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bL_\bU\n+matrix_type ILU\n+The ILU0 decomposition of the matrix, or the local matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b~_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n+virtual ~ILUSubdomainSolver()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+std::remove_const< M >::type matrix_type\n+The matrix type the preconditioner is for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &v, const Y &d)=0\n+Apply the subdomain solver.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n+Exact subdomain solver using ILU(p) with appropriate p.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:86\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be\n+std::remove_const< M >::type rilu_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+std::remove_const< M >::type matrix_type\n+The matrix type the preconditioner is for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(X &v, const Y &d)\n+Apply the subdomain solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:93\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+std::remove_const< M >::type matrix_type\n+The matrix type the preconditioner is for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:114\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be\n+std::remove_const< M >::type rilu_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:115\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(X &v, const Y &d)\n+Apply the subdomain solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:119\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+RowIterator end()\n+Get iterator to one beyond last row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:616\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00095.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00095.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: transfer.hh File Reference\n+dune-istl: preconditioner.hh File Reference\n \n \n \n \n \n \n \n@@ -65,55 +65,41 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n- \n+
    preconditioner.hh File Reference
    \n
    \n
    \n-\n-

    Prolongation and restriction for amg. \n-More...

    \n-
    #include <dune/istl/bvector.hh>
    \n-#include <dune/istl/matrixredistribute.hh>
    \n-#include <dune/istl/paamg/pinfo.hh>
    \n-#include <dune/istl/owneroverlapcopy.hh>
    \n-#include <dune/istl/paamg/aggregates.hh>
    \n+
    #include <dune-istl-config.hh>
    \n #include <dune/common/exceptions.hh>
    \n+#include "solvercategory.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::Amg::Transfer< V1, V2, T >
     
    class  Dune::Amg::Transfer< V, V1, SequentialInformation >
     
    class  Dune::Amg::Transfer< V, V1, OwnerOverlapCopyCommunication< T1, T2 > >
    class  Dune::Preconditioner< X, Y >
     Base class for matrix free definition of preconditioners. More...
     
    \n \n \n \n-\n-\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n-

    Detailed Description

    \n-

    Prolongation and restriction for amg.

    \n-
    Author
    Markus Blatt
    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,37 +1,21 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-transfer.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Prolongation and restriction for amg. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n+preconditioner.hh File Reference\n+#include \n #include \n+#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b1_\b,_\b _\bV_\b2_\b,_\b _\bT_\b _\b>\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0 Base class for matrix free definition of preconditioners. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Prolongation and restriction for amg.\n- Author\n- Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00095_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00095_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: transfer.hh Source File\n+dune-istl: preconditioner.hh Source File\n \n \n \n \n \n \n \n@@ -70,250 +70,78 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    transfer.hh
    \n+
    preconditioner.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMGTRANSFER_HH
    \n-
    6#define DUNE_AMGTRANSFER_HH
    \n+
    5#ifndef DUNE_ISTL_PRECONDITIONER_HH
    \n+
    6#define DUNE_ISTL_PRECONDITIONER_HH
    \n
    7
    \n-\n-\n-\n-\n-\n-
    13#include <dune/common/exceptions.hh>
    \n-
    14
    \n-
    15namespace Dune
    \n-
    16{
    \n-
    17 namespace Amg
    \n-
    18 {
    \n-
    19
    \n-
    30 template<class V1, class V2, class T>
    \n-
    \n-\n-
    32 {
    \n-
    33
    \n-
    34 public:
    \n-
    35 typedef V1 Vertex;
    \n-
    36 typedef V2 Vector;
    \n-
    37
    \n-
    38 template<typename T1, typename R>
    \n-
    39 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n-
    40 Vector& fineRedist,T1 damp, R& redistributor=R());
    \n+
    8#include <dune-istl-config.hh> // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n+
    9#include <dune/common/exceptions.hh>
    \n+
    10
    \n+
    11#include "solvercategory.hh"
    \n+
    12
    \n+
    13namespace Dune {
    \n+
    18 //=====================================================================
    \n+
    31 //=====================================================================
    \n+
    32 template<class X, class Y>
    \n+
    \n+\n+
    34 public:
    \n+
    36 typedef X domain_type;
    \n+
    38 typedef Y range_type;
    \n+
    40 typedef typename X::field_type field_type;
    \n
    41
    \n-
    42 template<typename T1, typename R>
    \n-
    43 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n-
    44 T1 damp);
    \n-
    45
    \n-
    46 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
    \n-
    47 T& comm);
    \n-
    48 };
    \n-
    \n-
    49
    \n-
    50 template<class V,class V1>
    \n-
    \n-\n-
    52 {
    \n-
    53 public:
    \n-
    54 typedef V Vertex;
    \n-
    55 typedef V1 Vector;
    \n-\n-
    57 template<typename T1>
    \n-
    58 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n-
    59 Vector& fineRedist, T1 damp,
    \n-\n-
    61 const Redist& redist=Redist());
    \n-
    62 template<typename T1>
    \n-
    63 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n-
    64 T1 damp,
    \n-\n-
    66
    \n-
    67
    \n-
    68 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
    \n-
    69 const SequentialInformation& comm);
    \n-
    70 };
    \n-
    \n+
    70 virtual void pre (X& x, Y& b) = 0;
    \n
    71
    \n-
    72#if HAVE_MPI
    \n-
    73
    \n-
    74 template<class V,class V1, class T1, class T2>
    \n-
    \n-\n-
    76 {
    \n-
    77 public:
    \n-
    78 typedef V Vertex;
    \n-
    79 typedef V1 Vector;
    \n-\n-
    81 template<typename T3>
    \n-
    82 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n-
    83 Vector& fineRedist, T3 damp, OwnerOverlapCopyCommunication<T1,T2>& comm,
    \n-
    84 const Redist& redist);
    \n-
    85 template<typename T3>
    \n-
    86 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n-\n-
    88
    \n-
    89 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
    \n-\n-
    91 };
    \n-
    \n-
    92
    \n-
    93#endif
    \n-
    94
    \n-
    95 template<class V, class V1>
    \n-
    96 template<typename T>
    \n-
    97 inline void
    \n-
    \n-\n-
    99 Vector& coarse, Vector& fine,
    \n-
    100 [[maybe_unused]] Vector& fineRedist,
    \n-
    101 T damp,
    \n-
    102 [[maybe_unused]] const SequentialInformation& comm,
    \n-
    103 [[maybe_unused]] const Redist& redist)
    \n-
    104 {
    \n-
    105 prolongateVector(aggregates, coarse, fine, damp);
    \n-
    106 }
    \n-
    \n-
    107 template<class V, class V1>
    \n-
    108 template<typename T>
    \n-
    109 inline void
    \n-
    \n-\n-
    111 Vector& coarse, Vector& fine,
    \n-
    112 T damp,
    \n-
    113 [[maybe_unused]] const SequentialInformation& comm)
    \n-
    114 {
    \n-
    115 typedef typename Vector::iterator Iterator;
    \n-
    116
    \n-
    117 Iterator end = coarse.end();
    \n-
    118 Iterator begin= coarse.begin();
    \n-
    119 for(; begin!=end; ++begin)
    \n-
    120 *begin*=damp;
    \n-
    121 end=fine.end();
    \n-
    122 begin=fine.begin();
    \n-
    123
    \n-
    124 for(Iterator block=begin; block != end; ++block) {
    \n-
    125 std::ptrdiff_t index=block-begin;
    \n-
    126 const Vertex& vertex = aggregates[index];
    \n-\n-
    128 *block += coarse[aggregates[index]];
    \n-
    129 }
    \n-
    130 }
    \n-
    \n-
    131
    \n-
    132 template<class V, class V1>
    \n-
    133 inline void
    \n-
    \n-\n-
    135 Vector& coarse,
    \n-
    136 const Vector& fine,
    \n-
    137 [[maybe_unused]] const SequentialInformation& comm)
    \n-
    138 {
    \n-
    139 // Set coarse vector to zero
    \n-
    140 coarse=0;
    \n-
    141
    \n-
    142 typedef typename Vector::const_iterator Iterator;
    \n-
    143 Iterator end = fine.end();
    \n-
    144 Iterator begin=fine.begin();
    \n-
    145
    \n-
    146 for(Iterator block=begin; block != end; ++block) {
    \n-
    147 const Vertex& vertex = aggregates[block-begin];
    \n-\n-
    149 coarse[vertex] += *block;
    \n-
    150 }
    \n-
    151 }
    \n-
    \n-
    152
    \n-
    153#if HAVE_MPI
    \n-
    154 template<class V, class V1, class T1, class T2>
    \n-
    155 template<typename T3>
    \n-
    \n-
    156 inline void Transfer<V,V1,OwnerOverlapCopyCommunication<T1,T2> >::prolongateVector(const AggregatesMap<Vertex>& aggregates,
    \n-
    157 Vector& coarse, Vector& fine,
    \n-
    158 Vector& fineRedist, T3 damp,
    \n-\n-
    160 const Redist& redist)
    \n-
    161 {
    \n-
    162 if(fineRedist.size()>0)
    \n-
    163 // we operated on the coarse level
    \n-
    164 Transfer<V,V1,SequentialInformation>::prolongateVector(aggregates, coarse, fineRedist, damp);
    \n-
    165
    \n-
    166 // TODO This could be accomplished with one communication, too!
    \n-
    167 redist.redistributeBackward(fine, fineRedist);
    \n-
    168 comm.copyOwnerToAll(fine,fine);
    \n-
    169 }
    \n-
    \n-
    170
    \n-
    171 template<class V, class V1, class T1, class T2>
    \n-
    172 template<typename T3>
    \n-
    \n-\n-
    174 const AggregatesMap<Vertex>& aggregates,
    \n-
    175 Vector& coarse, Vector& fine, T3 damp,
    \n-
    176 [[maybe_unused]] OwnerOverlapCopyCommunication<T1,T2>& comm)
    \n-
    177 {
    \n-
    178 Transfer<V,V1,SequentialInformation>::prolongateVector(aggregates, coarse, fine, damp);
    \n-
    179 }
    \n-
    \n-
    180 template<class V, class V1, class T1, class T2>
    \n-
    \n-
    181 inline void Transfer<V,V1,OwnerOverlapCopyCommunication<T1,T2> >::restrictVector(const AggregatesMap<Vertex>& aggregates,
    \n-
    182 Vector& coarse, const Vector& fine,
    \n-\n-
    184 {
    \n-\n-
    186 // We need this here to avoid it in the smoothers on the coarse level.
    \n-
    187 // There (in the preconditioner d is const.
    \n-
    188 comm.project(coarse);
    \n-
    189 }
    \n-
    \n-
    190#endif
    \n-
    192 } // namspace Amg
    \n-
    193} // namspace Dune
    \n-
    194#endif
    \n-
    Provides classes for the Coloring process of AMG.
    \n-\n-
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n-
    Functionality for redistributing a sparse matrix.
    \n-
    const_iterator end() const
    Definition aggregates.hh:730
    \n+
    82 virtual void apply (X& v, const Y& d) = 0;
    \n+
    83
    \n+
    92 virtual void post (X& x) = 0;
    \n+
    93
    \n+\n+
    96#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n+
    97 {
    \n+
    98 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method in a derived classes, in the future this method will pure virtual.");
    \n+
    99 }
    \n+
    100#else
    \n+
    101 = 0;
    \n+
    102#endif
    \n+
    103
    \n+
    105 virtual ~Preconditioner () {}
    \n+
    106
    \n+
    107 };
    \n+
    \n+
    108
    \n+
    112}
    \n+
    113#endif
    \n+\n
    Definition allocator.hh:11
    \n-
    Definition matrixredistribute.hh:22
    \n-
    void redistributeBackward(D &from, const D &to) const
    Definition matrixredistribute.hh:32
    \n-
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n-
    void project(T1 &x) const
    Set vector to zero at copy dofs.
    Definition owneroverlapcopy.hh:538
    \n-
    void copyOwnerToAll(const T &source, T &dest) const
    Communicate values from owner data points to all other data points.
    Definition owneroverlapcopy.hh:311
    \n-
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n-
    Definition pinfo.hh:28
    \n-
    Definition transfer.hh:32
    \n-
    static void restrictVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, const Vector &fine, T &comm)
    \n-
    static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, T1 damp)
    \n-
    static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, Vector &fineRedist, T1 damp, R &redistributor=R())
    \n-
    V1 Vertex
    Definition transfer.hh:35
    \n-
    V2 Vector
    Definition transfer.hh:36
    \n-
    RedistributeInformation< SequentialInformation > Redist
    Definition transfer.hh:56
    \n-\n-\n-
    static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, Vector &fineRedist, T1 damp, const SequentialInformation &comm=SequentialInformation(), const Redist &redist=Redist())
    \n-
    static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, T1 damp, const SequentialInformation &comm=SequentialInformation())
    \n-\n-
    RedistributeInformation< OwnerOverlapCopyCommunication< T1, T2 > > Redist
    Definition transfer.hh:80
    \n-\n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    virtual void post(X &x)=0
    Clean up.
    \n+
    virtual void apply(X &v, const Y &d)=0
    Apply one step of the preconditioner to the system A(v)=d.
    \n+
    virtual ~Preconditioner()
    every abstract base class has a virtual destructor
    Definition preconditioner.hh:105
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition preconditioner.hh:38
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition preconditioner.hh:36
    \n+
    virtual SolverCategory::Category category() const =0
    Category of the preconditioner (see SolverCategory::Category)
    \n+
    X::field_type field_type
    The field type of the preconditioner.
    Definition preconditioner.hh:40
    \n+
    virtual void pre(X &x, Y &b)=0
    Prepare the preconditioner.
    \n+
    Category
    Definition solvercategory.hh:23
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,294 +1,92 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-transfer.hh\n+preconditioner.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMGTRANSFER_HH\n-6#define DUNE_AMGTRANSFER_HH\n+5#ifndef DUNE_ISTL_PRECONDITIONER_HH\n+6#define DUNE_ISTL_PRECONDITIONER_HH\n 7\n-8#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-9#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh>\n-10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh>\n-11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n-13#include \n-14\n-15namespace _\bD_\bu_\bn_\be\n-16{\n-17 namespace Amg\n-18 {\n-19\n-30 template\n-_\b3_\b1 class _\bT_\br_\ba_\bn_\bs_\bf_\be_\br\n-32 {\n-33\n+8#include // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n+9#include \n+10\n+11#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n+12\n+13namespace _\bD_\bu_\bn_\be {\n+18 //=====================================================================\n+31 //=====================================================================\n+32 template\n+_\b3_\b3 class _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n 34 public:\n-_\b3_\b5 typedef V1 _\bV_\be_\br_\bt_\be_\bx;\n-_\b3_\b6 typedef V2 _\bV_\be_\bc_\bt_\bo_\br;\n-37\n-38 template\n-_\b3_\b9 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n-40 _\bV_\be_\bc_\bt_\bo_\br& fineRedist,T1 damp, R& redistributor=R());\n+_\b3_\b6 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b3_\b8 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b4_\b0 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n 41\n-42 template\n-_\b4_\b3 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n-44 T1 damp);\n-45\n-_\b4_\b6 static void _\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, _\bV_\be_\bc_\bt_\bo_\br&\n-coarse, const _\bV_\be_\bc_\bt_\bo_\br& fine,\n-47 T& comm);\n-48 };\n-49\n-50 template\n-_\b5_\b1 class _\bT_\br_\ba_\bn_\bs_\bf_\be_\br\n-52 {\n-53 public:\n-_\b5_\b4 typedef V _\bV_\be_\br_\bt_\be_\bx;\n-_\b5_\b5 typedef V1 _\bV_\be_\bc_\bt_\bo_\br;\n-_\b5_\b6 typedef _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b> _\bR_\be_\bd_\bi_\bs_\bt;\n-57 template\n-_\b5_\b8 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n-59 _\bV_\be_\bc_\bt_\bo_\br& fineRedist, T1 damp,\n-60 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm=_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(),\n-61 const _\bR_\be_\bd_\bi_\bs_\bt& redist=_\bR_\be_\bd_\bi_\bs_\bt());\n-62 template\n-_\b6_\b3 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n-64 T1 damp,\n-65 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm=_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n-66\n-67\n-68 static void _\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, _\bV_\be_\bc_\bt_\bo_\br&\n-coarse, const _\bV_\be_\bc_\bt_\bo_\br& fine,\n-69 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm);\n-70 };\n+_\b7_\b0 virtual void _\bp_\br_\be (X& x, Y& b) = 0;\n 71\n-72#if HAVE_MPI\n-73\n-74 template\n-_\b7_\b5 class _\bT_\br_\ba_\bn_\bs_\bf_\be_\br >\n-76 {\n-77 public:\n-_\b7_\b8 typedef V _\bV_\be_\br_\bt_\be_\bx;\n-_\b7_\b9 typedef V1 _\bV_\be_\bc_\bt_\bo_\br;\n-_\b8_\b0 typedef _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b> >\n-_\bR_\be_\bd_\bi_\bs_\bt;\n-81 template\n-82 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n-83 _\bV_\be_\bc_\bt_\bo_\br& fineRedist, T3 damp, _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm,\n-84 const _\bR_\be_\bd_\bi_\bs_\bt& redist);\n-85 template\n-86 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n-87 T3 damp, _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm);\n-88\n-89 static void _\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, _\bV_\be_\bc_\bt_\bo_\br&\n-coarse, const _\bV_\be_\bc_\bt_\bo_\br& fine,\n-90 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm);\n-91 };\n-92\n-93#endif\n-94\n-95 template\n-96 template\n-97 inline void\n-_\b9_\b8 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-99 _\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n-100 [[maybe_unused]] _\bV_\be_\bc_\bt_\bo_\br& fineRedist,\n-101 T damp,\n-102 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm,\n-103 [[maybe_unused]] const _\bR_\be_\bd_\bi_\bs_\bt& redist)\n-104 {\n-105 prolongateVector(aggregates, coarse, fine, damp);\n-106 }\n-107 template\n-108 template\n-109 inline void\n-_\b1_\b1_\b0 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-111 _\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n-112 T damp,\n-113 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm)\n-114 {\n-115 typedef typename Vector::iterator Iterator;\n-116\n-117 Iterator end = coarse.end();\n-118 Iterator begin= coarse.begin();\n-119 for(; begin!=end; ++begin)\n-120 *begin*=damp;\n-121 end=fine.end();\n-122 begin=fine.begin();\n-123\n-124 for(Iterator block=begin; block != end; ++block) {\n-125 std::ptrdiff_t index=block-begin;\n-126 const _\bV_\be_\br_\bt_\be_\bx& vertex = aggregates[index];\n-127 if(vertex != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n-128 *block += coarse[aggregates[index]];\n-129 }\n-130 }\n-131\n-132 template\n-133 inline void\n-_\b1_\b3_\b4 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-135 _\bV_\be_\bc_\bt_\bo_\br& coarse,\n-136 const _\bV_\be_\bc_\bt_\bo_\br& fine,\n-137 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm)\n-138 {\n-139 // Set coarse vector to zero\n-140 coarse=0;\n-141\n-142 typedef typename Vector::const_iterator Iterator;\n-143 Iterator end = fine._\be_\bn_\bd();\n-144 Iterator begin=fine.begin();\n-145\n-146 for(Iterator block=begin; block != end; ++block) {\n-147 const _\bV_\be_\br_\bt_\be_\bx& vertex = aggregates[block-begin];\n-148 if(vertex != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n-149 coarse[vertex] += *block;\n-150 }\n-151 }\n-152\n-153#if HAVE_MPI\n-154 template\n-155 template\n-_\b1_\b5_\b6 inline void _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b> >::\n-prolongateVector(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-157 _\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n-158 _\bV_\be_\bc_\bt_\bo_\br& fineRedist, T3 damp,\n-159 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm,\n-160 const _\bR_\be_\bd_\bi_\bs_\bt& redist)\n-161 {\n-162 if(fineRedist.size()>0)\n-163 // we operated on the coarse level\n-164 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(aggregates, coarse,\n-fineRedist, damp);\n-165\n-166 // TODO This could be accomplished with one communication, too!\n-167 redist._\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd(fine, fineRedist);\n-168 comm._\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl(fine,fine);\n-169 }\n-170\n-171 template\n-172 template\n-_\b1_\b7_\b3 inline void _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b> >::\n-prolongateVector(\n-174 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-175 _\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine, T3 damp,\n-176 [[maybe_unused]] _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm)\n-177 {\n-178 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(aggregates, coarse,\n-fine, damp);\n-179 }\n-180 template\n-_\b1_\b8_\b1 inline void _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b> >::\n-restrictVector(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-182 _\bV_\be_\bc_\bt_\bo_\br& coarse, const _\bV_\be_\bc_\bt_\bo_\br& fine,\n-183 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm)\n-184 {\n-185 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(aggregates, coarse,\n-fine, _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n-186 // We need this here to avoid it in the smoothers on the coarse level.\n-187 // There (in the preconditioner d is const.\n-188 comm._\bp_\br_\bo_\bj_\be_\bc_\bt(coarse);\n-189 }\n-190#endif\n-192 } // namspace Amg\n-193} // namspace Dune\n-194#endif\n-_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n-Provides classes for the Coloring process of AMG.\n-_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n-_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n-Classes providing communication interfaces for overlapping Schwarz methods.\n-_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-This file implements a vector space as a tensor product of a given vector\n-space. The number of compon...\n-_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh\n-Functionality for redistributing a sparse matrix.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:730\n+_\b8_\b2 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d) = 0;\n+83\n+_\b9_\b2 virtual void _\bp_\bo_\bs_\bt (X& x) = 0;\n+93\n+_\b9_\b5 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+96#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n+97 {\n+98 DUNE_THROW(Dune::Exception,\"It is necessary to implement the category method\n+in a derived classes, in the future this method will pure virtual.\");\n+99 }\n+100#else\n+101 = 0;\n+102#endif\n+103\n+_\b1_\b0_\b5 virtual _\b~_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br () {}\n+106\n+107 };\n+108\n+112}\n+113#endif\n+_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:22\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd\n-void redistributeBackward(D &from, const D &to) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:32\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-A class setting up standard communication for a two-valued attribute set with\n-owner/overlap/copy sema...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bj_\be_\bc_\bt\n-void project(T1 &x) const\n-Set vector to zero at copy dofs.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:538\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl\n-void copyOwnerToAll(const T &source, T &dest) const\n-Communicate values from owner data points to all other data points.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:311\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-Class providing information about the mapping of the vertices onto aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:32\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b:_\b:_\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br\n-static void restrictVector(const AggregatesMap< Vertex > &aggregates, Vector\n-&coarse, const Vector &fine, T &comm)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br\n-static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector\n-&coarse, Vector &fine, T1 damp)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br\n-static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector\n-&coarse, Vector &fine, Vector &fineRedist, T1 damp, R &redistributor=R())\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-V1 Vertex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b:_\b:_\bV_\be_\bc_\bt_\bo_\br\n-V2 Vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt\n-RedistributeInformation< SequentialInformation > Redist\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-V Vertex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bV_\be_\bc_\bt_\bo_\br\n-V1 Vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br\n-static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector\n-&coarse, Vector &fine, Vector &fineRedist, T1 damp, const SequentialInformation\n-&comm=SequentialInformation(), const Redist &redist=Redist())\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br\n-static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector\n-&coarse, Vector &fine, T1 damp, const SequentialInformation\n-&comm=SequentialInformation())\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-V Vertex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt\n-RedistributeInformation< OwnerOverlapCopyCommunication< T1, T2 > > Redist\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>_\b:_\b:_\bV_\be_\bc_\bt_\bo_\br\n-V1 Vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(X &x)=0\n+Clean up.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &v, const Y &d)=0\n+Apply one step of the preconditioner to the system A(v)=d.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\b~_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+virtual ~Preconditioner()\n+every abstract base class has a virtual destructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:105\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const =0\n+Category of the preconditioner (see SolverCategory::Category)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\br_\be\n+virtual void pre(X &x, Y &b)=0\n+Prepare the preconditioner.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00098.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00098.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: combinedfunctor.hh File Reference\n+dune-istl: gsetc.hh File Reference\n \n \n \n \n \n \n \n@@ -65,44 +65,202 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n-
    combinedfunctor.hh File Reference
    \n+Namespaces |\n+Enumerations |\n+Functions
    \n+
    gsetc.hh File Reference
    \n \n
    \n-
    #include <tuple>
    \n+\n+

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

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

    Go to the source code of this file.

    \n \n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n-\n+\n \n-\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::Amg::ApplyHelper< i >
    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::Amg::ApplyHelper< 0 >
    struct  Dune::algmeta_bdsolve< 0, withrelax >
     
    class  Dune::Amg::CombinedFunctor< T >
    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... > >
     
    \n \n \n \n-\n-\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n+\n+\n+\n+\n+\n+

    \n+Enumerations

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

    \n+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.
     
    \n-
    \n+

    Detailed Description

    \n+

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

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,25 +1,173 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-combinedfunctor.hh File Reference\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+gsetc.hh File Reference\n+Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n+generic way. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \"_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bi_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bL_\b<_\b _\bl_\b _\b>\n+\u00a0 compile-time parameter for block recursion depth _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\b0_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\bI_\b,_\b _\bd_\bi_\ba_\bg_\b,_\b _\br_\be_\bl_\ba_\bx_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b _\bI_\b,_\b _\br_\be_\bl_\ba_\bx_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\b0_\b,_\b _\bM_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,\n+ _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n+enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bW_\bi_\bt_\bh_\bD_\bi_\ba_\bg_\bT_\by_\bp_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg =1 , _\bD_\bu_\bn_\be_\b:_\b:_\bn_\bo_\bd_\bi_\ba_\bg =0 }\n+\u00a0\n+enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bW_\bi_\bt_\bh_\bR_\be_\bl_\ba_\bx_\bT_\by_\bp_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx =1 , _\bD_\bu_\bn_\be_\b:_\b:_\bn_\bo_\br_\be_\bl_\ba_\bx =0 }\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n+\u00a0 block lower triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w)\n+\u00a0 relaxed block lower triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n+\u00a0 unit block lower triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w)\n+\u00a0 relaxed unit block lower triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n+\u00a0 block upper triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w)\n+\u00a0 relaxed block upper triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n+\u00a0 unit block upper triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w)\n+\u00a0 relaxed unit block upper triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, _\bB_\bL< l >)\n+\u00a0 block lower triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w, _\bB_\bL< l >)\n+\u00a0 relaxed block lower triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, _\bB_\bL< l >)\n+\u00a0 unit block lower triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w, _\bB_\bL< l >)\n+\u00a0 relaxed unit block lower triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, _\bB_\bL< l > bl)\n+\u00a0 block upper triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w, _\bB_\bL< l > bl)\n+\u00a0 relaxed block upper triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, _\bB_\bL< l > bl)\n+\u00a0 unit block upper triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w, _\bB_\bL< l > bl)\n+\u00a0 relaxed unit block upper triangular solve\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n+\u00a0 block diagonal solve, no relaxation\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w)\n+\u00a0 block diagonal solve, with relaxation\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, _\bB_\bL< l >)\n+\u00a0 block diagonal solve, no relaxation\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d, const K &w, _\bB_\bL< l >)\n+\u00a0 block diagonal solve, with relaxation\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bg_\bs (const M &A, X &x, const Y &b, const K &w)\n+\u00a0 GS step.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bg_\bs (const M &A, X &x, const Y &b, const K &w, _\bB_\bL< l >)\n+\u00a0 GS step.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bf (const M &A, X &x, const Y &b, const K &w)\n+\u00a0 SOR step.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bf (const M &A, X &x, const Y &b, const K &w, _\bB_\bL< l >)\n+\u00a0 SOR step.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bb (const M &A, X &x, const Y &b, const K &w)\n+\u00a0 SSOR step.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bb (const M &A, X &x, const Y &b, const K &w, _\bB_\bL< l >)\n+\u00a0 Backward SOR step.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bj_\ba_\bc (const M &A, X &x, const Y &b, const K &w)\n+\u00a0 Jacobi step.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bj_\ba_\bc (const M &A, X &x, const Y &b, const K &w, _\bB_\bL< l >)\n+\u00a0 Jacobi step.\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n+generic way.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00098_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00098_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: combinedfunctor.hh Source File\n+dune-istl: gsetc.hh Source File\n \n \n \n \n \n \n \n@@ -70,94 +70,839 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    combinedfunctor.hh
    \n+
    gsetc.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_COMBINEDFUNCTOR_HH
    \n-
    6#define DUNE_AMG_COMBINEDFUNCTOR_HH
    \n+
    5#ifndef DUNE_ISTL_GSETC_HH
    \n+
    6#define DUNE_ISTL_GSETC_HH
    \n
    7
    \n-
    8#include <tuple>
    \n-
    9
    \n-
    10namespace Dune
    \n-
    11{
    \n-
    12 namespace Amg
    \n-
    13 {
    \n-
    14
    \n-
    15 template<std::size_t i>
    \n-
    \n-\n-
    17 {
    \n-
    18 template<class TT, class T>
    \n-
    \n-
    19 static void apply(TT tuple, const T& t)
    \n-
    20 {
    \n-
    21 std::get<i-1>(tuple) (t);
    \n-\n-
    23 }
    \n-
    \n-
    24 };
    \n-
    \n-
    25 template<>
    \n-
    \n-
    26 struct ApplyHelper<0>
    \n-
    27 {
    \n-
    28 template<class TT, class T>
    \n-
    \n-
    29 static void apply([[maybe_unused]] TT tuple, [[maybe_unused]] const T& t)
    \n-
    30 {}
    \n-
    \n-
    31 };
    \n-
    \n-
    32
    \n-
    33 template<typename T>
    \n-
    \n-\n-
    35 public T
    \n-
    36 {
    \n-
    37 public:
    \n-
    \n-
    38 CombinedFunctor(const T& tuple_)
    \n-
    39 : T(tuple_)
    \n-
    40 {}
    \n-
    \n-
    41
    \n-
    42 template<class T1>
    \n-
    \n-
    43 void operator()(const T1& t)
    \n-
    44 {
    \n-\n-
    46 }
    \n-
    \n-
    47 };
    \n+
    8#include <cmath>
    \n+
    9#include <complex>
    \n+
    10#include <iostream>
    \n+
    11#include <iomanip>
    \n+
    12#include <string>
    \n+
    13
    \n+
    14#include <dune/common/hybridutilities.hh>
    \n+
    15
    \n+\n+\n+
    18
    \n+
    19#include "istlexception.hh"
    \n+
    20
    \n+
    21
    \n+
    27namespace Dune {
    \n+
    28
    \n+
    39 //============================================================
    \n+
    40 // parameter types
    \n+
    41 //============================================================
    \n+
    42
    \n+
    44 template<int l>
    \n+
    \n+
    45 struct BL {
    \n+
    46 enum {recursion_level = l};
    \n+
    47 };
    \n
    \n
    48
    \n-
    49
    \n-
    50 } //namespace Amg
    \n-
    51} // namespace Dune
    \n-
    52#endif
    \n+
    \n+\n+\n+
    51 nodiag=0
    \n+
    52 };
    \n+
    \n+
    53
    \n+
    \n+\n+\n+
    56 norelax=0
    \n+
    57 };
    \n+
    \n+
    58
    \n+
    59 //============================================================
    \n+
    60 // generic triangular solves
    \n+
    61 // consider block decomposition A = L + D + U
    \n+
    62 // we can invert L, L+D, U, U+D
    \n+
    63 // we can apply relaxation or not
    \n+
    64 // we can recurse over a fixed number of levels
    \n+
    65 //============================================================
    \n+
    66
    \n+
    67 // template meta program for triangular solves
    \n+
    68 template<int I, WithDiagType diag, WithRelaxType relax>
    \n+
    \n+\n+
    70 template<class M, class X, class Y, class K>
    \n+
    \n+
    71 static void bltsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    72 {
    \n+
    73 // iterator types
    \n+
    74 typedef typename M::ConstRowIterator rowiterator;
    \n+
    75 typedef typename M::ConstColIterator coliterator;
    \n+
    76 typedef typename Y::block_type bblock;
    \n+
    77
    \n+
    78 // local solve at each block and immediate update
    \n+
    79 rowiterator endi=A.end();
    \n+
    80 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n+
    81 {
    \n+
    82 bblock rhs(d[i.index()]);
    \n+
    83 coliterator j;
    \n+
    84 for (j=(*i).begin(); j.index()<i.index(); ++j)
    \n+
    85 (*j).mmv(v[j.index()],rhs);
    \n+
    86 algmeta_btsolve<I-1,diag,relax>::bltsolve(*j,v[i.index()],rhs,w);
    \n+
    87 }
    \n+
    88 }
    \n+
    \n+
    89 template<class M, class X, class Y, class K>
    \n+
    \n+
    90 static void butsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    91 {
    \n+
    92 // iterator types
    \n+
    93 typedef typename M::ConstRowIterator rowiterator;
    \n+
    94 typedef typename M::ConstColIterator coliterator;
    \n+
    95 typedef typename Y::block_type bblock;
    \n+
    96
    \n+
    97 // local solve at each block and immediate update
    \n+
    98 rowiterator rendi=A.beforeBegin();
    \n+
    99 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
    \n+
    100 {
    \n+
    101 bblock rhs(d[i.index()]);
    \n+
    102 coliterator j;
    \n+
    103 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)
    \n+
    104 (*j).mmv(v[j.index()],rhs);
    \n+
    105 algmeta_btsolve<I-1,diag,relax>::butsolve(*j,v[i.index()],rhs,w);
    \n+
    106 }
    \n+
    107 }
    \n+
    \n+
    108 };
    \n+
    \n+
    109
    \n+
    110 // recursion end ...
    \n+
    111 template<>
    \n+
    \n+\n+
    113 template<class M, class X, class Y, class K>
    \n+
    \n+
    114 static void bltsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    115 {
    \n+
    116 A.solve(v,d);
    \n+
    117 v *= w;
    \n+
    118 }
    \n+
    \n+
    119 template<class M, class X, class Y, class K>
    \n+
    \n+
    120 static void butsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    121 {
    \n+
    122 A.solve(v,d);
    \n+
    123 v *= w;
    \n+
    124 }
    \n+
    \n+
    125 };
    \n+
    \n+
    126 template<>
    \n+
    \n+\n+
    128 template<class M, class X, class Y, class K>
    \n+
    \n+
    129 static void bltsolve (const M& A, X& v, const Y& d, const K& /*w*/)
    \n+
    130 {
    \n+
    131 A.solve(v,d);
    \n+
    132 }
    \n+
    \n+
    133 template<class M, class X, class Y, class K>
    \n+
    \n+
    134 static void butsolve (const M& A, X& v, const Y& d, const K& /*w*/)
    \n+
    135 {
    \n+
    136 A.solve(v,d);
    \n+
    137 }
    \n+
    \n+
    138 };
    \n+
    \n+
    139 template<>
    \n+
    \n+\n+
    141 template<class M, class X, class Y, class K>
    \n+
    \n+
    142 static void bltsolve (const M& /*A*/, X& v, const Y& d, const K& w)
    \n+
    143 {
    \n+
    144 v = d;
    \n+
    145 v *= w;
    \n+
    146 }
    \n+
    \n+
    147 template<class M, class X, class Y, class K>
    \n+
    \n+
    148 static void butsolve (const M& /*A*/, X& v, const Y& d, const K& w)
    \n+
    149 {
    \n+
    150 v = d;
    \n+
    151 v *= w;
    \n+
    152 }
    \n+
    \n+
    153 };
    \n+
    \n+
    154 template<>
    \n+
    \n+\n+
    156 template<class M, class X, class Y, class K>
    \n+
    \n+
    157 static void bltsolve (const M& /*A*/, X& v, const Y& d, const K& /*w*/)
    \n+
    158 {
    \n+
    159 v = d;
    \n+
    160 }
    \n+
    \n+
    161 template<class M, class X, class Y, class K>
    \n+
    \n+
    162 static void butsolve (const M& /*A*/, X& v, const Y& d, const K& /*w*/)
    \n+
    163 {
    \n+
    164 v = d;
    \n+
    165 }
    \n+
    \n+
    166 };
    \n+
    \n+
    167
    \n+
    168
    \n+
    169 // user calls
    \n+
    170
    \n+
    171 // default block recursion level = 1
    \n+
    172
    \n+
    174 template<class M, class X, class Y>
    \n+
    \n+
    175 void bltsolve (const M& A, X& v, const Y& d)
    \n+
    176 {
    \n+
    177 typename X::field_type w=1;
    \n+\n+
    179 }
    \n+
    \n+
    181 template<class M, class X, class Y, class K>
    \n+
    \n+
    182 void bltsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    183 {
    \n+\n+
    185 }
    \n+
    \n+
    187 template<class M, class X, class Y>
    \n+
    \n+
    188 void ubltsolve (const M& A, X& v, const Y& d)
    \n+
    189 {
    \n+
    190 typename X::field_type w=1;
    \n+\n+
    192 }
    \n+
    \n+
    194 template<class M, class X, class Y, class K>
    \n+
    \n+
    195 void ubltsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    196 {
    \n+\n+
    198 }
    \n+
    \n+
    199
    \n+
    201 template<class M, class X, class Y>
    \n+
    \n+
    202 void butsolve (const M& A, X& v, const Y& d)
    \n+
    203 {
    \n+
    204 typename X::field_type w=1;
    \n+\n+
    206 }
    \n+
    \n+
    208 template<class M, class X, class Y, class K>
    \n+
    \n+
    209 void butsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    210 {
    \n+\n+
    212 }
    \n+
    \n+
    214 template<class M, class X, class Y>
    \n+
    \n+
    215 void ubutsolve (const M& A, X& v, const Y& d)
    \n+
    216 {
    \n+
    217 typename X::field_type w=1;
    \n+\n+
    219 }
    \n+
    \n+
    221 template<class M, class X, class Y, class K>
    \n+
    \n+
    222 void ubutsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    223 {
    \n+\n+
    225 }
    \n+
    \n+
    226
    \n+
    227 // general block recursion level >= 0
    \n+
    228
    \n+
    230 template<class M, class X, class Y, int l>
    \n+
    \n+
    231 void bltsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
    \n+
    232 {
    \n+
    233 typename X::field_type w=1;
    \n+\n+
    235 }
    \n+
    \n+
    237 template<class M, class X, class Y, class K, int l>
    \n+
    \n+
    238 void bltsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
    \n+
    239 {
    \n+\n+
    241 }
    \n+
    \n+
    243 template<class M, class X, class Y, int l>
    \n+
    \n+
    244 void ubltsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
    \n+
    245 {
    \n+
    246 typename X::field_type w=1;
    \n+\n+
    248 }
    \n+
    \n+
    250 template<class M, class X, class Y, class K, int l>
    \n+
    \n+
    251 void ubltsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
    \n+
    252 {
    \n+\n+
    254 }
    \n+
    \n+
    255
    \n+
    257 template<class M, class X, class Y, int l>
    \n+
    \n+
    258 void butsolve (const M& A, X& v, const Y& d, BL<l> bl)
    \n+
    259 {
    \n+
    260 typename X::field_type w=1;
    \n+\n+
    262 }
    \n+
    \n+
    264 template<class M, class X, class Y, class K, int l>
    \n+
    \n+
    265 void butsolve (const M& A, X& v, const Y& d, const K& w, BL<l> bl)
    \n+
    266 {
    \n+\n+
    268 }
    \n+
    \n+
    270 template<class M, class X, class Y, int l>
    \n+
    \n+
    271 void ubutsolve (const M& A, X& v, const Y& d, BL<l> bl)
    \n+
    272 {
    \n+
    273 typename X::field_type w=1;
    \n+\n+
    275 }
    \n+
    \n+
    277 template<class M, class X, class Y, class K, int l>
    \n+
    \n+
    278 void ubutsolve (const M& A, X& v, const Y& d, const K& w, BL<l> bl)
    \n+
    279 {
    \n+\n+
    281 }
    \n+
    \n+
    282
    \n+
    283
    \n+
    284
    \n+
    285 //============================================================
    \n+
    286 // generic block diagonal solves
    \n+
    287 // consider block decomposition A = L + D + U
    \n+
    288 // we can apply relaxation or not
    \n+
    289 // we can recurse over a fixed number of levels
    \n+
    290 //============================================================
    \n+
    291
    \n+
    292 // template meta program for diagonal solves
    \n+
    293 template<int I, WithRelaxType relax>
    \n+
    \n+\n+
    295 template<class M, class X, class Y, class K>
    \n+
    \n+
    296 static void bdsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    297 {
    \n+
    298 // iterator types
    \n+
    299 typedef typename M::ConstRowIterator rowiterator;
    \n+
    300 typedef typename M::ConstColIterator coliterator;
    \n+
    301
    \n+
    302 // local solve at each block and immediate update
    \n+
    303 rowiterator rendi=A.beforeBegin();
    \n+
    304 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
    \n+
    305 {
    \n+
    306 coliterator ii=(*i).find(i.index());
    \n+
    307 algmeta_bdsolve<I-1,relax>::bdsolve(*ii,v[i.index()],d[i.index()],w);
    \n+
    308 }
    \n+
    309 }
    \n+
    \n+
    310 };
    \n+
    \n+
    311
    \n+
    312 // recursion end ...
    \n+
    313 template<>
    \n+
    \n+\n+
    315 template<class M, class X, class Y, class K>
    \n+
    \n+
    316 static void bdsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    317 {
    \n+
    318 A.solve(v,d);
    \n+
    319 v *= w;
    \n+
    320 }
    \n+
    \n+
    321 };
    \n+
    \n+
    322 template<>
    \n+
    \n+\n+
    324 template<class M, class X, class Y, class K>
    \n+
    \n+
    325 static void bdsolve (const M& A, X& v, const Y& d, const K& /*w*/)
    \n+
    326 {
    \n+
    327 A.solve(v,d);
    \n+
    328 }
    \n+
    \n+
    329 };
    \n+
    \n+
    330
    \n+
    331 // user calls
    \n+
    332
    \n+
    333 // default block recursion level = 1
    \n+
    334
    \n+
    336 template<class M, class X, class Y>
    \n+
    \n+
    337 void bdsolve (const M& A, X& v, const Y& d)
    \n+
    338 {
    \n+
    339 typename X::field_type w=1;
    \n+\n+
    341 }
    \n+
    \n+
    343 template<class M, class X, class Y, class K>
    \n+
    \n+
    344 void bdsolve (const M& A, X& v, const Y& d, const K& w)
    \n+
    345 {
    \n+\n+
    347 }
    \n+
    \n+
    348
    \n+
    349 // general block recursion level >= 0
    \n+
    350
    \n+
    352 template<class M, class X, class Y, int l>
    \n+
    \n+
    353 void bdsolve (const M& A, X& v, const Y& d, BL<l> /*bl*/)
    \n+
    354 {
    \n+
    355 typename X::field_type w=1;
    \n+\n+
    357 }
    \n+
    \n+
    359 template<class M, class X, class Y, class K, int l>
    \n+
    \n+
    360 void bdsolve (const M& A, X& v, const Y& d, const K& w, BL<l> /*bl*/)
    \n+
    361 {
    \n+\n+
    363 }
    \n+
    \n+
    364
    \n+
    365
    \n+
    366 //============================================================
    \n+
    367 // generic steps of iteration methods
    \n+
    368 // Jacobi, Gauss-Seidel, SOR, SSOR
    \n+
    369 // work directly on Ax=b, ie solve M(x^{i+1}-x^i) = w (b-Ax^i)
    \n+
    370 // we can recurse over a fixed number of levels
    \n+
    371 //============================================================
    \n+
    372
    \n+
    373 // template meta program for iterative solver steps
    \n+
    374 template<int I, typename M>
    \n+
    \n+\n+
    376
    \n+
    377 template<class X, class Y, class K>
    \n+
    \n+
    378 static void dbgs (const M& A, X& x, const Y& b, const K& w)
    \n+
    379 {
    \n+
    380 typedef typename M::ConstRowIterator rowiterator;
    \n+
    381 typedef typename M::ConstColIterator coliterator;
    \n+
    382 typedef typename Y::block_type bblock;
    \n+
    383 bblock rhs;
    \n+
    384
    \n+
    385 X xold(x); // remember old x
    \n+
    386
    \n+
    387 rowiterator endi=A.end();
    \n+
    388 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n+
    389 {
    \n+
    390 rhs = b[i.index()]; // rhs = b_i
    \n+
    391 coliterator endj=(*i).end();
    \n+
    392 coliterator j=(*i).begin();
    \n+
    393 if constexpr (IsNumber<typename M::block_type>())
    \n+
    394 {
    \n+
    395 for (; j.index()<i.index(); ++j)
    \n+
    396 rhs -= (*j) * x[j.index()];
    \n+
    397 coliterator diag=j++; // *diag = a_ii and increment coliterator j from a_ii to a_i+1,i to skip diagonal
    \n+
    398 for (; j != endj; ++j)
    \n+
    399 rhs -= (*j) * x[j.index()];
    \n+
    400 x[i.index()] = rhs / (*diag);
    \n+
    401 }
    \n+
    402 else
    \n+
    403 {
    \n+
    404 for (; j.index()<i.index(); ++j) // iterate over a_ij with j < i
    \n+
    405 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
    \n+
    406 coliterator diag=j++; // *diag = a_ii and increment coliterator j from a_ii to a_i+1,i to skip diagonal
    \n+
    407 for (; j != endj; ++j) // iterate over a_ij with j > i
    \n+
    408 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j>i} a_ij * xold_j
    \n+
    409 algmeta_itsteps<I-1,typename M::block_type>::dbgs(*diag,x[i.index()],rhs,w); // if I==1: xnew_i = rhs/a_ii
    \n+
    410 }
    \n+
    411 }
    \n+
    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;
    \n+
    413 x *= w;
    \n+
    414 x.axpy(K(1)-w,xold);
    \n+
    415 }
    \n+
    \n+
    416
    \n+
    417 template<class X, class Y, class K>
    \n+
    \n+
    418 static void bsorf (const M& A, X& x, const Y& b, const K& w)
    \n+
    419 {
    \n+
    420 typedef typename M::ConstRowIterator rowiterator;
    \n+
    421 typedef typename M::ConstColIterator coliterator;
    \n+
    422 typedef typename Y::block_type bblock;
    \n+
    423 typedef typename X::block_type xblock;
    \n+
    424 bblock rhs;
    \n+
    425 xblock v;
    \n+
    426
    \n+
    427 // Initialize nested data structure if there are entries
    \n+
    428 if(A.begin()!=A.end())
    \n+
    429 v=x[0];
    \n+
    430
    \n+
    431 rowiterator endi=A.end();
    \n+
    432 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n+
    433 {
    \n+
    434 rhs = b[i.index()]; // rhs = b_i
    \n+
    435 coliterator endj=(*i).end(); // iterate over a_ij with j < i
    \n+
    436 coliterator j=(*i).begin();
    \n+
    437 if constexpr (IsNumber<typename M::block_type>())
    \n+
    438 {
    \n+
    439 for (; j.index()<i.index(); ++j)
    \n+
    440 rhs -= (*j) * x[j.index()]; // rhs -= sum_{j<i} a_ij * xnew_j
    \n+
    441 coliterator diag=j; // *diag = a_ii
    \n+
    442 for (; j!=endj; ++j)
    \n+
    443 rhs -= (*j) * x[j.index()]; // rhs -= sum_{j<i} a_ij * xnew_j
    \n+
    444 v = rhs / (*diag);
    \n+
    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)
    \n+
    446 }
    \n+
    447 else
    \n+
    448 {
    \n+
    449 for (; j.index()<i.index(); ++j)
    \n+
    450 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
    \n+
    451 coliterator diag=j; // *diag = a_ii
    \n+
    452 for (; j!=endj; ++j)
    \n+
    453 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j<i} a_ij * xnew_j
    \n+
    454 algmeta_itsteps<I-1,typename M::block_type>::bsorf(*diag,v,rhs,w); // if blocksize I==1: v = rhs/a_ii
    \n+
    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)
    \n+
    456 }
    \n+
    457 }
    \n+
    458 }
    \n+
    \n+
    459
    \n+
    460 template<class X, class Y, class K>
    \n+
    \n+
    461 static void bsorb (const M& A, X& x, const Y& b, const K& w)
    \n+
    462 {
    \n+
    463 typedef typename M::ConstRowIterator rowiterator;
    \n+
    464 typedef typename M::ConstColIterator coliterator;
    \n+
    465 typedef typename Y::block_type bblock;
    \n+
    466 typedef typename X::block_type xblock;
    \n+
    467 bblock rhs;
    \n+
    468 xblock v;
    \n+
    469
    \n+
    470 // Initialize nested data structure if there are entries
    \n+
    471 if(A.begin()!=A.end())
    \n+
    472 v=x[0];
    \n+
    473
    \n+
    474 rowiterator endi=A.beforeBegin();
    \n+
    475 for (rowiterator i=A.beforeEnd(); i!=endi; --i)
    \n+
    476 {
    \n+
    477 rhs = b[i.index()];
    \n+
    478 coliterator endj=(*i).end();
    \n+
    479 coliterator j=(*i).begin();
    \n+
    480 if constexpr (IsNumber<typename M::block_type>())
    \n+
    481 {
    \n+
    482 for (; j.index()<i.index(); ++j)
    \n+
    483 rhs -= (*j) * x[j.index()];
    \n+
    484 coliterator diag=j;
    \n+
    485 for (; j!=endj; ++j)
    \n+
    486 rhs -= (*j) * x[j.index()];
    \n+
    487 v = rhs / (*diag);
    \n+
    488 x[i.index()] += w*v;
    \n+
    489 }
    \n+
    490 else
    \n+
    491 {
    \n+
    492 for (; j.index()<i.index(); ++j)
    \n+
    493 j->mmv(x[j.index()],rhs);
    \n+
    494 coliterator diag=j;
    \n+
    495 for (; j!=endj; ++j)
    \n+
    496 j->mmv(x[j.index()],rhs);
    \n+\n+
    498 x[i.index()].axpy(w,v);
    \n+
    499 }
    \n+
    500 }
    \n+
    501 }
    \n+
    \n+
    502
    \n+
    503 template<class X, class Y, class K>
    \n+
    \n+
    504 static void dbjac (const M& A, X& x, const Y& b, const K& w)
    \n+
    505 {
    \n+
    506 typedef typename M::ConstRowIterator rowiterator;
    \n+
    507 typedef typename M::ConstColIterator coliterator;
    \n+
    508 typedef typename Y::block_type bblock;
    \n+
    509 bblock rhs;
    \n+
    510
    \n+
    511 X v(x); // allocate with same size
    \n+
    512
    \n+
    513 rowiterator endi=A.end();
    \n+
    514 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n+
    515 {
    \n+
    516 rhs = b[i.index()];
    \n+
    517 coliterator endj=(*i).end();
    \n+
    518 coliterator j=(*i).begin();
    \n+
    519 if constexpr (IsNumber<typename M::block_type>())
    \n+
    520 {
    \n+
    521 for (; j.index()<i.index(); ++j)
    \n+
    522 rhs -= (*j) * x[j.index()];
    \n+
    523 coliterator diag=j;
    \n+
    524 for (; j!=endj; ++j)
    \n+
    525 rhs -= (*j) * x[j.index()];
    \n+
    526 v[i.index()] = rhs / (*diag);
    \n+
    527 }
    \n+
    528 else
    \n+
    529 {
    \n+
    530 for (; j.index()<i.index(); ++j)
    \n+
    531 j->mmv(x[j.index()],rhs);
    \n+
    532 coliterator diag=j;
    \n+
    533 for (; j!=endj; ++j)
    \n+
    534 j->mmv(x[j.index()],rhs);
    \n+\n+
    536 }
    \n+
    537 }
    \n+
    538 x.axpy(w,v);
    \n+
    539 }
    \n+
    \n+
    540 };
    \n+
    \n+
    541 // end of recursion
    \n+
    542 template<typename M>
    \n+
    \n+
    543 struct algmeta_itsteps<0,M> {
    \n+
    544 template<class X, class Y, class K>
    \n+
    \n+
    545 static void dbgs (const M& A, X& x, const Y& b, const K& /*w*/)
    \n+
    546 {
    \n+
    547 A.solve(x,b);
    \n+
    548 }
    \n+
    \n+
    549 template<class X, class Y, class K>
    \n+
    \n+
    550 static void bsorf (const M& A, X& x, const Y& b, const K& /*w*/)
    \n+
    551 {
    \n+
    552 A.solve(x,b);
    \n+
    553 }
    \n+
    \n+
    554 template<class X, class Y, class K>
    \n+
    \n+
    555 static void bsorb (const M& A, X& x, const Y& b, const K& /*w*/)
    \n+
    556 {
    \n+
    557 A.solve(x,b);
    \n+
    558 }
    \n+
    \n+
    559 template<class X, class Y, class K>
    \n+
    \n+
    560 static void dbjac (const M& A, X& x, const Y& b, const K& /*w*/)
    \n+
    561 {
    \n+
    562 A.solve(x,b);
    \n+
    563 }
    \n+
    \n+
    564 };
    \n+
    \n+
    565
    \n+
    566 template<int I, typename T1, typename... MultiTypeMatrixArgs>
    \n+
    \n+
    567 struct algmeta_itsteps<I,MultiTypeBlockMatrix<T1, MultiTypeMatrixArgs...>> {
    \n+
    568 template<
    \n+
    569 typename... MultiTypeVectorArgs,
    \n+
    570 class K>
    \n+\n+
    579
    \n+
    580 template<
    \n+
    581 typename... MultiTypeVectorArgs,
    \n+
    582 class K>
    \n+\n+
    591
    \n+
    592 template<
    \n+
    593 typename... MultiTypeVectorArgs,
    \n+
    594 class K>
    \n+\n+
    603
    \n+
    604 template<
    \n+
    605 typename... MultiTypeVectorArgs,
    \n+
    606 class K
    \n+
    607 >
    \n+\n+
    616 };
    \n+
    \n+
    617
    \n+
    618 // user calls
    \n+
    619
    \n+
    621 template<class M, class X, class Y, class K>
    \n+
    \n+
    622 void dbgs (const M& A, X& x, const Y& b, const K& w)
    \n+
    623 {
    \n+\n+
    625 }
    \n+
    \n+
    627 template<class M, class X, class Y, class K, int l>
    \n+
    \n+
    628 void dbgs (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
    \n+
    629 {
    \n+\n+
    631 }
    \n+
    \n+
    633 template<class M, class X, class Y, class K>
    \n+
    \n+
    634 void bsorf (const M& A, X& x, const Y& b, const K& w)
    \n+
    635 {
    \n+\n+
    637 }
    \n+
    \n+
    639 template<class M, class X, class Y, class K, int l>
    \n+
    \n+
    640 void bsorf (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
    \n+
    641 {
    \n+\n+
    643 }
    \n+
    \n+
    645 template<class M, class X, class Y, class K>
    \n+
    \n+
    646 void bsorb (const M& A, X& x, const Y& b, const K& w)
    \n+
    647 {
    \n+\n+
    649 }
    \n+
    \n+
    651 template<class M, class X, class Y, class K, int l>
    \n+
    \n+
    652 void bsorb (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
    \n+
    653 {
    \n+\n+
    655 }
    \n+
    \n+
    657 template<class M, class X, class Y, class K>
    \n+
    \n+
    658 void dbjac (const M& A, X& x, const Y& b, const K& w)
    \n+
    659 {
    \n+\n+
    661 }
    \n+
    \n+
    663 template<class M, class X, class Y, class K, int l>
    \n+
    \n+
    664 void dbjac (const M& A, X& x, const Y& b, const K& w, BL<l> /*bl*/)
    \n+
    665 {
    \n+\n+
    667 }
    \n+
    \n+
    668
    \n+
    669
    \n+
    672} // end namespace
    \n+
    673
    \n+
    674#endif
    \n+\n+\n+\n+
    static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:584
    \n+
    static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:500
    \n+
    static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:556
    \n+
    static constexpr size_type N()
    Return the number of matrix rows.
    Definition multitypeblockmatrix.hh:84
    \n+
    static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:529
    \n+
    void bltsolve(const M &A, X &v, const Y &d)
    block lower triangular solve
    Definition gsetc.hh:175
    \n+
    WithDiagType
    Definition gsetc.hh:49
    \n+
    void bsorb(const M &A, X &x, const Y &b, const K &w)
    SSOR step.
    Definition gsetc.hh:646
    \n+
    void ubltsolve(const M &A, X &v, const Y &d)
    unit block lower triangular solve
    Definition gsetc.hh:188
    \n+
    void dbjac(const M &A, X &x, const Y &b, const K &w)
    Jacobi step.
    Definition gsetc.hh:658
    \n+
    void dbgs(const M &A, X &x, const Y &b, const K &w)
    GS step.
    Definition gsetc.hh:622
    \n+
    WithRelaxType
    Definition gsetc.hh:54
    \n+
    void bdsolve(const M &A, X &v, const Y &d)
    block diagonal solve, no relaxation
    Definition gsetc.hh:337
    \n+
    void butsolve(const M &A, X &v, const Y &d)
    block upper triangular solve
    Definition gsetc.hh:202
    \n+
    void bsorf(const M &A, X &x, const Y &b, const K &w)
    SOR step.
    Definition gsetc.hh:634
    \n+
    void ubutsolve(const M &A, X &v, const Y &d)
    unit block upper triangular solve
    Definition gsetc.hh:215
    \n+
    @ nodiag
    Definition gsetc.hh:51
    \n+
    @ withdiag
    Definition gsetc.hh:50
    \n+
    @ norelax
    Definition gsetc.hh:56
    \n+
    @ withrelax
    Definition gsetc.hh:55
    \n
    Definition allocator.hh:11
    \n-
    Definition combinedfunctor.hh:17
    \n-
    static void apply(TT tuple, const T &t)
    Definition combinedfunctor.hh:19
    \n-
    static void apply(TT tuple, const T &t)
    Definition combinedfunctor.hh:29
    \n-
    Definition combinedfunctor.hh:36
    \n-
    CombinedFunctor(const T &tuple_)
    Definition combinedfunctor.hh:38
    \n-
    void operator()(const T1 &t)
    Definition combinedfunctor.hh:43
    \n+
    A Vector class to support different block types.
    Definition multitypeblockvector.hh:59
    \n+
    A Matrix class to support different block types.
    Definition multitypeblockmatrix.hh:46
    \n+
    compile-time parameter for block recursion depth
    Definition gsetc.hh:45
    \n+
    @ recursion_level
    Definition gsetc.hh:46
    \n+
    Definition gsetc.hh:69
    \n+
    static void butsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:90
    \n+
    static void bltsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:71
    \n+
    static void bltsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:114
    \n+
    static void butsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:120
    \n+
    static void bltsolve(const M &A, X &v, const Y &d, const K &)
    Definition gsetc.hh:129
    \n+
    static void butsolve(const M &A, X &v, const Y &d, const K &)
    Definition gsetc.hh:134
    \n+
    static void bltsolve(const M &, X &v, const Y &d, const K &w)
    Definition gsetc.hh:142
    \n+
    static void butsolve(const M &, X &v, const Y &d, const K &w)
    Definition gsetc.hh:148
    \n+
    static void bltsolve(const M &, X &v, const Y &d, const K &)
    Definition gsetc.hh:157
    \n+
    static void butsolve(const M &, X &v, const Y &d, const K &)
    Definition gsetc.hh:162
    \n+
    Definition gsetc.hh:294
    \n+
    static void bdsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:296
    \n+
    static void bdsolve(const M &A, X &v, const Y &d, const K &w)
    Definition gsetc.hh:316
    \n+
    static void bdsolve(const M &A, X &v, const Y &d, const K &)
    Definition gsetc.hh:325
    \n+
    Definition gsetc.hh:375
    \n+
    static void bsorb(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:461
    \n+
    static void bsorf(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:418
    \n+
    static void dbjac(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:504
    \n+
    static void dbgs(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:378
    \n+
    static void dbgs(const M &A, X &x, const Y &b, const K &)
    Definition gsetc.hh:545
    \n+
    static void dbjac(const M &A, X &x, const Y &b, const K &)
    Definition gsetc.hh:560
    \n+
    static void bsorf(const M &A, X &x, const Y &b, const K &)
    Definition gsetc.hh:550
    \n+
    static void bsorb(const M &A, X &x, const Y &b, const K &)
    Definition gsetc.hh:555
    \n+
    static void dbgs(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
    Definition gsetc.hh:571
    \n+
    static void dbjac(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
    Definition gsetc.hh:608
    \n+
    static void bsorf(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
    Definition gsetc.hh:583
    \n+
    static void bsorb(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A, MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector< MultiTypeVectorArgs... > &b, const K &w)
    Definition gsetc.hh:595
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,82 +1,832 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-combinedfunctor.hh\n+gsetc.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_COMBINEDFUNCTOR_HH\n-6#define DUNE_AMG_COMBINEDFUNCTOR_HH\n+5#ifndef DUNE_ISTL_GSETC_HH\n+6#define DUNE_ISTL_GSETC_HH\n 7\n-8#include \n-9\n-10namespace _\bD_\bu_\bn_\be\n-11{\n-12 namespace Amg\n-13 {\n-14\n-15 template\n-_\b1_\b6 struct _\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br\n-17 {\n-18 template\n-_\b1_\b9 static void _\ba_\bp_\bp_\bl_\by(TT tuple, const T& t)\n-20 {\n-21 std::get(tuple) (t);\n-22 _\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b<_\bi_\b-_\b1_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(tuple, t);\n-23 }\n-24 };\n-25 template<>\n-_\b2_\b6 struct _\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br<0>\n-27 {\n-28 template\n-_\b2_\b9 static void _\ba_\bp_\bp_\bl_\by([[maybe_unused]] TT tuple, [[maybe_unused]] const T& t)\n-30 {}\n-31 };\n-32\n-33 template\n-_\b3_\b4 class _\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br :\n-35 public T\n-36 {\n-37 public:\n-_\b3_\b8 _\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br(const T& tuple_)\n-39 : T(tuple_)\n-40 {}\n-41\n-42 template\n-_\b4_\b3 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T1& t)\n-44 {\n-45 _\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b<_\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\bs_\bi_\bz_\be_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be>::apply(*this, t);\n-46 }\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13\n+14#include \n+15\n+16#include \"_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+17#include \"_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+18\n+19#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+20\n+21\n+27namespace _\bD_\bu_\bn_\be {\n+28\n+39 //============================================================\n+40 // parameter types\n+41 //============================================================\n+42\n+44 template\n+_\b4_\b5 struct _\bB_\bL {\n+_\b4_\b6 enum {_\br_\be_\bc_\bu_\br_\bs_\bi_\bo_\bn_\b__\bl_\be_\bv_\be_\bl = l};\n 47 };\n 48\n-49\n-50 } //namespace Amg\n-51} // namespace Dune\n-52#endif\n+_\b4_\b9 enum _\bW_\bi_\bt_\bh_\bD_\bi_\ba_\bg_\bT_\by_\bp_\be {\n+_\b5_\b0 _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg=1,\n+51 _\bn_\bo_\bd_\bi_\ba_\bg=0\n+_\b5_\b2 };\n+53\n+_\b5_\b4 enum _\bW_\bi_\bt_\bh_\bR_\be_\bl_\ba_\bx_\bT_\by_\bp_\be {\n+_\b5_\b5 _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx=1,\n+56 _\bn_\bo_\br_\be_\bl_\ba_\bx=0\n+_\b5_\b7 };\n+58\n+59 //============================================================\n+60 // generic triangular solves\n+61 // consider block decomposition A = L + D + U\n+62 // we can invert L, L+D, U, U+D\n+63 // we can apply relaxation or not\n+64 // we can recurse over a fixed number of levels\n+65 //============================================================\n+66\n+67 // template meta program for triangular solves\n+68 template\n+_\b6_\b9 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be {\n+70 template\n+_\b7_\b1 static void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+72 {\n+73 // iterator types\n+74 typedef typename M::ConstRowIterator rowiterator;\n+75 typedef typename M::ConstColIterator coliterator;\n+76 typedef typename Y::block_type bblock;\n+77\n+78 // local solve at each block and immediate update\n+79 rowiterator endi=A.end();\n+80 for (rowiterator i=A.begin(); i!=endi; ++i)\n+81 {\n+82 bblock rhs(d[i.index()]);\n+83 coliterator j;\n+84 for (j=(*i).begin(); j.index()_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(*j,v[i.index()],rhs,w);\n+87 }\n+88 }\n+89 template\n+_\b9_\b0 static void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+91 {\n+92 // iterator types\n+93 typedef typename M::ConstRowIterator rowiterator;\n+94 typedef typename M::ConstColIterator coliterator;\n+95 typedef typename Y::block_type bblock;\n+96\n+97 // local solve at each block and immediate update\n+98 rowiterator rendi=A.beforeBegin();\n+99 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)\n+100 {\n+101 bblock rhs(d[i.index()]);\n+102 coliterator j;\n+103 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)\n+104 (*j).mmv(v[j.index()],rhs);\n+105 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bI_\b-_\b1_\b,_\bd_\bi_\ba_\bg_\b,_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(*j,v[i.index()],rhs,w);\n+106 }\n+107 }\n+108 };\n+109\n+110 // recursion end ...\n+111 template<>\n+_\b1_\b1_\b2 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be<0,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx> {\n+113 template\n+_\b1_\b1_\b4 static void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+115 {\n+116 A.solve(v,d);\n+117 v *= w;\n+118 }\n+119 template\n+_\b1_\b2_\b0 static void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+121 {\n+122 A.solve(v,d);\n+123 v *= w;\n+124 }\n+125 };\n+126 template<>\n+_\b1_\b2_\b7 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be<0,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg,_\bn_\bo_\br_\be_\bl_\ba_\bx> {\n+128 template\n+_\b1_\b2_\b9 static void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& /*w*/)\n+130 {\n+131 A.solve(v,d);\n+132 }\n+133 template\n+_\b1_\b3_\b4 static void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& /*w*/)\n+135 {\n+136 A.solve(v,d);\n+137 }\n+138 };\n+139 template<>\n+_\b1_\b4_\b0 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be<0,_\bn_\bo_\bd_\bi_\ba_\bg,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx> {\n+141 template\n+_\b1_\b4_\b2 static void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& /*A*/, X& v, const Y& d, const K& w)\n+143 {\n+144 v = d;\n+145 v *= w;\n+146 }\n+147 template\n+_\b1_\b4_\b8 static void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& /*A*/, X& v, const Y& d, const K& w)\n+149 {\n+150 v = d;\n+151 v *= w;\n+152 }\n+153 };\n+154 template<>\n+_\b1_\b5_\b5 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be<0,_\bn_\bo_\bd_\bi_\ba_\bg,_\bn_\bo_\br_\be_\bl_\ba_\bx> {\n+156 template\n+_\b1_\b5_\b7 static void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& /*A*/, X& v, const Y& d, const K& /*w*/)\n+158 {\n+159 v = d;\n+160 }\n+161 template\n+_\b1_\b6_\b2 static void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& /*A*/, X& v, const Y& d, const K& /*w*/)\n+163 {\n+164 v = d;\n+165 }\n+166 };\n+167\n+168\n+169 // user calls\n+170\n+171 // default block recursion level = 1\n+172\n+174 template\n+_\b1_\b7_\b5 void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n+176 {\n+177 typename X::field_type w=1;\n+178 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+179 }\n+181 template\n+_\b1_\b8_\b2 void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+183 {\n+184 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+185 }\n+187 template\n+_\b1_\b8_\b8 void _\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n+189 {\n+190 typename X::field_type w=1;\n+191 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+192 }\n+194 template\n+_\b1_\b9_\b5 void _\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+196 {\n+197 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+198 }\n+199\n+201 template\n+_\b2_\b0_\b2 void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n+203 {\n+204 typename X::field_type w=1;\n+205 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+206 }\n+208 template\n+_\b2_\b0_\b9 void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+210 {\n+211 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+212 }\n+214 template\n+_\b2_\b1_\b5 void _\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n+216 {\n+217 typename X::field_type w=1;\n+218 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+219 }\n+221 template\n+_\b2_\b2_\b2 void _\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+223 {\n+224 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+225 }\n+226\n+227 // general block recursion level >= 0\n+228\n+230 template\n+_\b2_\b3_\b1 void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n+232 {\n+233 typename X::field_type w=1;\n+234 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+235 }\n+237 template\n+_\b2_\b3_\b8 void _\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n+239 {\n+240 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+241 }\n+243 template\n+_\b2_\b4_\b4 void _\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n+245 {\n+246 typename X::field_type w=1;\n+247 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+248 }\n+250 template\n+_\b2_\b5_\b1 void _\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n+252 {\n+253 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+254 }\n+255\n+257 template\n+_\b2_\b5_\b8 void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, _\bB_\bL_\b<_\bl_\b> bl)\n+259 {\n+260 typename X::field_type w=1;\n+261 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+262 }\n+264 template\n+_\b2_\b6_\b5 void _\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w, _\bB_\bL_\b<_\bl_\b> bl)\n+266 {\n+267 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+268 }\n+270 template\n+_\b2_\b7_\b1 void _\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, _\bB_\bL_\b<_\bl_\b> bl)\n+272 {\n+273 typename X::field_type w=1;\n+274 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+275 }\n+277 template\n+_\b2_\b7_\b8 void _\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w, _\bB_\bL_\b<_\bl_\b> bl)\n+279 {\n+280 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bn_\bo_\bd_\bi_\ba_\bg_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+281 }\n+282\n+283\n+284\n+285 //============================================================\n+286 // generic block diagonal solves\n+287 // consider block decomposition A = L + D + U\n+288 // we can apply relaxation or not\n+289 // we can recurse over a fixed number of levels\n+290 //============================================================\n+291\n+292 // template meta program for diagonal solves\n+293 template\n+_\b2_\b9_\b4 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be {\n+295 template\n+_\b2_\b9_\b6 static void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+297 {\n+298 // iterator types\n+299 typedef typename M::ConstRowIterator rowiterator;\n+300 typedef typename M::ConstColIterator coliterator;\n+301\n+302 // local solve at each block and immediate update\n+303 rowiterator rendi=A.beforeBegin();\n+304 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)\n+305 {\n+306 coliterator ii=(*i).find(i.index());\n+307 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\bI_\b-_\b1_\b,_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be(*ii,v[i.index()],d[i.index()],w);\n+308 }\n+309 }\n+310 };\n+311\n+312 // recursion end ...\n+313 template<>\n+_\b3_\b1_\b4 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be<0,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx> {\n+315 template\n+_\b3_\b1_\b6 static void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+317 {\n+318 A.solve(v,d);\n+319 v *= w;\n+320 }\n+321 };\n+322 template<>\n+_\b3_\b2_\b3 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be<0,_\bn_\bo_\br_\be_\bl_\ba_\bx> {\n+324 template\n+_\b3_\b2_\b5 static void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& /*w*/)\n+326 {\n+327 A.solve(v,d);\n+328 }\n+329 };\n+330\n+331 // user calls\n+332\n+333 // default block recursion level = 1\n+334\n+336 template\n+_\b3_\b3_\b7 void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n+338 {\n+339 typename X::field_type w=1;\n+340 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+341 }\n+343 template\n+_\b3_\b4_\b4 void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w)\n+345 {\n+346 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b1_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+347 }\n+348\n+349 // general block recursion level >= 0\n+350\n+352 template\n+_\b3_\b5_\b3 void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n+354 {\n+355 typename X::field_type w=1;\n+356 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bn_\bo_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+357 }\n+359 template\n+_\b3_\b6_\b0 void _\bb_\bd_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n+361 {\n+362 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\bl_\b,_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be(A,v,d,w);\n+363 }\n+364\n+365\n+366 //============================================================\n+367 // generic steps of iteration methods\n+368 // Jacobi, Gauss-Seidel, SOR, SSOR\n+369 // work directly on Ax=b, ie solve M(x^{i+1}-x^i) = w (b-Ax^i)\n+370 // we can recurse over a fixed number of levels\n+371 //============================================================\n+372\n+373 // template meta program for iterative solver steps\n+374 template\n+_\b3_\b7_\b5 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs {\n+376\n+377 template\n+_\b3_\b7_\b8 static void _\bd_\bb_\bg_\bs (const M& A, X& x, const Y& b, const K& w)\n+379 {\n+380 typedef typename M::ConstRowIterator rowiterator;\n+381 typedef typename M::ConstColIterator coliterator;\n+382 typedef typename Y::block_type bblock;\n+383 bblock rhs;\n+384\n+385 X xold(x); // remember old x\n+386\n+387 rowiterator endi=A.end();\n+388 for (rowiterator i=A.begin(); i!=endi; ++i)\n+389 {\n+390 rhs = b[i.index()]; // rhs = b_i\n+391 coliterator endj=(*i).end();\n+392 coliterator j=(*i).begin();\n+393 if constexpr (IsNumber())\n+394 {\n+395 for (; j.index() i\n+408 (*j).mmv(x[j.index()],rhs); // rhs -= sum_{j>i} a_ij * xold_j\n+409 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bd_\bb_\bg_\bs(*diag,x[i.index\n+()],rhs,w); // if I==1: xnew_i = rhs/a_ii\n+410 }\n+411 }\n+412 // next two lines: xnew_i = w / a_ii * (b_i - sum_{j=i} a_ij * xold_j) + (1-w)*xold;\n+413 x *= w;\n+414 x.axpy(K(1)-w,xold);\n+415 }\n+416\n+417 template\n+_\b4_\b1_\b8 static void _\bb_\bs_\bo_\br_\bf (const M& A, X& x, const Y& b, const K& w)\n+419 {\n+420 typedef typename M::ConstRowIterator rowiterator;\n+421 typedef typename M::ConstColIterator coliterator;\n+422 typedef typename Y::block_type bblock;\n+423 typedef typename X::block_type xblock;\n+424 bblock rhs;\n+425 xblock v;\n+426\n+427 // Initialize nested data structure if there are entries\n+428 if(A.begin()!=A.end())\n+429 v=x[0];\n+430\n+431 rowiterator endi=A.end();\n+432 for (rowiterator i=A.begin(); i!=endi; ++i)\n+433 {\n+434 rhs = b[i.index()]; // rhs = b_i\n+435 coliterator endj=(*i).end(); // iterate over a_ij with j < i\n+436 coliterator j=(*i).begin();\n+437 if constexpr (IsNumber())\n+438 {\n+439 for (; j.index()=i} a_ij * xold_j)\n+446 }\n+447 else\n+448 {\n+449 for (; j.index()_\b:_\b:_\bb_\bs_\bo_\br_\bf(*diag,v,rhs,w); // if\n+blocksize I==1: v = rhs/a_ii\n+455 x[i.index()].axpy(w,v); // x_i = w / a_ii * (b_i - sum_{j=i} a_ij * xold_j)\n+456 }\n+457 }\n+458 }\n+459\n+460 template\n+_\b4_\b6_\b1 static void _\bb_\bs_\bo_\br_\bb (const M& A, X& x, const Y& b, const K& w)\n+462 {\n+463 typedef typename M::ConstRowIterator rowiterator;\n+464 typedef typename M::ConstColIterator coliterator;\n+465 typedef typename Y::block_type bblock;\n+466 typedef typename X::block_type xblock;\n+467 bblock rhs;\n+468 xblock v;\n+469\n+470 // Initialize nested data structure if there are entries\n+471 if(A.begin()!=A.end())\n+472 v=x[0];\n+473\n+474 rowiterator endi=A.beforeBegin();\n+475 for (rowiterator i=A.beforeEnd(); i!=endi; --i)\n+476 {\n+477 rhs = b[i.index()];\n+478 coliterator endj=(*i).end();\n+479 coliterator j=(*i).begin();\n+480 if constexpr (IsNumber())\n+481 {\n+482 for (; j.index()mmv(x[j.index()],rhs);\n+494 coliterator diag=j;\n+495 for (; j!=endj; ++j)\n+496 j->mmv(x[j.index()],rhs);\n+497 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(*diag,v,rhs,w);\n+498 x[i.index()].axpy(w,v);\n+499 }\n+500 }\n+501 }\n+502\n+503 template\n+_\b5_\b0_\b4 static void _\bd_\bb_\bj_\ba_\bc (const M& A, X& x, const Y& b, const K& w)\n+505 {\n+506 typedef typename M::ConstRowIterator rowiterator;\n+507 typedef typename M::ConstColIterator coliterator;\n+508 typedef typename Y::block_type bblock;\n+509 bblock rhs;\n+510\n+511 X v(x); // allocate with same size\n+512\n+513 rowiterator endi=A.end();\n+514 for (rowiterator i=A.begin(); i!=endi; ++i)\n+515 {\n+516 rhs = b[i.index()];\n+517 coliterator endj=(*i).end();\n+518 coliterator j=(*i).begin();\n+519 if constexpr (IsNumber())\n+520 {\n+521 for (; j.index()mmv(x[j.index()],rhs);\n+532 coliterator diag=j;\n+533 for (; j!=endj; ++j)\n+534 j->mmv(x[j.index()],rhs);\n+535 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(*diag,v[i.index\n+()],rhs,w);\n+536 }\n+537 }\n+538 x.axpy(w,v);\n+539 }\n+540 };\n+541 // end of recursion\n+542 template\n+_\b5_\b4_\b3 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs<0,M> {\n+544 template\n+_\b5_\b4_\b5 static void _\bd_\bb_\bg_\bs (const M& A, X& x, const Y& b, const K& /*w*/)\n+546 {\n+547 A.solve(x,b);\n+548 }\n+549 template\n+_\b5_\b5_\b0 static void _\bb_\bs_\bo_\br_\bf (const M& A, X& x, const Y& b, const K& /*w*/)\n+551 {\n+552 A.solve(x,b);\n+553 }\n+554 template\n+_\b5_\b5_\b5 static void _\bb_\bs_\bo_\br_\bb (const M& A, X& x, const Y& b, const K& /*w*/)\n+556 {\n+557 A.solve(x,b);\n+558 }\n+559 template\n+_\b5_\b6_\b0 static void _\bd_\bb_\bj_\ba_\bc (const M& A, X& x, const Y& b, const K& /*w*/)\n+561 {\n+562 A.solve(x,b);\n+563 }\n+564 };\n+565\n+566 template\n+_\b5_\b6_\b7 struct _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs>\n+{\n+568 template<\n+569 typename... MultiTypeVectorArgs,\n+570 class K>\n+_\b5_\b7_\b1 static void _\bd_\bb_\bg_\bs (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>&\n+A,\n+572 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& x,\n+573 const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& b,\n+574 const K& w)\n+575 {\n+576 static const int N = _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>_\b:_\b:_\bN();\n+577 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\b0_\b,_\bN_\b>_\b:_\b:_\bd_\bb_\bg_\bs(A, x, b, w);\n+578 }\n+579\n+580 template<\n+581 typename... MultiTypeVectorArgs,\n+582 class K>\n+_\b5_\b8_\b3 static void _\bb_\bs_\bo_\br_\bf (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>&\n+A,\n+584 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& x,\n+585 const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& b,\n+586 const K& w)\n+587 {\n+588 static const int N = _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>_\b:_\b:_\bN();\n+589 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\b0_\b,_\bN_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(A, x, b, w);\n+590 }\n+591\n+592 template<\n+593 typename... MultiTypeVectorArgs,\n+594 class K>\n+_\b5_\b9_\b5 static void _\bb_\bs_\bo_\br_\bb (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>&\n+A,\n+596 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& x,\n+597 const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& b,\n+598 const K& w)\n+599 {\n+600 static const int N = _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>_\b:_\b:_\bN();\n+601 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bN_\b-_\b1_\b,_\bN_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(A, x, b, w);\n+602 }\n+603\n+604 template<\n+605 typename... MultiTypeVectorArgs,\n+606 class K\n+607 >\n+_\b6_\b0_\b8 static void _\bd_\bb_\bj_\ba_\bc (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>&\n+A,\n+609 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& x,\n+610 const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bV_\be_\bc_\bt_\bo_\br_\bA_\br_\bg_\bs_\b._\b._\b._\b>& b,\n+611 const K& w)\n+612 {\n+613 static const int N = _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b>_\b:_\b:_\bN();\n+614 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\b0_\b,_\bN_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(A, x, b, w);\n+615 }\n+616 };\n+617\n+618 // user calls\n+619\n+621 template\n+_\b6_\b2_\b2 void _\bd_\bb_\bg_\bs (const M& A, X& x, const Y& b, const K& w)\n+623 {\n+624 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b1_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bg_\bs(A,x,b,w);\n+625 }\n+627 template\n+_\b6_\b2_\b8 void _\bd_\bb_\bg_\bs (const M& A, X& x, const Y& b, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n+629 {\n+630 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bl_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bg_\bs(A,x,b,w);\n+631 }\n+633 template\n+_\b6_\b3_\b4 void _\bb_\bs_\bo_\br_\bf (const M& A, X& x, const Y& b, const K& w)\n+635 {\n+636 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b1_\b,_\bM_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(A,x,b,w);\n+637 }\n+639 template\n+_\b6_\b4_\b0 void _\bb_\bs_\bo_\br_\bf (const M& A, X& x, const Y& b, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n+641 {\n+642 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bl_\b,_\bM_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(A,x,b,w);\n+643 }\n+645 template\n+_\b6_\b4_\b6 void _\bb_\bs_\bo_\br_\bb (const M& A, X& x, const Y& b, const K& w)\n+647 {\n+648 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b1_\b,_\bM_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(A,x,b,w);\n+649 }\n+651 template\n+_\b6_\b5_\b2 void _\bb_\bs_\bo_\br_\bb (const M& A, X& x, const Y& b, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n+653 {\n+654 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bl_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\br_\be_\bm_\bo_\bv_\be_\b__\bc_\bv_\b<_\bM_\b>_\b:_\b:_\bt_\by_\bp_\be>_\b:_\b:_\bb_\bs_\bo_\br_\bb(A,x,b,w);\n+655 }\n+657 template\n+_\b6_\b5_\b8 void _\bd_\bb_\bj_\ba_\bc (const M& A, X& x, const Y& b, const K& w)\n+659 {\n+660 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b1_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(A,x,b,w);\n+661 }\n+663 template\n+_\b6_\b6_\b4 void _\bd_\bb_\bj_\ba_\bc (const M& A, X& x, const Y& b, const K& w, _\bB_\bL_\b<_\bl_\b> /*bl*/)\n+665 {\n+666 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bl_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(A,x,b,w);\n+667 }\n+668\n+669\n+672} // end namespace\n+673\n+674#endif\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+_\bm_\bu_\bl_\bt_\bi_\bt_\by_\bp_\be_\bb_\bl_\bo_\bc_\bk_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n+static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:584\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bb_\bg_\bs\n+static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:500\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bb_\bs_\bo_\br_\bb\n+static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:556\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+static constexpr size_type N()\n+Return the number of matrix rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bb_\bs_\bo_\br_\bf\n+static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:529\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n+void bltsolve(const M &A, X &v, const Y &d)\n+block lower triangular solve\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:175\n+_\bD_\bu_\bn_\be_\b:_\b:_\bW_\bi_\bt_\bh_\bD_\bi_\ba_\bg_\bT_\by_\bp_\be\n+WithDiagType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bb\n+void bsorb(const M &A, X &x, const Y &b, const K &w)\n+SSOR step.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:646\n+_\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n+void ubltsolve(const M &A, X &v, const Y &d)\n+unit block lower triangular solve\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n+void dbjac(const M &A, X &x, const Y &b, const K &w)\n+Jacobi step.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:658\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\bb_\bg_\bs\n+void dbgs(const M &A, X &x, const Y &b, const K &w)\n+GS step.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:622\n+_\bD_\bu_\bn_\be_\b:_\b:_\bW_\bi_\bt_\bh_\bR_\be_\bl_\ba_\bx_\bT_\by_\bp_\be\n+WithRelaxType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be\n+void bdsolve(const M &A, X &v, const Y &d)\n+block diagonal solve, no relaxation\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:337\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n+void butsolve(const M &A, X &v, const Y &d)\n+block upper triangular solve\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:202\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bs_\bo_\br_\bf\n+void bsorf(const M &A, X &x, const Y &b, const K &w)\n+SOR step.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:634\n+_\bD_\bu_\bn_\be_\b:_\b:_\bu_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n+void ubutsolve(const M &A, X &v, const Y &d)\n+unit block upper triangular solve\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:215\n+_\bD_\bu_\bn_\be_\b:_\b:_\bn_\bo_\bd_\bi_\ba_\bg\n+@ nodiag\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg\n+@ withdiag\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bn_\bo_\br_\be_\bl_\ba_\bx\n+@ norelax\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx\n+@ withrelax\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:55\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:17\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-static void apply(TT tuple, const T &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\b0_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-static void apply(TT tuple, const T &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:29\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br\n-CombinedFunctor(const T &tuple_)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const T1 &t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A Vector class to support different block types.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx\n+A Matrix class to support different block types.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bL\n+compile-time parameter for block recursion depth\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bL_\b:_\b:_\br_\be_\bc_\bu_\br_\bs_\bi_\bo_\bn_\b__\bl_\be_\bv_\be_\bl\n+@ recursion_level\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n+static void butsolve(const M &A, X &v, const Y &d, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:90\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n+static void bltsolve(const M &A, X &v, const Y &d, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n+static void bltsolve(const M &A, X &v, const Y &d, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:114\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n+static void butsolve(const M &A, X &v, const Y &d, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n+static void bltsolve(const M &A, X &v, const Y &d, const K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:129\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n+static void butsolve(const M &A, X &v, const Y &d, const K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:134\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n+static void bltsolve(const M &, X &v, const Y &d, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n+static void butsolve(const M &, X &v, const Y &d, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:148\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bl_\bt_\bs_\bo_\bl_\bv_\be\n+static void bltsolve(const M &, X &v, const Y &d, const K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:157\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bt_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\bd_\bi_\ba_\bg_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bu_\bt_\bs_\bo_\bl_\bv_\be\n+static void butsolve(const M &, X &v, const Y &d, const K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:294\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be\n+static void bdsolve(const M &A, X &v, const Y &d, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:296\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bw_\bi_\bt_\bh_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be\n+static void bdsolve(const M &A, X &v, const Y &d, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:316\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bb_\bd_\bs_\bo_\bl_\bv_\be_\b<_\b _\b0_\b,_\b _\bn_\bo_\br_\be_\bl_\ba_\bx_\b _\b>_\b:_\b:_\bb_\bd_\bs_\bo_\bl_\bv_\be\n+static void bdsolve(const M &A, X &v, const Y &d, const K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:325\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:375\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bb_\bs_\bo_\br_\bb\n+static void bsorb(const M &A, X &x, const Y &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:461\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bb_\bs_\bo_\br_\bf\n+static void bsorf(const M &A, X &x, const Y &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:418\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n+static void dbjac(const M &A, X &x, const Y &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:504\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bd_\bb_\bg_\bs\n+static void dbgs(const M &A, X &x, const Y &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:378\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\b0_\b,_\b _\bM_\b _\b>_\b:_\b:_\bd_\bb_\bg_\bs\n+static void dbgs(const M &A, X &x, const Y &b, const K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:545\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\b0_\b,_\b _\bM_\b _\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n+static void dbjac(const M &A, X &x, const Y &b, const K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\b0_\b,_\b _\bM_\b _\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf\n+static void bsorf(const M &A, X &x, const Y &b, const K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:550\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\b0_\b,_\b _\bM_\b _\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb\n+static void bsorb(const M &A, X &x, const Y &b, const K &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:555\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>\n+_\b>_\b:_\b:_\bd_\bb_\bg_\bs\n+static void dbgs(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A,\n+MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector<\n+MultiTypeVectorArgs... > &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:571\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>\n+_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n+static void dbjac(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A,\n+MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector<\n+MultiTypeVectorArgs... > &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:608\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>\n+_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf\n+static void bsorf(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A,\n+MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector<\n+MultiTypeVectorArgs... > &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:583\n+_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\b _\bI_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>\n+_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb\n+static void bsorb(const MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > &A,\n+MultiTypeBlockVector< MultiTypeVectorArgs... > &x, const MultiTypeBlockVector<\n+MultiTypeVectorArgs... > &b, const K &w)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:595\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00101.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00101.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixhierarchy.hh File Reference\n+dune-istl: vbvector.hh File Reference\n \n \n \n \n \n \n \n@@ -65,86 +65,59 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n \n+
    vbvector.hh File Reference
    \n \n
    \n \n-

    Provides a classes representing the hierarchies in AMG. \n+

    ??? \n More...

    \n-
    #include <algorithm>
    \n-#include <tuple>
    \n-#include "aggregates.hh"
    \n-#include "graph.hh"
    \n-#include "galerkin.hh"
    \n-#include "renumberer.hh"
    \n-#include "graphcreator.hh"
    \n-#include "hierarchy.hh"
    \n-#include <dune/istl/bvector.hh>
    \n-#include <dune/common/parallel/indexset.hh>
    \n-#include <dune/istl/matrixutils.hh>
    \n-#include <dune/istl/matrixredistribute.hh>
    \n-#include <dune/istl/paamg/dependency.hh>
    \n-#include <dune/istl/paamg/indicescoarsener.hh>
    \n-#include <dune/istl/paamg/globalaggregates.hh>
    \n-#include <dune/istl/paamg/construction.hh>
    \n-#include <dune/istl/paamg/smoother.hh>
    \n-#include <dune/istl/paamg/transfer.hh>
    \n+
    #include <cmath>
    \n+#include <complex>
    \n+#include <iostream>
    \n+#include <iterator>
    \n+#include <memory>
    \n+#include <dune/common/ftraits.hh>
    \n+#include <dune/common/indexediterator.hh>
    \n+#include <dune/common/iteratorfacades.hh>
    \n+#include "istlexception.hh"
    \n+#include "bvector.hh"
    \n+#include <dune/istl/blocklevel.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n+\n+\n \n-\n-\n+\n \n

    \n Classes

    class  Dune::Amg::MatrixHierarchy< M, PI, A >
     The hierarchies build by the coarsening process. More...
    class  Dune::VariableBlockVector< B, A >
     A Vector of blocks with different blocksizes. More...
     
    struct  Dune::Amg::MatrixHierarchy< M, PI, A >::MatrixStats< Matrix, true >::calc
    class  Dune::VariableBlockVector< B, A >::CreateIterator
     Iterator class for sequential creation of blocks. More...
     
    class  Dune::Amg::CoarsenCriterion< T >
     The criterion describing the stop criteria for the coarsening process. More...
    struct  Dune::FieldTraits< VariableBlockVector< B, A > >
     
    \n \n \n \n-\n-\n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n-\n-\n-\n-

    \n-Enumerations

    enum  { Dune::Amg::MAX_PROCESSES = 72000\n- }
     
    \n-\n-\n-\n-\n-\n-\n-\n

    \n-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)
     
    \n

    Detailed Description

    \n-

    Provides a classes representing the hierarchies in AMG.

    \n-
    Author
    Markus Blatt
    \n+

    ???

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,68 +1,37 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-matrixhierarchy.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Provides a classes representing the hierarchies in AMG. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n-#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n-#include \"_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\"\n-#include \"_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\"\n-#include \"_\bg_\br_\ba_\bp_\bh_\bc_\br_\be_\ba_\bt_\bo_\br_\b._\bh_\bh\"\n-#include \"_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh\"\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\bc_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bg_\bl_\bo_\bb_\ba_\bl_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+vbvector.hh File Reference\n+??? _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bM_\b,_\b _\bP_\bI_\b,_\b _\bA_\b _\b>\n-\u00a0 The hierarchies build by the coarsening process. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n+\u00a0 A Vector of blocks with different blocksizes. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bM_\b,_\b _\bP_\bI_\b,_\b _\bA_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:\n- _\bc_\ba_\bl_\bc\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+\u00a0 Iterator class for sequential creation of blocks. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\b _\bT_\b _\b>\n-\u00a0 The criterion describing the stop criteria for the coarsening process.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n-E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n-enum \u00a0 { _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\bA_\bX_\b__\bP_\bR_\bO_\bC_\bE_\bS_\bS_\bE_\bS = 72000 }\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx (const M &origMatrix, std::\n- shared_ptr< M > newMatrix, _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn &origComm, std::\n- shared_ptr< _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn > &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn<\n- _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn > &ri, int nparts, C1 &criterion)\n-\u00a0\n-template\n-bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx (const M &origMatrix, std::\n- shared_ptr< M > newMatrix, C &origComm, std::shared_ptr< C > &newComm,\n- _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< C > &ri, int nparts, C1 &criterion)\n-\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides a classes representing the hierarchies in AMG.\n- Author\n- Markus Blatt\n+???\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00101_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00101_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixhierarchy.hh Source File\n+dune-istl: vbvector.hh Source File\n \n \n \n \n \n \n \n@@ -70,1009 +70,611 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    matrixhierarchy.hh
    \n+
    vbvector.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_MATRIXHIERARCHY_HH
    \n-
    6#define DUNE_AMG_MATRIXHIERARCHY_HH
    \n+
    5#ifndef DUNE_ISTL_VBVECTOR_HH
    \n+
    6#define DUNE_ISTL_VBVECTOR_HH
    \n
    7
    \n-
    8#include <algorithm>
    \n-
    9#include <tuple>
    \n-
    10#include "aggregates.hh"
    \n-
    11#include "graph.hh"
    \n-
    12#include "galerkin.hh"
    \n-
    13#include "renumberer.hh"
    \n-
    14#include "graphcreator.hh"
    \n-
    15#include "hierarchy.hh"
    \n-
    16#include <dune/istl/bvector.hh>
    \n-
    17#include <dune/common/parallel/indexset.hh>
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+
    8#include <cmath>
    \n+
    9#include <complex>
    \n+
    10#include <iostream>
    \n+
    11#include <iterator>
    \n+
    12#include <memory>
    \n+
    13
    \n+
    14#include <dune/common/ftraits.hh>
    \n+
    15#include <dune/common/indexediterator.hh>
    \n+
    16#include <dune/common/iteratorfacades.hh>
    \n+
    17#include "istlexception.hh"
    \n+
    18#include "bvector.hh"
    \n+
    19
    \n+\n+
    21
    \n+
    26namespace Dune {
    \n
    27
    \n-
    28namespace Dune
    \n-
    29{
    \n-
    30 namespace Amg
    \n-
    31 {
    \n-
    42 enum {
    \n-
    50 MAX_PROCESSES = 72000
    \n-
    51 };
    \n-
    52
    \n-
    59 template<class M, class PI, class A=std::allocator<M> >
    \n-
    \n-\n-
    61 {
    \n-
    62 public:
    \n-
    64 typedef M MatrixOperator;
    \n-
    65
    \n-
    67 typedef typename MatrixOperator::matrix_type Matrix;
    \n-
    68
    \n-\n-
    71
    \n-
    73 typedef A Allocator;
    \n-
    74
    \n-\n-
    77
    \n-\n-
    80
    \n-\n-
    83
    \n-
    85 using AAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<AggregatesMap*>;
    \n-
    86
    \n-
    88 typedef std::list<AggregatesMap*,AAllocator> AggregatesMapList;
    \n-
    89
    \n-\n-
    92
    \n-
    94 using RILAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<RedistributeInfoType>;
    \n+
    43 template<class B, class A=std::allocator<B> >
    \n+
    \n+
    44 class VariableBlockVector : public Imp::block_vector_unmanaged<B,typename A::size_type>
    \n+
    45 // this derivation gives us all the blas level 1 and norms
    \n+
    46 // on the large array. However, access operators have to be
    \n+
    47 // overwritten.
    \n+
    48 {
    \n+
    49 using Base = Imp::block_vector_unmanaged<B,typename A::size_type>;
    \n+
    50
    \n+
    51 // just a shorthand
    \n+
    52 using window_type = Imp::BlockVectorWindow<B,A>;
    \n+
    53
    \n+
    54 // data-structure holding the windows (but not the actual data)
    \n+
    55 using VectorWindows = std::vector<window_type, typename std::allocator_traits<A>::template rebind_alloc<window_type>>;
    \n+
    56
    \n+
    57 // block type bool is not supported since std::vector<bool> is used for storage
    \n+
    58 static_assert(not std::is_same_v<B,bool>, "Block type 'bool' not supported by VariableBlockVector.");
    \n+
    59
    \n+
    60 public:
    \n+
    61
    \n+
    62 //===== type definitions and constants
    \n+
    63
    \n+
    65 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n+
    66
    \n+
    68 using allocator_type = A;
    \n+
    69
    \n+
    74 using reference = window_type&;
    \n+
    75
    \n+
    80 using const_reference = const window_type&;
    \n+
    81
    \n+
    83 using size_type = typename A::size_type;
    \n+
    84
    \n+\n+
    91
    \n+\n
    95
    \n-
    97 typedef std::list<RedistributeInfoType,RILAllocator> RedistributeInfoList;
    \n-
    98
    \n-
    104 MatrixHierarchy(std::shared_ptr<MatrixOperator> fineMatrix,
    \n-
    105 std::shared_ptr<ParallelInformation> pinfo = std::make_shared<ParallelInformation>());
    \n-
    106
    \n-\n-
    108
    \n-
    114 template<typename O, typename T>
    \n-
    115 void build(const T& criterion);
    \n+
    96 //===== constructors and such
    \n+
    97
    \n+
    \n+\n+
    103 Base()
    \n+
    104 {}
    \n+
    \n+
    105
    \n+
    \n+
    112 explicit VariableBlockVector (size_type numBlocks) :
    \n+
    113 Base(),
    \n+
    114 block(numBlocks)
    \n+
    115 {}
    \n+
    \n
    116
    \n-
    124 template<class F>
    \n-
    125 void recalculateGalerkin(const F& copyFlags);
    \n-
    126
    \n-
    131 template<class V, class BA, class TA>
    \n-
    132 void coarsenVector(Hierarchy<BlockVector<V,BA>, TA>& hierarchy) const;
    \n-
    133
    \n-
    139 template<class S, class TA>
    \n-
    140 void coarsenSmoother(Hierarchy<S,TA>& smoothers,
    \n-
    141 const typename SmootherTraits<S>::Arguments& args) const;
    \n-
    142
    \n-
    147 std::size_t levels() const;
    \n+
    \n+
    125 VariableBlockVector (size_type numBlocks, size_type blockSize) :
    \n+
    126 Base(),
    \n+
    127 block(numBlocks),
    \n+
    128 storage_(numBlocks*blockSize)
    \n+
    129 {
    \n+
    130 // and we can allocate the big array in the base class
    \n+
    131 syncBaseArray();
    \n+
    132
    \n+
    133 // set the windows into the big array
    \n+
    134 for (size_type i=0; i<numBlocks; ++i)
    \n+
    135 block[i].set(blockSize,this->p+(i*blockSize));
    \n+
    136
    \n+
    137 // and the vector is usable
    \n+
    138 initialized = true;
    \n+
    139 }
    \n+
    \n+
    140
    \n+
    \n+\n+
    143 Base(static_cast<const Base&>(a)),
    \n+
    144 block(a.block),
    \n+
    145 storage_(a.storage_)
    \n+
    146 {
    \n+
    147 syncBaseArray();
    \n
    148
    \n-
    153 std::size_t maxlevels() const;
    \n-
    154
    \n-
    155 bool hasCoarsest() const;
    \n-
    156
    \n-
    161 bool isBuilt() const;
    \n-
    162
    \n-
    167 const ParallelMatrixHierarchy& matrices() const;
    \n-
    168
    \n-\n-
    174
    \n-
    179 const AggregatesMapList& aggregatesMaps() const;
    \n-
    180
    \n-\n-
    187
    \n-
    \n-\n-
    189 {
    \n-
    190 return prolongDamp_;
    \n-
    191 }
    \n+
    149 // and we must set the windows
    \n+
    150 if (block.size()>0) {
    \n+
    151 block[0].set(block[0].getsize(),this->p); // first block
    \n+
    152 for (size_type i=1; i<block.size(); ++i) // and the rest
    \n+
    153 block[i].set(block[i].getsize(),block[i-1].getptr()+block[i-1].getsize());
    \n+
    154 }
    \n+
    155
    \n+
    156 // and we have a usable vector
    \n+
    157 initialized = a.initialized;
    \n+
    158 }
    \n+
    \n+
    159
    \n+
    \n+\n+
    162 Base()
    \n+
    163 {
    \n+
    164 tmp.swap(*this);
    \n+
    165 }
    \n
    \n-
    192
    \n-
    203 void getCoarsestAggregatesOnFinest(std::vector<std::size_t>& data) const;
    \n+
    166
    \n+\n+
    168
    \n+
    169
    \n+
    \n+\n+
    172 {
    \n+
    173 tmp.swap(*this);
    \n+
    174 return *this;
    \n+
    175 }
    \n+
    \n+
    176
    \n+
    \n+
    178 void swap (VariableBlockVector& other) noexcept
    \n+
    179 {
    \n+
    180 using std::swap;
    \n+
    181 swap(storage_, other.storage_);
    \n+
    182 swap(block, other.block);
    \n+
    183 swap(initialized, other.initialized);
    \n+
    184
    \n+
    185 other.syncBaseArray();
    \n+
    186 syncBaseArray();
    \n+
    187 }
    \n+
    \n+
    188
    \n+
    \n+
    190 friend void swap (VariableBlockVector& lhs, VariableBlockVector& rhs) noexcept
    \n+
    191 {
    \n+
    192 lhs.swap(rhs);
    \n+
    193 }
    \n+
    \n+
    194
    \n+
    \n+
    196 void resize (size_type numBlocks)
    \n+
    197 {
    \n+
    198 storage_.clear();
    \n+
    199
    \n+
    200 syncBaseArray();
    \n+
    201
    \n+
    202 // we can allocate the windows now
    \n+
    203 block.resize(numBlocks);
    \n
    204
    \n-
    205 private:
    \n-
    206 typedef typename ConstructionTraits<MatrixOperator>::Arguments MatrixArgs;
    \n-
    207 typedef typename ConstructionTraits<ParallelInformation>::Arguments CommunicationArgs;
    \n-
    209 AggregatesMapList aggregatesMaps_;
    \n-
    211 RedistributeInfoList redistributes_;
    \n-
    213 ParallelMatrixHierarchy matrices_;
    \n-
    215 ParallelInformationHierarchy parallelInformation_;
    \n+
    205 // and the vector not fully usable
    \n+
    206 initialized = false;
    \n+
    207 }
    \n+
    \n+
    208
    \n+
    \n+
    210 void resize (size_type numBlocks, size_type blockSize)
    \n+
    211 {
    \n+
    212 // and we can allocate the big array in the base class
    \n+
    213 storage_.resize(numBlocks*blockSize);
    \n+
    214 block.resize(numBlocks);
    \n+
    215 syncBaseArray();
    \n
    216
    \n-
    218 bool built_;
    \n-
    219
    \n-
    221 int maxlevels_;
    \n-
    222
    \n-
    223 double prolongDamp_;
    \n+
    217 // set the windows into the big array
    \n+
    218 for (size_type i=0; i<block.size(); ++i)
    \n+
    219 block[i].set(blockSize,this->p+(i*blockSize));
    \n+
    220
    \n+
    221 // and the vector is usable
    \n+
    222 initialized = true;
    \n+
    223 }
    \n+
    \n
    224
    \n-
    228 template<class Matrix, bool print>
    \n-
    229 struct MatrixStats
    \n-
    230 {
    \n-
    231
    \n-
    235 static void stats([[maybe_unused]] const Matrix& matrix)
    \n-
    236 {}
    \n-
    237 };
    \n+
    225 //===== assignment from scalar
    \n+
    226
    \n+
    \n+\n+
    229 {
    \n+
    230 (static_cast<Imp::block_vector_unmanaged<B,size_type>&>(*this)) = k;
    \n+
    231 return *this;
    \n+
    232 }
    \n+
    \n+
    233
    \n+
    234
    \n+
    235 //===== the creation interface
    \n+
    236
    \n+
    237 class CreateIterator;
    \n
    238
    \n-
    239 template<class Matrix>
    \n-
    240 struct MatrixStats<Matrix,true>
    \n-
    241 {
    \n-
    \n-
    242 struct calc
    \n-
    243 {
    \n-
    244 typedef typename Matrix::size_type size_type;
    \n-
    245 typedef typename Matrix::row_type matrix_row;
    \n-
    246
    \n-
    \n-\n-
    248 {
    \n-
    249 min=std::numeric_limits<size_type>::max();
    \n-
    250 max=0;
    \n-
    251 sum=0;
    \n-
    252 }
    \n-
    \n+
    239#ifndef DOXYGEN
    \n+
    240
    \n+
    241 // The window_type does not hand out a reference to its size,
    \n+
    242 // so in order to provide a valid iterator, we need a workaround
    \n+
    243 // to make assignment possible. This proxy enables just that by
    \n+
    244 // implicitly converting to the stored size for read access and
    \n+
    245 // tunneling assignment to the accessor method of the window.
    \n+
    246 struct SizeProxy
    \n+
    247 {
    \n+
    248
    \n+
    249 operator size_type () const
    \n+
    250 {
    \n+
    251 return target->getsize();
    \n+
    252 }
    \n
    253
    \n-
    \n-
    254 void operator()(const matrix_row& row)
    \n-
    255 {
    \n-
    256 min=std::min(min, row.size());
    \n-
    257 max=std::max(max, row.size());
    \n-
    258 sum += row.size();
    \n-
    259 }
    \n-
    \n-
    260
    \n-\n-\n-\n-
    264 };
    \n-
    \n-
    268 static void stats(const Matrix& matrix)
    \n-
    269 {
    \n-
    270 calc c= for_each(matrix.begin(), matrix.end(), calc());
    \n-
    271 dinfo<<"Matrix row: min="<<c.min<<" max="<<c.max
    \n-
    272 <<" average="<<static_cast<double>(c.sum)/matrix.N()
    \n-
    273 <<std::endl;
    \n-
    274 }
    \n-
    275 };
    \n-
    276 };
    \n-
    \n-
    277
    \n-
    281 template<class T>
    \n-
    \n-
    282 class CoarsenCriterion : public T
    \n-
    283 {
    \n-
    284 public:
    \n-\n+
    254 SizeProxy& operator= (size_type size)
    \n+
    255 {
    \n+
    256 target->setsize(size);
    \n+
    257 return *this;
    \n+
    258 }
    \n+
    259
    \n+
    260 private:
    \n+
    261
    \n+
    262 friend class CreateIterator;
    \n+
    263
    \n+
    264 SizeProxy (window_type& t) :
    \n+
    265 target(&t)
    \n+
    266 {}
    \n+
    267
    \n+
    268 window_type* target;
    \n+
    269 };
    \n+
    270
    \n+
    271#endif // DOXYGEN
    \n+
    272
    \n+
    \n+\n+
    275 {
    \n+
    276 public:
    \n+
    278 using iterator_category = std::output_iterator_tag;
    \n+
    279
    \n+\n+
    282
    \n+
    289 using difference_type = void;
    \n
    290
    \n-
    \n-
    304 CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2,
    \n-
    305 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu, bool useFixedOrder = false)
    \n-
    306 : AggregationCriterion(Dune::Amg::Parameters(maxLevel, coarsenTarget, minCoarsenRate, prolongDamp, accumulate, useFixedOrder))
    \n-
    307 {}
    \n-
    \n-
    308
    \n-
    \n-\n-
    310 : AggregationCriterion(parms)
    \n-
    311 {}
    \n+\n+
    293
    \n+
    295 using reference = SizeProxy;
    \n+
    296
    \n+
    \n+
    298 CreateIterator (VariableBlockVector& _v, int _i, bool _isEnd) :
    \n+
    299 v(_v),
    \n+
    300 i(_i),
    \n+
    301 isEnd(_isEnd)
    \n+
    302 {}
    \n
    \n-
    312
    \n-
    313 };
    \n+
    303
    \n+
    \n+\n+
    305 {
    \n+
    306 // When the iterator gets destructed, we allocate the memory
    \n+
    307 // for the VariableBlockVector if
    \n+
    308 // 1. the current iterator was not created as enditerator
    \n+
    309 // 2. we're at the last block
    \n+
    310 // 3. the vector hasn't been initialized earlier
    \n+
    311 if (not isEnd && i==v.block.size() && not v.initialized)
    \n+
    312 v.allocate();
    \n+
    313 }
    \n
    \n
    314
    \n-
    315 template<typename M, typename C1>
    \n
    \n-
    316 bool repartitionAndDistributeMatrix([[maybe_unused]] const M& origMatrix,
    \n-
    317 [[maybe_unused]] std::shared_ptr<M> newMatrix,
    \n-
    318 [[maybe_unused]] SequentialInformation& origComm,
    \n-
    319 [[maybe_unused]] std::shared_ptr<SequentialInformation>& newComm,
    \n-\n-
    321 [[maybe_unused]] int nparts,
    \n-
    322 [[maybe_unused]] C1& criterion)
    \n-
    323 {
    \n-
    324 DUNE_THROW(NotImplemented, "Redistribution does not make sense in sequential code!");
    \n-
    325 }
    \n-
    \n-
    326
    \n-
    327
    \n-
    328 template<typename M, typename C, typename C1>
    \n-
    \n-
    329 bool repartitionAndDistributeMatrix(const M& origMatrix,
    \n-
    330 std::shared_ptr<M> newMatrix,
    \n-
    331 C& origComm,
    \n-
    332 std::shared_ptr<C>& newComm,
    \n-\n-
    334 int nparts, C1& criterion)
    \n-
    335 {
    \n-
    336 Timer time;
    \n-
    337#ifdef AMG_REPART_ON_COMM_GRAPH
    \n-
    338 // Done not repartition the matrix graph, but a graph of the communication scheme.
    \n-
    339 bool existentOnRedist=Dune::commGraphRepartition(origMatrix, origComm, nparts, newComm,
    \n-
    340 ri.getInterface(),
    \n-
    341 criterion.debugLevel()>1);
    \n-
    342
    \n-
    343#else
    \n-\n-\n-\n-\n-
    348 IdentityMap,
    \n-
    349 IdentityMap> PropertiesGraph;
    \n-
    350 MatrixGraph graph(origMatrix);
    \n-
    351 PropertiesGraph pgraph(graph);
    \n-
    352 buildDependency(pgraph, origMatrix, criterion, false);
    \n-
    353
    \n-
    354#ifdef DEBUG_REPART
    \n-
    355 if(origComm.communicator().rank()==0)
    \n-
    356 std::cout<<"Original matrix"<<std::endl;
    \n-
    357 origComm.communicator().barrier();
    \n-
    358 printGlobalSparseMatrix(origMatrix, origComm, std::cout);
    \n-
    359#endif
    \n-
    360 bool existentOnRedist=Dune::graphRepartition(pgraph, origComm, nparts,
    \n-
    361 newComm, ri.getInterface(),
    \n-
    362 criterion.debugLevel()>1);
    \n-
    363#endif // if else AMG_REPART
    \n-
    364
    \n-
    365 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)
    \n-
    366 std::cout<<"Repartitioning took "<<time.elapsed()<<" seconds."<<std::endl;
    \n-
    367
    \n-
    368 ri.setSetup();
    \n-
    369
    \n-
    370#ifdef DEBUG_REPART
    \n-
    371 ri.checkInterface(origComm.indexSet(), newComm->indexSet(), origComm.communicator());
    \n-
    372#endif
    \n-
    373
    \n-
    374 redistributeMatrix(const_cast<M&>(origMatrix), *newMatrix, origComm, *newComm, ri);
    \n+\n+
    317 {
    \n+
    318 // go to next block
    \n+
    319 ++i;
    \n+
    320
    \n+
    321 return *this;
    \n+
    322 }
    \n+
    \n+
    323
    \n+
    \n+\n+
    326 {
    \n+
    327 CreateIterator tmp(*this);
    \n+
    328 this->operator++();
    \n+
    329 return tmp;
    \n+
    330 }
    \n+
    \n+
    331
    \n+
    \n+
    333 bool operator!= (const CreateIterator& it) const
    \n+
    334 {
    \n+
    335 return (i!=it.i) || (&v!=&it.v);
    \n+
    336 }
    \n+
    \n+
    337
    \n+
    \n+
    339 bool operator== (const CreateIterator& it) const
    \n+
    340 {
    \n+
    341 return (i==it.i) && (&v==&it.v);
    \n+
    342 }
    \n+
    \n+
    343
    \n+
    \n+\n+
    346 {
    \n+
    347 return i;
    \n+
    348 }
    \n+
    \n+
    349
    \n+
    \n+\n+
    352 {
    \n+
    353 v.block[i].setsize(_k);
    \n+
    354 }
    \n+
    \n+
    355
    \n+
    357#ifdef DOXYGEN
    \n+
    358 size_type&
    \n+
    359#else
    \n+
    360 SizeProxy
    \n+
    361#endif
    \n+
    \n+\n+
    363 {
    \n+
    364 return {v.block[i]};
    \n+
    365 }
    \n+
    \n+
    366
    \n+
    367 private:
    \n+
    368 VariableBlockVector& v; // my vector
    \n+
    369 size_type i; // current block to be defined
    \n+
    370 const bool isEnd; // flag if this object was created as the end iterator.
    \n+
    371 };
    \n+
    \n+
    372
    \n+
    373 // CreateIterator wants to set all the arrays ...
    \n+
    374 friend class CreateIterator;
    \n
    375
    \n-
    376#ifdef DEBUG_REPART
    \n-
    377 if(origComm.communicator().rank()==0)
    \n-
    378 std::cout<<"Original matrix"<<std::endl;
    \n-
    379 origComm.communicator().barrier();
    \n-
    380 if(newComm->communicator().size()>0)
    \n-
    381 printGlobalSparseMatrix(*newMatrix, *newComm, std::cout);
    \n-
    382 origComm.communicator().barrier();
    \n-
    383#endif
    \n+
    \n+\n+
    378 {
    \n+
    379#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    380 if (initialized) DUNE_THROW(ISTLError,"no CreateIterator in initialized state");
    \n+
    381#endif
    \n+
    382 return CreateIterator(*this, 0, false);
    \n+
    383 }
    \n+
    \n
    384
    \n-
    385 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)
    \n-
    386 std::cout<<"Redistributing matrix took "<<time.elapsed()<<" seconds."<<std::endl;
    \n-
    387 return existentOnRedist;
    \n-
    388
    \n+
    \n+\n+
    387 {
    \n+
    388 return CreateIterator(*this, block.size(), true);
    \n
    389 }
    \n
    \n
    390
    \n-
    391 template<class M, class IS, class A>
    \n-
    \n-
    392 MatrixHierarchy<M,IS,A>::MatrixHierarchy(std::shared_ptr<MatrixOperator> fineMatrix,
    \n-
    393 std::shared_ptr<ParallelInformation> pinfo)
    \n-
    394 : matrices_(fineMatrix),
    \n-
    395 parallelInformation_(pinfo)
    \n-
    396 {
    \n-
    397 if (SolverCategory::category(*fineMatrix) != SolverCategory::category(*pinfo))
    \n-
    398 DUNE_THROW(ISTLError, "MatrixOperator and ParallelInformation must belong to the same category!");
    \n-
    399 }
    \n-
    \n-
    400
    \n-
    401 template<class M, class IS, class A>
    \n-
    402 template<typename O, typename T>
    \n-
    \n-
    403 void MatrixHierarchy<M,IS,A>::build(const T& criterion)
    \n-
    404 {
    \n-
    405 prolongDamp_ = criterion.getProlongationDampingFactor();
    \n-
    406 typedef O OverlapFlags;
    \n-
    407 typedef typename ParallelMatrixHierarchy::Iterator MatIterator;
    \n-
    408 typedef typename ParallelInformationHierarchy::Iterator PInfoIterator;
    \n-
    409
    \n-
    410 static const int noints=(Dune::Amg::MAX_PROCESSES/4096>0) ? (Dune::Amg::MAX_PROCESSES/4096) : 1;
    \n-
    411
    \n-
    412 typedef bigunsignedint<sizeof(int)*8*noints> BIGINT;
    \n-\n-
    414 MatIterator mlevel = matrices_.finest();
    \n-
    415 MatrixStats<typename M::matrix_type,MINIMAL_DEBUG_LEVEL<=INFO_DEBUG_LEVEL>::stats(mlevel->getmat());
    \n-
    416
    \n-
    417 PInfoIterator infoLevel = parallelInformation_.finest();
    \n-
    418 BIGINT finenonzeros=countNonZeros(mlevel->getmat());
    \n-
    419 finenonzeros = infoLevel->communicator().sum(finenonzeros);
    \n-
    420 BIGINT allnonzeros = finenonzeros;
    \n+
    391
    \n+
    392 //===== access to components
    \n+
    393 // has to be overwritten from base class because it must
    \n+
    394 // return access to the windows
    \n+
    395
    \n+
    \n+
    397 window_type& operator[] (size_type i)
    \n+
    398 {
    \n+
    399#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    400 if (i>=block.size()) DUNE_THROW(ISTLError,"index out of range");
    \n+
    401#endif
    \n+
    402 return block[i];
    \n+
    403 }
    \n+
    \n+
    404
    \n+
    \n+
    406 const window_type& operator[] (size_type i) const
    \n+
    407 {
    \n+
    408#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    409 if (i<0 || i>=block.size()) DUNE_THROW(ISTLError,"index out of range");
    \n+
    410#endif
    \n+
    411 return block[i];
    \n+
    412 }
    \n+
    \n+
    413
    \n+
    414 using Iterator = IndexedIterator<typename VectorWindows::iterator>;
    \n+
    415
    \n+
    \n+\n+
    418 {
    \n+
    419 return Iterator{block.begin()};
    \n+
    420 }
    \n+
    \n
    421
    \n-
    422
    \n-
    423 int level = 0;
    \n-
    424 int rank = 0;
    \n-
    425
    \n-
    426 BIGINT unknowns = mlevel->getmat().N();
    \n+
    \n+\n+
    424 {
    \n+
    425 return Iterator{block.end()};
    \n+
    426 }
    \n+
    \n
    427
    \n-
    428 unknowns = infoLevel->communicator().sum(unknowns);
    \n-
    429 double dunknowns=unknowns.todouble();
    \n-
    430 infoLevel->buildGlobalLookup(mlevel->getmat().N());
    \n-
    431 redistributes_.push_back(RedistributeInfoType());
    \n-
    432
    \n-
    433 for(; level < criterion.maxLevel(); ++level, ++mlevel) {
    \n-
    434 assert(matrices_.levels()==redistributes_.size());
    \n-
    435 rank = infoLevel->communicator().rank();
    \n-
    436 if(rank==0 && criterion.debugLevel()>1)
    \n-
    437 std::cout<<"Level "<<level<<" has "<<dunknowns<<" unknowns, "<<dunknowns/infoLevel->communicator().size()
    \n-
    438 <<" unknowns per proc (procs="<<infoLevel->communicator().size()<<")"<<std::endl;
    \n-
    439
    \n-
    440 MatrixOperator* matrix=&(*mlevel);
    \n-
    441 ParallelInformation* info =&(*infoLevel);
    \n-
    442
    \n-
    443 if((
    \n-
    444#if HAVE_PARMETIS
    \n-
    445 criterion.accumulate()==successiveAccu
    \n-
    446#else
    \n-
    447 false
    \n-
    448#endif
    \n-
    449 || (criterion.accumulate()==atOnceAccu
    \n-
    450 && dunknowns < 30*infoLevel->communicator().size()))
    \n-
    451 && infoLevel->communicator().size()>1 &&
    \n-
    452 dunknowns/infoLevel->communicator().size() <= criterion.coarsenTarget())
    \n-
    453 {
    \n-
    454 // accumulate to fewer processors
    \n-
    455 std::shared_ptr<Matrix> redistMat = std::make_shared<Matrix>();
    \n-
    456 std::shared_ptr<ParallelInformation> redistComm;
    \n-
    457 std::size_t nodomains = (std::size_t)std::ceil(dunknowns/(criterion.minAggregateSize()
    \n-
    458 *criterion.coarsenTarget()));
    \n-
    459 if( nodomains<=criterion.minAggregateSize()/2 ||
    \n-
    460 dunknowns <= criterion.coarsenTarget() )
    \n-
    461 nodomains=1;
    \n+
    \n+\n+
    431 {
    \n+
    432 return Iterator{--block.end()};
    \n+
    433 }
    \n+
    \n+
    434
    \n+
    \n+\n+
    438 {
    \n+
    439 return Iterator{--block.begin()};
    \n+
    440 }
    \n+
    \n+
    441
    \n+\n+
    444
    \n+
    446 using ConstIterator = IndexedIterator<typename VectorWindows::const_iterator>;
    \n+
    447
    \n+\n+
    450
    \n+
    \n+\n+
    453 {
    \n+
    454 return ConstIterator{block.begin()};
    \n+
    455 }
    \n+
    \n+
    456
    \n+
    \n+\n+
    459 {
    \n+
    460 return ConstIterator{block.end()};
    \n+
    461 }
    \n+
    \n
    462
    \n-
    463 bool existentOnNextLevel =
    \n-
    464 repartitionAndDistributeMatrix(mlevel->getmat(), redistMat, *infoLevel,
    \n-
    465 redistComm, redistributes_.back(), nodomains,
    \n-
    466 criterion);
    \n-
    467 BIGINT unknownsRedist = redistMat->N();
    \n-
    468 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);
    \n-
    469 dunknowns= unknownsRedist.todouble();
    \n-
    470 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1)
    \n-
    471 std::cout<<"Level "<<level<<" (redistributed) has "<<dunknowns<<" unknowns, "<<dunknowns/redistComm->communicator().size()
    \n-
    472 <<" unknowns per proc (procs="<<redistComm->communicator().size()<<")"<<std::endl;
    \n-
    473 MatrixArgs args(redistMat, *redistComm);
    \n-
    474 mlevel.addRedistributed(ConstructionTraits<MatrixOperator>::construct(args));
    \n-
    475 assert(mlevel.isRedistributed());
    \n-
    476 infoLevel.addRedistributed(redistComm);
    \n-
    477 infoLevel->freeGlobalLookup();
    \n-
    478
    \n-
    479 if(!existentOnNextLevel)
    \n-
    480 // We do not hold any data on the redistributed partitioning
    \n-
    481 break;
    \n+
    \n+\n+
    466 {
    \n+
    467 return ConstIterator{--block.end()};
    \n+
    468 }
    \n+
    \n+
    469
    \n+
    \n+\n+
    473 {
    \n+
    474 return ConstIterator{--block.begin()};
    \n+
    475 }
    \n+
    \n+
    476
    \n+
    \n+\n+
    479 {
    \n+
    480 return ConstIterator{block.rend()};
    \n+
    481 }
    \n+
    \n
    482
    \n-
    483 // Work on the redistributed Matrix from now on
    \n-
    484 matrix = &(mlevel.getRedistributed());
    \n-
    485 info = &(infoLevel.getRedistributed());
    \n-
    486 info->buildGlobalLookup(matrix->getmat().N());
    \n-
    487 }
    \n-
    488
    \n-
    489 rank = info->communicator().rank();
    \n-
    490 if(dunknowns <= criterion.coarsenTarget())
    \n-
    491 // No further coarsening needed
    \n-
    492 break;
    \n-
    493
    \n-\n-
    495 typedef typename GraphCreator::PropertiesGraph PropertiesGraph;
    \n-
    496 typedef typename GraphCreator::GraphTuple GraphTuple;
    \n-
    497
    \n-
    498 typedef typename PropertiesGraph::VertexDescriptor Vertex;
    \n-
    499
    \n-
    500 std::vector<bool> excluded(matrix->getmat().N(), false);
    \n-
    501
    \n-
    502 GraphTuple graphs = GraphCreator::create(*matrix, excluded, *info, OverlapFlags());
    \n-
    503
    \n-
    504 AggregatesMap* aggregatesMap=new AggregatesMap(std::get<1>(graphs)->maxVertex()+1);
    \n-
    505
    \n-
    506 aggregatesMaps_.push_back(aggregatesMap);
    \n-
    507
    \n-
    508 Timer watch;
    \n-
    509 watch.reset();
    \n-
    510 auto [noAggregates, isoAggregates, oneAggregates, skippedAggregates] =
    \n-
    511 aggregatesMap->buildAggregates(matrix->getmat(), *(std::get<1>(graphs)), criterion, level==0);
    \n-
    512
    \n-
    513 if(rank==0 && criterion.debugLevel()>2)
    \n-
    514 std::cout<<" Have built "<<noAggregates<<" aggregates totally ("<<isoAggregates<<" isolated aggregates, "<<
    \n-
    515 oneAggregates<<" aggregates of one vertex, and skipped "<<
    \n-
    516 skippedAggregates<<" aggregates)."<<std::endl;
    \n-
    517#ifdef TEST_AGGLO
    \n-
    518 {
    \n-
    519 // calculate size of local matrix in the distributed direction
    \n-
    520 int start, end, overlapStart, overlapEnd;
    \n-
    521 int procs=info->communicator().rank();
    \n-
    522 int n = UNKNOWNS/procs; // number of unknowns per process
    \n-
    523 int bigger = UNKNOWNS%procs; // number of process with n+1 unknowns
    \n-
    524
    \n-
    525 // Compute owner region
    \n-
    526 if(rank<bigger) {
    \n-
    527 start = rank*(n+1);
    \n-
    528 end = (rank+1)*(n+1);
    \n-
    529 }else{
    \n-
    530 start = bigger + rank * n;
    \n-
    531 end = bigger + (rank + 1) * n;
    \n-
    532 }
    \n-
    533
    \n-
    534 // Compute overlap region
    \n-
    535 if(start>0)
    \n-
    536 overlapStart = start - 1;
    \n-
    537 else
    \n-
    538 overlapStart = start;
    \n-
    539
    \n-
    540 if(end<UNKNOWNS)
    \n-
    541 overlapEnd = end + 1;
    \n-
    542 else
    \n-
    543 overlapEnd = end;
    \n-
    544
    \n-
    545 assert((UNKNOWNS)*(overlapEnd-overlapStart)==aggregatesMap->noVertices());
    \n-
    546 for(int j=0; j< UNKNOWNS; ++j)
    \n-
    547 for(int i=0; i < UNKNOWNS; ++i)
    \n-
    548 {
    \n-
    549 if(i>=overlapStart && i<overlapEnd)
    \n-
    550 {
    \n-
    551 int no = (j/2)*((UNKNOWNS)/2)+i/2;
    \n-
    552 (*aggregatesMap)[j*(overlapEnd-overlapStart)+i-overlapStart]=no;
    \n-
    553 }
    \n-
    554 }
    \n-
    555 }
    \n-
    556#endif
    \n-
    557 if(criterion.debugLevel()>1 && info->communicator().rank()==0)
    \n-
    558 std::cout<<"aggregating finished."<<std::endl;
    \n-
    559
    \n-
    560 BIGINT gnoAggregates=noAggregates;
    \n-
    561 gnoAggregates = info->communicator().sum(gnoAggregates);
    \n-
    562 double dgnoAggregates = gnoAggregates.todouble();
    \n-
    563#ifdef TEST_AGGLO
    \n-
    564 BIGINT gnoAggregates=((UNKNOWNS)/2)*((UNKNOWNS)/2);
    \n-
    565#endif
    \n-
    566
    \n-
    567 if(criterion.debugLevel()>2 && rank==0)
    \n-
    568 std::cout << "Building "<<dgnoAggregates<<" aggregates took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n+
    \n+\n+
    485 {
    \n+
    486 Iterator tmp = block.begin();
    \n+
    487 tmp+=std::min(i, block.size());
    \n+
    488 return tmp;
    \n+
    489 }
    \n+
    \n+
    490
    \n+
    \n+\n+
    493 {
    \n+
    494 ConstIterator tmp = block.begin();
    \n+
    495 tmp+=std::min(i, block.size());
    \n+
    496 return tmp;
    \n+
    497 }
    \n+
    \n+
    498
    \n+
    499 //===== sizes
    \n+
    500
    \n+
    \n+
    502 size_type N () const noexcept
    \n+
    503 {
    \n+
    504 return block.size();
    \n+
    505 }
    \n+
    \n+
    506
    \n+
    \n+
    511 size_type size () const noexcept
    \n+
    512 {
    \n+
    513 return block.size();
    \n+
    514 }
    \n+
    \n+
    515
    \n+
    516
    \n+
    517 private:
    \n+
    518
    \n+
    519 void allocate ()
    \n+
    520 {
    \n+
    521 if (this->initialized)
    \n+
    522 DUNE_THROW(ISTLError, "Attempt to re-allocate already initialized VariableBlockVector");
    \n+
    523
    \n+
    524 // calculate space needed:
    \n+
    525 size_type storageNeeded = 0;
    \n+
    526 for(size_type i = 0; i < block.size(); i++)
    \n+
    527 storageNeeded += block[i].size();
    \n+
    528
    \n+
    529 storage_.resize(storageNeeded);
    \n+
    530 syncBaseArray();
    \n+
    531
    \n+
    532 // and we set the window pointers
    \n+
    533 block[0].setptr(this->p); // pointer to first block
    \n+
    534 for (size_type j=1; j<block.size(); ++j) // and the rest
    \n+
    535 block[j].setptr(block[j-1].getptr()+block[j-1].getsize());
    \n+
    536
    \n+
    537 // and the vector is ready
    \n+
    538 this->initialized = true;
    \n+
    539 }
    \n+
    540
    \n+
    541 void syncBaseArray () noexcept
    \n+
    542 {
    \n+
    543 this->p = storage_.data();
    \n+
    544 this->n = storage_.size();
    \n+
    545 }
    \n+
    546
    \n+
    547 VectorWindows block = {}; // vector of blocks pointing to the array in the base class
    \n+
    548 std::vector<B, A> storage_ = {};
    \n+
    549 bool initialized = false; // true if vector has been initialized
    \n+
    550 };
    \n+
    \n+
    551
    \n+
    555 template<class B, class A>
    \n+
    \n+
    556 struct FieldTraits< VariableBlockVector<B, A> >
    \n+
    557 {
    \n+
    558 typedef typename FieldTraits<B>::field_type field_type;
    \n+
    559 typedef typename FieldTraits<B>::real_type real_type;
    \n+
    560 };
    \n+
    \n+
    568} // end namespace
    \n
    569
    \n-
    570 if(dgnoAggregates==0 || dunknowns/dgnoAggregates<criterion.minCoarsenRate())
    \n-
    571 {
    \n-
    572 if(rank==0)
    \n-
    573 {
    \n-
    574 if(dgnoAggregates>0)
    \n-
    575 std::cerr << "Stopped coarsening because of rate breakdown "<<dunknowns<<"/"<<dgnoAggregates
    \n-
    576 <<"="<<dunknowns/dgnoAggregates<<"<"
    \n-
    577 <<criterion.minCoarsenRate()<<std::endl;
    \n-
    578 else
    \n-
    579 std::cerr<< "Could not build any aggregates. Probably no connected nodes."<<std::endl;
    \n-
    580 }
    \n-
    581 aggregatesMap->free();
    \n-
    582 delete aggregatesMap;
    \n-
    583 aggregatesMaps_.pop_back();
    \n-
    584
    \n-
    585 if(criterion.accumulate() && mlevel.isRedistributed() && info->communicator().size()>1) {
    \n-
    586 // coarse level matrix was already redistributed, but to more than 1 process
    \n-
    587 // Therefore need to delete the redistribution. Further down it will
    \n-
    588 // then be redistributed to 1 process
    \n-
    589 delete &(mlevel.getRedistributed().getmat());
    \n-
    590 mlevel.deleteRedistributed();
    \n-
    591 delete &(infoLevel.getRedistributed());
    \n-
    592 infoLevel.deleteRedistributed();
    \n-
    593 redistributes_.back().resetSetup();
    \n-
    594 }
    \n-
    595
    \n-
    596 break;
    \n-
    597 }
    \n-
    598 unknowns = noAggregates;
    \n-
    599 dunknowns = dgnoAggregates;
    \n-
    600
    \n-
    601 CommunicationArgs commargs(info->communicator(),info->category());
    \n-
    602 parallelInformation_.addCoarser(commargs);
    \n-
    603
    \n-
    604 ++infoLevel; // parallel information on coarse level
    \n-
    605
    \n-
    606 typename PropertyMapTypeSelector<VertexVisitedTag,PropertiesGraph>::Type visitedMap =
    \n-
    607 get(VertexVisitedTag(), *(std::get<1>(graphs)));
    \n-
    608
    \n-
    609 watch.reset();
    \n-\n-
    611 ::coarsen(*info,
    \n-
    612 *(std::get<1>(graphs)),
    \n-
    613 visitedMap,
    \n-
    614 *aggregatesMap,
    \n-
    615 *infoLevel,
    \n-
    616 noAggregates,
    \n-
    617 criterion.useFixedOrder());
    \n-
    618 GraphCreator::free(graphs);
    \n-
    619
    \n-
    620 if(criterion.debugLevel()>2) {
    \n-
    621 if(rank==0)
    \n-
    622 std::cout<<"Coarsening of index sets took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n-
    623 }
    \n-
    624
    \n-
    625 watch.reset();
    \n-
    626
    \n-
    627 infoLevel->buildGlobalLookup(aggregates);
    \n-\n-
    629 *info,
    \n-
    630 infoLevel->globalLookup());
    \n-
    631
    \n-
    632
    \n-
    633 if(criterion.debugLevel()>2) {
    \n-
    634 if(rank==0)
    \n-
    635 std::cout<<"Communicating global aggregate numbers took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n-
    636 }
    \n-
    637
    \n-
    638 watch.reset();
    \n-
    639 std::vector<bool>& visited=excluded;
    \n-
    640
    \n-
    641 typedef std::vector<bool>::iterator Iterator;
    \n-
    642 typedef IteratorPropertyMap<Iterator, IdentityMap> VisitedMap2;
    \n-
    643 Iterator end = visited.end();
    \n-
    644 for(Iterator iter= visited.begin(); iter != end; ++iter)
    \n-
    645 *iter=false;
    \n-
    646
    \n-
    647 VisitedMap2 visitedMap2(visited.begin(), Dune::IdentityMap());
    \n-
    648
    \n-
    649 std::shared_ptr<typename MatrixOperator::matrix_type>
    \n-
    650 coarseMatrix(productBuilder.build(*(std::get<0>(graphs)), visitedMap2,
    \n-
    651 *info,
    \n-
    652 *aggregatesMap,
    \n-
    653 aggregates,
    \n-
    654 OverlapFlags()));
    \n-
    655 dverb<<"Building of sparsity pattern took "<<watch.elapsed()<<std::endl;
    \n-
    656 watch.reset();
    \n-
    657 info->freeGlobalLookup();
    \n-
    658
    \n-
    659 delete std::get<0>(graphs);
    \n-
    660 productBuilder.calculate(matrix->getmat(), *aggregatesMap, *coarseMatrix, *infoLevel, OverlapFlags());
    \n-
    661
    \n-
    662 if(criterion.debugLevel()>2) {
    \n-
    663 if(rank==0)
    \n-
    664 std::cout<<"Calculation entries of Galerkin product took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n-
    665 }
    \n-
    666
    \n-
    667 BIGINT nonzeros = countNonZeros(*coarseMatrix);
    \n-
    668 allnonzeros = allnonzeros + infoLevel->communicator().sum(nonzeros);
    \n-
    669 MatrixArgs args(coarseMatrix, *infoLevel);
    \n-
    670
    \n-
    671 matrices_.addCoarser(args);
    \n-
    672 redistributes_.push_back(RedistributeInfoType());
    \n-
    673 } // end level loop
    \n-
    674
    \n-
    675
    \n-
    676 infoLevel->freeGlobalLookup();
    \n-
    677
    \n-
    678 built_=true;
    \n-
    679 AggregatesMap* aggregatesMap=new AggregatesMap(0);
    \n-
    680 aggregatesMaps_.push_back(aggregatesMap);
    \n-
    681
    \n-
    682 if(criterion.debugLevel()>0) {
    \n-
    683 if(level==criterion.maxLevel()) {
    \n-
    684 BIGINT unknownsLevel = mlevel->getmat().N();
    \n-
    685 unknownsLevel = infoLevel->communicator().sum(unknownsLevel);
    \n-
    686 if(rank==0 && criterion.debugLevel()>1) {
    \n-
    687 double dunknownsLevel = unknownsLevel.todouble();
    \n-
    688 std::cout<<"Level "<<level<<" has "<<dunknownsLevel<<" unknowns, "<<dunknownsLevel/infoLevel->communicator().size()
    \n-
    689 <<" unknowns per proc (procs="<<infoLevel->communicator().size()<<")"<<std::endl;
    \n-
    690 }
    \n-
    691 }
    \n-
    692 }
    \n-
    693
    \n-
    694 if(criterion.accumulate() && !redistributes_.back().isSetup() &&
    \n-
    695 infoLevel->communicator().size()>1) {
    \n-
    696#if HAVE_MPI && !HAVE_PARMETIS
    \n-
    697 if(criterion.accumulate()==successiveAccu &&
    \n-
    698 infoLevel->communicator().rank()==0)
    \n-
    699 std::cerr<<"Successive accumulation of data on coarse levels only works with ParMETIS installed."
    \n-
    700 <<" Fell back to accumulation to one domain on coarsest level"<<std::endl;
    \n-
    701#endif
    \n-
    702
    \n-
    703 // accumulate to fewer processors
    \n-
    704 std::shared_ptr<Matrix> redistMat = std::make_shared<Matrix>();
    \n-
    705 std::shared_ptr<ParallelInformation> redistComm;
    \n-
    706 int nodomains = 1;
    \n-
    707
    \n-
    708 repartitionAndDistributeMatrix(mlevel->getmat(), redistMat, *infoLevel,
    \n-
    709 redistComm, redistributes_.back(), nodomains,criterion);
    \n-
    710 MatrixArgs args(redistMat, *redistComm);
    \n-
    711 BIGINT unknownsRedist = redistMat->N();
    \n-
    712 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);
    \n-
    713
    \n-
    714 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1) {
    \n-
    715 double dunknownsRedist = unknownsRedist.todouble();
    \n-
    716 std::cout<<"Level "<<level<<" redistributed has "<<dunknownsRedist<<" unknowns, "<<dunknownsRedist/redistComm->communicator().size()
    \n-
    717 <<" unknowns per proc (procs="<<redistComm->communicator().size()<<")"<<std::endl;
    \n-
    718 }
    \n-
    719 mlevel.addRedistributed(ConstructionTraits<MatrixOperator>::construct(args));
    \n-
    720 infoLevel.addRedistributed(redistComm);
    \n-
    721 infoLevel->freeGlobalLookup();
    \n-
    722 }
    \n-
    723
    \n-
    724 int levels = matrices_.levels();
    \n-
    725 maxlevels_ = parallelInformation_.finest()->communicator().max(levels);
    \n-
    726 assert(matrices_.levels()==redistributes_.size());
    \n-
    727 if(hasCoarsest() && rank==0 && criterion.debugLevel()>1)
    \n-
    728 std::cout<<"operator complexity: "<<allnonzeros.todouble()/finenonzeros.todouble()<<std::endl;
    \n-
    729
    \n-
    730 }
    \n-
    \n-
    731
    \n-
    732 template<class M, class IS, class A>
    \n-\n-
    \n-\n-
    735 {
    \n-
    736 return matrices_;
    \n-
    737 }
    \n-
    \n-
    738
    \n-
    739 template<class M, class IS, class A>
    \n-\n-
    \n-\n-
    742 {
    \n-
    743 return parallelInformation_;
    \n-
    744 }
    \n-
    \n-
    745
    \n-
    746 template<class M, class IS, class A>
    \n-
    \n-
    747 void MatrixHierarchy<M,IS,A>::getCoarsestAggregatesOnFinest(std::vector<std::size_t>& data) const
    \n-
    748 {
    \n-
    749 int levels=aggregatesMaps().size();
    \n-
    750 int maxlevels=parallelInformation_.finest()->communicator().max(levels);
    \n-
    751 std::size_t size=(*(aggregatesMaps().begin()))->noVertices();
    \n-
    752 // We need an auxiliary vector for the consecutive prolongation.
    \n-
    753 std::vector<std::size_t> tmp;
    \n-
    754 std::vector<std::size_t> *coarse, *fine;
    \n-
    755
    \n-
    756 // make sure the allocated space suffices.
    \n-
    757 tmp.reserve(size);
    \n-
    758 data.reserve(size);
    \n-
    759
    \n-
    760 // Correctly assign coarse and fine for the first prolongation such that
    \n-
    761 // we end up in data in the end.
    \n-
    762 if(levels%2==0) {
    \n-
    763 coarse=&tmp;
    \n-
    764 fine=&data;
    \n-
    765 }else{
    \n-
    766 coarse=&data;
    \n-
    767 fine=&tmp;
    \n-
    768 }
    \n-
    769
    \n-
    770 // Number the unknowns on the coarsest level consecutively for each process.
    \n-
    771 if(levels==maxlevels) {
    \n-
    772 const AggregatesMap& map = *(*(++aggregatesMaps().rbegin()));
    \n-
    773 std::size_t m=0;
    \n-
    774
    \n-
    775 for(typename AggregatesMap::const_iterator iter = map.begin(); iter != map.end(); ++iter)
    \n-
    776 if(*iter< AggregatesMap::ISOLATED)
    \n-
    777 m=std::max(*iter,m);
    \n-
    778
    \n-
    779 coarse->resize(m+1);
    \n-
    780 std::size_t i=0;
    \n-
    781 srand((unsigned)std::clock());
    \n-
    782 std::set<size_t> used;
    \n-
    783 for(typename std::vector<std::size_t>::iterator iter=coarse->begin(); iter != coarse->end();
    \n-
    784 ++iter, ++i)
    \n-
    785 {
    \n-
    786 std::pair<std::set<std::size_t>::iterator,bool> ibpair
    \n-
    787 = used.insert(static_cast<std::size_t>((((double)rand())/(RAND_MAX+1.0)))*coarse->size());
    \n-
    788
    \n-
    789 while(!ibpair.second)
    \n-
    790 ibpair = used.insert(static_cast<std::size_t>((((double)rand())/(RAND_MAX+1.0))*coarse->size()));
    \n-
    791 *iter=*(ibpair.first);
    \n-
    792 }
    \n-
    793 }
    \n-
    794
    \n-
    795 typename ParallelInformationHierarchy::Iterator pinfo = parallelInformation().coarsest();
    \n-
    796 --pinfo;
    \n-
    797
    \n-
    798 // Now consecutively project the numbers to the finest level.
    \n-
    799 for(typename AggregatesMapList::const_reverse_iterator aggregates=++aggregatesMaps().rbegin();
    \n-
    800 aggregates != aggregatesMaps().rend(); ++aggregates,--levels) {
    \n-
    801
    \n-
    802 fine->resize((*aggregates)->noVertices());
    \n-
    803 fine->assign(fine->size(), 0);
    \n-\n-
    805 ::prolongateVector(*(*aggregates), *coarse, *fine, static_cast<std::size_t>(1), *pinfo);
    \n-
    806 --pinfo;
    \n-
    807 std::swap(coarse, fine);
    \n-
    808 }
    \n-
    809
    \n-
    810 // Assertion to check that we really projected to data on the last step.
    \n-
    811 assert(coarse==&data);
    \n-
    812 }
    \n-
    \n-
    813
    \n-
    814 template<class M, class IS, class A>
    \n-\n-
    \n-\n-
    817 {
    \n-
    818 return aggregatesMaps_;
    \n-
    819 }
    \n-
    \n-
    820 template<class M, class IS, class A>
    \n-\n-
    \n-\n-
    823 {
    \n-
    824 return redistributes_;
    \n-
    825 }
    \n-
    \n-
    826
    \n-
    827 template<class M, class IS, class A>
    \n-
    \n-\n-
    829 {
    \n-
    830 typedef typename AggregatesMapList::reverse_iterator AggregatesMapIterator;
    \n-
    831 typedef typename ParallelMatrixHierarchy::Iterator Iterator;
    \n-
    832 typedef typename ParallelInformationHierarchy::Iterator InfoIterator;
    \n-
    833
    \n-
    834 AggregatesMapIterator amap = aggregatesMaps_.rbegin();
    \n-
    835 InfoIterator info = parallelInformation_.coarsest();
    \n-
    836 for(Iterator level=matrices_.coarsest(), finest=matrices_.finest(); level != finest; --level, --info, ++amap) {
    \n-
    837 (*amap)->free();
    \n-
    838 delete *amap;
    \n-
    839 }
    \n-
    840 delete *amap;
    \n-
    841 }
    \n-
    \n-
    842
    \n-
    843 template<class M, class IS, class A>
    \n-
    844 template<class V, class BA, class TA>
    \n-
    \n-\n-
    846 {
    \n-
    847 assert(hierarchy.levels()==1);
    \n-
    848 typedef typename ParallelMatrixHierarchy::ConstIterator Iterator;
    \n-
    849 typedef typename RedistributeInfoList::const_iterator RIter;
    \n-
    850 RIter redist = redistributes_.begin();
    \n-
    851
    \n-
    852 Iterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();
    \n-
    853 int level=0;
    \n-
    854 if(redist->isSetup())
    \n-
    855 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N());
    \n-
    856 Dune::dvverb<<"Level "<<level<<" has "<<matrices_.finest()->getmat().N()<<" unknowns!"<<std::endl;
    \n-
    857
    \n-
    858 while(matrix != coarsest) {
    \n-
    859 ++matrix; ++level; ++redist;
    \n-
    860 Dune::dvverb<<"Level "<<level<<" has "<<matrix->getmat().N()<<" unknowns!"<<std::endl;
    \n-
    861
    \n-
    862 hierarchy.addCoarser(matrix->getmat().N());
    \n-
    863 if(redist->isSetup())
    \n-
    864 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N());
    \n-
    865
    \n-
    866 }
    \n-
    867
    \n-
    868 }
    \n-
    \n-
    869
    \n-
    870 template<class M, class IS, class A>
    \n-
    871 template<class S, class TA>
    \n-
    \n-\n-
    873 const typename SmootherTraits<S>::Arguments& sargs) const
    \n-
    874 {
    \n-
    875 assert(smoothers.levels()==0);
    \n-
    876 typedef typename ParallelMatrixHierarchy::ConstIterator MatrixIterator;
    \n-
    877 typedef typename ParallelInformationHierarchy::ConstIterator PinfoIterator;
    \n-
    878 typedef typename AggregatesMapList::const_iterator AggregatesIterator;
    \n-
    879
    \n-\n-
    881 cargs.setArgs(sargs);
    \n-
    882 PinfoIterator pinfo = parallelInformation_.finest();
    \n-
    883 AggregatesIterator aggregates = aggregatesMaps_.begin();
    \n-
    884 int level=0;
    \n-
    885 for(MatrixIterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();
    \n-
    886 matrix != coarsest; ++matrix, ++pinfo, ++aggregates, ++level) {
    \n-
    887 cargs.setMatrix(matrix->getmat(), **aggregates);
    \n-
    888 cargs.setComm(*pinfo);
    \n-
    889 smoothers.addCoarser(cargs);
    \n-
    890 }
    \n-
    891 if(maxlevels()>levels()) {
    \n-
    892 // This is not the globally coarsest level and therefore smoothing is needed
    \n-
    893 cargs.setMatrix(matrices_.coarsest()->getmat(), **aggregates);
    \n-
    894 cargs.setComm(*pinfo);
    \n-
    895 smoothers.addCoarser(cargs);
    \n-
    896 ++level;
    \n-
    897 }
    \n-
    898 }
    \n-
    \n-
    899
    \n-
    900 template<class M, class IS, class A>
    \n-
    901 template<class F>
    \n-
    \n-\n-
    903 {
    \n-
    904 typedef typename AggregatesMapList::iterator AggregatesMapIterator;
    \n-
    905 typedef typename ParallelMatrixHierarchy::Iterator Iterator;
    \n-
    906 typedef typename ParallelInformationHierarchy::Iterator InfoIterator;
    \n-
    907
    \n-
    908 AggregatesMapIterator amap = aggregatesMaps_.begin();
    \n-
    909 BaseGalerkinProduct productBuilder;
    \n-
    910 InfoIterator info = parallelInformation_.finest();
    \n-
    911 typename RedistributeInfoList::iterator riIter = redistributes_.begin();
    \n-
    912 Iterator level = matrices_.finest(), coarsest=matrices_.coarsest();
    \n-
    913 if(level.isRedistributed()) {
    \n-
    914 info->buildGlobalLookup(level->getmat().N());
    \n-
    915 redistributeMatrixEntries(const_cast<Matrix&>(level->getmat()),
    \n-
    916 const_cast<Matrix&>(level.getRedistributed().getmat()),
    \n-
    917 *info,info.getRedistributed(), *riIter);
    \n-
    918 info->freeGlobalLookup();
    \n-
    919 }
    \n-
    920
    \n-
    921 for(; level!=coarsest; ++amap) {
    \n-
    922 const Matrix& fine = (level.isRedistributed() ? level.getRedistributed() : *level).getmat();
    \n-
    923 ++level;
    \n-
    924 ++info;
    \n-
    925 ++riIter;
    \n-
    926 productBuilder.calculate(fine, *(*amap), const_cast<Matrix&>(level->getmat()), *info, copyFlags);
    \n-
    927 if(level.isRedistributed()) {
    \n-
    928 info->buildGlobalLookup(level->getmat().N());
    \n-
    929 redistributeMatrixEntries(const_cast<Matrix&>(level->getmat()),
    \n-
    930 const_cast<Matrix&>(level.getRedistributed().getmat()), *info,
    \n-
    931 info.getRedistributed(), *riIter);
    \n-
    932 info->freeGlobalLookup();
    \n-
    933 }
    \n-
    934 }
    \n-
    935 }
    \n-
    \n-
    936
    \n-
    937 template<class M, class IS, class A>
    \n-
    \n-\n-
    939 {
    \n-
    940 return matrices_.levels();
    \n-
    941 }
    \n-
    \n-
    942
    \n-
    943 template<class M, class IS, class A>
    \n-
    \n-\n-
    945 {
    \n-
    946 return maxlevels_;
    \n-
    947 }
    \n-
    \n-
    948
    \n-
    949 template<class M, class IS, class A>
    \n-
    \n-\n-
    951 {
    \n-
    952 return levels()==maxlevels() &&
    \n-
    953 (!matrices_.coarsest().isRedistributed() ||matrices_.coarsest()->getmat().N()>0);
    \n-
    954 }
    \n-
    \n-
    955
    \n-
    956 template<class M, class IS, class A>
    \n-
    \n-\n-
    958 {
    \n-
    959 return built_;
    \n-
    960 }
    \n-
    \n-
    961
    \n-
    963 } // namespace Amg
    \n-
    964} // namespace Dune
    \n-
    965
    \n-
    966#endif // end DUNE_AMG_MATRIXHIERARCHY_HH
    \n-
    Some handy generic functions for ISTL matrices.
    \n-\n-
    Helper classes for the construction of classes without empty constructor.
    \n-
    Provides a class for building the index set and remote indices on the coarse level.
    \n-
    Prolongation and restriction for amg.
    \n-
    Classes for the generic construction and application of the smoothers.
    \n-
    Provides classes for the Coloring process of AMG.
    \n-
    Provides classes for building the matrix graph.
    \n-
    Provides a class for building the galerkin product based on a aggregation scheme.
    \n-
    Provides a classes representing the hierarchies in AMG.
    \n-\n-
    Provdes class for identifying aggregates globally.
    \n-
    Provides classes for initializing the link attributes of a matrix graph.
    \n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n-
    Functionality for redistributing a sparse matrix.
    \n-
    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
    \n-
    const AggregatesMapList & aggregatesMaps() const
    Get the hierarchy of the mappings of the nodes onto aggregates.
    Definition matrixhierarchy.hh:816
    \n-
    bool isBuilt() const
    Whether the hierarchy was built.
    Definition matrixhierarchy.hh:957
    \n-
    bool hasCoarsest() const
    Definition matrixhierarchy.hh:950
    \n-
    std::size_t levels() const
    Get the number of levels in the hierarchy.
    Definition hierarchy.hh:322
    \n-
    std::size_t levels() const
    Get the number of levels in the hierarchy.
    Definition matrixhierarchy.hh:938
    \n-
    void addCoarser(Arguments &args)
    Add an element on a coarser level.
    Definition hierarchy.hh:334
    \n-
    const RedistributeInfoList & redistributeInformation() const
    Get the hierarchy of the information about redistributions,.
    Definition matrixhierarchy.hh:822
    \n-
    const ParallelInformationHierarchy & parallelInformation() const
    Get the hierarchy of the parallel data distribution information.
    Definition matrixhierarchy.hh:741
    \n-
    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:316
    \n-
    const_iterator begin() const
    Definition aggregates.hh:725
    \n-
    const ParallelMatrixHierarchy & matrices() const
    Get the matrix hierarchy.
    Definition matrixhierarchy.hh:734
    \n-
    std::size_t maxlevels() const
    Get the max number of levels in the hierarchy of processors.
    Definition matrixhierarchy.hh:944
    \n-
    const_iterator end() const
    Definition aggregates.hh:730
    \n-
    static const V ISOLATED
    Identifier of isolated vertices.
    Definition aggregates.hh:571
    \n-
    void recalculateGalerkin(const F &copyFlags)
    Recalculate the galerkin products.
    Definition matrixhierarchy.hh:902
    \n-
    const void * Arguments
    A type holding all the arguments needed to call the constructor.
    Definition construction.hh:44
    \n-
    std::size_t noVertices() const
    Get the number of vertices.
    \n-
    static std::shared_ptr< T > construct(Arguments &args)
    Construct an object with the specified arguments.
    Definition construction.hh:52
    \n-
    void coarsenVector(Hierarchy< BlockVector< V, BA >, TA > &hierarchy) const
    Coarsen the vector hierarchy according to the matrix hierarchy.
    Definition matrixhierarchy.hh:845
    \n-
    const AggregateDescriptor * const_iterator
    Definition aggregates.hh:723
    \n-
    MatrixHierarchy(std::shared_ptr< MatrixOperator > fineMatrix, std::shared_ptr< ParallelInformation > pinfo=std::make_shared< ParallelInformation >())
    Constructor.
    Definition matrixhierarchy.hh:392
    \n-
    AccumulationMode
    Identifiers for the different accumulation modes.
    Definition parameters.hh:231
    \n-
    Iterator finest()
    Get an iterator positioned at the finest level.
    Definition hierarchy.hh:377
    \n-
    void build(const T &criterion)
    Build the matrix hierarchy using aggregation.
    Definition matrixhierarchy.hh:403
    \n-
    void free()
    Free the allocated memory.
    \n-
    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:872
    \n-
    void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, bool finestLevel)
    Build the dependency of the matrix graph.
    \n-
    std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, const C &criterion, bool finestLevel)
    Build the aggregates.
    \n-
    void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
    Calculate the galerkin product.
    \n-
    void getCoarsestAggregatesOnFinest(std::vector< std::size_t > &data) const
    Get the mapping of fine level unknowns to coarse level aggregates.
    Definition matrixhierarchy.hh:747
    \n-
    ~MatrixHierarchy()
    Definition matrixhierarchy.hh:828
    \n-
    @ MAX_PROCESSES
    Hard limit for the number of processes allowed.
    Definition matrixhierarchy.hh:50
    \n-
    @ atOnceAccu
    Accumulate data to one process at once.
    Definition parameters.hh:243
    \n-
    @ successiveAccu
    Successively accumulate to fewer processes.
    Definition parameters.hh:247
    \n+
    570#endif
    \n+\n+
    Helper functions for determining the vector/matrix block level.
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n
    Definition allocator.hh:11
    \n-
    void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)
    Definition matrixutils.hh:154
    \n-
    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
    \n-
    void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
    Definition matrixredistribute.hh:757
    \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)
    Definition repartition.hh:822
    \n-
    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
    \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.
    Definition repartition.hh:1228
    \n
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n-
    A::size_type size_type
    Type for indices and sizes.
    Definition matrix.hh:577
    \n-
    MatrixImp::DenseMatrixBase< T, A >::window_type row_type
    The type implementing a matrix row.
    Definition matrix.hh:574
    \n-
    Definition matrixredistribute.hh:22
    \n-
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n-
    Class representing the properties of an edge in the matrix graph.
    Definition dependency.hh:39
    \n-
    Class representing a node in the matrix graph.
    Definition dependency.hh:126
    \n-
    Definition galerkin.hh:99
    \n-
    Definition galerkin.hh:118
    \n-
    Definition globalaggregates.hh:131
    \n-
    The (undirected) graph of a matrix.
    Definition graph.hh:51
    \n-
    Attaches properties to the edges and vertices of a graph.
    Definition graph.hh:978
    \n-
    Graph::VertexDescriptor VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:988
    \n-
    Definition graphcreator.hh:22
    \n-
    A hierarchy of containers (e.g. matrices or vectors)
    Definition hierarchy.hh:40
    \n-
    LevelIterator< Hierarchy< MatrixOperator, Allocator >, MatrixOperator > Iterator
    Type of the mutable iterator.
    Definition hierarchy.hh:216
    \n-
    LevelIterator< const Hierarchy< MatrixOperator, Allocator >, const MatrixOperator > ConstIterator
    Type of the const iterator.
    Definition hierarchy.hh:219
    \n-
    Definition indicescoarsener.hh:36
    \n-
    The hierarchies build by the coarsening process.
    Definition matrixhierarchy.hh:61
    \n-
    typename std::allocator_traits< Allocator >::template rebind_alloc< AggregatesMap * > AAllocator
    Allocator for pointers.
    Definition matrixhierarchy.hh:85
    \n-
    Dune::Amg::Hierarchy< ParallelInformation, Allocator > ParallelInformationHierarchy
    The type of the parallel informarion hierarchy.
    Definition matrixhierarchy.hh:82
    \n-
    std::list< AggregatesMap *, AAllocator > AggregatesMapList
    The type of the aggregates maps list.
    Definition matrixhierarchy.hh:88
    \n-
    PI ParallelInformation
    The type of the index set.
    Definition matrixhierarchy.hh:70
    \n-
    Dune::Amg::Hierarchy< MatrixOperator, Allocator > ParallelMatrixHierarchy
    The type of the parallel matrix hierarchy.
    Definition matrixhierarchy.hh:79
    \n-
    A Allocator
    The allocator to use.
    Definition matrixhierarchy.hh:73
    \n-
    RedistributeInformation< ParallelInformation > RedistributeInfoType
    The type of the redistribute information.
    Definition matrixhierarchy.hh:91
    \n-
    double getProlongationDampingFactor() const
    Definition matrixhierarchy.hh:188
    \n-
    typename std::allocator_traits< Allocator >::template rebind_alloc< RedistributeInfoType > RILAllocator
    Allocator for RedistributeInfoType.
    Definition matrixhierarchy.hh:94
    \n-
    std::list< RedistributeInfoType, RILAllocator > RedistributeInfoList
    The type of the list of redistribute information.
    Definition matrixhierarchy.hh:97
    \n-
    Dune::Amg::AggregatesMap< typename MatrixGraph< Matrix >::VertexDescriptor > AggregatesMap
    The type of the aggregates map we use.
    Definition matrixhierarchy.hh:76
    \n-
    MatrixOperator::matrix_type Matrix
    The type of the matrix.
    Definition matrixhierarchy.hh:67
    \n-
    M MatrixOperator
    The type of the matrix operator.
    Definition matrixhierarchy.hh:64
    \n-
    void operator()(const matrix_row &row)
    Definition matrixhierarchy.hh:254
    \n-
    Matrix::row_type matrix_row
    Definition matrixhierarchy.hh:245
    \n-
    size_type min
    Definition matrixhierarchy.hh:261
    \n-\n-
    size_type max
    Definition matrixhierarchy.hh:262
    \n-
    size_type sum
    Definition matrixhierarchy.hh:263
    \n-
    Matrix::size_type size_type
    Definition matrixhierarchy.hh:244
    \n-
    The criterion describing the stop criteria for the coarsening process.
    Definition matrixhierarchy.hh:283
    \n-
    CoarsenCriterion(const Dune::Amg::Parameters &parms)
    Definition matrixhierarchy.hh:309
    \n-
    T AggregationCriterion
    The criterion for tagging connections as strong and nodes as isolated. This might be e....
    Definition matrixhierarchy.hh:289
    \n-
    CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu, bool useFixedOrder=false)
    Constructor.
    Definition matrixhierarchy.hh:304
    \n-
    All parameters for AMG.
    Definition parameters.hh:416
    \n-
    Definition pinfo.hh:28
    \n-
    Tag idnetifying the visited property of a vertex.
    Definition properties.hh:29
    \n-
    The default class for the smoother arguments.
    Definition smoother.hh:38
    \n-
    Definition transfer.hh:32
    \n-
    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
    \n+
    A Vector of blocks with different blocksizes.
    Definition vbvector.hh:48
    \n+
    VariableBlockVector(size_type numBlocks, size_type blockSize)
    Construct a vector with given number of blocks each having a constant size.
    Definition vbvector.hh:125
    \n+
    VariableBlockVector()
    Constructor without arguments makes an empty vector.
    Definition vbvector.hh:102
    \n+
    friend void swap(VariableBlockVector &lhs, VariableBlockVector &rhs) noexcept
    Free function to swap the storage and internal state of lhs with rhs.
    Definition vbvector.hh:190
    \n+
    Iterator iterator
    Export the iterator type using std naming rules.
    Definition vbvector.hh:443
    \n+
    VariableBlockVector & operator=(VariableBlockVector tmp)
    Copy and move assignment.
    Definition vbvector.hh:171
    \n+
    VariableBlockVector(size_type numBlocks)
    Construct a vector with given number of blocks, but size of each block is not yet known.
    Definition vbvector.hh:112
    \n+
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition vbvector.hh:65
    \n+
    typename A::size_type size_type
    The size type for the index access.
    Definition vbvector.hh:83
    \n+
    size_type N() const noexcept
    number of blocks in the vector (are of variable size here)
    Definition vbvector.hh:502
    \n+
    VariableBlockVector(const VariableBlockVector &a)
    Copy constructor, has copy semantics.
    Definition vbvector.hh:142
    \n+
    window_type & operator[](size_type i)
    random access to blocks
    Definition vbvector.hh:397
    \n+
    A allocator_type
    export the allocator type
    Definition vbvector.hh:68
    \n+
    CreateIterator createend()
    get create iterator pointing to one after the last block
    Definition vbvector.hh:386
    \n+
    VariableBlockVector(VariableBlockVector &&tmp)
    Move constructor:
    Definition vbvector.hh:161
    \n+
    CreateIterator createbegin()
    get initial create iterator
    Definition vbvector.hh:377
    \n+
    ConstIterator const_iterator
    Export the const iterator type using std naming rules.
    Definition vbvector.hh:449
    \n+
    window_type & reference
    Export type used for references to container entries.
    Definition vbvector.hh:74
    \n+
    ConstIterator rend() const
    end ConstIterator
    Definition vbvector.hh:478
    \n+
    const window_type & const_reference
    Export type used for const references to container entries.
    Definition vbvector.hh:80
    \n+
    ConstIterator find(size_type i) const
    random access returning iterator (end if not contained)
    Definition vbvector.hh:492
    \n+
    ConstIterator beforeEnd() const
    Definition vbvector.hh:465
    \n+
    Iterator find(size_type i)
    random access returning iterator (end if not contained)
    Definition vbvector.hh:484
    \n+
    IndexedIterator< typename VectorWindows::const_iterator > ConstIterator
    Const iterator.
    Definition vbvector.hh:446
    \n+\n+
    ConstIterator beforeBegin() const
    Definition vbvector.hh:472
    \n+
    void resize(size_type numBlocks)
    same effect as constructor with same argument
    Definition vbvector.hh:196
    \n+
    Iterator end()
    end Iterator
    Definition vbvector.hh:423
    \n+
    void swap(VariableBlockVector &other) noexcept
    Exchange the storage and internal state with other.
    Definition vbvector.hh:178
    \n+
    ConstIterator begin() const
    begin ConstIterator
    Definition vbvector.hh:452
    \n+
    size_type size() const noexcept
    Definition vbvector.hh:511
    \n+
    void resize(size_type numBlocks, size_type blockSize)
    same effect as constructor with same argument
    Definition vbvector.hh:210
    \n+
    IndexedIterator< typename VectorWindows::iterator > Iterator
    Definition vbvector.hh:414
    \n+
    ConstIterator end() const
    end ConstIterator
    Definition vbvector.hh:458
    \n+
    Iterator beforeBegin()
    Definition vbvector.hh:437
    \n+
    Iterator beforeEnd()
    Definition vbvector.hh:430
    \n+
    Iterator begin()
    begin Iterator
    Definition vbvector.hh:417
    \n+
    Iterator class for sequential creation of blocks.
    Definition vbvector.hh:275
    \n+
    bool operator==(const CreateIterator &it) const
    equality
    Definition vbvector.hh:339
    \n+
    size_type index() const
    dereferencing
    Definition vbvector.hh:345
    \n+
    SizeProxy reference
    reference type
    Definition vbvector.hh:295
    \n+
    size_type * pointer
    pointer type
    Definition vbvector.hh:292
    \n+
    bool operator!=(const CreateIterator &it) const
    inequality
    Definition vbvector.hh:333
    \n+
    ~CreateIterator()
    Definition vbvector.hh:304
    \n+
    size_type value_type
    value type
    Definition vbvector.hh:281
    \n+
    CreateIterator(VariableBlockVector &_v, int _i, bool _isEnd)
    constructor
    Definition vbvector.hh:298
    \n+
    void setblocksize(size_type _k)
    set size of current block
    Definition vbvector.hh:351
    \n+
    size_type & operator*()
    Access size of current block.
    Definition vbvector.hh:362
    \n+
    std::output_iterator_tag iterator_category
    iterator category
    Definition vbvector.hh:278
    \n+
    CreateIterator & operator++()
    prefix increment
    Definition vbvector.hh:316
    \n+
    void difference_type
    difference type (unused)
    Definition vbvector.hh:289
    \n+
    FieldTraits< B >::real_type real_type
    Definition vbvector.hh:559
    \n+
    FieldTraits< B >::field_type field_type
    Definition vbvector.hh:558
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1290 +1,685 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-matrixhierarchy.hh\n+vbvector.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_MATRIXHIERARCHY_HH\n-6#define DUNE_AMG_MATRIXHIERARCHY_HH\n+5#ifndef DUNE_ISTL_VBVECTOR_HH\n+6#define DUNE_ISTL_VBVECTOR_HH\n 7\n-8#include \n-9#include \n-10#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n-11#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n-12#include \"_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\"\n-13#include \"_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\"\n-14#include \"_\bg_\br_\ba_\bp_\bh_\bc_\br_\be_\ba_\bt_\bo_\br_\b._\bh_\bh\"\n-15#include \"_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh\"\n-16#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-17#include \n-18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh>\n-21#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh>\n-22#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\bc_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b._\bh_\bh>\n-23#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bg_\bl_\bo_\bb_\ba_\bl_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n-24#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-25#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n-26#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13\n+14#include \n+15#include \n+16#include \n+17#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+18#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+19\n+20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+21\n+26namespace _\bD_\bu_\bn_\be {\n 27\n-28namespace _\bD_\bu_\bn_\be\n-29{\n-30 namespace Amg\n-31 {\n-42 enum {\n-50 _\bM_\bA_\bX_\b__\bP_\bR_\bO_\bC_\bE_\bS_\bS_\bE_\bS = 72000\n-_\b5_\b1 };\n-52\n-59 template >\n-_\b6_\b0 class _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-61 {\n-62 public:\n-_\b6_\b4 typedef M _\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n-65\n-_\b6_\b7 typedef typename MatrixOperator::matrix_type _\bM_\ba_\bt_\br_\bi_\bx;\n-68\n-_\b7_\b0 typedef PI _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n-71\n-_\b7_\b3 typedef A _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n-74\n-_\b7_\b6 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br> _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp;\n-77\n-_\b7_\b9 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n-80\n-_\b8_\b2 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n-83\n-_\b8_\b5 using _\bA_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br = typename std::allocator_traits::template\n-rebind_alloc;\n-86\n-_\b8_\b8 typedef std::list _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bL_\bi_\bs_\bt;\n-89\n-_\b9_\b1 typedef _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b> _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be;\n-92\n-_\b9_\b4 using _\bR_\bI_\bL_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br = typename std::allocator_traits::template\n-rebind_alloc;\n+43 template >\n+_\b4_\b4 class _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br : public Imp::block_vector_unmanaged\n+45 // this derivation gives us all the blas level 1 and norms\n+46 // on the large array. However, access operators have to be\n+47 // overwritten.\n+48 {\n+49 using Base = Imp::block_vector_unmanaged;\n+50\n+51 // just a shorthand\n+52 using window_type = Imp::BlockVectorWindow;\n+53\n+54 // data-structure holding the windows (but not the actual data)\n+55 using VectorWindows = std::vector::template rebind_alloc>;\n+56\n+57 // block type bool is not supported since std::vector is used for\n+storage\n+58 static_assert(not std::is_same_v, \"Block type 'bool' not supported\n+by VariableBlockVector.\");\n+59\n+60 public:\n+61\n+62 //===== type definitions and constants\n+63\n+_\b6_\b5 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n+66\n+_\b6_\b8 using _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be = A;\n+69\n+_\b7_\b4 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = window_type&;\n+75\n+_\b8_\b0 using _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = const window_type&;\n+81\n+_\b8_\b3 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = typename A::size_type;\n+84\n+_\b9_\b0 using _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be = _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bB_\b,_\bA_\b>;\n+91\n+_\b9_\b4 using _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be = _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bB_\b,_\bA_\b>;\n 95\n-_\b9_\b7 typedef std::list _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bL_\bi_\bs_\bt;\n-98\n-104 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(std::shared_ptr fineMatrix,\n-105 std::shared_ptr pinfo = std::\n-make_shared());\n-106\n-107 _\b~_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by();\n-108\n-114 template\n-115 void _\bb_\bu_\bi_\bl_\bd(const T& criterion);\n+96 //===== constructors and such\n+97\n+_\b1_\b0_\b2 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br () :\n+103 Base()\n+104 {}\n+105\n+_\b1_\b1_\b2 explicit _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be numBlocks) :\n+113 Base(),\n+114 block(numBlocks)\n+115 {}\n 116\n-124 template\n-125 void _\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn(const F& copyFlags);\n-126\n-131 template\n-132 void _\bc_\bo_\ba_\br_\bs_\be_\bn_\bV_\be_\bc_\bt_\bo_\br(_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bV_\b,_\bB_\bA_\b>, TA>& hierarchy) const;\n-133\n-139 template\n-140 void _\bc_\bo_\ba_\br_\bs_\be_\bn_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br(_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bS_\b,_\bT_\bA_\b>& smoothers,\n-141 const typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args) const;\n-142\n-147 std::size_t _\bl_\be_\bv_\be_\bl_\bs() const;\n+_\b1_\b2_\b5 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be numBlocks, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be blockSize) :\n+126 Base(),\n+127 block(numBlocks),\n+128 storage_(numBlocks*blockSize)\n+129 {\n+130 // and we can allocate the big array in the base class\n+131 syncBaseArray();\n+132\n+133 // set the windows into the big array\n+134 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; ip+(i*blockSize));\n+136\n+137 // and the vector is usable\n+138 initialized = true;\n+139 }\n+140\n+_\b1_\b4_\b2 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (const _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& a) :\n+143 Base(static_cast(a)),\n+144 block(a.block),\n+145 storage_(a.storage_)\n+146 {\n+147 syncBaseArray();\n 148\n-153 std::size_t _\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs() const;\n-154\n-155 bool _\bh_\ba_\bs_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt() const;\n-156\n-161 bool _\bi_\bs_\bB_\bu_\bi_\bl_\bt() const;\n-162\n-167 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& _\bm_\ba_\bt_\br_\bi_\bc_\be_\bs() const;\n+149 // and we must set the windows\n+150 if (block.size()>0) {\n+151 block[0].set(block[0].getsize(),this->p); // first block\n+152 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=1; i& data) const;\n+169\n+_\b1_\b7_\b1 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br tmp)\n+172 {\n+173 tmp._\bs_\bw_\ba_\bp(*this);\n+174 return *this;\n+175 }\n+176\n+_\b1_\b7_\b8 void _\bs_\bw_\ba_\bp (_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& other) noexcept\n+179 {\n+180 using std::swap;\n+181 _\bs_\bw_\ba_\bp(storage_, other.storage_);\n+182 _\bs_\bw_\ba_\bp(block, other.block);\n+183 _\bs_\bw_\ba_\bp(initialized, other.initialized);\n+184\n+185 other.syncBaseArray();\n+186 syncBaseArray();\n+187 }\n+188\n+_\b1_\b9_\b0 friend void _\bs_\bw_\ba_\bp (_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& lhs, _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& rhs)\n+noexcept\n+191 {\n+192 lhs.swap(rhs);\n+193 }\n+194\n+_\b1_\b9_\b6 void _\br_\be_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be numBlocks)\n+197 {\n+198 storage_.clear();\n+199\n+200 syncBaseArray();\n+201\n+202 // we can allocate the windows now\n+203 block.resize(numBlocks);\n 204\n-205 private:\n-206 typedef typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs MatrixArgs;\n-207 typedef typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-CommunicationArgs;\n-209 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bL_\bi_\bs_\bt aggregatesMaps_;\n-211 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bL_\bi_\bs_\bt redistributes_;\n-213 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by matrices_;\n-215 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by parallelInformation_;\n+205 // and the vector not fully usable\n+206 initialized = false;\n+207 }\n+208\n+_\b2_\b1_\b0 void _\br_\be_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be numBlocks, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be blockSize)\n+211 {\n+212 // and we can allocate the big array in the base class\n+213 storage_.resize(numBlocks*blockSize);\n+214 block.resize(numBlocks);\n+215 syncBaseArray();\n 216\n-218 bool built_;\n-219\n-221 int maxlevels_;\n-222\n-223 double prolongDamp_;\n+217 // set the windows into the big array\n+218 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; ip+(i*blockSize));\n+220\n+221 // and the vector is usable\n+222 initialized = true;\n+223 }\n 224\n-228 template\n-229 struct MatrixStats\n-230 {\n-231\n-235 static void stats([[maybe_unused]] const _\bM_\ba_\bt_\br_\bi_\bx& matrix)\n-236 {}\n-237 };\n+225 //===== assignment from scalar\n+226\n+_\b2_\b2_\b8 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n+229 {\n+230 (static_cast&>(*this)) = k;\n+231 return *this;\n+232 }\n+233\n+234\n+235 //===== the creation interface\n+236\n+237 class CreateIterator;\n 238\n-239 template\n-240 struct MatrixStats<_\bM_\ba_\bt_\br_\bi_\bx,true>\n-241 {\n-_\b2_\b4_\b2 struct calc\n-243 {\n-_\b2_\b4_\b4 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-_\b2_\b4_\b5 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bm_\ba_\bt_\br_\bi_\bx_\b__\br_\bo_\bw;\n-246\n-_\b2_\b4_\b7 _\bc_\ba_\bl_\bc()\n-248 {\n-249 min=std::numeric_limits::max();\n-250 max=0;\n-251 sum=0;\n+239#ifndef DOXYGEN\n+240\n+241 // The window_type does not hand out a reference to its size,\n+242 // so in order to provide a valid iterator, we need a workaround\n+243 // to make assignment possible. This proxy enables just that by\n+244 // implicitly converting to the stored size for read access and\n+245 // tunneling assignment to the accessor method of the window.\n+246 struct SizeProxy\n+247 {\n+248\n+249 operator size_type () const\n+250 {\n+251 return target->getsize();\n 252 }\n 253\n-_\b2_\b5_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bm_\ba_\bt_\br_\bi_\bx_\b__\br_\bo_\bw& row)\n+254 SizeProxy& operator= (size_type size)\n 255 {\n-256 min=std::min(min, row.size());\n-257 max=std::max(max, row.size());\n-258 sum += row.size();\n-259 }\n-260\n-_\b2_\b6_\b1 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm_\bi_\bn;\n-_\b2_\b6_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm_\ba_\bx;\n-_\b2_\b6_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bu_\bm;\n-264 };\n-268 static void stats(const _\bM_\ba_\bt_\br_\bi_\bx& matrix)\n-269 {\n-270 calc c= for_each(matrix.begin(), matrix.end(), calc());\n-271 dinfo<<\"Matrix row: min=\"<(c.sum)/matrix.N()\n-273 <\n-_\b2_\b8_\b2 class _\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn : public T\n-283 {\n-284 public:\n-_\b2_\b8_\b9 typedef T _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn;\n+256 target->setsize(size);\n+257 return *this;\n+258 }\n+259\n+260 private:\n+261\n+262 friend class CreateIterator;\n+263\n+264 SizeProxy (window_type& t) :\n+265 target(&t)\n+266 {}\n+267\n+268 window_type* target;\n+269 };\n+270\n+271#endif // DOXYGEN\n+272\n+_\b2_\b7_\b4 class _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+275 {\n+276 public:\n+_\b2_\b7_\b8 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by = std::output_iterator_tag;\n+279\n+_\b2_\b8_\b1 using _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be = _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+282\n+_\b2_\b8_\b9 using _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be = void;\n 290\n-_\b3_\b0_\b4 _\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(int maxLevel=100, int coarsenTarget=1000, double\n-minCoarsenRate=1.2,\n-305 double prolongDamp=1.6, _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be accumulate=_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu, bool\n-useFixedOrder = false)\n-306 : _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(_\bD_\bu_\bn_\be::Amg::_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(maxLevel, coarsenTarget,\n-minCoarsenRate, prolongDamp, accumulate, useFixedOrder))\n-307 {}\n-308\n-_\b3_\b0_\b9 _\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(const _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n-310 : _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(parms)\n-311 {}\n-312\n-313 };\n+_\b2_\b9_\b2 using _\bp_\bo_\bi_\bn_\bt_\be_\br = _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be*;\n+293\n+_\b2_\b9_\b5 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = SizeProxy;\n+296\n+_\b2_\b9_\b8 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br (_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& _v, int _i, bool _isEnd) :\n+299 v(_v),\n+300 i(_i),\n+301 isEnd(_isEnd)\n+302 {}\n+303\n+_\b3_\b0_\b4 _\b~_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ()\n+305 {\n+306 // When the iterator gets destructed, we allocate the memory\n+307 // for the VariableBlockVector if\n+308 // 1. the current iterator was not created as enditerator\n+309 // 2. we're at the last block\n+310 // 3. the vector hasn't been initialized earlier\n+311 if (not isEnd && i==v.block.size() && not v.initialized)\n+312 v.allocate();\n+313 }\n 314\n-315 template\n-_\b3_\b1_\b6 bool _\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx([[maybe_unused]] const M& origMatrix,\n-317 [[maybe_unused]] std::shared_ptr newMatrix,\n-318 [[maybe_unused]] _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& origComm,\n-319 [[maybe_unused]] std::shared_ptr& newComm,\n-320 [[maybe_unused]] _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>& ri,\n-321 [[maybe_unused]] int nparts,\n-322 [[maybe_unused]] C1& criterion)\n-323 {\n-324 DUNE_THROW(NotImplemented, \"Redistribution does not make sense in\n-sequential code!\");\n-325 }\n-326\n-327\n-328 template\n-_\b3_\b2_\b9 bool _\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(const M& origMatrix,\n-330 std::shared_ptr newMatrix,\n-331 C& origComm,\n-332 std::shared_ptr& newComm,\n-333 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bC_\b>& ri,\n-334 int nparts, C1& criterion)\n-335 {\n-336 Timer time;\n-337#ifdef AMG_REPART_ON_COMM_GRAPH\n-338 // Done not repartition the matrix graph, but a graph of the communication\n-scheme.\n-339 bool existentOnRedist=_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bG_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn(origMatrix, origComm,\n-nparts, newComm,\n-340 ri.getInterface(),\n-341 criterion.debugLevel()>1);\n-342\n-343#else\n-344 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b> _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh;\n-345 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh,\n-346 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n-347 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n-348 IdentityMap,\n-349 IdentityMap> _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh;\n-350 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh graph(origMatrix);\n-351 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh pgraph(graph);\n-352 _\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(pgraph, origMatrix, criterion, false);\n-353\n-354#ifdef DEBUG_REPART\n-355 if(origComm.communicator().rank()==0)\n-356 std::cout<<\"Original matrix\"<1);\n-363#endif // if else AMG_REPART\n-364\n-365 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)\n-366 std::cout<<\"Repartitioning took \"<indexSet(),\n-origComm.communicator());\n-372#endif\n-373\n-374 _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(const_cast(origMatrix), *newMatrix, origComm,\n-*newComm, ri);\n+_\b3_\b1_\b6 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+317 {\n+318 // go to next block\n+319 ++i;\n+320\n+321 return *this;\n+322 }\n+323\n+_\b3_\b2_\b5 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+_\b (int)\n+326 {\n+327 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br tmp(*this);\n+328 this->_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n+329 return tmp;\n+330 }\n+331\n+_\b3_\b3_\b3 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+334 {\n+335 return (i!=it.i) || (&v!=&it.v);\n+336 }\n+337\n+_\b3_\b3_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+340 {\n+341 return (i==it.i) && (&v==&it.v);\n+342 }\n+343\n+_\b3_\b4_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bi_\bn_\bd_\be_\bx () const\n+346 {\n+347 return i;\n+348 }\n+349\n+_\b3_\b5_\b1 void _\bs_\be_\bt_\bb_\bl_\bo_\bc_\bk_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _k)\n+352 {\n+353 v.block[i].setsize(_k);\n+354 }\n+355\n+357#ifdef DOXYGEN\n+358 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be&\n+359#else\n+360 SizeProxy\n+361#endif\n+_\b3_\b6_\b2 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*()\n+363 {\n+364 return {v.block[i]};\n+365 }\n+366\n+367 private:\n+368 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& v; // my vector\n+369 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i; // current block to be defined\n+370 const bool isEnd; // flag if this object was created as the end iterator.\n+371 };\n+372\n+373 // CreateIterator wants to set all the arrays ...\n+_\b3_\b7_\b4 friend class _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n 375\n-376#ifdef DEBUG_REPART\n-377 if(origComm.communicator().rank()==0)\n-378 std::cout<<\"Original matrix\"<communicator().size()>0)\n-381 _\bp_\br_\bi_\bn_\bt_\bG_\bl_\bo_\bb_\ba_\bl_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx(*newMatrix, *newComm, std::cout);\n-382 origComm.communicator().barrier();\n-383#endif\n+_\b3_\b7_\b7 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn ()\n+378 {\n+379#ifdef DUNE_ISTL_WITH_CHECKING\n+380 if (initialized) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"no CreateIterator in initialized\n+state\");\n+381#endif\n+382 return _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this, 0, false);\n+383 }\n 384\n-385 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)\n-386 std::cout<<\"Redistributing matrix took \"<\n-_\b3_\b9_\b2 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(std::shared_ptr\n-fineMatrix,\n-393 std::shared_ptr pinfo)\n-394 : matrices_(fineMatrix),\n-395 parallelInformation_(pinfo)\n-396 {\n-397 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*fineMatrix) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-(*pinfo))\n-398 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"MatrixOperator and ParallelInformation must belong\n-to the same category!\");\n-399 }\n-400\n-401 template\n-402 template\n-_\b4_\b0_\b3 void _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd(const T& criterion)\n-404 {\n-405 prolongDamp_ = criterion.getProlongationDampingFactor();\n-406 typedef O OverlapFlags;\n-407 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br MatIterator;\n-408 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br PInfoIterator;\n-409\n-410 static const int noints=(_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\bA_\bX_\b__\bP_\bR_\bO_\bC_\bE_\bS_\bS_\bE_\bS/4096>0) ? (_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:\n-_\bM_\bA_\bX_\b__\bP_\bR_\bO_\bC_\bE_\bS_\bS_\bE_\bS/4096) : 1;\n-411\n-412 typedef bigunsignedint BIGINT;\n-413 _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b> productBuilder;\n-414 MatIterator mlevel = matrices_.finest();\n-415 MatrixStats::stats(mlevel->getmat());\n-416\n-417 PInfoIterator infoLevel = parallelInformation_.finest();\n-418 BIGINT finenonzeros=_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs(mlevel->getmat());\n-419 finenonzeros = infoLevel->communicator().sum(finenonzeros);\n-420 BIGINT allnonzeros = finenonzeros;\n+391\n+392 //===== access to components\n+393 // has to be overwritten from base class because it must\n+394 // return access to the windows\n+395\n+_\b3_\b9_\b7 window_type& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+398 {\n+399#ifdef DUNE_ISTL_WITH_CHECKING\n+400 if (i>=block.size()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n+401#endif\n+402 return block[i];\n+403 }\n+404\n+_\b4_\b0_\b6 const window_type& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+407 {\n+408#ifdef DUNE_ISTL_WITH_CHECKING\n+409 if (i<0 || i>=block.size()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n+410#endif\n+411 return block[i];\n+412 }\n+413\n+_\b4_\b1_\b4 using _\bI_\bt_\be_\br_\ba_\bt_\bo_\br = IndexedIterator;\n+415\n+_\b4_\b1_\b7 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n+418 {\n+419 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br{block.begin()};\n+420 }\n 421\n-422\n-423 int level = 0;\n-424 int rank = 0;\n-425\n-426 BIGINT unknowns = mlevel->getmat().N();\n+_\b4_\b2_\b3 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n+424 {\n+425 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br{block.end()};\n+426 }\n 427\n-428 unknowns = infoLevel->communicator().sum(unknowns);\n-429 double dunknowns=unknowns.todouble();\n-430 infoLevel->buildGlobalLookup(mlevel->getmat().N());\n-431 redistributes_.push_back(_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be());\n-432\n-433 for(; level < criterion.maxLevel(); ++level, ++mlevel) {\n-434 assert(matrices_.levels()==redistributes_.size());\n-435 rank = infoLevel->communicator().rank();\n-436 if(rank==0 && criterion.debugLevel()>1)\n-437 std::cout<<\"Level \"<communicator().size()\n-438 <<\" unknowns per proc (procs=\"<communicator().size\n-()<<\")\"<communicator().size()))\n-451 && infoLevel->communicator().size()>1 &&\n-452 dunknowns/infoLevel->communicator().size() <= criterion.coarsenTarget())\n+_\b4_\b3_\b0 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n+431 {\n+432 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br{--block.end()};\n+433 }\n+434\n+_\b4_\b3_\b7 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n+438 {\n+439 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br{--block.begin()};\n+440 }\n+441\n+_\b4_\b4_\b3 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br = _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+444\n+_\b4_\b4_\b6 using _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br = IndexedIterator;\n+447\n+_\b4_\b4_\b9 using _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br = _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+450\n+_\b4_\b5_\b2 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n 453 {\n-454 // accumulate to fewer processors\n-455 std::shared_ptr redistMat = std::make_shared();\n-456 std::shared_ptr redistComm;\n-457 std::size_t nodomains = (std::size_t)std::ceil(dunknowns/\n-(criterion.minAggregateSize()\n-458 *criterion.coarsenTarget()));\n-459 if( nodomains<=criterion.minAggregateSize()/2 ||\n-460 dunknowns <= criterion.coarsenTarget() )\n-461 nodomains=1;\n+454 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br{block.begin()};\n+455 }\n+456\n+_\b4_\b5_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n+459 {\n+460 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br{block.end()};\n+461 }\n 462\n-463 bool existentOnNextLevel =\n-464 _\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(mlevel->getmat(), redistMat, *infoLevel,\n-465 redistComm, redistributes_.back(), nodomains,\n-466 criterion);\n-467 BIGINT unknownsRedist = redistMat->N();\n-468 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);\n-469 dunknowns= unknownsRedist.todouble();\n-470 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1)\n-471 std::cout<<\"Level \"<communicator().size()\n-472 <<\" unknowns per proc (procs=\"<communicator().size\n-()<<\")\"<_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-(args));\n-475 assert(mlevel.isRedistributed());\n-476 infoLevel.addRedistributed(redistComm);\n-477 infoLevel->freeGlobalLookup();\n-478\n-479 if(!existentOnNextLevel)\n-480 // We do not hold any data on the redistributed partitioning\n-481 break;\n+_\b4_\b6_\b5 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd () const\n+466 {\n+467 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br{--block.end()};\n+468 }\n+469\n+_\b4_\b7_\b2 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n+473 {\n+474 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br{--block.begin()};\n+475 }\n+476\n+_\b4_\b7_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\be_\bn_\bd () const\n+479 {\n+480 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br{block.rend()};\n+481 }\n 482\n-483 // Work on the redistributed Matrix from now on\n-484 matrix = &(mlevel.getRedistributed());\n-485 info = &(infoLevel.getRedistributed());\n-486 info->buildGlobalLookup(matrix->getmat().N());\n-487 }\n-488\n-489 rank = info->communicator().rank();\n-490 if(dunknowns <= criterion.coarsenTarget())\n-491 // No further coarsening needed\n-492 break;\n-493\n-494 typedef _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>\n-GraphCreator;\n-495 typedef typename GraphCreator::PropertiesGraph _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh;\n-496 typedef typename GraphCreator::GraphTuple GraphTuple;\n-497\n-498 typedef typename _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br Vertex;\n-499\n-500 std::vector excluded(matrix->getmat().N(), false);\n-501\n-502 GraphTuple graphs = GraphCreator::create(*matrix, excluded, *info,\n-OverlapFlags());\n-503\n-504 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp* aggregatesMap=new _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(std::get<1>(graphs)-\n->maxVertex()+1);\n-505\n-506 aggregatesMaps_.push_back(aggregatesMap);\n-507\n-508 Timer watch;\n-509 watch.reset();\n-510 auto [noAggregates, isoAggregates, oneAggregates, skippedAggregates] =\n-511 aggregatesMap->_\bb_\bu_\bi_\bl_\bd_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs(matrix->getmat(), *(std::get<1>(graphs)),\n-criterion, level==0);\n-512\n-513 if(rank==0 && criterion.debugLevel()>2)\n-514 std::cout<<\" Have built \"<communicator().rank();\n-522 int n = UNKNOWNS/procs; // number of unknowns per process\n-523 int bigger = UNKNOWNS%procs; // number of process with n+1 unknowns\n-524\n-525 // Compute owner region\n-526 if(rank0)\n-536 overlapStart = start - 1;\n-537 else\n-538 overlapStart = start;\n-539\n-540 if(end_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs());\n-546 for(int j=0; j< UNKNOWNS; ++j)\n-547 for(int i=0; i < UNKNOWNS; ++i)\n-548 {\n-549 if(i>=overlapStart && i1 && info->communicator().rank()==0)\n-558 std::cout<<\"aggregating finished.\"<communicator().sum(gnoAggregates);\n-562 double dgnoAggregates = gnoAggregates.todouble();\n-563#ifdef TEST_AGGLO\n-564 BIGINT gnoAggregates=((UNKNOWNS)/2)*((UNKNOWNS)/2);\n-565#endif\n-566\n-567 if(criterion.debugLevel()>2 && rank==0)\n-568 std::cout << \"Building \"<initialized)\n+522 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Attempt to re-allocate already initialized\n+VariableBlockVector\");\n+523\n+524 // calculate space needed:\n+525 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be storageNeeded = 0;\n+526 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < block.size(); i++)\n+527 storageNeeded += block[i]._\bs_\bi_\bz_\be();\n+528\n+529 storage_.resize(storageNeeded);\n+530 syncBaseArray();\n+531\n+532 // and we set the window pointers\n+533 block[0].setptr(this->p); // pointer to first block\n+534 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=1; jinitialized = true;\n+539 }\n+540\n+541 void syncBaseArray () noexcept\n+542 {\n+543 this->p = storage_.data();\n+544 this->n = storage_.size();\n+545 }\n+546\n+547 VectorWindows block = {}; // vector of blocks pointing to the array in the\n+base class\n+548 std::vector storage_ = {};\n+549 bool initialized = false; // true if vector has been initialized\n+550 };\n+551\n+555 template\n+_\b5_\b5_\b6 struct FieldTraits< _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n+557 {\n+_\b5_\b5_\b8 typedef typename FieldTraits::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b5_\b5_\b9 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+560 };\n+568} // end namespace\n 569\n-570 if(dgnoAggregates==0 || dunknowns/dgnoAggregates0)\n-575 std::cerr << \"Stopped coarsening because of rate breakdown \"<_\bf_\br_\be_\be();\n-582 delete aggregatesMap;\n-583 aggregatesMaps_.pop_back();\n-584\n-585 if(criterion.accumulate() && mlevel.isRedistributed() && info->communicator\n-().size()>1) {\n-586 // coarse level matrix was already redistributed, but to more than 1\n-process\n-587 // Therefore need to delete the redistribution. Further down it will\n-588 // then be redistributed to 1 process\n-589 delete &(mlevel.getRedistributed().getmat());\n-590 mlevel.deleteRedistributed();\n-591 delete &(infoLevel.getRedistributed());\n-592 infoLevel.deleteRedistributed();\n-593 redistributes_.back().resetSetup();\n-594 }\n-595\n-596 break;\n-597 }\n-598 unknowns = noAggregates;\n-599 dunknowns = dgnoAggregates;\n-600\n-601 CommunicationArgs commargs(info->communicator(),info->category());\n-602 parallelInformation_.addCoarser(commargs);\n-603\n-604 ++infoLevel; // parallel information on coarse level\n-605\n-606 typename PropertyMapTypeSelector::Type\n-visitedMap =\n-607 _\bg_\be_\bt(_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg(), *(std::get<1>(graphs)));\n-608\n-609 watch.reset();\n-610 int aggregates = _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bO_\bv_\be_\br_\bl_\ba_\bp_\bF_\bl_\ba_\bg_\bs_\b>\n-611_\b _\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn(*info,\n-612 *(std::get<1>(graphs)),\n-613 visitedMap,\n-614 *aggregatesMap,\n-615 *infoLevel,\n-616 noAggregates,\n-617 criterion.useFixedOrder());\n-618 GraphCreator::free(graphs);\n-619\n-620 if(criterion.debugLevel()>2) {\n-621 if(rank==0)\n-622 std::cout<<\"Coarsening of index sets took \"<buildGlobalLookup(aggregates);\n-628 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\bV_\be_\br_\bt_\be_\bx_\b,_\bO_\bv_\be_\br_\bl_\ba_\bp_\bF_\bl_\ba_\bg_\bs_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bp_\bu_\bb_\bl_\bi_\bs_\bh\n-(*aggregatesMap,\n-629 *info,\n-630 infoLevel->globalLookup());\n-631\n-632\n-633 if(criterion.debugLevel()>2) {\n-634 if(rank==0)\n-635 std::cout<<\"Communicating global aggregate numbers took \"<& visited=excluded;\n-640\n-641 typedef std::vector::iterator Iterator;\n-642 typedef IteratorPropertyMap VisitedMap2;\n-643 Iterator end = visited.end();\n-644 for(Iterator iter= visited.begin(); iter != end; ++iter)\n-645 *iter=false;\n-646\n-647 VisitedMap2 visitedMap2(visited.begin(), Dune::IdentityMap());\n-648\n-649 std::shared_ptr\n-650 coarseMatrix(productBuilder.build(*(std::get<0>(graphs)), visitedMap2,\n-651 *info,\n-652 *aggregatesMap,\n-653 aggregates,\n-654 OverlapFlags()));\n-655 dverb<<\"Building of sparsity pattern took \"<freeGlobalLookup();\n-658\n-659 delete std::get<0>(graphs);\n-660 productBuilder.calculate(matrix->getmat(), *aggregatesMap, *coarseMatrix,\n-*infoLevel, OverlapFlags());\n-661\n-662 if(criterion.debugLevel()>2) {\n-663 if(rank==0)\n-664 std::cout<<\"Calculation entries of Galerkin product took \"<communicator().sum(nonzeros);\n-669 MatrixArgs args(coarseMatrix, *infoLevel);\n-670\n-671 matrices_.addCoarser(args);\n-672 redistributes_.push_back(_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be());\n-673 } // end level loop\n-674\n-675\n-676 infoLevel->freeGlobalLookup();\n-677\n-678 built_=true;\n-679 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp* aggregatesMap=new _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(0);\n-680 aggregatesMaps_.push_back(aggregatesMap);\n-681\n-682 if(criterion.debugLevel()>0) {\n-683 if(level==criterion.maxLevel()) {\n-684 BIGINT unknownsLevel = mlevel->getmat().N();\n-685 unknownsLevel = infoLevel->communicator().sum(unknownsLevel);\n-686 if(rank==0 && criterion.debugLevel()>1) {\n-687 double dunknownsLevel = unknownsLevel.todouble();\n-688 std::cout<<\"Level \"<communicator().size()\n-689 <<\" unknowns per proc (procs=\"<communicator().size\n-()<<\")\"<communicator().size()>1) {\n-696#if HAVE_MPI && !HAVE_PARMETIS\n-697 if(criterion.accumulate()==_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu &&\n-698 infoLevel->communicator().rank()==0)\n-699 std::cerr<<\"Successive accumulation of data on coarse levels only works\n-with ParMETIS installed.\"\n-700 <<\" Fell back to accumulation to one domain on coarsest level\"< redistMat = std::make_shared();\n-705 std::shared_ptr redistComm;\n-706 int nodomains = 1;\n-707\n-708 _\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(mlevel->getmat(), redistMat, *infoLevel,\n-709 redistComm, redistributes_.back(), nodomains,criterion);\n-710 MatrixArgs args(redistMat, *redistComm);\n-711 BIGINT unknownsRedist = redistMat->N();\n-712 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);\n-713\n-714 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1) {\n-715 double dunknownsRedist = unknownsRedist.todouble();\n-716 std::cout<<\"Level \"<communicator().size()\n-717 <<\" unknowns per proc (procs=\"<communicator().size\n-()<<\")\"<_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-(args));\n-720 infoLevel.addRedistributed(redistComm);\n-721 infoLevel->freeGlobalLookup();\n-722 }\n-723\n-724 int levels = matrices_.levels();\n-725 maxlevels_ = parallelInformation_.finest()->communicator().max(levels);\n-726 assert(matrices_.levels()==redistributes_.size());\n-727 if(hasCoarsest() && rank==0 && criterion.debugLevel()>1)\n-728 std::cout<<\"operator complexity: \"<\n-733 const typename _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by&\n-_\b7_\b3_\b4 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bc_\be_\bs() const\n-735 {\n-736 return matrices_;\n-737 }\n-738\n-739 template\n-740 const typename _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by&\n-_\b7_\b4_\b1 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn() const\n-742 {\n-743 return parallelInformation_;\n-744 }\n-745\n-746 template\n-_\b7_\b4_\b7 void _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bO_\bn_\bF_\bi_\bn_\be_\bs_\bt(std::\n-vector& data) const\n-748 {\n-749 int levels=aggregatesMaps().size();\n-750 int maxlevels=parallelInformation_._\bf_\bi_\bn_\be_\bs_\bt()->communicator().max(levels);\n-751 std::size_t size=(*(aggregatesMaps().begin()))->noVertices();\n-752 // We need an auxiliary vector for the consecutive prolongation.\n-753 std::vector tmp;\n-754 std::vector *coarse, *fine;\n-755\n-756 // make sure the allocated space suffices.\n-757 tmp.reserve(size);\n-758 data.reserve(size);\n-759\n-760 // Correctly assign coarse and fine for the first prolongation such that\n-761 // we end up in data in the end.\n-762 if(levels%2==0) {\n-763 coarse=&tmp;\n-764 fine=&data;\n-765 }else{\n-766 coarse=&data;\n-767 fine=&tmp;\n-768 }\n-769\n-770 // Number the unknowns on the coarsest level consecutively for each\n-process.\n-771 if(levels==maxlevels) {\n-772 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& map = *(*(++aggregatesMaps().rbegin()));\n-773 std::size_t m=0;\n-774\n-775 for(typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br iter = map._\bb_\be_\bg_\bi_\bn(); iter !=\n-map._\be_\bn_\bd(); ++iter)\n-776 if(*iter< _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n-777 m=std::max(*iter,m);\n-778\n-779 coarse->resize(m+1);\n-780 std::size_t i=0;\n-781 srand((unsigned)std::clock());\n-782 std::set used;\n-783 for(typename std::vector::iterator iter=coarse->begin(); iter\n-!= coarse->end();\n-784 ++iter, ++i)\n-785 {\n-786 std::pair::iterator,bool> ibpair\n-787 = used.insert(static_cast((((double)rand())/\n-(RAND_MAX+1.0)))*coarse->size());\n-788\n-789 while(!ibpair.second)\n-790 ibpair = used.insert(static_cast((((double)rand())/\n-(RAND_MAX+1.0))*coarse->size()));\n-791 *iter=*(ibpair.first);\n-792 }\n-793 }\n-794\n-795 typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br pinfo = parallelInformation\n-().coarsest();\n-796 --pinfo;\n-797\n-798 // Now consecutively project the numbers to the finest level.\n-799 for(typename AggregatesMapList::const_reverse_iterator\n-aggregates=++aggregatesMaps().rbegin();\n-800 aggregates != aggregatesMaps().rend(); ++aggregates,--levels) {\n-801\n-802 fine->resize((*aggregates)->noVertices());\n-803 fine->assign(fine->size(), 0);\n-804 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\bs_\bt_\bd_\b:_\b:\n-_\bs_\bi_\bz_\be_\b__\bt_\b>, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn>\n-805 ::prolongateVector(*(*aggregates), *coarse, *fine, static_cast\n-(1), *pinfo);\n-806 --pinfo;\n-807 std::swap(coarse, fine);\n-808 }\n-809\n-810 // Assertion to check that we really projected to data on the last step.\n-811 assert(coarse==&data);\n-812 }\n-813\n-814 template\n-815 const typename _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bL_\bi_\bs_\bt&\n-_\b8_\b1_\b6 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bs() const\n-817 {\n-818 return aggregatesMaps_;\n-819 }\n-820 template\n-821 const typename _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bL_\bi_\bs_\bt&\n-_\b8_\b2_\b2 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn() const\n-823 {\n-824 return redistributes_;\n-825 }\n-826\n-827 template\n-_\b8_\b2_\b8 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\b~_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by()\n-829 {\n-830 typedef typename AggregatesMapList::reverse_iterator AggregatesMapIterator;\n-831 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n-832 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br InfoIterator;\n-833\n-834 AggregatesMapIterator amap = aggregatesMaps_.rbegin();\n-835 InfoIterator info = parallelInformation_.coarsest();\n-836 for(Iterator level=matrices_.coarsest(), finest=matrices_.finest(); level\n-!= finest; --level, --info, ++amap) {\n-837 (*amap)->free();\n-838 delete *amap;\n-839 }\n-840 delete *amap;\n-841 }\n-842\n-843 template\n-844 template\n-_\b8_\b4_\b5 void _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn_\bV_\be_\bc_\bt_\bo_\br(_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bV_\b,_\bB_\bA_\b>,\n-TA>& hierarchy) const\n-846 {\n-847 assert(hierarchy.levels()==1);\n-848 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n-849 typedef typename RedistributeInfoList::const_iterator RIter;\n-850 RIter redist = redistributes_.begin();\n-851\n-852 Iterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();\n-853 int level=0;\n-854 if(redist->isSetup())\n-855 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N\n-());\n-856 Dune::dvverb<<\"Level \"<getmat().N()<<\"\n-unknowns!\"<getmat().N()<<\"\n-unknowns!\"<getmat().N());\n-863 if(redist->isSetup())\n-864 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N\n-());\n-865\n-866 }\n-867\n-868 }\n-869\n-870 template\n-871 template\n-_\b8_\b7_\b2 void _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br(_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bS_\b,_\bT_\bA_\b>& smoothers,\n-873 const typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& sargs) const\n-874 {\n-875 assert(smoothers._\bl_\be_\bv_\be_\bl_\bs()==0);\n-876 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br MatrixIterator;\n-877 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br PinfoIterator;\n-878 typedef typename AggregatesMapList::const_iterator AggregatesIterator;\n-879\n-880 typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs cargs;\n-881 cargs.setArgs(sargs);\n-882 PinfoIterator pinfo = parallelInformation_.finest();\n-883 AggregatesIterator aggregates = aggregatesMaps_.begin();\n-884 int level=0;\n-885 for(MatrixIterator matrix = matrices_.finest(), coarsest =\n-matrices_.coarsest();\n-886 matrix != coarsest; ++matrix, ++pinfo, ++aggregates, ++level) {\n-887 cargs.setMatrix(matrix->getmat(), **aggregates);\n-888 cargs.setComm(*pinfo);\n-889 smoothers._\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br(cargs);\n-890 }\n-891 if(maxlevels()>levels()) {\n-892 // This is not the globally coarsest level and therefore smoothing is\n-needed\n-893 cargs.setMatrix(matrices_.coarsest()->getmat(), **aggregates);\n-894 cargs.setComm(*pinfo);\n-895 smoothers._\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br(cargs);\n-896 ++level;\n-897 }\n-898 }\n-899\n-900 template\n-901 template\n-_\b9_\b0_\b2 void _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn(const F& copyFlags)\n-903 {\n-904 typedef typename AggregatesMapList::iterator AggregatesMapIterator;\n-905 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n-906 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br InfoIterator;\n-907\n-908 AggregatesMapIterator amap = aggregatesMaps_.begin();\n-909 _\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt productBuilder;\n-910 InfoIterator info = parallelInformation_.finest();\n-911 typename RedistributeInfoList::iterator riIter = redistributes_.begin();\n-912 Iterator level = matrices_.finest(), coarsest=matrices_.coarsest();\n-913 if(level.isRedistributed()) {\n-914 info->buildGlobalLookup(level->getmat().N());\n-915 _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs(const_cast<_\bM_\ba_\bt_\br_\bi_\bx&>(level->getmat()),\n-916 const_cast<_\bM_\ba_\bt_\br_\bi_\bx&>(level.getRedistributed().getmat()),\n-917 *info,info.getRedistributed(), *riIter);\n-918 info->freeGlobalLookup();\n-919 }\n-920\n-921 for(; level!=coarsest; ++amap) {\n-922 const _\bM_\ba_\bt_\br_\bi_\bx& fine = (level.isRedistributed() ? level.getRedistributed() :\n-*level).getmat();\n-923 ++level;\n-924 ++info;\n-925 ++riIter;\n-926 productBuilder._\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be(fine, *(*amap), const_cast<_\bM_\ba_\bt_\br_\bi_\bx&>(level->getmat\n-()), *info, copyFlags);\n-927 if(level.isRedistributed()) {\n-928 info->buildGlobalLookup(level->getmat().N());\n-929 _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs(const_cast<_\bM_\ba_\bt_\br_\bi_\bx&>(level->getmat()),\n-930 const_cast<_\bM_\ba_\bt_\br_\bi_\bx&>(level.getRedistributed().getmat()), *info,\n-931 info.getRedistributed(), *riIter);\n-932 info->freeGlobalLookup();\n-933 }\n-934 }\n-935 }\n-936\n-937 template\n-_\b9_\b3_\b8 std::size_t _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs() const\n-939 {\n-940 return matrices_.levels();\n-941 }\n-942\n-943 template\n-_\b9_\b4_\b4 std::size_t _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs() const\n-945 {\n-946 return maxlevels_;\n-947 }\n-948\n-949 template\n-_\b9_\b5_\b0 bool _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bh_\ba_\bs_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt() const\n-951 {\n-952 return levels()==maxlevels() &&\n-953 (!matrices_.coarsest().isRedistributed() ||matrices_.coarsest()->getmat().N\n-()>0);\n-954 }\n-955\n-956 template\n-_\b9_\b5_\b7 bool _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bi_\bs_\bB_\bu_\bi_\bl_\bt() const\n-958 {\n-959 return built_;\n-960 }\n-961\n-963 } // namespace Amg\n-964} // namespace Dune\n-965\n-966#endif // end DUNE_AMG_MATRIXHIERARCHY_HH\n-_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\n-Some handy generic functions for ISTL matrices.\n-_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-Helper classes for the construction of classes without empty constructor.\n-_\bi_\bn_\bd_\bi_\bc_\be_\bs_\bc_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b._\bh_\bh\n-Provides a class for building the index set and remote indices on the coarse\n-level.\n-_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh\n-Prolongation and restriction for amg.\n-_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\n-Classes for the generic construction and application of the smoothers.\n-_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n-Provides classes for the Coloring process of AMG.\n-_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\n-Provides classes for building the matrix graph.\n-_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\n-Provides a class for building the galerkin product based on a aggregation\n-scheme.\n-_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh\n-Provides a classes representing the hierarchies in AMG.\n-_\bg_\br_\ba_\bp_\bh_\bc_\br_\be_\ba_\bt_\bo_\br_\b._\bh_\bh\n-_\bg_\bl_\bo_\bb_\ba_\bl_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n-Provdes class for identifying aggregates globally.\n-_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh\n-Provides classes for initializing the link attributes of a matrix graph.\n+570#endif\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n+Helper functions for determining the vector/matrix block level.\n _\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n This file implements a vector space as a tensor product of a given vector\n space. The number of compon...\n-_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh\n-Functionality for redistributing a sparse matrix.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs\n-auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::\n-value > *sfinae=nullptr)\n-Get the number of nonzero fields in the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:119\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bs\n-const AggregatesMapList & aggregatesMaps() const\n-Get the hierarchy of the mappings of the nodes onto aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:816\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bi_\bs_\bB_\bu_\bi_\bl_\bt\n-bool isBuilt() const\n-Whether the hierarchy was built.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:957\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bh_\ba_\bs_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt\n-bool hasCoarsest() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:950\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs\n-std::size_t levels() const\n-Get the number of levels in the hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:322\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs\n-std::size_t levels() const\n-Get the number of levels in the hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:938\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br\n-void addCoarser(Arguments &args)\n-Add an element on a coarser level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:334\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-const RedistributeInfoList & redistributeInformation() const\n-Get the hierarchy of the information about redistributions,.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:822\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-const ParallelInformationHierarchy & parallelInformation() const\n-Get the hierarchy of the parallel data distribution information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:741\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx\n-bool repartitionAndDistributeMatrix(const M &origMatrix, std::shared_ptr< M >\n-newMatrix, SequentialInformation &origComm, std::shared_ptr<\n-SequentialInformation > &newComm, RedistributeInformation<\n-SequentialInformation > &ri, int nparts, C1 &criterion)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:316\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:725\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bc_\be_\bs\n-const ParallelMatrixHierarchy & matrices() const\n-Get the matrix hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:734\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs\n-std::size_t maxlevels() const\n-Get the max number of levels in the hierarchy of processors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:944\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:730\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD\n-static const V ISOLATED\n-Identifier of isolated vertices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:571\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn\n-void recalculateGalerkin(const F ©Flags)\n-Recalculate the galerkin products.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:902\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-const void * Arguments\n-A type holding all the arguments needed to call the constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n-std::size_t noVertices() const\n-Get the number of vertices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< T > construct(Arguments &args)\n-Construct an object with the specified arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn_\bV_\be_\bc_\bt_\bo_\br\n-void coarsenVector(Hierarchy< BlockVector< V, BA >, TA > &hierarchy) const\n-Coarsen the vector hierarchy according to the matrix hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:845\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-const AggregateDescriptor * const_iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:723\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-MatrixHierarchy(std::shared_ptr< MatrixOperator > fineMatrix, std::shared_ptr<\n-ParallelInformation > pinfo=std::make_shared< ParallelInformation >())\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be\n-AccumulationMode\n-Identifiers for the different accumulation modes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:231\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bf_\bi_\bn_\be_\bs_\bt\n-Iterator finest()\n-Get an iterator positioned at the finest level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:377\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bb_\bu_\bi_\bl_\bd\n-void build(const T &criterion)\n-Build the matrix hierarchy using aggregation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:403\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bf_\br_\be_\be\n-void free()\n-Free the allocated memory.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n-void coarsenSmoother(Hierarchy< S, TA > &smoothers, const typename\n-SmootherTraits< S >::Arguments &args) const\n-Coarsen the smoother hierarchy according to the matrix hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:872\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n-void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion,\n-bool finestLevel)\n-Build the dependency of the matrix graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs\n-std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph,\n-const C &criterion, bool finestLevel)\n-Build the aggregates.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be\n-void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse,\n-const I &pinfo, const O ©)\n-Calculate the galerkin product.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bO_\bn_\bF_\bi_\bn_\be_\bs_\bt\n-void getCoarsestAggregatesOnFinest(std::vector< std::size_t > &data) const\n-Get the mapping of fine level unknowns to coarse level aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:747\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\b~_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-~MatrixHierarchy()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:828\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\bA_\bX_\b__\bP_\bR_\bO_\bC_\bE_\bS_\bS_\bE_\bS\n-@ MAX_PROCESSES\n-Hard limit for the number of processes allowed.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\ba_\bt_\bO_\bn_\bc_\be_\bA_\bc_\bc_\bu\n-@ atOnceAccu\n-Accumulate data to one process at once.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:243\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu\n-@ successiveAccu\n-Successively accumulate to fewer processes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:247\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bG_\bl_\bo_\bb_\ba_\bl_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n-void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:154\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs\n-void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C\n-&newComm, RedistributeInformation< C > &ri)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:757\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bG_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn\n-bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication<\n-T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::\n-OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface\n-&redistInf, bool verbose=false)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:822\n-_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx\n-void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm,\n-RedistributeInformation< C > &ri)\n-Redistribute a matrix according to given domain decompositions.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:820\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn\n-bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1,\n-T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::\n-OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface\n-&redistInf, bool verbose=false)\n-execute a graph repartition for a giving graph and indexset.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:1228\n _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n A vector of blocks with memory management.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n derive error class from the base class in common\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-A generic dynamic dense matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-Type for indices and sizes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:577\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n-MatrixImp::DenseMatrixBase< T, A >::window_type row_type\n-The type implementing a matrix row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:574\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:22\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-Class providing information about the mapping of the vertices onto aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-Class representing the properties of an edge in the matrix graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-Class representing a node in the matrix graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:99\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:118\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:131\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-The (undirected) graph of a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n-Attaches properties to the edges and vertices of a graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:978\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-Graph::VertexDescriptor VertexDescriptor\n-The vertex descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:988\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:22\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-A hierarchy of containers (e.g. matrices or vectors)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-LevelIterator< Hierarchy< MatrixOperator, Allocator >, MatrixOperator >\n-Iterator\n-Type of the mutable iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-LevelIterator< const Hierarchy< MatrixOperator, Allocator >, const\n-MatrixOperator > ConstIterator\n-Type of the const iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-The hierarchies build by the coarsening process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n-typename std::allocator_traits< Allocator >::template rebind_alloc<\n-AggregatesMap * > AAllocator\n-Allocator for pointers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-Dune::Amg::Hierarchy< ParallelInformation, Allocator >\n-ParallelInformationHierarchy\n-The type of the parallel informarion hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bL_\bi_\bs_\bt\n-std::list< AggregatesMap *, AAllocator > AggregatesMapList\n-The type of the aggregates maps list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:88\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-PI ParallelInformation\n-The type of the index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-Dune::Amg::Hierarchy< MatrixOperator, Allocator > ParallelMatrixHierarchy\n-The type of the parallel matrix hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n-A Allocator\n-The allocator to use.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be\n-RedistributeInformation< ParallelInformation > RedistributeInfoType\n-The type of the redistribute information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bg_\be_\bt_\bP_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\bi_\bo_\bn_\bD_\ba_\bm_\bp_\bi_\bn_\bg_\bF_\ba_\bc_\bt_\bo_\br\n-double getProlongationDampingFactor() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bR_\bI_\bL_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n-typename std::allocator_traits< Allocator >::template rebind_alloc<\n-RedistributeInfoType > RILAllocator\n-Allocator for RedistributeInfoType.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:94\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bL_\bi_\bs_\bt\n-std::list< RedistributeInfoType, RILAllocator > RedistributeInfoList\n-The type of the list of redistribute information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:97\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-Dune::Amg::AggregatesMap< typename MatrixGraph< Matrix >::VertexDescriptor >\n-AggregatesMap\n-The type of the aggregates map we use.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-MatrixOperator::matrix_type Matrix\n-The type of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-M MatrixOperator\n-The type of the matrix operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:64\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const matrix_row &row)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:254\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\br_\bo_\bw\n-Matrix::row_type matrix_row\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:245\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bm_\bi_\bn\n-size_type min\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:261\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bc_\ba_\bl_\bc\n-calc()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:247\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bm_\ba_\bx\n-size_type max\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:262\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bs_\bu_\bm\n-size_type sum\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:263\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Matrix::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:244\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-The criterion describing the stop criteria for the coarsening process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:283\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-CoarsenCriterion(const Dune::Amg::Parameters &parms)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:309\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-T AggregationCriterion\n-The criterion for tagging connections as strong and nodes as isolated. This\n-might be e....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:289\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double\n-minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode\n-accumulate=successiveAccu, bool useFixedOrder=false)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:304\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-All parameters for AMG.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n-Tag idnetifying the visited property of a vertex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:29\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-The default class for the smoother arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:32\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-static Category category(const OP &op, decltype(op.category()) *=nullptr)\n-Helperfunction to extract the solver category either from an enum, or from the\n-newly introduced virtu...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A Vector of blocks with different blocksizes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+VariableBlockVector(size_type numBlocks, size_type blockSize)\n+Construct a vector with given number of blocks each having a constant size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+VariableBlockVector()\n+Constructor without arguments makes an empty vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:102\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bw_\ba_\bp\n+friend void swap(VariableBlockVector &lhs, VariableBlockVector &rhs) noexcept\n+Free function to swap the storage and internal state of lhs with rhs.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:190\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator iterator\n+Export the iterator type using std naming rules.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:443\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+VariableBlockVector & operator=(VariableBlockVector tmp)\n+Copy and move assignment.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:171\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+VariableBlockVector(size_type numBlocks)\n+Construct a vector with given number of blocks, but size of each block is not\n+yet known.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:112\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< B >::field_type field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+typename A::size_type size_type\n+The size type for the index access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bN\n+size_type N() const noexcept\n+number of blocks in the vector (are of variable size here)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:502\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+VariableBlockVector(const VariableBlockVector &a)\n+Copy constructor, has copy semantics.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+window_type & operator[](size_type i)\n+random access to blocks\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:397\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n+A allocator_type\n+export the allocator type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd\n+CreateIterator createend()\n+get create iterator pointing to one after the last block\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:386\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+VariableBlockVector(VariableBlockVector &&tmp)\n+Move constructor:\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:161\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn\n+CreateIterator createbegin()\n+get initial create iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:377\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator const_iterator\n+Export the const iterator type using std naming rules.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:449\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+window_type & reference\n+Export type used for references to container entries.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bn_\bd\n+ConstIterator rend() const\n+end ConstIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:478\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const window_type & const_reference\n+Export type used for const references to container entries.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\bn_\bd\n+ConstIterator find(size_type i) const\n+random access returning iterator (end if not contained)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:492\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+ConstIterator beforeEnd() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:465\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\bn_\bd\n+Iterator find(size_type i)\n+random access returning iterator (end if not contained)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:484\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+IndexedIterator< typename VectorWindows::const_iterator > ConstIterator\n+Const iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:446\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\b~_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+~VariableBlockVector()=default\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+ConstIterator beforeBegin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:472\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(size_type numBlocks)\n+same effect as constructor with same argument\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:196\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+Iterator end()\n+end Iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:423\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bw_\ba_\bp\n+void swap(VariableBlockVector &other) noexcept\n+Exchange the storage and internal state with other.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:178\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+ConstIterator begin() const\n+begin ConstIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:452\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n+size_type size() const noexcept\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:511\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(size_type numBlocks, size_type blockSize)\n+same effect as constructor with same argument\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:210\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+IndexedIterator< typename VectorWindows::iterator > Iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:414\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+ConstIterator end() const\n+end ConstIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:458\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+Iterator beforeBegin()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:437\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+Iterator beforeEnd()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:430\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+Iterator begin()\n+begin Iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:417\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator class for sequential creation of blocks.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:275\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const CreateIterator &it) const\n+equality\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:339\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n+size_type index() const\n+dereferencing\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:345\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+SizeProxy reference\n+reference type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:295\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n+size_type * pointer\n+pointer type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:292\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const CreateIterator &it) const\n+inequality\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:333\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\b~_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+~CreateIterator()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:304\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+size_type value_type\n+value type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:281\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+CreateIterator(VariableBlockVector &_v, int _i, bool _isEnd)\n+constructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:298\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bs_\be_\bt_\bb_\bl_\bo_\bc_\bk_\bs_\bi_\bz_\be\n+void setblocksize(size_type _k)\n+set size of current block\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:351\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+size_type & operator*()\n+Access size of current block.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:362\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+std::output_iterator_tag iterator_category\n+iterator category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+CreateIterator & operator++()\n+prefix increment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:316\n+_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n+void difference_type\n+difference type (unused)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:289\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< B >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:559\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< B >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:558\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00104.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00104.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: smoother.hh File Reference\n+dune-istl: cholmod.hh File Reference\n \n \n \n \n \n \n \n@@ -65,126 +65,62 @@\n
    \n
    \n
    \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n- \n+
    cholmod.hh File Reference
    \n
    \n
    \n-\n-

    Classes for the generic construction and application of the smoothers. \n-More...

    \n-
    #include <dune/istl/paamg/construction.hh>
    \n-#include <dune/istl/paamg/aggregates.hh>
    \n-#include <dune/istl/preconditioners.hh>
    \n-#include <dune/istl/schwarz.hh>
    \n-#include <dune/istl/novlpschwarz.hh>
    \n-#include <dune/common/propertymap.hh>
    \n-#include <dune/common/ftraits.hh>
    \n+
    #include <dune/common/fmatrix.hh>
    \n+#include <dune/common/fvector.hh>
    \n+#include <dune/istl/bcrsmatrix.hh>
    \n+#include <dune/istl/bvector.hh>
    \n+#include <dune/istl/solver.hh>
    \n+#include <dune/istl/solverfactory.hh>
    \n+#include <dune/istl/foreach.hh>
    \n+#include <vector>
    \n+#include <memory>
    \n+#include <cholmod.h>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n-\n-\n+\n \n-\n+\n \n-\n-\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n

    \n Classes

    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...
    class  Dune::Cholmod< Vector, Index >
     Dune wrapper for SuiteSparse/CHOLMOD solver. More...
     
    struct  Dune::Amg::ConstructionTraits< Richardson< X, Y > >
     Policy for the construction of the Richardson smoother. More...
    struct  Dune::CholmodCreator
     
    class  Dune::Amg::ConstructionArgs< SeqILU< M, X, Y > >
    struct  Dune::CholmodCreator::isValidBlock< F >
     
    struct  Dune::Amg::ConstructionTraits< SeqILU< M, X, Y > >
     Policy for the construction of the SeqILU smoother. More...
    struct  Dune::CholmodCreator::isValidBlock< FieldVector< double, k > >
     
    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::CholmodCreator::isValidBlock< FieldVector< float, k > >
     
    \n \n \n \n-\n-\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n

    \n 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.
     
     Dune::DUNE_REGISTER_DIRECT_SOLVER ("cholmod", Dune::CholmodCreator())
     
    \n-

    Detailed Description

    \n-

    Classes for the generic construction and application of the smoothers.

    \n-
    Author
    Markus Blatt
    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,111 +1,39 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-smoother.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Classes for the generic construction and application of the smoothers. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n-#include \n-#include \n+cholmod.hh File Reference\n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh>\n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\b _\bT_\b _\b>\n-\u00a0 The default class for the smoother arguments. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b<_\b _\bV_\be_\bc_\bt_\bo_\br_\b,_\b _\bI_\bn_\bd_\be_\bx_\b _\b>\n+\u00a0 _\bD_\bu_\bn_\be wrapper for SuiteSparse/CHOLMOD solver. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b>\n-\u00a0 Traits class for getting the attribute class of a smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b,_\b _\bk_\b _\b>_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bT_\b _\b>\n-\u00a0 Construction Arguments for the default smoothers. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bT_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bT_\b,_\b _\bC_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>\n-\u00a0 Policy for the construction of the _\bS_\be_\bq_\bS_\bS_\bO_\bR smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>\n-\u00a0 Policy for the construction of the _\bS_\be_\bq_\bS_\bO_\bR smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bJ_\ba_\bc_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>\n-\u00a0 Policy for the construction of the _\bS_\be_\bq_\bJ_\ba_\bc smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n-\u00a0 Policy for the construction of the _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n-\u00a0 Policy for the construction of the _\bS_\be_\bq_\bI_\bL_\bU smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bP_\ba_\br_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>\n-\u00a0 Policy for the construction of the _\bP_\ba_\br_\bS_\bS_\bO_\bR smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bT\n- _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0 Helper class for applying the smoothers. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,\n- _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,\n- _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n- _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>\n- _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA\n- _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b,_\b _\bk_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh (LevelContext &levelContext, size_t steps)\n-\u00a0 Apply pre smoothing on the current level.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh (LevelContext &levelContext, size_t steps)\n-\u00a0 Apply post smoothing on the current level.\n-\u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Classes for the generic construction and application of the smoothers.\n- Author\n- Markus Blatt\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"cholmod\", _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br())\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00104_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00104_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: smoother.hh Source File\n+dune-istl: cholmod.hh Source File\n \n \n \n \n \n \n \n@@ -70,1130 +70,574 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    smoother.hh
    \n+
    cholmod.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMGSMOOTHER_HH
    \n-
    6#define DUNE_AMGSMOOTHER_HH
    \n-
    7
    \n-\n-\n-\n-
    11#include <dune/istl/schwarz.hh>
    \n-\n-
    13#include <dune/common/propertymap.hh>
    \n-
    14#include <dune/common/ftraits.hh>
    \n-
    15
    \n-
    16namespace Dune
    \n-
    17{
    \n-
    18 namespace Amg
    \n-
    19 {
    \n-
    20
    \n-
    36 template<class T>
    \n-
    \n-\n-
    38 {
    \n-
    42 typedef typename FieldTraits<T>::real_type RelaxationFactor;
    \n-
    43
    \n-\n-\n-
    52
    \n-
    \n-\n-\n-
    58 {}
    \n-
    \n-
    59 };
    \n-
    \n-
    60
    \n-
    64 template<class T>
    \n-\n+
    5#pragma once
    \n+
    6
    \n+
    7#if HAVE_SUITESPARSE_CHOLMOD || defined DOXYGEN
    \n+
    8
    \n+
    9#include <dune/common/fmatrix.hh>
    \n+
    10#include <dune/common/fvector.hh>
    \n+\n+
    12#include <dune/istl/bvector.hh>
    \n+
    13#include<dune/istl/solver.hh>
    \n+\n+
    15#include <dune/istl/foreach.hh>
    \n+
    16
    \n+
    17#include <vector>
    \n+
    18#include <memory>
    \n+
    19
    \n+
    20#include <cholmod.h>
    \n+
    21
    \n+
    22namespace Dune {
    \n+
    23
    \n+
    24namespace Impl{
    \n+
    25
    \n+
    34 struct NoIgnore
    \n+
    35 {
    \n+
    36 const NoIgnore& operator[](std::size_t) const { return *this; }
    \n+
    37 explicit operator bool() const { return false; }
    \n+
    38 static constexpr std::size_t size() { return 0; }
    \n+
    39
    \n+
    40 };
    \n+
    41
    \n+
    42
    \n+
    43 template<class BlockedVector, class FlatVector>
    \n+
    44 void copyToFlatVector(const BlockedVector& blockedVector, FlatVector& flatVector)
    \n+
    45 {
    \n+
    46 // traverse the vector once just to compute the size
    \n+
    47 std::size_t len = flatVectorForEach(blockedVector, [&](auto&&, auto...){});
    \n+
    48 flatVector.resize(len);
    \n+
    49
    \n+
    50 flatVectorForEach(blockedVector, [&](auto&& entry, auto offset){
    \n+
    51 flatVector[offset] = entry;
    \n+
    52 });
    \n+
    53 }
    \n+
    54
    \n+
    55 // special (dummy) case for NoIgnore
    \n+
    56 template<class FlatVector>
    \n+
    57 void copyToFlatVector(const NoIgnore&, FlatVector&)
    \n+
    58 {
    \n+
    59 // just do nothing
    \n+
    60 return;
    \n+
    61 }
    \n+
    62
    \n+
    63 template<class FlatVector, class BlockedVector>
    \n+
    64 void copyToBlockedVector(const FlatVector& flatVector, BlockedVector& blockedVector)
    \n+
    65 {
    \n+
    66 flatVectorForEach(blockedVector, [&](auto& entry, auto offset){
    \n+
    67 entry = flatVector[offset];
    \n+
    68 });
    \n+
    69 }
    \n
    70
    \n-
    71 template<class X, class Y>
    \n-
    \n-\n-
    73 {
    \n-\n+
    71 // wrapper class for C function calls to CHOLMOD itself.
    \n+
    72 // The CHOLMOD API has different functions for different index types.
    \n+
    73 template <class Index>
    \n+
    74 struct CholmodMethodChooser;
    \n
    75
    \n-
    76 };
    \n-
    \n-
    77
    \n-
    78 template<class X, class Y, class C, class T>
    \n-
    \n-\n-
    80 : public SmootherTraits<T>
    \n-
    81 {};
    \n-
    \n-
    82
    \n-
    83 template<class C, class T>
    \n-
    \n-\n-
    85 : public SmootherTraits<T>
    \n-
    86 {};
    \n-
    \n-
    87
    \n-
    91 template<class T>
    \n-
    \n-\n-
    93 {
    \n-
    94 typedef typename T::matrix_type Matrix;
    \n-
    95
    \n-\n+
    76 // specialization using 'int' to store indices
    \n+
    77 template <>
    \n+
    78 struct CholmodMethodChooser<int>
    \n+
    79 {
    \n+
    80 [[nodiscard]]
    \n+
    81 static cholmod_dense* allocate_dense(size_t nrow, size_t ncol, size_t d, int xtype, cholmod_common *c)
    \n+
    82 {
    \n+
    83 return ::cholmod_allocate_dense(nrow,ncol,d,xtype,c);
    \n+
    84 }
    \n+
    85
    \n+
    86 [[nodiscard]]
    \n+
    87 static cholmod_sparse* allocate_sparse(size_t nrow, size_t ncol, size_t nzmax, int sorted, int packed, int stype, int xtype, cholmod_common *c)
    \n+
    88 {
    \n+
    89 return ::cholmod_allocate_sparse(nrow,ncol,nzmax,sorted,packed,stype,xtype,c);
    \n+
    90 }
    \n+
    91
    \n+
    92 [[nodiscard]]
    \n+
    93 static cholmod_factor* analyze(cholmod_sparse *A, cholmod_common *c)
    \n+
    94 {
    \n+
    95 return ::cholmod_analyze(A,c);
    \n+
    96 }
    \n
    97
    \n-\n-
    99
    \n-
    100 public:
    \n-
    \n-\n-
    102 {}
    \n-
    \n-
    103
    \n-
    \n-
    104 void setMatrix(const Matrix& matrix)
    \n-
    105 {
    \n-
    106 matrix_=&matrix;
    \n-
    107 }
    \n-
    \n-
    \n-
    108 virtual void setMatrix(const Matrix& matrix, [[maybe_unused]] const AggregatesMap& amap)
    \n-
    109 {
    \n-
    110 setMatrix(matrix);
    \n-
    111 }
    \n-
    \n+
    98 static int defaults(cholmod_common *c)
    \n+
    99 {
    \n+
    100 return ::cholmod_defaults(c);
    \n+
    101 }
    \n+
    102
    \n+
    103 static int factorize(cholmod_sparse *A, cholmod_factor *L, cholmod_common *c)
    \n+
    104 {
    \n+
    105 return ::cholmod_factorize(A,L,c);
    \n+
    106 }
    \n+
    107
    \n+
    108 static int finish(cholmod_common *c)
    \n+
    109 {
    \n+
    110 return ::cholmod_finish(c);
    \n+
    111 }
    \n
    112
    \n-
    113
    \n-
    \n-
    114 const Matrix& getMatrix() const
    \n-
    115 {
    \n-
    116 return *matrix_;
    \n-
    117 }
    \n-
    \n-
    118
    \n-
    \n-
    119 void setArgs(const SmootherArgs& args)
    \n-
    120 {
    \n-
    121 args_=&args;
    \n-
    122 }
    \n-
    \n-
    123
    \n-
    124 template<class T1>
    \n-
    \n-
    125 void setComm([[maybe_unused]] T1& comm)
    \n-
    126 {}
    \n-
    \n+
    113 static int free_dense (cholmod_dense **X, cholmod_common *c)
    \n+
    114 {
    \n+
    115 return ::cholmod_free_dense(X,c);
    \n+
    116 }
    \n+
    117
    \n+
    118 static int free_factor(cholmod_factor **L, cholmod_common *c)
    \n+
    119 {
    \n+
    120 return ::cholmod_free_factor(L,c);
    \n+
    121 }
    \n+
    122
    \n+
    123 static int free_sparse(cholmod_sparse **A, cholmod_common *c)
    \n+
    124 {
    \n+
    125 return ::cholmod_free_sparse(A,c);
    \n+
    126 }
    \n
    127
    \n-
    \n-\n-
    129 {
    \n-
    130 return comm_;
    \n-
    131 }
    \n-
    \n-
    132
    \n-
    \n-
    133 const SmootherArgs getArgs() const
    \n-
    134 {
    \n-
    135 return *args_;
    \n-
    136 }
    \n-
    \n-
    137
    \n-
    138 protected:
    \n-
    139 const Matrix* matrix_;
    \n-
    140 private:
    \n-
    141 const SmootherArgs* args_;
    \n-\n-
    143 };
    \n-
    \n-
    144
    \n-
    145 template<class T>
    \n-
    \n-\n-
    147 : public DefaultConstructionArgs<T>
    \n-
    148 {};
    \n-
    \n+
    128 [[nodiscard]]
    \n+
    129 static cholmod_dense* solve(int sys, cholmod_factor *L, cholmod_dense *B, cholmod_common *c)
    \n+
    130 {
    \n+
    131 return ::cholmod_solve(sys,L,B,c);
    \n+
    132 }
    \n+
    133
    \n+
    134 static int start(cholmod_common *c)
    \n+
    135 {
    \n+
    136 return ::cholmod_start(c);
    \n+
    137 }
    \n+
    138 };
    \n+
    139
    \n+
    140 // specialization using 'SuiteSparse_long' to store indices
    \n+
    141 template <>
    \n+
    142 struct CholmodMethodChooser<SuiteSparse_long>
    \n+
    143 {
    \n+
    144 [[nodiscard]]
    \n+
    145 static cholmod_dense* allocate_dense(size_t nrow, size_t ncol, size_t d, int xtype, cholmod_common *c)
    \n+
    146 {
    \n+
    147 return ::cholmod_l_allocate_dense(nrow,ncol,d,xtype,c);
    \n+
    148 }
    \n
    149
    \n-
    150 template<class T, class C=SequentialInformation>
    \n-
    \n-\n-
    152 : public ConstructionArgs<T>
    \n-
    153 {
    \n-
    154 public:
    \n-
    \n-\n-
    156 {}
    \n-
    \n-
    157
    \n-
    \n-
    158 void setComm(const C& comm)
    \n-
    159 {
    \n-
    160 comm_ = &comm;
    \n-
    161 }
    \n-
    \n-
    162
    \n-
    \n-
    163 const C& getComm() const
    \n-
    164 {
    \n-
    165 return *comm_;
    \n-
    166 }
    \n-
    \n-
    167 private:
    \n-
    168 const C* comm_;
    \n-
    169 };
    \n-
    \n-
    170
    \n+
    150 [[nodiscard]]
    \n+
    151 static cholmod_sparse* allocate_sparse(size_t nrow, size_t ncol, size_t nzmax, int sorted, int packed, int stype, int xtype, cholmod_common *c)
    \n+
    152 {
    \n+
    153 return ::cholmod_l_allocate_sparse(nrow,ncol,nzmax,sorted,packed,stype,xtype,c);
    \n+
    154 }
    \n+
    155
    \n+
    156 [[nodiscard]]
    \n+
    157 static cholmod_factor* analyze(cholmod_sparse *A, cholmod_common *c)
    \n+
    158 {
    \n+
    159 return ::cholmod_l_analyze(A,c);
    \n+
    160 }
    \n+
    161
    \n+
    162 static int defaults(cholmod_common *c)
    \n+
    163 {
    \n+
    164 return ::cholmod_l_defaults(c);
    \n+
    165 }
    \n+
    166
    \n+
    167 static int factorize(cholmod_sparse *A, cholmod_factor *L, cholmod_common *c)
    \n+
    168 {
    \n+
    169 return ::cholmod_l_factorize(A,L,c);
    \n+
    170 }
    \n
    171
    \n-
    172 template<class X, class Y>
    \n-
    \n-\n-
    174 {
    \n-
    175 typedef Richardson<X,Y> T;
    \n+
    172 static int finish(cholmod_common *c)
    \n+
    173 {
    \n+
    174 return ::cholmod_l_finish(c);
    \n+
    175 }
    \n
    176
    \n-\n-
    178
    \n-
    179 public:
    \n-
    \n-\n-
    181 {}
    \n-
    \n-
    182
    \n-
    183 template <class... Args>
    \n-
    \n-
    184 void setMatrix(const Args&...)
    \n-
    185 {}
    \n-
    \n+
    177 static int free_dense (cholmod_dense **X, cholmod_common *c)
    \n+
    178 {
    \n+
    179 return ::cholmod_l_free_dense(X,c);
    \n+
    180 }
    \n+
    181
    \n+
    182 static int free_factor (cholmod_factor **L, cholmod_common *c)
    \n+
    183 {
    \n+
    184 return ::cholmod_l_free_factor(L,c);
    \n+
    185 }
    \n
    186
    \n-
    \n-
    187 void setArgs(const SmootherArgs& args)
    \n-
    188 {
    \n-
    189 args_=&args;
    \n-
    190 }
    \n-
    \n+
    187 static int free_sparse(cholmod_sparse **A, cholmod_common *c)
    \n+
    188 {
    \n+
    189 return ::cholmod_l_free_sparse(A,c);
    \n+
    190 }
    \n
    191
    \n-
    192 template<class T1>
    \n-
    \n-
    193 void setComm([[maybe_unused]] T1& comm)
    \n-
    194 {}
    \n-
    \n-
    195
    \n-
    \n-\n-
    197 {
    \n-
    198 return comm_;
    \n-
    199 }
    \n-
    \n-
    200
    \n-
    \n-
    201 const SmootherArgs getArgs() const
    \n-
    202 {
    \n-
    203 return *args_;
    \n-
    204 }
    \n-
    \n+
    192 [[nodiscard]]
    \n+
    193 static cholmod_dense* solve(int sys, cholmod_factor *L, cholmod_dense *B, cholmod_common *c)
    \n+
    194 {
    \n+
    195 return ::cholmod_l_solve(sys,L,B,c);
    \n+
    196 }
    \n+
    197
    \n+
    198 static int start(cholmod_common *c)
    \n+
    199 {
    \n+
    200 return ::cholmod_l_start(c);
    \n+
    201 }
    \n+
    202 };
    \n+
    203
    \n+
    204} //namespace Impl
    \n
    205
    \n-
    206 private:
    \n-
    207 const SmootherArgs* args_;
    \n-\n-
    209 };
    \n-
    \n-
    210
    \n-
    211
    \n-
    212
    \n-
    213 template<class T>
    \n-
    214 struct ConstructionTraits;
    \n-
    215
    \n-
    219 template<class M, class X, class Y, int l>
    \n-
    \n-
    220 struct ConstructionTraits<SeqSSOR<M,X,Y,l> >
    \n-
    221 {
    \n-\n+
    214template<class Vector, class Index=int>
    \n+
    \n+
    215class Cholmod : public InverseOperator<Vector, Vector>
    \n+
    216{
    \n+
    217 static_assert(std::is_same_v<Index,int> || std::is_same_v<Index,SuiteSparse_long>,
    \n+
    218 "Index type must be either 'int' or 'SuiteSparse_long'!");
    \n+
    219
    \n+
    220 using CholmodMethod = Impl::CholmodMethodChooser<Index>;
    \n+
    221
    \n+
    222public:
    \n
    223
    \n-
    \n-
    224 static inline std::shared_ptr<SeqSSOR<M,X,Y,l>> construct(Arguments& args)
    \n-
    225 {
    \n-
    226 return std::make_shared<SeqSSOR<M,X,Y,l>>
    \n-
    227 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
    \n-
    228 }
    \n-
    \n-
    229 };
    \n-
    \n-
    230
    \n-
    231
    \n-
    235 template<class M, class X, class Y, int l>
    \n-
    \n-
    236 struct ConstructionTraits<SeqSOR<M,X,Y,l> >
    \n-
    237 {
    \n-\n-
    239
    \n-
    \n-
    240 static inline std::shared_ptr<SeqSOR<M,X,Y,l>> construct(Arguments& args)
    \n-
    241 {
    \n-
    242 return std::make_shared<SeqSOR<M,X,Y,l>>
    \n-
    243 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
    \n-
    244 }
    \n-
    \n-
    245 };
    \n-
    \n-
    246
    \n-
    247
    \n-
    251 template<class M, class X, class Y, int l>
    \n-
    \n-
    252 struct ConstructionTraits<SeqJac<M,X,Y,l> >
    \n-
    253 {
    \n-\n-
    255
    \n-
    \n-
    256 static inline std::shared_ptr<SeqJac<M,X,Y,l>> construct(Arguments& args)
    \n-
    257 {
    \n-
    258 return std::make_shared<SeqJac<M,X,Y,l>>
    \n-
    259 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
    \n-
    260 }
    \n-
    \n-
    261 };
    \n-
    \n-
    262
    \n-
    266 template<class X, class Y>
    \n-
    \n-
    267 struct ConstructionTraits<Richardson<X,Y> >
    \n-
    268 {
    \n-\n+
    \n+\n+
    230 {
    \n+
    231 CholmodMethod::start(&c_);
    \n+
    232 }
    \n+
    \n+
    233
    \n+
    \n+\n+
    240 {
    \n+
    241 if (L_)
    \n+
    242 CholmodMethod::free_factor(&L_, &c_);
    \n+
    243 CholmodMethod::finish(&c_);
    \n+
    244 }
    \n+
    \n+
    245
    \n+
    246 // forbid copying to avoid freeing memory twice
    \n+
    247 Cholmod(const Cholmod&) = delete;
    \n+
    248 Cholmod& operator=(const Cholmod&) = delete;
    \n+
    249
    \n+
    250
    \n+
    \n+
    253 void apply (Vector& x, Vector& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
    \n+
    254 {
    \n+
    255 apply(x,b,res);
    \n+
    256 }
    \n+
    \n+
    257
    \n+
    \n+
    263 void apply(Vector& x, Vector& b, InverseOperatorResult& res)
    \n+
    264 {
    \n+
    265 // do nothing if N=0
    \n+
    266 if ( nIsZero_ )
    \n+
    267 {
    \n+
    268 return;
    \n+
    269 }
    \n
    270
    \n-
    \n-
    271 static inline std::shared_ptr<Richardson<X,Y>> construct(Arguments& args)
    \n-
    272 {
    \n-
    273 return std::make_shared<Richardson<X,Y>>
    \n-
    274 (args.getArgs().relaxationFactor);
    \n-
    275 }
    \n-
    \n-
    276 };
    \n-
    \n+
    271 if (x.size() != b.size())
    \n+
    272 DUNE_THROW(Exception, "Error in apply(): sizes of x and b do not match!");
    \n+
    273
    \n+
    274 // cast to double array
    \n+
    275 auto b2 = std::make_unique<double[]>(L_->n);
    \n+
    276 auto x2 = std::make_unique<double[]>(L_->n);
    \n
    277
    \n-
    278
    \n-
    279 template<class M, class X, class Y>
    \n-
    \n-\n-
    281 : public DefaultConstructionArgs<SeqILU<M,X,Y> >
    \n-
    282 {
    \n-
    283 public:
    \n-
    \n-\n-
    285 : n_(n)
    \n-
    286 {}
    \n-
    \n-
    287
    \n-
    \n-
    288 void setN(int n)
    \n-
    289 {
    \n-
    290 n_ = n;
    \n-
    291 }
    \n-
    \n-
    292
    \n-
    \n-
    293 int getN()
    \n-
    294 {
    \n-
    295 return n_;
    \n-
    296 }
    \n-
    \n-
    297
    \n-
    298 private:
    \n-
    299 int n_;
    \n-
    300 };
    \n-
    \n-
    301
    \n-
    302
    \n-
    306 template<class M, class X, class Y>
    \n-
    \n-
    307 struct ConstructionTraits<SeqILU<M,X,Y> >
    \n-
    308 {
    \n-\n-
    310
    \n-
    \n-
    311 static inline std::shared_ptr<SeqILU<M,X,Y>> construct(Arguments& args)
    \n-
    312 {
    \n-
    313 return std::make_shared<SeqILU<M,X,Y>>
    \n-
    314 (args.getMatrix(), args.getN(), args.getArgs().relaxationFactor);
    \n-
    315 }
    \n-
    \n-
    316 };
    \n-
    \n-
    317
    \n-
    321 template<class M, class X, class Y, class C>
    \n-
    \n-
    322 struct ConstructionTraits<ParSSOR<M,X,Y,C> >
    \n-
    323 {
    \n-\n-
    325
    \n-
    \n-
    326 static inline std::shared_ptr<ParSSOR<M,X,Y,C>> construct(Arguments& args)
    \n-
    327 {
    \n-
    328 return std::make_shared<ParSSOR<M,X,Y,C>>
    \n-
    329 (args.getMatrix(), args.getArgs().iterations,
    \n-
    330 args.getArgs().relaxationFactor, args.getComm());
    \n-
    331 }
    \n-
    \n-
    332 };
    \n-
    \n-
    333
    \n-
    334 template<class X, class Y, class C, class T>
    \n-
    \n-
    335 struct ConstructionTraits<BlockPreconditioner<X,Y,C,T> >
    \n-
    336 {
    \n-\n-
    338 typedef ConstructionTraits<T> SeqConstructionTraits;
    \n-
    \n-
    339 static inline std::shared_ptr<BlockPreconditioner<X,Y,C,T>> construct(Arguments& args)
    \n-
    340 {
    \n-
    341 auto seqPrec = SeqConstructionTraits::construct(args);
    \n-
    342 return std::make_shared<BlockPreconditioner<X,Y,C,T>> (seqPrec, args.getComm());
    \n-
    343 }
    \n-
    \n-
    344 };
    \n-
    \n-
    345
    \n-
    346 template<class C, class T>
    \n-
    \n-
    347 struct ConstructionTraits<NonoverlappingBlockPreconditioner<C,T> >
    \n-
    348 {
    \n-\n-
    350 typedef ConstructionTraits<T> SeqConstructionTraits;
    \n-
    \n-
    351 static inline std::shared_ptr<NonoverlappingBlockPreconditioner<C,T>> construct(Arguments& args)
    \n-
    352 {
    \n-
    353 auto seqPrec = SeqConstructionTraits::construct(args);
    \n-
    354 return std::make_shared<NonoverlappingBlockPreconditioner<C,T>> (seqPrec, args.getComm());
    \n-
    355 }
    \n-
    \n-
    356 };
    \n-
    \n-
    357
    \n-
    368 template<class T>
    \n-
    \n-\n-
    370 {
    \n-
    371 typedef T Smoother;
    \n-
    372 typedef typename Smoother::range_type Range;
    \n-
    373 typedef typename Smoother::domain_type Domain;
    \n-
    374
    \n-
    \n-
    382 static void preSmooth(Smoother& smoother, Domain& v, const Range& d)
    \n-
    383 {
    \n-
    384 smoother.apply(v,d);
    \n-
    385 }
    \n-
    \n-
    386
    \n-
    \n-
    394 static void postSmooth(Smoother& smoother, Domain& v, const Range& d)
    \n-
    395 {
    \n-
    396 smoother.apply(v,d);
    \n-
    397 }
    \n-
    \n-
    398 };
    \n-
    \n-
    399
    \n-
    405 template<typename LevelContext>
    \n-
    \n-
    406 void presmooth(LevelContext& levelContext, size_t steps)
    \n-
    407 {
    \n-
    408 for(std::size_t i=0; i < steps; ++i) {
    \n-
    409 *levelContext.lhs=0;
    \n-\n-
    411 ::preSmooth(*levelContext.smoother, *levelContext.lhs,
    \n-
    412 *levelContext.rhs);
    \n-
    413 // Accumulate update
    \n-
    414 *levelContext.update += *levelContext.lhs;
    \n-
    415
    \n-
    416 // update defect
    \n-
    417 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs, *levelContext.rhs);
    \n-
    418 levelContext.pinfo->project(*levelContext.rhs);
    \n-
    419 }
    \n-
    420 }
    \n-
    \n+
    278 // copy to cholmod
    \n+
    279 auto bp = b2.get();
    \n+
    280
    \n+
    281 flatVectorForEach(b, [&](auto&& entry, auto&& flatIndex){
    \n+
    282 if ( subIndices_.empty() )
    \n+
    283 bp[ flatIndex ] = entry;
    \n+
    284 else
    \n+
    285 if( subIndices_[ flatIndex ] != std::numeric_limits<std::size_t>::max() )
    \n+
    286 bp[ subIndices_[ flatIndex ] ] = entry;
    \n+
    287 });
    \n+
    288
    \n+
    289 // create a cholmod dense object
    \n+
    290 auto b3 = make_cholmod_dense(CholmodMethod::allocate_dense(L_->n, 1, L_->n, CHOLMOD_REAL, &c_), &c_);
    \n+
    291
    \n+
    292 // cast because void-ptr
    \n+
    293 auto b4 = static_cast<double*>(b3->x);
    \n+
    294 std::copy(b2.get(), b2.get() + L_->n, b4);
    \n+
    295
    \n+
    296 // solve for a cholmod x object
    \n+
    297 auto x3 = make_cholmod_dense(CholmodMethod::solve(CHOLMOD_A, L_, b3.get(), &c_), &c_);
    \n+
    298 // cast because void-ptr
    \n+
    299 auto xp = static_cast<double*>(x3->x);
    \n+
    300
    \n+
    301 // copy into x
    \n+
    302 flatVectorForEach(x, [&](auto&& entry, auto&& flatIndex){
    \n+
    303 if ( subIndices_.empty() )
    \n+
    304 entry = xp[ flatIndex ];
    \n+
    305 else
    \n+
    306 if( subIndices_[ flatIndex ] != std::numeric_limits<std::size_t>::max() )
    \n+
    307 entry = xp[ subIndices_[ flatIndex ] ];
    \n+
    308 });
    \n+
    309
    \n+
    310 // statistics for a direct solver
    \n+
    311 res.iterations = 1;
    \n+
    312 res.converged = true;
    \n+
    313 }
    \n+
    \n+
    314
    \n+
    315
    \n+
    321 template<class Matrix>
    \n+
    \n+
    322 void setMatrix(const Matrix& matrix)
    \n+
    323 {
    \n+
    324 const Impl::NoIgnore* noIgnore = nullptr;
    \n+
    325 setMatrix(matrix, noIgnore);
    \n+
    326 }
    \n+
    \n+
    327
    \n+
    342 template<class Matrix, class Ignore>
    \n+
    \n+
    343 void setMatrix(const Matrix& matrix, const Ignore* ignore)
    \n+
    344 {
    \n+
    345 // count the number of entries and diagonal entries
    \n+
    346 size_t nonZeros = 0;
    \n+
    347 size_t numberOfIgnoredDofs = 0;
    \n+
    348
    \n+
    349
    \n+
    350 auto [flatRows,flatCols] = flatMatrixForEach( matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&& flatColIndex){
    \n+
    351 if( flatRowIndex <= flatColIndex )
    \n+
    352 nonZeros++;
    \n+
    353 });
    \n+
    354
    \n+
    355 std::vector<bool> flatIgnore;
    \n+
    356
    \n+
    357 if ( ignore )
    \n+
    358 {
    \n+
    359 Impl::copyToFlatVector(*ignore,flatIgnore);
    \n+
    360 numberOfIgnoredDofs = std::count(flatIgnore.begin(),flatIgnore.end(),true);
    \n+
    361 }
    \n+
    362
    \n+
    363 nIsZero_ = (size_t(flatRows) <= numberOfIgnoredDofs);
    \n+
    364
    \n+
    365 if ( nIsZero_ )
    \n+
    366 {
    \n+
    367 return;
    \n+
    368 }
    \n+
    369
    \n+
    370 // Total number of rows
    \n+
    371 size_t N = flatRows - numberOfIgnoredDofs;
    \n+
    372
    \n+
    373 /*
    \n+
    374 * CHOLMOD uses compressed-column sparse matrices, but for symmetric
    \n+
    375 * matrices this is the same as the compressed-row sparse matrix used
    \n+
    376 * by DUNE. So we can just store M\u1d40 instead of M (as M = M\u1d40).
    \n+
    377 */
    \n+
    378 const auto deleter = [c = &this->c_](auto* p) {
    \n+
    379 CholmodMethod::free_sparse(&p, c);
    \n+
    380 };
    \n+
    381 auto M = std::unique_ptr<cholmod_sparse, decltype(deleter)>(
    \n+
    382 CholmodMethod::allocate_sparse(N, // # rows
    \n+
    383 N, // # cols
    \n+
    384 nonZeros, // # of nonzeroes
    \n+
    385 1, // indices are sorted ( 1 = true)
    \n+
    386 1, // matrix is "packed" ( 1 = true)
    \n+
    387 -1, // stype of matrix ( -1 = consider the lower part only )
    \n+
    388 CHOLMOD_REAL, // xtype of matrix ( CHOLMOD_REAL = single array, no complex numbers)
    \n+
    389 &c_ // cholmod_common ptr
    \n+
    390 ), deleter);
    \n+
    391
    \n+
    392 // copy the data of BCRS matrix to Cholmod Sparse matrix
    \n+
    393 Index* Ap = static_cast<Index*>(M->p);
    \n+
    394 Index* Ai = static_cast<Index*>(M->i);
    \n+
    395 double* Ax = static_cast<double*>(M->x);
    \n+
    396
    \n+
    397
    \n+
    398 if ( ignore )
    \n+
    399 {
    \n+
    400 // init the mapping
    \n+
    401 subIndices_.resize(flatRows,std::numeric_limits<std::size_t>::max());
    \n+
    402
    \n+
    403 std::size_t subIndexCounter = 0;
    \n+
    404
    \n+
    405 for ( std::size_t i=0; i<flatRows; i++ )
    \n+
    406 {
    \n+
    407 if ( not flatIgnore[ i ] )
    \n+
    408 {
    \n+
    409 subIndices_[ i ] = subIndexCounter++;
    \n+
    410 }
    \n+
    411 }
    \n+
    412 }
    \n+
    413
    \n+
    414 // at first, we need to compute the row starts "Ap"
    \n+
    415 // therefore, we count all (not ignored) entries in each row and in the end we accumulate everything
    \n+
    416 flatMatrixForEach(matrix, [&](auto&& /*entry*/, auto&& flatRowIndex, auto&& flatColIndex){
    \n+
    417
    \n+
    418 // stop if ignored
    \n+
    419 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) )
    \n+
    420 return;
    \n
    421
    \n-
    427 template<typename LevelContext>
    \n-
    \n-
    428 void postsmooth(LevelContext& levelContext, size_t steps)
    \n-
    429 {
    \n-
    430 for(std::size_t i=0; i < steps; ++i) {
    \n-
    431 // update defect
    \n-
    432 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs,
    \n-
    433 *levelContext.rhs);
    \n-
    434 *levelContext.lhs=0;
    \n-
    435 levelContext.pinfo->project(*levelContext.rhs);
    \n-\n-
    437 ::postSmooth(*levelContext.smoother, *levelContext.lhs, *levelContext.rhs);
    \n-
    438 // Accumulate update
    \n-
    439 *levelContext.update += *levelContext.lhs;
    \n-
    440 }
    \n-
    441 }
    \n-
    \n-
    442
    \n-
    443 template<class M, class X, class Y, int l>
    \n-
    \n-
    444 struct SmootherApplier<SeqSOR<M,X,Y,l> >
    \n-
    445 {
    \n-\n-
    447 typedef typename Smoother::range_type Range;
    \n-\n-
    449
    \n-
    \n-
    450 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
    \n-
    451 {
    \n-
    452 smoother.template apply<true>(v,d);
    \n-
    453 }
    \n-
    \n-
    454
    \n-
    455
    \n-
    \n-
    456 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
    \n-
    457 {
    \n-
    458 smoother.template apply<false>(v,d);
    \n-
    459 }
    \n-
    \n-
    460 };
    \n-
    \n+
    422 // stop if in lower half
    \n+
    423 if ( flatRowIndex > flatColIndex )
    \n+
    424 return;
    \n+
    425
    \n+
    426 // ok, count the entry
    \n+
    427 auto idx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;
    \n+
    428 Ap[idx+1]++;
    \n+
    429
    \n+
    430 });
    \n+
    431
    \n+
    432 // now accumulate
    \n+
    433 Ap[0] = 0;
    \n+
    434 for ( size_t i=0; i<N; i++ )
    \n+
    435 {
    \n+
    436 Ap[i+1] += Ap[i];
    \n+
    437 }
    \n+
    438
    \n+
    439 // we need a compressed row position counter
    \n+
    440 std::vector<std::size_t> rowPosition(N,0);
    \n+
    441
    \n+
    442 // now we can set the entries
    \n+
    443 flatMatrixForEach(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&& flatColIndex){
    \n+
    444
    \n+
    445 // stop if ignored
    \n+
    446 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) )
    \n+
    447 return;
    \n+
    448
    \n+
    449 // stop if in lower half
    \n+
    450 if ( flatRowIndex > flatColIndex )
    \n+
    451 return;
    \n+
    452
    \n+
    453 // ok, set the entry
    \n+
    454 auto rowIdx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;
    \n+
    455 auto colIdx = ignore ? subIndices_[flatColIndex] : flatColIndex;
    \n+
    456 auto rowStart = Ap[rowIdx];
    \n+
    457 auto rowPos = rowPosition[rowIdx];
    \n+
    458 Ai[ rowStart + rowPos ] = colIdx;
    \n+
    459 Ax[ rowStart + rowPos ] = entry;
    \n+
    460 rowPosition[rowIdx]++;
    \n
    461
    \n-
    462 template<class M, class X, class Y, class C, int l>
    \n-
    \n-\n-
    464 {
    \n-\n-
    466 typedef typename Smoother::range_type Range;
    \n-\n-
    468
    \n-
    \n-
    469 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
    \n-
    470 {
    \n-
    471 smoother.template apply<true>(v,d);
    \n-
    472 }
    \n-
    \n-
    473
    \n-
    474
    \n-
    \n-
    475 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
    \n-
    476 {
    \n-
    477 smoother.template apply<false>(v,d);
    \n-
    478 }
    \n-
    \n-
    479 };
    \n-
    \n-
    480
    \n-
    481 template<class M, class X, class Y, class C, int l>
    \n-
    \n-\n-
    483 {
    \n-\n-
    485 typedef typename Smoother::range_type Range;
    \n-\n-
    487
    \n-
    \n-
    488 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
    \n-
    489 {
    \n-
    490 smoother.template apply<true>(v,d);
    \n-
    491 }
    \n-
    \n-
    492
    \n-
    493
    \n-
    \n-
    494 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
    \n-
    495 {
    \n-
    496 smoother.template apply<false>(v,d);
    \n-
    497 }
    \n-
    \n-
    498 };
    \n-
    \n-
    499
    \n-
    500 } // end namespace Amg
    \n-
    501
    \n-
    502 // forward declarations
    \n-
    503 template<class M, class X, class MO, class MS, class A>
    \n-
    504 class SeqOverlappingSchwarz;
    \n-
    505
    \n-
    506 struct MultiplicativeSchwarzMode;
    \n-
    507
    \n-
    508 namespace Amg
    \n-
    509 {
    \n-
    510 template<class M, class X, class MS, class TA>
    \n-
    \n-\n-
    512 MS,TA> >
    \n-
    513 {
    \n-\n-
    515 typedef typename Smoother::range_type Range;
    \n-\n-
    517
    \n-
    \n-
    518 static void preSmooth(Smoother& smoother, Domain& v, const Range& d)
    \n-
    519 {
    \n-
    520 smoother.template apply<true>(v,d);
    \n-
    521 }
    \n-
    \n+
    462 });
    \n+
    463
    \n+
    464 // Now analyse the pattern and optimal row order
    \n+
    465 L_ = CholmodMethod::analyze(M.get(), &c_);
    \n+
    466
    \n+
    467 // Do the factorization (this may take some time)
    \n+
    468 CholmodMethod::factorize(M.get(), L_, &c_);
    \n+
    469 }
    \n+
    \n+
    470
    \n+
    \n+\n+
    472 {
    \n+\n+
    474 }
    \n+
    \n+
    475
    \n+
    \n+
    481 cholmod_common& cholmodCommonObject()
    \n+
    482 {
    \n+
    483 return c_;
    \n+
    484 }
    \n+
    \n+
    485
    \n+
    \n+
    491 cholmod_factor& cholmodFactor()
    \n+
    492 {
    \n+
    493 return *L_;
    \n+
    494 }
    \n+
    \n+
    495
    \n+
    \n+
    501 const cholmod_factor& cholmodFactor() const
    \n+
    502 {
    \n+
    503 return *L_;
    \n+
    504 }
    \n+
    \n+
    505private:
    \n+
    506
    \n+
    507 // create a std::unique_ptr to a cholmod_dense object with a deleter
    \n+
    508 // that calls the appropriate cholmod cleanup routine
    \n+
    509 auto make_cholmod_dense(cholmod_dense* x, cholmod_common* c)
    \n+
    510 {
    \n+
    511 const auto deleter = [c](auto* p) {
    \n+
    512 CholmodMethod::free_dense(&p, c);
    \n+
    513 };
    \n+
    514 return std::unique_ptr<cholmod_dense, decltype(deleter)>(x, deleter);
    \n+
    515 }
    \n+
    516
    \n+
    517 cholmod_common c_;
    \n+
    518 cholmod_factor* L_ = nullptr;
    \n+
    519
    \n+
    520 // indicator for a 0x0 problem (due to ignore dof's)
    \n+
    521 bool nIsZero_ = false;
    \n
    522
    \n-
    523
    \n-
    \n-
    524 static void postSmooth(Smoother& smoother, Domain& v, const Range& d)
    \n-
    525 {
    \n-
    526 smoother.template apply<false>(v,d);
    \n-
    527
    \n-
    528 }
    \n-
    \n-
    529 };
    \n-
    \n-
    530
    \n-
    531 // template<class M, class X, class TM, class TA>
    \n-
    532 // class SeqOverlappingSchwarz;
    \n-
    533
    \n-
    534 template<class T>
    \n-
    \n-\n-
    536 : public DefaultSmootherArgs<T>
    \n-
    537 {
    \n-\n-
    539
    \n-\n-\n-
    542
    \n-
    \n-\n-
    544 bool onthefly_=false)
    \n-
    545 : overlap(overlap_), onthefly(onthefly_)
    \n-
    546 {}
    \n-
    \n-
    547 };
    \n-
    \n-
    548
    \n-
    549 template<class M, class X, class TM, class TS, class TA>
    \n-\n-
    554
    \n-
    555 template<class M, class X, class TM, class TS, class TA>
    \n-
    \n-\n-
    557 : public DefaultConstructionArgs<SeqOverlappingSchwarz<M,X,TM,TS,TA> >
    \n-
    558 {
    \n-\n-
    560
    \n-
    561 public:
    \n-\n-\n-\n-\n-
    566 typedef typename Vector::value_type Subdomain;
    \n-
    567
    \n-
    \n-
    568 virtual void setMatrix(const M& matrix, const AggregatesMap& amap)
    \n-
    569 {
    \n-
    570 Father::setMatrix(matrix);
    \n-
    571
    \n-
    572 std::vector<bool> visited(amap.noVertices(), false);
    \n-
    573 typedef IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap> VisitedMapType;
    \n-
    574 VisitedMapType visitedMap(visited.begin());
    \n-
    575
    \n-
    576 MatrixGraph<const M> graph(matrix);
    \n-
    577
    \n-\n-
    579
    \n-
    580 switch(Father::getArgs().overlap) {
    \n-
    581 case SmootherArgs::vertex :
    \n-
    582 {
    \n-
    583 VertexAdder visitor(subdomains, amap);
    \n-
    584 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n-
    585 }
    \n-
    586 break;
    \n-
    587 case SmootherArgs::pairwise :
    \n-
    588 {
    \n-
    589 createPairDomains(graph);
    \n-
    590 }
    \n-
    591 break;
    \n-
    592 case SmootherArgs::aggregate :
    \n-
    593 {
    \n-
    594 AggregateAdder<VisitedMapType> visitor(subdomains, amap, graph, visitedMap);
    \n-
    595 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n-
    596 }
    \n-
    597 break;
    \n-
    598 case SmootherArgs::none :
    \n-
    599 NoneAdder visitor;
    \n-
    600 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n-
    601 break;
    \n-
    602 default :
    \n-
    603 DUNE_THROW(NotImplemented, "This overlapping scheme is not supported!");
    \n-
    604 }
    \n-
    605 }
    \n-
    \n-
    \n-
    606 void setMatrix(const M& matrix)
    \n-
    607 {
    \n-
    608 Father::setMatrix(matrix);
    \n-
    609
    \n-
    610 /* Create aggregates map where each aggregate is just one vertex. */
    \n-
    611 AggregatesMap amap(matrix.N());
    \n-\n-
    613 for(typename AggregatesMap::iterator iter=amap.begin();
    \n-
    614 iter!=amap.end(); ++iter)
    \n-
    615 *iter=v++;
    \n-
    616
    \n-
    617 std::vector<bool> visited(amap.noVertices(), false);
    \n-
    618 typedef IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap> VisitedMapType;
    \n-
    619 VisitedMapType visitedMap(visited.begin());
    \n-
    620
    \n-
    621 MatrixGraph<const M> graph(matrix);
    \n-
    622
    \n-\n-
    624
    \n-
    625 switch(Father::getArgs().overlap) {
    \n-
    626 case SmootherArgs::vertex :
    \n-
    627 {
    \n-
    628 VertexAdder visitor(subdomains, amap);
    \n-
    629 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n-
    630 }
    \n-
    631 break;
    \n-
    632 case SmootherArgs::aggregate :
    \n-
    633 {
    \n-
    634 DUNE_THROW(NotImplemented, "Aggregate overlap is not supported yet");
    \n-
    635 /*
    \n-
    636 AggregateAdder<VisitedMapType> visitor(subdomains, amap, graph, visitedMap);
    \n-
    637 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n-
    638 */
    \n-
    639 }
    \n-
    640 break;
    \n-
    641 case SmootherArgs::pairwise :
    \n-
    642 {
    \n-
    643 createPairDomains(graph);
    \n-
    644 }
    \n-
    645 break;
    \n-
    646 case SmootherArgs::none :
    \n-
    647 NoneAdder visitor;
    \n-
    648 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n-
    649
    \n-
    650 }
    \n-
    651 }
    \n-
    \n-
    652
    \n-
    \n-\n-
    654 {
    \n-
    655 return subdomains;
    \n-
    656 }
    \n-
    \n-
    657
    \n-
    658 private:
    \n-
    659 struct VertexAdder
    \n-
    660 {
    \n-
    \n-
    661 VertexAdder(Vector& subdomains_, const AggregatesMap& aggregates_)
    \n-
    662 : subdomains(subdomains_), max(-1), subdomain(-1), aggregates(aggregates_)
    \n-
    663 {}
    \n-
    \n-
    664 template<class T>
    \n-
    \n-
    665 void operator()(const T& edge)
    \n-
    666 {
    \n-
    667 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED)
    \n-
    668 subdomains[subdomain].insert(edge.target());
    \n-
    669 }
    \n-
    \n-
    \n-
    670 int setAggregate(const AggregateDescriptor& aggregate_)
    \n-
    671 {
    \n-
    672 subdomain=aggregate_;
    \n-
    673 max = std::max(subdomain, aggregate_);
    \n-
    674 return subdomain;
    \n-
    675 }
    \n-
    \n-
    \n-
    676 int noSubdomains() const
    \n-
    677 {
    \n-
    678 return max+1;
    \n-
    679 }
    \n-
    \n-
    680 private:
    \n-
    681 Vector& subdomains;
    \n-\n-
    683 AggregateDescriptor subdomain;
    \n-
    684 const AggregatesMap& aggregates;
    \n-
    685 };
    \n-
    686 struct NoneAdder
    \n-
    687 {
    \n-
    688 template<class T>
    \n-
    \n-
    689 void operator()(const T& edge)
    \n-
    690 {}
    \n-
    \n-
    \n-
    691 int setAggregate(const AggregateDescriptor& aggregate_)
    \n-
    692 {
    \n-
    693 return -1;
    \n-
    694 }
    \n-
    \n-
    \n-
    695 int noSubdomains() const
    \n-
    696 {
    \n-
    697 return -1;
    \n-
    698 }
    \n-
    \n-
    699 };
    \n-
    700
    \n-
    701 template<class VM>
    \n-
    702 struct AggregateAdder
    \n-
    703 {
    \n-
    \n-
    704 AggregateAdder(Vector& subdomains_, const AggregatesMap& aggregates_,
    \n-
    705 const MatrixGraph<const M>& graph_, VM& visitedMap_)
    \n-
    706 : subdomains(subdomains_), subdomain(-1), aggregates(aggregates_),
    \n-
    707 adder(subdomains_, aggregates_), graph(graph_), visitedMap(visitedMap_)
    \n-
    708 {}
    \n-
    \n-
    709 template<class T>
    \n-
    \n-
    710 void operator()(const T& edge)
    \n-
    711 {
    \n-
    712 subdomains[subdomain].insert(edge.target());
    \n-
    713 // If we (the neighbouring vertex of the aggregate)
    \n-
    714 // are not isolated, add the aggregate we belong to
    \n-
    715 // to the same subdomain using the OneOverlapAdder
    \n-
    716 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED) {
    \n-
    717 assert(aggregates[edge.target()]!=aggregate);
    \n-
    718 typename AggregatesMap::VertexList vlist;
    \n-
    719 aggregates.template breadthFirstSearch<true,false>(edge.target(), aggregate,
    \n-
    720 graph, vlist, adder, adder,
    \n-
    721 visitedMap);
    \n-
    722 }
    \n-
    723 }
    \n-
    \n-
    724
    \n-
    \n-
    725 int setAggregate(const AggregateDescriptor& aggregate_)
    \n-
    726 {
    \n-
    727 adder.setAggregate(aggregate_);
    \n-
    728 aggregate=aggregate_;
    \n-
    729 return ++subdomain;
    \n-
    730 }
    \n-
    \n-
    \n-
    731 int noSubdomains() const
    \n-
    732 {
    \n-
    733 return subdomain+1;
    \n-
    734 }
    \n-
    \n-
    735
    \n-
    736 private:
    \n-
    737 AggregateDescriptor aggregate;
    \n-
    738 Vector& subdomains;
    \n-
    739 int subdomain;
    \n-
    740 const AggregatesMap& aggregates;
    \n-
    741 VertexAdder adder;
    \n-
    742 const MatrixGraph<const M>& graph;
    \n-
    743 VM& visitedMap;
    \n-
    744 };
    \n-
    745
    \n-
    746 void createPairDomains(const MatrixGraph<const M>& graph)
    \n-
    747 {
    \n-
    748 typedef typename MatrixGraph<const M>::ConstVertexIterator VIter;
    \n-
    749 typedef typename MatrixGraph<const M>::ConstEdgeIterator EIter;
    \n-
    750 typedef typename M::size_type size_type;
    \n-
    751
    \n-
    752 std::set<std::pair<size_type,size_type> > pairs;
    \n-
    753 int total=0;
    \n-
    754 for(VIter v=graph.begin(), ve=graph.end(); ve != v; ++v)
    \n-
    755 for(EIter e = v.begin(), ee=v.end(); ee!=e; ++e)
    \n-
    756 {
    \n-
    757 ++total;
    \n-
    758 if(e.source()<e.target())
    \n-
    759 pairs.insert(std::make_pair(e.source(),e.target()));
    \n-
    760 else
    \n-
    761 pairs.insert(std::make_pair(e.target(),e.source()));
    \n-
    762 }
    \n-
    763
    \n-
    764
    \n-
    765 subdomains.resize(pairs.size());
    \n-
    766 Dune::dinfo <<std::endl<< "Created "<<pairs.size()<<" ("<<total<<") pair domains"<<std::endl<<std::endl;
    \n-
    767 typedef typename std::set<std::pair<size_type,size_type> >::const_iterator SIter;
    \n-
    768 typename Vector::iterator subdomain=subdomains.begin();
    \n-
    769
    \n-
    770 for(SIter s=pairs.begin(), se =pairs.end(); se!=s; ++s)
    \n-
    771 {
    \n-
    772 subdomain->insert(s->first);
    \n-
    773 subdomain->insert(s->second);
    \n-
    774 ++subdomain;
    \n-
    775 }
    \n-
    776 std::size_t minsize=10000;
    \n-
    777 std::size_t maxsize=0;
    \n-
    778 int sum=0;
    \n-
    779 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {
    \n-
    780 sum+=subdomains[i].size();
    \n-
    781 minsize=std::min(minsize, subdomains[i].size());
    \n-
    782 maxsize=std::max(maxsize, subdomains[i].size());
    \n-
    783 }
    \n-
    784 Dune::dinfo<<"Subdomain size: min="<<minsize<<" max="<<maxsize<<" avg="<<(sum/subdomains.size())
    \n-
    785 <<" no="<<subdomains.size()<<std::endl;
    \n-
    786 }
    \n-
    787
    \n-
    788 template<class Visitor>
    \n-
    789 void createSubdomains(const M& matrix, const MatrixGraph<const M>& graph,
    \n-
    790 const AggregatesMap& amap, Visitor& overlapVisitor,
    \n-
    791 IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap>& visitedMap )
    \n-
    792 {
    \n-
    793 // count number ag aggregates. We assume that the
    \n-
    794 // aggregates are numbered consecutively from 0 except
    \n-
    795 // for the isolated ones. All isolated vertices form
    \n-
    796 // one aggregate, here.
    \n-
    797 int isolated=0;
    \n-
    798 AggregateDescriptor maxAggregate=0;
    \n-
    799
    \n-
    800 for(std::size_t i=0; i < amap.noVertices(); ++i)
    \n-
    801 if(amap[i]==AggregatesMap::ISOLATED)
    \n-
    802 isolated++;
    \n-
    803 else
    \n-
    804 maxAggregate = std::max(maxAggregate, amap[i]);
    \n-
    805
    \n-
    806 subdomains.resize(maxAggregate+1+isolated);
    \n-
    807
    \n-
    808 // reset the subdomains
    \n-
    809 for(typename Vector::size_type i=0; i < subdomains.size(); ++i)
    \n-
    810 subdomains[i].clear();
    \n-
    811
    \n-
    812 // Create the subdomains from the aggregates mapping.
    \n-
    813 // For each aggregate we mark all entries and the
    \n-
    814 // neighbouring vertices as belonging to the same subdomain
    \n-
    815 VertexAdder aggregateVisitor(subdomains, amap);
    \n-
    816
    \n-
    817 for(VertexDescriptor i=0; i < amap.noVertices(); ++i)
    \n-
    818 if(!get(visitedMap, i)) {
    \n-
    819 AggregateDescriptor aggregate=amap[i];
    \n-
    820
    \n-
    821 if(amap[i]==AggregatesMap::ISOLATED) {
    \n-
    822 // isolated vertex gets its own aggregate
    \n-
    823 subdomains.push_back(Subdomain());
    \n-
    824 aggregate=subdomains.size()-1;
    \n-
    825 }
    \n-
    826 overlapVisitor.setAggregate(aggregate);
    \n-
    827 aggregateVisitor.setAggregate(aggregate);
    \n-
    828 subdomains[aggregate].insert(i);
    \n-
    829 typename AggregatesMap::VertexList vlist;
    \n-
    830 amap.template breadthFirstSearch<false,false>(i, aggregate, graph, vlist, aggregateVisitor,
    \n-
    831 overlapVisitor, visitedMap);
    \n-
    832 }
    \n-
    833
    \n-
    834 std::size_t minsize=10000;
    \n-
    835 std::size_t maxsize=0;
    \n-
    836 int sum=0;
    \n-
    837 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {
    \n-
    838 sum+=subdomains[i].size();
    \n-
    839 minsize=std::min(minsize, subdomains[i].size());
    \n-
    840 maxsize=std::max(maxsize, subdomains[i].size());
    \n-
    841 }
    \n-
    842 Dune::dinfo<<"Subdomain size: min="<<minsize<<" max="<<maxsize<<" avg="<<(sum/subdomains.size())
    \n-
    843 <<" no="<<subdomains.size()<<" isolated="<<isolated<<std::endl;
    \n-
    844
    \n-
    845
    \n-
    846
    \n-
    847 }
    \n-
    848 Vector subdomains;
    \n-
    849 };
    \n-
    \n-
    850
    \n-
    851
    \n-
    852 template<class M, class X, class TM, class TS, class TA>
    \n-
    \n-
    853 struct ConstructionTraits<SeqOverlappingSchwarz<M,X,TM,TS,TA> >
    \n-
    854 {
    \n-\n-
    856
    \n-
    \n-
    857 static inline std::shared_ptr<SeqOverlappingSchwarz<M,X,TM,TS,TA>> construct(Arguments& args)
    \n-
    858 {
    \n-
    859 return std::make_shared<SeqOverlappingSchwarz<M,X,TM,TS,TA>>
    \n-
    860 (args.getMatrix(),
    \n-
    861 args.getSubDomains(),
    \n-\n-
    863 args.getArgs().onthefly);
    \n-
    864 }
    \n-
    \n-
    865 };
    \n-
    \n-
    866
    \n-
    867
    \n-
    868 } // namespace Amg
    \n-
    869} // namespace Dune
    \n-
    870
    \n-
    871
    \n-
    872
    \n-
    873#endif
    \n-\n-\n-
    Define general preconditioner interface.
    \n-
    Helper classes for the construction of classes without empty constructor.
    \n-
    Provides classes for the Coloring process of AMG.
    \n-
    DefaultSmootherArgs< typename X::field_type > Arguments
    Definition smoother.hh:74
    \n-
    static void postSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:494
    \n-\n-
    static void preSmooth(Smoother &smoother, Domain &v, const Range &d)
    Definition smoother.hh:518
    \n-
    static std::shared_ptr< SeqJac< M, X, Y, l > > construct(Arguments &args)
    Definition smoother.hh:256
    \n-
    ConstructionArgs< SeqILU< M, X, Y > > Arguments
    Definition smoother.hh:309
    \n-
    const Matrix & getMatrix() const
    Definition smoother.hh:114
    \n-\n-
    int setAggregate(const AggregateDescriptor &aggregate_)
    Definition smoother.hh:691
    \n-
    DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments
    Definition smoother.hh:67
    \n-
    int setAggregate(const AggregateDescriptor &aggregate_)
    Definition smoother.hh:670
    \n-
    ConstructionTraits< T > SeqConstructionTraits
    Definition smoother.hh:350
    \n-
    void setArgs(const SmootherArgs &args)
    Definition smoother.hh:119
    \n-
    ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Arguments
    Definition smoother.hh:855
    \n-
    NonoverlappingBlockPreconditioner< C, SeqSOR< M, X, Y, l > > Smoother
    Definition smoother.hh:484
    \n-
    static void postSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:456
    \n-
    AggregateAdder(Vector &subdomains_, const AggregatesMap &aggregates_, const MatrixGraph< const M > &graph_, VM &visitedMap_)
    Definition smoother.hh:704
    \n-\n-
    void setComm(const C &comm)
    Definition smoother.hh:158
    \n-
    DefaultConstructionArgs< Richardson< X, Y > > Arguments
    Definition smoother.hh:269
    \n-
    virtual ~DefaultConstructionArgs()
    Definition smoother.hh:180
    \n-
    SeqOverlappingSchwarzSmootherArgs< typename M::field_type > Arguments
    Definition smoother.hh:552
    \n-\n-
    static void preSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:488
    \n-
    int getN()
    Definition smoother.hh:293
    \n-\n-
    SeqSOR< M, X, Y, l > Smoother
    Definition smoother.hh:446
    \n-\n-
    static std::shared_ptr< SeqSSOR< M, X, Y, l > > construct(Arguments &args)
    Definition smoother.hh:224
    \n-
    AggregatesMap::AggregateDescriptor AggregateDescriptor
    Definition smoother.hh:564
    \n-
    bool onthefly
    Definition smoother.hh:541
    \n-
    DefaultConstructionArgs< SeqSOR< M, X, Y, l > > Arguments
    Definition smoother.hh:238
    \n-
    virtual void setMatrix(const M &matrix, const AggregatesMap &amap)
    Definition smoother.hh:568
    \n-
    void setMatrix(const Args &...)
    Definition smoother.hh:184
    \n-
    DefaultConstructionArgs< SeqJac< M, X, Y, l > > Arguments
    Definition smoother.hh:254
    \n-
    DefaultConstructionArgs< SeqSSOR< M, X, Y, l > > Arguments
    Definition smoother.hh:222
    \n-
    const SmootherArgs getArgs() const
    Definition smoother.hh:133
    \n-
    VertexAdder(Vector &subdomains_, const AggregatesMap &aggregates_)
    Definition smoother.hh:661
    \n-\n-
    SeqOverlappingSchwarz< M, X, TM, TS, TA >::subdomain_vector Vector
    Definition smoother.hh:565
    \n-
    static std::shared_ptr< SeqOverlappingSchwarz< M, X, TM, TS, TA > > construct(Arguments &args)
    Definition smoother.hh:857
    \n-
    static void preSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:469
    \n-
    const_iterator begin() const
    Definition aggregates.hh:725
    \n-
    void setMatrix(const Matrix &matrix)
    Definition smoother.hh:104
    \n-
    T Smoother
    Definition smoother.hh:371
    \n-
    static void preSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:450
    \n-
    BlockPreconditioner< X, Y, C, SeqSOR< M, X, Y, l > > Smoother
    Definition smoother.hh:465
    \n-
    void setComm(T1 &comm)
    Definition smoother.hh:193
    \n-\n-
    AggregateDescriptor * iterator
    Definition aggregates.hh:735
    \n-
    void presmooth(LevelContext &levelContext, size_t steps)
    Apply pre smoothing on the current level.
    Definition smoother.hh:406
    \n-\n-
    SeqOverlappingSchwarzSmootherArgs(Overlap overlap_=vertex, bool onthefly_=false)
    Definition smoother.hh:543
    \n-
    DefaultParallelConstructionArgs< T, C > Arguments
    Definition smoother.hh:337
    \n-
    DefaultParallelConstructionArgs< T, C > Arguments
    Definition smoother.hh:349
    \n-
    const Matrix * matrix_
    Definition smoother.hh:139
    \n-
    const_iterator end() const
    Definition aggregates.hh:730
    \n-
    const SequentialInformation & getComm()
    Definition smoother.hh:128
    \n-
    V AggregateDescriptor
    The aggregate descriptor type.
    Definition aggregates.hh:580
    \n-
    static const V ISOLATED
    Identifier of isolated vertices.
    Definition aggregates.hh:571
    \n-
    DefaultSmootherArgs()
    Default constructor.
    Definition smoother.hh:56
    \n-
    void setMatrix(const M &matrix)
    Definition smoother.hh:606
    \n-
    std::size_t noVertices() const
    Get the number of vertices.
    \n-\n-
    static void postSmooth(Smoother &smoother, Domain &v, const Range &d)
    apply post smoothing in forward direction
    Definition smoother.hh:394
    \n-
    FieldTraits< T >::real_type RelaxationFactor
    The type of the relaxation factor.
    Definition smoother.hh:42
    \n-\n-
    Smoother::domain_type Domain
    Definition smoother.hh:373
    \n-
    void setN(int n)
    Definition smoother.hh:288
    \n-
    static std::shared_ptr< BlockPreconditioner< X, Y, C, T > > construct(Arguments &args)
    Definition smoother.hh:339
    \n-
    SLList< VertexDescriptor, Allocator > VertexList
    The type of a single linked list of vertex descriptors.
    Definition aggregates.hh:592
    \n-
    static std::shared_ptr< NonoverlappingBlockPreconditioner< C, T > > construct(Arguments &args)
    Definition smoother.hh:351
    \n-
    SeqOverlappingSchwarz< M, X, MultiplicativeSchwarzMode, MS, TA > Smoother
    Definition smoother.hh:514
    \n-
    static std::shared_ptr< ParSSOR< M, X, Y, C > > construct(Arguments &args)
    Definition smoother.hh:326
    \n-
    MatrixGraph< M >::VertexDescriptor VertexDescriptor
    Definition smoother.hh:562
    \n-
    static std::shared_ptr< SeqILU< M, X, Y > > construct(Arguments &args)
    Definition smoother.hh:311
    \n-\n-
    const SequentialInformation & getComm()
    Definition smoother.hh:196
    \n-
    static std::shared_ptr< SeqSOR< M, X, Y, l > > construct(Arguments &args)
    Definition smoother.hh:240
    \n-
    static std::shared_ptr< Richardson< X, Y > > construct(Arguments &args)
    Definition smoother.hh:271
    \n-
    virtual void setMatrix(const Matrix &matrix, const AggregatesMap &amap)
    Definition smoother.hh:108
    \n-\n-
    void postsmooth(LevelContext &levelContext, size_t steps)
    Apply post smoothing on the current level.
    Definition smoother.hh:428
    \n-
    Dune::Amg::AggregatesMap< VertexDescriptor > AggregatesMap
    Definition smoother.hh:563
    \n-
    const SmootherArgs getArgs() const
    Definition smoother.hh:201
    \n-
    void setComm(T1 &comm)
    Definition smoother.hh:125
    \n-
    static void postSmooth(Smoother &smoother, Domain &v, const Range &d)
    Definition smoother.hh:524
    \n-
    DefaultParallelConstructionArgs< M, C > Arguments
    Definition smoother.hh:324
    \n-
    RelaxationFactor relaxationFactor
    The relaxation factor to use.
    Definition smoother.hh:51
    \n-
    virtual ~DefaultParallelConstructionArgs()
    Definition smoother.hh:155
    \n-
    Smoother::domain_type Domain
    Definition smoother.hh:448
    \n-
    int setAggregate(const AggregateDescriptor &aggregate_)
    Definition smoother.hh:725
    \n-
    Smoother::range_type Range
    Definition smoother.hh:447
    \n-
    const C & getComm() const
    Definition smoother.hh:163
    \n-
    virtual ~DefaultConstructionArgs()
    Definition smoother.hh:101
    \n-
    static void preSmooth(Smoother &smoother, Domain &v, const Range &d)
    apply pre smoothing in forward direction
    Definition smoother.hh:382
    \n-
    static void postSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:475
    \n-
    ConstructionTraits< T > SeqConstructionTraits
    Definition smoother.hh:338
    \n-
    ConstructionArgs(int n=0)
    Definition smoother.hh:284
    \n-\n-
    void setArgs(const SmootherArgs &args)
    Definition smoother.hh:187
    \n-
    int iterations
    The number of iterations to perform.
    Definition smoother.hh:47
    \n-
    Smoother::range_type Range
    Definition smoother.hh:372
    \n-
    Overlap overlap
    Definition smoother.hh:540
    \n-\n-
    @ aggregate
    Definition smoother.hh:538
    \n-\n-
    @ pairwise
    Definition smoother.hh:538
    \n-\n+
    523 // vector mapping all indices in flat order to the not ignored indices
    \n+
    524 std::vector<std::size_t> subIndices_;
    \n+
    525};
    \n+
    \n+
    526
    \n+
    \n+\n+
    528 template<class F> struct isValidBlock : std::false_type{};
    \n+
    529 template<int k> struct isValidBlock<FieldVector<double,k>> : std::true_type{};
    \n+
    530 template<int k> struct isValidBlock<FieldVector<float,k>> : std::true_type{};
    \n+
    531
    \n+
    532 template<class TL, typename M>
    \n+
    533 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n+
    534 typename Dune::TypeListElement<2, TL>::type>>
    \n+
    \n+
    535 operator()(TL /*tl*/, const M& mat, const Dune::ParameterTree& /*config*/,
    \n+
    536 std::enable_if_t<isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n+
    537 {
    \n+
    538 using D = typename Dune::TypeListElement<1, TL>::type;
    \n+
    539 auto solver = std::make_shared<Dune::Cholmod<D>>();
    \n+
    540 solver->setMatrix(mat);
    \n+
    541 return solver;
    \n+
    542 }
    \n+
    \n+
    543
    \n+
    544 // second version with SFINAE to validate the template parameters of Cholmod
    \n+
    545 template<typename TL, typename M>
    \n+
    546 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n+
    547 typename Dune::TypeListElement<2, TL>::type>>
    \n+
    \n+
    548 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
    \n+
    549 std::enable_if_t<!isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n+
    550 {
    \n+
    551 DUNE_THROW(UnsupportedType, "Unsupported Type in Cholmod");
    \n+
    552 }
    \n+
    \n+
    553 };
    \n+
    \n+\n+
    555
    \n+
    556} /* namespace Dune */
    \n+
    557
    \n+
    558#endif // HAVE_SUITESPARSE_CHOLMOD
    \n+
    Implementation of the BCRSMatrix class.
    \n+\n+
    #define DUNE_REGISTER_DIRECT_SOLVER(name,...)
    Definition solverregistry.hh:13
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+
    Define general, extensible interface for inverse operators.
    \n+\n+
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n
    Definition allocator.hh:11
    \n-
    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
    \n-
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n-
    X range_type
    The range type of the preconditioner.
    Definition overlappingschwarz.hh:770
    \n-
    X domain_type
    The domain type of the preconditioner.
    Definition overlappingschwarz.hh:765
    \n-
    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
    \n-
    Nonoverlapping parallel preconditioner.
    Definition novlpschwarz.hh:276
    \n-
    P::range_type range_type
    The range type of the preconditioner.
    Definition novlpschwarz.hh:284
    \n-
    P::domain_type domain_type
    The domain type of the preconditioner.
    Definition novlpschwarz.hh:282
    \n-
    Tag that tells the Schwarz method to be multiplicative.
    Definition overlappingschwarz.hh:126
    \n-
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n-
    The (undirected) graph of a matrix.
    Definition graph.hh:51
    \n-
    VertexIterator end()
    Get an iterator over the vertices.
    \n-
    M::size_type VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:73
    \n-
    VertexIterator begin()
    Get an iterator over the vertices.
    \n-
    Iterator over all edges starting from a vertex.
    Definition graph.hh:95
    \n-
    The vertex iterator type of the graph.
    Definition graph.hh:209
    \n-
    Definition pinfo.hh:28
    \n-
    The default class for the smoother arguments.
    Definition smoother.hh:38
    \n-
    Traits class for getting the attribute class of a smoother.
    Definition smoother.hh:66
    \n-
    Construction Arguments for the default smoothers.
    Definition smoother.hh:93
    \n-
    Definition smoother.hh:148
    \n-\n-\n-\n-
    Helper class for applying the smoothers.
    Definition smoother.hh:370
    \n-\n-\n-
    Sequential SSOR preconditioner.
    Definition preconditioners.hh:142
    \n-
    Sequential SOR preconditioner.
    Definition preconditioners.hh:262
    \n-
    X domain_type
    The domain type of the preconditioner.
    Definition preconditioners.hh:267
    \n-
    Y range_type
    The range type of the preconditioner.
    Definition preconditioners.hh:269
    \n-
    The sequential jacobian preconditioner.
    Definition preconditioners.hh:413
    \n-
    Sequential ILU preconditioner.
    Definition preconditioners.hh:697
    \n-
    Richardson preconditioner.
    Definition preconditioners.hh:878
    \n-
    A parallel SSOR preconditioner.
    Definition schwarz.hh:175
    \n-
    Block parallel preconditioner.
    Definition schwarz.hh:278
    \n-
    X domain_type
    The domain type of the preconditioner.
    Definition schwarz.hh:285
    \n-
    Y range_type
    The range type of the preconditioner.
    Definition schwarz.hh:290
    \n+
    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
    \n+
    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
    \n+
    Dune wrapper for SuiteSparse/CHOLMOD solver.
    Definition cholmod.hh:216
    \n+
    cholmod_common & cholmodCommonObject()
    return a reference to the CHOLMOD common object for advanced option settings
    Definition cholmod.hh:481
    \n+
    void setMatrix(const Matrix &matrix)
    Set matrix without ignore nodes.
    Definition cholmod.hh:322
    \n+
    cholmod_factor & cholmodFactor()
    The CHOLMOD data structure that stores the factorization.
    Definition cholmod.hh:491
    \n+
    ~Cholmod()
    Destructor.
    Definition cholmod.hh:239
    \n+
    Cholmod & operator=(const Cholmod &)=delete
    \n+
    virtual SolverCategory::Category category() const
    Category of the solver (see SolverCategory::Category)
    Definition cholmod.hh:471
    \n+
    void apply(Vector &x, Vector &b, InverseOperatorResult &res)
    solve the linear system Ax=b (possibly with respect to some ignore field)
    Definition cholmod.hh:263
    \n+
    Cholmod(const Cholmod &)=delete
    \n+
    const cholmod_factor & cholmodFactor() const
    The CHOLMOD data structure that stores the factorization.
    Definition cholmod.hh:501
    \n+
    void apply(Vector &x, Vector &b, double reduction, InverseOperatorResult &res)
    simple forward to apply(X&, Y&, InverseOperatorResult&)
    Definition cholmod.hh:253
    \n+
    Cholmod()
    Default constructor.
    Definition cholmod.hh:229
    \n+
    void setMatrix(const Matrix &matrix, const Ignore *ignore)
    Set matrix and ignore nodes.
    Definition cholmod.hh:343
    \n+
    Definition cholmod.hh:527
    \n+
    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 &, std::enable_if_t< isValidBlock< typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const
    Definition cholmod.hh:535
    \n+
    Definition cholmod.hh:528
    \n+
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    int iterations
    Number of iterations.
    Definition solver.hh:69
    \n+
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n+
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    Definition solverregistry.hh:77
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1343 +1,640 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-smoother.hh\n+cholmod.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMGSMOOTHER_HH\n-6#define DUNE_AMGSMOOTHER_HH\n-7\n-8#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-9#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n-10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n-11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n-13#include \n-14#include \n-15\n-16namespace _\bD_\bu_\bn_\be\n-17{\n-18 namespace Amg\n-19 {\n-20\n-36 template\n-_\b3_\b7 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-38 {\n-_\b4_\b2 typedef typename FieldTraits::real_type _\bR_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br;\n-43\n-_\b4_\b7 int _\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs;\n-_\b5_\b1 _\bR_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br _\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br;\n-52\n-_\b5_\b6 _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs()\n-57 : _\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs(1), _\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br(1.0)\n-58 {}\n-59 };\n-60\n-64 template\n-_\b6_\b5 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs\n-66 {\n-_\b6_\b7 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bT_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-68\n-69 };\n+5#pragma once\n+6\n+7#if HAVE_SUITESPARSE_CHOLMOD || defined DOXYGEN\n+8\n+9#include \n+10#include \n+11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+13#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh>\n+16\n+17#include \n+18#include \n+19\n+20#include \n+21\n+22namespace _\bD_\bu_\bn_\be {\n+23\n+24namespace Impl{\n+25\n+34 struct NoIgnore\n+35 {\n+36 const NoIgnore& operator[](std::size_t) const { return *this; }\n+37 explicit operator bool() const { return false; }\n+38 static constexpr std::size_t size() { return 0; }\n+39\n+40 };\n+41\n+42\n+43 template\n+44 void copyToFlatVector(const BlockedVector& blockedVector, FlatVector&\n+flatVector)\n+45 {\n+46 // traverse the vector once just to compute the size\n+47 std::size_t len = _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(blockedVector, [&](auto&&, auto...){});\n+48 flatVector.resize(len);\n+49\n+50 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(blockedVector, [&](auto&& entry, auto offset){\n+51 flatVector[offset] = entry;\n+52 });\n+53 }\n+54\n+55 // special (dummy) case for NoIgnore\n+56 template\n+57 void copyToFlatVector(const NoIgnore&, FlatVector&)\n+58 {\n+59 // just do nothing\n+60 return;\n+61 }\n+62\n+63 template\n+64 void copyToBlockedVector(const FlatVector& flatVector, BlockedVector&\n+blockedVector)\n+65 {\n+66 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(blockedVector, [&](auto& entry, auto offset){\n+67 entry = flatVector[offset];\n+68 });\n+69 }\n 70\n-71 template\n-_\b7_\b2 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs<_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn>\n-73 {\n-_\b7_\b4 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bX_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+71 // wrapper class for C function calls to CHOLMOD itself.\n+72 // The CHOLMOD API has different functions for different index types.\n+73 template \n+74 struct CholmodMethodChooser;\n 75\n-76 };\n-77\n-78 template\n-_\b7_\b9 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs<_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\n-80 : public _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs\n-81 {};\n-82\n-83 template\n-_\b8_\b4 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\n-85 : public _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs\n-86 {};\n-87\n-91 template\n-_\b9_\b2 class _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-93 {\n-94 typedef typename T::matrix_type Matrix;\n-95\n-96 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n+76 // specialization using 'int' to store indices\n+77 template <>\n+78 struct CholmodMethodChooser\n+79 {\n+80 [[nodiscard]]\n+81 static cholmod_dense* allocate_dense(size_t nrow, size_t ncol, size_t d, int\n+xtype, cholmod_common *c)\n+82 {\n+83 return ::cholmod_allocate_dense(nrow,ncol,d,xtype,c);\n+84 }\n+85\n+86 [[nodiscard]]\n+87 static cholmod_sparse* allocate_sparse(size_t nrow, size_t ncol, size_t\n+nzmax, int sorted, int packed, int stype, int xtype, cholmod_common *c)\n+88 {\n+89 return ::cholmod_allocate_sparse\n+(nrow,ncol,nzmax,sorted,packed,stype,xtype,c);\n+90 }\n+91\n+92 [[nodiscard]]\n+93 static cholmod_factor* analyze(cholmod_sparse *A, cholmod_common *c)\n+94 {\n+95 return ::cholmod_analyze(A,c);\n+96 }\n 97\n-98 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br> _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp;\n-99\n-100 public:\n-_\b1_\b0_\b1 virtual _\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs()\n-102 {}\n-103\n-_\b1_\b0_\b4 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const Matrix& matrix)\n-105 {\n-106 _\bm_\ba_\bt_\br_\bi_\bx_\b_=&matrix;\n-107 }\n-_\b1_\b0_\b8 virtual void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const Matrix& matrix, [[maybe_unused]] const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& amap)\n+98 static int defaults(cholmod_common *c)\n+99 {\n+100 return ::cholmod_defaults(c);\n+101 }\n+102\n+103 static int factorize(cholmod_sparse *A, cholmod_factor *L, cholmod_common\n+*c)\n+104 {\n+105 return ::cholmod_factorize(A,L,c);\n+106 }\n+107\n+108 static int finish(cholmod_common *c)\n 109 {\n-110 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(matrix);\n+110 return ::cholmod_finish(c);\n 111 }\n 112\n-113\n-_\b1_\b1_\b4 const Matrix& _\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx() const\n-115 {\n-116 return *_\bm_\ba_\bt_\br_\bi_\bx_\b_;\n-117 }\n-118\n-_\b1_\b1_\b9 void _\bs_\be_\bt_\bA_\br_\bg_\bs(const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& args)\n-120 {\n-121 args_=&args;\n-122 }\n-123\n-124 template\n-_\b1_\b2_\b5 void _\bs_\be_\bt_\bC_\bo_\bm_\bm([[maybe_unused]] T1& comm)\n-126 {}\n+113 static int free_dense (cholmod_dense **X, cholmod_common *c)\n+114 {\n+115 return ::cholmod_free_dense(X,c);\n+116 }\n+117\n+118 static int free_factor(cholmod_factor **L, cholmod_common *c)\n+119 {\n+120 return ::cholmod_free_factor(L,c);\n+121 }\n+122\n+123 static int free_sparse(cholmod_sparse **A, cholmod_common *c)\n+124 {\n+125 return ::cholmod_free_sparse(A,c);\n+126 }\n 127\n-_\b1_\b2_\b8 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& _\bg_\be_\bt_\bC_\bo_\bm_\bm()\n-129 {\n-130 return comm_;\n-131 }\n-132\n-_\b1_\b3_\b3 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs _\bg_\be_\bt_\bA_\br_\bg_\bs() const\n-134 {\n-135 return *args_;\n-136 }\n-137\n-138 protected:\n-_\b1_\b3_\b9 const Matrix* _\bm_\ba_\bt_\br_\bi_\bx_\b_;\n-140 private:\n-141 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs* args_;\n-142 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn comm_;\n-143 };\n-144\n-145 template\n-_\b1_\b4_\b6 struct _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-147 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-148 {};\n+128 [[nodiscard]]\n+129 static cholmod_dense* solve(int sys, cholmod_factor *L, cholmod_dense *B,\n+cholmod_common *c)\n+130 {\n+131 return ::cholmod_solve(sys,L,B,c);\n+132 }\n+133\n+134 static int start(cholmod_common *c)\n+135 {\n+136 return ::cholmod_start(c);\n+137 }\n+138 };\n+139\n+140 // specialization using 'SuiteSparse_long' to store indices\n+141 template <>\n+142 struct CholmodMethodChooser\n+143 {\n+144 [[nodiscard]]\n+145 static cholmod_dense* allocate_dense(size_t nrow, size_t ncol, size_t d,\n+int xtype, cholmod_common *c)\n+146 {\n+147 return ::cholmod_l_allocate_dense(nrow,ncol,d,xtype,c);\n+148 }\n 149\n-150 template\n-_\b1_\b5_\b1 class _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-152 : public _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-153 {\n-154 public:\n-_\b1_\b5_\b5 virtual _\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs()\n-156 {}\n-157\n-_\b1_\b5_\b8 void _\bs_\be_\bt_\bC_\bo_\bm_\bm(const C& comm)\n-159 {\n-160 comm_ = &comm;\n-161 }\n-162\n-_\b1_\b6_\b3 const C& _\bg_\be_\bt_\bC_\bo_\bm_\bm() const\n-164 {\n-165 return *comm_;\n-166 }\n-167 private:\n-168 const C* comm_;\n-169 };\n-170\n+150 [[nodiscard]]\n+151 static cholmod_sparse* allocate_sparse(size_t nrow, size_t ncol, size_t\n+nzmax, int sorted, int packed, int stype, int xtype, cholmod_common *c)\n+152 {\n+153 return ::cholmod_l_allocate_sparse\n+(nrow,ncol,nzmax,sorted,packed,stype,xtype,c);\n+154 }\n+155\n+156 [[nodiscard]]\n+157 static cholmod_factor* analyze(cholmod_sparse *A, cholmod_common *c)\n+158 {\n+159 return ::cholmod_l_analyze(A,c);\n+160 }\n+161\n+162 static int defaults(cholmod_common *c)\n+163 {\n+164 return ::cholmod_l_defaults(c);\n+165 }\n+166\n+167 static int factorize(cholmod_sparse *A, cholmod_factor *L, cholmod_common\n+*c)\n+168 {\n+169 return ::cholmod_l_factorize(A,L,c);\n+170 }\n 171\n-172 template\n-_\b1_\b7_\b3 class _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs<_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn>\n-174 {\n-175 typedef _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\bX_\b,_\bY_\b> _\bT;\n+172 static int finish(cholmod_common *c)\n+173 {\n+174 return ::cholmod_l_finish(c);\n+175 }\n 176\n-177 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n-178\n-179 public:\n-_\b1_\b8_\b0 virtual _\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs()\n-181 {}\n-182\n-183 template \n-_\b1_\b8_\b4 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const Args&...)\n-185 {}\n+177 static int free_dense (cholmod_dense **X, cholmod_common *c)\n+178 {\n+179 return ::cholmod_l_free_dense(X,c);\n+180 }\n+181\n+182 static int free_factor (cholmod_factor **L, cholmod_common *c)\n+183 {\n+184 return ::cholmod_l_free_factor(L,c);\n+185 }\n 186\n-_\b1_\b8_\b7 void _\bs_\be_\bt_\bA_\br_\bg_\bs(const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& args)\n+187 static int free_sparse(cholmod_sparse **A, cholmod_common *c)\n 188 {\n-189 args_=&args;\n+189 return ::cholmod_l_free_sparse(A,c);\n 190 }\n 191\n-192 template\n-_\b1_\b9_\b3 void _\bs_\be_\bt_\bC_\bo_\bm_\bm([[maybe_unused]] T1& comm)\n-194 {}\n-195\n-_\b1_\b9_\b6 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& _\bg_\be_\bt_\bC_\bo_\bm_\bm()\n-197 {\n-198 return comm_;\n-199 }\n-200\n-_\b2_\b0_\b1 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs _\bg_\be_\bt_\bA_\br_\bg_\bs() const\n-202 {\n-203 return *args_;\n-204 }\n+192 [[nodiscard]]\n+193 static cholmod_dense* solve(int sys, cholmod_factor *L, cholmod_dense *B,\n+cholmod_common *c)\n+194 {\n+195 return ::cholmod_l_solve(sys,L,B,c);\n+196 }\n+197\n+198 static int start(cholmod_common *c)\n+199 {\n+200 return ::cholmod_l_start(c);\n+201 }\n+202 };\n+203\n+204} //namespace Impl\n 205\n-206 private:\n-207 const SmootherArgs* args_;\n-208 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn comm_;\n-209 };\n-210\n-211\n-212\n-213 template\n-214 struct ConstructionTraits;\n-215\n-219 template\n-_\b2_\b2_\b0 struct ConstructionTraits<_\bS_\be_\bq_\bS_\bS_\bO_\bR >\n-221 {\n-_\b2_\b2_\b2 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+214template\n+_\b2_\b1_\b5class _\bC_\bh_\bo_\bl_\bm_\bo_\bd : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+216{\n+217 static_assert(std::is_same_v || std::\n+is_same_v,\n+218 \"Index type must be either 'int' or 'SuiteSparse_long'!\");\n+219\n+220 using CholmodMethod = Impl::CholmodMethodChooser;\n+221\n+222public:\n 223\n-_\b2_\b2_\b4 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-225 {\n-226 return std::make_shared>\n-227 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(), args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs, args._\bg_\be_\bt_\bA_\br_\bg_\bs\n-()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br);\n-228 }\n-229 };\n-230\n-231\n-235 template\n-_\b2_\b3_\b6 struct ConstructionTraits<_\bS_\be_\bq_\bS_\bO_\bR >\n-237 {\n-_\b2_\b3_\b8 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bS_\bO_\bR_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-239\n-_\b2_\b4_\b0 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-241 {\n-242 return std::make_shared>\n-243 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(), args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs, args._\bg_\be_\bt_\bA_\br_\bg_\bs\n-()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br);\n+_\b2_\b2_\b9 _\bC_\bh_\bo_\bl_\bm_\bo_\bd()\n+230 {\n+231 CholmodMethod::start(&c_);\n+232 }\n+233\n+_\b2_\b3_\b9 _\b~_\bC_\bh_\bo_\bl_\bm_\bo_\bd()\n+240 {\n+241 if (L_)\n+242 CholmodMethod::free_factor(&L_, &c_);\n+243 CholmodMethod::finish(&c_);\n 244 }\n-245 };\n-246\n-247\n-251 template\n-_\b2_\b5_\b2 struct ConstructionTraits<_\bS_\be_\bq_\bJ_\ba_\bc >\n-253 {\n-_\b2_\b5_\b4 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bJ_\ba_\bc_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-255\n-_\b2_\b5_\b6 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-257 {\n-258 return std::make_shared>\n-259 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(), args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs, args._\bg_\be_\bt_\bA_\br_\bg_\bs\n-()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br);\n-260 }\n-261 };\n-262\n-266 template\n-_\b2_\b6_\b7 struct ConstructionTraits<_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn >\n-268 {\n-_\b2_\b6_\b9 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\bX_\b,_\bY_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+245\n+246 // forbid copying to avoid freeing memory twice\n+_\b2_\b4_\b7 _\bC_\bh_\bo_\bl_\bm_\bo_\bd(const _\bC_\bh_\bo_\bl_\bm_\bo_\bd&) = delete;\n+_\b2_\b4_\b8 _\bC_\bh_\bo_\bl_\bm_\bo_\bd& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bC_\bh_\bo_\bl_\bm_\bo_\bd&) = delete;\n+249\n+250\n+_\b2_\b5_\b3 void _\ba_\bp_\bp_\bl_\by (Vector& x, Vector& b, [[maybe_unused]] double reduction,\n+_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+254 {\n+255 _\ba_\bp_\bp_\bl_\by(x,b,res);\n+256 }\n+257\n+_\b2_\b6_\b3 void _\ba_\bp_\bp_\bl_\by(Vector& x, Vector& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+264 {\n+265 // do nothing if N=0\n+266 if ( nIsZero_ )\n+267 {\n+268 return;\n+269 }\n 270\n-_\b2_\b7_\b1 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-272 {\n-273 return std::make_shared>\n-274 (args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br);\n-275 }\n-276 };\n+271 if (x.size() != b.size())\n+272 DUNE_THROW(Exception, \"Error in apply(): sizes of x and b do not match!\");\n+273\n+274 // cast to double array\n+275 auto b2 = std::make_unique(L_->n);\n+276 auto x2 = std::make_unique(L_->n);\n 277\n-278\n-279 template\n-_\b2_\b8_\b0 class _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs<_\bS_\be_\bq_\bI_\bL_\bU >\n-281 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs >\n-282 {\n-283 public:\n-_\b2_\b8_\b4 _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs(int n=0)\n-285 : n_(n)\n-286 {}\n-287\n-_\b2_\b8_\b8 void _\bs_\be_\bt_\bN(int n)\n-289 {\n-290 n_ = n;\n-291 }\n-292\n-_\b2_\b9_\b3 int _\bg_\be_\bt_\bN()\n-294 {\n-295 return n_;\n-296 }\n-297\n-298 private:\n-299 int n_;\n-300 };\n-301\n-302\n-306 template\n-_\b3_\b0_\b7 struct ConstructionTraits<_\bS_\be_\bq_\bI_\bL_\bU >\n-308 {\n-_\b3_\b0_\b9 typedef _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bI_\bL_\bU_\b<_\bM_\b,_\bX_\b,_\bY_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-310\n-_\b3_\b1_\b1 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-312 {\n-313 return std::make_shared>\n-314 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(), args._\bg_\be_\bt_\bN(), args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br);\n-315 }\n-316 };\n-317\n-321 template\n-_\b3_\b2_\b2 struct ConstructionTraits<_\bP_\ba_\br_\bS_\bS_\bO_\bR >\n+278 // copy to cholmod\n+279 auto bp = b2.get();\n+280\n+281 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(b, [&](auto&& entry, auto&& flatIndex){\n+282 if ( subIndices_.empty() )\n+283 bp[ flatIndex ] = entry;\n+284 else\n+285 if( subIndices_[ flatIndex ] != std::numeric_limits::max() )\n+286 bp[ subIndices_[ flatIndex ] ] = entry;\n+287 });\n+288\n+289 // create a cholmod dense object\n+290 auto b3 = make_cholmod_dense(CholmodMethod::allocate_dense(L_->n, 1, L_->n,\n+CHOLMOD_REAL, &c_), &c_);\n+291\n+292 // cast because void-ptr\n+293 auto b4 = static_cast(b3->x);\n+294 std::copy(b2.get(), b2.get() + L_->n, b4);\n+295\n+296 // solve for a cholmod x object\n+297 auto x3 = make_cholmod_dense(CholmodMethod::solve(CHOLMOD_A, L_, b3.get(),\n+&c_), &c_);\n+298 // cast because void-ptr\n+299 auto xp = static_cast(x3->x);\n+300\n+301 // copy into x\n+302 _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(x, [&](auto&& entry, auto&& flatIndex){\n+303 if ( subIndices_.empty() )\n+304 entry = xp[ flatIndex ];\n+305 else\n+306 if( subIndices_[ flatIndex ] != std::numeric_limits::max() )\n+307 entry = xp[ subIndices_[ flatIndex ] ];\n+308 });\n+309\n+310 // statistics for a direct solver\n+311 res._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 1;\n+312 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = true;\n+313 }\n+314\n+315\n+321 template\n+_\b3_\b2_\b2 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix)\n 323 {\n-_\b3_\b2_\b4 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bM_\b,_\bC_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-325\n-_\b3_\b2_\b6 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-327 {\n-328 return std::make_shared>\n-329 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(), args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs,\n-330 args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br, args._\bg_\be_\bt_\bC_\bo_\bm_\bm());\n-331 }\n-332 };\n-333\n-334 template\n-_\b3_\b3_\b5 struct ConstructionTraits<_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\n-336 {\n-_\b3_\b3_\b7 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bT_\b,_\bC_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-_\b3_\b3_\b8 typedef ConstructionTraits _\bS_\be_\bq_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs;\n-_\b3_\b3_\b9 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-340 {\n-341 auto seqPrec = SeqConstructionTraits::construct(args);\n-342 return std::make_shared> (seqPrec,\n-args._\bg_\be_\bt_\bC_\bo_\bm_\bm());\n-343 }\n-344 };\n-345\n-346 template\n-_\b3_\b4_\b7 struct ConstructionTraits<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\n-348 {\n-_\b3_\b4_\b9 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bT_\b,_\bC_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-_\b3_\b5_\b0 typedef ConstructionTraits _\bS_\be_\bq_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs;\n-_\b3_\b5_\b1 static inline std::shared_ptr>\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-352 {\n-353 auto seqPrec = SeqConstructionTraits::construct(args);\n-354 return std::make_shared> (seqPrec,\n-args._\bg_\be_\bt_\bC_\bo_\bm_\bm());\n-355 }\n-356 };\n-357\n-368 template\n-_\b3_\b6_\b9 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br\n-370 {\n-_\b3_\b7_\b1 typedef T _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n-_\b3_\b7_\b2 typedef typename Smoother::range_type _\bR_\ba_\bn_\bg_\be;\n-_\b3_\b7_\b3 typedef typename Smoother::domain_type _\bD_\bo_\bm_\ba_\bi_\bn;\n-374\n-_\b3_\b8_\b2 static void _\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n-383 {\n-384 smoother.apply(v,d);\n-385 }\n-386\n-_\b3_\b9_\b4 static void _\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n-395 {\n-396 smoother.apply(v,d);\n-397 }\n-398 };\n-399\n-405 template\n-_\b4_\b0_\b6 void _\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh(LevelContext& levelContext, size_t steps)\n-407 {\n-408 for(std::size_t i=0; i < steps; ++i) {\n-409 *levelContext.lhs=0;\n-410 _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b>\n-411_\b _\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(*levelContext.smoother, *levelContext.lhs,\n-412 *levelContext.rhs);\n-413 // Accumulate update\n-414 *levelContext.update += *levelContext.lhs;\n-415\n-416 // update defect\n-417 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs,\n-*levelContext.rhs);\n-418 levelContext.pinfo->project(*levelContext.rhs);\n-419 }\n-420 }\n+324 const Impl::NoIgnore* noIgnore = nullptr;\n+325 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(matrix, noIgnore);\n+326 }\n+327\n+342 template\n+_\b3_\b4_\b3 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const Ignore* ignore)\n+344 {\n+345 // count the number of entries and diagonal entries\n+346 size_t nonZeros = 0;\n+347 size_t numberOfIgnoredDofs = 0;\n+348\n+349\n+350 auto [flatRows,flatCols] = _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh( matrix, [&](auto&& /*entry*/,\n+auto&& flatRowIndex, auto&& flatColIndex){\n+351 if( flatRowIndex <= flatColIndex )\n+352 nonZeros++;\n+353 });\n+354\n+355 std::vector flatIgnore;\n+356\n+357 if ( ignore )\n+358 {\n+359 Impl::copyToFlatVector(*ignore,flatIgnore);\n+360 numberOfIgnoredDofs = std::count(flatIgnore.begin(),flatIgnore.end(),true);\n+361 }\n+362\n+363 nIsZero_ = (size_t(flatRows) <= numberOfIgnoredDofs);\n+364\n+365 if ( nIsZero_ )\n+366 {\n+367 return;\n+368 }\n+369\n+370 // Total number of rows\n+371 size_t N = flatRows - numberOfIgnoredDofs;\n+372\n+373 /*\n+374 * CHOLMOD uses compressed-column sparse matrices, but for symmetric\n+375 * matrices this is the same as the compressed-row sparse matrix used\n+376 * by DUNE. So we can just store M\u00e1\u00b5\u0080 instead of M (as M = M\u00e1\u00b5\u0080).\n+377 */\n+378 const auto deleter = [c = &this->c_](auto* p) {\n+379 CholmodMethod::free_sparse(&p, c);\n+380 };\n+381 auto M = std::unique_ptr(\n+382 CholmodMethod::allocate_sparse(N, // # rows\n+383 N, // # cols\n+384 nonZeros, // # of nonzeroes\n+385 1, // indices are sorted ( 1 = true)\n+386 1, // matrix is \"packed\" ( 1 = true)\n+387 -1, // stype of matrix ( -1 = consider the lower part only )\n+388 CHOLMOD_REAL, // xtype of matrix ( CHOLMOD_REAL = single array, no complex\n+numbers)\n+389 &c_ // cholmod_common ptr\n+390 ), deleter);\n+391\n+392 // copy the data of BCRS matrix to Cholmod Sparse matrix\n+393 Index* Ap = static_cast(M->p);\n+394 Index* Ai = static_cast(M->i);\n+395 double* Ax = static_cast(M->x);\n+396\n+397\n+398 if ( ignore )\n+399 {\n+400 // init the mapping\n+401 subIndices_.resize(flatRows,std::numeric_limits::max());\n+402\n+403 std::size_t subIndexCounter = 0;\n+404\n+405 for ( std::size_t i=0; i\n-_\b4_\b2_\b8 void _\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh(LevelContext& levelContext, size_t steps)\n-429 {\n-430 for(std::size_t i=0; i < steps; ++i) {\n-431 // update defect\n-432 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs,\n-433 *levelContext.rhs);\n-434 *levelContext.lhs=0;\n-435 levelContext.pinfo->project(*levelContext.rhs);\n-436 _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b>\n-437_\b _\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(*levelContext.smoother, *levelContext.lhs, *levelContext.rhs);\n-438 // Accumulate update\n-439 *levelContext.update += *levelContext.lhs;\n-440 }\n-441 }\n-442\n-443 template\n-_\b4_\b4_\b4 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br<_\bS_\be_\bq_\bS_\bO_\bR >\n-445 {\n-_\b4_\b4_\b6 typedef _\bS_\be_\bq_\bS_\bO_\bR_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n-_\b4_\b4_\b7 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be _\bR_\ba_\bn_\bg_\be;\n-_\b4_\b4_\b8 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be _\bD_\bo_\bm_\ba_\bi_\bn;\n-449\n-_\b4_\b5_\b0 static void _\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n-451 {\n-452 smoother.template apply(v,d);\n-453 }\n-454\n-455\n-_\b4_\b5_\b6 static void _\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n-457 {\n-458 smoother.template apply(v,d);\n-459 }\n-460 };\n+422 // stop if in lower half\n+423 if ( flatRowIndex > flatColIndex )\n+424 return;\n+425\n+426 // ok, count the entry\n+427 auto idx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;\n+428 Ap[idx+1]++;\n+429\n+430 });\n+431\n+432 // now accumulate\n+433 Ap[0] = 0;\n+434 for ( size_t i=0; i rowPosition(N,0);\n+441\n+442 // now we can set the entries\n+443 _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(matrix, [&](auto&& entry, auto&& flatRowIndex, auto&&\n+flatColIndex){\n+444\n+445 // stop if ignored\n+446 if ( ignore and ( flatIgnore[flatRowIndex] or flatIgnore[flatColIndex] ) )\n+447 return;\n+448\n+449 // stop if in lower half\n+450 if ( flatRowIndex > flatColIndex )\n+451 return;\n+452\n+453 // ok, set the entry\n+454 auto rowIdx = ignore ? subIndices_[flatRowIndex] : flatRowIndex;\n+455 auto colIdx = ignore ? subIndices_[flatColIndex] : flatColIndex;\n+456 auto rowStart = Ap[rowIdx];\n+457 auto rowPos = rowPosition[rowIdx];\n+458 Ai[ rowStart + rowPos ] = colIdx;\n+459 Ax[ rowStart + rowPos ] = entry;\n+460 rowPosition[rowIdx]++;\n 461\n-462 template\n-_\b4_\b6_\b3 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br<_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br > >\n-464 {\n-_\b4_\b6_\b5 typedef _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b,_\bC_\b,_\bS_\be_\bq_\bS_\bO_\bR_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> > _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n-_\b4_\b6_\b6 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be _\bR_\ba_\bn_\bg_\be;\n-_\b4_\b6_\b7 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be _\bD_\bo_\bm_\ba_\bi_\bn;\n-468\n-_\b4_\b6_\b9 static void _\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n-470 {\n-471 smoother.template apply(v,d);\n-472 }\n-473\n-474\n-_\b4_\b7_\b5 static void _\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n-476 {\n-477 smoother.template apply(v,d);\n-478 }\n-479 };\n-480\n-481 template\n-_\b4_\b8_\b2 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-> >\n-483 {\n-_\b4_\b8_\b4 typedef _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bC_\b,_\bS_\be_\bq_\bS_\bO_\bR_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> > _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n-_\b4_\b8_\b5 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be _\bR_\ba_\bn_\bg_\be;\n-_\b4_\b8_\b6 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be _\bD_\bo_\bm_\ba_\bi_\bn;\n-487\n-_\b4_\b8_\b8 static void _\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n-489 {\n-490 smoother.template apply(v,d);\n-491 }\n-492\n-493\n-_\b4_\b9_\b4 static void _\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n-495 {\n-496 smoother.template apply(v,d);\n-497 }\n-498 };\n-499\n-500 } // end namespace Amg\n-501\n-502 // forward declarations\n-503 template\n-504 class SeqOverlappingSchwarz;\n-505\n-506 struct MultiplicativeSchwarzMode;\n-507\n-508 namespace Amg\n-509 {\n-510 template\n-_\b5_\b1_\b1 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz >\n-513 {\n-_\b5_\b1_\b4 typedef _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\bM_\bS_\b,_\bT_\bA_\b>\n-_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n-_\b5_\b1_\b5 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be _\bR_\ba_\bn_\bg_\be;\n-_\b5_\b1_\b6 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be _\bD_\bo_\bm_\ba_\bi_\bn;\n-517\n-_\b5_\b1_\b8 static void _\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n-519 {\n-520 smoother.template apply(v,d);\n-521 }\n+462 });\n+463\n+464 // Now analyse the pattern and optimal row order\n+465 L_ = CholmodMethod::analyze(M.get(), &c_);\n+466\n+467 // Do the factorization (this may take some time)\n+468 CholmodMethod::factorize(M.get(), L_, &c_);\n+469 }\n+470\n+_\b4_\b7_\b1 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+472 {\n+473 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+474 }\n+475\n+_\b4_\b8_\b1 cholmod_common& _\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\bo_\bm_\bm_\bo_\bn_\bO_\bb_\bj_\be_\bc_\bt()\n+482 {\n+483 return c_;\n+484 }\n+485\n+_\b4_\b9_\b1 cholmod_factor& _\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bF_\ba_\bc_\bt_\bo_\br()\n+492 {\n+493 return *L_;\n+494 }\n+495\n+_\b5_\b0_\b1 const cholmod_factor& _\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bF_\ba_\bc_\bt_\bo_\br() const\n+502 {\n+503 return *L_;\n+504 }\n+505private:\n+506\n+507 // create a std::unique_ptr to a cholmod_dense object with a deleter\n+508 // that calls the appropriate cholmod cleanup routine\n+509 auto make_cholmod_dense(cholmod_dense* x, cholmod_common* c)\n+510 {\n+511 const auto deleter = [c](auto* p) {\n+512 CholmodMethod::free_dense(&p, c);\n+513 };\n+514 return std::unique_ptr(x, deleter);\n+515 }\n+516\n+517 cholmod_common c_;\n+518 cholmod_factor* L_ = nullptr;\n+519\n+520 // indicator for a 0x0 problem (due to ignore dof's)\n+521 bool nIsZero_ = false;\n 522\n-523\n-_\b5_\b2_\b4 static void _\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n-525 {\n-526 smoother.template apply(v,d);\n-527\n-528 }\n-529 };\n-530\n-531 // template\n-532 // class SeqOverlappingSchwarz;\n-533\n-534 template\n-_\b5_\b3_\b5 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-536 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+523 // vector mapping all indices in flat order to the not ignored indices\n+524 std::vector subIndices_;\n+525};\n+526\n+_\b5_\b2_\b7 struct _\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br{\n+_\b5_\b2_\b8 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::false_type{};\n+_\b5_\b2_\b9 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk> : std::true_type\n+{};\n+_\b5_\b3_\b0 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk> : std::true_type\n+{};\n+531\n+532 template\n+533 std::shared_ptr::type,\n+534 typename Dune::TypeListElement<2, TL>::type>>\n+_\b5_\b3_\b5 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(TL /*tl*/, const M& _\bm_\ba_\bt, const Dune::ParameterTree& /*config*/,\n+536 std::enable_if_t<_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk::type::\n+block_type>::value,int> = 0) const\n 537 {\n-_\b5_\b3_\b8 enum _\bO_\bv_\be_\br_\bl_\ba_\bp {_\bv_\be_\br_\bt_\be_\bx, _\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be, _\bp_\ba_\bi_\br_\bw_\bi_\bs_\be, _\bn_\bo_\bn_\be};\n-539\n-_\b5_\b4_\b0 _\bO_\bv_\be_\br_\bl_\ba_\bp _\bo_\bv_\be_\br_\bl_\ba_\bp;\n-_\b5_\b4_\b1 bool _\bo_\bn_\bt_\bh_\be_\bf_\bl_\by;\n-542\n-_\b5_\b4_\b3 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs(_\bO_\bv_\be_\br_\bl_\ba_\bp overlap_=_\bv_\be_\br_\bt_\be_\bx,\n-544 bool onthefly_=false)\n-545 : _\bo_\bv_\be_\br_\bl_\ba_\bp(overlap_), _\bo_\bn_\bt_\bh_\be_\bf_\bl_\by(onthefly_)\n-546 {}\n-547 };\n-548\n-549 template\n-_\b5_\b5_\b0 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz >\n-551 {\n-_\b5_\b5_\b2 typedef _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>\n-_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+538 using D = typename Dune::TypeListElement<1, TL>::type;\n+539 auto solver = std::make_shared>();\n+540 solver->setMatrix(_\bm_\ba_\bt);\n+541 return solver;\n+542 }\n+543\n+544 // second version with SFINAE to validate the template parameters of\n+Cholmod\n+545 template\n+546 std::shared_ptr::type,\n+547 typename Dune::TypeListElement<2, TL>::type>>\n+_\b5_\b4_\b8 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /\n+*config*/,\n+549 std::enable_if_t::\n+type::block_type>::value,int> = 0) const\n+550 {\n+551 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be, \"Unsupported Type in Cholmod\");\n+552 }\n 553 };\n-554\n-555 template\n-_\b5_\b5_\b6 class _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz >\n-557 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs >\n-558 {\n-559 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bS_\b,_\bT_\bA_\b> >\n-_\bF_\ba_\bt_\bh_\be_\br;\n-560\n-561 public:\n-_\b5_\b6_\b2 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-_\b5_\b6_\b3 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b> _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp;\n-_\b5_\b6_\b4 typedef typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-_\b5_\b6_\b5 typedef typename _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bS_\b,_\bT_\bA_\b>_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n-_\bV_\be_\bc_\bt_\bo_\br;\n-_\b5_\b6_\b6 typedef typename Vector::value_type _\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn;\n-567\n-_\b5_\b6_\b8 virtual void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const M& matrix, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& amap)\n-569 {\n-570 Father::setMatrix(matrix);\n-571\n-572 std::vector visited(amap._\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs(), false);\n-573 typedef IteratorPropertyMap::iterator,IdentityMap>\n-VisitedMapType;\n-574 VisitedMapType visitedMap(visited.begin());\n-575\n-576 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b> graph(matrix);\n-577\n-578 typedef _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>\n-_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n-579\n-580 switch(Father::getArgs().overlap) {\n-581 case SmootherArgs::vertex :\n-582 {\n-583 VertexAdder visitor(subdomains, amap);\n-584 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n-585 }\n-586 break;\n-587 case SmootherArgs::pairwise :\n-588 {\n-589 createPairDomains(graph);\n-590 }\n-591 break;\n-592 case SmootherArgs::aggregate :\n-593 {\n-594 AggregateAdder visitor(subdomains, amap, graph,\n-visitedMap);\n-595 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n-596 }\n-597 break;\n-598 case SmootherArgs::none :\n-599 NoneAdder visitor;\n-600 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n-601 break;\n-602 default :\n-603 DUNE_THROW(NotImplemented, \"This overlapping scheme is not supported!\");\n-604 }\n-605 }\n-_\b6_\b0_\b6 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const M& matrix)\n-607 {\n-608 Father::setMatrix(matrix);\n-609\n-610 /* Create aggregates map where each aggregate is just one vertex. */\n-611 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp amap(matrix.N());\n-612 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br v=0;\n-613 for(typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br iter=amap._\bb_\be_\bg_\bi_\bn();\n-614 iter!=amap._\be_\bn_\bd(); ++iter)\n-615 *iter=v++;\n-616\n-617 std::vector visited(amap._\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs(), false);\n-618 typedef IteratorPropertyMap::iterator,IdentityMap>\n-VisitedMapType;\n-619 VisitedMapType visitedMap(visited.begin());\n-620\n-621 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b> graph(matrix);\n-622\n-623 typedef _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>\n-_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n-624\n-625 switch(Father::getArgs().overlap) {\n-626 case SmootherArgs::vertex :\n-627 {\n-628 VertexAdder visitor(subdomains, amap);\n-629 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n-630 }\n-631 break;\n-632 case SmootherArgs::aggregate :\n-633 {\n-634 DUNE_THROW(NotImplemented, \"Aggregate overlap is not supported yet\");\n-635 /*\n-636 AggregateAdder visitor(subdomains, amap, graph,\n-visitedMap);\n-637 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n-638 */\n-639 }\n-640 break;\n-641 case SmootherArgs::pairwise :\n-642 {\n-643 createPairDomains(graph);\n-644 }\n-645 break;\n-646 case SmootherArgs::none :\n-647 NoneAdder visitor;\n-648 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n-649\n-650 }\n-651 }\n-652\n-_\b6_\b5_\b3 const _\bV_\be_\bc_\bt_\bo_\br& _\bg_\be_\bt_\bS_\bu_\bb_\bD_\bo_\bm_\ba_\bi_\bn_\bs()\n-654 {\n-655 return subdomains;\n-656 }\n-657\n-658 private:\n-659 struct VertexAdder\n-660 {\n-_\b6_\b6_\b1 _\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br(_\bV_\be_\bc_\bt_\bo_\br& subdomains_, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& aggregates_)\n-662 : subdomains(subdomains_), max(-1), subdomain(-1), aggregates(aggregates_)\n-663 {}\n-664 template\n-_\b6_\b6_\b5 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T& edge)\n-666 {\n-667 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED)\n-668 subdomains[subdomain].insert(edge.target());\n-669 }\n-_\b6_\b7_\b0 int _\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate_)\n-671 {\n-672 subdomain=aggregate_;\n-673 max = std::max(subdomain, aggregate_);\n-674 return subdomain;\n-675 }\n-_\b6_\b7_\b6 int _\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs() const\n-677 {\n-678 return max+1;\n-679 }\n-680 private:\n-681 _\bV_\be_\bc_\bt_\bo_\br& subdomains;\n-682 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br max;\n-683 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br subdomain;\n-684 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& aggregates;\n-685 };\n-686 struct NoneAdder\n-687 {\n-688 template\n-_\b6_\b8_\b9 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T& edge)\n-690 {}\n-_\b6_\b9_\b1 int _\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate_)\n-692 {\n-693 return -1;\n-694 }\n-_\b6_\b9_\b5 int _\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs() const\n-696 {\n-697 return -1;\n-698 }\n-699 };\n-700\n-701 template\n-702 struct AggregateAdder\n-703 {\n-_\b7_\b0_\b4 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br(_\bV_\be_\bc_\bt_\bo_\br& subdomains_, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& aggregates_,\n-705 const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b>& graph_, VM& visitedMap_)\n-706 : subdomains(subdomains_), subdomain(-1), aggregates(aggregates_),\n-707 adder(subdomains_, aggregates_), graph(graph_), visitedMap(visitedMap_)\n-708 {}\n-709 template\n-_\b7_\b1_\b0 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T& edge)\n-711 {\n-712 subdomains[subdomain].insert(edge.target());\n-713 // If we (the neighbouring vertex of the aggregate)\n-714 // are not isolated, add the aggregate we belong to\n-715 // to the same subdomain using the OneOverlapAdder\n-716 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED) {\n-717 assert(aggregates[edge.target()]!=aggregate);\n-718 typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bL_\bi_\bs_\bt vlist;\n-719 aggregates.template breadthFirstSearch(edge.target(),\n-aggregate,\n-720 graph, vlist, adder, adder,\n-721 visitedMap);\n-722 }\n-723 }\n-724\n-_\b7_\b2_\b5 int _\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate_)\n-726 {\n-727 adder.setAggregate(aggregate_);\n-728 aggregate=aggregate_;\n-729 return ++subdomain;\n-730 }\n-_\b7_\b3_\b1 int _\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs() const\n-732 {\n-733 return subdomain+1;\n-734 }\n-735\n-736 private:\n-737 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br aggregate;\n-738 _\bV_\be_\bc_\bt_\bo_\br& subdomains;\n-739 int subdomain;\n-740 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& aggregates;\n-741 VertexAdder adder;\n-742 const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b>& graph;\n-743 VM& visitedMap;\n-744 };\n-745\n-746 void createPairDomains(const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b>& graph)\n-747 {\n-748 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br VIter;\n-749 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br EIter;\n-750 typedef typename M::size_type size_type;\n-751\n-752 std::set > pairs;\n-753 int total=0;\n-754 for(VIter v=graph._\bb_\be_\bg_\bi_\bn(), ve=graph._\be_\bn_\bd(); ve != v; ++v)\n-755 for(EIter e = v.begin(), ee=v.end(); ee!=e; ++e)\n-756 {\n-757 ++total;\n-758 if(e.source() >::const_iterator\n-SIter;\n-768 typename Vector::iterator subdomain=subdomains.begin();\n-769\n-770 for(SIter s=pairs.begin(), se =pairs.end(); se!=s; ++s)\n-771 {\n-772 subdomain->insert(s->first);\n-773 subdomain->insert(s->second);\n-774 ++subdomain;\n-775 }\n-776 std::size_t minsize=10000;\n-777 std::size_t maxsize=0;\n-778 int sum=0;\n-779 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {\n-780 sum+=subdomains[i].size();\n-781 minsize=std::min(minsize, subdomains[i].size());\n-782 maxsize=std::max(maxsize, subdomains[i].size());\n-783 }\n-784 Dune::dinfo<<\"Subdomain size: min=\"<\n-789 void createSubdomains(const M& matrix, const MatrixGraph& graph,\n-790 const AggregatesMap& amap, Visitor& overlapVisitor,\n-791 IteratorPropertyMap::iterator,IdentityMap>& visitedMap )\n-792 {\n-793 // count number ag aggregates. We assume that the\n-794 // aggregates are numbered consecutively from 0 except\n-795 // for the isolated ones. All isolated vertices form\n-796 // one aggregate, here.\n-797 int isolated=0;\n-798 AggregateDescriptor maxAggregate=0;\n-799\n-800 for(std::size_t i=0; i < amap.noVertices(); ++i)\n-801 if(amap[i]==_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n-802 isolated++;\n-803 else\n-804 maxAggregate = std::max(maxAggregate, amap[i]);\n-805\n-806 subdomains.resize(maxAggregate+1+isolated);\n-807\n-808 // reset the subdomains\n-809 for(typename Vector::size_type i=0; i < subdomains.size(); ++i)\n-810 subdomains[i].clear();\n-811\n-812 // Create the subdomains from the aggregates mapping.\n-813 // For each aggregate we mark all entries and the\n-814 // neighbouring vertices as belonging to the same subdomain\n-815 VertexAdder aggregateVisitor(subdomains, amap);\n-816\n-817 for(VertexDescriptor i=0; i < amap.noVertices(); ++i)\n-818 if(!_\bg_\be_\bt(visitedMap, i)) {\n-819 AggregateDescriptor aggregate=amap[i];\n-820\n-821 if(amap[i]==_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n-822 // isolated vertex gets its own aggregate\n-823 subdomains.push_back(Subdomain());\n-824 aggregate=subdomains.size()-1;\n-825 }\n-826 overlapVisitor.setAggregate(aggregate);\n-827 aggregateVisitor.setAggregate(aggregate);\n-828 subdomains[aggregate].insert(i);\n-829 typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bL_\bi_\bs_\bt vlist;\n-830 amap.template breadthFirstSearch(i, aggregate, graph, vlist,\n-aggregateVisitor,\n-831 overlapVisitor, visitedMap);\n-832 }\n-833\n-834 std::size_t minsize=10000;\n-835 std::size_t maxsize=0;\n-836 int sum=0;\n-837 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {\n-838 sum+=subdomains[i].size();\n-839 minsize=std::min(minsize, subdomains[i].size());\n-840 maxsize=std::max(maxsize, subdomains[i].size());\n-841 }\n-842 Dune::dinfo<<\"Subdomain size: min=\"<\n-_\b8_\b5_\b3 struct ConstructionTraits<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz >\n-854 {\n-_\b8_\b5_\b5 typedef _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bS_\b,_\bT_\bA_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-856\n-_\b8_\b5_\b7 static inline std::shared_ptr>\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-858 {\n-859 return std::make_shared>\n-860 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(),\n-861 args._\bg_\be_\bt_\bS_\bu_\bb_\bD_\bo_\bm_\ba_\bi_\bn_\bs(),\n-862 args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br,\n-863 args._\bg_\be_\bt_\bA_\br_\bg_\bs().onthefly);\n-864 }\n-865 };\n-866\n-867\n-868 } // namespace Amg\n-869} // namespace Dune\n-870\n-871\n-872\n-873#endif\n-_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh\n-_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh\n-_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n-Define general preconditioner interface.\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-Helper classes for the construction of classes without empty constructor.\n-_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n-Provides classes for the Coloring process of AMG.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-DefaultSmootherArgs< typename X::field_type > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh\n-static void postSmooth(Smoother &smoother, Domain &v, Range &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:494\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bN_\bo_\bn_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const T &edge)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:689\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh\n-static void preSmooth(Smoother &smoother, Domain &v, const Range &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:518\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bJ_\ba_\bc_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< SeqJac< M, X, Y, l > > construct(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:256\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-ConstructionArgs< SeqILU< M, X, Y > > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:309\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-const Matrix & getMatrix() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bR_\ba_\bn_\bg_\be\n-Smoother::range_type Range\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:515\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bN_\bo_\bn_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n-int setAggregate(const AggregateDescriptor &aggregate_)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:691\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br_\b:_\b:_\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n-int setAggregate(const AggregateDescriptor &aggregate_)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:670\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:\n-_\bS_\be_\bq_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs\n-ConstructionTraits< T > SeqConstructionTraits\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:350\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bs_\be_\bt_\bA_\br_\bg_\bs\n-void setArgs(const SmootherArgs &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:119\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:855\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n-NonoverlappingBlockPreconditioner< C, SeqSOR< M, X, Y, l > > Smoother\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:484\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh\n-static void postSmooth(Smoother &smoother, Domain &v, Range &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:456\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br\n-AggregateAdder(Vector &subdomains_, const AggregatesMap &aggregates_, const\n-MatrixGraph< const M > &graph_, VM &visitedMap_)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:704\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp\n-Overlap\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:538\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bs_\be_\bt_\bC_\bo_\bm_\bm\n-void setComm(const C &comm)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-DefaultConstructionArgs< Richardson< X, Y > > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:\n-_\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-virtual ~DefaultConstructionArgs()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:180\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-SeqOverlappingSchwarzSmootherArgs< typename M::field_type > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:552\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn\n-Vector::value_type Subdomain\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:566\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh\n-static void preSmooth(Smoother &smoother, Domain &v, Range &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:488\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bN\n-int getN()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bR_\ba_\bn_\bg_\be\n-Smoother::range_type Range\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:485\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n-SeqSOR< M, X, Y, l > Smoother\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:446\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const T &edge)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:710\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< SeqSSOR< M, X, Y, l > > construct(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:224\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-AggregatesMap::AggregateDescriptor AggregateDescriptor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:564\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bo_\bn_\bt_\bh_\be_\bf_\bl_\by\n-bool onthefly\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:541\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-DefaultConstructionArgs< SeqSOR< M, X, Y, l > > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:238\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-virtual void setMatrix(const M &matrix, const AggregatesMap &amap)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:568\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-void setMatrix(const Args &...)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:184\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bJ_\ba_\bc_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-DefaultConstructionArgs< SeqJac< M, X, Y, l > > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:254\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-DefaultConstructionArgs< SeqSSOR< M, X, Y, l > > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:222\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bg_\be_\bt_\bA_\br_\bg_\bs\n-const SmootherArgs getArgs() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:133\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br\n-VertexAdder(Vector &subdomains_, const AggregatesMap &aggregates_)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:661\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bg_\be_\bt_\bS_\bu_\bb_\bD_\bo_\bm_\ba_\bi_\bn_\bs\n-const Vector & getSubDomains()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:653\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bV_\be_\bc_\bt_\bo_\br\n-SeqOverlappingSchwarz< M, X, TM, TS, TA >::subdomain_vector Vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:565\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< SeqOverlappingSchwarz< M, X, TM, TS, TA > > construct\n-(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:857\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n-_\b>_\b _\b>_\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh\n-static void preSmooth(Smoother &smoother, Domain &v, Range &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:469\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:725\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+_\b5_\b5_\b4 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"cholmod\", _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br());\n+555\n+556} /* namespace Dune */\n+557\n+558#endif // HAVE_SUITESPARSE_CHOLMOD\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n+_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh\n+_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR\n+#define DUNE_REGISTER_DIRECT_SOLVER(name,...)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:13\n+_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+This file implements a vector space as a tensor product of a given vector\n+space. The number of compon...\n+_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n+Define general, extensible interface for inverse operators.\n+_\bf_\bo_\br_\be_\ba_\bc_\bh_\b._\bh_\bh\n+_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\bD_\bu_\bn_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh\n+std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f,\n+std::size_t rowOffset=0, std::size_t colOffset=0)\n+Traverse a blocked matrix and call a functor at each scalar entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh\n+std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0)\n+Traverse a blocked vector and call a functor at each scalar entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd\n+Dune wrapper for SuiteSparse/CHOLMOD solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\bo_\bm_\bm_\bo_\bn_\bO_\bb_\bj_\be_\bc_\bt\n+cholmod_common & cholmodCommonObject()\n+return a reference to the CHOLMOD common object for advanced option settings\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:481\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n void setMatrix(const Matrix &matrix)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:104\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n-T Smoother\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:371\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh\n-static void preSmooth(Smoother &smoother, Domain &v, Range &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:450\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n-_\b>_\b _\b>_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n-BlockPreconditioner< X, Y, C, SeqSOR< M, X, Y, l > > Smoother\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:465\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bC_\bo_\bm_\bm\n-void setComm(T1 &comm)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:193\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br_\b:_\b:_\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs\n-int noSubdomains() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:676\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-AggregateDescriptor * iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:735\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh\n-void presmooth(LevelContext &levelContext, size_t steps)\n-Apply pre smoothing on the current level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:406\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n-Smoother::domain_type Domain\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:516\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-SeqOverlappingSchwarzSmootherArgs(Overlap overlap_=vertex, bool\n-onthefly_=false)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:543\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-DefaultParallelConstructionArgs< T, C > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:337\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-DefaultParallelConstructionArgs< T, C > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:349\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n-const Matrix * matrix_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:139\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:730\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm\n-const SequentialInformation & getComm()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-V AggregateDescriptor\n-The aggregate descriptor type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:580\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD\n-static const V ISOLATED\n-Identifier of isolated vertices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:571\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-DefaultSmootherArgs()\n+Set matrix without ignore nodes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:322\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bF_\ba_\bc_\bt_\bo_\br\n+cholmod_factor & cholmodFactor()\n+The CHOLMOD data structure that stores the factorization.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:491\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\b~_\bC_\bh_\bo_\bl_\bm_\bo_\bd\n+~Cholmod()\n+Destructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:239\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+Cholmod & operator=(const Cholmod &)=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the solver (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:471\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(Vector &x, Vector &b, InverseOperatorResult &res)\n+solve the linear system Ax=b (possibly with respect to some ignore field)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:263\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd\n+Cholmod(const Cholmod &)=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bc_\bh_\bo_\bl_\bm_\bo_\bd_\bF_\ba_\bc_\bt_\bo_\br\n+const cholmod_factor & cholmodFactor() const\n+The CHOLMOD data structure that stores the factorization.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:501\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(Vector &x, Vector &b, double reduction, InverseOperatorResult &res)\n+simple forward to apply(X&, Y&, InverseOperatorResult&)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:253\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd\n+Cholmod()\n Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-void setMatrix(const M &matrix)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:606\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n-std::size_t noVertices() const\n-Get the number of vertices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const T &edge)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:665\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh\n-static void postSmooth(Smoother &smoother, Domain &v, const Range &d)\n-apply post smoothing in forward direction\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:394\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bR_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br\n-FieldTraits< T >::real_type RelaxationFactor\n-The type of the relaxation factor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n-Smoother::domain_type Domain\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:486\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n-Smoother::domain_type Domain\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:373\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bN\n-void setN(int n)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:288\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< BlockPreconditioner< X, Y, C, T > > construct(Arguments\n-&args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:339\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bL_\bi_\bs_\bt\n-SLList< VertexDescriptor, Allocator > VertexList\n-The type of a single linked list of vertex descriptors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:592\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< NonoverlappingBlockPreconditioner< C, T > > construct\n-(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:351\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n-SeqOverlappingSchwarz< M, X, MultiplicativeSchwarzMode, MS, TA > Smoother\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:514\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bP_\ba_\br_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< ParSSOR< M, X, Y, C > > construct(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:326\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-MatrixGraph< M >::VertexDescriptor VertexDescriptor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:562\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< SeqILU< M, X, Y > > construct(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:311\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs\n-int noSubdomains() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:731\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm\n-const SequentialInformation & getComm()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:196\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< SeqSOR< M, X, Y, l > > construct(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:240\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< Richardson< X, Y > > construct(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:271\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-virtual void setMatrix(const Matrix &matrix, const AggregatesMap &amap)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:108\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bN_\bo_\bn_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs\n-int noSubdomains() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:695\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh\n-void postsmooth(LevelContext &levelContext, size_t steps)\n-Apply post smoothing on the current level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:428\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-Dune::Amg::AggregatesMap< VertexDescriptor > AggregatesMap\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:563\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bA_\br_\bg_\bs\n-const SmootherArgs getArgs() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:201\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bs_\be_\bt_\bC_\bo_\bm_\bm\n-void setComm(T1 &comm)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh\n-static void postSmooth(Smoother &smoother, Domain &v, const Range &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:524\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bP_\ba_\br_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-DefaultParallelConstructionArgs< M, C > Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:324\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br\n-RelaxationFactor relaxationFactor\n-The relaxation factor to use.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-virtual ~DefaultParallelConstructionArgs()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n-Smoother::domain_type Domain\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:448\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n-int setAggregate(const AggregateDescriptor &aggregate_)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:725\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bR_\ba_\bn_\bg_\be\n-Smoother::range_type Range\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:447\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm\n-const C & getComm() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:163\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-virtual ~DefaultConstructionArgs()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh\n-static void preSmooth(Smoother &smoother, Domain &v, const Range &d)\n-apply pre smoothing in forward direction\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:382\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n-_\b>_\b _\b>_\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh\n-static void postSmooth(Smoother &smoother, Domain &v, Range &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:475\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:\n-_\bS_\be_\bq_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs\n-ConstructionTraits< T > SeqConstructionTraits\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:338\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-ConstructionArgs(int n=0)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:284\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n-_\b>_\b _\b>_\b:_\b:_\bR_\ba_\bn_\bg_\be\n-Smoother::range_type Range\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bA_\br_\bg_\bs\n-void setArgs(const SmootherArgs &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:187\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:229\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+void setMatrix(const Matrix &matrix, const Ignore *ignore)\n+Set matrix and ignore nodes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:343\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:527\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL\n+>::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const\n+M &mat, const Dune::ParameterTree &, std::enable_if_t< isValidBlock< typename\n+Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:535\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\bo_\bl_\bm_\bo_\bd_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn cholmod.hh:528\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+A generic dynamic dense matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n int iterations\n-The number of iterations to perform.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bR_\ba_\bn_\bg_\be\n-Smoother::range_type Range\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:372\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp\n-Overlap overlap\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:540\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n-_\b>_\b _\b>_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n-Smoother::domain_type Domain\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:467\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n-@ aggregate\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:538\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bn_\bo_\bn_\be\n-@ none\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:538\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bp_\ba_\bi_\br_\bw_\bi_\bs_\be\n-@ pairwise\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:538\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bv_\be_\br_\bt_\be_\bx\n-@ vertex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:538\n-_\bD_\bu_\bn_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n-Sequential overlapping Schwarz preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-X range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:770\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:765\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n-std::vector< subdomain_type, typename std::allocator_traits< TA >::template\n-rebind_alloc< subdomain_type > > subdomain_vector\n-The vector type containing the subdomain to row index mapping.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:797\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Nonoverlapping parallel preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:276\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-P::range_type range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:284\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-P::domain_type domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:282\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n-Tag that tells the Schwarz method to be multiplicative.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-Class providing information about the mapping of the vertices onto aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-The (undirected) graph of a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd\n-VertexIterator end()\n-Get an iterator over the vertices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-M::size_type VertexDescriptor\n-The vertex descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-VertexIterator begin()\n-Get an iterator over the vertices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-Iterator over all edges starting from a vertex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-The vertex iterator type of the graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:209\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-The default class for the smoother arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs\n-Traits class for getting the attribute class of a smoother.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-Construction Arguments for the default smoothers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:148\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:282\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br\n-Helper class for applying the smoothers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:370\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:537\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:558\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n-Sequential SSOR preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR\n-Sequential SOR preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:262\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:267\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc\n-The sequential jacobian preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:413\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n-Sequential ILU preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:697\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn\n-Richardson preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:878\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR\n-A parallel SSOR preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:175\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Block parallel preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:278\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:285\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:290\n+Number of iterations.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n+bool converged\n+True if convergence criterion has been met.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Abstract base class for all solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00107.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00107.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: fastamgsmoother.hh File Reference\n+dune-istl: novlpschwarz.hh File Reference\n \n \n \n \n \n \n \n@@ -65,33 +65,52 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n-
    fastamgsmoother.hh File Reference
    \n+
    novlpschwarz.hh File Reference
    \n
    \n
    \n-
    #include <cstddef>
    \n+
    #include <iostream>
    \n+#include <fstream>
    \n+#include <vector>
    \n+#include <sstream>
    \n+#include <cmath>
    \n+#include <dune/common/timer.hh>
    \n+#include <dune/common/hybridutilities.hh>
    \n+#include "io.hh"
    \n+#include "bvector.hh"
    \n+#include "vbvector.hh"
    \n+#include "bcrsmatrix.hh"
    \n+#include "gsetc.hh"
    \n+#include "ilu.hh"
    \n+#include "operators.hh"
    \n+#include "solvers.hh"
    \n+#include "preconditioners.hh"
    \n+#include "scalarproducts.hh"
    \n+#include "owneroverlapcopy.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n \n-\n+\n+\n \n

    \n Classes

    struct  Dune::Amg::GaussSeidelPresmoothDefect< level >
    class  Dune::NonoverlappingSchwarzOperator< M, X, Y, C >
     A nonoverlapping operator with communication object. More...
     
    struct  Dune::Amg::GaussSeidelPostsmoothDefect< level >
    class  Dune::NonoverlappingBlockPreconditioner< C, P >
     Nonoverlapping parallel preconditioner. More...
     
    \n \n \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,22 +1,40 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-fastamgsmoother.hh File Reference\n-#include \n+novlpschwarz.hh File Reference\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bi_\bo_\b._\bh_\bh\"\n+#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \"_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n+#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n+#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n+#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n+#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n+#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n+#include \"_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b<_\b _\bl_\be_\bv_\be_\bl_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>\n+\u00a0 A nonoverlapping operator with communication object. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b<_\b _\bl_\be_\bv_\be_\bl_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bP_\b _\b>\n+\u00a0 Nonoverlapping parallel preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n ===============================================================================\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00107_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00107_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: fastamgsmoother.hh Source File\n+dune-istl: novlpschwarz.hh Source File\n \n \n \n \n \n \n \n@@ -70,131 +70,385 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    fastamgsmoother.hh
    \n+
    novlpschwarz.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_FASTAMGSMOOTHER_HH
    \n-
    6#define DUNE_ISTL_FASTAMGSMOOTHER_HH
    \n+
    5#ifndef DUNE_ISTL_NOVLPSCHWARZ_HH
    \n+
    6#define DUNE_ISTL_NOVLPSCHWARZ_HH
    \n
    7
    \n-
    8#include <cstddef>
    \n-
    9
    \n-
    10namespace Dune
    \n-
    11{
    \n-
    12 namespace Amg
    \n-
    13 {
    \n+
    8#include <iostream> // for input/output to shell
    \n+
    9#include <fstream> // for input/output to files
    \n+
    10#include <vector> // STL vector class
    \n+
    11#include <sstream>
    \n+
    12
    \n+
    13#include <cmath> // Yes, we do some math here
    \n
    14
    \n-
    15 template<std::size_t level>
    \n-
    \n-\n-
    17
    \n-
    18 template<typename M, typename X, typename Y>
    \n-
    \n-
    19 static void apply(const M& A, X& x, Y& d,
    \n-
    20 const Y& b)
    \n-
    21 {
    \n-
    22 typedef typename M::ConstRowIterator RowIterator;
    \n-
    23 typedef typename M::ConstColIterator ColIterator;
    \n-
    24
    \n-
    25 typename Y::iterator dIter=d.begin();
    \n-
    26 typename Y::const_iterator bIter=b.begin();
    \n-
    27 typename X::iterator xIter=x.begin();
    \n-
    28
    \n-
    29 for(RowIterator row=A.begin(), end=A.end(); row != end;
    \n-
    30 ++row, ++dIter, ++xIter, ++bIter)
    \n-
    31 {
    \n-
    32 ColIterator col=(*row).begin();
    \n-
    33 *dIter = *bIter;
    \n-
    34
    \n-
    35 for (; col.index()<row.index(); ++col)
    \n-
    36 (*col).mmv(x[col.index()],*dIter); // rhs -= sum_{j<i} a_ij * xnew_j
    \n-
    37 assert(row.index()==col.index());
    \n-
    38 ColIterator diag=col; // upper diagonal matrix not needed as x was 0 before.
    \n-
    39
    \n-
    40 // Not recursive yet. Just solve with the diagonal
    \n-
    41 diag->solve(*xIter,*dIter);
    \n-
    42 *dIter=0; //as r=v
    \n-
    43
    \n-
    44 // Update residual for the symmetric case
    \n-
    45 for(col=(*row).begin(); col.index()<row.index(); ++col)
    \n-
    46 col->mmv(*xIter, d[col.index()]); //d_j-=A_ij x_i
    \n-
    47 }
    \n-
    48 }
    \n-
    \n-
    49 };
    \n-
    \n-
    50
    \n-
    51 template<std::size_t level>
    \n-
    \n-\n-
    53
    \n-
    54 template<typename M, typename X, typename Y>
    \n-
    \n-
    55 static void apply(const M& A, X& x, Y& d,
    \n-
    56 const Y& b)
    \n-
    57 {
    \n-
    58 typedef typename M::ConstRowIterator RowIterator;
    \n-
    59 typedef typename M::ConstColIterator ColIterator;
    \n-
    60 typedef typename Y::block_type YBlock;
    \n-
    61
    \n-
    62 typename Y::iterator dIter=d.beforeEnd();
    \n-
    63 typename X::iterator xIter=x.beforeEnd();
    \n-
    64 typename Y::const_iterator bIter=b.beforeEnd();
    \n-
    65
    \n-
    66 for(RowIterator row=A.beforeEnd(), end=A.beforeBegin(); row != end;
    \n-
    67 --row, --dIter, --xIter, --bIter)
    \n-
    68 {
    \n-
    69 ColIterator endCol=(*row).beforeBegin();
    \n-
    70 ColIterator col=(*row).beforeEnd();
    \n-
    71 *dIter = *bIter;
    \n-
    72
    \n-
    73 for (; col.index()>row.index(); --col)
    \n-
    74 (*col).mmv(x[col.index()],*dIter); // rhs -= sum_{i>j} a_ij * xnew_j
    \n-
    75 assert(row.index()==col.index());
    \n-
    76 ColIterator diag=col;
    \n-
    77 YBlock v=*dIter;
    \n-
    78 // upper diagonal matrix
    \n-
    79 for (--col; col!=endCol; --col)
    \n-
    80 (*col).mmv(x[col.index()],v); // v -= sum_{j<i} a_ij * xold_j
    \n-
    81
    \n-
    82 // Not recursive yet. Just solve with the diagonal
    \n-
    83 diag->solve(*xIter,v);
    \n+
    15#include <dune/common/timer.hh>
    \n+
    16
    \n+
    17#include <dune/common/hybridutilities.hh>
    \n+
    18
    \n+
    19#include "io.hh"
    \n+
    20#include "bvector.hh"
    \n+
    21#include "vbvector.hh"
    \n+
    22#include "bcrsmatrix.hh"
    \n+
    23#include "io.hh"
    \n+
    24#include "gsetc.hh"
    \n+
    25#include "ilu.hh"
    \n+
    26#include "operators.hh"
    \n+
    27#include "solvers.hh"
    \n+
    28#include "preconditioners.hh"
    \n+
    29#include "scalarproducts.hh"
    \n+
    30#include "owneroverlapcopy.hh"
    \n+
    31
    \n+
    32namespace Dune {
    \n+
    33
    \n+
    59 template<class M, class X, class Y, class C>
    \n+
    \n+\n+
    61 {
    \n+
    62 public:
    \n+
    64 typedef M matrix_type;
    \n+
    66 typedef X domain_type;
    \n+
    68 typedef Y range_type;
    \n+
    70 typedef typename X::field_type field_type;
    \n+\n+
    73
    \n+
    74 typedef typename C::PIS PIS;
    \n+
    75 typedef typename C::RI RI;
    \n+
    76 typedef typename RI::RemoteIndexList RIL;
    \n+
    77 typedef typename RI::const_iterator RIIterator;
    \n+
    78 typedef typename RIL::const_iterator RILIterator;
    \n+
    79 typedef typename M::ConstColIterator ColIterator;
    \n+
    80 typedef typename M::ConstRowIterator RowIterator;
    \n+
    81 typedef std::multimap<int,int> MM;
    \n+
    82 typedef std::multimap<int,std::pair<int,RILIterator> > RIMap;
    \n+
    83 typedef typename RIMap::iterator RIMapit;
    \n
    84
    \n-
    85 *dIter-=v;
    \n-
    86
    \n-
    87 // Update residual for the symmetric case
    \n-
    88 // Skip residual computation as it is not needed.
    \n-
    89 //for(col=(*row).begin();col.index()<row.index(); ++col)
    \n-
    90 //col.mmv(*xIter, d[col.index()]); //d_j-=A_ij x_i
    \n-
    91 }
    \n-
    92 }
    \n-
    \n-
    93 };
    \n-
    \n-
    94 } // end namespace Amg
    \n-
    95} // end namespace Dune
    \n-
    96#endif
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n+
    \n+\n+
    93 : _A_(stackobject_to_shared_ptr(A)), communication(com), buildcomm(true)
    \n+
    94 {}
    \n+
    \n+
    95
    \n+
    \n+
    96 NonoverlappingSchwarzOperator (std::shared_ptr<const matrix_type> A, const communication_type& com)
    \n+
    97 : _A_(A), communication(com), buildcomm(true)
    \n+
    98 {}
    \n+
    \n+
    99
    \n+
    \n+
    101 virtual void apply (const X& x, Y& y) const
    \n+
    102 {
    \n+
    103 y = 0;
    \n+
    104 novlp_op_apply(x,y,1);
    \n+
    105 communication.addOwnerCopyToOwnerCopy(y,y);
    \n+
    106 }
    \n+
    \n+
    107
    \n+
    \n+
    109 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
    \n+
    110 {
    \n+
    111 // only apply communication to alpha*A*x to make it consistent,
    \n+
    112 // y already has to be consistent.
    \n+
    113 Y y1(y);
    \n+
    114 y = 0;
    \n+
    115 novlp_op_apply(x,y,alpha);
    \n+
    116 communication.addOwnerCopyToOwnerCopy(y,y);
    \n+
    117 y += y1;
    \n+
    118 }
    \n+
    \n+
    119
    \n+
    \n+
    121 virtual const matrix_type& getmat () const
    \n+
    122 {
    \n+
    123 return *_A_;
    \n+
    124 }
    \n+
    \n+
    125
    \n+
    \n+
    126 void novlp_op_apply (const X& x, Y& y, field_type alpha) const
    \n+
    127 {
    \n+
    128 //get index sets
    \n+
    129 const PIS& pis=communication.indexSet();
    \n+
    130 const RI& ri = communication.remoteIndices();
    \n+
    131
    \n+
    132 // at the beginning make a multimap "bordercontribution".
    \n+
    133 // process has i and j as border dofs but is not the owner
    \n+
    134 // => only contribute to Ax if i,j is in bordercontribution
    \n+
    135 if (buildcomm) {
    \n+
    136
    \n+
    137 // set up mask vector
    \n+
    138 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size())) {
    \n+
    139 mask.resize(x.size());
    \n+
    140 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
    \n+
    141 mask[i] = 1;
    \n+
    142 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
    \n+
    143 if (i->local().attribute()==OwnerOverlapCopyAttributeSet::copy)
    \n+
    144 mask[i->local().local()] = 0;
    \n+
    145 else if (i->local().attribute()==OwnerOverlapCopyAttributeSet::overlap)
    \n+
    146 mask[i->local().local()] = 2;
    \n+
    147 }
    \n+
    148
    \n+
    149 for (MM::iterator iter = bordercontribution.begin();
    \n+
    150 iter != bordercontribution.end(); ++iter)
    \n+
    151 bordercontribution.erase(iter);
    \n+
    152 std::map<int,int> owner; //key: local index i, value: process, that owns i
    \n+
    153 RIMap rimap;
    \n+
    154
    \n+
    155 // for each local index make multimap rimap:
    \n+
    156 // key: local index i, data: pair of process that knows i and pointer to RI entry
    \n+
    157 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i)
    \n+
    158 if (mask[i.index()] == 0)
    \n+
    159 for (RIIterator remote = ri.begin(); remote != ri.end(); ++remote) {
    \n+
    160 RIL& ril = *(remote->second.first);
    \n+
    161 for (RILIterator rindex = ril.begin(); rindex != ril.end(); ++rindex)
    \n+
    162 if (rindex->attribute() != OwnerOverlapCopyAttributeSet::overlap)
    \n+
    163 if (rindex->localIndexPair().local().local() == i.index()) {
    \n+
    164 rimap.insert
    \n+
    165 (std::make_pair(i.index(),
    \n+
    166 std::pair<int,RILIterator>(remote->first, rindex)));
    \n+
    167 if(rindex->attribute()==OwnerOverlapCopyAttributeSet::owner)
    \n+
    168 owner.insert(std::make_pair(i.index(),remote->first));
    \n+
    169 }
    \n+
    170 }
    \n+
    171
    \n+
    172 int iowner = 0;
    \n+
    173 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i) {
    \n+
    174 if (mask[i.index()] == 0) {
    \n+
    175 std::map<int,int>::iterator it = owner.find(i.index());
    \n+
    176 iowner = it->second;
    \n+
    177 std::pair<RIMapit, RIMapit> foundiit = rimap.equal_range(i.index());
    \n+
    178 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j) {
    \n+
    179 if (mask[j.index()] == 0) {
    \n+
    180 bool flag = true;
    \n+
    181 for (RIMapit foundi = foundiit.first; foundi != foundiit.second; ++foundi) {
    \n+
    182 std::pair<RIMapit, RIMapit> foundjit = rimap.equal_range(j.index());
    \n+
    183 for (RIMapit foundj = foundjit.first; foundj != foundjit.second; ++foundj)
    \n+
    184 if (foundj->second.first == foundi->second.first)
    \n+
    185 if (foundj->second.second->attribute() == OwnerOverlapCopyAttributeSet::owner
    \n+
    186 || foundj->second.first == iowner
    \n+
    187 || foundj->second.first < communication.communicator().rank()) {
    \n+
    188 flag = false;
    \n+
    189 continue;
    \n+
    190 }
    \n+
    191 if (!flag)
    \n+
    192 continue;
    \n+
    193 }
    \n+
    194 // don\u00b4t contribute to Ax if
    \n+
    195 // 1. the owner of j has i as interior/border dof
    \n+
    196 // 2. iowner has j as interior/border dof
    \n+
    197 // 3. there is another process with smaller rank that has i and j
    \n+
    198 // as interor/border dofs
    \n+
    199 // if the owner of j does not have i as interior/border dof,
    \n+
    200 // it will not be taken into account
    \n+
    201 if (flag)
    \n+
    202 bordercontribution.insert(std::pair<int,int>(i.index(),j.index()));
    \n+
    203 }
    \n+
    204 }
    \n+
    205 }
    \n+
    206 }
    \n+
    207 buildcomm = false;
    \n+
    208 }
    \n+
    209
    \n+
    210 //compute alpha*A*x nonoverlapping case
    \n+
    211 for (RowIterator i = _A_->begin(); i != _A_->end(); ++i) {
    \n+
    212 if (mask[i.index()] == 0) {
    \n+
    213 //dof doesn't belong to process but is border (not ghost)
    \n+
    214 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j) {
    \n+
    215 if (mask[j.index()] == 1) //j is owner => then sum entries
    \n+
    216 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
    \n+
    217 else if (mask[j.index()] == 0) {
    \n+
    218 std::pair<MM::iterator, MM::iterator> itp =
    \n+
    219 bordercontribution.equal_range(i.index());
    \n+
    220 for (MM::iterator it = itp.first; it != itp.second; ++it)
    \n+
    221 if ((*it).second == (int)j.index())
    \n+
    222 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
    \n+
    223 }
    \n+
    224 }
    \n+
    225 }
    \n+
    226 else if (mask[i.index()] == 1) {
    \n+
    227 for (ColIterator j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end(); ++j)
    \n+
    228 if (mask[j.index()] != 2)
    \n+
    229 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);
    \n+
    230 }
    \n+
    231 }
    \n+
    232 }
    \n+
    \n+
    233
    \n+
    \n+\n+
    236 {
    \n+\n+
    238 }
    \n+
    \n+
    239
    \n+
    \n+\n+
    242 {
    \n+
    243 return communication;
    \n+
    244 }
    \n+
    \n+
    245 private:
    \n+
    246 std::shared_ptr<const matrix_type> _A_;
    \n+
    247 const communication_type& communication;
    \n+
    248 mutable bool buildcomm;
    \n+
    249 mutable std::vector<double> mask;
    \n+
    250 mutable std::multimap<int,int> bordercontribution;
    \n+
    251 };
    \n+
    \n+
    252
    \n+
    \n+
    255 namespace Amg
    \n+
    256 {
    \n+
    257 template<class T> struct ConstructionTraits;
    \n+
    258 }
    \n+
    \n+
    259
    \n+
    274 template<class C, class P>
    \n+
    \n+\n+
    276 : public Preconditioner<typename P::domain_type,typename P::range_type> {
    \n+
    277 friend struct Amg::ConstructionTraits<NonoverlappingBlockPreconditioner<C,P> >;
    \n+
    278 using X = typename P::domain_type;
    \n+
    279 using Y = typename P::range_type;
    \n+
    280 public:
    \n+
    282 typedef typename P::domain_type domain_type;
    \n+
    284 typedef typename P::range_type range_type;
    \n+\n+
    287
    \n+
    \n+\n+
    296 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)
    \n+
    297 { }
    \n+
    \n+
    298
    \n+
    \n+
    306 NonoverlappingBlockPreconditioner (const std::shared_ptr<P>& p, const communication_type& c)
    \n+
    307 : _preconditioner(p), _communication(c)
    \n+
    308 { }
    \n+
    \n+
    309
    \n+
    \n+
    315 virtual void pre (domain_type& x, range_type& b)
    \n+
    316 {
    \n+
    317 _preconditioner->pre(x,b);
    \n+
    318 }
    \n+
    \n+
    319
    \n+
    \n+
    325 virtual void apply (domain_type& v, const range_type& d)
    \n+
    326 {
    \n+
    327 // block preconditioner equivalent to WrappedPreconditioner from
    \n+
    328 // pdelab/backend/ovlpistsolverbackend.hh,
    \n+
    329 // but not to BlockPreconditioner from schwarz.hh
    \n+
    330 _preconditioner->apply(v,d);
    \n+
    331 _communication.addOwnerCopyToOwnerCopy(v,v);
    \n+
    332 }
    \n+
    \n+
    333
    \n+
    334 template<bool forward>
    \n+
    \n+
    335 void apply (X& v, const Y& d)
    \n+
    336 {
    \n+
    337 _preconditioner->template apply<forward>(v,d);
    \n+
    338 _communication.addOwnerCopyToOwnerCopy(v,v);
    \n+
    339 }
    \n+
    \n+
    340
    \n+
    \n+
    346 virtual void post (domain_type& x)
    \n+
    347 {
    \n+
    348 _preconditioner->post(x);
    \n+
    349 }
    \n+
    \n+
    350
    \n+
    \n+\n+
    353 {
    \n+\n+
    355 }
    \n+
    \n+
    356
    \n+
    357 private:
    \n+
    359 std::shared_ptr<P> _preconditioner;
    \n+
    360
    \n+
    362 const communication_type& _communication;
    \n+
    363 };
    \n+
    \n+
    364
    \n+
    367} // end namespace
    \n+
    368
    \n+
    369#endif
    \n+
    Some generic functions for pretty printing vectors and matrices.
    \n+
    Implementation of the BCRSMatrix class.
    \n+
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n+
    The incomplete LU factorization kernels.
    \n+
    Define base class for scalar product and norm.
    \n+
    Implementations of the inverse operator interface.
    \n+
    Define general preconditioner interface.
    \n+
    Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
    \n+\n+
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n
    Definition allocator.hh:11
    \n-
    Definition fastamgsmoother.hh:16
    \n-
    static void apply(const M &A, X &x, Y &d, const Y &b)
    Definition fastamgsmoother.hh:19
    \n-
    Definition fastamgsmoother.hh:52
    \n-
    static void apply(const M &A, X &x, Y &d, const Y &b)
    Definition fastamgsmoother.hh:55
    \n+
    A nonoverlapping operator with communication object.
    Definition novlpschwarz.hh:61
    \n+
    C::PIS PIS
    Definition novlpschwarz.hh:74
    \n+
    C communication_type
    The type of the communication object.
    Definition novlpschwarz.hh:72
    \n+
    std::multimap< int, std::pair< int, RILIterator > > RIMap
    Definition novlpschwarz.hh:82
    \n+
    C::RI RI
    Definition novlpschwarz.hh:75
    \n+
    void novlp_op_apply(const X &x, Y &y, field_type alpha) const
    Definition novlpschwarz.hh:126
    \n+
    NonoverlappingSchwarzOperator(std::shared_ptr< const matrix_type > A, const communication_type &com)
    Definition novlpschwarz.hh:96
    \n+
    M::ConstColIterator ColIterator
    Definition novlpschwarz.hh:79
    \n+
    virtual void apply(const X &x, Y &y) const
    apply operator to x:
    Definition novlpschwarz.hh:101
    \n+
    X domain_type
    The type of the domain.
    Definition novlpschwarz.hh:66
    \n+
    virtual SolverCategory::Category category() const
    Category of the linear operator (see SolverCategory::Category)
    Definition novlpschwarz.hh:235
    \n+
    RIMap::iterator RIMapit
    Definition novlpschwarz.hh:83
    \n+
    virtual const matrix_type & getmat() const
    get matrix via *
    Definition novlpschwarz.hh:121
    \n+
    RIL::const_iterator RILIterator
    Definition novlpschwarz.hh:78
    \n+
    std::multimap< int, int > MM
    Definition novlpschwarz.hh:81
    \n+
    Y range_type
    The type of the range.
    Definition novlpschwarz.hh:68
    \n+
    M matrix_type
    The type of the matrix we operate on.
    Definition novlpschwarz.hh:64
    \n+
    M::ConstRowIterator RowIterator
    Definition novlpschwarz.hh:80
    \n+
    const communication_type & getCommunication() const
    Get the object responsible for communication.
    Definition novlpschwarz.hh:241
    \n+
    virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const
    apply operator to x, scale and add:
    Definition novlpschwarz.hh:109
    \n+
    RI::RemoteIndexList RIL
    Definition novlpschwarz.hh:76
    \n+
    X::field_type field_type
    The field type of the range.
    Definition novlpschwarz.hh:70
    \n+
    NonoverlappingSchwarzOperator(const matrix_type &A, const communication_type &com)
    constructor: just store a reference to a matrix.
    Definition novlpschwarz.hh:92
    \n+
    RI::const_iterator RIIterator
    Definition novlpschwarz.hh:77
    \n+
    Nonoverlapping parallel preconditioner.
    Definition novlpschwarz.hh:276
    \n+
    NonoverlappingBlockPreconditioner(P &p, const communication_type &c)
    Constructor.
    Definition novlpschwarz.hh:295
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition novlpschwarz.hh:352
    \n+
    virtual void apply(domain_type &v, const range_type &d)
    Apply the preconditioner.
    Definition novlpschwarz.hh:325
    \n+
    P::range_type range_type
    The range type of the preconditioner.
    Definition novlpschwarz.hh:284
    \n+
    NonoverlappingBlockPreconditioner(const std::shared_ptr< P > &p, const communication_type &c)
    Constructor.
    Definition novlpschwarz.hh:306
    \n+
    virtual void post(domain_type &x)
    Clean up.
    Definition novlpschwarz.hh:346
    \n+
    C communication_type
    The type of the communication object.
    Definition novlpschwarz.hh:286
    \n+
    virtual void pre(domain_type &x, range_type &b)
    Prepare the preconditioner.
    Definition novlpschwarz.hh:315
    \n+
    void apply(X &v, const Y &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition novlpschwarz.hh:335
    \n+
    P::domain_type domain_type
    The domain type of the preconditioner.
    Definition novlpschwarz.hh:282
    \n+
    A linear operator exporting itself in matrix form.
    Definition operators.hh:111
    \n+
    @ owner
    Definition owneroverlapcopy.hh:61
    \n+
    @ copy
    Definition owneroverlapcopy.hh:61
    \n+
    @ overlap
    Definition owneroverlapcopy.hh:61
    \n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ nonoverlapping
    Category for non-overlapping solvers.
    Definition solvercategory.hh:27
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,123 +1,474 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-fastamgsmoother.hh\n+novlpschwarz.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_FASTAMGSMOOTHER_HH\n-6#define DUNE_ISTL_FASTAMGSMOOTHER_HH\n+5#ifndef DUNE_ISTL_NOVLPSCHWARZ_HH\n+6#define DUNE_ISTL_NOVLPSCHWARZ_HH\n 7\n-8#include \n-9\n-10namespace _\bD_\bu_\bn_\be\n-11{\n-12 namespace Amg\n-13 {\n+8#include // for input/output to shell\n+9#include // for input/output to files\n+10#include // STL vector class\n+11#include \n+12\n+13#include // Yes, we do some math here\n 14\n-15 template\n-_\b1_\b6 struct _\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt {\n-17\n-18 template\n-_\b1_\b9 static void _\ba_\bp_\bp_\bl_\by(const M& A, X& x, Y& d,\n-20 const Y& b)\n-21 {\n-22 typedef typename M::ConstRowIterator RowIterator;\n-23 typedef typename M::ConstColIterator ColIterator;\n-24\n-25 typename Y::iterator dIter=d.begin();\n-26 typename Y::const_iterator bIter=b.begin();\n-27 typename X::iterator xIter=x.begin();\n-28\n-29 for(RowIterator row=A.begin(), end=A.end(); row != end;\n-30 ++row, ++dIter, ++xIter, ++bIter)\n-31 {\n-32 ColIterator _\bc_\bo_\bl=(*row).begin();\n-33 *dIter = *bIter;\n-34\n-35 for (; _\bc_\bo_\bl.index()solve(*xIter,*dIter);\n-42 *dIter=0; //as r=v\n-43\n-44 // Update residual for the symmetric case\n-45 for(_\bc_\bo_\bl=(*row).begin(); _\bc_\bo_\bl.index()mmv(*xIter, d[_\bc_\bo_\bl.index()]); //d_j-=A_ij x_i\n-47 }\n-48 }\n-49 };\n-50\n-51 template\n-_\b5_\b2 struct _\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt {\n-53\n-54 template\n-_\b5_\b5 static void _\ba_\bp_\bp_\bl_\by(const M& A, X& x, Y& d,\n-56 const Y& b)\n-57 {\n-58 typedef typename M::ConstRowIterator RowIterator;\n-59 typedef typename M::ConstColIterator ColIterator;\n-60 typedef typename Y::block_type YBlock;\n-61\n-62 typename Y::iterator dIter=d.beforeEnd();\n-63 typename X::iterator xIter=x.beforeEnd();\n-64 typename Y::const_iterator bIter=b.beforeEnd();\n-65\n-66 for(RowIterator row=A.beforeEnd(), end=A.beforeBegin(); row != end;\n-67 --row, --dIter, --xIter, --bIter)\n-68 {\n-69 ColIterator endCol=(*row).beforeBegin();\n-70 ColIterator _\bc_\bo_\bl=(*row).beforeEnd();\n-71 *dIter = *bIter;\n-72\n-73 for (; _\bc_\bo_\bl.index()>row.index(); --_\bc_\bo_\bl)\n-74 (*col).mmv(x[_\bc_\bo_\bl.index()],*dIter); // rhs -= sum_{i>j} a_ij * xnew_j\n-75 assert(row.index()==_\bc_\bo_\bl.index());\n-76 ColIterator diag=_\bc_\bo_\bl;\n-77 YBlock v=*dIter;\n-78 // upper diagonal matrix\n-79 for (--_\bc_\bo_\bl; _\bc_\bo_\bl!=endCol; --_\bc_\bo_\bl)\n-80 (*col).mmv(x[_\bc_\bo_\bl.index()],v); // v -= sum_{jsolve(*xIter,v);\n+15#include \n+16\n+17#include \n+18\n+19#include \"_\bi_\bo_\b._\bh_\bh\"\n+20#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+21#include \"_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+22#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+23#include \"_\bi_\bo_\b._\bh_\bh\"\n+24#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n+25#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n+26#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n+27#include \"_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\"\n+28#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n+29#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n+30#include \"_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\"\n+31\n+32namespace _\bD_\bu_\bn_\be {\n+33\n+59 template\n+_\b6_\b0 class _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br : public _\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+61 {\n+62 public:\n+_\b6_\b4 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b6_\b6 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b6_\b8 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b7_\b0 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b7_\b2 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n+73\n+_\b7_\b4 typedef typename C::PIS _\bP_\bI_\bS;\n+_\b7_\b5 typedef typename C::RI _\bR_\bI;\n+_\b7_\b6 typedef typename RI::RemoteIndexList _\bR_\bI_\bL;\n+_\b7_\b7 typedef typename RI::const_iterator _\bR_\bI_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b7_\b8 typedef typename RIL::const_iterator _\bR_\bI_\bL_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b7_\b9 typedef typename M::ConstColIterator _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b8_\b0 typedef typename M::ConstRowIterator _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+_\b8_\b1 typedef std::multimap _\bM_\bM;\n+_\b8_\b2 typedef std::multimap > _\bR_\bI_\bM_\ba_\bp;\n+_\b8_\b3 typedef typename RIMap::iterator _\bR_\bI_\bM_\ba_\bp_\bi_\bt;\n 84\n-85 *dIter-=v;\n-86\n-87 // Update residual for the symmetric case\n-88 // Skip residual computation as it is not needed.\n-89 //for(col=(*row).begin();col.index() A, const\n+_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& com)\n+97 : _A_(A), communication(com), buildcomm(true)\n+98 {}\n+99\n+_\b1_\b0_\b1 virtual void _\ba_\bp_\bp_\bl_\by (const X& x, Y& y) const\n+102 {\n+103 y = 0;\n+104 _\bn_\bo_\bv_\bl_\bp_\b__\bo_\bp_\b__\ba_\bp_\bp_\bl_\by(x,y,1);\n+105 communication.addOwnerCopyToOwnerCopy(y,y);\n+106 }\n+107\n+_\b1_\b0_\b9 virtual void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha, const X& x, Y& y) const\n+110 {\n+111 // only apply communication to alpha*A*x to make it consistent,\n+112 // y already has to be consistent.\n+113 Y y1(y);\n+114 y = 0;\n+115 _\bn_\bo_\bv_\bl_\bp_\b__\bo_\bp_\b__\ba_\bp_\bp_\bl_\by(x,y,alpha);\n+116 communication.addOwnerCopyToOwnerCopy(y,y);\n+117 y += y1;\n+118 }\n+119\n+_\b1_\b2_\b1 virtual const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bg_\be_\bt_\bm_\ba_\bt () const\n+122 {\n+123 return *_A_;\n+124 }\n+125\n+_\b1_\b2_\b6 void _\bn_\bo_\bv_\bl_\bp_\b__\bo_\bp_\b__\ba_\bp_\bp_\bl_\by (const X& x, Y& y, _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha) const\n+127 {\n+128 //get index sets\n+129 const _\bP_\bI_\bS& pis=communication.indexSet();\n+130 const _\bR_\bI& ri = communication.remoteIndices();\n+131\n+132 // at the beginning make a multimap \"bordercontribution\".\n+133 // process has i and j as border dofs but is not the owner\n+134 // => only contribute to Ax if i,j is in bordercontribution\n+135 if (buildcomm) {\n+136\n+137 // set up mask vector\n+138 if (mask.size()!=static_cast::size_type>\n+(x.size())) {\n+139 mask.resize(x.size());\n+140 for (typename std::vector::size_type i=0; ilocal().attribute()==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n+144 mask[i->local().local()] = 0;\n+145 else if (i->local().attribute()==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp)\n+146 mask[i->local().local()] = 2;\n+147 }\n+148\n+149 for (MM::iterator iter = bordercontribution.begin();\n+150 iter != bordercontribution.end(); ++iter)\n+151 bordercontribution.erase(iter);\n+152 std::map owner; //key: local index i, value: process, that owns i\n+153 _\bR_\bI_\bM_\ba_\bp rimap;\n+154\n+155 // for each local index make multimap rimap:\n+156 // key: local index i, data: pair of process that knows i and pointer to RI\n+entry\n+157 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i = _A_->begin(); i != _A_->end(); ++i)\n+158 if (mask[i.index()] == 0)\n+159 for (_\bR_\bI_\bI_\bt_\be_\br_\ba_\bt_\bo_\br remote = ri.begin(); remote != ri.end(); ++remote) {\n+160 _\bR_\bI_\bL& ril = *(remote->second.first);\n+161 for (_\bR_\bI_\bL_\bI_\bt_\be_\br_\ba_\bt_\bo_\br rindex = ril.begin(); rindex != ril.end(); ++rindex)\n+162 if (rindex->attribute() != _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp)\n+163 if (rindex->localIndexPair().local().local() == i.index()) {\n+164 rimap.insert\n+165 (std::make_pair(i.index(),\n+166 std::pair(remote->first, rindex)));\n+167 if(rindex->attribute()==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br)\n+168 owner.insert(std::make_pair(i.index(),remote->first));\n+169 }\n+170 }\n+171\n+172 int iowner = 0;\n+173 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i = _A_->begin(); i != _A_->end(); ++i) {\n+174 if (mask[i.index()] == 0) {\n+175 std::map::iterator it = owner.find(i.index());\n+176 iowner = it->second;\n+177 std::pair foundiit = rimap.equal_range(i.index());\n+178 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end\n+(); ++j) {\n+179 if (mask[j.index()] == 0) {\n+180 bool flag = true;\n+181 for (_\bR_\bI_\bM_\ba_\bp_\bi_\bt foundi = foundiit.first; foundi != foundiit.second; ++foundi)\n+{\n+182 std::pair foundjit = rimap.equal_range(j.index());\n+183 for (_\bR_\bI_\bM_\ba_\bp_\bi_\bt foundj = foundjit.first; foundj != foundjit.second; ++foundj)\n+184 if (foundj->second.first == foundi->second.first)\n+185 if (foundj->second.second->attribute() == _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:\n+_\bo_\bw_\bn_\be_\br\n+186 || foundj->second.first == iowner\n+187 || foundj->second.first < communication.communicator().rank()) {\n+188 flag = false;\n+189 continue;\n+190 }\n+191 if (!flag)\n+192 continue;\n+193 }\n+194 // don\u00c2\u00b4t contribute to Ax if\n+195 // 1. the owner of j has i as interior/border dof\n+196 // 2. iowner has j as interior/border dof\n+197 // 3. there is another process with smaller rank that has i and j\n+198 // as interor/border dofs\n+199 // if the owner of j does not have i as interior/border dof,\n+200 // it will not be taken into account\n+201 if (flag)\n+202 bordercontribution.insert(std::pair(i.index(),j.index()));\n+203 }\n+204 }\n+205 }\n+206 }\n+207 buildcomm = false;\n+208 }\n+209\n+210 //compute alpha*A*x nonoverlapping case\n+211 for (_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br i = _A_->begin(); i != _A_->end(); ++i) {\n+212 if (mask[i.index()] == 0) {\n+213 //dof doesn't belong to process but is border (not ghost)\n+214 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end\n+(); ++j) {\n+215 if (mask[j.index()] == 1) //j is owner => then sum entries\n+216 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);\n+217 else if (mask[j.index()] == 0) {\n+218 std::pair itp =\n+219 bordercontribution.equal_range(i.index());\n+220 for (MM::iterator it = itp.first; it != itp.second; ++it)\n+221 if ((*it).second == (int)j.index())\n+222 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);\n+223 }\n+224 }\n+225 }\n+226 else if (mask[i.index()] == 1) {\n+227 for (_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br j = (*_A_)[i.index()].begin(); j != (*_A_)[i.index()].end\n+(); ++j)\n+228 if (mask[j.index()] != 2)\n+229 Impl::asMatrix(*j).usmv(alpha,x[j.index()],y[i.index()]);\n+230 }\n+231 }\n+232 }\n+233\n+_\b2_\b3_\b5 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+236 {\n+237 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg;\n+238 }\n+239\n+_\b2_\b4_\b1 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& _\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn() const\n+242 {\n+243 return communication;\n+244 }\n+245 private:\n+246 std::shared_ptr _A_;\n+247 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& communication;\n+248 mutable bool buildcomm;\n+249 mutable std::vector mask;\n+_\b2_\b5_\b0 mutable std::multimap bordercontribution;\n+251 };\n+252\n+_\b2_\b5_\b5 namespace Amg\n+256 {\n+257 template struct ConstructionTraits;\n+258 }\n+259\n+274 template\n+_\b2_\b7_\b5 class _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+276 : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br {\n+277 friend struct Amg::\n+ConstructionTraits<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >;\n+278 using X = typename P::domain_type;\n+279 using Y = typename P::range_type;\n+280 public:\n+_\b2_\b8_\b2 typedef typename P::domain_type _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b2_\b8_\b4 typedef typename P::range_type _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b2_\b8_\b6 typedef C _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be;\n+287\n+_\b2_\b9_\b5 _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br (P& p, const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& c)\n+296 : _preconditioner(stackobject_to_shared_ptr(p)), _communication(c)\n+297 { }\n+298\n+_\b3_\b0_\b6 _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br (const std::shared_ptr

    & p, const\n+_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& c)\n+307 : _preconditioner(p), _communication(c)\n+308 { }\n+309\n+_\b3_\b1_\b5 virtual void _\bp_\br_\be (_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b)\n+316 {\n+317 _preconditioner->pre(x,b);\n+318 }\n+319\n+_\b3_\b2_\b5 virtual void _\ba_\bp_\bp_\bl_\by (_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& v, const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& d)\n+326 {\n+327 // block preconditioner equivalent to WrappedPreconditioner from\n+328 // pdelab/backend/ovlpistsolverbackend.hh,\n+329 // but not to BlockPreconditioner from schwarz.hh\n+330 _preconditioner->apply(v,d);\n+331 _communication.addOwnerCopyToOwnerCopy(v,v);\n+332 }\n+333\n+334 template\n+_\b3_\b3_\b5 void _\ba_\bp_\bp_\bl_\by (X& v, const Y& d)\n+336 {\n+337 _preconditioner->template apply(v,d);\n+338 _communication.addOwnerCopyToOwnerCopy(v,v);\n+339 }\n+340\n+_\b3_\b4_\b6 virtual void _\bp_\bo_\bs_\bt (_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x)\n+347 {\n+348 _preconditioner->post(x);\n+349 }\n+350\n+_\b3_\b5_\b2 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+353 {\n+354 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg;\n+355 }\n+356\n+357 private:\n+359 std::shared_ptr

    _preconditioner;\n+360\n+362 const _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be& _communication;\n+363 };\n+364\n+367} // end namespace\n+368\n+369#endif\n+_\bi_\bo_\b._\bh_\bh\n+Some generic functions for pretty printing vectors and matrices.\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n+_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n+Classes providing communication interfaces for overlapping Schwarz methods.\n+_\bi_\bl_\bu_\b._\bh_\bh\n+The incomplete LU factorization kernels.\n+_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\n+Define base class for scalar product and norm.\n+_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n+Implementations of the inverse operator interface.\n+_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n+Define general preconditioner interface.\n+_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\n+Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n+generic way.\n+_\bv_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+???\n+_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n+Define general, extensible interface for operators. The available\n+implementation wraps a matrix.\n+_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+This file implements a vector space as a tensor product of a given vector\n+space. The number of compon...\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamgsmoother.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-static void apply(const M &A, X &x, Y &d, const Y &b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamgsmoother.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamgsmoother.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-static void apply(const M &A, X &x, Y &d, const Y &b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamgsmoother.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A nonoverlapping operator with communication object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bP_\bI_\bS\n+C::PIS PIS\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n+C communication_type\n+The type of the communication object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI_\bM_\ba_\bp\n+std::multimap< int, std::pair< int, RILIterator > > RIMap\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI\n+C::RI RI\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bn_\bo_\bv_\bl_\bp_\b__\bo_\bp_\b__\ba_\bp_\bp_\bl_\by\n+void novlp_op_apply(const X &x, Y &y, field_type alpha) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+NonoverlappingSchwarzOperator(std::shared_ptr< const matrix_type > A, const\n+communication_type &com)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:96\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+M::ConstColIterator ColIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(const X &x, Y &y) const\n+apply operator to x:\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The type of the domain.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the linear operator (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:235\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI_\bM_\ba_\bp_\bi_\bt\n+RIMap::iterator RIMapit\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bm_\ba_\bt\n+virtual const matrix_type & getmat() const\n+get matrix via *\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:121\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI_\bL_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+RIL::const_iterator RILIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bM_\bM\n+std::multimap< int, int > MM\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The type of the range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:68\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+The type of the matrix we operate on.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:64\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+M::ConstRowIterator RowIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+const communication_type & getCommunication() const\n+Get the object responsible for communication.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:241\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd\n+virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const\n+apply operator to x, scale and add:\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:109\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI_\bL\n+RI::RemoteIndexList RIL\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+NonoverlappingSchwarzOperator(const matrix_type &A, const communication_type\n+&com)\n+constructor: just store a reference to a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:92\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bR_\bI_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+RI::const_iterator RIIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Nonoverlapping parallel preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:276\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+NonoverlappingBlockPreconditioner(P &p, const communication_type &c)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:295\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:352\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(domain_type &v, const range_type &d)\n+Apply the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:325\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+P::range_type range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:284\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+NonoverlappingBlockPreconditioner(const std::shared_ptr< P > &p, const\n+communication_type &c)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:306\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\bo_\bs_\bt\n+virtual void post(domain_type &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:346\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b__\bt_\by_\bp_\be\n+C communication_type\n+The type of the communication object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:286\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bp_\br_\be\n+virtual void pre(domain_type &x, range_type &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:315\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(X &v, const Y &d)\n+Apply one step of the preconditioner to the system A(v)=d.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:335\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+P::domain_type domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:282\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A linear operator exporting itself in matrix form.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br\n+@ owner\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by\n+@ copy\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp\n+@ overlap\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n+@ nonoverlapping\n+Category for non-overlapping solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:27\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00110.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00110.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: aggregates.hh File Reference\n+dune-istl: matrix.hh File Reference\n \n \n \n \n \n \n \n@@ -65,117 +65,65 @@\n \n \n \n \n \n

    \n \n+
  • dune
  • istl
  • \n
    \n \n \n+
    matrix.hh File Reference
    \n \n
    \n \n-

    Provides classes for the Coloring process of AMG. \n+

    A dynamic dense block matrix class. \n More...

    \n-
    #include "parameters.hh"
    \n-#include "graph.hh"
    \n-#include "properties.hh"
    \n-#include "combinedfunctor.hh"
    \n-#include <dune/common/timer.hh>
    \n-#include <dune/common/stdstreams.hh>
    \n-#include <dune/common/poolallocator.hh>
    \n-#include <dune/common/sllist.hh>
    \n+
    #include <cmath>
    \n+#include <memory>
    \n #include <dune/common/ftraits.hh>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/scalarvectorview.hh>
    \n #include <dune/common/scalarmatrixview.hh>
    \n-#include <utility>
    \n-#include <set>
    \n-#include <algorithm>
    \n-#include <complex>
    \n-#include <limits>
    \n-#include <ostream>
    \n-#include <tuple>
    \n+#include <dune/istl/bvector.hh>
    \n+#include <dune/istl/istlexception.hh>
    \n+#include <dune/istl/blocklevel.hh>
    \n
    \n

    Go to the source code of this file.

    \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
    \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n

    \n Classes

    class  Dune::Amg::AggregationCriterion< T >
     Base class of all aggregation criterions. More...
    class  Dune::MatrixImp::DenseMatrixBase< B, A >
     A Vector of blocks with different blocksizes. More...
     
    class  Dune::Amg::SymmetricMatrixDependency< M, N >
     Dependency policy for symmetric matrices. More...
    class  Dune::MatrixImp::DenseMatrixBase< B, A >::Iterator
     Iterator class for sequential access. More...
     
    class  Dune::Amg::Dependency< M, N >
     Dependency policy for symmetric matrices. More...
    class  Dune::MatrixImp::DenseMatrixBase< B, A >::ConstIterator
     ConstIterator class for sequential access. More...
     
    class  Dune::Amg::SymmetricDependency< M, N >
     Dependency policy for symmetric matrices. More...
    class  Dune::Matrix< T, A >
     A generic dynamic dense matrix. 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...
    struct  Dune::FieldTraits< Matrix< T, A > >
     
    \n \n \n \n-\n+\n \n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
    namespace  Dune::MatrixImp
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n

    \n-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)
     
    \n

    Detailed Description

    \n-

    Provides classes for the Coloring process of AMG.

    \n-
    Author
    Markus Blatt
    \n+

    A dynamic dense block matrix class.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,104 +1,43 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-aggregates.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Provides classes for the Coloring process of AMG. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \"_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\bh_\bh\"\n-#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n-#include \"_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b._\bh_\bh\"\n-#include \"_\bc_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bf_\bu_\bn_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-#include \n-#include \n-#include \n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+matrix.hh File Reference\n+A dynamic dense block matrix class. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n #include \n+#include \n+#include \n #include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\b _\bT_\b _\b>\n-\u00a0 Base class of all aggregation criterions. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n+\u00a0 A Vector of blocks with different blocksizes. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\b _\bM_\b,_\b _\bN_\b _\b>\n-\u00a0 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by policy for symmetric matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+\u00a0 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br class for sequential access. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\b _\bM_\b,_\b _\bN_\b _\b>\n-\u00a0 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by policy for symmetric matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+\u00a0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br class for sequential access. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\b _\bM_\b,_\b _\bN_\b _\b>\n-\u00a0 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by policy for symmetric matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n+\u00a0 A generic dynamic dense matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b _\bN_\b _\b>\n-\u00a0 Norm that uses only the [N][N] entry of the block to determine\n- couplings. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\bi_\br_\bs_\bt_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n-\u00a0 Norm that uses only the [0][0] entry of the block to determine\n- couplings. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\bo_\bw_\bS_\bu_\bm\n-\u00a0 Functor using the row sum (infinity) norm to determine strong\n- couplings. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\b _\bM_\b,_\b _\bN_\bo_\br_\bm_\b _\b>\n-\u00a0 Criterion taking advantage of symmetric matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\b _\bM_\b,_\b _\bN_\bo_\br_\bm_\b _\b>\n-\u00a0 Criterion suitable for unsymmetric matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bV_\b _\b>\n-\u00a0 Class providing information about the mapping of the vertices onto\n- aggregates. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bV_\b _\b>_\b:_\b:_\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-\u00a0 A Dummy visitor that does nothing for each visited edge. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\b _\bG_\b,_\b _\bS_\b _\b>\n-\u00a0 A class for temporarily storing the vertices of an aggregate in.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\b _\bG_\b _\b>\n-\u00a0 Class for building the aggregates. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const\n- _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn< T > &criterion)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by (G &graph, const typename C::Matrix\n- &matrix, C criterion, bool finestLevel)\n-\u00a0 Build the dependency of the matrix graph.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b2_\bd (const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp< V >\n- &aggregates, int n, int m, std::ostream &os)\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides classes for the Coloring process of AMG.\n- Author\n- Markus Blatt\n+A dynamic dense block matrix class.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00110_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00110_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: aggregates.hh Source File\n+dune-istl: matrix.hh Source File\n \n \n \n \n \n \n \n@@ -70,2259 +70,1258 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    aggregates.hh
    \n+
    matrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_AGGREGATES_HH
    \n-
    6#define DUNE_AMG_AGGREGATES_HH
    \n+
    5#ifndef DUNE_ISTL_MATRIX_HH
    \n+
    6#define DUNE_ISTL_MATRIX_HH
    \n
    7
    \n-
    8
    \n-
    9#include "parameters.hh"
    \n-
    10#include "graph.hh"
    \n-
    11#include "properties.hh"
    \n-
    12#include "combinedfunctor.hh"
    \n-
    13
    \n-
    14#include <dune/common/timer.hh>
    \n-
    15#include <dune/common/stdstreams.hh>
    \n-
    16#include <dune/common/poolallocator.hh>
    \n-
    17#include <dune/common/sllist.hh>
    \n-
    18#include <dune/common/ftraits.hh>
    \n-
    19#include <dune/common/scalarmatrixview.hh>
    \n-
    20
    \n-
    21#include <utility>
    \n-
    22#include <set>
    \n-
    23#include <algorithm>
    \n-
    24#include <complex>
    \n-
    25#include <limits>
    \n-
    26#include <ostream>
    \n-
    27#include <tuple>
    \n-
    28
    \n-
    29namespace Dune
    \n-
    30{
    \n-
    31 namespace Amg
    \n-
    32 {
    \n-
    33
    \n-
    47 template<class T>
    \n-
    \n-
    48 class AggregationCriterion : public T
    \n-
    49 {
    \n-
    50
    \n-
    51 public:
    \n-\n-
    56
    \n-
    \n-\n-
    67 : T()
    \n-
    68 {}
    \n-
    \n-
    69
    \n-
    \n-\n-
    71 : T(parms)
    \n-
    72 {}
    \n-
    \n+
    12#include <cmath>
    \n+
    13#include <memory>
    \n+
    14
    \n+
    15#include <dune/common/ftraits.hh>
    \n+
    16#include <dune/common/typetraits.hh>
    \n+
    17#include <dune/common/scalarvectorview.hh>
    \n+
    18#include <dune/common/scalarmatrixview.hh>
    \n+
    19
    \n+
    20#include <dune/istl/bvector.hh>
    \n+\n+\n+
    23
    \n+
    24namespace Dune {
    \n+
    25
    \n+
    \n+
    26namespace MatrixImp
    \n+
    27{
    \n+
    39 template<class B, class A=std::allocator<B> >
    \n+
    \n+
    40 class DenseMatrixBase : public Imp::block_vector_unmanaged<B,typename A::size_type>
    \n+
    41 // this derivation gives us all the blas level 1 and norms
    \n+
    42 // on the large array. However, access operators have to be
    \n+
    43 // overwritten.
    \n+
    44 {
    \n+
    45 public:
    \n+
    46
    \n+
    47 //===== type definitions and constants
    \n+
    48
    \n+
    50 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n+
    51
    \n+
    53 typedef A allocator_type;
    \n+
    54
    \n+
    56 typedef typename A::size_type size_type;
    \n+
    57
    \n+\n+
    64
    \n+\n+
    68
    \n+
    69 // just a shorthand
    \n+
    70 typedef Imp::BlockVectorWindow<B,A> window_type;
    \n+
    71
    \n+\n+
    73
    \n+\n+
    75
    \n+
    76
    \n+
    77 //===== constructors and such
    \n+
    78
    \n
    \n-
    82 void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
    \n-
    83 {
    \n-
    84 this->setMaxDistance(diameter-1);
    \n-
    85 std::size_t csize=1;
    \n-
    86
    \n-
    87 for(; dim>0; dim--) {
    \n-
    88 csize*=diameter;
    \n-
    89 this->setMaxDistance(this->maxDistance()+diameter-1);
    \n-
    90 }
    \n-
    91 this->setMinAggregateSize(csize);
    \n-
    92 this->setMaxAggregateSize(static_cast<std::size_t>(csize*1.5));
    \n-
    93 }
    \n-
    \n-
    94
    \n-
    \n-
    105 void setDefaultValuesAnisotropic(std::size_t dim,std::size_t diameter=2)
    \n+
    82 DenseMatrixBase () : Imp::block_vector_unmanaged<B,size_type>()
    \n+
    83 {
    \n+
    84 // nothing is known ...
    \n+
    85 rows_ = 0;
    \n+
    86 columns_ = 0;
    \n+
    87 }
    \n+
    \n+
    88
    \n+
    \n+
    95 DenseMatrixBase (size_type rows, size_type columns) : Imp::block_vector_unmanaged<B,size_type>()
    \n+
    96 {
    \n+
    97 // and we can allocate the big array in the base class
    \n+
    98 this->n = rows*columns;
    \n+
    99 columns_ = columns;
    \n+
    100 if (this->n>0)
    \n+
    101 {
    \n+
    102 this->p = allocator_.allocate(this->n);
    \n+
    103 new (this->p)B[this->n];
    \n+
    104 }
    \n+
    105 else
    \n
    106 {
    \n-
    107 setDefaultValuesIsotropic(dim, diameter);
    \n-
    108 this->setMaxDistance(this->maxDistance()+dim-1);
    \n+
    107 this->n = 0;
    \n+
    108 this->p = 0;
    \n
    109 }
    \n+
    110
    \n+
    111 // we can allocate the windows now
    \n+
    112 rows_ = rows;
    \n+
    113 }
    \n+
    \n+
    114
    \n+
    \n+\n+
    117 {
    \n+
    118 // allocate the big array in the base class
    \n+
    119 this->n = a.n;
    \n+
    120 columns_ = a.columns_;
    \n+
    121 if (this->n>0)
    \n+
    122 {
    \n+
    123 // allocate and construct objects
    \n+
    124 this->p = allocator_.allocate(this->n);
    \n+
    125 new (this->p)B[this->n];
    \n+
    126
    \n+
    127 // copy data
    \n+
    128 for (size_type i=0; i<this->n; i++)
    \n+
    129 this->p[i]=a.p[i];
    \n+
    130 }
    \n+
    131 else
    \n+
    132 {
    \n+
    133 this->n = 0;
    \n+
    134 this->p = nullptr;
    \n+
    135 }
    \n+
    136
    \n+
    137 // we can allocate the windows now
    \n+
    138 rows_ = a.rows_;
    \n+
    139 }
    \n
    \n-
    110 };
    \n-
    \n-
    111
    \n-
    112 template<class T>
    \n-
    \n-
    113 std::ostream& operator<<(std::ostream& os, const AggregationCriterion<T>& criterion)
    \n-
    114 {
    \n-
    115 os<<"{ maxdistance="<<criterion.maxDistance()<<" minAggregateSize="
    \n-
    116 <<criterion.minAggregateSize()<< " maxAggregateSize="<<criterion.maxAggregateSize()
    \n-
    117 <<" connectivity="<<criterion.maxConnectivity()<<" debugLevel="<<criterion.debugLevel()<<"}";
    \n-
    118 return os;
    \n-
    119 }
    \n-
    \n-
    120
    \n-
    132 template<class M, class N>
    \n-
    \n-\n-
    134 {
    \n-
    135 public:
    \n-
    139 typedef M Matrix;
    \n
    140
    \n-
    144 typedef N Norm;
    \n-
    145
    \n-
    149 typedef typename Matrix::row_type Row;
    \n-
    150
    \n-\n-
    155
    \n-
    156 void init(const Matrix* matrix);
    \n-
    157
    \n-
    158 void initRow(const Row& row, int index);
    \n-
    159
    \n-
    160 void examine(const ColIter& col);
    \n-
    161
    \n-
    162 template<class G>
    \n-
    163 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
    \n-
    164
    \n-
    165 bool isIsolated();
    \n-
    166
    \n-
    167
    \n-
    \n-\n-
    169 : Parameters(parms)
    \n-
    170 {}
    \n-
    \n-
    \n-\n-
    172 : Parameters()
    \n-
    173 {}
    \n-
    \n-
    174
    \n-
    175 protected:
    \n-\n-\n-
    180 typedef typename FieldTraits<field_type>::real_type real_type;
    \n-\n-\n-
    185 int row_;
    \n-\n-
    188 std::vector<real_type> vals_;
    \n-
    189 typename std::vector<real_type>::iterator valIter_;
    \n-
    190
    \n-
    191 };
    \n-
    \n-
    192
    \n-
    193
    \n-
    194 template<class M, class N>
    \n-
    \n-\n-
    196 {
    \n-
    197 matrix_ = matrix;
    \n-
    198 }
    \n-
    \n-
    199
    \n-
    200 template<class M, class N>
    \n-
    \n-
    201 inline void SymmetricMatrixDependency<M,N>::initRow(const Row& row, int index)
    \n-
    202 {
    \n-
    203 using std::min;
    \n-
    204 vals_.assign(row.size(), 0.0);
    \n-
    205 assert(vals_.size()==row.size());
    \n-
    206 valIter_=vals_.begin();
    \n-
    207
    \n-
    208 maxValue_ = min(- std::numeric_limits<real_type>::max(), std::numeric_limits<real_type>::min());
    \n-
    209 diagonal_=norm_(row[index]);
    \n-
    210 row_ = index;
    \n-
    211 }
    \n-
    \n+
    \n+\n+
    143 {
    \n+
    144 if (this->n>0) {
    \n+
    145 size_type i=this->n;
    \n+
    146 while (i)
    \n+
    147 this->p[--i].~B();
    \n+
    148 allocator_.deallocate(this->p,this->n);
    \n+
    149 }
    \n+
    150 }
    \n+
    \n+
    151
    \n+
    \n+
    153 void resize (size_type rows, size_type columns)
    \n+
    154 {
    \n+
    155 // deconstruct objects and deallocate memory if necessary
    \n+
    156 if (this->n>0) {
    \n+
    157 size_type i=this->n;
    \n+
    158 while (i)
    \n+
    159 this->p[--i].~B();
    \n+
    160 allocator_.deallocate(this->p,this->n);
    \n+
    161 }
    \n+
    162
    \n+
    163 // and we can allocate the big array in the base class
    \n+
    164 this->n = rows*columns;
    \n+
    165 if (this->n>0)
    \n+
    166 {
    \n+
    167 this->p = allocator_.allocate(this->n);
    \n+
    168 new (this->p)B[this->n];
    \n+
    169 }
    \n+
    170 else
    \n+
    171 {
    \n+
    172 this->n = 0;
    \n+
    173 this->p = nullptr;
    \n+
    174 }
    \n+
    175
    \n+
    176 // we can allocate the windows now
    \n+
    177 rows_ = rows;
    \n+
    178 columns_ = columns;
    \n+
    179 }
    \n+
    \n+
    180
    \n+
    \n+\n+
    183 {
    \n+
    184 if (&a!=this) // check if this and a are different objects
    \n+
    185 {
    \n+
    186 columns_ = a.columns_;
    \n+
    187 // reallocate arrays if necessary
    \n+
    188 // Note: still the block sizes may vary !
    \n+
    189 if (this->n!=a.n || rows_!=a.rows_)
    \n+
    190 {
    \n+
    191 // deconstruct objects and deallocate memory if necessary
    \n+
    192 if (this->n>0) {
    \n+
    193 size_type i=this->n;
    \n+
    194 while (i)
    \n+
    195 this->p[--i].~B();
    \n+
    196 allocator_.deallocate(this->p,this->n);
    \n+
    197 }
    \n+
    198
    \n+
    199 // allocate the big array in the base class
    \n+
    200 this->n = a.n;
    \n+
    201 if (this->n>0)
    \n+
    202 {
    \n+
    203 // allocate and construct objects
    \n+
    204 this->p = allocator_.allocate(this->n);
    \n+
    205 new (this->p)B[this->n];
    \n+
    206 }
    \n+
    207 else
    \n+
    208 {
    \n+
    209 this->n = 0;
    \n+
    210 this->p = nullptr;
    \n+
    211 }
    \n
    212
    \n-
    213 template<class M, class N>
    \n-
    \n-\n-
    215 {
    \n-
    216 using std::max;
    \n-
    217 // skip positive offdiagonals if norm preserves sign of them.
    \n-
    218 real_type eij = norm_(*col);
    \n-
    219 if(!N::is_sign_preserving || eij<0) // || eji<0)
    \n-
    220 {
    \n-
    221 *valIter_ = eij/diagonal_*eij/norm_(matrix_->operator[](col.index())[col.index()]);
    \n-
    222 maxValue_ = max(maxValue_, *valIter_);
    \n-
    223 }else
    \n-
    224 *valIter_ =0;
    \n-
    225 ++valIter_;
    \n-
    226 }
    \n-
    \n+
    213 // Copy number of rows
    \n+
    214 rows_ = a.rows_;
    \n+
    215 }
    \n+
    216
    \n+
    217 // and copy the data
    \n+
    218 for (size_type i=0; i<this->n; i++)
    \n+
    219 this->p[i]=a.p[i];
    \n+
    220 }
    \n+
    221
    \n+
    222 return *this;
    \n+
    223 }
    \n+
    \n+
    224
    \n+
    225
    \n+
    226 //===== assignment from scalar
    \n
    227
    \n-
    228 template<class M, class N>
    \n-
    229 template<class G>
    \n-
    \n-
    230 inline void SymmetricMatrixDependency<M,N>::examine(G&, const typename G::EdgeIterator& edge, const ColIter&)
    \n-
    231 {
    \n-
    232 if(*valIter_ > alpha() * maxValue_) {
    \n-
    233 edge.properties().setDepends();
    \n-
    234 edge.properties().setInfluences();
    \n-
    235 }
    \n-
    236 ++valIter_;
    \n-
    237 }
    \n-
    \n-
    238
    \n-
    239 template<class M, class N>
    \n-
    \n-\n-
    241 {
    \n-
    242 if(diagonal_==0)
    \n-
    243 DUNE_THROW(Dune::ISTLError, "No diagonal entry for row "<<row_<<".");
    \n-
    244 valIter_=vals_.begin();
    \n-
    245 return maxValue_ < beta();
    \n-
    246 }
    \n-
    \n-
    247
    \n-
    251 template<class M, class N>
    \n-
    \n-
    252 class Dependency : public Parameters
    \n-
    253 {
    \n-
    254 public:
    \n-
    258 typedef M Matrix;
    \n-
    259
    \n-
    263 typedef N Norm;
    \n-
    264
    \n-
    268 typedef typename Matrix::row_type Row;
    \n-
    269
    \n-\n+
    \n+\n+
    230 {
    \n+
    231 (static_cast<Imp::block_vector_unmanaged<B,size_type>&>(*this)) = k;
    \n+
    232 return *this;
    \n+
    233 }
    \n+
    \n+
    234
    \n+
    235
    \n+
    236 //===== access to components
    \n+
    237 // has to be overwritten from base class because it must
    \n+
    238 // return access to the windows
    \n+
    239
    \n+
    \n+\n+
    242 {
    \n+
    243#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    244 if (i>=rows_) DUNE_THROW(ISTLError,"index out of range");
    \n+
    245#endif
    \n+
    246 return window_type(this->p + i*columns_, columns_);
    \n+
    247 }
    \n+
    \n+
    248
    \n+
    \n+\n+
    251 {
    \n+
    252#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    253 if (i<0 || i>=rows_) DUNE_THROW(ISTLError,"index out of range");
    \n+
    254#endif
    \n+
    255 return window_type(this->p + i*columns_, columns_);
    \n+
    256 }
    \n+
    \n+
    257
    \n+
    258 // forward declaration
    \n+
    259 class ConstIterator;
    \n+
    260
    \n+
    \n+\n+
    263 {
    \n+
    264 public:
    \n+
    \n+\n+
    267 : window_(nullptr,0)
    \n+
    268 {
    \n+
    269 i = 0;
    \n+
    270 }
    \n+
    \n+
    271
    \n+
    272 Iterator (Iterator& other) = default;
    \n+
    273 Iterator (Iterator&& other) = default;
    \n
    274
    \n-
    275 void init(const Matrix* matrix);
    \n-
    276
    \n-
    277 void initRow(const Row& row, int index);
    \n-
    278
    \n-
    279 void examine(const ColIter& col);
    \n+
    \n+
    276 Iterator (B* data, size_type columns, size_type _i)
    \n+
    277 : i(_i),
    \n+
    278 window_(data + _i*columns, columns)
    \n+
    279 {}
    \n+
    \n
    280
    \n-
    281 template<class G>
    \n-
    282 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
    \n-
    283
    \n-\n-
    285
    \n-
    \n-
    286 Dependency(const Parameters& parms)
    \n-
    287 : Parameters(parms)
    \n-
    288 {}
    \n+
    \n+\n+
    283 {
    \n+
    284 i = other.i;
    \n+
    285 // Do NOT use window_.operator=, because that copies the window content, not just the window!
    \n+
    286 window_.set(other.window_.getsize(),other.window_.getptr());
    \n+
    287 return *this;
    \n+
    288 }
    \n
    \n
    289
    \n-
    \n-\n-
    291 : Parameters()
    \n-
    292 {}
    \n-
    \n-
    293
    \n-
    294 protected:
    \n-\n-\n-
    299 typedef typename FieldTraits<field_type>::real_type real_type;
    \n-\n-\n-
    304 int row_;
    \n-\n-
    307 };
    \n-
    \n-
    308
    \n-
    312 template<class M, class N>
    \n-
    \n-\n-
    314 {
    \n-
    315 public:
    \n-
    319 typedef M Matrix;
    \n+
    \n+\n+
    292 {
    \n+
    293 i = other.i;
    \n+
    294 // Do NOT use window_.operator=, because that copies the window content, not just the window!
    \n+
    295 window_.set(other.window_.getsize(),other.window_.getptr());
    \n+
    296 return *this;
    \n+
    297 }
    \n+
    \n+
    298
    \n+
    \n+\n+
    301 {
    \n+
    302 ++i;
    \n+
    303 window_.setptr(window_.getptr()+window_.getsize());
    \n+
    304 return *this;
    \n+
    305 }
    \n+
    \n+
    306
    \n+
    \n+\n+
    309 {
    \n+
    310 --i;
    \n+
    311 window_.setptr(window_.getptr()-window_.getsize());
    \n+
    312 return *this;
    \n+
    313 }
    \n+
    \n+
    314
    \n+
    \n+
    316 bool operator== (const Iterator& it) const
    \n+
    317 {
    \n+
    318 return window_.getptr() == it.window_.getptr();
    \n+
    319 }
    \n+
    \n
    320
    \n-
    324 typedef N Norm;
    \n-
    325
    \n-
    329 typedef typename Matrix::row_type Row;
    \n-
    330
    \n-\n-
    335
    \n-
    336 void init(const Matrix* matrix);
    \n-
    337
    \n-
    338 void initRow(const Row& row, int index);
    \n-
    339
    \n-
    340 void examine(const ColIter& col);
    \n-
    341
    \n-
    342 template<class G>
    \n-
    343 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
    \n+
    \n+
    322 bool operator!= (const Iterator& it) const
    \n+
    323 {
    \n+
    324 return window_.getptr() != it.window_.getptr();
    \n+
    325 }
    \n+
    \n+
    326
    \n+
    \n+
    328 bool operator== (const ConstIterator& it) const
    \n+
    329 {
    \n+
    330 return window_.getptr() == it.window_.getptr();
    \n+
    331 }
    \n+
    \n+
    332
    \n+
    \n+
    334 bool operator!= (const ConstIterator& it) const
    \n+
    335 {
    \n+
    336 return window_.getptr() != it.window_.getptr();
    \n+
    337 }
    \n+
    \n+
    338
    \n+
    \n+\n+
    341 {
    \n+
    342 return window_;
    \n+
    343 }
    \n+
    \n
    344
    \n-\n-
    346
    \n-
    347
    \n-
    \n-\n-
    349 : Parameters(parms)
    \n-
    350 {}
    \n-
    \n-
    \n-\n-
    352 : Parameters()
    \n-
    353 {}
    \n-
    \n-
    354
    \n-
    355 protected:
    \n-\n-\n-
    360 typedef typename FieldTraits<field_type>::real_type real_type;
    \n-\n-\n-
    365 int row_;
    \n-\n-
    368 private:
    \n-
    369 void initRow(const Row& row, int index, const std::true_type&);
    \n-
    370 void initRow(const Row& row, int index, const std::false_type&);
    \n-
    371 };
    \n-
    \n-
    372
    \n-
    377 template<int N>
    \n-
    \n-\n+
    \n+\n+
    347 {
    \n+
    348 return &window_;
    \n+
    349 }
    \n+
    \n+
    350
    \n+
    351 // return index corresponding to pointer
    \n+
    \n+\n+
    353 {
    \n+
    354 return i;
    \n+
    355 }
    \n+
    \n+
    356
    \n+
    357 friend class ConstIterator;
    \n+
    358
    \n+
    359 private:
    \n+
    360 size_type i;
    \n+
    361 mutable window_type window_;
    \n+
    362 };
    \n+
    \n+
    363
    \n+
    \n+\n+
    366 {
    \n+
    367 return Iterator(this->p, columns_, 0);
    \n+
    368 }
    \n+
    \n+
    369
    \n+
    \n+\n+
    372 {
    \n+
    373 return Iterator(this->p, columns_, rows_);
    \n+
    374 }
    \n+
    \n+
    375
    \n+
    \n+\n
    379 {
    \n-
    380 public:
    \n-
    381 enum { /* @brief We preserve the sign.*/
    \n-
    382 is_sign_preserving = true
    \n-
    383 };
    \n-
    384
    \n-
    389 template<class M>
    \n-
    \n-
    390 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m,
    \n-
    391 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr) const
    \n-
    392 {
    \n-
    393 typedef typename M::field_type field_type;
    \n-
    394 typedef typename FieldTraits<field_type>::real_type real_type;
    \n-
    395 static_assert( std::is_convertible<field_type, real_type >::value,
    \n-
    396 "use of diagonal norm in AMG not implemented for complex field_type");
    \n-
    397 return m[N][N];
    \n-
    398 // possible implementation for complex types: return signed_abs(m[N][N]);
    \n-
    399 }
    \n-
    \n-
    400
    \n-
    405 template<class M>
    \n-
    \n-
    406 auto operator()(const M& m,
    \n-
    407 typename std::enable_if_t<Dune::IsNumber<M>::value>* sfinae = nullptr) const
    \n-
    408 {
    \n-
    409 typedef typename FieldTraits<M>::real_type real_type;
    \n-
    410 static_assert( std::is_convertible<M, real_type >::value,
    \n-
    411 "use of diagonal norm in AMG not implemented for complex field_type");
    \n-
    412 return m;
    \n-
    413 // possible implementation for complex types: return signed_abs(m[N][N]);
    \n-
    414 }
    \n-
    \n-
    415
    \n-
    416 private:
    \n-
    417
    \n-
    419 template<typename T>
    \n-
    420 static T signed_abs(const T & v)
    \n-
    421 {
    \n-
    422 return v;
    \n-
    423 }
    \n-
    424
    \n-
    426 template<typename T>
    \n-
    427 static T signed_abs(const std::complex<T> & v)
    \n-
    428 {
    \n-
    429 // return sign * abs_value
    \n-
    430 // in case of complex numbers this extends to using the csgn function to determine the sign
    \n-
    431 return csgn(v) * std::abs(v);
    \n-
    432 }
    \n-
    433
    \n-
    435 template<typename T>
    \n-
    436 static T csgn(const T & v)
    \n-
    437 {
    \n-
    438 return (T(0) < v) - (v < T(0));
    \n-
    439 }
    \n-
    440
    \n-
    442 template<typename T>
    \n-
    443 static T csgn(std::complex<T> a)
    \n-
    444 {
    \n-
    445 return csgn(a.real())+(a.real() == 0.0)*csgn(a.imag());
    \n+
    380 return Iterator(this->p, columns_, rows_-1);
    \n+
    381 }
    \n+
    \n+
    382
    \n+
    \n+\n+
    386 {
    \n+
    387 return Iterator(this->p, columns_, -1);
    \n+
    388 }
    \n+
    \n+
    389
    \n+
    \n+\n+
    392 {
    \n+
    393 return Iterator(this->p, columns_, std::min(i,rows_));
    \n+
    394 }
    \n+
    \n+
    395
    \n+
    \n+\n+
    398 {
    \n+
    399 return ConstIterator(this->p, columns_, std::min(i,rows_));
    \n+
    400 }
    \n+
    \n+
    401
    \n+
    \n+\n+
    404 {
    \n+
    405 public:
    \n+
    \n+\n+
    408 : window_(nullptr,0)
    \n+
    409 {
    \n+
    410 i = 0;
    \n+
    411 }
    \n+
    \n+
    412
    \n+
    \n+
    414 ConstIterator (const B* data, size_type columns, size_type _i)
    \n+
    415 : i(_i),
    \n+
    416 window_(const_cast<B*>(data + _i * columns), columns)
    \n+
    417 {}
    \n+
    \n+
    418
    \n+
    \n+\n+
    421 : i(it.i), window_(it.window_.getptr(),it.window_.getsize())
    \n+
    422 {}
    \n+
    \n+
    423
    \n+
    \n+\n+
    425 {
    \n+
    426 i = other.i;
    \n+
    427 // Do NOT use window_.operator=, because that copies the window content, not just the window!
    \n+
    428 window_.set(other.window_.getsize(),other.window_.getptr());
    \n+
    429 return *this;
    \n+
    430 }
    \n+
    \n+
    431
    \n+
    \n+\n+
    433 {
    \n+
    434 i = other.i;
    \n+
    435 // Do NOT use window_.operator=, because that copies the window content, not just the window!
    \n+
    436 window_.set(other.window_.getsize(),other.window_.getptr());
    \n+
    437 return *this;
    \n+
    438 }
    \n+
    \n+
    439
    \n+
    \n+\n+
    442 {
    \n+
    443 ++i;
    \n+
    444 window_.setptr(window_.getptr()+window_.getsize());
    \n+
    445 return *this;
    \n
    446 }
    \n+
    \n
    447
    \n-
    448 };
    \n+
    \n+\n+
    450 {
    \n+
    451 --i;
    \n+
    452 window_.setptr(window_.getptr()-window_.getsize());
    \n+
    453 return *this;
    \n+
    454 }
    \n+
    \n+
    455
    \n+
    \n+
    457 bool operator== (const ConstIterator& it) const
    \n+
    458 {
    \n+
    459 return window_.getptr() == it.window_.getptr();
    \n+
    460 }
    \n+
    \n+
    461
    \n+
    \n+
    463 bool operator!= (const ConstIterator& it) const
    \n+
    464 {
    \n+
    465 return window_.getptr() != it.window_.getptr();
    \n+
    466 }
    \n+
    \n+
    467
    \n+
    \n+
    469 bool operator== (const Iterator& it) const
    \n+
    470 {
    \n+
    471 return window_.getptr() == it.window_.getptr();
    \n+
    472 }
    \n+
    \n+
    473
    \n+
    \n+
    475 bool operator!= (const Iterator& it) const
    \n+
    476 {
    \n+
    477 return window_.getptr() != it.window_.getptr();
    \n+
    478 }
    \n+
    \n+
    479
    \n+
    \n+
    481 const window_type& operator* () const
    \n+
    482 {
    \n+
    483 return window_;
    \n+
    484 }
    \n+
    \n+
    485
    \n+
    \n+\n+
    488 {
    \n+
    489 return &window_;
    \n+
    490 }
    \n+
    \n+
    491
    \n+
    492 // return index corresponding to pointer
    \n+
    \n+\n+
    494 {
    \n+
    495 return i;
    \n+
    496 }
    \n
    \n-
    449
    \n-
    \n-
    454 class FirstDiagonal : public Diagonal<0>
    \n-
    455 {};
    \n-
    \n-
    456
    \n-
    \n-
    462 struct RowSum
    \n-
    463 {
    \n-
    464
    \n-
    465 enum { /* @brief We preserve the sign.*/
    \n-
    466 is_sign_preserving = false
    \n-
    467 };
    \n-
    472 template<class M>
    \n-
    \n-
    473 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
    \n-
    474 {
    \n-
    475 return m.infinity_norm();
    \n-
    476 }
    \n-
    \n-
    477 };
    \n-
    \n-
    478
    \n-
    \n-\n-
    480 {
    \n-
    481
    \n-
    482 enum { /* @brief We preserve the sign.*/
    \n-
    483 is_sign_preserving = false
    \n-
    484 };
    \n-
    489 template<class M>
    \n-
    \n-
    490 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
    \n-
    491 {
    \n-
    492 return m.frobenius_norm();
    \n-
    493 }
    \n-
    \n-
    494 };
    \n-
    \n-
    \n-\n-
    496 {
    \n
    497
    \n-
    498 enum { /* @brief We preserve the sign.*/
    \n-
    499 is_sign_preserving = false
    \n-
    500 };
    \n-
    505 template<class M>
    \n-
    \n-
    506 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
    \n-
    507 {
    \n-
    508 return 1;
    \n-
    509 }
    \n-
    \n-
    510 };
    \n-
    \n-
    517 template<class M, class Norm>
    \n-
    \n-
    518 class SymmetricCriterion : public AggregationCriterion<SymmetricDependency<M,Norm> >
    \n-
    519 {
    \n-
    520 public:
    \n-
    \n-\n-\n-
    523 {}
    \n-
    \n-
    \n-\n-
    525 {}
    \n-
    \n-
    526 };
    \n-
    \n-
    527
    \n-
    528
    \n-
    537 template<class M, class Norm>
    \n-
    \n-
    538 class UnSymmetricCriterion : public AggregationCriterion<Dependency<M,Norm> >
    \n-
    539 {
    \n-
    540 public:
    \n-
    \n-\n-\n-
    543 {}
    \n-
    \n-
    \n-\n-
    545 {}
    \n-
    \n-
    546 };
    \n-
    \n-
    547 // forward declaration
    \n-
    548 template<class G> class Aggregator;
    \n-
    549
    \n-
    550
    \n-
    558 template<class V>
    \n-
    \n-\n-
    560 {
    \n-
    561 public:
    \n-
    562
    \n-
    566 static const V UNAGGREGATED;
    \n-
    567
    \n-
    571 static const V ISOLATED;
    \n-\n-
    576
    \n-\n+
    498 friend class Iterator;
    \n+
    499
    \n+
    500 private:
    \n+
    501 size_type i;
    \n+
    502 mutable window_type window_;
    \n+
    503 };
    \n+
    \n+
    504
    \n+\n+
    507
    \n+\n+
    510
    \n+
    \n+\n+
    513 {
    \n+
    514 return ConstIterator(this->p, columns_, 0);
    \n+
    515 }
    \n+
    \n+
    516
    \n+
    \n+\n+
    519 {
    \n+
    520 return ConstIterator(this->p, columns_, rows_);
    \n+
    521 }
    \n+
    \n+
    522
    \n+
    \n+\n+
    526 {
    \n+
    527 return ConstIterator(this->p, columns_, rows_-1);
    \n+
    528 }
    \n+
    \n+
    529
    \n+
    \n+\n+
    532 {
    \n+
    533 return ConstIterator(this->p, columns_, -1);
    \n+
    534 }
    \n+
    \n+
    535
    \n+
    536 //===== sizes
    \n+
    537
    \n+
    \n+
    539 size_type N () const
    \n+
    540 {
    \n+
    541 return rows_;
    \n+
    542 }
    \n+
    \n+
    543
    \n+
    544
    \n+
    545 private:
    \n+
    546 size_type rows_; // number of matrix rows
    \n+
    547 size_type columns_; // number of matrix columns
    \n+
    548
    \n+
    549 A allocator_;
    \n+
    550 };
    \n+
    \n+
    551
    \n+
    552} // namespace MatrixImp
    \n+
    \n+
    553
    \n+
    559 template<class T, class A=std::allocator<T> >
    \n+
    \n+
    560 class Matrix
    \n+
    561 {
    \n+
    562 public:
    \n+
    563
    \n+
    565 using field_type = typename Imp::BlockTraits<T>::field_type;
    \n+
    566
    \n+
    568 typedef T block_type;
    \n+
    569
    \n+
    571 typedef A allocator_type;
    \n+
    572
    \n+\n+
    575
    \n+
    577 typedef typename A::size_type size_type;
    \n+
    578
    \n+\n
    581
    \n-
    586 typedef PoolAllocator<VertexDescriptor,100> Allocator;
    \n+
    583 typedef typename row_type::iterator ColIterator;
    \n+
    584
    \n+\n
    587
    \n-
    592 typedef SLList<VertexDescriptor,Allocator> VertexList;
    \n-
    593
    \n-
    \n-\n-
    598 {
    \n-
    599 public:
    \n-
    600 template<class EdgeIterator>
    \n-
    \n-
    601 void operator()([[maybe_unused]] const EdgeIterator& edge) const
    \n-
    602 {}
    \n-
    \n-
    603 };
    \n-
    \n-
    604
    \n-
    605
    \n-\n-
    610
    \n-\n-
    617
    \n-\n-
    622
    \n-
    634 template<class M, class G, class C>
    \n-
    635 std::tuple<int,int,int,int> buildAggregates(const M& matrix, G& graph, const C& criterion,
    \n-
    636 bool finestLevel);
    \n-
    637
    \n-
    655 template<bool reset, class G, class F, class VM>
    \n-
    656 std::size_t breadthFirstSearch(const VertexDescriptor& start,
    \n-
    657 const AggregateDescriptor& aggregate,
    \n-
    658 const G& graph,
    \n-
    659 F& aggregateVisitor,
    \n-
    660 VM& visitedMap) const;
    \n-
    661
    \n-
    685 template<bool remove, bool reset, class G, class L, class F1, class F2, class VM>
    \n-
    686 std::size_t breadthFirstSearch(const VertexDescriptor& start,
    \n-
    687 const AggregateDescriptor& aggregate,
    \n-
    688 const G& graph, L& visited, F1& aggregateVisitor,
    \n-
    689 F2& nonAggregateVisitor,
    \n-
    690 VM& visitedMap) const;
    \n-
    691
    \n-
    697 void allocate(std::size_t noVertices);
    \n-
    698
    \n-
    702 std::size_t noVertices() const;
    \n-
    703
    \n-
    707 void free();
    \n-
    708
    \n-\n-
    715
    \n-\n-
    722
    \n-\n-
    724
    \n-
    \n-\n-
    726 {
    \n-
    727 return aggregates_;
    \n-
    728 }
    \n-
    \n-
    729
    \n-
    \n-\n-
    731 {
    \n-
    732 return aggregates_+noVertices();
    \n-
    733 }
    \n-
    \n-
    734
    \n-\n-
    736
    \n-
    \n-\n-
    738 {
    \n-
    739 return aggregates_;
    \n-
    740 }
    \n-
    \n-
    741
    \n-
    \n-\n-
    743 {
    \n-
    744 return aggregates_+noVertices();
    \n-
    745 }
    \n-
    \n-
    746 private:
    \n-
    748 AggregatesMap(const AggregatesMap<V>&) = delete;
    \n-
    750 AggregatesMap<V>& operator=(const AggregatesMap<V>&) = delete;
    \n-
    751
    \n-
    755 AggregateDescriptor* aggregates_;
    \n-
    756
    \n-
    760 std::size_t noVertices_;
    \n-
    761 };
    \n-
    \n-
    762
    \n-
    766 template<class G, class C>
    \n-
    767 void buildDependency(G& graph,
    \n-
    768 const typename C::Matrix& matrix,
    \n-
    769 C criterion,
    \n-
    770 bool finestLevel);
    \n-
    771
    \n-
    776 template<class G, class S>
    \n-
    \n-\n-
    778 {
    \n-
    779
    \n-
    780 public:
    \n+
    589 typedef typename row_type::const_iterator ConstColIterator;
    \n+
    590
    \n+
    \n+
    592 Matrix() : data_(0,0), cols_(0)
    \n+
    593 {}
    \n+
    \n+
    594
    \n+
    \n+
    597 Matrix(size_type rows, size_type cols) : data_(rows,cols), cols_(cols)
    \n+
    598 {}
    \n+
    \n+
    599
    \n+
    \n+
    604 void setSize(size_type rows, size_type cols) {
    \n+
    605 data_.resize(rows,cols);
    \n+
    606 cols_ = cols;
    \n+
    607 }
    \n+
    \n+
    608
    \n+
    \n+\n+
    611 {
    \n+
    612 return data_.begin();
    \n+
    613 }
    \n+
    \n+
    614
    \n+
    \n+\n+
    617 {
    \n+
    618 return data_.end();
    \n+
    619 }
    \n+
    \n+
    620
    \n+
    \n+\n+
    624 {
    \n+
    625 return data_.beforeEnd();
    \n+
    626 }
    \n+
    \n+
    627
    \n+
    \n+\n+
    631 {
    \n+
    632 return data_.beforeBegin();
    \n+
    633 }
    \n+
    \n+
    634
    \n+
    \n+\n+
    637 {
    \n+
    638 return data_.begin();
    \n+
    639 }
    \n+
    \n+
    640
    \n+
    \n+\n+
    643 {
    \n+
    644 return data_.end();
    \n+
    645 }
    \n+
    \n+
    646
    \n+
    \n+\n+
    650 {
    \n+
    651 return data_.beforeEnd();
    \n+
    652 }
    \n+
    \n+
    653
    \n+
    \n+\n+
    657 {
    \n+
    658 return data_.beforeBegin();
    \n+
    659 }
    \n+
    \n+
    660
    \n+
    \n+\n+
    663 {
    \n+
    664 data_ = t;
    \n+
    665 return *this;
    \n+
    666 }
    \n+
    \n+
    667
    \n+
    \n+\n+
    670#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    671 if (row<0)
    \n+
    672 DUNE_THROW(ISTLError, "Can't access negative rows!");
    \n+
    673 if (row>=N())
    \n+
    674 DUNE_THROW(ISTLError, "Row index out of range!");
    \n+
    675#endif
    \n+
    676 return data_[row];
    \n+
    677 }
    \n+
    \n+
    678
    \n+
    \n+
    680 const row_type operator[](size_type row) const {
    \n+
    681#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    682 if (row<0)
    \n+
    683 DUNE_THROW(ISTLError, "Can't access negative rows!");
    \n+
    684 if (row>=N())
    \n+
    685 DUNE_THROW(ISTLError, "Row index out of range!");
    \n+
    686#endif
    \n+
    687 return data_[row];
    \n+
    688 }
    \n+
    \n+
    689
    \n+
    \n+
    691 size_type N() const {
    \n+
    692 return data_.N();
    \n+
    693 }
    \n+
    \n+
    694
    \n+
    \n+
    696 size_type M() const {
    \n+
    697 return cols_;
    \n+
    698 }
    \n+
    \n+
    699
    \n+
    \n+\n+
    702 data_ *= scalar;
    \n+
    703 return (*this);
    \n+
    704 }
    \n+
    \n+
    705
    \n+
    \n+\n+
    708 data_ /= scalar;
    \n+
    709 return (*this);
    \n+
    710 }
    \n+
    \n+
    711
    \n+
    \n+\n+
    718#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    719 if(N()!=b.N() || M() != b.M())
    \n+
    720 DUNE_THROW(RangeError, "Matrix sizes do not match!");
    \n+
    721#endif
    \n+
    722 data_ += b.data_;
    \n+
    723 return (*this);
    \n+
    724 }
    \n+
    \n+
    725
    \n+
    \n+\n+
    732#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    733 if(N()!=b.N() || M() != b.M())
    \n+
    734 DUNE_THROW(RangeError, "Matrix sizes do not match!");
    \n+
    735#endif
    \n+
    736 data_ -= b.data_;
    \n+
    737 return (*this);
    \n+
    738 }
    \n+
    \n+
    739
    \n+
    \n+\n+
    742 Matrix out(M(), N());
    \n+
    743 for (size_type i=0; i<N(); i++)
    \n+
    744 for (size_type j=0; j<M(); j++)
    \n+
    745 out[j][i] = (*this)[i][j];
    \n+
    746
    \n+
    747 return out;
    \n+
    748 }
    \n+
    \n+
    749
    \n+
    \n+
    751 friend Matrix<T> operator*(const Matrix<T>& m1, const Matrix<T>& m2) {
    \n+
    752 Matrix<T> out(m1.N(), m2.M());
    \n+
    753 out = 0;
    \n+
    754
    \n+
    755 for (size_type i=0; i<out.N(); i++ ) {
    \n+
    756 for ( size_type j=0; j<out.M(); j++ )
    \n+
    757 for (size_type k=0; k<m1.M(); k++)
    \n+
    758 out[i][j] += m1[i][k]*m2[k][j];
    \n+
    759 }
    \n+
    760
    \n+
    761 return out;
    \n+
    762 }
    \n+
    \n+
    763
    \n+
    765 template <class X, class Y>
    \n+
    \n+
    766 friend Y operator*(const Matrix<T>& m, const X& vec) {
    \n+
    767#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    768 if (m.M()!=vec.size())
    \n+
    769 DUNE_THROW(ISTLError, "Vector size doesn't match the number of matrix columns!");
    \n+
    770#endif
    \n+
    771 Y out(m.N());
    \n+
    772 out = 0;
    \n+
    773
    \n+
    774 for (size_type i=0; i<out.size(); i++ ) {
    \n+
    775 for ( size_type j=0; j<vec.size(); j++ )
    \n+
    776 out[i] += m[i][j]*vec[j];
    \n+
    777 }
    \n+
    778
    \n+
    779 return out;
    \n+
    780 }
    \n+
    \n
    781
    \n-
    782 /***
    \n-
    783 * @brief The type of the matrix graph we work with.
    \n-
    784 */
    \n-
    785 typedef G MatrixGraph;
    \n-\n-
    790
    \n-
    795 typedef PoolAllocator<Vertex,100> Allocator;
    \n-
    796
    \n-
    801 typedef S VertexSet;
    \n-
    802
    \n-
    804 typedef typename VertexSet::const_iterator const_iterator;
    \n-
    805
    \n-
    809 typedef std::size_t* SphereMap;
    \n-
    810
    \n-\n-
    820 VertexSet& connectivity, std::vector<Vertex>& front_);
    \n-
    821
    \n-
    \n-\n-
    823 {
    \n-
    824 --id_;
    \n-
    825 }
    \n-
    \n-
    826
    \n-
    833 void reconstruct(const Vertex& vertex);
    \n-
    834
    \n-
    838 void seed(const Vertex& vertex);
    \n-
    839
    \n-
    843 void add(const Vertex& vertex);
    \n-
    844
    \n-
    845 void add(std::vector<Vertex>& vertex);
    \n-
    849 void clear();
    \n-
    850
    \n-
    854 typename VertexSet::size_type size();
    \n-
    858 typename VertexSet::size_type connectSize();
    \n-
    859
    \n-
    863 int id();
    \n+
    783 template <class X, class Y>
    \n+
    \n+
    784 void mv(const X& x, Y& y) const
    \n+
    785 {
    \n+
    786#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    787 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    788 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    789#endif
    \n+
    790 for (size_type i=0; i<data_.N(); i++) {
    \n+
    791 y[i]=0;
    \n+
    792 for (size_type j=0; j<cols_; j++)
    \n+
    793 {
    \n+
    794 auto&& xj = Impl::asVector(x[j]);
    \n+
    795 auto&& yi = Impl::asVector(y[i]);
    \n+
    796 Impl::asMatrix((*this)[i][j]).umv(xj, yi);
    \n+
    797 }
    \n+
    798 }
    \n+
    799 }
    \n+
    \n+
    800
    \n+
    802 template<class X, class Y>
    \n+
    \n+
    803 void mtv (const X& x, Y& y) const
    \n+
    804 {
    \n+
    805#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    806 if (x.N()!=N()) DUNE_THROW(ISTLError,"index out of range");
    \n+
    807 if (y.N()!=M()) DUNE_THROW(ISTLError,"index out of range");
    \n+
    808#endif
    \n+
    809 for(size_type i=0; i<y.N(); ++i)
    \n+
    810 y[i]=0;
    \n+
    811 umtv(x,y);
    \n+
    812 }
    \n+
    \n+
    813
    \n+
    815 template <class X, class Y>
    \n+
    \n+
    816 void umv(const X& x, Y& y) const
    \n+
    817 {
    \n+
    818#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    819 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    820 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    821#endif
    \n+
    822 for (size_type i=0; i<data_.N(); i++)
    \n+
    823 for (size_type j=0; j<cols_; j++)
    \n+
    824 {
    \n+
    825 auto&& xj = Impl::asVector(x[j]);
    \n+
    826 auto&& yi = Impl::asVector(y[i]);
    \n+
    827 Impl::asMatrix((*this)[i][j]).umv(xj, yi);
    \n+
    828 }
    \n+
    829 }
    \n+
    \n+
    830
    \n+
    832 template<class X, class Y>
    \n+
    \n+
    833 void mmv (const X& x, Y& y) const
    \n+
    834 {
    \n+
    835#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    836 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    837 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    838#endif
    \n+
    839 for (size_type i=0; i<data_.N(); i++)
    \n+
    840 for (size_type j=0; j<cols_; j++)
    \n+
    841 {
    \n+
    842 auto&& xj = Impl::asVector(x[j]);
    \n+
    843 auto&& yi = Impl::asVector(y[i]);
    \n+
    844 Impl::asMatrix((*this)[i][j]).mmv(xj, yi);
    \n+
    845 }
    \n+
    846 }
    \n+
    \n+
    847
    \n+
    849 template <class X, class Y>
    \n+
    \n+
    850 void usmv(const field_type& alpha, const X& x, Y& y) const
    \n+
    851 {
    \n+
    852#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    853 if (x.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    854 if (y.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    855#endif
    \n+
    856 for (size_type i=0; i<data_.N(); i++)
    \n+
    857 for (size_type j=0; j<cols_; j++)
    \n+
    858 {
    \n+
    859 auto&& xj = Impl::asVector(x[j]);
    \n+
    860 auto&& yi = Impl::asVector(y[i]);
    \n+
    861 Impl::asMatrix((*this)[i][j]).usmv(alpha, xj, yi);
    \n+
    862 }
    \n+
    863 }
    \n+
    \n
    864
    \n-\n-
    867
    \n-\n-
    870
    \n-
    871 private:
    \n-
    875 VertexSet vertices_;
    \n-
    876
    \n-
    881 int id_;
    \n-
    882
    \n-
    886 MatrixGraph& graph_;
    \n-
    887
    \n-
    891 AggregatesMap<Vertex>& aggregates_;
    \n-
    892
    \n-
    896 VertexSet& connected_;
    \n-
    897
    \n-
    901 std::vector<Vertex>& front_;
    \n-
    902 };
    \n-
    \n-
    903
    \n-
    907 template<class G>
    \n-
    \n-\n-
    909 {
    \n-
    910 public:
    \n-
    911
    \n-
    915 typedef G MatrixGraph;
    \n-
    916
    \n-\n-
    921
    \n-\n-
    924
    \n-\n-
    929
    \n-\n-
    934
    \n-
    951 template<class M, class C>
    \n-
    952 std::tuple<int,int,int,int> build(const M& m, G& graph,
    \n-
    953 AggregatesMap<Vertex>& aggregates, const C& c,
    \n-
    954 bool finestLevel);
    \n-
    955 private:
    \n-
    960 typedef PoolAllocator<Vertex,100> Allocator;
    \n-
    961
    \n-
    965 typedef SLList<Vertex,Allocator> VertexList;
    \n+
    866 template<class X, class Y>
    \n+
    \n+
    867 void umtv (const X& x, Y& y) const
    \n+
    868 {
    \n+
    869#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    870 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    871 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    872#endif
    \n+
    873 for (size_type i=0; i<data_.N(); i++)
    \n+
    874 for (size_type j=0; j<cols_; j++)
    \n+
    875 {
    \n+
    876 auto&& xi = Impl::asVector(x[i]);
    \n+
    877 auto&& yj = Impl::asVector(y[j]);
    \n+
    878 Impl::asMatrix((*this)[i][j]).umtv(xi, yj);
    \n+
    879 }
    \n+
    880 }
    \n+
    \n+
    881
    \n+
    883 template<class X, class Y>
    \n+
    \n+
    884 void mmtv (const X& x, Y& y) const
    \n+
    885 {
    \n+
    886#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    887 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    888 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    889#endif
    \n+
    890 for (size_type i=0; i<data_.N(); i++)
    \n+
    891 for (size_type j=0; j<cols_; j++)
    \n+
    892 {
    \n+
    893 auto&& xi = Impl::asVector(x[i]);
    \n+
    894 auto&& yj = Impl::asVector(y[j]);
    \n+
    895 Impl::asMatrix((*this)[i][j]).mmtv(xi, yj);
    \n+
    896 }
    \n+
    897 }
    \n+
    \n+
    898
    \n+
    900 template<class X, class Y>
    \n+
    \n+
    901 void usmtv (const field_type& alpha, const X& x, Y& y) const
    \n+
    902 {
    \n+
    903#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    904 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    905 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    906#endif
    \n+
    907 for (size_type i=0; i<data_.N(); i++)
    \n+
    908 for (size_type j=0; j<cols_; j++)
    \n+
    909 {
    \n+
    910 auto&& xi = Impl::asVector(x[i]);
    \n+
    911 auto&& yj = Impl::asVector(y[j]);
    \n+
    912 Impl::asMatrix((*this)[i][j]).usmtv(alpha, xi, yj);
    \n+
    913 }
    \n+
    914 }
    \n+
    \n+
    915
    \n+
    917 template<class X, class Y>
    \n+
    \n+
    918 void umhv (const X& x, Y& y) const
    \n+
    919 {
    \n+
    920#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    921 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    922 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    923#endif
    \n+
    924 for (size_type i=0; i<data_.N(); i++)
    \n+
    925 for (size_type j=0; j<cols_; j++)
    \n+
    926 {
    \n+
    927 auto&& xi = Impl::asVector(x[i]);
    \n+
    928 auto&& yj = Impl::asVector(y[j]);
    \n+
    929 Impl::asMatrix((*this)[i][j]).umhv(xi,yj);
    \n+
    930 }
    \n+
    931 }
    \n+
    \n+
    932
    \n+
    934 template<class X, class Y>
    \n+
    \n+
    935 void mmhv (const X& x, Y& y) const
    \n+
    936 {
    \n+
    937#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    938 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    939 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    940#endif
    \n+
    941 for (size_type i=0; i<data_.N(); i++)
    \n+
    942 for (size_type j=0; j<cols_; j++)
    \n+
    943 {
    \n+
    944 auto&& xi = Impl::asVector(x[i]);
    \n+
    945 auto&& yj = Impl::asVector(y[j]);
    \n+
    946 Impl::asMatrix((*this)[i][j]).mmhv(xi,yj);
    \n+
    947 }
    \n+
    948 }
    \n+
    \n+
    949
    \n+
    951 template<class X, class Y>
    \n+
    \n+
    952 void usmhv (const field_type& alpha, const X& x, Y& y) const
    \n+
    953 {
    \n+
    954#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    955 if (x.N()!=N()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    956 if (y.N()!=M()) DUNE_THROW(ISTLError,"vector/matrix size mismatch!");
    \n+
    957#endif
    \n+
    958 for (size_type i=0; i<data_.N(); i++)
    \n+
    959 for (size_type j=0; j<cols_; j++)
    \n+
    960 {
    \n+
    961 auto&& xi = Impl::asVector(x[i]);
    \n+
    962 auto&& yj = Impl::asVector(y[j]);
    \n+
    963 Impl::asMatrix((*this)[i][j]).usmhv(alpha,xi,yj);
    \n+
    964 }
    \n+
    965 }
    \n+
    \n
    966
    \n-
    970 typedef std::set<Vertex,std::less<Vertex>,Allocator> VertexSet;
    \n-
    971
    \n-
    975 typedef std::size_t* SphereMap;
    \n-
    976
    \n-
    980 MatrixGraph* graph_;
    \n-
    981
    \n-\n-
    986
    \n-
    990 std::vector<Vertex> front_;
    \n+
    967 //===== norms
    \n+
    968
    \n+
    \n+
    970 typename FieldTraits<field_type>::real_type frobenius_norm () const
    \n+
    971 {
    \n+
    972 return std::sqrt(frobenius_norm2());
    \n+
    973 }
    \n+
    \n+
    974
    \n+
    \n+
    976 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
    \n+
    977 {
    \n+
    978 typename FieldTraits<field_type>::real_type sum=0;
    \n+
    979 for (size_type i=0; i<this->N(); i++)
    \n+
    980 for (size_type j=0; j<this->M(); j++)
    \n+
    981 sum += Impl::asMatrix(data_[i][j]).frobenius_norm2();
    \n+
    982 return sum;
    \n+
    983 }
    \n+
    \n+
    984
    \n+
    986 template <typename ft = field_type,
    \n+
    987 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n+
    \n+
    988 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n+
    989 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    990 using std::max;
    \n
    991
    \n-
    995 VertexSet connected_;
    \n-
    996
    \n-
    1000 int size_;
    \n-
    1001
    \n-
    1005 class Stack
    \n-
    1006 {
    \n-
    1007 public:
    \n-
    1008 static const Vertex NullEntry;
    \n-
    1009
    \n-
    1010 Stack(const MatrixGraph& graph,
    \n-
    1011 const Aggregator<G>& aggregatesBuilder,
    \n-
    1012 const AggregatesMap<Vertex>& aggregates);
    \n-\n-\n-
    1015 private:
    \n-
    1016 enum { N = 1300000 };
    \n-
    1017
    \n-
    1019 const MatrixGraph& graph_;
    \n-
    1021 const Aggregator<G>& aggregatesBuilder_;
    \n-
    1023 const AggregatesMap<Vertex>& aggregates_;
    \n-
    1025 int size_;
    \n-
    1026 Vertex maxSize_;
    \n-
    1028 typename MatrixGraph::ConstVertexIterator begin_;
    \n-\n-
    1030
    \n-
    1032 Vertex* vals_;
    \n-
    1033
    \n-
    1034 };
    \n-
    1035
    \n-
    1036 friend class Stack;
    \n+
    992 real_type norm = 0;
    \n+
    993 for (auto const &x : *this) {
    \n+
    994 real_type sum = 0;
    \n+
    995 for (auto const &y : x)
    \n+
    996 sum += Impl::asMatrix(y).infinity_norm();
    \n+
    997 norm = max(sum, norm);
    \n+
    998 isNaN += sum;
    \n+
    999 }
    \n+
    1000
    \n+
    1001 return norm;
    \n+
    1002 }
    \n+
    \n+
    1003
    \n+
    1005 template <typename ft = field_type,
    \n+
    1006 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n+
    \n+
    1007 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n+
    1008 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    1009 using std::max;
    \n+
    1010
    \n+
    1011 real_type norm = 0;
    \n+
    1012 for (auto const &x : *this) {
    \n+
    1013 real_type sum = 0;
    \n+
    1014 for (auto const &y : x)
    \n+
    1015 sum += Impl::asMatrix(y).infinity_norm_real();
    \n+
    1016 norm = max(sum, norm);
    \n+
    1017 }
    \n+
    1018 return norm;
    \n+
    1019 }
    \n+
    \n+
    1020
    \n+
    1022 template <typename ft = field_type,
    \n+
    1023 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n+
    \n+
    1024 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n+
    1025 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    1026 using std::max;
    \n+
    1027
    \n+
    1028 real_type norm = 0;
    \n+
    1029 real_type isNaN = 1;
    \n+
    1030 for (auto const &x : *this) {
    \n+
    1031 real_type sum = 0;
    \n+
    1032 for (auto const &y : x)
    \n+
    1033 sum += Impl::asMatrix(y).infinity_norm();
    \n+
    1034 norm = max(sum, norm);
    \n+
    1035 isNaN += sum;
    \n+
    1036 }
    \n
    1037
    \n-
    1048 template<class V>
    \n-
    1049 void visitAggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate,
    \n-
    1050 const AggregatesMap<Vertex>& aggregates,
    \n-
    1051 V& visitor) const;
    \n-
    1052
    \n-
    1057 template<class V>
    \n-
    1058 class AggregateVisitor
    \n-
    1059 {
    \n-
    1060 public:
    \n-
    1064 typedef V Visitor;
    \n-\n-
    1073 Visitor& visitor);
    \n+
    1038 return norm * (isNaN / isNaN);
    \n+
    1039 }
    \n+
    \n+
    1040
    \n+
    1042 template <typename ft = field_type,
    \n+
    1043 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n+
    \n+
    1044 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n+
    1045 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    1046 using std::max;
    \n+
    1047
    \n+
    1048 real_type norm = 0;
    \n+
    1049 real_type isNaN = 1;
    \n+
    1050 for (auto const &x : *this) {
    \n+
    1051 real_type sum = 0;
    \n+
    1052 for (auto const &y : x)
    \n+
    1053 sum += Impl::asMatrix(y).infinity_norm_real();
    \n+
    1054 norm = max(sum, norm);
    \n+
    1055 isNaN += sum;
    \n+
    1056 }
    \n+
    1057
    \n+
    1058 return norm * (isNaN / isNaN);
    \n+
    1059 }
    \n+
    \n+
    1060
    \n+
    1061 //===== query
    \n+
    1062
    \n+
    \n+
    1064 bool exists ([[maybe_unused]] size_type i, [[maybe_unused]] size_type j) const
    \n+
    1065 {
    \n+
    1066#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1067 if (i<0 || i>=N()) DUNE_THROW(ISTLError,"row index out of range");
    \n+
    1068 if (j<0 || i>=M()) DUNE_THROW(ISTLError,"column index out of range");
    \n+
    1069#endif
    \n+
    1070 return true;
    \n+
    1071 }
    \n+
    \n+
    1072
    \n+
    1073 protected:
    \n
    1074
    \n-
    1081 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n-
    1082
    \n-
    1083 private:
    \n-
    1085 const AggregatesMap<Vertex>& aggregates_;
    \n-
    1087 AggregateDescriptor aggregate_;
    \n-
    1089 Visitor* visitor_;
    \n-
    1090 };
    \n-
    1091
    \n-
    1095 class Counter
    \n-
    1096 {
    \n-
    1097 public:
    \n-\n-
    1101 int value();
    \n-
    1102
    \n-
    1103 protected:
    \n-\n-\n-
    1108
    \n-
    1109 private:
    \n-
    1110 int count_;
    \n-
    1111 };
    \n-
    1112
    \n-
    1113
    \n-
    1118 class FrontNeighbourCounter : public Counter
    \n-
    1119 {
    \n-
    1120 public:
    \n-\n-
    1126
    \n-
    1127 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n-
    1128
    \n-
    1129 private:
    \n-
    1130 const MatrixGraph& graph_;
    \n-
    1131 };
    \n-
    1132
    \n-
    1137 int noFrontNeighbours(const Vertex& vertex) const;
    \n-
    1138
    \n-
    1142 class TwoWayCounter : public Counter
    \n-
    1143 {
    \n-
    1144 public:
    \n-
    1145 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n-
    1146 };
    \n-
    1147
    \n-
    1159 int twoWayConnections(const Vertex&, const AggregateDescriptor& aggregate,
    \n-
    1160 const AggregatesMap<Vertex>& aggregates) const;
    \n-
    1161
    \n-
    1165 class OneWayCounter : public Counter
    \n-
    1166 {
    \n-
    1167 public:
    \n-
    1168 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n-
    1169 };
    \n-
    1170
    \n-
    1182 int oneWayConnections(const Vertex&, const AggregateDescriptor& aggregate,
    \n-
    1183 const AggregatesMap<Vertex>& aggregates) const;
    \n-
    1184
    \n-
    1191 class ConnectivityCounter : public Counter
    \n-
    1192 {
    \n-
    1193 public:
    \n-
    1200 ConnectivityCounter(const VertexSet& connected, const AggregatesMap<Vertex>& aggregates);
    \n-
    1201
    \n-
    1202 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n-
    1203
    \n-
    1204 private:
    \n-
    1206 const VertexSet& connected_;
    \n-
    1208 const AggregatesMap<Vertex>& aggregates_;
    \n-
    1209
    \n-
    1210 };
    \n-
    1211
    \n-
    1223 double connectivity(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
    \n-
    1231 bool connected(const Vertex& vertex, const AggregateDescriptor& aggregate,
    \n-
    1232 const AggregatesMap<Vertex>& aggregates) const;
    \n-
    1233
    \n-
    1241 bool connected(const Vertex& vertex, const SLList<AggregateDescriptor>& aggregateList,
    \n-
    1242 const AggregatesMap<Vertex>& aggregates) const;
    \n-
    1243
    \n-
    1251 class DependencyCounter : public Counter
    \n-
    1252 {
    \n-
    1253 public:
    \n-\n-
    1258
    \n-
    1259 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n-
    1260 };
    \n-
    1261
    \n-
    1268 class FrontMarker
    \n-
    1269 {
    \n-
    1270 public:
    \n-
    1277 FrontMarker(std::vector<Vertex>& front, MatrixGraph& graph);
    \n-
    1278
    \n-
    1279 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n-
    1280
    \n-
    1281 private:
    \n-
    1283 std::vector<Vertex>& front_;
    \n-
    1285 MatrixGraph& graph_;
    \n-
    1286 };
    \n-
    1287
    \n-
    1291 void unmarkFront();
    \n-
    1292
    \n-
    1307 int unusedNeighbours(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
    \n-
    1308
    \n-
    1322 std::pair<int,int> neighbours(const Vertex& vertex,
    \n-
    1323 const AggregateDescriptor& aggregate,
    \n-
    1324 const AggregatesMap<Vertex>& aggregates) const;
    \n-
    1341 int aggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const;
    \n-
    1342
    \n-
    1350 bool admissible(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const;
    \n-
    1351
    \n-
    1359 std::size_t distance(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates);
    \n-
    1360
    \n-
    1369 Vertex mergeNeighbour(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
    \n-
    1370
    \n-
    1379 void nonisoNeighbourAggregate(const Vertex& vertex,
    \n-
    1380 const AggregatesMap<Vertex>& aggregates,
    \n-
    1381 SLList<Vertex>& neighbours) const;
    \n-
    1382
    \n-
    1390 template<class C>
    \n-
    1391 void growAggregate(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates, const C& c);
    \n-
    1392 template<class C>
    \n-
    1393 void growIsolatedAggregate(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates, const C& c);
    \n-
    1394 };
    \n-
    \n-
    1395
    \n-
    1396#ifndef DOXYGEN
    \n-
    1397
    \n-
    1398 template<class M, class N>
    \n-
    1399 inline void SymmetricDependency<M,N>::init(const Matrix* matrix)
    \n-
    1400 {
    \n-
    1401 matrix_ = matrix;
    \n-
    1402 }
    \n-
    1403
    \n-
    1404 template<class M, class N>
    \n-
    1405 inline void SymmetricDependency<M,N>::initRow(const Row& row, int index)
    \n-
    1406 {
    \n-
    1407 initRow(row, index, std::is_convertible<field_type, real_type>());
    \n-
    1408 }
    \n-
    1409
    \n-
    1410 template<class M, class N>
    \n-
    1411 inline void SymmetricDependency<M,N>::initRow(const Row& row, int index, const std::false_type&)
    \n-
    1412 {
    \n-
    1413 DUNE_THROW(InvalidStateException, "field_type needs to convertible to real_type");
    \n-
    1414 }
    \n-
    1415
    \n-
    1416 template<class M, class N>
    \n-
    1417 inline void SymmetricDependency<M,N>::initRow([[maybe_unused]] const Row& row, int index, const std::true_type&)
    \n-
    1418 {
    \n-
    1419 using std::min;
    \n-
    1420 maxValue_ = min(- std::numeric_limits<typename Matrix::field_type>::max(), std::numeric_limits<typename Matrix::field_type>::min());
    \n-
    1421 row_ = index;
    \n-
    1422 diagonal_ = norm_(matrix_->operator[](row_)[row_]);
    \n-
    1423 }
    \n-
    1424
    \n-
    1425 template<class M, class N>
    \n-
    1426 inline void SymmetricDependency<M,N>::examine(const ColIter& col)
    \n-
    1427 {
    \n-
    1428 using std::max;
    \n-
    1429 real_type eij = norm_(*col);
    \n-
    1430 typename Matrix::ConstColIterator opposite_entry =
    \n-
    1431 matrix_->operator[](col.index()).find(row_);
    \n-
    1432 if ( opposite_entry == matrix_->operator[](col.index()).end() )
    \n-
    1433 {
    \n-
    1434 // Consider this a weak connection we disregard.
    \n-
    1435 return;
    \n-
    1436 }
    \n-
    1437 real_type eji = norm_(*opposite_entry);
    \n-
    1438
    \n-
    1439 // skip positive offdiagonals if norm preserves sign of them.
    \n-
    1440 if(!N::is_sign_preserving || eij<0 || eji<0)
    \n-
    1441 maxValue_ = max(maxValue_,
    \n-
    1442 eij /diagonal_ * eji/
    \n-
    1443 norm_(matrix_->operator[](col.index())[col.index()]));
    \n-
    1444 }
    \n-
    1445
    \n-
    1446 template<class M, class N>
    \n-
    1447 template<class G>
    \n-
    1448 inline void SymmetricDependency<M,N>::examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col)
    \n-
    1449 {
    \n-
    1450 real_type eij = norm_(*col);
    \n-
    1451 typename Matrix::ConstColIterator opposite_entry =
    \n-
    1452 matrix_->operator[](col.index()).find(row_);
    \n-
    1453
    \n-
    1454 if ( opposite_entry == matrix_->operator[](col.index()).end() )
    \n-
    1455 {
    \n-
    1456 // Consider this as a weak connection we disregard.
    \n-
    1457 return;
    \n-
    1458 }
    \n-
    1459 real_type eji = norm_(*opposite_entry);
    \n-
    1460 // skip positive offdiagonals if norm preserves sign of them.
    \n-
    1461 if(!N::is_sign_preserving || (eij<0 || eji<0))
    \n-
    1462 if(eji / norm_(matrix_->operator[](edge.target())[edge.target()]) *
    \n-
    1463 eij/ diagonal_ > alpha() * maxValue_) {
    \n-
    1464 edge.properties().setDepends();
    \n-
    1465 edge.properties().setInfluences();
    \n-
    1466 typename G::EdgeProperties& other = graph.getEdgeProperties(edge.target(), edge.source());
    \n-
    1467 other.setInfluences();
    \n-
    1468 other.setDepends();
    \n-
    1469 }
    \n-
    1470 }
    \n-
    1471
    \n-
    1472 template<class M, class N>
    \n-\n-
    1474 {
    \n-
    1475 return maxValue_ < beta();
    \n-
    1476 }
    \n-
    1477
    \n-
    1478
    \n-
    1479 template<class M, class N>
    \n-
    1480 inline void Dependency<M,N>::init(const Matrix* matrix)
    \n-
    1481 {
    \n-
    1482 matrix_ = matrix;
    \n-
    1483 }
    \n-
    1484
    \n-
    1485 template<class M, class N>
    \n-
    1486 inline void Dependency<M,N>::initRow([[maybe_unused]] const Row& row, int index)
    \n-
    1487 {
    \n-
    1488 using std::min;
    \n-
    1489 maxValue_ = min(- std::numeric_limits<real_type>::max(), std::numeric_limits<real_type>::min());
    \n-
    1490 row_ = index;
    \n-
    1491 diagonal_ = norm_(matrix_->operator[](row_)[row_]);
    \n-
    1492 }
    \n-
    1493
    \n-
    1494 template<class M, class N>
    \n-
    1495 inline void Dependency<M,N>::examine(const ColIter& col)
    \n-
    1496 {
    \n-
    1497 using std::max;
    \n-
    1498 maxValue_ = max(maxValue_, -norm_(*col));
    \n-
    1499 }
    \n-
    1500
    \n-
    1501 template<class M, class N>
    \n-
    1502 template<class G>
    \n-
    1503 inline void Dependency<M,N>::examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col)
    \n-
    1504 {
    \n-
    1505 if(-norm_(*col) >= maxValue_ * alpha()) {
    \n-
    1506 edge.properties().setDepends();
    \n-
    1507 typedef typename G::EdgeDescriptor ED;
    \n-
    1508 ED e= graph.findEdge(edge.target(), edge.source());
    \n-
    1509 if(e!=std::numeric_limits<ED>::max())
    \n-
    1510 {
    \n-
    1511 typename G::EdgeProperties& other = graph.getEdgeProperties(e);
    \n-
    1512 other.setInfluences();
    \n-
    1513 }
    \n-
    1514 }
    \n-
    1515 }
    \n-
    1516
    \n-
    1517 template<class M, class N>
    \n-
    1518 inline bool Dependency<M,N>::isIsolated()
    \n-
    1519 {
    \n-
    1520 return maxValue_ < beta() * diagonal_;
    \n-
    1521 }
    \n-
    1522
    \n-
    1523 template<class G,class S>
    \n-
    1524 Aggregate<G,S>::Aggregate(MatrixGraph& graph, AggregatesMap<Vertex>& aggregates,
    \n-
    1525 VertexSet& connected, std::vector<Vertex>& front)
    \n-
    1526 : vertices_(), id_(-1), graph_(graph), aggregates_(aggregates),
    \n-
    1527 connected_(connected), front_(front)
    \n-
    1528 {}
    \n-
    1529
    \n-
    1530 template<class G,class S>
    \n-
    1531 void Aggregate<G,S>::reconstruct(const Vertex& vertex)
    \n-
    1532 {
    \n-
    1533 /*
    \n-
    1534 vertices_.push_back(vertex);
    \n-
    1535 typedef typename VertexList::const_iterator iterator;
    \n-
    1536 iterator begin = vertices_.begin();
    \n-
    1537 iterator end = vertices_.end();*/
    \n-
    1538 throw "Not yet implemented";
    \n-
    1539
    \n-
    1540 // while(begin!=end){
    \n-
    1541 //for();
    \n-
    1542 // }
    \n-
    1543
    \n-
    1544 }
    \n-
    1545
    \n-
    1546 template<class G,class S>
    \n-
    1547 inline void Aggregate<G,S>::seed(const Vertex& vertex)
    \n-
    1548 {
    \n-
    1549 dvverb<<"Connected cleared"<<std::endl;
    \n-
    1550 connected_.clear();
    \n-
    1551 vertices_.clear();
    \n-
    1552 connected_.insert(vertex);
    \n-
    1553 dvverb << " Inserting "<<vertex<<" size="<<connected_.size();
    \n-
    1554 ++id_ ;
    \n-
    1555 add(vertex);
    \n-
    1556 }
    \n-
    1557
    \n-
    1558
    \n-
    1559 template<class G,class S>
    \n-
    1560 inline void Aggregate<G,S>::add(const Vertex& vertex)
    \n-
    1561 {
    \n-
    1562 vertices_.insert(vertex);
    \n-
    1563 aggregates_[vertex]=id_;
    \n-
    1564 if(front_.size())
    \n-
    1565 front_.erase(std::lower_bound(front_.begin(), front_.end(), vertex));
    \n-
    1566
    \n-
    1567
    \n-
    1568 typedef typename MatrixGraph::ConstEdgeIterator iterator;
    \n-
    1569 const iterator end = graph_.endEdges(vertex);
    \n-
    1570 for(iterator edge = graph_.beginEdges(vertex); edge != end; ++edge) {
    \n-
    1571 dvverb << " Inserting "<<aggregates_[edge.target()];
    \n-
    1572 connected_.insert(aggregates_[edge.target()]);
    \n-
    1573 dvverb <<" size="<<connected_.size();
    \n-
    1574 if(aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED &&
    \n-
    1575 !graph_.getVertexProperties(edge.target()).front())
    \n-
    1576 {
    \n-
    1577 front_.push_back(edge.target());
    \n-
    1578 graph_.getVertexProperties(edge.target()).setFront();
    \n-
    1579 }
    \n-
    1580 }
    \n-
    1581 dvverb <<std::endl;
    \n-
    1582 std::sort(front_.begin(), front_.end());
    \n-
    1583 }
    \n-
    1584
    \n-
    1585 template<class G,class S>
    \n-
    1586 inline void Aggregate<G,S>::add(std::vector<Vertex>& vertices)
    \n-
    1587 {
    \n-
    1588#ifndef NDEBUG
    \n-
    1589 std::size_t oldsize = vertices_.size();
    \n-
    1590#endif
    \n-
    1591 typedef typename std::vector<Vertex>::iterator Iterator;
    \n-
    1592
    \n-
    1593 typedef typename VertexSet::iterator SIterator;
    \n-
    1594
    \n-
    1595 SIterator pos=vertices_.begin();
    \n-
    1596 std::vector<Vertex> newFront;
    \n-
    1597 newFront.reserve(front_.capacity());
    \n-
    1598
    \n-
    1599 std::set_difference(front_.begin(), front_.end(), vertices.begin(), vertices.end(),
    \n-
    1600 std::back_inserter(newFront));
    \n-
    1601 front_=newFront;
    \n-
    1602
    \n-
    1603 for(Iterator vertex=vertices.begin(); vertex != vertices.end(); ++vertex)
    \n-
    1604 {
    \n-
    1605 pos=vertices_.insert(pos,*vertex);
    \n-
    1606 vertices_.insert(*vertex);
    \n-
    1607 graph_.getVertexProperties(*vertex).resetFront(); // Not a front node any more.
    \n-
    1608 aggregates_[*vertex]=id_;
    \n-
    1609
    \n-
    1610 typedef typename MatrixGraph::ConstEdgeIterator iterator;
    \n-
    1611 const iterator end = graph_.endEdges(*vertex);
    \n-
    1612 for(iterator edge = graph_.beginEdges(*vertex); edge != end; ++edge) {
    \n-
    1613 dvverb << " Inserting "<<aggregates_[edge.target()];
    \n-
    1614 connected_.insert(aggregates_[edge.target()]);
    \n-
    1615 if(aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED &&
    \n-
    1616 !graph_.getVertexProperties(edge.target()).front())
    \n-
    1617 {
    \n-
    1618 front_.push_back(edge.target());
    \n-
    1619 graph_.getVertexProperties(edge.target()).setFront();
    \n-
    1620 }
    \n-
    1621 dvverb <<" size="<<connected_.size();
    \n-
    1622 }
    \n-
    1623 dvverb <<std::endl;
    \n-
    1624 }
    \n-
    1625 std::sort(front_.begin(), front_.end());
    \n-
    1626 assert(oldsize+vertices.size()==vertices_.size());
    \n-
    1627 }
    \n-
    1628 template<class G,class S>
    \n-
    1629 inline void Aggregate<G,S>::clear()
    \n-
    1630 {
    \n-
    1631 vertices_.clear();
    \n-
    1632 connected_.clear();
    \n-
    1633 id_=-1;
    \n-
    1634 }
    \n-
    1635
    \n-
    1636 template<class G,class S>
    \n-
    1637 inline typename Aggregate<G,S>::VertexSet::size_type
    \n-\n-
    1639 {
    \n-
    1640 return vertices_.size();
    \n-
    1641 }
    \n-
    1642
    \n-
    1643 template<class G,class S>
    \n-
    1644 inline typename Aggregate<G,S>::VertexSet::size_type
    \n-\n-
    1646 {
    \n-
    1647 return connected_.size();
    \n-
    1648 }
    \n-
    1649
    \n-
    1650 template<class G,class S>
    \n-
    1651 inline int Aggregate<G,S>::id()
    \n-
    1652 {
    \n-
    1653 return id_;
    \n-
    1654 }
    \n-
    1655
    \n-
    1656 template<class G,class S>
    \n-\n-
    1658 {
    \n-
    1659 return vertices_.begin();
    \n-
    1660 }
    \n-
    1661
    \n-
    1662 template<class G,class S>
    \n-\n-
    1664 {
    \n-
    1665 return vertices_.end();
    \n-
    1666 }
    \n-
    1667
    \n-
    1668 template<class V>
    \n-
    1669 const V AggregatesMap<V>::UNAGGREGATED = std::numeric_limits<V>::max();
    \n-
    1670
    \n-
    1671 template<class V>
    \n-
    1672 const V AggregatesMap<V>::ISOLATED = std::numeric_limits<V>::max()-1;
    \n-
    1673
    \n-
    1674 template<class V>
    \n-\n-
    1676 : aggregates_(0)
    \n-
    1677 {}
    \n-
    1678
    \n-
    1679 template<class V>
    \n-\n-
    1681 {
    \n-
    1682 if(aggregates_!=0)
    \n-
    1683 delete[] aggregates_;
    \n-
    1684 }
    \n-
    1685
    \n-
    1686
    \n-
    1687 template<class V>
    \n-
    1688 inline AggregatesMap<V>::AggregatesMap(std::size_t noVertices)
    \n-
    1689 {
    \n-
    1690 allocate(noVertices);
    \n-
    1691 }
    \n-
    1692
    \n-
    1693 template<class V>
    \n-
    1694 inline std::size_t AggregatesMap<V>::noVertices() const
    \n-
    1695 {
    \n-
    1696 return noVertices_;
    \n-
    1697 }
    \n-
    1698
    \n-
    1699 template<class V>
    \n-
    1700 inline void AggregatesMap<V>::allocate(std::size_t noVertices)
    \n-
    1701 {
    \n-
    1702 aggregates_ = new AggregateDescriptor[noVertices];
    \n-
    1703 noVertices_ = noVertices;
    \n-
    1704
    \n-
    1705 for(std::size_t i=0; i < noVertices; i++)
    \n-
    1706 aggregates_[i]=UNAGGREGATED;
    \n-
    1707 }
    \n-
    1708
    \n-
    1709 template<class V>
    \n-
    1710 inline void AggregatesMap<V>::free()
    \n-
    1711 {
    \n-
    1712 assert(aggregates_ != 0);
    \n-
    1713 delete[] aggregates_;
    \n-
    1714 aggregates_=0;
    \n-
    1715 }
    \n-
    1716
    \n-
    1717 template<class V>
    \n-\n-
    1719 AggregatesMap<V>::operator[](const VertexDescriptor& v)
    \n-
    1720 {
    \n-
    1721 return aggregates_[v];
    \n-
    1722 }
    \n-
    1723
    \n-
    1724 template<class V>
    \n-
    1725 inline const typename AggregatesMap<V>::AggregateDescriptor&
    \n-
    1726 AggregatesMap<V>::operator[](const VertexDescriptor& v) const
    \n-
    1727 {
    \n-
    1728 return aggregates_[v];
    \n-
    1729 }
    \n-
    1730
    \n-
    1731 template<class V>
    \n-
    1732 template<bool reset, class G, class F,class VM>
    \n-
    1733 inline std::size_t AggregatesMap<V>::breadthFirstSearch(const V& start,
    \n-
    1734 const AggregateDescriptor& aggregate,
    \n-
    1735 const G& graph, F& aggregateVisitor,
    \n-
    1736 VM& visitedMap) const
    \n-
    1737 {
    \n-
    1738 VertexList vlist;
    \n-
    1739
    \n-
    1740 DummyEdgeVisitor dummy;
    \n-
    1741 return breadthFirstSearch<true,reset>(start, aggregate, graph, vlist, aggregateVisitor, dummy, visitedMap);
    \n-
    1742 }
    \n-
    1743
    \n-
    1744 template<class V>
    \n-
    1745 template<bool remove, bool reset, class G, class L, class F1, class F2, class VM>
    \n-
    1746 std::size_t AggregatesMap<V>::breadthFirstSearch(const V& start,
    \n-
    1747 const AggregateDescriptor& aggregate,
    \n-
    1748 const G& graph,
    \n-
    1749 L& visited,
    \n-
    1750 F1& aggregateVisitor,
    \n-
    1751 F2& nonAggregateVisitor,
    \n-
    1752 VM& visitedMap) const
    \n-
    1753 {
    \n-
    1754 typedef typename L::const_iterator ListIterator;
    \n-
    1755 int visitedSpheres = 0;
    \n-
    1756
    \n-
    1757 visited.push_back(start);
    \n-
    1758 put(visitedMap, start, true);
    \n-
    1759
    \n-
    1760 ListIterator current = visited.begin();
    \n-
    1761 ListIterator end = visited.end();
    \n-
    1762 std::size_t i=0, size=visited.size();
    \n-
    1763
    \n-
    1764 // visit the neighbours of all vertices of the
    \n-
    1765 // current sphere.
    \n-
    1766 while(current != end) {
    \n-
    1767
    \n-
    1768 for(; i<size; ++current, ++i) {
    \n-
    1769 typedef typename G::ConstEdgeIterator EdgeIterator;
    \n-
    1770 const EdgeIterator endEdge = graph.endEdges(*current);
    \n-
    1771
    \n-
    1772 for(EdgeIterator edge = graph.beginEdges(*current);
    \n-
    1773 edge != endEdge; ++edge) {
    \n-
    1774
    \n-
    1775 if(aggregates_[edge.target()]==aggregate) {
    \n-
    1776 if(!get(visitedMap, edge.target())) {
    \n-
    1777 put(visitedMap, edge.target(), true);
    \n-
    1778 visited.push_back(edge.target());
    \n-
    1779 aggregateVisitor(edge);
    \n-
    1780 }
    \n-
    1781 }else
    \n-
    1782 nonAggregateVisitor(edge);
    \n-
    1783 }
    \n-
    1784 }
    \n-
    1785 end = visited.end();
    \n-
    1786 size = visited.size();
    \n-
    1787 if(current != end)
    \n-
    1788 visitedSpheres++;
    \n-
    1789 }
    \n-
    1790
    \n-
    1791 if(reset)
    \n-
    1792 for(current = visited.begin(); current != end; ++current)
    \n-
    1793 put(visitedMap, *current, false);
    \n-
    1794
    \n-
    1795
    \n-
    1796 if(remove)
    \n-
    1797 visited.clear();
    \n-
    1798
    \n-
    1799 return visitedSpheres;
    \n-
    1800 }
    \n-
    1801
    \n-
    1802 template<class G>
    \n-\n-
    1804 : graph_(0), aggregate_(0), front_(), connected_(), size_(-1)
    \n-
    1805 {}
    \n-
    1806
    \n-
    1807 template<class G>
    \n-\n-
    1809 {
    \n-
    1810 size_=-1;
    \n-
    1811 }
    \n-
    1812
    \n-
    1813 template<class G, class C>
    \n-
    1814 void buildDependency(G& graph,
    \n-
    1815 const typename C::Matrix& matrix,
    \n-
    1816 C criterion, bool firstlevel)
    \n-
    1817 {
    \n-
    1818 // assert(graph.isBuilt());
    \n-
    1819 typedef typename C::Matrix Matrix;
    \n-
    1820 typedef typename G::VertexIterator VertexIterator;
    \n-
    1821
    \n-
    1822 criterion.init(&matrix);
    \n-
    1823
    \n-
    1824 for(VertexIterator vertex = graph.begin(); vertex != graph.end(); ++vertex) {
    \n-
    1825 typedef typename Matrix::row_type Row;
    \n-
    1826
    \n-
    1827 const Row& row = matrix[*vertex];
    \n-
    1828
    \n-
    1829 // Tell the criterion what row we will examine now
    \n-
    1830 // This might for example be used for calculating the
    \n-
    1831 // maximum offdiagonal value
    \n-
    1832 criterion.initRow(row, *vertex);
    \n-
    1833
    \n-
    1834 // On a first path all columns are examined. After this
    \n-
    1835 // the calculator should know whether the vertex is isolated.
    \n-
    1836 typedef typename Matrix::ConstColIterator ColIterator;
    \n-
    1837 ColIterator end = row.end();
    \n-
    1838 typename FieldTraits<typename Matrix::field_type>::real_type absoffdiag=0.;
    \n-
    1839
    \n-
    1840 using std::max;
    \n-
    1841 if(firstlevel) {
    \n-
    1842 for(ColIterator col = row.begin(); col != end; ++col)
    \n-
    1843 if(col.index()!=*vertex) {
    \n-
    1844 criterion.examine(col);
    \n-
    1845 absoffdiag = max(absoffdiag, Impl::asMatrix(*col).frobenius_norm());
    \n-
    1846 }
    \n-
    1847
    \n-
    1848 if(absoffdiag==0)
    \n-
    1849 vertex.properties().setExcludedBorder();
    \n-
    1850 }
    \n-
    1851 else
    \n-
    1852 for(ColIterator col = row.begin(); col != end; ++col)
    \n-
    1853 if(col.index()!=*vertex)
    \n-
    1854 criterion.examine(col);
    \n-
    1855
    \n-
    1856 // reset the vertex properties
    \n-
    1857 //vertex.properties().reset();
    \n-
    1858
    \n-
    1859 // Check whether the vertex is isolated.
    \n-
    1860 if(criterion.isIsolated()) {
    \n-
    1861 //std::cout<<"ISOLATED: "<<*vertex<<std::endl;
    \n-
    1862 vertex.properties().setIsolated();
    \n-
    1863 }else{
    \n-
    1864 // Examine all the edges beginning at this vertex.
    \n-
    1865 auto eEnd = vertex.end();
    \n-
    1866 auto col = matrix[*vertex].begin();
    \n-
    1867
    \n-
    1868 for(auto edge = vertex.begin(); edge!= eEnd; ++edge, ++col) {
    \n-
    1869 // Move to the right column.
    \n-
    1870 while(col.index()!=edge.target())
    \n-
    1871 ++col;
    \n-
    1872 criterion.examine(graph, edge, col);
    \n-
    1873 }
    \n-
    1874 }
    \n-
    1875
    \n-
    1876 }
    \n-
    1877 }
    \n-
    1878
    \n-
    1879
    \n-
    1880 template<class G>
    \n-
    1881 template<class V>
    \n-
    1882 inline Aggregator<G>::AggregateVisitor<V>::AggregateVisitor(const AggregatesMap<Vertex>& aggregates,
    \n-
    1883 const AggregateDescriptor& aggregate, V& visitor)
    \n-
    1884 : aggregates_(aggregates), aggregate_(aggregate), visitor_(&visitor)
    \n-
    1885 {}
    \n-
    1886
    \n-
    1887 template<class G>
    \n-
    1888 template<class V>
    \n-\n-
    1890 {
    \n-
    1891 if(aggregates_[edge.target()]==aggregate_)
    \n-
    1892 visitor_->operator()(edge);
    \n-
    1893 }
    \n-
    1894
    \n-
    1895 template<class G>
    \n-
    1896 template<class V>
    \n-
    1897 inline void Aggregator<G>::visitAggregateNeighbours(const Vertex& vertex,
    \n-
    1898 const AggregateDescriptor& aggregate,
    \n-
    1899 const AggregatesMap<Vertex>& aggregates,
    \n-
    1900 V& visitor) const
    \n-
    1901 {
    \n-
    1902 // Only evaluates for edge pointing to the aggregate
    \n-
    1903 AggregateVisitor<V> v(aggregates, aggregate, visitor);
    \n-
    1904 visitNeighbours(*graph_, vertex, v);
    \n-
    1905 }
    \n-
    1906
    \n-
    1907
    \n-
    1908 template<class G>
    \n-\n-
    1910 : count_(0)
    \n-
    1911 {}
    \n-
    1912
    \n-
    1913 template<class G>
    \n-\n-
    1915 {
    \n-
    1916 ++count_;
    \n-
    1917 }
    \n-
    1918
    \n-
    1919 template<class G>
    \n-\n-
    1921 {
    \n-
    1922 --count_;
    \n-
    1923 }
    \n-
    1924 template<class G>
    \n-\n-
    1926 {
    \n-
    1927 return count_;
    \n-
    1928 }
    \n-
    1929
    \n-
    1930 template<class G>
    \n-\n-
    1932 {
    \n-
    1933 if(edge.properties().isTwoWay())
    \n-\n-
    1935 }
    \n-
    1936
    \n-
    1937 template<class G>
    \n-
    1938 int Aggregator<G>::twoWayConnections(const Vertex& vertex, const AggregateDescriptor& aggregate,
    \n-
    1939 const AggregatesMap<Vertex>& aggregates) const
    \n-
    1940 {
    \n-
    1941 TwoWayCounter counter;
    \n-
    1942 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
    \n-
    1943 return counter.value();
    \n-
    1944 }
    \n-
    1945
    \n-
    1946 template<class G>
    \n-
    1947 int Aggregator<G>::oneWayConnections(const Vertex& vertex, const AggregateDescriptor& aggregate,
    \n-
    1948 const AggregatesMap<Vertex>& aggregates) const
    \n-
    1949 {
    \n-
    1950 OneWayCounter counter;
    \n-
    1951 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
    \n-
    1952 return counter.value();
    \n-
    1953 }
    \n-
    1954
    \n-
    1955 template<class G>
    \n-\n-
    1957 {
    \n-
    1958 if(edge.properties().isOneWay())
    \n-\n-
    1960 }
    \n-
    1961
    \n-
    1962 template<class G>
    \n-
    1963 inline Aggregator<G>::ConnectivityCounter::ConnectivityCounter(const VertexSet& connected,
    \n-
    1964 const AggregatesMap<Vertex>& aggregates)
    \n-
    1965 : Counter(), connected_(connected), aggregates_(aggregates)
    \n-
    1966 {}
    \n-
    1967
    \n-
    1968
    \n-
    1969 template<class G>
    \n-\n-
    1971 {
    \n-
    1972 if(connected_.find(aggregates_[edge.target()]) == connected_.end() || aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED)
    \n-
    1973 // Would be a new connection
    \n-\n-
    1975 else{
    \n-\n-\n-
    1978 }
    \n-
    1979 }
    \n-
    1980
    \n-
    1981 template<class G>
    \n-
    1982 inline double Aggregator<G>::connectivity(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
    \n-
    1983 {
    \n-
    1984 ConnectivityCounter counter(connected_, aggregates);
    \n-
    1985 double noNeighbours=visitNeighbours(*graph_, vertex, counter);
    \n-
    1986 return (double)counter.value()/noNeighbours;
    \n-
    1987 }
    \n-
    1988
    \n-
    1989 template<class G>
    \n-\n-
    1991 : Counter()
    \n-
    1992 {}
    \n-
    1993
    \n-
    1994 template<class G>
    \n-\n-
    1996 {
    \n-
    1997 if(edge.properties().depends())
    \n-\n-
    1999 if(edge.properties().influences())
    \n-\n-
    2001 }
    \n-
    2002
    \n-
    2003 template<class G>
    \n-
    2004 int Aggregator<G>::unusedNeighbours(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
    \n-
    2005 {
    \n-
    2006 return aggregateNeighbours(vertex, AggregatesMap<Vertex>::UNAGGREGATED, aggregates);
    \n-
    2007 }
    \n-
    2008
    \n-
    2009 template<class G>
    \n-
    2010 std::pair<int,int> Aggregator<G>::neighbours(const Vertex& vertex,
    \n-
    2011 const AggregateDescriptor& aggregate,
    \n-
    2012 const AggregatesMap<Vertex>& aggregates) const
    \n-
    2013 {
    \n-
    2014 DependencyCounter unused, aggregated;
    \n-
    2015 typedef AggregateVisitor<DependencyCounter> CounterT;
    \n-
    2016 typedef std::tuple<CounterT,CounterT> CounterTuple;
    \n-
    2017 CombinedFunctor<CounterTuple> visitors(CounterTuple(CounterT(aggregates, AggregatesMap<Vertex>::UNAGGREGATED, unused), CounterT(aggregates, aggregate, aggregated)));
    \n-
    2018 visitNeighbours(*graph_, vertex, visitors);
    \n-
    2019 return std::make_pair(unused.value(), aggregated.value());
    \n-
    2020 }
    \n-
    2021
    \n-
    2022
    \n-
    2023 template<class G>
    \n-
    2024 int Aggregator<G>::aggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const
    \n-
    2025 {
    \n-
    2026 DependencyCounter counter;
    \n-
    2027 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
    \n-
    2028 return counter.value();
    \n-
    2029 }
    \n-
    2030
    \n-
    2031 template<class G>
    \n-
    2032 std::size_t Aggregator<G>::distance(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates)
    \n-
    2033 {
    \n-
    2034 return 0;
    \n-
    2035 typename PropertyMapTypeSelector<VertexVisitedTag,G>::Type visitedMap = get(VertexVisitedTag(), *graph_);
    \n-
    2036 VertexList vlist;
    \n-
    2037 typename AggregatesMap<Vertex>::DummyEdgeVisitor dummy;
    \n-
    2038 return aggregates.template breadthFirstSearch<true,true>(vertex,
    \n-
    2039 aggregate_->id(), *graph_,
    \n-
    2040 vlist, dummy, dummy, visitedMap);
    \n-
    2041 }
    \n-
    2042
    \n-
    2043 template<class G>
    \n-
    2044 inline Aggregator<G>::FrontMarker::FrontMarker(std::vector<Vertex>& front, MatrixGraph& graph)
    \n-
    2045 : front_(front), graph_(graph)
    \n-
    2046 {}
    \n-
    2047
    \n-
    2048 template<class G>
    \n-\n-
    2050 {
    \n-
    2051 Vertex target = edge.target();
    \n-
    2052
    \n-
    2053 if(!graph_.getVertexProperties(target).front()) {
    \n-
    2054 front_.push_back(target);
    \n-
    2055 graph_.getVertexProperties(target).setFront();
    \n-
    2056 }
    \n-
    2057 }
    \n-
    2058
    \n-
    2059 template<class G>
    \n-
    2060 inline bool Aggregator<G>::admissible(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const
    \n-
    2061 {
    \n-
    2062 // Todo
    \n-
    2063 Dune::dvverb<<" Admissible not yet implemented!"<<std::endl;
    \n-
    2064 return true;
    \n-
    2065 //Situation 1: front node depends on two nodes. Then these
    \n-
    2066 // have to be strongly connected to each other
    \n-
    2067
    \n-
    2068 // Iterate over all all neighbours of front node
    \n-
    2069 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
    \n-
    2070 Iterator vend = graph_->endEdges(vertex);
    \n-
    2071 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {
    \n-
    2072 // if(edge.properties().depends() && !edge.properties().influences()
    \n-
    2073 if(edge.properties().isStrong()
    \n-
    2074 && aggregates[edge.target()]==aggregate)
    \n-
    2075 {
    \n-
    2076 // Search for another link to the aggregate
    \n-
    2077 Iterator edge1 = edge;
    \n-
    2078 for(++edge1; edge1 != vend; ++edge1) {
    \n-
    2079 //if(edge1.properties().depends() && !edge1.properties().influences()
    \n-
    2080 if(edge1.properties().isStrong()
    \n-
    2081 && aggregates[edge.target()]==aggregate)
    \n-
    2082 {
    \n-
    2083 //Search for an edge connecting the two vertices that is
    \n-
    2084 //strong
    \n-
    2085 bool found=false;
    \n-
    2086 Iterator v2end = graph_->endEdges(edge.target());
    \n-
    2087 for(Iterator edge2 = graph_->beginEdges(edge.target()); edge2 != v2end; ++edge2) {
    \n-
    2088 if(edge2.target()==edge1.target() &&
    \n-
    2089 edge2.properties().isStrong()) {
    \n-
    2090 found =true;
    \n-
    2091 break;
    \n-
    2092 }
    \n-
    2093 }
    \n-
    2094 if(found)
    \n-
    2095 {
    \n-
    2096 return true;
    \n-
    2097 }
    \n-
    2098 }
    \n-
    2099 }
    \n-
    2100 }
    \n-
    2101 }
    \n-
    2102
    \n-
    2103 // Situation 2: cluster node depends on front node and other cluster node
    \n-
    2105 vend = graph_->endEdges(vertex);
    \n-
    2106 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {
    \n-
    2107 //if(!edge.properties().depends() && edge.properties().influences()
    \n-
    2108 if(edge.properties().isStrong()
    \n-
    2109 && aggregates[edge.target()]==aggregate)
    \n-
    2110 {
    \n-
    2111 // Search for a link from target that stays within the aggregate
    \n-
    2112 Iterator v1end = graph_->endEdges(edge.target());
    \n-
    2113
    \n-
    2114 for(Iterator edge1=graph_->beginEdges(edge.target()); edge1 != v1end; ++edge1) {
    \n-
    2115 //if(edge1.properties().depends() && !edge1.properties().influences()
    \n-
    2116 if(edge1.properties().isStrong()
    \n-
    2117 && aggregates[edge1.target()]==aggregate)
    \n-
    2118 {
    \n-
    2119 bool found=false;
    \n-
    2120 // Check if front node is also connected to this one
    \n-
    2121 Iterator v2end = graph_->endEdges(vertex);
    \n-
    2122 for(Iterator edge2 = graph_->beginEdges(vertex); edge2 != v2end; ++edge2) {
    \n-
    2123 if(edge2.target()==edge1.target()) {
    \n-
    2124 if(edge2.properties().isStrong())
    \n-
    2125 found=true;
    \n-
    2126 break;
    \n-
    2127 }
    \n-
    2128 }
    \n-
    2129 if(found)
    \n-
    2130 {
    \n-
    2131 return true;
    \n-
    2132 }
    \n-
    2133 }
    \n-
    2134 }
    \n-
    2135 }
    \n-
    2136 }
    \n-
    2137 return false;
    \n-
    2138 }
    \n-
    2139
    \n-
    2140 template<class G>
    \n-
    2141 void Aggregator<G>::unmarkFront()
    \n-
    2142 {
    \n-
    2143 typedef typename std::vector<Vertex>::const_iterator Iterator;
    \n-
    2144
    \n-
    2145 for(Iterator vertex=front_.begin(); vertex != front_.end(); ++vertex)
    \n-
    2146 graph_->getVertexProperties(*vertex).resetFront();
    \n-
    2147
    \n-
    2148 front_.clear();
    \n-
    2149 }
    \n-
    2150
    \n-
    2151 template<class G>
    \n-
    2152 inline void
    \n-
    2153 Aggregator<G>::nonisoNeighbourAggregate(const Vertex& vertex,
    \n-
    2154 const AggregatesMap<Vertex>& aggregates,
    \n-
    2155 SLList<Vertex>& neighbours) const
    \n-
    2156 {
    \n-
    2157 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
    \n-
    2158 Iterator end=graph_->beginEdges(vertex);
    \n-
    2159 neighbours.clear();
    \n-
    2160
    \n-
    2161 for(Iterator edge=graph_->beginEdges(vertex); edge!=end; ++edge)
    \n-
    2162 {
    \n-
    2163 if(aggregates[edge.target()]!=AggregatesMap<Vertex>::UNAGGREGATED && graph_->getVertexProperties(edge.target()).isolated())
    \n-
    2164 neighbours.push_back(aggregates[edge.target()]);
    \n-
    2165 }
    \n-
    2166 }
    \n-
    2167
    \n-
    2168 template<class G>
    \n-
    2169 inline typename G::VertexDescriptor Aggregator<G>::mergeNeighbour(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
    \n-
    2170 {
    \n-
    2171 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
    \n-
    2172
    \n-
    2173 Iterator end = graph_->endEdges(vertex);
    \n-
    2174 for(Iterator edge = graph_->beginEdges(vertex); edge != end; ++edge) {
    \n-
    2175 if(aggregates[edge.target()] != AggregatesMap<Vertex>::UNAGGREGATED &&
    \n-
    2176 graph_->getVertexProperties(edge.target()).isolated() == graph_->getVertexProperties(edge.source()).isolated()) {
    \n-
    2177 if( graph_->getVertexProperties(vertex).isolated() ||
    \n-
    2178 ((edge.properties().depends() || edge.properties().influences())
    \n-
    2179 && admissible(vertex, aggregates[edge.target()], aggregates)))
    \n-
    2180 return edge.target();
    \n-
    2181 }
    \n-
    2182 }
    \n-
    2183 return AggregatesMap<Vertex>::UNAGGREGATED;
    \n-
    2184 }
    \n-
    2185
    \n-
    2186 template<class G>
    \n-\n-
    2188 : Counter(), graph_(graph)
    \n-
    2189 {}
    \n-
    2190
    \n-
    2191 template<class G>
    \n-\n-
    2193 {
    \n-
    2194 if(graph_.getVertexProperties(edge.target()).front())
    \n-\n-
    2196 }
    \n-
    2197
    \n-
    2198 template<class G>
    \n-
    2199 int Aggregator<G>::noFrontNeighbours(const Vertex& vertex) const
    \n-
    2200 {
    \n-
    2201 FrontNeighbourCounter counter(*graph_);
    \n-
    2202 visitNeighbours(*graph_, vertex, counter);
    \n-
    2203 return counter.value();
    \n-
    2204 }
    \n-
    2205 template<class G>
    \n-
    2206 inline bool Aggregator<G>::connected(const Vertex& vertex,
    \n-
    2207 const AggregateDescriptor& aggregate,
    \n-
    2208 const AggregatesMap<Vertex>& aggregates) const
    \n-
    2209 {
    \n-
    2210 typedef typename G::ConstEdgeIterator iterator;
    \n-
    2211 const iterator end = graph_->endEdges(vertex);
    \n-
    2212 for(iterator edge = graph_->beginEdges(vertex); edge != end; ++edge)
    \n-
    2213 if(aggregates[edge.target()]==aggregate)
    \n-
    2214 return true;
    \n-
    2215 return false;
    \n-
    2216 }
    \n-
    2217 template<class G>
    \n-
    2218 inline bool Aggregator<G>::connected(const Vertex& vertex,
    \n-
    2219 const SLList<AggregateDescriptor>& aggregateList,
    \n-
    2220 const AggregatesMap<Vertex>& aggregates) const
    \n-
    2221 {
    \n-
    2222 typedef typename SLList<AggregateDescriptor>::const_iterator Iter;
    \n-
    2223 for(Iter i=aggregateList.begin(); i!=aggregateList.end(); ++i)
    \n-
    2224 if(connected(vertex, *i, aggregates))
    \n-
    2225 return true;
    \n-
    2226 return false;
    \n-
    2227 }
    \n-
    2228
    \n-
    2229 template<class G>
    \n-
    2230 template<class C>
    \n-
    2231 void Aggregator<G>::growIsolatedAggregate(const Vertex& seed, const AggregatesMap<Vertex>& aggregates, const C& c)
    \n-
    2232 {
    \n-
    2233 SLList<Vertex> connectedAggregates;
    \n-
    2234 nonisoNeighbourAggregate(seed, aggregates,connectedAggregates);
    \n-
    2235
    \n-
    2236 while(aggregate_->size()< c.minAggregateSize() && aggregate_->connectSize() < c.maxConnectivity()) {
    \n-
    2237 double maxCon=-1;
    \n-
    2238 std::size_t maxFrontNeighbours=0;
    \n-
    2239
    \n-
    2240 Vertex candidate=AggregatesMap<Vertex>::UNAGGREGATED;
    \n-
    2241
    \n-
    2242 typedef typename std::vector<Vertex>::const_iterator Iterator;
    \n-
    2243
    \n-
    2244 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
    \n-
    2245 if(distance(*vertex, aggregates)>c.maxDistance())
    \n-
    2246 continue; // distance of proposes aggregate too big
    \n-
    2247
    \n-
    2248 if(connectedAggregates.size()>0) {
    \n-
    2249 // there is already a neighbour cluster
    \n-
    2250 // front node must be connected to same neighbour cluster
    \n-
    2251
    \n-
    2252 if(!connected(*vertex, connectedAggregates, aggregates))
    \n-
    2253 continue;
    \n-
    2254 }
    \n-
    2255
    \n-
    2256 double con = connectivity(*vertex, aggregates);
    \n-
    2257
    \n-
    2258 if(con == maxCon) {
    \n-
    2259 std::size_t frontNeighbours = noFrontNeighbours(*vertex);
    \n-
    2260
    \n-
    2261 if(frontNeighbours >= maxFrontNeighbours) {
    \n-
    2262 maxFrontNeighbours = frontNeighbours;
    \n-
    2263 candidate = *vertex;
    \n-
    2264 }
    \n-
    2265 }else if(con > maxCon) {
    \n-
    2266 maxCon = con;
    \n-
    2267 maxFrontNeighbours = noFrontNeighbours(*vertex);
    \n-
    2268 candidate = *vertex;
    \n-
    2269 }
    \n-
    2270 }
    \n-
    2271
    \n-
    2272 if(candidate==AggregatesMap<Vertex>::UNAGGREGATED)
    \n-
    2273 break;
    \n-
    2274
    \n-
    2275 aggregate_->add(candidate);
    \n-
    2276 }
    \n-
    2277 }
    \n-
    2278
    \n-
    2279 template<class G>
    \n-
    2280 template<class C>
    \n-
    2281 void Aggregator<G>::growAggregate(const Vertex& seed, const AggregatesMap<Vertex>& aggregates, const C& c)
    \n-
    2282 {
    \n-
    2283 using std::min;
    \n-
    2284
    \n-
    2285 std::size_t distance_ =0;
    \n-
    2286 while(aggregate_->size() < c.minAggregateSize()&& distance_<c.maxDistance()) {
    \n-
    2287 int maxTwoCons=0, maxOneCons=0, maxNeighbours=-1;
    \n-
    2288 double maxCon=-1;
    \n-
    2289
    \n-
    2290 std::vector<Vertex> candidates;
    \n-
    2291 candidates.reserve(30);
    \n-
    2292
    \n-
    2293 typedef typename std::vector<Vertex>::const_iterator Iterator;
    \n-
    2294
    \n-
    2295 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
    \n-
    2296 // Only nonisolated nodes are considered
    \n-
    2297 if(graph_->getVertexProperties(*vertex).isolated())
    \n-
    2298 continue;
    \n-
    2299
    \n-
    2300 int twoWayCons = twoWayConnections(*vertex, aggregate_->id(), aggregates);
    \n-
    2301
    \n-
    2302 /* The case of two way connections. */
    \n-
    2303 if( maxTwoCons == twoWayCons && twoWayCons > 0) {
    \n-
    2304 double con = connectivity(*vertex, aggregates);
    \n-
    2305
    \n-
    2306 if(con == maxCon) {
    \n-
    2307 int neighbours = noFrontNeighbours(*vertex);
    \n-
    2308
    \n-
    2309 if(neighbours > maxNeighbours) {
    \n-
    2310 maxNeighbours = neighbours;
    \n-
    2311 candidates.clear();
    \n-
    2312 candidates.push_back(*vertex);
    \n-
    2313 }else{
    \n-
    2314 candidates.push_back(*vertex);
    \n-
    2315 }
    \n-
    2316 }else if( con > maxCon) {
    \n-
    2317 maxCon = con;
    \n-
    2318 maxNeighbours = noFrontNeighbours(*vertex);
    \n-
    2319 candidates.clear();
    \n-
    2320 candidates.push_back(*vertex);
    \n-
    2321 }
    \n-
    2322 }else if(twoWayCons > maxTwoCons) {
    \n-
    2323 maxTwoCons = twoWayCons;
    \n-
    2324 maxCon = connectivity(*vertex, aggregates);
    \n-
    2325 maxNeighbours = noFrontNeighbours(*vertex);
    \n-
    2326 candidates.clear();
    \n-
    2327 candidates.push_back(*vertex);
    \n-
    2328
    \n-
    2329 // two way connections precede
    \n-
    2330 maxOneCons = std::numeric_limits<int>::max();
    \n-
    2331 }
    \n-
    2332
    \n-
    2333 if(twoWayCons > 0)
    \n-
    2334 {
    \n-
    2335 continue; // THis is a two-way node, skip tests for one way nodes
    \n-
    2336 }
    \n-
    2337
    \n-
    2338 /* The one way case */
    \n-
    2339 int oneWayCons = oneWayConnections(*vertex, aggregate_->id(), aggregates);
    \n-
    2340
    \n-
    2341 if(oneWayCons==0)
    \n-
    2342 continue; // No strong connections, skip the tests.
    \n-
    2343
    \n-
    2344 if(!admissible(*vertex, aggregate_->id(), aggregates))
    \n-
    2345 continue;
    \n-
    2346
    \n-
    2347 if( maxOneCons == oneWayCons && oneWayCons > 0) {
    \n-
    2348 double con = connectivity(*vertex, aggregates);
    \n-
    2349
    \n-
    2350 if(con == maxCon) {
    \n-
    2351 int neighbours = noFrontNeighbours(*vertex);
    \n-
    2352
    \n-
    2353 if(neighbours > maxNeighbours) {
    \n-
    2354 maxNeighbours = neighbours;
    \n-
    2355 candidates.clear();
    \n-
    2356 candidates.push_back(*vertex);
    \n-
    2357 }else{
    \n-
    2358 if(neighbours==maxNeighbours)
    \n-
    2359 {
    \n-
    2360 candidates.push_back(*vertex);
    \n-
    2361 }
    \n-
    2362 }
    \n-
    2363 }else if( con > maxCon) {
    \n-
    2364 maxCon = con;
    \n-
    2365 maxNeighbours = noFrontNeighbours(*vertex);
    \n-
    2366 candidates.clear();
    \n-
    2367 candidates.push_back(*vertex);
    \n-
    2368 }
    \n-
    2369 }else if(oneWayCons > maxOneCons) {
    \n-
    2370 maxOneCons = oneWayCons;
    \n-
    2371 maxCon = connectivity(*vertex, aggregates);
    \n-
    2372 maxNeighbours = noFrontNeighbours(*vertex);
    \n-
    2373 candidates.clear();
    \n-
    2374 candidates.push_back(*vertex);
    \n-
    2375 }
    \n-
    2376 }
    \n-
    2377
    \n-
    2378
    \n-
    2379 if(!candidates.size())
    \n-
    2380 break; // No more candidates found
    \n-
    2381 distance_=distance(seed, aggregates);
    \n-
    2382 candidates.resize(min(candidates.size(), c.maxAggregateSize()-
    \n-
    2383 aggregate_->size()));
    \n-
    2384 aggregate_->add(candidates);
    \n-
    2385 }
    \n-
    2386 }
    \n-
    2387
    \n-
    2388 template<typename V>
    \n-
    2389 template<typename M, typename G, typename C>
    \n-
    2390 std::tuple<int,int,int,int> AggregatesMap<V>::buildAggregates(const M& matrix, G& graph, const C& criterion,
    \n-
    2391 bool finestLevel)
    \n-
    2392 {
    \n-
    2393 Aggregator<G> aggregator;
    \n-
    2394 return aggregator.build(matrix, graph, *this, criterion, finestLevel);
    \n-
    2395 }
    \n-
    2396
    \n-
    2397 template<class G>
    \n-
    2398 template<class M, class C>
    \n-
    2399 std::tuple<int,int,int,int> Aggregator<G>::build(const M& m, G& graph, AggregatesMap<Vertex>& aggregates, const C& c,
    \n-
    2400 bool finestLevel)
    \n-
    2401 {
    \n-
    2402 using std::max;
    \n-
    2403 using std::min;
    \n-
    2404 // Stack for fast vertex access
    \n-
    2405 Stack stack_(graph, *this, aggregates);
    \n-
    2406
    \n-
    2407 graph_ = &graph;
    \n-
    2408
    \n-
    2409 aggregate_ = new Aggregate<G,VertexSet>(graph, aggregates, connected_, front_);
    \n-
    2410
    \n-
    2411 Timer watch;
    \n-
    2412 watch.reset();
    \n-
    2413
    \n-
    2414 buildDependency(graph, m, c, finestLevel);
    \n-
    2415
    \n-
    2416 dverb<<"Build dependency took "<< watch.elapsed()<<" seconds."<<std::endl;
    \n-
    2417 int noAggregates, conAggregates, isoAggregates, oneAggregates;
    \n-
    2418 std::size_t maxA=0, minA=1000000, avg=0;
    \n-
    2419 int skippedAggregates;
    \n-
    2420 noAggregates = conAggregates = isoAggregates = oneAggregates =
    \n-
    2421 skippedAggregates = 0;
    \n-
    2422
    \n-
    2423 while(true) {
    \n-
    2424 Vertex seed = stack_.pop();
    \n-
    2425
    \n-
    2426 if(seed == Stack::NullEntry)
    \n-
    2427 // No more unaggregated vertices. We are finished!
    \n-
    2428 break;
    \n-
    2429
    \n-
    2430 // Debugging output
    \n-
    2431 if((noAggregates+1)%10000 == 0)
    \n-
    2432 Dune::dverb<<"c";
    \n-
    2433 unmarkFront();
    \n-
    2434
    \n-
    2435 if(graph.getVertexProperties(seed).excludedBorder()) {
    \n-
    2436 aggregates[seed]=AggregatesMap<Vertex>::ISOLATED;
    \n-
    2437 ++skippedAggregates;
    \n-
    2438 continue;
    \n-
    2439 }
    \n-
    2440
    \n-
    2441 if(graph.getVertexProperties(seed).isolated()) {
    \n-
    2442 if(c.skipIsolated()) {
    \n-
    2443 // isolated vertices are not aggregated but skipped on the coarser levels.
    \n-
    2444 aggregates[seed]=AggregatesMap<Vertex>::ISOLATED;
    \n-
    2445 ++skippedAggregates;
    \n-
    2446 // skip rest as no agglomeration is done.
    \n-
    2447 continue;
    \n-
    2448 }else{
    \n-
    2449 aggregate_->seed(seed);
    \n-
    2450 growIsolatedAggregate(seed, aggregates, c);
    \n-
    2451 }
    \n-
    2452 }else{
    \n-
    2453 aggregate_->seed(seed);
    \n-
    2454 growAggregate(seed, aggregates, c);
    \n-
    2455 }
    \n-
    2456
    \n-
    2457 /* The rounding step. */
    \n-
    2458 while(!(graph.getVertexProperties(seed).isolated()) && aggregate_->size() < c.maxAggregateSize()) {
    \n-
    2459
    \n-
    2460 std::vector<Vertex> candidates;
    \n-
    2461 candidates.reserve(30);
    \n-
    2462
    \n-
    2463 typedef typename std::vector<Vertex>::const_iterator Iterator;
    \n-
    2464
    \n-
    2465 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
    \n-
    2466
    \n-
    2467 if(graph.getVertexProperties(*vertex).isolated())
    \n-
    2468 continue; // No isolated nodes here
    \n-
    2469
    \n-
    2470 if(twoWayConnections( *vertex, aggregate_->id(), aggregates) == 0 &&
    \n-
    2471 (oneWayConnections( *vertex, aggregate_->id(), aggregates) == 0 ||
    \n-
    2472 !admissible( *vertex, aggregate_->id(), aggregates) ))
    \n-
    2473 continue;
    \n-
    2474
    \n-
    2475 std::pair<int,int> neighbourPair=neighbours(*vertex, aggregate_->id(),
    \n-
    2476 aggregates);
    \n-
    2477
    \n-
    2478 //if(aggregateNeighbours(*vertex, aggregate_->id(), aggregates) <= unusedNeighbours(*vertex, aggregates))
    \n-
    2479 // continue;
    \n-
    2480
    \n-
    2481 if(neighbourPair.first >= neighbourPair.second)
    \n-
    2482 continue;
    \n-
    2483
    \n-
    2484 if(distance(*vertex, aggregates) > c.maxDistance())
    \n-
    2485 continue; // Distance too far
    \n-
    2486 candidates.push_back(*vertex);
    \n-
    2487 break;
    \n-
    2488 }
    \n-
    2489
    \n-
    2490 if(!candidates.size()) break; // no more candidates found.
    \n-
    2491
    \n-
    2492 candidates.resize(min(candidates.size(), c.maxAggregateSize()-
    \n-
    2493 aggregate_->size()));
    \n-
    2494 aggregate_->add(candidates);
    \n-
    2495
    \n-
    2496 }
    \n-
    2497
    \n-
    2498 // try to merge aggregates consisting of only one nonisolated vertex with other aggregates
    \n-
    2499 if(aggregate_->size()==1 && c.maxAggregateSize()>1) {
    \n-
    2500 if(!graph.getVertexProperties(seed).isolated()) {
    \n-
    2501 Vertex mergedNeighbour = mergeNeighbour(seed, aggregates);
    \n-
    2502
    \n-
    2503 if(mergedNeighbour != AggregatesMap<Vertex>::UNAGGREGATED) {
    \n-
    2504 // assign vertex to the neighbouring cluster
    \n-
    2505 aggregates[seed] = aggregates[mergedNeighbour];
    \n-
    2506 aggregate_->invalidate();
    \n-
    2507 }else{
    \n-
    2508 ++avg;
    \n-
    2509 minA=min(minA,static_cast<std::size_t>(1));
    \n-
    2510 maxA=max(maxA,static_cast<std::size_t>(1));
    \n-
    2511 ++oneAggregates;
    \n-
    2512 ++conAggregates;
    \n-
    2513 }
    \n-
    2514 }else{
    \n-
    2515 ++avg;
    \n-
    2516 minA=min(minA,static_cast<std::size_t>(1));
    \n-
    2517 maxA=max(maxA,static_cast<std::size_t>(1));
    \n-
    2518 ++oneAggregates;
    \n-
    2519 ++isoAggregates;
    \n-
    2520 }
    \n-
    2521 ++avg;
    \n-
    2522 }else{
    \n-
    2523 avg+=aggregate_->size();
    \n-
    2524 minA=min(minA,aggregate_->size());
    \n-
    2525 maxA=max(maxA,aggregate_->size());
    \n-
    2526 if(graph.getVertexProperties(seed).isolated())
    \n-
    2527 ++isoAggregates;
    \n-
    2528 else
    \n-
    2529 ++conAggregates;
    \n-
    2530 }
    \n-
    2531
    \n-
    2532 }
    \n-
    2533
    \n-
    2534 Dune::dinfo<<"connected aggregates: "<<conAggregates;
    \n-
    2535 Dune::dinfo<<" isolated aggregates: "<<isoAggregates;
    \n-
    2536 if(conAggregates+isoAggregates>0)
    \n-
    2537 Dune::dinfo<<" one node aggregates: "<<oneAggregates<<" min size="
    \n-
    2538 <<minA<<" max size="<<maxA
    \n-
    2539 <<" avg="<<avg/(conAggregates+isoAggregates)<<std::endl;
    \n-
    2540
    \n-
    2541 delete aggregate_;
    \n-
    2542 return std::make_tuple(conAggregates+isoAggregates,isoAggregates,
    \n-
    2543 oneAggregates,skippedAggregates);
    \n-
    2544 }
    \n-
    2545
    \n-
    2546
    \n-
    2547 template<class G>
    \n-
    2548 Aggregator<G>::Stack::Stack(const MatrixGraph& graph, const Aggregator<G>& aggregatesBuilder,
    \n-
    2549 const AggregatesMap<Vertex>& aggregates)
    \n-
    2550 : graph_(graph), aggregatesBuilder_(aggregatesBuilder), aggregates_(aggregates), begin_(graph.begin()), end_(graph.end())
    \n-
    2551 {
    \n-
    2552 //vals_ = new Vertex[N];
    \n-
    2553 }
    \n-
    2554
    \n-
    2555 template<class G>
    \n-\n-
    2557 {
    \n-
    2558 //Dune::dverb << "Max stack size was "<<maxSize_<<" filled="<<filled_<<std::endl;
    \n-
    2559 //delete[] vals_;
    \n-
    2560 }
    \n-
    2561
    \n-
    2562 template<class G>
    \n-\n-
    2564 = std::numeric_limits<typename G::VertexDescriptor>::max();
    \n-
    2565
    \n-
    2566 template<class G>
    \n-
    2567 inline typename G::VertexDescriptor Aggregator<G>::Stack::pop()
    \n-
    2568 {
    \n-
    2569 for(; begin_!=end_ && aggregates_[*begin_] != AggregatesMap<Vertex>::UNAGGREGATED; ++begin_) ;
    \n-
    2570
    \n-
    2571 if(begin_!=end_)
    \n-
    2572 {
    \n-
    2573 typename G::VertexDescriptor current=*begin_;
    \n-
    2574 ++begin_;
    \n-
    2575 return current;
    \n-
    2576 }else
    \n-
    2577 return NullEntry;
    \n-
    2578 }
    \n-
    2579
    \n-
    2580#endif // DOXYGEN
    \n-
    2581
    \n-
    2582 template<class V>
    \n-
    \n-
    2583 void printAggregates2d(const AggregatesMap<V>& aggregates, int n, int m, std::ostream& os)
    \n-
    2584 {
    \n-
    2585 using std::max;
    \n-
    2586
    \n-
    2587 std::ios_base::fmtflags oldOpts=os.flags();
    \n-
    2588
    \n-
    2589 os.setf(std::ios_base::right, std::ios_base::adjustfield);
    \n-
    2590
    \n-
    2591 V maxVal=0;
    \n-
    2592 int width=1;
    \n-
    2593
    \n-
    2594 for(int i=0; i< n*m; i++)
    \n-
    2595 maxVal=max(maxVal, aggregates[i]);
    \n-
    2596
    \n-
    2597 for(int i=10; i < 1000000; i*=10)
    \n-
    2598 if(maxVal/i>0)
    \n-
    2599 width++;
    \n-
    2600 else
    \n-
    2601 break;
    \n-
    2602
    \n-
    2603 for(int j=0, entry=0; j < m; j++) {
    \n-
    2604 for(int i=0; i<n; i++, entry++) {
    \n-
    2605 os.width(width);
    \n-
    2606 os<<aggregates[entry]<<" ";
    \n-
    2607 }
    \n-
    2608
    \n-
    2609 os<<std::endl;
    \n-
    2610 }
    \n-
    2611 os<<std::endl;
    \n-
    2612 os.flags(oldOpts);
    \n-
    2613 }
    \n-
    \n-
    2614
    \n-
    2615
    \n-
    2616 } // namespace Amg
    \n-
    2617
    \n-
    2618} // namespace Dune
    \n-
    2619
    \n-
    2620
    \n-
    2621#endif
    \n-
    Parameter classes for customizing AMG.
    \n-\n-
    Provides classes for building the matrix graph.
    \n-
    Provides classes for handling internal properties in a graph.
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n-
    Matrix::ConstColIterator ColIter
    Constant column iterator of the matrix.
    Definition aggregates.hh:273
    \n-
    std::vector< real_type >::iterator valIter_
    Definition aggregates.hh:189
    \n-
    Matrix::ConstColIterator ColIter
    Constant column iterator of the matrix.
    Definition aggregates.hh:154
    \n-
    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.
    \n-
    PoolAllocator< VertexDescriptor, 100 > Allocator
    The allocator we use for our lists and the set.
    Definition aggregates.hh:586
    \n-
    iterator begin()
    Definition aggregates.hh:737
    \n-
    int id()
    Get the id identifying the aggregate.
    \n-
    Norm norm_
    The functor for calculating the norm.
    Definition aggregates.hh:302
    \n-
    MatrixGraph::VertexDescriptor Vertex
    The vertex identifier.
    Definition aggregates.hh:920
    \n-
    AggregationCriterion()
    Constructor.
    Definition aggregates.hh:66
    \n-
    const Matrix * matrix_
    The matrix we work on.
    Definition aggregates.hh:357
    \n-
    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
    \n-
    void initRow(const Row &row, int index)
    \n-
    SymmetricMatrixDependency(const Parameters &parms)
    Definition aggregates.hh:168
    \n-
    M Matrix
    The matrix type we build the dependency of.
    Definition aggregates.hh:258
    \n-\n-
    G MatrixGraph
    The matrix graph type used.
    Definition aggregates.hh:915
    \n-
    Norm norm_
    The functor for calculating the norm.
    Definition aggregates.hh:363
    \n-
    void operator()(const EdgeIterator &edge) const
    Definition aggregates.hh:601
    \n-
    SymmetricCriterion()
    Definition aggregates.hh:524
    \n-
    Dependency()
    Definition aggregates.hh:290
    \n-
    void examine(const ColIter &col)
    \n-
    M Matrix
    The matrix type we build the dependency of.
    Definition aggregates.hh:319
    \n-
    real_type diagonal_
    The norm of the current diagonal.
    Definition aggregates.hh:187
    \n-
    N Norm
    The norm to use for examining the matrix entries.
    Definition aggregates.hh:263
    \n-
    iterator end()
    Definition aggregates.hh:742
    \n-
    UnSymmetricCriterion(const Parameters &parms)
    Definition aggregates.hh:541
    \n-
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n-
    void initRow(const Row &row, int index)
    Definition aggregates.hh:201
    \n-\n-
    static const Vertex NullEntry
    Definition aggregates.hh:1008
    \n-
    void examine(const ColIter &col)
    Definition aggregates.hh:214
    \n-
    Dependency(const Parameters &parms)
    Definition aggregates.hh:286
    \n-
    int row_
    index of the currently evaluated row.
    Definition aggregates.hh:185
    \n-
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n-
    std::tuple< int, int, int, int > build(const M &m, G &graph, AggregatesMap< Vertex > &aggregates, const C &c, bool finestLevel)
    Build the aggregates.
    \n-
    FrontNeighbourCounter(const MatrixGraph &front)
    Constructor.
    \n-
    Matrix::row_type Row
    Constant Row iterator of the matrix.
    Definition aggregates.hh:329
    \n-
    const Matrix * matrix_
    The matrix we work on.
    Definition aggregates.hh:296
    \n-
    const AggregateDescriptor & operator[](const VertexDescriptor &v) const
    Get the aggregate a vertex belongs to.
    \n-
    void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter &col)
    \n-
    AggregateVisitor(const AggregatesMap< Vertex > &aggregates, const AggregateDescriptor &aggregate, Visitor &visitor)
    Constructor.
    \n-
    Matrix::ConstColIterator ColIter
    Constant column iterator of the matrix.
    Definition aggregates.hh:334
    \n-
    ~AggregatesMap()
    Destructor.
    \n-
    Matrix::field_type field_type
    The current max value.
    Definition aggregates.hh:179
    \n-
    void decrement()
    Decrement counter.
    \n-
    Aggregate(MatrixGraph &graph, AggregatesMap< Vertex > &aggregates, VertexSet &connectivity, std::vector< Vertex > &front_)
    Constructor.
    \n-
    V Visitor
    The type of the adapted visitor.
    Definition aggregates.hh:1064
    \n-
    std::size_t * SphereMap
    Type of the mapping of aggregate members onto distance spheres.
    Definition aggregates.hh:809
    \n-
    AggregationCriterion(const Parameters &parms)
    Definition aggregates.hh:70
    \n-
    Matrix::row_type Row
    Constant Row iterator of the matrix.
    Definition aggregates.hh:268
    \n-
    VertexSet::size_type connectSize()
    Get the number of connections to other aggregates.
    \n-
    std::vector< real_type > vals_
    Definition aggregates.hh:188
    \n-
    N Norm
    The norm to use for examining the matrix entries.
    Definition aggregates.hh:324
    \n-
    void printAggregates2d(const AggregatesMap< V > &aggregates, int n, int m, std::ostream &os)
    Definition aggregates.hh:2583
    \n-
    void invalidate()
    Definition aggregates.hh:822
    \n-
    const_iterator begin() const
    Definition aggregates.hh:725
    \n-
    real_type maxValue_
    Definition aggregates.hh:181
    \n-
    Norm norm_
    The functor for calculating the norm.
    Definition aggregates.hh:183
    \n-
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n-
    VertexSet::const_iterator const_iterator
    Const iterator over a vertex list.
    Definition aggregates.hh:804
    \n-
    SymmetricCriterion(const Parameters &parms)
    Definition aggregates.hh:521
    \n-
    MatrixGraph::VertexDescriptor AggregateDescriptor
    The type of the aggregate descriptor.
    Definition aggregates.hh:923
    \n-
    real_type maxValue_
    Definition aggregates.hh:361
    \n-
    void init(const Matrix *matrix)
    Definition aggregates.hh:195
    \n-
    real_type diagonal_
    The norm of the current diagonal.
    Definition aggregates.hh:367
    \n-
    AggregateDescriptor * iterator
    Definition aggregates.hh:735
    \n-
    SymmetricDependency(const Parameters &parms)
    Definition aggregates.hh:348
    \n-
    FieldTraits< field_type >::real_type real_type
    Definition aggregates.hh:360
    \n-
    ~Aggregator()
    Destructor.
    \n-
    void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter &col)
    \n-
    void add(const Vertex &vertex)
    Add a vertex to the aggregate.
    \n-
    T DependencyPolicy
    The policy for calculating the dependency graph.
    Definition aggregates.hh:55
    \n-
    void add(std::vector< Vertex > &vertex)
    \n-
    void examine(const ColIter &col)
    \n-
    Aggregator()
    Constructor.
    \n-
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    Examine an edge.
    \n-
    FrontMarker(std::vector< Vertex > &front, MatrixGraph &graph)
    Constructor.
    \n-
    FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
    compute the norm of a matrix.
    Definition aggregates.hh:506
    \n-
    void init(const Matrix *matrix)
    \n-
    int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
    Visit all neighbour vertices of a vertex in a graph.
    \n-
    void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
    Sets reasonable default values for an isotropic problem.
    Definition aggregates.hh:82
    \n-
    const_iterator end() const
    Definition aggregates.hh:730
    \n-
    V AggregateDescriptor
    The aggregate descriptor type.
    Definition aggregates.hh:580
    \n-
    static const V ISOLATED
    Identifier of isolated vertices.
    Definition aggregates.hh:571
    \n-
    int row_
    index of the currently evaluated row.
    Definition aggregates.hh:365
    \n-
    SymmetricMatrixDependency()
    Definition aggregates.hh:171
    \n-\n-\n-
    real_type diagonal_
    The norm of the current diagonal.
    Definition aggregates.hh:306
    \n-
    std::size_t noVertices() const
    Get the number of vertices.
    \n-
    void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2)
    Sets reasonable default values for an aisotropic problem.
    Definition aggregates.hh:105
    \n-
    AggregatesMap(std::size_t noVertices)
    Constructs with allocating memory.
    \n-
    Matrix::field_type field_type
    The current max value.
    Definition aggregates.hh:359
    \n-
    AggregateDescriptor & operator[](const VertexDescriptor &v)
    Get the aggregate a vertex belongs to.
    \n-
    AggregatesMap()
    Constructs without allocating memory.
    \n-
    int value()
    Access the current count.
    \n-
    SLList< VertexDescriptor, Allocator > VertexList
    The type of a single linked list of vertex descriptors.
    Definition aggregates.hh:592
    \n-\n-
    ConnectivityCounter(const VertexSet &connected, const AggregatesMap< Vertex > &aggregates)
    Constructor.
    \n-
    VertexSet::size_type size()
    Get the size of the aggregate.
    \n-
    const_iterator end() const
    get an iterator over the vertices of the aggregate.
    \n-
    void init(const Matrix *matrix)
    \n-
    UnSymmetricCriterion()
    Definition aggregates.hh:544
    \n-
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n-
    const AggregateDescriptor * const_iterator
    Definition aggregates.hh:723
    \n-
    int row_
    index of the currently evaluated row.
    Definition aggregates.hh:304
    \n-
    Stack(const MatrixGraph &graph, const Aggregator< G > &aggregatesBuilder, const AggregatesMap< Vertex > &aggregates)
    \n-
    FieldTraits< field_type >::real_type real_type
    Definition aggregates.hh:180
    \n-
    void initRow(const Row &row, int index)
    \n-
    M Matrix
    The matrix type we build the dependency of.
    Definition aggregates.hh:139
    \n-
    FieldTraits< field_type >::real_type real_type
    Definition aggregates.hh:299
    \n-
    const Matrix * matrix_
    The matrix we work on.
    Definition aggregates.hh:177
    \n-
    S VertexSet
    The type of a single linked list of vertex descriptors.
    Definition aggregates.hh:801
    \n-
    FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
    compute the norm of a matrix.
    Definition aggregates.hh:490
    \n-
    static const V UNAGGREGATED
    Identifier of not yet aggregated vertices.
    Definition aggregates.hh:566
    \n-
    std::size_t breadthFirstSearch(const VertexDescriptor &start, const AggregateDescriptor &aggregate, const G &graph, F &aggregateVisitor, VM &visitedMap) const
    Breadth first search within an aggregate.
    \n-
    Matrix::field_type field_type
    The current max value.
    Definition aggregates.hh:298
    \n-
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n-
    std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T > &criterion)
    Definition aggregates.hh:113
    \n-
    bool isIsolated()
    Definition aggregates.hh:240
    \n-
    void allocate(std::size_t noVertices)
    Allocate memory for holding the information.
    \n-
    N Norm
    The norm to use for examining the matrix entries.
    Definition aggregates.hh:144
    \n-
    FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
    compute the norm of a matrix.
    Definition aggregates.hh:473
    \n-
    void reconstruct(const Vertex &vertex)
    Reconstruct the aggregat from an seed node.
    \n-
    const_iterator begin() const
    get an iterator over the vertices of the aggregate.
    \n-
    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
    \n-
    MatrixGraph::VertexDescriptor Vertex
    The vertex descriptor type.
    Definition aggregates.hh:789
    \n-
    void seed(const Vertex &vertex)
    Initialize the aggregate with one vertex.
    \n-\n-
    SymmetricDependency()
    Definition aggregates.hh:351
    \n-
    void clear()
    Clear the aggregate.
    \n-
    void free()
    Free the allocated memory.
    \n-
    void increment()
    Increment counter.
    \n-
    void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, bool finestLevel)
    Build the dependency of the matrix graph.
    \n-
    V VertexDescriptor
    The vertex descriptor type.
    Definition aggregates.hh:575
    \n-
    real_type maxValue_
    Definition aggregates.hh:300
    \n-
    std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, const C &criterion, bool finestLevel)
    Build the aggregates.
    \n-
    Matrix::row_type Row
    Constant Row iterator of the matrix.
    Definition aggregates.hh:149
    \n-
    PoolAllocator< Vertex, 100 > Allocator
    The allocator we use for our lists and the set.
    Definition aggregates.hh:795
    \n-
    G MatrixGraph
    Definition aggregates.hh:785
    \n-
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n-
    @ is_sign_preserving
    Definition aggregates.hh:483
    \n-
    @ is_sign_preserving
    Definition aggregates.hh:382
    \n-
    @ is_sign_preserving
    Definition aggregates.hh:499
    \n-
    @ is_sign_preserving
    Definition aggregates.hh:466
    \n+\n+
    1078
    \n+\n+
    1085 };
    \n+
    \n+
    1086
    \n+
    1087 template<class T, class A>
    \n+
    \n+
    1088 struct FieldTraits< Matrix<T, A> >
    \n+
    1089 {
    \n+\n+
    1091 using real_type = typename FieldTraits<field_type>::real_type;
    \n+
    1092 };
    \n+
    \n+
    1093
    \n+
    1095} // end namespace Dune
    \n+
    1096
    \n+
    1097#endif
    \n+\n+
    Helper functions for determining the vector/matrix block level.
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n
    Definition allocator.hh:11
    \n-
    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
    \n+
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    A Vector of blocks with different blocksizes.
    Definition matrix.hh:44
    \n+
    Imp::BlockVectorWindow< B, A > window_type
    Definition matrix.hh:70
    \n+
    BlockVector< B, A > block_type
    Same as value_type, here for historical reasons.
    Definition matrix.hh:67
    \n+
    DenseMatrixBase & operator=(const DenseMatrixBase &a)
    assignment
    Definition matrix.hh:182
    \n+
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition matrix.hh:50
    \n+
    Iterator beforeBegin() const
    Definition matrix.hh:385
    \n+
    void resize(size_type rows, size_type columns)
    same effect as constructor with same argument
    Definition matrix.hh:153
    \n+
    const window_type const_reference
    Definition matrix.hh:74
    \n+
    DenseMatrixBase(size_type rows, size_type columns)
    Definition matrix.hh:95
    \n+
    Iterator end()
    end Iterator
    Definition matrix.hh:371
    \n+
    reference operator[](size_type i)
    random access to blocks
    Definition matrix.hh:241
    \n+
    BlockVector< B, A > value_type
    Type of the elements of the outer vector, i.e., dynamic vectors of B.
    Definition matrix.hh:63
    \n+
    Iterator find(size_type i)
    random access returning iterator (end if not contained)
    Definition matrix.hh:391
    \n+
    size_type N() const
    number of blocks in the vector (are of variable size here)
    Definition matrix.hh:539
    \n+
    ConstIterator beforeEnd() const
    Definition matrix.hh:525
    \n+
    ConstIterator end() const
    end ConstIterator
    Definition matrix.hh:518
    \n+
    window_type reference
    Definition matrix.hh:72
    \n+
    ConstIterator rend() const
    end ConstIterator
    Definition matrix.hh:531
    \n+
    Iterator beforeEnd()
    Definition matrix.hh:378
    \n+
    ConstIterator begin() const
    begin ConstIterator
    Definition matrix.hh:512
    \n+
    A allocator_type
    export the allocator type
    Definition matrix.hh:53
    \n+
    DenseMatrixBase()
    Definition matrix.hh:82
    \n+
    ConstIterator find(size_type i) const
    random access returning iterator (end if not contained)
    Definition matrix.hh:397
    \n+
    A::size_type size_type
    The size type for the index access.
    Definition matrix.hh:56
    \n+
    ~DenseMatrixBase()
    free dynamic memory
    Definition matrix.hh:142
    \n+
    Iterator begin()
    begin Iterator
    Definition matrix.hh:365
    \n+
    DenseMatrixBase(const DenseMatrixBase &a)
    copy constructor, has copy semantics
    Definition matrix.hh:116
    \n+
    Iterator class for sequential access.
    Definition matrix.hh:263
    \n+
    Iterator & operator--()
    prefix decrement
    Definition matrix.hh:308
    \n+
    size_type index() const
    Definition matrix.hh:352
    \n+\n+\n+
    bool operator!=(const Iterator &it) const
    inequality
    Definition matrix.hh:322
    \n+
    Iterator & operator=(Iterator &&other)
    Move assignment.
    Definition matrix.hh:282
    \n+
    Iterator & operator++()
    prefix increment
    Definition matrix.hh:300
    \n+
    Iterator()
    constructor, no arguments
    Definition matrix.hh:266
    \n+
    window_type & operator*() const
    dereferencing
    Definition matrix.hh:340
    \n+
    bool operator==(const Iterator &it) const
    equality
    Definition matrix.hh:316
    \n+
    Iterator & operator=(Iterator &other)
    Copy assignment.
    Definition matrix.hh:291
    \n+
    Iterator(B *data, size_type columns, size_type _i)
    constructor
    Definition matrix.hh:276
    \n+
    window_type * operator->() const
    arrow
    Definition matrix.hh:346
    \n+
    ConstIterator class for sequential access.
    Definition matrix.hh:404
    \n+
    const window_type * operator->() const
    arrow
    Definition matrix.hh:487
    \n+
    const window_type & operator*() const
    dereferencing
    Definition matrix.hh:481
    \n+
    ConstIterator & operator++()
    prefix increment
    Definition matrix.hh:441
    \n+
    ConstIterator(const B *data, size_type columns, size_type _i)
    constructor from pointer
    Definition matrix.hh:414
    \n+
    ConstIterator & operator--()
    prefix decrement
    Definition matrix.hh:449
    \n+
    ConstIterator(const Iterator &it)
    constructor from non_const iterator
    Definition matrix.hh:420
    \n+
    bool operator!=(const ConstIterator &it) const
    inequality
    Definition matrix.hh:463
    \n+
    ConstIterator()
    constructor
    Definition matrix.hh:407
    \n+
    bool operator==(const ConstIterator &it) const
    equality
    Definition matrix.hh:457
    \n+
    size_type index() const
    Definition matrix.hh:493
    \n+
    ConstIterator & operator=(Iterator &&other)
    Definition matrix.hh:424
    \n+
    ConstIterator & operator=(Iterator &other)
    Definition matrix.hh:432
    \n
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    size_type cols_
    Number of columns of the matrix.
    Definition matrix.hh:1084
    \n+
    FieldTraits< ft >::real_type infinity_norm() const
    infinity norm (row sum norm, how to generalize for blocks?)
    Definition matrix.hh:988
    \n+
    A allocator_type
    Export the allocator.
    Definition matrix.hh:571
    \n+
    FieldTraits< ft >::real_type infinity_norm_real() const
    simplified infinity norm (uses Manhattan norm for complex values)
    Definition matrix.hh:1007
    \n+
    void usmhv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^H x
    Definition matrix.hh:952
    \n+
    void usmv(const field_type &alpha, const X &x, Y &y) const
    Definition matrix.hh:850
    \n+
    A::size_type size_type
    Type for indices and sizes.
    Definition matrix.hh:577
    \n+
    MatrixImp::DenseMatrixBase< T, A > data_
    Abuse DenseMatrixBase as an engine for a 2d array ISTL-style.
    Definition matrix.hh:1077
    \n+
    Matrix transpose() const
    Return the transpose of the matrix.
    Definition matrix.hh:741
    \n+
    void mtv(const X &x, Y &y) const
    y = A^T x
    Definition matrix.hh:803
    \n+
    void umv(const X &x, Y &y) const
    y += A x
    Definition matrix.hh:816
    \n+
    void mv(const X &x, Y &y) const
    y = A x
    Definition matrix.hh:784
    \n+
    MatrixImp::DenseMatrixBase< T, A >::ConstIterator ConstRowIterator
    Const iterator over the matrix rows.
    Definition matrix.hh:586
    \n+
    void setSize(size_type rows, size_type cols)
    Change the matrix size.
    Definition matrix.hh:604
    \n+
    RowIterator beforeBegin()
    Definition matrix.hh:630
    \n+
    RowIterator beforeEnd()
    Definition matrix.hh:623
    \n+
    Matrix()
    Create empty matrix.
    Definition matrix.hh:592
    \n+
    Matrix & operator-=(const Matrix &b)
    Subtract the entries of another matrix from this one.
    Definition matrix.hh:731
    \n+
    FieldTraits< field_type >::real_type frobenius_norm2() const
    square of frobenius norm, need for block recursion
    Definition matrix.hh:976
    \n+
    row_type::iterator ColIterator
    Iterator for the entries of each row.
    Definition matrix.hh:583
    \n+
    ConstRowIterator beforeEnd() const
    Definition matrix.hh:649
    \n+
    Matrix & operator=(const field_type &t)
    Assignment from scalar.
    Definition matrix.hh:662
    \n+
    RowIterator end()
    Get iterator to one beyond last row.
    Definition matrix.hh:616
    \n+
    const row_type operator[](size_type row) const
    The const index operator.
    Definition matrix.hh:680
    \n+
    ConstRowIterator end() const
    Get const iterator to one beyond last row.
    Definition matrix.hh:642
    \n+
    friend Y operator*(const Matrix< T > &m, const X &vec)
    Generic matrix-vector multiplication.
    Definition matrix.hh:766
    \n+
    Matrix< T > & operator*=(const field_type &scalar)
    Multiplication with a scalar.
    Definition matrix.hh:701
    \n+
    row_type operator[](size_type row)
    The index operator.
    Definition matrix.hh:669
    \n+
    void mmv(const X &x, Y &y) const
    y -= A x
    Definition matrix.hh:833
    \n+
    Matrix & operator+=(const Matrix &b)
    Add the entries of another matrix to this one.
    Definition matrix.hh:717
    \n+
    ConstRowIterator begin() const
    Get const iterator to first row.
    Definition matrix.hh:636
    \n+
    void mmhv(const X &x, Y &y) const
    y -= A^H x
    Definition matrix.hh:935
    \n+
    RowIterator begin()
    Get iterator to first row.
    Definition matrix.hh:610
    \n
    typename Imp::BlockTraits< T >::field_type field_type
    Export the type representing the underlying field.
    Definition matrix.hh:565
    \n
    row_type::const_iterator ConstColIterator
    Const iterator for the entries of each row.
    Definition matrix.hh:589
    \n+
    size_type M() const
    Return the number of columns.
    Definition matrix.hh:696
    \n+
    T block_type
    Export the type representing the components.
    Definition matrix.hh:568
    \n+
    bool exists(size_type i, size_type j) const
    return true if (i,j) is in pattern
    Definition matrix.hh:1064
    \n+
    Matrix< T > & operator/=(const field_type &scalar)
    Division by a scalar.
    Definition matrix.hh:707
    \n+
    friend Matrix< T > operator*(const Matrix< T > &m1, const Matrix< T > &m2)
    Generic matrix multiplication.
    Definition matrix.hh:751
    \n+
    void umtv(const X &x, Y &y) const
    y += A^T x
    Definition matrix.hh:867
    \n+
    void mmtv(const X &x, Y &y) const
    y -= A^T x
    Definition matrix.hh:884
    \n
    MatrixImp::DenseMatrixBase< T, A >::window_type row_type
    The type implementing a matrix row.
    Definition matrix.hh:574
    \n-
    Base class of all aggregation criterions.
    Definition aggregates.hh:49
    \n-
    Dependency policy for symmetric matrices.
    Definition aggregates.hh:134
    \n-
    Dependency policy for symmetric matrices.
    Definition aggregates.hh:253
    \n-
    Dependency policy for symmetric matrices.
    Definition aggregates.hh:314
    \n-
    Norm that uses only the [N][N] entry of the block to determine couplings.
    Definition aggregates.hh:379
    \n-
    Norm that uses only the [0][0] entry of the block to determine couplings.
    Definition aggregates.hh:455
    \n-
    Functor using the row sum (infinity) norm to determine strong couplings.
    Definition aggregates.hh:463
    \n-
    Definition aggregates.hh:480
    \n-
    Definition aggregates.hh:496
    \n-
    Criterion taking advantage of symmetric matrices.
    Definition aggregates.hh:519
    \n-
    Criterion suitable for unsymmetric matrices.
    Definition aggregates.hh:539
    \n-
    Class for building the aggregates.
    Definition aggregates.hh:909
    \n-
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n-
    A Dummy visitor that does nothing for each visited edge.
    Definition aggregates.hh:598
    \n-
    A class for temporarily storing the vertices of an aggregate in.
    Definition aggregates.hh:778
    \n-
    M::size_type VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:73
    \n-
    EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator
    The constant edge iterator type.
    Definition graph.hh:298
    \n-
    Iterator over all edges starting from a vertex.
    Definition graph.hh:95
    \n-
    The vertex iterator type of the graph.
    Definition graph.hh:209
    \n-
    All parameters for AMG.
    Definition parameters.hh:416
    \n+
    FieldTraits< field_type >::real_type frobenius_norm() const
    frobenius norm: sqrt(sum over squared values of entries)
    Definition matrix.hh:970
    \n+
    void usmtv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^T x
    Definition matrix.hh:901
    \n+
    void umhv(const X &x, Y &y) const
    y += A^H x
    Definition matrix.hh:918
    \n+
    size_type N() const
    Return the number of rows.
    Definition matrix.hh:691
    \n+
    ConstRowIterator beforeBegin() const
    Definition matrix.hh:656
    \n+
    Matrix(size_type rows, size_type cols)
    Create uninitialized matrix of size rows x cols.
    Definition matrix.hh:597
    \n+
    MatrixImp::DenseMatrixBase< T, A >::Iterator RowIterator
    Iterator over the matrix rows.
    Definition matrix.hh:580
    \n+
    typename Matrix< T, A >::field_type field_type
    Definition matrix.hh:1090
    \n+
    typename FieldTraits< field_type >::real_type real_type
    Definition matrix.hh:1091
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,2654 +1,1371 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-aggregates.hh\n+matrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_AGGREGATES_HH\n-6#define DUNE_AMG_AGGREGATES_HH\n+5#ifndef DUNE_ISTL_MATRIX_HH\n+6#define DUNE_ISTL_MATRIX_HH\n 7\n-8\n-9#include \"_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\bh_\bh\"\n-10#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n-11#include \"_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b._\bh_\bh\"\n-12#include \"_\bc_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bf_\bu_\bn_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-13\n-14#include \n-15#include \n-16#include \n-17#include \n-18#include \n-19#include \n-20\n-21#include \n-22#include \n-23#include \n-24#include \n-25#include \n-26#include \n-27#include \n-28\n-29namespace _\bD_\bu_\bn_\be\n-30{\n-31 namespace Amg\n-32 {\n-33\n-47 template\n-_\b4_\b8 class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn : public T\n-49 {\n-50\n-51 public:\n-_\b5_\b5 typedef T _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\bo_\bl_\bi_\bc_\by;\n-56\n-_\b6_\b6 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn()\n-67 : T()\n-68 {}\n-69\n-_\b7_\b0 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n-71 : T(parms)\n-72 {}\n-_\b8_\b2 void _\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bI_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc(std::size_t dim, std::size_t diameter=2)\n+12#include \n+13#include \n+14\n+15#include \n+16#include \n+17#include \n+18#include \n+19\n+20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+22#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+23\n+24namespace _\bD_\bu_\bn_\be {\n+25\n+_\b2_\b6namespace MatrixImp\n+27{\n+39 template >\n+_\b4_\b0 class _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be : public Imp::block_vector_unmanaged\n+41 // this derivation gives us all the blas level 1 and norms\n+42 // on the large array. However, access operators have to be\n+43 // overwritten.\n+44 {\n+45 public:\n+46\n+47 //===== type definitions and constants\n+48\n+_\b5_\b0 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n+51\n+_\b5_\b3 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n+54\n+_\b5_\b6 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+57\n+_\b6_\b3 typedef _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bB_\b,_\bA_\b> _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+64\n+_\b6_\b7 typedef _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bB_\b,_\bA_\b> _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+68\n+69 // just a shorthand\n+_\b7_\b0 typedef Imp::BlockVectorWindow _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be;\n+71\n+_\b7_\b2 typedef _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+73\n+_\b7_\b4 typedef const _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+75\n+76\n+77 //===== constructors and such\n+78\n+_\b8_\b2 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be () : Imp::block_vector_unmanaged()\n 83 {\n-84 this->setMaxDistance(diameter-1);\n-85 std::size_t csize=1;\n-86\n-87 for(; dim>0; dim--) {\n-88 csize*=diameter;\n-89 this->setMaxDistance(this->maxDistance()+diameter-1);\n-90 }\n-91 this->setMinAggregateSize(csize);\n-92 this->setMaxAggregateSize(static_cast(csize*1.5));\n-93 }\n-94\n-_\b1_\b0_\b5 void _\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bA_\bn_\bi_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc(std::size_t dim,std::size_t diameter=2)\n+84 // nothing is known ...\n+85 rows_ = 0;\n+86 columns_ = 0;\n+87 }\n+88\n+_\b9_\b5 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns) : Imp::\n+block_vector_unmanaged()\n+96 {\n+97 // and we can allocate the big array in the base class\n+98 this->n = rows*columns;\n+99 columns_ = columns;\n+100 if (this->n>0)\n+101 {\n+102 this->p = allocator_.allocate(this->n);\n+103 new (this->p)B[this->n];\n+104 }\n+105 else\n 106 {\n-107 _\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bI_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc(dim, diameter);\n-108 this->setMaxDistance(this->maxDistance()+dim-1);\n+107 this->n = 0;\n+108 this->p = 0;\n 109 }\n-110 };\n-111\n-112 template\n-_\b1_\b1_\b3 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\bT_\b>&\n-criterion)\n-114 {\n-115 os<<\"{ maxdistance=\"<\n-_\b1_\b3_\b3 class _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by : public _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-134 {\n-135 public:\n-_\b1_\b3_\b9 typedef M _\bM_\ba_\bt_\br_\bi_\bx;\n+110\n+111 // we can allocate the windows now\n+112 rows_ = rows;\n+113 }\n+114\n+_\b1_\b1_\b6 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be& a)\n+117 {\n+118 // allocate the big array in the base class\n+119 this->n = a.n;\n+120 columns_ = a.columns_;\n+121 if (this->n>0)\n+122 {\n+123 // allocate and construct objects\n+124 this->p = allocator_.allocate(this->n);\n+125 new (this->p)B[this->n];\n+126\n+127 // copy data\n+128 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; in; i++)\n+129 this->p[i]=a.p[i];\n+130 }\n+131 else\n+132 {\n+133 this->n = 0;\n+134 this->p = nullptr;\n+135 }\n+136\n+137 // we can allocate the windows now\n+138 rows_ = a.rows_;\n+139 }\n 140\n-_\b1_\b4_\b4 typedef N _\bN_\bo_\br_\bm;\n-145\n-_\b1_\b4_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bR_\bo_\bw;\n-150\n-_\b1_\b5_\b4 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bl_\bI_\bt_\be_\br;\n-155\n-156 void _\bi_\bn_\bi_\bt(const _\bM_\ba_\bt_\br_\bi_\bx* matrix);\n-157\n-158 void _\bi_\bn_\bi_\bt_\bR_\bo_\bw(const _\bR_\bo_\bw& row, int index);\n-159\n-160 void _\be_\bx_\ba_\bm_\bi_\bn_\be(const _\bC_\bo_\bl_\bI_\bt_\be_\br& _\bc_\bo_\bl);\n-161\n-162 template\n-163 void _\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph, const typename G::EdgeIterator& edge, const _\bC_\bo_\bl_\bI_\bt_\be_\br&\n-_\bc_\bo_\bl);\n-164\n-165 bool _\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd();\n-166\n-167\n-_\b1_\b6_\b8 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n-169 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(parms)\n-170 {}\n-_\b1_\b7_\b1 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by()\n-172 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs()\n-173 {}\n-174\n-175 protected:\n-_\b1_\b7_\b7 const _\bM_\ba_\bt_\br_\bi_\bx* _\bm_\ba_\bt_\br_\bi_\bx_\b_;\n-_\b1_\b7_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b1_\b8_\b0 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-_\b1_\b8_\b1 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_;\n-_\b1_\b8_\b3 _\bN_\bo_\br_\bm _\bn_\bo_\br_\bm_\b_;\n-_\b1_\b8_\b5 int _\br_\bo_\bw_\b_;\n-_\b1_\b8_\b7 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_;\n-_\b1_\b8_\b8 std::vector _\bv_\ba_\bl_\bs_\b_;\n-_\b1_\b8_\b9 typename std::vector::iterator _\bv_\ba_\bl_\bI_\bt_\be_\br_\b_;\n-190\n-191 };\n-192\n-193\n-194 template\n-_\b1_\b9_\b5 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt(const _\bM_\ba_\bt_\br_\bi_\bx* matrix)\n-196 {\n-197 matrix_ = matrix;\n-198 }\n-199\n-200 template\n-_\b2_\b0_\b1 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw(const _\bR_\bo_\bw& row, int\n-index)\n+_\b1_\b4_\b2 _\b~_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be ()\n+143 {\n+144 if (this->n>0) {\n+145 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=this->n;\n+146 while (i)\n+147 this->p[--i].~B();\n+148 allocator_.deallocate(this->p,this->n);\n+149 }\n+150 }\n+151\n+_\b1_\b5_\b3 void _\br_\be_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns)\n+154 {\n+155 // deconstruct objects and deallocate memory if necessary\n+156 if (this->n>0) {\n+157 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=this->n;\n+158 while (i)\n+159 this->p[--i].~B();\n+160 allocator_.deallocate(this->p,this->n);\n+161 }\n+162\n+163 // and we can allocate the big array in the base class\n+164 this->n = rows*columns;\n+165 if (this->n>0)\n+166 {\n+167 this->p = allocator_.allocate(this->n);\n+168 new (this->p)B[this->n];\n+169 }\n+170 else\n+171 {\n+172 this->n = 0;\n+173 this->p = nullptr;\n+174 }\n+175\n+176 // we can allocate the windows now\n+177 rows_ = rows;\n+178 columns_ = columns;\n+179 }\n+180\n+_\b1_\b8_\b2 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be& a)\n+183 {\n+184 if (&a!=this) // check if this and a are different objects\n+185 {\n+186 columns_ = a.columns_;\n+187 // reallocate arrays if necessary\n+188 // Note: still the block sizes may vary !\n+189 if (this->n!=a.n || rows_!=a.rows_)\n+190 {\n+191 // deconstruct objects and deallocate memory if necessary\n+192 if (this->n>0) {\n+193 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=this->n;\n+194 while (i)\n+195 this->p[--i].~B();\n+196 allocator_.deallocate(this->p,this->n);\n+197 }\n+198\n+199 // allocate the big array in the base class\n+200 this->n = a.n;\n+201 if (this->n>0)\n 202 {\n-203 using std::min;\n-204 vals_.assign(row.size(), 0.0);\n-205 assert(vals_.size()==row.size());\n-206 valIter_=vals_.begin();\n-207\n-208 maxValue_ = min(- std::numeric_limits::max(), std::\n-numeric_limits::min());\n-209 diagonal_=norm_(row[index]);\n-210 row_ = index;\n+203 // allocate and construct objects\n+204 this->p = allocator_.allocate(this->n);\n+205 new (this->p)B[this->n];\n+206 }\n+207 else\n+208 {\n+209 this->n = 0;\n+210 this->p = nullptr;\n 211 }\n 212\n-213 template\n-_\b2_\b1_\b4 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(const _\bC_\bo_\bl_\bI_\bt_\be_\br& _\bc_\bo_\bl)\n-215 {\n-216 using std::max;\n-217 // skip positive offdiagonals if norm preserves sign of them.\n-218 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be eij = norm_(*_\bc_\bo_\bl);\n-219 if(!N::is_sign_preserving || eij<0) // || eji<0)\n-220 {\n-221 *valIter_ = eij/diagonal_*eij/norm_(matrix_->operator[](_\bc_\bo_\bl.index())\n-[_\bc_\bo_\bl.index()]);\n-222 maxValue_ = max(maxValue_, *valIter_);\n-223 }else\n-224 *valIter_ =0;\n-225 ++valIter_;\n-226 }\n+213 // Copy number of rows\n+214 rows_ = a.rows_;\n+215 }\n+216\n+217 // and copy the data\n+218 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; in; i++)\n+219 this->p[i]=a.p[i];\n+220 }\n+221\n+222 return *this;\n+223 }\n+224\n+225\n+226 //===== assignment from scalar\n 227\n-228 template\n-229 template\n-_\b2_\b3_\b0 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(G&, const typename G::\n-EdgeIterator& edge, const _\bC_\bo_\bl_\bI_\bt_\be_\br&)\n-231 {\n-232 if(*valIter_ > alpha() * maxValue_) {\n-233 edge.properties().setDepends();\n-234 edge.properties().setInfluences();\n-235 }\n-236 ++valIter_;\n-237 }\n-238\n-239 template\n-_\b2_\b4_\b0 inline bool _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd()\n-241 {\n-242 if(diagonal_==0)\n-243 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"No diagonal entry for row \"<\n-_\b2_\b5_\b2 class _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by : public _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-253 {\n-254 public:\n-_\b2_\b5_\b8 typedef M _\bM_\ba_\bt_\br_\bi_\bx;\n-259\n-_\b2_\b6_\b3 typedef N _\bN_\bo_\br_\bm;\n-264\n-_\b2_\b6_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bR_\bo_\bw;\n-269\n-_\b2_\b7_\b3 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bl_\bI_\bt_\be_\br;\n+_\b2_\b2_\b9 _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n+230 {\n+231 (static_cast&>(*this)) = k;\n+232 return *this;\n+233 }\n+234\n+235\n+236 //===== access to components\n+237 // has to be overwritten from base class because it must\n+238 // return access to the windows\n+239\n+_\b2_\b4_\b1 _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+242 {\n+243#ifdef DUNE_ISTL_WITH_CHECKING\n+244 if (i>=rows_) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n+245#endif\n+246 return _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be(this->p + i*columns_, columns_);\n+247 }\n+248\n+_\b2_\b5_\b0 _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+251 {\n+252#ifdef DUNE_ISTL_WITH_CHECKING\n+253 if (i<0 || i>=rows_) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n+254#endif\n+255 return _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be(this->p + i*columns_, columns_);\n+256 }\n+257\n+258 // forward declaration\n+259 class ConstIterator;\n+260\n+_\b2_\b6_\b2 class _\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+263 {\n+264 public:\n+_\b2_\b6_\b6 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br ()\n+267 : window_(nullptr,0)\n+268 {\n+269 i = 0;\n+270 }\n+271\n+_\b2_\b7_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br (_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) = default;\n+_\b2_\b7_\b3 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br (_\bI_\bt_\be_\br_\ba_\bt_\bo_\br&& other) = default;\n 274\n-_\b2_\b7_\b5 void _\bi_\bn_\bi_\bt(const _\bM_\ba_\bt_\br_\bi_\bx* matrix);\n-276\n-_\b2_\b7_\b7 void _\bi_\bn_\bi_\bt_\bR_\bo_\bw(const _\bR_\bo_\bw& row, int index);\n-278\n-_\b2_\b7_\b9 void _\be_\bx_\ba_\bm_\bi_\bn_\be(const _\bC_\bo_\bl_\bI_\bt_\be_\br& _\bc_\bo_\bl);\n+_\b2_\b7_\b6 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br (B* data, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _i)\n+277 : i(_i),\n+278 window_(data + _i*columns, columns)\n+279 {}\n 280\n-281 template\n-_\b2_\b8_\b2 void _\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph, const typename G::EdgeIterator& edge, const _\bC_\bo_\bl_\bI_\bt_\be_\br&\n-_\bc_\bo_\bl);\n-283\n-_\b2_\b8_\b4 bool _\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd();\n-285\n-_\b2_\b8_\b6 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n-287 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(parms)\n-288 {}\n+_\b2_\b8_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bI_\bt_\be_\br_\ba_\bt_\bo_\br&& other)\n+283 {\n+284 i = other.i;\n+285 // Do NOT use window_.operator=, because that copies the window content,\n+not just the window!\n+286 window_.set(other.window_.getsize(),other.window_.getptr());\n+287 return *this;\n+288 }\n 289\n-_\b2_\b9_\b0 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by()\n-291 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs()\n-292 {}\n-293\n-294 protected:\n-_\b2_\b9_\b6 const _\bM_\ba_\bt_\br_\bi_\bx* _\bm_\ba_\bt_\br_\bi_\bx_\b_;\n-_\b2_\b9_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b2_\b9_\b9 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-_\b3_\b0_\b0 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_;\n-_\b3_\b0_\b2 _\bN_\bo_\br_\bm _\bn_\bo_\br_\bm_\b_;\n-_\b3_\b0_\b4 int _\br_\bo_\bw_\b_;\n-_\b3_\b0_\b6 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_;\n-307 };\n-308\n-312 template\n-_\b3_\b1_\b3 class _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by : public _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-314 {\n-315 public:\n-_\b3_\b1_\b9 typedef M _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b2_\b9_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other)\n+292 {\n+293 i = other.i;\n+294 // Do NOT use window_.operator=, because that copies the window content,\n+not just the window!\n+295 window_.set(other.window_.getsize(),other.window_.getptr());\n+296 return *this;\n+297 }\n+298\n+_\b3_\b0_\b0 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+301 {\n+302 ++i;\n+303 window_.setptr(window_.getptr()+window_.getsize());\n+304 return *this;\n+305 }\n+306\n+_\b3_\b0_\b8 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-()\n+309 {\n+310 --i;\n+311 window_.setptr(window_.getptr()-window_.getsize());\n+312 return *this;\n+313 }\n+314\n+_\b3_\b1_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+317 {\n+318 return window_.getptr() == it.window_.getptr();\n+319 }\n 320\n-_\b3_\b2_\b4 typedef N _\bN_\bo_\br_\bm;\n-325\n-_\b3_\b2_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bR_\bo_\bw;\n-330\n-_\b3_\b3_\b4 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bl_\bI_\bt_\be_\br;\n-335\n-_\b3_\b3_\b6 void _\bi_\bn_\bi_\bt(const _\bM_\ba_\bt_\br_\bi_\bx* matrix);\n-337\n-_\b3_\b3_\b8 void _\bi_\bn_\bi_\bt_\bR_\bo_\bw(const _\bR_\bo_\bw& row, int index);\n-339\n-_\b3_\b4_\b0 void _\be_\bx_\ba_\bm_\bi_\bn_\be(const _\bC_\bo_\bl_\bI_\bt_\be_\br& _\bc_\bo_\bl);\n-341\n-342 template\n-_\b3_\b4_\b3 void _\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph, const typename G::EdgeIterator& edge, const _\bC_\bo_\bl_\bI_\bt_\be_\br&\n-_\bc_\bo_\bl);\n+_\b3_\b2_\b2 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+323 {\n+324 return window_.getptr() != it.window_.getptr();\n+325 }\n+326\n+_\b3_\b2_\b8 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+329 {\n+330 return window_.getptr() == it.window_.getptr();\n+331 }\n+332\n+_\b3_\b3_\b4 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+335 {\n+336 return window_.getptr() != it.window_.getptr();\n+337 }\n+338\n+_\b3_\b4_\b0 _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b () const\n+341 {\n+342 return window_;\n+343 }\n 344\n-_\b3_\b4_\b5 bool _\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd();\n-346\n-347\n-_\b3_\b4_\b8 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n-349 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(parms)\n-350 {}\n-_\b3_\b5_\b1 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by()\n-352 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs()\n-353 {}\n-354\n-355 protected:\n-_\b3_\b5_\b7 const _\bM_\ba_\bt_\br_\bi_\bx* _\bm_\ba_\bt_\br_\bi_\bx_\b_;\n-_\b3_\b5_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b3_\b6_\b0 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-_\b3_\b6_\b1 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_;\n-_\b3_\b6_\b3 _\bN_\bo_\br_\bm _\bn_\bo_\br_\bm_\b_;\n-_\b3_\b6_\b5 int _\br_\bo_\bw_\b_;\n-_\b3_\b6_\b7 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_;\n-368 private:\n-369 void _\bi_\bn_\bi_\bt_\bR_\bo_\bw(const _\bR_\bo_\bw& row, int index, const std::true_type&);\n-370 void _\bi_\bn_\bi_\bt_\bR_\bo_\bw(const _\bR_\bo_\bw& row, int index, const std::false_type&);\n-371 };\n-372\n-377 template\n-_\b3_\b7_\b8 class _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+_\b3_\b4_\b6 _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>_\b () const\n+347 {\n+348 return &window_;\n+349 }\n+350\n+351 // return index corresponding to pointer\n+_\b3_\b5_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bi_\bn_\bd_\be_\bx () const\n+353 {\n+354 return i;\n+355 }\n+356\n+_\b3_\b5_\b7 friend class _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+358\n+359 private:\n+360 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i;\n+361 mutable _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be window_;\n+362 };\n+363\n+_\b3_\b6_\b5 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n+366 {\n+367 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, 0);\n+368 }\n+369\n+_\b3_\b7_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n+372 {\n+373 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, rows_);\n+374 }\n+375\n+_\b3_\b7_\b8 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n 379 {\n-380 public:\n-381 enum { /* @brief We preserve the sign.*/\n-382 _\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg = true\n-_\b3_\b8_\b3 };\n-384\n-389 template\n-_\b3_\b9_\b0 typename FieldTraits::real_type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const M&\n-m,\n-391 [[maybe_unused]] typename std::enable_if_t::value>*\n-sfinae = nullptr) const\n+380 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, rows_-1);\n+381 }\n+382\n+_\b3_\b8_\b5 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n+386 {\n+387 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, -1);\n+388 }\n+389\n+_\b3_\b9_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n 392 {\n-393 typedef typename M::field_type field_type;\n-394 typedef typename FieldTraits::real_type real_type;\n-395 static_assert( std::is_convertible::value,\n-396 \"use of diagonal norm in AMG not implemented for complex field_type\");\n-397 return m[N][N];\n-398 // possible implementation for complex types: return signed_abs(m[N][N]);\n-399 }\n-400\n-405 template\n-_\b4_\b0_\b6 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const M& m,\n-407 typename std::enable_if_t::value>* sfinae = nullptr)\n-const\n-408 {\n-409 typedef typename FieldTraits::real_type real_type;\n-410 static_assert( std::is_convertible::value,\n-411 \"use of diagonal norm in AMG not implemented for complex field_type\");\n-412 return m;\n-413 // possible implementation for complex types: return signed_abs(m[N][N]);\n-414 }\n-415\n-416 private:\n-417\n-419 template\n-420 static T signed_abs(const T & v)\n-421 {\n-422 return v;\n-423 }\n-424\n-426 template\n-427 static T signed_abs(const std::complex & v)\n-428 {\n-429 // return sign * abs_value\n-430 // in case of complex numbers this extends to using the csgn function to\n-determine the sign\n-431 return csgn(v) * std::abs(v);\n-432 }\n-433\n-435 template\n-436 static T csgn(const T & v)\n-437 {\n-438 return (T(0) < v) - (v < T(0));\n-439 }\n-440\n-442 template\n-443 static T csgn(std::complex a)\n-444 {\n-445 return csgn(a.real())+(a.real() == 0.0)*csgn(a.imag());\n+393 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, std::min(i,rows_));\n+394 }\n+395\n+_\b3_\b9_\b7 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+398 {\n+399 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, std::min(i,rows_));\n+400 }\n+401\n+_\b4_\b0_\b3 class _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+404 {\n+405 public:\n+_\b4_\b0_\b7 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ()\n+408 : window_(nullptr,0)\n+409 {\n+410 i = 0;\n+411 }\n+412\n+_\b4_\b1_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br (const B* data, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _i)\n+415 : i(_i),\n+416 window_(const_cast(data + _i * columns), columns)\n+417 {}\n+418\n+_\b4_\b2_\b0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br (const _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it)\n+421 : i(it.i), window_(it.window_.getptr(),it.window_.getsize())\n+422 {}\n+423\n+_\b4_\b2_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bI_\bt_\be_\br_\ba_\bt_\bo_\br&& other)\n+425 {\n+426 i = other.i;\n+427 // Do NOT use window_.operator=, because that copies the window content,\n+not just the window!\n+428 window_.set(other.window_.getsize(),other.window_.getptr());\n+429 return *this;\n+430 }\n+431\n+_\b4_\b3_\b2 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other)\n+433 {\n+434 i = other.i;\n+435 // Do NOT use window_.operator=, because that copies the window content,\n+not just the window!\n+436 window_.set(other.window_.getsize(),other.window_.getptr());\n+437 return *this;\n+438 }\n+439\n+_\b4_\b4_\b1 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+442 {\n+443 ++i;\n+444 window_.setptr(window_.getptr()+window_.getsize());\n+445 return *this;\n 446 }\n 447\n-448 };\n-449\n-_\b4_\b5_\b4 class _\bF_\bi_\br_\bs_\bt_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl : public _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl<0>\n-455 {};\n-456\n-_\b4_\b6_\b2 struct _\bR_\bo_\bw_\bS_\bu_\bm\n-463 {\n-464\n-465 enum { /* @brief We preserve the sign.*/\n-466 _\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg = false\n-_\b4_\b6_\b7 };\n-472 template\n-_\b4_\b7_\b3 typename FieldTraits::real_type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const M&\n-m) const\n-474 {\n-475 return m.infinity_norm();\n-476 }\n-477 };\n-478\n-_\b4_\b7_\b9 struct _\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm\n-480 {\n-481\n-482 enum { /* @brief We preserve the sign.*/\n-483 _\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg = false\n-_\b4_\b8_\b4 };\n-489 template\n-_\b4_\b9_\b0 typename FieldTraits::real_type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const M&\n-m) const\n-491 {\n-492 return m.frobenius_norm();\n-493 }\n-494 };\n-_\b4_\b9_\b5 struct _\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm\n-496 {\n+_\b4_\b4_\b9 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-()\n+450 {\n+451 --i;\n+452 window_.setptr(window_.getptr()-window_.getsize());\n+453 return *this;\n+454 }\n+455\n+_\b4_\b5_\b7 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+458 {\n+459 return window_.getptr() == it.window_.getptr();\n+460 }\n+461\n+_\b4_\b6_\b3 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+464 {\n+465 return window_.getptr() != it.window_.getptr();\n+466 }\n+467\n+_\b4_\b6_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+470 {\n+471 return window_.getptr() == it.window_.getptr();\n+472 }\n+473\n+_\b4_\b7_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+476 {\n+477 return window_.getptr() != it.window_.getptr();\n+478 }\n+479\n+_\b4_\b8_\b1 const _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b () const\n+482 {\n+483 return window_;\n+484 }\n+485\n+_\b4_\b8_\b7 const _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>_\b () const\n+488 {\n+489 return &window_;\n+490 }\n+491\n+492 // return index corresponding to pointer\n+_\b4_\b9_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bi_\bn_\bd_\be_\bx () const\n+494 {\n+495 return i;\n+496 }\n 497\n-498 enum { /* @brief We preserve the sign.*/\n-499 _\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg = false\n-_\b5_\b0_\b0 };\n-505 template\n-_\b5_\b0_\b6 typename FieldTraits::real_type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const M&\n-m) const\n-507 {\n-508 return 1;\n-509 }\n-510 };\n-517 template\n-_\b5_\b1_\b8 class _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn : public\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn >\n+_\b4_\b9_\b8 friend class _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+499\n+500 private:\n+501 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i;\n+502 mutable _\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be window_;\n+503 };\n+504\n+_\b5_\b0_\b6 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br = _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+507\n+_\b5_\b0_\b9 using _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br = _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+510\n+_\b5_\b1_\b2 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n+513 {\n+514 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, 0);\n+515 }\n+516\n+_\b5_\b1_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n 519 {\n-520 public:\n-_\b5_\b2_\b1 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n-522 : _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn<_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by >(parms)\n-523 {}\n-_\b5_\b2_\b4 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn()\n-525 {}\n-526 };\n-527\n-528\n-537 template\n-_\b5_\b3_\b8 class _\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn : public _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n->\n-539 {\n-540 public:\n-_\b5_\b4_\b1 _\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n-542 : _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn<_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by >(parms)\n-543 {}\n-_\b5_\b4_\b4 _\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn()\n-545 {}\n-546 };\n-547 // forward declaration\n-548 template class Aggregator;\n-549\n-550\n-558 template\n-_\b5_\b5_\b9 class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-560 {\n-561 public:\n-562\n-_\b5_\b6_\b6 static const V _\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD;\n-567\n-_\b5_\b7_\b1 static const V _\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD;\n-_\b5_\b7_\b5 typedef V _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-576\n-_\b5_\b8_\b0 typedef V _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+520 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, rows_);\n+521 }\n+522\n+_\b5_\b2_\b5 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd() const\n+526 {\n+527 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, rows_-1);\n+528 }\n+529\n+_\b5_\b3_\b1 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\be_\bn_\bd () const\n+532 {\n+533 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(this->p, columns_, -1);\n+534 }\n+535\n+536 //===== sizes\n+537\n+_\b5_\b3_\b9 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN () const\n+540 {\n+541 return rows_;\n+542 }\n+543\n+544\n+545 private:\n+546 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows_; // number of matrix rows\n+547 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be columns_; // number of matrix columns\n+548\n+549 A allocator_;\n+550 };\n+551\n+552} // namespace MatrixImp\n+553\n+559 template >\n+_\b5_\b6_\b0 class _\bM_\ba_\bt_\br_\bi_\bx\n+561 {\n+562 public:\n+563\n+_\b5_\b6_\b5 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n+566\n+_\b5_\b6_\b8 typedef T _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+569\n+_\b5_\b7_\b1 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n+572\n+_\b5_\b7_\b4 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n+575\n+_\b5_\b7_\b7 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+578\n+_\b5_\b8_\b0 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n 581\n-_\b5_\b8_\b6 typedef PoolAllocator _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n+_\b5_\b8_\b3 typedef typename row_type::iterator _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+584\n+_\b5_\b8_\b6 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n 587\n-_\b5_\b9_\b2 typedef SLList _\bV_\be_\br_\bt_\be_\bx_\bL_\bi_\bs_\bt;\n-593\n-_\b5_\b9_\b7 class _\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-598 {\n-599 public:\n-600 template\n-_\b6_\b0_\b1 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)([[maybe_unused]] const EdgeIterator& edge) const\n-602 {}\n-603 };\n-604\n-605\n-_\b6_\b0_\b9 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp();\n-610\n-_\b6_\b1_\b6 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs);\n-617\n-_\b6_\b2_\b1 _\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp();\n-622\n-634 template\n-_\b6_\b3_\b5 std::tuple _\bb_\bu_\bi_\bl_\bd_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs(const M& matrix, G& graph,\n-const C& criterion,\n-636 bool finestLevel);\n-637\n-655 template\n-_\b6_\b5_\b6 std::size_t _\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& start,\n-657 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-658 const G& graph,\n-659 F& aggregateVisitor,\n-660 VM& visitedMap) const;\n-661\n-685 template\n-_\b6_\b8_\b6 std::size_t _\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& start,\n-687 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-688 const G& graph, L& visited, F1& aggregateVisitor,\n-689 F2& nonAggregateVisitor,\n-690 VM& visitedMap) const;\n-691\n-_\b6_\b9_\b7 void _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs);\n-698\n-_\b7_\b0_\b2 std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const;\n-703\n-_\b7_\b0_\b7 void _\bf_\br_\be_\be();\n-708\n-_\b7_\b1_\b4 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& v);\n-715\n-_\b7_\b2_\b1 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& v) const;\n-722\n-_\b7_\b2_\b3 typedef const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-724\n-_\b7_\b2_\b5 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const\n-726 {\n-727 return aggregates_;\n-728 }\n-729\n-_\b7_\b3_\b0 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const\n-731 {\n-732 return aggregates_+_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs();\n-733 }\n-734\n-_\b7_\b3_\b5 typedef _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-736\n-_\b7_\b3_\b7 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn()\n-738 {\n-739 return aggregates_;\n-740 }\n-741\n-_\b7_\b4_\b2 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd()\n-743 {\n-744 return aggregates_+_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs();\n-745 }\n-746 private:\n-748 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>&) = delete;\n-750 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>& operator=(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>&) = delete;\n-751\n-755 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* aggregates_;\n-756\n-760 std::size_t noVertices_;\n-761 };\n-762\n-766 template\n-_\b7_\b6_\b7 void _\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(G& graph,\n-768 const typename C::Matrix& matrix,\n-769 C criterion,\n-770 bool finestLevel);\n-771\n-776 template\n-_\b7_\b7_\b7 class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n-778 {\n-779\n-780 public:\n+_\b5_\b8_\b9 typedef typename row_type::const_iterator _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+590\n+_\b5_\b9_\b2 _\bM_\ba_\bt_\br_\bi_\bx() : _\bd_\ba_\bt_\ba_\b_(0,0), _\bc_\bo_\bl_\bs_\b_(0)\n+593 {}\n+594\n+_\b5_\b9_\b7 _\bM_\ba_\bt_\br_\bi_\bx(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be cols) : _\bd_\ba_\bt_\ba_\b_(rows,cols), _\bc_\bo_\bl_\bs_\b_(cols)\n+598 {}\n+599\n+_\b6_\b0_\b4 void _\bs_\be_\bt_\bS_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be cols) {\n+605 _\bd_\ba_\bt_\ba_\b_.resize(rows,cols);\n+606 _\bc_\bo_\bl_\bs_\b_ = cols;\n+607 }\n+608\n+_\b6_\b1_\b0 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn()\n+611 {\n+612 return _\bd_\ba_\bt_\ba_\b_.begin();\n+613 }\n+614\n+_\b6_\b1_\b6 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd()\n+617 {\n+618 return _\bd_\ba_\bt_\ba_\b_.end();\n+619 }\n+620\n+_\b6_\b2_\b3 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n+624 {\n+625 return _\bd_\ba_\bt_\ba_\b_.beforeEnd();\n+626 }\n+627\n+_\b6_\b3_\b0 _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n+631 {\n+632 return _\bd_\ba_\bt_\ba_\b_.beforeBegin();\n+633 }\n+634\n+_\b6_\b3_\b6 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const\n+637 {\n+638 return _\bd_\ba_\bt_\ba_\b_.begin();\n+639 }\n+640\n+_\b6_\b4_\b2 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const\n+643 {\n+644 return _\bd_\ba_\bt_\ba_\b_.end();\n+645 }\n+646\n+_\b6_\b4_\b9 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd() const\n+650 {\n+651 return _\bd_\ba_\bt_\ba_\b_.beforeEnd();\n+652 }\n+653\n+_\b6_\b5_\b6 _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n+657 {\n+658 return _\bd_\ba_\bt_\ba_\b_.beforeBegin();\n+659 }\n+660\n+_\b6_\b6_\b2 _\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& t)\n+663 {\n+664 _\bd_\ba_\bt_\ba_\b_ = t;\n+665 return *this;\n+666 }\n+667\n+_\b6_\b6_\b9 _\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row) {\n+670#ifdef DUNE_ISTL_WITH_CHECKING\n+671 if (row<0)\n+672 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Can't access negative rows!\");\n+673 if (row>=_\bN())\n+674 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Row index out of range!\");\n+675#endif\n+676 return _\bd_\ba_\bt_\ba_\b_[row];\n+677 }\n+678\n+_\b6_\b8_\b0 const _\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row) const {\n+681#ifdef DUNE_ISTL_WITH_CHECKING\n+682 if (row<0)\n+683 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Can't access negative rows!\");\n+684 if (row>=_\bN())\n+685 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Row index out of range!\");\n+686#endif\n+687 return _\bd_\ba_\bt_\ba_\b_[row];\n+688 }\n+689\n+_\b6_\b9_\b1 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN() const {\n+692 return _\bd_\ba_\bt_\ba_\b_.N();\n+693 }\n+694\n+_\b6_\b9_\b6 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bM() const {\n+697 return _\bc_\bo_\bl_\bs_\b_;\n+698 }\n+699\n+_\b7_\b0_\b1 _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=(const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& scalar) {\n+702 _\bd_\ba_\bt_\ba_\b_ *= scalar;\n+703 return (*this);\n+704 }\n+705\n+_\b7_\b0_\b7 _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=(const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& scalar) {\n+708 _\bd_\ba_\bt_\ba_\b_ /= scalar;\n+709 return (*this);\n+710 }\n+711\n+_\b7_\b1_\b7 _\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bM_\ba_\bt_\br_\bi_\bx& b) {\n+718#ifdef DUNE_ISTL_WITH_CHECKING\n+719 if(_\bN()!=b._\bN() || _\bM() != b._\bM())\n+720 DUNE_THROW(RangeError, \"Matrix sizes do not match!\");\n+721#endif\n+722 _\bd_\ba_\bt_\ba_\b_ += b._\bd_\ba_\bt_\ba_\b_;\n+723 return (*this);\n+724 }\n+725\n+_\b7_\b3_\b1 _\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bM_\ba_\bt_\br_\bi_\bx& b) {\n+732#ifdef DUNE_ISTL_WITH_CHECKING\n+733 if(_\bN()!=b._\bN() || _\bM() != b._\bM())\n+734 DUNE_THROW(RangeError, \"Matrix sizes do not match!\");\n+735#endif\n+736 _\bd_\ba_\bt_\ba_\b_ -= b._\bd_\ba_\bt_\ba_\b_;\n+737 return (*this);\n+738 }\n+739\n+_\b7_\b4_\b1 _\bM_\ba_\bt_\br_\bi_\bx _\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be() const {\n+742 _\bM_\ba_\bt_\br_\bi_\bx out(_\bM(), _\bN());\n+743 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bN(); i++)\n+744 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bM(); j++)\n+745 out[j][i] = (*this)[i][j];\n+746\n+747 return out;\n+748 }\n+749\n+_\b7_\b5_\b1 friend _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b> _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*(const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& m1, const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& m2) {\n+752 _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b> out(m1._\bN(), m2._\bM());\n+753 out = 0;\n+754\n+755 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b7_\b6_\b6 friend Y _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*(const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& m, const X& vec) {\n+767#ifdef DUNE_ISTL_WITH_CHECKING\n+768 if (m._\bM()!=vec.size())\n+769 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Vector size doesn't match the number of matrix\n+columns!\");\n+770#endif\n+771 Y out(m._\bN());\n+772 out = 0;\n+773\n+774 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n-796\n-_\b8_\b0_\b1 typedef S _\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt;\n-802\n-_\b8_\b0_\b4 typedef typename VertexSet::const_iterator _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-805\n-_\b8_\b0_\b9 typedef std::size_t* _\bS_\bp_\bh_\be_\br_\be_\bM_\ba_\bp;\n-810\n-_\b8_\b1_\b9 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be(_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph, _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-820 _\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt& connectivity, std::vector& front_);\n-821\n-_\b8_\b2_\b2 void _\bi_\bn_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be()\n-823 {\n-824 --id_;\n-825 }\n-826\n-_\b8_\b3_\b3 void _\br_\be_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(const _\bV_\be_\br_\bt_\be_\bx& vertex);\n-834\n-_\b8_\b3_\b8 void _\bs_\be_\be_\bd(const _\bV_\be_\br_\bt_\be_\bx& vertex);\n-839\n-_\b8_\b4_\b3 void _\ba_\bd_\bd(const _\bV_\be_\br_\bt_\be_\bx& vertex);\n-844\n-_\b8_\b4_\b5 void _\ba_\bd_\bd(std::vector& vertex);\n-_\b8_\b4_\b9 void _\bc_\bl_\be_\ba_\br();\n-850\n-_\b8_\b5_\b4 typename VertexSet::size_type _\bs_\bi_\bz_\be();\n-_\b8_\b5_\b8 typename VertexSet::size_type _\bc_\bo_\bn_\bn_\be_\bc_\bt_\bS_\bi_\bz_\be();\n-859\n-_\b8_\b6_\b3 int _\bi_\bd();\n+783 template \n+_\b7_\b8_\b4 void _\bm_\bv(const X& x, Y& y) const\n+785 {\n+786#ifdef DUNE_ISTL_WITH_CHECKING\n+787 if (x.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+788 if (y.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+789#endif\n+790 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++) {\n+791 y[i]=0;\n+792 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n+793 {\n+794 auto&& xj = Impl::asVector(x[j]);\n+795 auto&& yi = Impl::asVector(y[i]);\n+796 Impl::asMatrix((*this)[i][j]).umv(xj, yi);\n+797 }\n+798 }\n+799 }\n+800\n+802 template\n+_\b8_\b0_\b3 void _\bm_\bt_\bv (const X& x, Y& y) const\n+804 {\n+805#ifdef DUNE_ISTL_WITH_CHECKING\n+806 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n+807 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n+808#endif\n+809 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b8_\b1_\b6 void _\bu_\bm_\bv(const X& x, Y& y) const\n+817 {\n+818#ifdef DUNE_ISTL_WITH_CHECKING\n+819 if (x.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+820 if (y.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+821#endif\n+822 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n+823 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n+824 {\n+825 auto&& xj = Impl::asVector(x[j]);\n+826 auto&& yi = Impl::asVector(y[i]);\n+827 Impl::asMatrix((*this)[i][j]).umv(xj, yi);\n+828 }\n+829 }\n+830\n+832 template\n+_\b8_\b3_\b3 void _\bm_\bm_\bv (const X& x, Y& y) const\n+834 {\n+835#ifdef DUNE_ISTL_WITH_CHECKING\n+836 if (x.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+837 if (y.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+838#endif\n+839 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n+840 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n+841 {\n+842 auto&& xj = Impl::asVector(x[j]);\n+843 auto&& yi = Impl::asVector(y[i]);\n+844 Impl::asMatrix((*this)[i][j]).mmv(xj, yi);\n+845 }\n+846 }\n+847\n+849 template \n+_\b8_\b5_\b0 void _\bu_\bs_\bm_\bv(const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const\n+851 {\n+852#ifdef DUNE_ISTL_WITH_CHECKING\n+853 if (x.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+854 if (y.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+855#endif\n+856 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n+857 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n+858 {\n+859 auto&& xj = Impl::asVector(x[j]);\n+860 auto&& yi = Impl::asVector(y[i]);\n+861 Impl::asMatrix((*this)[i][j]).usmv(alpha, xj, yi);\n+862 }\n+863 }\n 864\n-_\b8_\b6_\b6 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-867\n-_\b8_\b6_\b9 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-870\n-871 private:\n-875 _\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt vertices_;\n-876\n-881 int id_;\n-882\n-886 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph_;\n-887\n-891 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n-892\n-896 _\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt& connected_;\n-897\n-901 std::vector& front_;\n-902 };\n-903\n-907 template\n-_\b9_\b0_\b8 class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br\n+866 template\n+_\b8_\b6_\b7 void _\bu_\bm_\bt_\bv (const X& x, Y& y) const\n+868 {\n+869#ifdef DUNE_ISTL_WITH_CHECKING\n+870 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+871 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+872#endif\n+873 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n+874 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n+875 {\n+876 auto&& xi = Impl::asVector(x[i]);\n+877 auto&& yj = Impl::asVector(y[j]);\n+878 Impl::asMatrix((*this)[i][j]).umtv(xi, yj);\n+879 }\n+880 }\n+881\n+883 template\n+_\b8_\b8_\b4 void _\bm_\bm_\bt_\bv (const X& x, Y& y) const\n+885 {\n+886#ifdef DUNE_ISTL_WITH_CHECKING\n+887 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+888 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+889#endif\n+890 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n+891 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n+892 {\n+893 auto&& xi = Impl::asVector(x[i]);\n+894 auto&& yj = Impl::asVector(y[j]);\n+895 Impl::asMatrix((*this)[i][j]).mmtv(xi, yj);\n+896 }\n+897 }\n+898\n+900 template\n+_\b9_\b0_\b1 void _\bu_\bs_\bm_\bt_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const\n+902 {\n+903#ifdef DUNE_ISTL_WITH_CHECKING\n+904 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+905 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+906#endif\n+907 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n+908 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n 909 {\n-910 public:\n-911\n-_\b9_\b1_\b5 typedef G _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh;\n-916\n-_\b9_\b2_\b0 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bV_\be_\br_\bt_\be_\bx;\n-921\n-_\b9_\b2_\b3 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-924\n-_\b9_\b2_\b8 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br();\n-929\n-_\b9_\b3_\b3 _\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br();\n-934\n-951 template\n-_\b9_\b5_\b2 std::tuple _\bb_\bu_\bi_\bl_\bd(const M& m, G& graph,\n-953 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, const C& c,\n-954 bool finestLevel);\n-955 private:\n-960 typedef PoolAllocator Allocator;\n-961\n-965 typedef SLList VertexList;\n+910 auto&& xi = Impl::asVector(x[i]);\n+911 auto&& yj = Impl::asVector(y[j]);\n+912 Impl::asMatrix((*this)[i][j]).usmtv(alpha, xi, yj);\n+913 }\n+914 }\n+915\n+917 template\n+_\b9_\b1_\b8 void _\bu_\bm_\bh_\bv (const X& x, Y& y) const\n+919 {\n+920#ifdef DUNE_ISTL_WITH_CHECKING\n+921 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+922 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+923#endif\n+924 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n+925 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n+926 {\n+927 auto&& xi = Impl::asVector(x[i]);\n+928 auto&& yj = Impl::asVector(y[j]);\n+929 Impl::asMatrix((*this)[i][j]).umhv(xi,yj);\n+930 }\n+931 }\n+932\n+934 template\n+_\b9_\b3_\b5 void _\bm_\bm_\bh_\bv (const X& x, Y& y) const\n+936 {\n+937#ifdef DUNE_ISTL_WITH_CHECKING\n+938 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+939 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+940#endif\n+941 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n+942 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n+943 {\n+944 auto&& xi = Impl::asVector(x[i]);\n+945 auto&& yj = Impl::asVector(y[j]);\n+946 Impl::asMatrix((*this)[i][j]).mmhv(xi,yj);\n+947 }\n+948 }\n+949\n+951 template\n+_\b9_\b5_\b2 void _\bu_\bs_\bm_\bh_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const\n+953 {\n+954#ifdef DUNE_ISTL_WITH_CHECKING\n+955 if (x.N()!=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+956 if (y.N()!=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"vector/matrix size mismatch!\");\n+957#endif\n+958 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i<_\bd_\ba_\bt_\ba_\b_.N(); i++)\n+959 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j<_\bc_\bo_\bl_\bs_\b_; j++)\n+960 {\n+961 auto&& xi = Impl::asVector(x[i]);\n+962 auto&& yj = Impl::asVector(y[j]);\n+963 Impl::asMatrix((*this)[i][j]).usmhv(alpha,xi,yj);\n+964 }\n+965 }\n 966\n-970 typedef std::set,Allocator> VertexSet;\n-971\n-975 typedef std::size_t* SphereMap;\n-976\n-980 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh* graph_;\n-981\n-985 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b,_\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt_\b>* aggregate_;\n-986\n-990 std::vector front_;\n+967 //===== norms\n+968\n+_\b9_\b7_\b0 typename FieldTraits::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm () const\n+971 {\n+972 return std::sqrt(_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2());\n+973 }\n+974\n+_\b9_\b7_\b6 typename FieldTraits::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2 () const\n+977 {\n+978 typename FieldTraits::real_type sum=0;\n+979 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i_\bN(); i++)\n+980 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j_\bM(); j++)\n+981 sum += Impl::asMatrix(_\bd_\ba_\bt_\ba_\b_[i][j]).frobenius_norm2();\n+982 return sum;\n+983 }\n+984\n+986 template ::value, int>::type = 0>\n+_\b9_\b8_\b8 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n+989 using real_type = typename FieldTraits::real_type;\n+990 using std::max;\n 991\n-995 VertexSet connected_;\n-996\n-1000 int size_;\n-1001\n-1005 class Stack\n-1006 {\n-1007 public:\n-_\b1_\b0_\b0_\b8 static const _\bV_\be_\br_\bt_\be_\bx _\bN_\bu_\bl_\bl_\bE_\bn_\bt_\br_\by;\n-1009\n-_\b1_\b0_\b1_\b0 _\bS_\bt_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph,\n-1011 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>& aggregatesBuilder,\n-1012 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates);\n-_\b1_\b0_\b1_\b3 _\b~_\bS_\bt_\ba_\bc_\bk();\n-_\b1_\b0_\b1_\b4 _\bV_\be_\br_\bt_\be_\bx _\bp_\bo_\bp();\n-1015 private:\n-1016 enum { N = 1300000 };\n-1017\n-1019 const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph_;\n-1021 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>& aggregatesBuilder_;\n-1023 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n-1025 int size_;\n-1026 _\bV_\be_\br_\bt_\be_\bx maxSize_;\n-1028 typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br begin_;\n-1029 typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end_;\n-1030\n-1032 _\bV_\be_\br_\bt_\be_\bx* vals_;\n-1033\n-1034 };\n-1035\n-_\b1_\b0_\b3_\b6 friend class Stack;\n+992 real_type norm = 0;\n+993 for (auto const &x : *this) {\n+994 real_type sum = 0;\n+995 for (auto const &y : x)\n+996 sum += Impl::asMatrix(y).infinity_norm();\n+997 norm = max(sum, norm);\n+998 isNaN += sum;\n+999 }\n+1000\n+1001 return norm;\n+1002 }\n+1003\n+1005 template ::value, int>::type = 0>\n+_\b1_\b0_\b0_\b7 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n+1008 using real_type = typename FieldTraits::real_type;\n+1009 using std::max;\n+1010\n+1011 real_type norm = 0;\n+1012 for (auto const &x : *this) {\n+1013 real_type sum = 0;\n+1014 for (auto const &y : x)\n+1015 sum += Impl::asMatrix(y).infinity_norm_real();\n+1016 norm = max(sum, norm);\n+1017 }\n+1018 return norm;\n+1019 }\n+1020\n+1022 template ::value, int>::type = 0>\n+_\b1_\b0_\b2_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const {\n+1025 using real_type = typename FieldTraits::real_type;\n+1026 using std::max;\n+1027\n+1028 real_type norm = 0;\n+1029 real_type isNaN = 1;\n+1030 for (auto const &x : *this) {\n+1031 real_type sum = 0;\n+1032 for (auto const &y : x)\n+1033 sum += Impl::asMatrix(y).infinity_norm();\n+1034 norm = max(sum, norm);\n+1035 isNaN += sum;\n+1036 }\n 1037\n-1048 template\n-1049 void visitAggregateNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-1050 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-1051 V& visitor) const;\n-1052\n-1057 template\n-1058 class AggregateVisitor\n-1059 {\n-1060 public:\n-_\b1_\b0_\b6_\b4 typedef V _\bV_\bi_\bs_\bi_\bt_\bo_\br;\n-_\b1_\b0_\b7_\b2 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-1073 _\bV_\bi_\bs_\bi_\bt_\bo_\br& visitor);\n-1074\n-_\b1_\b0_\b8_\b1 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n-1082\n-1083 private:\n-1085 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n-1087 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br aggregate_;\n-1089 _\bV_\bi_\bs_\bi_\bt_\bo_\br* visitor_;\n-1090 };\n-1091\n-1095 class Counter\n-1096 {\n-1097 public:\n-_\b1_\b0_\b9_\b9 _\bC_\bo_\bu_\bn_\bt_\be_\br();\n-_\b1_\b1_\b0_\b1 int _\bv_\ba_\bl_\bu_\be();\n-1102\n-1103 protected:\n-_\b1_\b1_\b0_\b5 void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-_\b1_\b1_\b0_\b7 void _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt();\n-1108\n-1109 private:\n-1110 int count_;\n-1111 };\n-1112\n-1113\n-1118 class FrontNeighbourCounter : public Counter\n-1119 {\n-1120 public:\n-_\b1_\b1_\b2_\b5 _\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br(const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& front);\n-1126\n-_\b1_\b1_\b2_\b7 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n-1128\n-1129 private:\n-1130 const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph_;\n-1131 };\n-1132\n-1137 int noFrontNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex) const;\n-1138\n-1142 class TwoWayCounter : public Counter\n-1143 {\n-1144 public:\n-_\b1_\b1_\b4_\b5 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n-1146 };\n-1147\n-1159 int twoWayConnections(const _\bV_\be_\br_\bt_\be_\bx&, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-1160 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n-1161\n-1165 class OneWayCounter : public Counter\n-1166 {\n-1167 public:\n-_\b1_\b1_\b6_\b8 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n-1169 };\n-1170\n-1182 int oneWayConnections(const _\bV_\be_\br_\bt_\be_\bx&, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-1183 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n-1184\n-1191 class ConnectivityCounter : public Counter\n-1192 {\n-1193 public:\n-_\b1_\b2_\b0_\b0 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br(const VertexSet& connected, const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates);\n-1201\n-_\b1_\b2_\b0_\b2 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n-1203\n-1204 private:\n-1206 const VertexSet& connected_;\n-1208 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n-1209\n-1210 };\n-1211\n-1223 double connectivity(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n-aggregates) const;\n-1231 bool connected(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-1232 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n-1233\n-1241 bool connected(const _\bV_\be_\br_\bt_\be_\bx& vertex, const SLList&\n-aggregateList,\n-1242 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n-1243\n-1251 class DependencyCounter : public Counter\n-1252 {\n-1253 public:\n-_\b1_\b2_\b5_\b7 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br();\n-1258\n-_\b1_\b2_\b5_\b9 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n-1260 };\n-1261\n-1268 class FrontMarker\n-1269 {\n-1270 public:\n-_\b1_\b2_\b7_\b7 _\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br(std::vector& front, _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph);\n-1278\n-_\b1_\b2_\b7_\b9 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n-1280\n-1281 private:\n-1283 std::vector& front_;\n-1285 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph_;\n-1286 };\n-1287\n-1291 void unmarkFront();\n-1292\n-1307 int unusedNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n-aggregates) const;\n-1308\n-1322 std::pair neighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n-1323 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-1324 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n-1341 int aggregateNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n-aggregate, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n-1342\n-1350 bool admissible(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n-aggregate, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n-1351\n-1359 std::size_t distance(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n-aggregates);\n-1360\n-1369 _\bV_\be_\br_\bt_\be_\bx mergeNeighbour(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n-aggregates) const;\n-1370\n-1379 void nonisoNeighbourAggregate(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n-1380 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-1381 SLList& neighbours) const;\n-1382\n-1390 template\n-1391 void growAggregate(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n-aggregates, const C& c);\n-1392 template\n-1393 void growIsolatedAggregate(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, const C& c);\n-1394 };\n-1395\n-1396#ifndef DOXYGEN\n-1397\n-1398 template\n-1399 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt(const _\bM_\ba_\bt_\br_\bi_\bx* matrix)\n-1400 {\n-1401 matrix_ = matrix;\n-1402 }\n-1403\n-1404 template\n-1405 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw(const Row& row, int index)\n-1406 {\n-1407 initRow(row, index, std::is_convertible());\n-1408 }\n-1409\n-1410 template\n-1411 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw(const Row& row, int index,\n-const std::false_type&)\n-1412 {\n-1413 DUNE_THROW(InvalidStateException, \"field_type needs to convertible to\n-real_type\");\n-1414 }\n-1415\n-1416 template\n-1417 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw([[maybe_unused]] const Row&\n-row, int index, const std::true_type&)\n-1418 {\n-1419 using std::min;\n-1420 maxValue_ = min(- std::numeric_limits::max(),\n-std::numeric_limits::min());\n-1421 row_ = index;\n-1422 diagonal_ = norm_(matrix_->operator[](row_)[row_]);\n-1423 }\n-1424\n-1425 template\n-1426 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(const ColIter& _\bc_\bo_\bl)\n-1427 {\n-1428 using std::max;\n-1429 real_type eij = norm_(*_\bc_\bo_\bl);\n-1430 typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br opposite_entry =\n-1431 matrix_->operator[](_\bc_\bo_\bl.index()).find(row_);\n-1432 if ( opposite_entry == matrix_->operator[](_\bc_\bo_\bl.index()).end() )\n-1433 {\n-1434 // Consider this a weak connection we disregard.\n-1435 return;\n-1436 }\n-1437 real_type eji = norm_(*opposite_entry);\n-1438\n-1439 // skip positive offdiagonals if norm preserves sign of them.\n-1440 if(!N::is_sign_preserving || eij<0 || eji<0)\n-1441 maxValue_ = max(maxValue_,\n-1442 eij /diagonal_ * eji/\n-1443 norm_(matrix_->operator[](_\bc_\bo_\bl.index())[_\bc_\bo_\bl.index()]));\n-1444 }\n-1445\n-1446 template\n-1447 template\n-1448 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph, const typename G::\n-EdgeIterator& edge, const ColIter& _\bc_\bo_\bl)\n-1449 {\n-1450 real_type eij = norm_(*_\bc_\bo_\bl);\n-1451 typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br opposite_entry =\n-1452 matrix_->operator[](_\bc_\bo_\bl.index()).find(row_);\n-1453\n-1454 if ( opposite_entry == matrix_->operator[](_\bc_\bo_\bl.index()).end() )\n-1455 {\n-1456 // Consider this as a weak connection we disregard.\n-1457 return;\n-1458 }\n-1459 real_type eji = norm_(*opposite_entry);\n-1460 // skip positive offdiagonals if norm preserves sign of them.\n-1461 if(!N::is_sign_preserving || (eij<0 || eji<0))\n-1462 if(eji / norm_(matrix_->operator[](edge.target())[edge.target()]) *\n-1463 eij/ diagonal_ > alpha() * maxValue_) {\n-1464 edge.properties().setDepends();\n-1465 edge.properties().setInfluences();\n-1466 typename G::EdgeProperties& other = graph.getEdgeProperties(edge.target(),\n-edge.source());\n-1467 other.setInfluences();\n-1468 other.setDepends();\n-1469 }\n-1470 }\n-1471\n-1472 template\n-1473 inline bool _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd()\n-1474 {\n-1475 return maxValue_ < beta();\n-1476 }\n-1477\n-1478\n-1479 template\n-1480 inline void _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt(const Matrix* matrix)\n-1481 {\n-1482 matrix_ = matrix;\n-1483 }\n-1484\n-1485 template\n-1486 inline void _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw([[maybe_unused]] const Row& row, int\n-index)\n-1487 {\n-1488 using std::min;\n-1489 maxValue_ = min(- std::numeric_limits::max(), std::\n-numeric_limits::min());\n-1490 row_ = index;\n-1491 diagonal_ = norm_(matrix_->operator[](row_)[row_]);\n-1492 }\n-1493\n-1494 template\n-1495 inline void _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(const ColIter& _\bc_\bo_\bl)\n-1496 {\n-1497 using std::max;\n-1498 maxValue_ = max(maxValue_, -norm_(*_\bc_\bo_\bl));\n-1499 }\n-1500\n-1501 template\n-1502 template\n-1503 inline void _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph, const typename G::\n-EdgeIterator& edge, const ColIter& _\bc_\bo_\bl)\n-1504 {\n-1505 if(-norm_(*_\bc_\bo_\bl) >= maxValue_ * alpha()) {\n-1506 edge.properties().setDepends();\n-1507 typedef typename G::EdgeDescriptor ED;\n-1508 ED e= graph.findEdge(edge.target(), edge.source());\n-1509 if(e!=std::numeric_limits::max())\n-1510 {\n-1511 typename G::EdgeProperties& other = graph.getEdgeProperties(e);\n-1512 other.setInfluences();\n-1513 }\n-1514 }\n-1515 }\n-1516\n-1517 template\n-1518 inline bool _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd()\n-1519 {\n-1520 return maxValue_ < beta() * diagonal_;\n-1521 }\n-1522\n-1523 template\n-1524 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be(MatrixGraph& graph, AggregatesMap&\n-aggregates,\n-1525 VertexSet& connected, std::vector& front)\n-1526 : vertices_(), id_(-1), graph_(graph), aggregates_(aggregates),\n-1527 connected_(connected), front_(front)\n-1528 {}\n-1529\n-1530 template\n-1531 void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\br_\be_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(const _\bV_\be_\br_\bt_\be_\bx& vertex)\n-1532 {\n-1533 /*\n-1534 vertices_.push_back(vertex);\n-1535 typedef typename VertexList::const_iterator iterator;\n-1536 iterator begin = vertices_.begin();\n-1537 iterator end = vertices_.end();*/\n-1538 throw \"Not yet implemented\";\n-1539\n-1540 // while(begin!=end){\n-1541 //for();\n-1542 // }\n-1543\n-1544 }\n-1545\n-1546 template\n-1547 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bs_\be_\be_\bd(const _\bV_\be_\br_\bt_\be_\bx& vertex)\n-1548 {\n-1549 dvverb<<\"Connected cleared\"<\n-1560 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\ba_\bd_\bd(const _\bV_\be_\br_\bt_\be_\bx& vertex)\n-1561 {\n-1562 vertices_.insert(vertex);\n-1563 aggregates_[vertex]=id_;\n-1564 if(front_.size())\n-1565 front_.erase(std::lower_bound(front_.begin(), front_.end(), vertex));\n-1566\n-1567\n-1568 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iterator;\n-1569 const iterator end = graph_.endEdges(vertex);\n-1570 for(iterator edge = graph_.beginEdges(vertex); edge != end; ++edge) {\n-1571 dvverb << \" Inserting \"<::UNAGGREGATED &&\n-1575 !graph_.getVertexProperties(edge.target()).front())\n-1576 {\n-1577 front_.push_back(edge.target());\n-1578 graph_.getVertexProperties(edge.target()).setFront();\n-1579 }\n-1580 }\n-1581 dvverb <\n-1586 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\ba_\bd_\bd(std::vector& vertices)\n-1587 {\n-1588#ifndef NDEBUG\n-1589 std::size_t oldsize = vertices_.size();\n-1590#endif\n-1591 typedef typename std::vector::iterator Iterator;\n-1592\n-1593 typedef typename VertexSet::iterator SIterator;\n-1594\n-1595 SIterator pos=vertices_.begin();\n-1596 std::vector newFront;\n-1597 newFront.reserve(front_.capacity());\n-1598\n-1599 std::set_difference(front_.begin(), front_.end(), vertices.begin(),\n-vertices.end(),\n-1600 std::back_inserter(newFront));\n-1601 front_=newFront;\n-1602\n-1603 for(Iterator vertex=vertices.begin(); vertex != vertices.end(); ++vertex)\n-1604 {\n-1605 pos=vertices_.insert(pos,*vertex);\n-1606 vertices_.insert(*vertex);\n-1607 graph_.getVertexProperties(*vertex).resetFront(); // Not a front node any\n-more.\n-1608 aggregates_[*vertex]=id_;\n-1609\n-1610 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iterator;\n-1611 const iterator end = graph_.endEdges(*vertex);\n-1612 for(iterator edge = graph_.beginEdges(*vertex); edge != end; ++edge) {\n-1613 dvverb << \" Inserting \"<::UNAGGREGATED &&\n-1616 !graph_.getVertexProperties(edge.target()).front())\n-1617 {\n-1618 front_.push_back(edge.target());\n-1619 graph_.getVertexProperties(edge.target()).setFront();\n-1620 }\n-1621 dvverb <<\" size=\"<\n-1629 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bc_\bl_\be_\ba_\br()\n-1630 {\n-1631 vertices_.clear();\n-1632 connected_.clear();\n-1633 id_=-1;\n-1634 }\n-1635\n-1636 template\n-1637 inline typename Aggregate::VertexSet::size_type\n-1638 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bs_\bi_\bz_\be()\n-1639 {\n-1640 return vertices_.size();\n-1641 }\n-1642\n-1643 template\n-1644 inline typename Aggregate::VertexSet::size_type\n-1645 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bc_\bo_\bn_\bn_\be_\bc_\bt_\bS_\bi_\bz_\be()\n-1646 {\n-1647 return connected_.size();\n-1648 }\n-1649\n-1650 template\n-1651 inline int _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bi_\bd()\n-1652 {\n-1653 return id_;\n-1654 }\n-1655\n-1656 template\n-1657 inline typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn()\n+1038 return norm * (isNaN / isNaN);\n+1039 }\n+1040\n+1042 template ::value, int>::type = 0>\n+_\b1_\b0_\b4_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n+1045 using real_type = typename FieldTraits::real_type;\n+1046 using std::max;\n+1047\n+1048 real_type norm = 0;\n+1049 real_type isNaN = 1;\n+1050 for (auto const &x : *this) {\n+1051 real_type sum = 0;\n+1052 for (auto const &y : x)\n+1053 sum += Impl::asMatrix(y).infinity_norm_real();\n+1054 norm = max(sum, norm);\n+1055 isNaN += sum;\n+1056 }\n+1057\n+1058 return norm * (isNaN / isNaN);\n+1059 }\n+1060\n+1061 //===== query\n+1062\n+_\b1_\b0_\b6_\b4 bool _\be_\bx_\bi_\bs_\bt_\bs ([[maybe_unused]] _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, [[maybe_unused]] _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j)\n const\n-1658 {\n-1659 return vertices_.begin();\n-1660 }\n-1661\n-1662 template\n-1663 inline typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\be_\bn_\bd() const\n-1664 {\n-1665 return vertices_.end();\n-1666 }\n-1667\n-1668 template\n-1669 const V _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD = std::numeric_limits::max();\n-1670\n-1671 template\n-1672 const V _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD = std::numeric_limits::max()-1;\n-1673\n-1674 template\n-1675 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp()\n-1676 : aggregates_(0)\n-1677 {}\n-1678\n-1679 template\n-1680 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp()\n-1681 {\n-1682 if(aggregates_!=0)\n-1683 delete[] aggregates_;\n-1684 }\n-1685\n-1686\n-1687 template\n-1688 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(std::size_t noVertices)\n-1689 {\n-1690 allocate(noVertices);\n-1691 }\n-1692\n-1693 template\n-1694 inline std::size_t _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const\n-1695 {\n-1696 return noVertices_;\n-1697 }\n-1698\n-1699 template\n-1700 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(std::size_t noVertices)\n-1701 {\n-1702 aggregates_ = new _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br[noVertices];\n-1703 noVertices_ = noVertices;\n-1704\n-1705 for(std::size_t i=0; i < noVertices; i++)\n-1706 aggregates_[i]=UNAGGREGATED;\n-1707 }\n-1708\n-1709 template\n-1710 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bf_\br_\be_\be()\n-1711 {\n-1712 assert(aggregates_ != 0);\n-1713 delete[] aggregates_;\n-1714 aggregates_=0;\n-1715 }\n-1716\n-1717 template\n-1718 inline typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n-1719 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const VertexDescriptor& v)\n-1720 {\n-1721 return aggregates_[v];\n-1722 }\n-1723\n-1724 template\n-1725 inline const typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n-1726 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const VertexDescriptor& v) const\n-1727 {\n-1728 return aggregates_[v];\n-1729 }\n-1730\n-1731 template\n-1732 template\n-1733 inline std::size_t _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh(const V& start,\n-1734 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-1735 const G& graph, F& aggregateVisitor,\n-1736 VM& visitedMap) const\n-1737 {\n-1738 VertexList vlist;\n-1739\n-1740 DummyEdgeVisitor dummy;\n-1741 return breadthFirstSearch(start, aggregate, graph, vlist,\n-aggregateVisitor, dummy, visitedMap);\n-1742 }\n-1743\n-1744 template\n-1745 template\n-1746 std::size_t _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh(const V& start,\n-1747 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-1748 const G& graph,\n-1749 L& visited,\n-1750 F1& aggregateVisitor,\n-1751 F2& nonAggregateVisitor,\n-1752 VM& visitedMap) const\n-1753 {\n-1754 typedef typename L::const_iterator ListIterator;\n-1755 int visitedSpheres = 0;\n-1756\n-1757 visited.push_back(start);\n-1758 put(visitedMap, start, true);\n-1759\n-1760 ListIterator current = visited.begin();\n-1761 ListIterator end = visited.end();\n-1762 std::size_t i=0, size=visited.size();\n-1763\n-1764 // visit the neighbours of all vertices of the\n-1765 // current sphere.\n-1766 while(current != end) {\n-1767\n-1768 for(; i\n-1803 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br()\n-1804 : graph_(0), aggregate_(0), front_(), connected_(), size_(-1)\n-1805 {}\n-1806\n-1807 template\n-1808 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br()\n-1809 {\n-1810 size_=-1;\n-1811 }\n-1812\n-1813 template\n-1814 void _\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(G& graph,\n-1815 const typename C::Matrix& matrix,\n-1816 C criterion, bool firstlevel)\n-1817 {\n-1818 // assert(graph.isBuilt());\n-1819 typedef typename C::Matrix Matrix;\n-1820 typedef typename G::VertexIterator VertexIterator;\n-1821\n-1822 criterion.init(&matrix);\n-1823\n-1824 for(VertexIterator vertex = graph.begin(); vertex != graph.end();\n-++vertex) {\n-1825 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be Row;\n-1826\n-1827 const Row& row = matrix[*vertex];\n-1828\n-1829 // Tell the criterion what row we will examine now\n-1830 // This might for example be used for calculating the\n-1831 // maximum offdiagonal value\n-1832 criterion.initRow(row, *vertex);\n-1833\n-1834 // On a first path all columns are examined. After this\n-1835 // the calculator should know whether the vertex is isolated.\n-1836 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ColIterator;\n-1837 ColIterator end = row.end();\n-1838 typename FieldTraits::real_type\n-absoffdiag=0.;\n-1839\n-1840 using std::max;\n-1841 if(firstlevel) {\n-1842 for(ColIterator _\bc_\bo_\bl = row.begin(); _\bc_\bo_\bl != end; ++_\bc_\bo_\bl)\n-1843 if(_\bc_\bo_\bl.index()!=*vertex) {\n-1844 criterion.examine(_\bc_\bo_\bl);\n-1845 absoffdiag = max(absoffdiag, Impl::asMatrix(*col).frobenius_norm());\n-1846 }\n-1847\n-1848 if(absoffdiag==0)\n-1849 vertex.properties().setExcludedBorder();\n-1850 }\n-1851 else\n-1852 for(ColIterator _\bc_\bo_\bl = row.begin(); _\bc_\bo_\bl != end; ++_\bc_\bo_\bl)\n-1853 if(_\bc_\bo_\bl.index()!=*vertex)\n-1854 criterion.examine(_\bc_\bo_\bl);\n-1855\n-1856 // reset the vertex properties\n-1857 //vertex.properties().reset();\n-1858\n-1859 // Check whether the vertex is isolated.\n-1860 if(criterion.isIsolated()) {\n-1861 //std::cout<<\"ISOLATED: \"<<*vertex<\n-1881 template\n-1882 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b<_\bV_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br(const\n-AggregatesMap& aggregates,\n-1883 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate, V& visitor)\n-1884 : aggregates_(aggregates), aggregate_(aggregate), visitor_(&visitor)\n-1885 {}\n-1886\n-1887 template\n-1888 template\n-1889 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b<_\bV_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n-_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n-1890 {\n-1891 if(aggregates_[edge.target()]==aggregate_)\n-1892 visitor_->operator()(edge);\n-1893 }\n-1894\n-1895 template\n-1896 template\n-1897 inline void Aggregator::visitAggregateNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n-1898 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-1899 const AggregatesMap& aggregates,\n-1900 V& visitor) const\n-1901 {\n-1902 // Only evaluates for edge pointing to the aggregate\n-1903 AggregateVisitor v(aggregates, aggregate, visitor);\n-1904 _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(*graph_, vertex, v);\n-1905 }\n-1906\n-1907\n-1908 template\n-1909 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br()\n-1910 : count_(0)\n-1911 {}\n-1912\n-1913 template\n-1914 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n-1915 {\n-1916 ++count_;\n-1917 }\n-1918\n-1919 template\n-1920 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt()\n-1921 {\n-1922 --count_;\n-1923 }\n-1924 template\n-1925 inline int _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be()\n-1926 {\n-1927 return count_;\n-1928 }\n-1929\n-1930 template\n-1931 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bT_\bw_\bo_\bW_\ba_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n-_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n-1932 {\n-1933 if(edge.properties().isTwoWay())\n-1934 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-1935 }\n-1936\n-1937 template\n-1938 int Aggregator::twoWayConnections(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-1939 const AggregatesMap& aggregates) const\n-1940 {\n-1941 TwoWayCounter counter;\n-1942 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);\n-1943 return counter.value();\n-1944 }\n-1945\n-1946 template\n-1947 int Aggregator::oneWayConnections(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-1948 const AggregatesMap& aggregates) const\n-1949 {\n-1950 OneWayCounter counter;\n-1951 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);\n-1952 return counter.value();\n-1953 }\n-1954\n-1955 template\n-1956 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bO_\bn_\be_\bW_\ba_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n-_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n-1957 {\n-1958 if(edge.properties().isOneWay())\n-1959 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-1960 }\n-1961\n-1962 template\n-1963 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br(const\n-VertexSet& connected,\n-1964 const AggregatesMap& aggregates)\n-1965 : Counter(), connected_(connected), aggregates_(aggregates)\n-1966 {}\n-1967\n-1968\n-1969 template\n-1970 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n-_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n-1971 {\n-1972 if(connected_.find(aggregates_[edge.target()]) == connected_.end() ||\n-aggregates_[edge.target()]==AggregatesMap::UNAGGREGATED)\n-1973 // Would be a new connection\n-1974 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-1975 else{\n-1976 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-1977 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-1978 }\n-1979 }\n-1980\n-1981 template\n-1982 inline double Aggregator::connectivity(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n-AggregatesMap& aggregates) const\n-1983 {\n-1984 ConnectivityCounter counter(connected_, aggregates);\n-1985 double noNeighbours=_\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(*graph_, vertex, counter);\n-1986 return (double)counter.value()/noNeighbours;\n-1987 }\n-1988\n-1989 template\n-1990 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br()\n-1991 : Counter()\n-1992 {}\n-1993\n-1994 template\n-1995 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n-_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n-1996 {\n-1997 if(edge.properties().depends())\n-1998 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-1999 if(edge.properties().influences())\n-2000 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-2001 }\n-2002\n-2003 template\n-2004 int Aggregator::unusedNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n-AggregatesMap& aggregates) const\n-2005 {\n-2006 return aggregateNeighbours(vertex, AggregatesMap::UNAGGREGATED,\n-aggregates);\n-2007 }\n-2008\n-2009 template\n-2010 std::pair Aggregator::neighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n-2011 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-2012 const AggregatesMap& aggregates) const\n-2013 {\n-2014 DependencyCounter unused, aggregated;\n-2015 typedef AggregateVisitor CounterT;\n-2016 typedef std::tuple CounterTuple;\n-2017 CombinedFunctor visitors(CounterTuple(CounterT(aggregates,\n-AggregatesMap::UNAGGREGATED, unused), CounterT(aggregates, aggregate,\n-aggregated)));\n-2018 _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(*graph_, vertex, visitors);\n-2019 return std::make_pair(unused.value(), aggregated.value());\n-2020 }\n-2021\n-2022\n-2023 template\n-2024 int Aggregator::aggregateNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate, const AggregatesMap& aggregates) const\n-2025 {\n-2026 DependencyCounter counter;\n-2027 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);\n-2028 return counter.value();\n-2029 }\n-2030\n-2031 template\n-2032 std::size_t Aggregator::distance(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n-AggregatesMap& aggregates)\n-2033 {\n-2034 return 0;\n-2035 typename PropertyMapTypeSelector::Type visitedMap =\n-_\bg_\be_\bt(VertexVisitedTag(), *graph_);\n-2036 VertexList vlist;\n-2037 typename AggregatesMap::DummyEdgeVisitor dummy;\n-2038 return aggregates.template breadthFirstSearch(vertex,\n-2039 aggregate_->_\bi_\bd(), *graph_,\n-2040 vlist, dummy, dummy, visitedMap);\n-2041 }\n-2042\n-2043 template\n-2044 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br(std::vector& front,\n-_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph)\n-2045 : front_(front), graph_(graph)\n-2046 {}\n-2047\n-2048 template\n-2049 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n-_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n-2050 {\n-2051 _\bV_\be_\br_\bt_\be_\bx target = edge.target();\n-2052\n-2053 if(!graph_.getVertexProperties(target).front()) {\n-2054 front_.push_back(target);\n-2055 graph_.getVertexProperties(target).setFront();\n-2056 }\n-2057 }\n-2058\n-2059 template\n-2060 inline bool Aggregator::admissible(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate, const AggregatesMap& aggregates) const\n-2061 {\n-2062 // Todo\n-2063 Dune::dvverb<<\" Admissible not yet implemented!\"<endEdges(vertex);\n-2071 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {\n-2072 // if(edge.properties().depends() && !edge.properties().influences()\n-2073 if(edge.properties().isStrong()\n-2074 && aggregates[edge.target()]==aggregate)\n-2075 {\n-2076 // Search for another link to the aggregate\n-2077 Iterator edge1 = edge;\n-2078 for(++edge1; edge1 != vend; ++edge1) {\n-2079 //if(edge1.properties().depends() && !edge1.properties().influences()\n-2080 if(edge1.properties().isStrong()\n-2081 && aggregates[edge.target()]==aggregate)\n-2082 {\n-2083 //Search for an edge connecting the two vertices that is\n-2084 //strong\n-2085 bool found=false;\n-2086 Iterator v2end = graph_->endEdges(edge.target());\n-2087 for(Iterator edge2 = graph_->beginEdges(edge.target()); edge2 != v2end;\n-++edge2) {\n-2088 if(edge2.target()==edge1.target() &&\n-2089 edge2.properties().isStrong()) {\n-2090 found =true;\n-2091 break;\n-2092 }\n-2093 }\n-2094 if(found)\n-2095 {\n-2096 return true;\n-2097 }\n-2098 }\n-2099 }\n-2100 }\n-2101 }\n-2102\n-2103 // Situation 2: cluster node depends on front node and other cluster node\n-2105 vend = graph_->endEdges(vertex);\n-2106 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {\n-2107 //if(!edge.properties().depends() && edge.properties().influences()\n-2108 if(edge.properties().isStrong()\n-2109 && aggregates[edge.target()]==aggregate)\n-2110 {\n-2111 // Search for a link from target that stays within the aggregate\n-2112 Iterator v1end = graph_->endEdges(edge.target());\n-2113\n-2114 for(Iterator edge1=graph_->beginEdges(edge.target()); edge1 != v1end;\n-++edge1) {\n-2115 //if(edge1.properties().depends() && !edge1.properties().influences()\n-2116 if(edge1.properties().isStrong()\n-2117 && aggregates[edge1.target()]==aggregate)\n-2118 {\n-2119 bool found=false;\n-2120 // Check if front node is also connected to this one\n-2121 Iterator v2end = graph_->endEdges(vertex);\n-2122 for(Iterator edge2 = graph_->beginEdges(vertex); edge2 != v2end; ++edge2)\n-{\n-2123 if(edge2.target()==edge1.target()) {\n-2124 if(edge2.properties().isStrong())\n-2125 found=true;\n-2126 break;\n-2127 }\n-2128 }\n-2129 if(found)\n-2130 {\n-2131 return true;\n-2132 }\n-2133 }\n-2134 }\n-2135 }\n-2136 }\n-2137 return false;\n-2138 }\n-2139\n-2140 template\n-2141 void Aggregator::unmarkFront()\n-2142 {\n-2143 typedef typename std::vector::const_iterator Iterator;\n-2144\n-2145 for(Iterator vertex=front_.begin(); vertex != front_.end(); ++vertex)\n-2146 graph_->getVertexProperties(*vertex).resetFront();\n-2147\n-2148 front_.clear();\n-2149 }\n-2150\n-2151 template\n-2152 inline void\n-2153 Aggregator::nonisoNeighbourAggregate(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n-2154 const AggregatesMap& aggregates,\n-2155 SLList& neighbours) const\n-2156 {\n-2157 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n-2158 Iterator end=graph_->beginEdges(vertex);\n-2159 neighbours.clear();\n-2160\n-2161 for(Iterator edge=graph_->beginEdges(vertex); edge!=end; ++edge)\n-2162 {\n-2163 if(aggregates[edge.target()]!=AggregatesMap::UNAGGREGATED &&\n-graph_->getVertexProperties(edge.target()).isolated())\n-2164 neighbours.push_back(aggregates[edge.target()]);\n-2165 }\n-2166 }\n-2167\n-2168 template\n-2169 inline typename G::VertexDescriptor Aggregator::mergeNeighbour(const\n-_\bV_\be_\br_\bt_\be_\bx& vertex, const AggregatesMap& aggregates) const\n-2170 {\n-2171 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n-2172\n-2173 Iterator end = graph_->endEdges(vertex);\n-2174 for(Iterator edge = graph_->beginEdges(vertex); edge != end; ++edge) {\n-2175 if(aggregates[edge.target()] != AggregatesMap::UNAGGREGATED &&\n-2176 graph_->getVertexProperties(edge.target()).isolated() == graph_-\n->getVertexProperties(edge.source()).isolated()) {\n-2177 if( graph_->getVertexProperties(vertex).isolated() ||\n-2178 ((edge.properties().depends() || edge.properties().influences())\n-2179 && admissible(vertex, aggregates[edge.target()], aggregates)))\n-2180 return edge.target();\n-2181 }\n-2182 }\n-2183 return AggregatesMap::UNAGGREGATED;\n-2184 }\n-2185\n-2186 template\n-2187 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br(const\n-_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph)\n-2188 : Counter(), graph_(graph)\n-2189 {}\n-2190\n-2191 template\n-2192 void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n-_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n-2193 {\n-2194 if(graph_.getVertexProperties(edge.target()).front())\n-2195 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-2196 }\n-2197\n-2198 template\n-2199 int Aggregator::noFrontNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex) const\n-2200 {\n-2201 FrontNeighbourCounter counter(*graph_);\n-2202 _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(*graph_, vertex, counter);\n-2203 return counter.value();\n-2204 }\n-2205 template\n-2206 inline bool Aggregator::connected(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n-2207 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n-2208 const AggregatesMap& aggregates) const\n-2209 {\n-2210 typedef typename G::ConstEdgeIterator iterator;\n-2211 const iterator end = graph_->endEdges(vertex);\n-2212 for(iterator edge = graph_->beginEdges(vertex); edge != end; ++edge)\n-2213 if(aggregates[edge.target()]==aggregate)\n-2214 return true;\n-2215 return false;\n-2216 }\n-2217 template\n-2218 inline bool Aggregator::connected(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n-2219 const SLList& aggregateList,\n-2220 const AggregatesMap& aggregates) const\n-2221 {\n-2222 typedef typename SLList::const_iterator Iter;\n-2223 for(Iter i=aggregateList.begin(); i!=aggregateList.end(); ++i)\n-2224 if(connected(vertex, *i, aggregates))\n-2225 return true;\n-2226 return false;\n-2227 }\n-2228\n-2229 template\n-2230 template\n-2231 void Aggregator::growIsolatedAggregate(const _\bV_\be_\br_\bt_\be_\bx& seed, const\n-AggregatesMap& aggregates, const C& c)\n-2232 {\n-2233 SLList connectedAggregates;\n-2234 nonisoNeighbourAggregate(seed, aggregates,connectedAggregates);\n-2235\n-2236 while(aggregate_->_\bs_\bi_\bz_\be()< c.minAggregateSize() && aggregate_->_\bc_\bo_\bn_\bn_\be_\bc_\bt_\bS_\bi_\bz_\be\n-() < c.maxConnectivity()) {\n-2237 double maxCon=-1;\n-2238 std::size_t maxFrontNeighbours=0;\n-2239\n-2240 _\bV_\be_\br_\bt_\be_\bx candidate=AggregatesMap::UNAGGREGATED;\n-2241\n-2242 typedef typename std::vector::const_iterator Iterator;\n-2243\n-2244 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {\n-2245 if(distance(*vertex, aggregates)>c.maxDistance())\n-2246 continue; // distance of proposes aggregate too big\n-2247\n-2248 if(connectedAggregates.size()>0) {\n-2249 // there is already a neighbour cluster\n-2250 // front node must be connected to same neighbour cluster\n-2251\n-2252 if(!connected(*vertex, connectedAggregates, aggregates))\n-2253 continue;\n-2254 }\n-2255\n-2256 double con = connectivity(*vertex, aggregates);\n-2257\n-2258 if(con == maxCon) {\n-2259 std::size_t frontNeighbours = noFrontNeighbours(*vertex);\n-2260\n-2261 if(frontNeighbours >= maxFrontNeighbours) {\n-2262 maxFrontNeighbours = frontNeighbours;\n-2263 candidate = *vertex;\n-2264 }\n-2265 }else if(con > maxCon) {\n-2266 maxCon = con;\n-2267 maxFrontNeighbours = noFrontNeighbours(*vertex);\n-2268 candidate = *vertex;\n-2269 }\n-2270 }\n-2271\n-2272 if(candidate==AggregatesMap::UNAGGREGATED)\n-2273 break;\n-2274\n-2275 aggregate_->_\ba_\bd_\bd(candidate);\n-2276 }\n-2277 }\n-2278\n-2279 template\n-2280 template\n-2281 void Aggregator::growAggregate(const _\bV_\be_\br_\bt_\be_\bx& seed, const\n-AggregatesMap& aggregates, const C& c)\n-2282 {\n-2283 using std::min;\n-2284\n-2285 std::size_t distance_ =0;\n-2286 while(aggregate_->_\bs_\bi_\bz_\be() < c.minAggregateSize()&& distance_ candidates;\n-2291 candidates.reserve(30);\n-2292\n-2293 typedef typename std::vector::const_iterator Iterator;\n-2294\n-2295 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {\n-2296 // Only nonisolated nodes are considered\n-2297 if(graph_->getVertexProperties(*vertex).isolated())\n-2298 continue;\n-2299\n-2300 int twoWayCons = twoWayConnections(*vertex, aggregate_->_\bi_\bd(), aggregates);\n-2301\n-2302 /* The case of two way connections. */\n-2303 if( maxTwoCons == twoWayCons && twoWayCons > 0) {\n-2304 double con = connectivity(*vertex, aggregates);\n-2305\n-2306 if(con == maxCon) {\n-2307 int neighbours = noFrontNeighbours(*vertex);\n-2308\n-2309 if(neighbours > maxNeighbours) {\n-2310 maxNeighbours = neighbours;\n-2311 candidates.clear();\n-2312 candidates.push_back(*vertex);\n-2313 }else{\n-2314 candidates.push_back(*vertex);\n-2315 }\n-2316 }else if( con > maxCon) {\n-2317 maxCon = con;\n-2318 maxNeighbours = noFrontNeighbours(*vertex);\n-2319 candidates.clear();\n-2320 candidates.push_back(*vertex);\n-2321 }\n-2322 }else if(twoWayCons > maxTwoCons) {\n-2323 maxTwoCons = twoWayCons;\n-2324 maxCon = connectivity(*vertex, aggregates);\n-2325 maxNeighbours = noFrontNeighbours(*vertex);\n-2326 candidates.clear();\n-2327 candidates.push_back(*vertex);\n-2328\n-2329 // two way connections precede\n-2330 maxOneCons = std::numeric_limits::max();\n-2331 }\n-2332\n-2333 if(twoWayCons > 0)\n-2334 {\n-2335 continue; // THis is a two-way node, skip tests for one way nodes\n-2336 }\n-2337\n-2338 /* The one way case */\n-2339 int oneWayCons = oneWayConnections(*vertex, aggregate_->_\bi_\bd(), aggregates);\n-2340\n-2341 if(oneWayCons==0)\n-2342 continue; // No strong connections, skip the tests.\n-2343\n-2344 if(!admissible(*vertex, aggregate_->_\bi_\bd(), aggregates))\n-2345 continue;\n-2346\n-2347 if( maxOneCons == oneWayCons && oneWayCons > 0) {\n-2348 double con = connectivity(*vertex, aggregates);\n-2349\n-2350 if(con == maxCon) {\n-2351 int neighbours = noFrontNeighbours(*vertex);\n-2352\n-2353 if(neighbours > maxNeighbours) {\n-2354 maxNeighbours = neighbours;\n-2355 candidates.clear();\n-2356 candidates.push_back(*vertex);\n-2357 }else{\n-2358 if(neighbours==maxNeighbours)\n-2359 {\n-2360 candidates.push_back(*vertex);\n-2361 }\n-2362 }\n-2363 }else if( con > maxCon) {\n-2364 maxCon = con;\n-2365 maxNeighbours = noFrontNeighbours(*vertex);\n-2366 candidates.clear();\n-2367 candidates.push_back(*vertex);\n-2368 }\n-2369 }else if(oneWayCons > maxOneCons) {\n-2370 maxOneCons = oneWayCons;\n-2371 maxCon = connectivity(*vertex, aggregates);\n-2372 maxNeighbours = noFrontNeighbours(*vertex);\n-2373 candidates.clear();\n-2374 candidates.push_back(*vertex);\n-2375 }\n-2376 }\n-2377\n-2378\n-2379 if(!candidates.size())\n-2380 break; // No more candidates found\n-2381 distance_=distance(seed, aggregates);\n-2382 candidates.resize(min(candidates.size(), c.maxAggregateSize()-\n-2383 aggregate_->_\bs_\bi_\bz_\be()));\n-2384 aggregate_->_\ba_\bd_\bd(candidates);\n-2385 }\n-2386 }\n-2387\n-2388 template\n-2389 template\n-2390 std::tuple _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs(const M&\n-matrix, G& graph, const C& criterion,\n-2391 bool finestLevel)\n-2392 {\n-2393 Aggregator aggregator;\n-2394 return aggregator.build(matrix, graph, *this, criterion, finestLevel);\n-2395 }\n-2396\n-2397 template\n-2398 template\n-2399 std::tuple _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd(const M& m, G& graph,\n-AggregatesMap& aggregates, const C& c,\n-2400 bool finestLevel)\n-2401 {\n-2402 using std::max;\n-2403 using std::min;\n-2404 // Stack for fast vertex access\n-2405 Stack stack_(graph, *this, aggregates);\n-2406\n-2407 graph_ = &graph;\n-2408\n-2409 aggregate_ = new Aggregate(graph, aggregates, connected_,\n-front_);\n-2410\n-2411 Timer watch;\n-2412 watch.reset();\n-2413\n-2414 _\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(graph, m, c, finestLevel);\n-2415\n-2416 dverb<<\"Build dependency took \"<< watch.elapsed()<<\" seconds.\"<::ISOLATED;\n-2437 ++skippedAggregates;\n-2438 continue;\n-2439 }\n-2440\n-2441 if(graph.getVertexProperties(seed).isolated()) {\n-2442 if(c.skipIsolated()) {\n-2443 // isolated vertices are not aggregated but skipped on the coarser levels.\n-2444 aggregates[seed]=AggregatesMap::ISOLATED;\n-2445 ++skippedAggregates;\n-2446 // skip rest as no agglomeration is done.\n-2447 continue;\n-2448 }else{\n-2449 aggregate_->_\bs_\be_\be_\bd(seed);\n-2450 growIsolatedAggregate(seed, aggregates, c);\n-2451 }\n-2452 }else{\n-2453 aggregate_->_\bs_\be_\be_\bd(seed);\n-2454 growAggregate(seed, aggregates, c);\n-2455 }\n-2456\n-2457 /* The rounding step. */\n-2458 while(!(graph.getVertexProperties(seed).isolated()) && aggregate_->_\bs_\bi_\bz_\be()\n-< c.maxAggregateSize()) {\n-2459\n-2460 std::vector candidates;\n-2461 candidates.reserve(30);\n-2462\n-2463 typedef typename std::vector::const_iterator Iterator;\n-2464\n-2465 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {\n-2466\n-2467 if(graph.getVertexProperties(*vertex).isolated())\n-2468 continue; // No isolated nodes here\n-2469\n-2470 if(twoWayConnections( *vertex, aggregate_->_\bi_\bd(), aggregates) == 0 &&\n-2471 (oneWayConnections( *vertex, aggregate_->_\bi_\bd(), aggregates) == 0 ||\n-2472 !admissible( *vertex, aggregate_->_\bi_\bd(), aggregates) ))\n-2473 continue;\n-2474\n-2475 std::pair neighbourPair=neighbours(*vertex, aggregate_->_\bi_\bd(),\n-2476 aggregates);\n-2477\n-2478 //if(aggregateNeighbours(*vertex, aggregate_->id(), aggregates) <=\n-unusedNeighbours(*vertex, aggregates))\n-2479 // continue;\n-2480\n-2481 if(neighbourPair.first >= neighbourPair.second)\n-2482 continue;\n-2483\n-2484 if(distance(*vertex, aggregates) > c.maxDistance())\n-2485 continue; // Distance too far\n-2486 candidates.push_back(*vertex);\n-2487 break;\n-2488 }\n-2489\n-2490 if(!candidates.size()) break; // no more candidates found.\n-2491\n-2492 candidates.resize(min(candidates.size(), c.maxAggregateSize()-\n-2493 aggregate_->_\bs_\bi_\bz_\be()));\n-2494 aggregate_->_\ba_\bd_\bd(candidates);\n-2495\n-2496 }\n-2497\n-2498 // try to merge aggregates consisting of only one nonisolated vertex with\n-other aggregates\n-2499 if(aggregate_->_\bs_\bi_\bz_\be()==1 && c.maxAggregateSize()>1) {\n-2500 if(!graph.getVertexProperties(seed).isolated()) {\n-2501 _\bV_\be_\br_\bt_\be_\bx mergedNeighbour = mergeNeighbour(seed, aggregates);\n-2502\n-2503 if(mergedNeighbour != AggregatesMap::UNAGGREGATED) {\n-2504 // assign vertex to the neighbouring cluster\n-2505 aggregates[seed] = aggregates[mergedNeighbour];\n-2506 aggregate_->_\bi_\bn_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be();\n-2507 }else{\n-2508 ++avg;\n-2509 minA=min(minA,static_cast(1));\n-2510 maxA=max(maxA,static_cast(1));\n-2511 ++oneAggregates;\n-2512 ++conAggregates;\n-2513 }\n-2514 }else{\n-2515 ++avg;\n-2516 minA=min(minA,static_cast(1));\n-2517 maxA=max(maxA,static_cast(1));\n-2518 ++oneAggregates;\n-2519 ++isoAggregates;\n-2520 }\n-2521 ++avg;\n-2522 }else{\n-2523 avg+=aggregate_->_\bs_\bi_\bz_\be();\n-2524 minA=min(minA,aggregate_->_\bs_\bi_\bz_\be());\n-2525 maxA=max(maxA,aggregate_->_\bs_\bi_\bz_\be());\n-2526 if(graph.getVertexProperties(seed).isolated())\n-2527 ++isoAggregates;\n-2528 else\n-2529 ++conAggregates;\n-2530 }\n-2531\n-2532 }\n-2533\n-2534 Dune::dinfo<<\"connected aggregates: \"<0)\n-2537 Dune::dinfo<<\" one node aggregates: \"<\n-2548 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bS_\bt_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph, const Aggregator&\n-aggregatesBuilder,\n-2549 const AggregatesMap& aggregates)\n-2550 : graph_(graph), aggregatesBuilder_(aggregatesBuilder), aggregates_\n-(aggregates), begin_(graph.begin()), end_(graph.end())\n-2551 {\n-2552 //vals_ = new Vertex[N];\n-2553 }\n-2554\n-2555 template\n-2556 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\b~_\bS_\bt_\ba_\bc_\bk()\n-2557 {\n-2558 //Dune::dverb << \"Max stack size was \"<\n-2563 const typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bN_\bu_\bl_\bl_\bE_\bn_\bt_\br_\by\n-2564 = std::numeric_limits::max();\n-2565\n-2566 template\n-2567 inline typename G::VertexDescriptor _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bp_\bo_\bp()\n-2568 {\n-2569 for(; begin_!=end_ && aggregates_[*begin_] != AggregatesMap::\n-UNAGGREGATED; ++begin_) ;\n-2570\n-2571 if(begin_!=end_)\n-2572 {\n-2573 typename G::VertexDescriptor current=*begin_;\n-2574 ++begin_;\n-2575 return current;\n-2576 }else\n-2577 return NullEntry;\n-2578 }\n-2579\n-2580#endif // DOXYGEN\n-2581\n-2582 template\n-_\b2_\b5_\b8_\b3 void _\bp_\br_\bi_\bn_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b2_\bd(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>& aggregates, int n, int m,\n-std::ostream& os)\n-2584 {\n-2585 using std::max;\n-2586\n-2587 std::ios_base::fmtflags oldOpts=os.flags();\n-2588\n-2589 os.setf(std::ios_base::right, std::ios_base::adjustfield);\n-2590\n-2591 V maxVal=0;\n-2592 int width=1;\n-2593\n-2594 for(int i=0; i< n*m; i++)\n-2595 maxVal=max(maxVal, aggregates[i]);\n-2596\n-2597 for(int i=10; i < 1000000; i*=10)\n-2598 if(maxVal/i>0)\n-2599 width++;\n-2600 else\n-2601 break;\n-2602\n-2603 for(int j=0, entry=0; j < m; j++) {\n-2604 for(int i=0; i::iterator valIter_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:189\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br\n-Matrix::ConstColIterator ColIter\n-Constant column iterator of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:154\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh\n-std::size_t breadthFirstSearch(const VertexDescriptor &start, const\n-AggregateDescriptor &aggregate, const G &graph, L &visited, F1\n-&aggregateVisitor, F2 &nonAggregateVisitor, VM &visitedMap) const\n-Breadth first search within an aggregate.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n-PoolAllocator< VertexDescriptor, 100 > Allocator\n-The allocator we use for our lists and the set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:586\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-iterator begin()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:737\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bi_\bd\n-int id()\n-Get the id identifying the aggregate.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bn_\bo_\br_\bm_\b_\n-Norm norm_\n-The functor for calculating the norm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:302\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-MatrixGraph::VertexDescriptor Vertex\n-The vertex identifier.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:920\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-AggregationCriterion()\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n-const Matrix * matrix_\n-The matrix we work on.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:357\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-auto operator()(const M &m, typename std::enable_if_t< Dune::IsNumber< M >::\n-value > *sfinae=nullptr) const\n-Compute the norm of a scalar.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:406\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw\n-void initRow(const Row &row, int index)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n-SymmetricMatrixDependency(const Parameters &parms)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:168\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-M Matrix\n-The matrix type we build the dependency of.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:258\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br\n-Counter()\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-G MatrixGraph\n-The matrix graph type used.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:915\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bn_\bo_\br_\bm_\b_\n-Norm norm_\n-The functor for calculating the norm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:363\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const EdgeIterator &edge) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:601\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-SymmetricCriterion()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:524\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n-Dependency()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:290\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n-void examine(const ColIter &col)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-M Matrix\n-The matrix type we build the dependency of.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:319\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_\n-real_type diagonal_\n-The norm of the current diagonal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:187\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bN_\bo_\br_\bm\n-N Norm\n-The norm to use for examining the matrix entries.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:263\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n-iterator end()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:742\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-UnSymmetricCriterion(const Parameters &parms)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:541\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bT_\bw_\bo_\bW_\ba_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw\n-void initRow(const Row &row, int index)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:201\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n-bool isIsolated()\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bN_\bu_\bl_\bl_\bE_\bn_\bt_\br_\by\n-static const Vertex NullEntry\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:1008\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n-void examine(const ColIter &col)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:214\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n-Dependency(const Parameters &parms)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:286\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\bo_\bw_\b_\n-int row_\n-index of the currently evaluated row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:185\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bb_\bu_\bi_\bl_\bd\n-std::tuple< int, int, int, int > build(const M &m, G &graph, AggregatesMap<\n-Vertex > &aggregates, const C &c, bool finestLevel)\n-Build the aggregates.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br\n-FrontNeighbourCounter(const MatrixGraph &front)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bR_\bo_\bw\n-Matrix::row_type Row\n-Constant Row iterator of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:329\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n-const Matrix * matrix_\n-The matrix we work on.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-const AggregateDescriptor & operator[](const VertexDescriptor &v) const\n-Get the aggregate a vertex belongs to.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n-void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter\n-&col)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-AggregateVisitor(const AggregatesMap< Vertex > &aggregates, const\n-AggregateDescriptor &aggregate, Visitor &visitor)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br\n-Matrix::ConstColIterator ColIter\n-Constant column iterator of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:334\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-~AggregatesMap()\n-Destructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Matrix::field_type field_type\n-The current max value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:179\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n-void decrement()\n-Decrement counter.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n-Aggregate(MatrixGraph &graph, AggregatesMap< Vertex > &aggregates, VertexSet\n-&connectivity, std::vector< Vertex > &front_)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-V Visitor\n-The type of the adapted visitor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:1064\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bS_\bp_\bh_\be_\br_\be_\bM_\ba_\bp\n-std::size_t * SphereMap\n-Type of the mapping of aggregate members onto distance spheres.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:809\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-AggregationCriterion(const Parameters &parms)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bR_\bo_\bw\n-Matrix::row_type Row\n-Constant Row iterator of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:268\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bc_\bo_\bn_\bn_\be_\bc_\bt_\bS_\bi_\bz_\be\n-VertexSet::size_type connectSize()\n-Get the number of connections to other aggregates.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bv_\ba_\bl_\bs_\b_\n-std::vector< real_type > vals_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bN_\bo_\br_\bm\n-N Norm\n-The norm to use for examining the matrix entries.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:324\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b2_\bd\n-void printAggregates2d(const AggregatesMap< V > &aggregates, int n, int m,\n-std::ostream &os)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:2583\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bi_\bn_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be\n-void invalidate()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:822\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:725\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_\n-real_type maxValue_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:181\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bn_\bo_\br_\bm_\b_\n-Norm norm_\n-The functor for calculating the norm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:183\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-VertexSet::const_iterator const_iterator\n-Const iterator over a vertex list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:804\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-SymmetricCriterion(const Parameters &parms)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:521\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-MatrixGraph::VertexDescriptor AggregateDescriptor\n-The type of the aggregate descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:923\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_\n-real_type maxValue_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:361\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt\n-void init(const Matrix *matrix)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:195\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_\n-real_type diagonal_\n-The norm of the current diagonal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:367\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-AggregateDescriptor * iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:735\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n-SymmetricDependency(const Parameters &parms)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:348\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< field_type >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:360\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br\n-~Aggregator()\n-Destructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n-void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter\n-&col)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\ba_\bd_\bd\n-void add(const Vertex &vertex)\n-Add a vertex to the aggregate.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\bo_\bl_\bi_\bc_\by\n-T DependencyPolicy\n-The policy for calculating the dependency graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\ba_\bd_\bd\n-void add(std::vector< Vertex > &vertex)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n-void examine(const ColIter &col)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br\n-Aggregator()\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n-Examine an edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br\n-FrontMarker(std::vector< Vertex > &front, MatrixGraph &graph)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const\n-compute the norm of a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:506\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt\n-void init(const Matrix *matrix)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n-int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex,\n-V &visitor)\n-Visit all neighbour vertices of a vertex in a graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bI_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc\n-void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)\n-Sets reasonable default values for an isotropic problem.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:730\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-V AggregateDescriptor\n-The aggregate descriptor type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:580\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD\n-static const V ISOLATED\n-Identifier of isolated vertices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:571\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\bo_\bw_\b_\n-int row_\n-index of the currently evaluated row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:365\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n-SymmetricMatrixDependency()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:171\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br\n-DependencyCounter()\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bp_\bo_\bp\n-Vertex pop()\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_\n-real_type diagonal_\n-The norm of the current diagonal.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:306\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n-std::size_t noVertices() const\n-Get the number of vertices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bA_\bn_\bi_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc\n-void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2)\n-Sets reasonable default values for an aisotropic problem.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-AggregatesMap(std::size_t noVertices)\n-Constructs with allocating memory.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Matrix::field_type field_type\n-The current max value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:359\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-AggregateDescriptor & operator[](const VertexDescriptor &v)\n-Get the aggregate a vertex belongs to.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-AggregatesMap()\n-Constructs without allocating memory.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-int value()\n-Access the current count.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bL_\bi_\bs_\bt\n-SLList< VertexDescriptor, Allocator > VertexList\n-The type of a single linked list of vertex descriptors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:592\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\b~_\bS_\bt_\ba_\bc_\bk\n-~Stack()\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br\n-ConnectivityCounter(const VertexSet &connected, const AggregatesMap< Vertex >\n-&aggregates)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bs_\bi_\bz_\be\n-VertexSet::size_type size()\n-Get the size of the aggregate.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-get an iterator over the vertices of the aggregate.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt\n-void init(const Matrix *matrix)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-UnSymmetricCriterion()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:544\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-const AggregateDescriptor * const_iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:723\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\bo_\bw_\b_\n-int row_\n-index of the currently evaluated row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:304\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bS_\bt_\ba_\bc_\bk\n-Stack(const MatrixGraph &graph, const Aggregator< G > &aggregatesBuilder, const\n-AggregatesMap< Vertex > &aggregates)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< field_type >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:180\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw\n-void initRow(const Row &row, int index)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-M Matrix\n-The matrix type we build the dependency of.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:139\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< field_type >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n-const Matrix * matrix_\n-The matrix we work on.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:177\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt\n-S VertexSet\n-The type of a single linked list of vertex descriptors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:801\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const\n-compute the norm of a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:490\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD\n-static const V UNAGGREGATED\n-Identifier of not yet aggregated vertices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:566\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh\n-std::size_t breadthFirstSearch(const VertexDescriptor &start, const\n-AggregateDescriptor &aggregate, const G &graph, F &aggregateVisitor, VM\n-&visitedMap) const\n-Breadth first search within an aggregate.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Matrix::field_type field_type\n-The current max value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:298\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bO_\bn_\be_\bW_\ba_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T >\n-&criterion)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n-bool isIsolated()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:240\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n-void allocate(std::size_t noVertices)\n-Allocate memory for holding the information.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bN_\bo_\br_\bm\n-N Norm\n-The norm to use for examining the matrix entries.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:144\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\bo_\bw_\bS_\bu_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const\n-compute the norm of a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:473\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\br_\be_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-void reconstruct(const Vertex &vertex)\n-Reconstruct the aggregat from an seed node.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-get an iterator over the vertices of the aggregate.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-FieldTraits< typenameM::field_type >::real_type operator()(const M &m, typename\n-std::enable_if_t::value > *sfinae=nullptr) const\n-compute the norm of a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:390\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-MatrixGraph::VertexDescriptor Vertex\n-The vertex descriptor type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:789\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bs_\be_\be_\bd\n-void seed(const Vertex &vertex)\n-Initialize the aggregate with one vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n-bool isIsolated()\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n-SymmetricDependency()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:351\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bc_\bl_\be_\ba_\br\n-void clear()\n-Clear the aggregate.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bf_\br_\be_\be\n-void free()\n-Free the allocated memory.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n-void increment()\n-Increment counter.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n-void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion,\n-bool finestLevel)\n-Build the dependency of the matrix graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-V VertexDescriptor\n-The vertex descriptor type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:575\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_\n-real_type maxValue_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:300\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs\n-std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph,\n-const C &criterion, bool finestLevel)\n-Build the aggregates.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bR_\bo_\bw\n-Matrix::row_type Row\n-Constant Row iterator of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:149\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n-PoolAllocator< Vertex, 100 > Allocator\n-The allocator we use for our lists and the set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:795\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-G MatrixGraph\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:785\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm_\b:_\b:_\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg\n-@ is_sign_preserving\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:483\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b:_\b:_\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg\n-@ is_sign_preserving\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:382\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm_\b:_\b:_\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg\n-@ is_sign_preserving\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:499\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\bo_\bw_\bS_\bu_\bm_\b:_\b:_\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg\n-@ is_sign_preserving\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:466\n+1065 {\n+1066#ifdef DUNE_ISTL_WITH_CHECKING\n+1067 if (i<0 || i>=_\bN()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"row index out of range\");\n+1068 if (j<0 || i>=_\bM()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"column index out of range\");\n+1069#endif\n+1070 return true;\n+1071 }\n+1072\n+1073 protected:\n+1074\n+_\b1_\b0_\b7_\b7 _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b<_\bT_\b,_\bA_\b> _\bd_\ba_\bt_\ba_\b_;\n+1078\n+_\b1_\b0_\b8_\b4 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bs_\b_;\n+1085 };\n+1086\n+1087 template\n+_\b1_\b0_\b8_\b8 struct FieldTraits< _\bM_\ba_\bt_\br_\bi_\bx >\n+1089 {\n+_\b1_\b0_\b9_\b0 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\b _\bA_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b1_\b0_\b9_\b1 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename FieldTraits::real_type;\n+1092 };\n+1093\n+1095} // end namespace Dune\n+1096\n+1097#endif\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n+Helper functions for determining the vector/matrix block level.\n+_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+This file implements a vector space as a tensor product of a given vector\n+space. The number of compon...\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A vector of blocks with memory management.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n derive error class from the base class in common\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be\n+A Vector of blocks with different blocksizes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bw_\bi_\bn_\bd_\bo_\bw_\b__\bt_\by_\bp_\be\n+Imp::BlockVectorWindow< B, A > window_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+BlockVector< B, A > block_type\n+Same as value_type, here for historical reasons.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+DenseMatrixBase & operator=(const DenseMatrixBase &a)\n+assignment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:182\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< B >::field_type field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+Iterator beforeBegin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:385\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(size_type rows, size_type columns)\n+same effect as constructor with same argument\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const window_type const_reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be\n+DenseMatrixBase(size_type rows, size_type columns)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\be_\bn_\bd\n+Iterator end()\n+end Iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:371\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+reference operator[](size_type i)\n+random access to blocks\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:241\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+BlockVector< B, A > value_type\n+Type of the elements of the outer vector, i.e., dynamic vectors of B.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bf_\bi_\bn_\bd\n+Iterator find(size_type i)\n+random access returning iterator (end if not contained)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:391\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bN\n+size_type N() const\n+number of blocks in the vector (are of variable size here)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:539\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+ConstIterator beforeEnd() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:525\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\be_\bn_\bd\n+ConstIterator end() const\n+end ConstIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:518\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+window_type reference\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\br_\be_\bn_\bd\n+ConstIterator rend() const\n+end ConstIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:531\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+Iterator beforeEnd()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:378\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+ConstIterator begin() const\n+begin ConstIterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:512\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n+A allocator_type\n+export the allocator type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be\n+DenseMatrixBase()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bf_\bi_\bn_\bd\n+ConstIterator find(size_type i) const\n+random access returning iterator (end if not contained)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:397\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+The size type for the index access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\b~_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be\n+~DenseMatrixBase()\n+free dynamic memory\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+Iterator begin()\n+begin Iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:365\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be\n+DenseMatrixBase(const DenseMatrixBase &a)\n+copy constructor, has copy semantics\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:263\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-\n+Iterator & operator--()\n+prefix decrement\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:308\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n+size_type index() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:352\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator(Iterator &other)=default\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator(Iterator &&other)=default\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const Iterator &it) const\n+inequality\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:322\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+Iterator & operator=(Iterator &&other)\n+Move assignment.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:282\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+Iterator & operator++()\n+prefix increment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:300\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator()\n+constructor, no arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:266\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+window_type & operator*() const\n+dereferencing\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:340\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const Iterator &it) const\n+equality\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:316\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+Iterator & operator=(Iterator &other)\n+Copy assignment.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:291\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator(B *data, size_type columns, size_type _i)\n+constructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:276\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>\n+window_type * operator->() const\n+arrow\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:346\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:404\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>\n+const window_type * operator->() const\n+arrow\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:487\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+const window_type & operator*() const\n+dereferencing\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:481\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+ConstIterator & operator++()\n+prefix increment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:441\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator(const B *data, size_type columns, size_type _i)\n+constructor from pointer\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:414\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b-\n+ConstIterator & operator--()\n+prefix decrement\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:449\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator(const Iterator &it)\n+constructor from non_const iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:420\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const ConstIterator &it) const\n+inequality\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:463\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator()\n+constructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:407\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const ConstIterator &it) const\n+equality\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:457\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n+size_type index() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:493\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+ConstIterator & operator=(Iterator &&other)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:424\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+ConstIterator & operator=(Iterator &other)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:432\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n A generic dynamic dense matrix.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bl_\bs_\b_\n+size_type cols_\n+Number of columns of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1084\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n+FieldTraits< ft >::real_type infinity_norm() const\n+infinity norm (row sum norm, how to generalize for blocks?)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:988\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n+A allocator_type\n+Export the allocator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:571\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n+FieldTraits< ft >::real_type infinity_norm_real() const\n+simplified infinity norm (uses Manhattan norm for complex values)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1007\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bh_\bv\n+void usmhv(const field_type &alpha, const X &x, Y &y) const\n+y += alpha A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:952\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bv\n+void usmv(const field_type &alpha, const X &x, Y &y) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:850\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+Type for indices and sizes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:577\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\ba_\bt_\ba_\b_\n+MatrixImp::DenseMatrixBase< T, A > data_\n+Abuse DenseMatrixBase as an engine for a 2d array ISTL-style.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1077\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bt_\br_\ba_\bn_\bs_\bp_\bo_\bs_\be\n+Matrix transpose() const\n+Return the transpose of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:741\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bt_\bv\n+void mtv(const X &x, Y &y) const\n+y = A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:803\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bv\n+void umv(const X &x, Y &y) const\n+y += A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:816\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n+void mv(const X &x, Y &y) const\n+y = A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:784\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+MatrixImp::DenseMatrixBase< T, A >::ConstIterator ConstRowIterator\n+Const iterator over the matrix rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:586\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n+void setSize(size_type rows, size_type cols)\n+Change the matrix size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:604\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+RowIterator beforeBegin()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:630\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+RowIterator beforeEnd()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:623\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+Matrix()\n+Create empty matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:592\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n+Matrix & operator-=(const Matrix &b)\n+Subtract the entries of another matrix from this one.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:731\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2\n+FieldTraits< field_type >::real_type frobenius_norm2() const\n+square of frobenius norm, need for block recursion\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:976\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::iterator ColIterator\n+Iterator for the entries of each row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:583\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n+ConstRowIterator beforeEnd() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:649\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+Matrix & operator=(const field_type &t)\n+Assignment from scalar.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:662\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+RowIterator end()\n+Get iterator to one beyond last row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:616\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const row_type operator[](size_type row) const\n+The const index operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:680\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+ConstRowIterator end() const\n+Get const iterator to one beyond last row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:642\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+friend Y operator*(const Matrix< T > &m, const X &vec)\n+Generic matrix-vector multiplication.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:766\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n+Matrix< T > & operator*=(const field_type &scalar)\n+Multiplication with a scalar.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:701\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+row_type operator[](size_type row)\n+The index operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:669\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bv\n+void mmv(const X &x, Y &y) const\n+y -= A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:833\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n+Matrix & operator+=(const Matrix &b)\n+Add the entries of another matrix to this one.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:717\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+ConstRowIterator begin() const\n+Get const iterator to first row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:636\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bh_\bv\n+void mmhv(const X &x, Y &y) const\n+y -= A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:935\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+RowIterator begin()\n+Get iterator to first row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:610\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n typename Imp::BlockTraits< T >::field_type field_type\n Export the type representing the underlying field.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:565\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n row_type::const_iterator ConstColIterator\n Const iterator for the entries of each row.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:589\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+size_type M() const\n+Return the number of columns.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:696\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+T block_type\n+Export the type representing the components.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:568\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n+bool exists(size_type i, size_type j) const\n+return true if (i,j) is in pattern\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1064\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n+Matrix< T > & operator/=(const field_type &scalar)\n+Division by a scalar.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:707\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+friend Matrix< T > operator*(const Matrix< T > &m1, const Matrix< T > &m2)\n+Generic matrix multiplication.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:751\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bt_\bv\n+void umtv(const X &x, Y &y) const\n+y += A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:867\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bt_\bv\n+void mmtv(const X &x, Y &y) const\n+y -= A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:884\n _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n MatrixImp::DenseMatrixBase< T, A >::window_type row_type\n The type implementing a matrix row.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:574\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-Base class of all aggregation criterions.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n-Dependency policy for symmetric matrices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:134\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n-Dependency policy for symmetric matrices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:253\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n-Dependency policy for symmetric matrices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:314\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n-Norm that uses only the [N][N] entry of the block to determine couplings.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:379\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\bi_\br_\bs_\bt_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n-Norm that uses only the [0][0] entry of the block to determine couplings.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:455\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\bo_\bw_\bS_\bu_\bm\n-Functor using the row sum (infinity) norm to determine strong couplings.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:463\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:480\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:496\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-Criterion taking advantage of symmetric matrices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:519\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-Criterion suitable for unsymmetric matrices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:539\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br\n-Class for building the aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:909\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-Class providing information about the mapping of the vertices onto aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-A Dummy visitor that does nothing for each visited edge.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:598\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n-A class for temporarily storing the vertices of an aggregate in.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:778\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-M::size_type VertexDescriptor\n-The vertex descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator\n-The constant edge iterator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:298\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-Iterator over all edges starting from a vertex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-The vertex iterator type of the graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:209\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-All parameters for AMG.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm\n+FieldTraits< field_type >::real_type frobenius_norm() const\n+frobenius norm: sqrt(sum over squared values of entries)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:970\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bt_\bv\n+void usmtv(const field_type &alpha, const X &x, Y &y) const\n+y += alpha A^T x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:901\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bh_\bv\n+void umhv(const X &x, Y &y) const\n+y += A^H x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:918\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+size_type N() const\n+Return the number of rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:691\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n+ConstRowIterator beforeBegin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:656\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+Matrix(size_type rows, size_type cols)\n+Create uninitialized matrix of size rows x cols.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:597\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+MatrixImp::DenseMatrixBase< T, A >::Iterator RowIterator\n+Iterator over the matrix rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:580\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Matrix< T, A >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1090\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+typename FieldTraits< field_type >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:1091\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00113.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00113.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: graph.hh File Reference\n+dune-istl: dilu.hh File Reference\n \n \n \n \n \n \n \n@@ -65,100 +65,56 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n- \n+
    dilu.hh File Reference
    \n
    \n
    \n \n-

    Provides classes for building the matrix graph. \n+

    The diagonal incomplete LU factorization kernels. \n More...

    \n-
    #include <cstddef>
    \n-#include <algorithm>
    \n+
    #include <cmath>
    \n+#include <complex>
    \n+#include <map>
    \n #include <vector>
    \n-#include <cassert>
    \n-#include <limits>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/iteratorfacades.hh>
    \n-#include <dune/istl/istlexception.hh>
    \n-#include <dune/common/propertymap.hh>
    \n+#include <dune/common/fmatrix.hh>
    \n+#include <dune/common/scalarvectorview.hh>
    \n+#include <dune/common/scalarmatrixview.hh>
    \n+#include "istlexception.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::Amg::MatrixGraph< M >
     The (undirected) graph of a matrix. More...
     
    class  Dune::Amg::MatrixGraph< M >::EdgeIteratorT< C >
     Iterator over all edges starting from a vertex. More...
     
    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...
     
    \n \n \n \n-\n+\n \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
    namespace  Dune::DILU
     
    \n \n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n

    \n 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.
     
    template<class M >
    void Dune::DILU::blockDILUDecomposition (M &A, std::vector< typename M::block_type > &Dinv_)
     
    template<class M , class X , class Y >
    void Dune::DILU::blockDILUBacksolve (const M &A, const std::vector< typename M::block_type > Dinv_, X &v, const Y &d)
     
    \n

    Detailed Description

    \n-

    Provides classes for building the matrix graph.

    \n-
    Author
    Markus Blatt
    \n-

    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.

    \n+

    The diagonal incomplete LU factorization kernels.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,85 +1,36 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-graph.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Provides classes for building the matrix graph. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+dilu.hh File Reference\n+The diagonal incomplete LU factorization kernels. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n #include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include \n+#include \n+#include \n+#include \n+#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\b _\bM_\b _\b>\n-\u00a0 The (undirected) graph of a matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\b _\bM_\b _\b>_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\b _\bC_\b _\b>\n-\u00a0 Iterator over all edges starting from a vertex. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\b _\bM_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\b _\bC_\b _\b>\n-\u00a0 The vertex iterator type of the graph. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bT_\b _\b>\n-\u00a0 A subgraph of a graph. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bT_\b _\b>_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-\u00a0 An index map for mapping the edges to indices. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bT_\b _\b>_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-\u00a0 The edge iterator of the graph. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bT_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-\u00a0 The vertex iterator of the graph. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bV_\bP_\b,_\b _\bV_\bM_\b _\b>\n-\u00a0 Attaches properties to the vertices of a graph. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bV_\bP_\b,_\b _\bV_\bM_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\b _\bC_\b _\b>\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bV_\bP_\b,_\b _\bE_\bP_\b,_\b _\bV_\bM_\b,_\b _\bE_\bM_\b _\b>\n-\u00a0 Attaches properties to the edges and vertices of a graph. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bV_\bP_\b,_\b _\bE_\bP_\b,_\b _\bV_\bM_\b,_\b _\bE_\bM_\b _\b>_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\b _\bC_\b _\b>\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bV_\bP_\b,_\b _\bE_\bP_\b,_\b _\bV_\bM_\b,_\b _\bE_\bM_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\b _\bC_\b _\b>\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bG_\b _\b>\n-\u00a0 Wrapper to access the internal edge properties of a graph via _\bo_\bp_\be_\br_\ba_\bt_\bo_\br\n- _\b[_\b]_\b(_\b) _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bG_\b _\b>\n-\u00a0 Wrapper to access the internal vertex properties of a graph via\n- _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b(_\b) _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-int\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs (const G &graph, const typename G::\n- VertexDescriptor &vertex, V &visitor)\n-\u00a0 Visit all neighbour vertices of a vertex in a graph.\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn (M &A, std::vector< typename M::\n+ block_type > &Dinv_)\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const M &A, const std::vector< typename\n+ M::block_type > Dinv_, X &v, const Y &d)\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides classes for building the matrix graph.\n- Author\n- Markus Blatt\n-During the coarsening process in AMG the matrix graph together with the\n-dependencies, what connections in the graph are considered strong or weak, what\n-vertices are isolated, etc., have to build. This information will be contained\n-in the MatrixGraph class.\n+The diagonal incomplete LU factorization kernels.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00113_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00113_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: graph.hh Source File\n+dune-istl: dilu.hh Source File\n \n \n \n \n \n \n \n@@ -70,1825 +70,150 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    graph.hh
    \n+
    dilu.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_GRAPH_HH
    \n-
    6#define DUNE_AMG_GRAPH_HH
    \n+
    5#ifndef DUNE_ISTL_DILU_HH
    \n+
    6#define DUNE_ISTL_DILU_HH
    \n
    7
    \n-
    8#include <cstddef>
    \n-
    9#include <algorithm>
    \n-
    10#include <vector>
    \n-
    11#include <cassert>
    \n-
    12#include <limits>
    \n-
    13#include <dune/common/typetraits.hh>
    \n-
    14#include <dune/common/iteratorfacades.hh>
    \n-\n-
    16#include <dune/common/propertymap.hh>
    \n-
    17
    \n-
    18namespace Dune
    \n-
    19{
    \n-
    20 namespace Amg
    \n-
    21 {
    \n-
    49 template<class M>
    \n-
    \n-\n-
    51 {
    \n-
    52 public:
    \n-
    56 typedef M Matrix;
    \n-
    57
    \n-
    61 typedef typename std::remove_const<M>::type MutableMatrix;
    \n-
    62
    \n-
    66 typedef typename M::block_type Weight;
    \n-
    67
    \n-
    73 typedef typename M::size_type VertexDescriptor;
    \n-
    74
    \n-
    80 typedef std::ptrdiff_t EdgeDescriptor;
    \n-
    81
    \n-
    82 enum {
    \n-
    83 /*
    \n-
    84 * @brief Whether Matrix is mutable.
    \n-
    85 */
    \n-
    86 mutableMatrix = std::is_same<M, typename std::remove_const<M>::type>::value
    \n-
    87 };
    \n-
    88
    \n-
    89
    \n-
    93 template<class C>
    \n-
    \n-\n-
    95 {
    \n-
    96
    \n-
    97 public:
    \n-
    101 typedef typename std::remove_const<C>::type MutableContainer;
    \n-
    105 typedef const typename std::remove_const<C>::type ConstContainer;
    \n-
    106
    \n-
    107 friend class EdgeIteratorT<MutableContainer>;
    \n-
    108 friend class EdgeIteratorT<ConstContainer>;
    \n-
    109
    \n-
    110 enum {
    \n-
    112 isMutable = std::is_same<C, MutableContainer>::value
    \n-
    113 };
    \n-
    114
    \n-
    118 typedef typename std::conditional<isMutable && C::mutableMatrix,typename Matrix::row_type::Iterator,
    \n-
    119 typename Matrix::row_type::ConstIterator>::type
    \n-\n-
    121
    \n-
    125 typedef typename std::conditional<isMutable && C::mutableMatrix,typename M::block_type,
    \n-
    126 const typename M::block_type>::type
    \n-\n-
    128
    \n-\n-
    137 const ColIterator& end, const EdgeDescriptor& edge);
    \n-
    138
    \n-\n-
    146
    \n-
    151 template<class C1>
    \n-\n-
    153
    \n-
    154 typedef typename std::conditional<std::is_same<C, typename std::remove_const<C>::type>::value && C::mutableMatrix,
    \n-
    155 typename M::block_type, const typename M::block_type>::type
    \n-\n-
    157
    \n-\n-
    162
    \n-\n-
    165
    \n-
    167 bool operator!=(const EdgeIteratorT<typename std::remove_const<C>::type>& other) const;
    \n-
    168
    \n-
    170 bool operator!=(const EdgeIteratorT<const typename std::remove_const<C>::type>& other) const;
    \n-
    171
    \n-
    173 bool operator==(const EdgeIteratorT<typename std::remove_const<C>::type>& other) const;
    \n-
    174
    \n-
    176 bool operator==(const EdgeIteratorT<const typename std::remove_const<C>::type>& other) const;
    \n-
    177
    \n-\n-
    180
    \n-\n-
    183
    \n-
    185 const EdgeDescriptor& operator*() const;
    \n-
    186
    \n-\n-
    189
    \n-
    190 private:
    \n-
    192 VertexDescriptor source_;
    \n-
    194 ColIterator block_;
    \n-
    195 /***
    \n-
    196 * @brief The column iterator positioned at the end of the row
    \n-
    197 * of vertex source_
    \n-
    198 */
    \n-
    199 ColIterator blockEnd_;
    \n-
    201 EdgeDescriptor edge_;
    \n-
    202 };
    \n-
    \n-
    203
    \n-
    207 template<class C>
    \n-
    \n-\n-
    209 {
    \n-
    210 public:
    \n-
    214 typedef typename std::remove_const<C>::type MutableContainer;
    \n-
    218 typedef const typename std::remove_const<C>::type ConstContainer;
    \n-
    219
    \n-
    220 friend class VertexIteratorT<MutableContainer>;
    \n-
    221 friend class VertexIteratorT<ConstContainer>;
    \n-
    222
    \n-
    223 enum {
    \n-
    225 isMutable = std::is_same<C, MutableContainer>::value
    \n-
    226 };
    \n-
    227
    \n-
    233 explicit VertexIteratorT(C* graph, const VertexDescriptor& current);
    \n-
    234
    \n-
    242 explicit VertexIteratorT(const VertexDescriptor& current);
    \n-
    243
    \n-\n-
    245
    \n-\n-
    251
    \n-\n-
    254
    \n-\n-
    257
    \n-\n-
    260
    \n-\n-
    263
    \n-
    264 typedef typename std::conditional<std::is_same<C, typename std::remove_const<C>::type>::value && C::mutableMatrix,
    \n-
    265 typename M::block_type, const typename M::block_type>::type
    \n-\n-\n-
    269
    \n-\n-
    275
    \n-\n-
    282
    \n-\n-
    289
    \n-
    290 private:
    \n-
    291 C* graph_;
    \n-
    292 VertexDescriptor current_;
    \n-
    293 };
    \n-
    \n-
    294
    \n-\n-
    299
    \n-\n-
    304
    \n-\n-
    309
    \n-\n-
    314
    \n-\n-
    320
    \n-\n-
    325
    \n-\n-
    331
    \n-\n-
    337
    \n-\n-
    343
    \n-\n-
    349
    \n-\n-
    357
    \n-\n-
    365
    \n-
    366
    \n-\n-
    374
    \n-\n-
    382
    \n-\n-
    388
    \n-
    393 const Matrix& matrix() const;
    \n-
    394
    \n-
    398 std::size_t noVertices() const;
    \n-
    399
    \n-\n-
    407
    \n-
    411 std::size_t noEdges() const;
    \n-
    412
    \n-\n-
    420 const VertexDescriptor& target) const;
    \n-
    421
    \n-
    422 private:
    \n-
    424 Matrix& matrix_;
    \n-
    426 EdgeDescriptor* start_;
    \n-
    428 MatrixGraph(const MatrixGraph&);
    \n-
    429
    \n-
    430 };
    \n-
    \n-
    431
    \n-
    441 template<class G, class T>
    \n-
    \n-\n-
    443 {
    \n-
    444 public:
    \n-
    448 typedef G Graph;
    \n-
    449
    \n-
    454 typedef T Excluded;
    \n-
    455
    \n-
    459 typedef typename Graph::VertexDescriptor VertexDescriptor;
    \n-
    460
    \n-\n-
    462
    \n-
    \n-\n-
    470 {
    \n-
    471 public:
    \n-
    472 typedef ReadablePropertyMapTag Category;
    \n-
    473
    \n-
    \n-
    474 EdgeIndexMap(const EdgeDescriptor& firstEdge)
    \n-
    475 : firstEdge_(firstEdge)
    \n-
    476 {}
    \n-
    \n-
    477
    \n-
    \n-\n-
    480 : firstEdge_(emap.firstEdge_)
    \n-
    481 {}
    \n-
    \n-
    482
    \n-
    \n-
    483 std::size_t operator[](const EdgeDescriptor& edge) const
    \n-
    484 {
    \n-
    485 return edge-firstEdge_;
    \n-
    486 }
    \n-
    \n-
    487 private:
    \n-
    489 EdgeDescriptor firstEdge_;
    \n-\n-
    492 {}
    \n-
    493 };
    \n-
    \n-
    494
    \n-\n-
    500
    \n-
    \n-
    504 class EdgeIterator : public RandomAccessIteratorFacade<EdgeIterator,const EdgeDescriptor>
    \n-
    505 {
    \n-
    506 public:
    \n-
    512 explicit EdgeIterator(const VertexDescriptor& source, const EdgeDescriptor& edge);
    \n-
    513
    \n-
    521 explicit EdgeIterator(const EdgeDescriptor& edge);
    \n-
    522
    \n-
    524 bool equals(const EdgeIterator& other) const;
    \n-
    525
    \n-\n-
    528
    \n-\n-
    531
    \n-
    532 EdgeIterator& advance(std::ptrdiff_t n);
    \n-
    533
    \n-\n-
    536
    \n-
    538 const VertexDescriptor& target() const;
    \n-
    539
    \n-
    541 const VertexDescriptor& source() const;
    \n-
    542
    \n-
    543 std::ptrdiff_t distanceTo(const EdgeIterator& other) const;
    \n-
    544
    \n-
    545 private:
    \n-
    547 VertexDescriptor source_;
    \n-
    552 EdgeDescriptor edge_;
    \n-
    553 };
    \n-
    \n-
    554
    \n-
    \n-\n-
    559 : public ForwardIteratorFacade<VertexIterator,const VertexDescriptor>
    \n-
    560 {
    \n-
    561 public:
    \n-
    568 explicit VertexIterator(const SubGraph<G,T>* graph, const VertexDescriptor& current,
    \n-
    569 const VertexDescriptor& end);
    \n-
    570
    \n-
    571
    \n-
    578 explicit VertexIterator(const VertexDescriptor& current);
    \n-
    579
    \n-\n-
    582
    \n-
    584 bool equals(const VertexIterator& other) const;
    \n-
    585
    \n-\n-
    591
    \n-\n-
    598
    \n-\n-
    605
    \n-
    606 private:
    \n-
    608 const SubGraph<Graph,T>* graph_;
    \n-
    610 VertexDescriptor current_;
    \n-
    612 VertexDescriptor end_;
    \n-
    613 };
    \n-
    \n-
    614
    \n-\n-
    619
    \n-\n-
    624
    \n-\n-
    630
    \n-\n-
    636
    \n-\n-
    644
    \n-\n-
    652
    \n-
    656 std::size_t noVertices() const;
    \n-
    657
    \n-\n-
    665
    \n-
    669 std::size_t noEdges() const;
    \n-\n-
    677 const VertexDescriptor& target) const;
    \n-
    685 SubGraph(const Graph& graph, const T& excluded);
    \n-
    686
    \n-\n-
    691
    \n-
    692 private:
    \n-
    694 const T& excluded_;
    \n-
    696 std::size_t noVertices_;
    \n-
    698 VertexDescriptor endVertex_;
    \n-
    700 int noEdges_;
    \n-
    705 VertexDescriptor maxVertex_;
    \n-
    707 VertexDescriptor* edges_;
    \n-
    709 std::ptrdiff_t* start_;
    \n-
    711 std::ptrdiff_t* end_;
    \n-
    713 SubGraph(const SubGraph&)
    \n-
    714 {}
    \n-
    715 };
    \n-
    \n-
    716
    \n-
    717
    \n-
    721 template<class G, class VP, class VM=IdentityMap>
    \n-
    \n-\n-
    723 {
    \n-
    724 public:
    \n-
    728 typedef G Graph;
    \n-
    729
    \n-
    733 typedef typename Graph::VertexDescriptor VertexDescriptor;
    \n-
    734
    \n-
    738 typedef typename Graph::EdgeDescriptor EdgeDescriptor;
    \n-
    739
    \n-\n-
    744
    \n-
    756 typedef VM VertexMap;
    \n-
    757
    \n-
    761 typedef typename Graph::EdgeIterator EdgeIterator;
    \n-
    762
    \n-
    766 typedef typename Graph::ConstEdgeIterator ConstEdgeIterator;
    \n-
    767
    \n-\n-
    774
    \n-\n-
    781
    \n-\n-
    788
    \n-\n-
    795
    \n-
    796
    \n-
    797 template<class C>
    \n-
    \n-\n-
    799 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n-
    800 C>::value,
    \n-
    801 typename Graph::VertexIterator,
    \n-
    802 typename Graph::ConstVertexIterator>::type
    \n-
    803 {
    \n-
    804 friend class VertexIteratorT<const typename std::remove_const<C>::type>;
    \n-
    805 friend class VertexIteratorT<typename std::remove_const<C>::type>;
    \n-
    806 public:
    \n-
    810 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n-
    811 C>::value,
    \n-
    812 typename Graph::VertexIterator,
    \n-
    813 typename Graph::ConstVertexIterator>::type
    \n-\n-
    815
    \n-
    819 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n-
    820 C>::value,
    \n-
    821 typename Graph::EdgeIterator,
    \n-
    822 typename Graph::ConstEdgeIterator>::type
    \n-\n-
    824
    \n-
    830 explicit VertexIteratorT(const Father& iter,
    \n-
    831 C* graph);
    \n-
    832
    \n-
    833
    \n-
    841 explicit VertexIteratorT(const Father& iter);
    \n-
    842
    \n-
    847 template<class C1>
    \n-
    848 VertexIteratorT(const VertexIteratorT<C1>& other);
    \n-
    849
    \n-
    853 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
    \n-
    854 VertexProperties&,
    \n-
    855 const VertexProperties&>::type
    \n-
    856 properties() const;
    \n-
    857
    \n-\n-
    864
    \n-\n-
    871
    \n-
    872 private:
    \n-
    876 C* graph_;
    \n-
    877 };
    \n-
    \n-
    878
    \n-
    882 typedef VertexIteratorT<VertexPropertiesGraph<Graph,
    \n-
    883 VertexProperties,VM> > VertexIterator;
    \n-
    884
    \n-
    888 typedef VertexIteratorT<const VertexPropertiesGraph<Graph,
    \n-
    889 VertexProperties,VM> > ConstVertexIterator;
    \n-
    890
    \n-\n-
    896
    \n-\n-
    902
    \n-\n-
    908
    \n-\n-
    914
    \n-
    920 VertexProperties& getVertexProperties(const VertexDescriptor& vertex);
    \n-
    921
    \n-
    927 const VertexProperties& getVertexProperties(const VertexDescriptor& vertex) const;
    \n-
    928
    \n-
    933 const Graph& graph() const;
    \n-
    934
    \n-
    938 std::size_t noVertices() const;
    \n-
    939
    \n-
    943 std::size_t noEdges() const;
    \n-
    944
    \n-\n-
    952
    \n-
    958 VertexPropertiesGraph(Graph& graph, const VertexMap vmap=VertexMap());
    \n-
    959
    \n-
    960 private:
    \n-
    961 VertexPropertiesGraph(const VertexPropertiesGraph&)
    \n-
    962 {}
    \n-
    963
    \n-
    965 Graph& graph_;
    \n-
    967 VertexMap vmap_;
    \n-
    969 std::vector<VertexProperties> vertexProperties_;
    \n-
    970
    \n-
    971 };
    \n-
    \n-
    972
    \n-
    976 template<class G, class VP, class EP, class VM=IdentityMap, class EM=IdentityMap>
    \n-
    \n-\n-
    978 {
    \n-
    979 public:
    \n-
    983 typedef G Graph;
    \n-
    984
    \n-
    988 typedef typename Graph::VertexDescriptor VertexDescriptor;
    \n-
    989
    \n-
    993 typedef typename Graph::EdgeDescriptor EdgeDescriptor;
    \n-
    994
    \n-\n-
    999
    \n-
    1011 typedef VM VertexMap;
    \n-
    1012
    \n-
    1016 typedef EP EdgeProperties;
    \n-
    1017
    \n-
    1018
    \n-
    1030 typedef EM EdgeMap;
    \n-
    1031
    \n-
    1032 template<class C>
    \n-
    \n-\n-
    1034 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n-
    1035 C>::value,
    \n-
    1036 typename Graph::EdgeIterator,
    \n-
    1037 typename Graph::ConstEdgeIterator>::type
    \n-
    1038 {
    \n-
    1039
    \n-
    1040 friend class EdgeIteratorT<const typename std::remove_const<C>::type>;
    \n-
    1041 friend class EdgeIteratorT<typename std::remove_const<C>::type>;
    \n-
    1042 public:
    \n-
    1046 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n-
    1047 C>::value,
    \n-
    1048 typename Graph::EdgeIterator,
    \n-
    1049 typename Graph::ConstEdgeIterator>::type
    \n-\n-
    1051
    \n-
    1057 explicit EdgeIteratorT(const Father& iter,
    \n-
    1058 C* graph);
    \n-
    1059
    \n-
    1067 explicit EdgeIteratorT(const Father& iter);
    \n-
    1068
    \n-
    1073 template<class C1>
    \n-
    1074 EdgeIteratorT(const EdgeIteratorT<C1>& other);
    \n-
    1075
    \n-
    1079 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
    \n-
    1080 EdgeProperties&,
    \n-
    1081 const EdgeProperties&>::type
    \n-
    1082 properties() const;
    \n-
    1083
    \n-
    1084 private:
    \n-
    1088 C* graph_;
    \n-
    1089 };
    \n-
    \n-
    1090
    \n-
    1094 typedef EdgeIteratorT<PropertiesGraph<Graph,
    \n-
    1095 VertexProperties,
    \n-
    1096 EdgeProperties,VM,EM> > EdgeIterator;
    \n-
    1097
    \n-
    1101 typedef EdgeIteratorT<const PropertiesGraph<Graph,
    \n-
    1102 VertexProperties,
    \n-
    1103 EdgeProperties,VM,EM> > ConstEdgeIterator;
    \n-
    1104
    \n-
    1110 EdgeIterator beginEdges(const VertexDescriptor& source);
    \n-
    1111
    \n-
    1117 EdgeIterator endEdges(const VertexDescriptor& source);
    \n-
    1118
    \n-
    1124 ConstEdgeIterator beginEdges(const VertexDescriptor& source) const;
    \n-
    1125
    \n-
    1131 ConstEdgeIterator endEdges(const VertexDescriptor& source) const;
    \n-
    1132
    \n-
    1133
    \n-
    1134 template<class C>
    \n-
    \n-\n-
    1136 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n-
    1137 C>::value,
    \n-
    1138 typename Graph::VertexIterator,
    \n-
    1139 typename Graph::ConstVertexIterator>::type
    \n-
    1140 {
    \n-
    1141 friend class VertexIteratorT<const typename std::remove_const<C>::type>;
    \n-
    1142 friend class VertexIteratorT<typename std::remove_const<C>::type>;
    \n-
    1143 public:
    \n-
    1147 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n-
    1148 C>::value,
    \n-
    1149 typename Graph::VertexIterator,
    \n-
    1150 typename Graph::ConstVertexIterator>::type
    \n-\n-
    1152
    \n-
    1158 explicit VertexIteratorT(const Father& iter,
    \n-
    1159 C* graph);
    \n-
    1160
    \n-
    1161
    \n-
    1169 explicit VertexIteratorT(const Father& iter);
    \n-
    1170
    \n-
    1175 template<class C1>
    \n-
    1176 VertexIteratorT(const VertexIteratorT<C1>& other);
    \n-
    1177
    \n-
    1181 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
    \n-
    1182 VertexProperties&,
    \n-
    1183 const VertexProperties&>::type
    \n-
    1184 properties() const;
    \n-
    1185
    \n-
    1191 EdgeIteratorT<C> begin() const;
    \n-
    1192
    \n-
    1198 EdgeIteratorT<C> end() const;
    \n-
    1199
    \n-
    1200 private:
    \n-
    1204 C* graph_;
    \n-
    1205 };
    \n-
    \n-
    1206
    \n-
    1210 typedef VertexIteratorT<PropertiesGraph<Graph,
    \n-
    1211 VertexProperties,
    \n-
    1212 EdgeProperties,VM,EM> > VertexIterator;
    \n-
    1213
    \n-
    1217 typedef VertexIteratorT<const PropertiesGraph<Graph,
    \n-
    1218 VertexProperties,
    \n-
    1219 EdgeProperties,VM,EM> > ConstVertexIterator;
    \n-
    1220
    \n-\n-
    1226
    \n-\n-
    1232
    \n-
    1237 ConstVertexIterator begin() const;
    \n-
    1238
    \n-\n-
    1244
    \n-
    1250 VertexProperties& getVertexProperties(const VertexDescriptor& vertex);
    \n-
    1251
    \n-
    1257 const VertexProperties& getVertexProperties(const VertexDescriptor& vertex) const;
    \n-
    1258
    \n-
    \n-
    1265 EdgeDescriptor findEdge(const VertexDescriptor& source,
    \n-
    1266 const VertexDescriptor& target)
    \n-
    1267 {
    \n-
    1268 return graph_.findEdge(source,target);
    \n-
    1269 }
    \n-
    \n-
    1270
    \n-\n-
    1277
    \n-
    1278
    \n-\n-
    1285
    \n-\n-
    1293 const VertexDescriptor& target);
    \n-
    1294
    \n-\n-
    1302 const VertexDescriptor& target) const;
    \n-
    1303
    \n-
    1308 const Graph& graph() const;
    \n-
    1309
    \n-
    1313 std::size_t noVertices() const;
    \n-
    1314
    \n-
    1318 std::size_t noEdges() const;
    \n-
    1319
    \n-\n-
    1327
    \n-\n-
    1335 const EdgeMap& emap=EdgeMap());
    \n-
    1336
    \n-
    1337 private:
    \n-\n-
    1339 {}
    \n-
    1340
    \n-
    1342 Graph& graph_;
    \n-
    1345 VertexMap vmap_;
    \n-
    1346 std::vector<VertexProperties> vertexProperties_;
    \n-
    1348 EdgeMap emap_;
    \n-
    1350 std::vector<EdgeProperties> edgeProperties_;
    \n-
    1351
    \n-
    1352 };
    \n-
    \n-
    1353
    \n-
    1354
    \n-
    1359 template<typename G>
    \n-
    \n-\n-
    1361 {
    \n-
    1362 public:
    \n-
    1366 typedef G Graph;
    \n-
    1370 typedef typename G::VertexProperties VertexProperties;
    \n-
    1374 typedef typename G::VertexDescriptor Vertex;
    \n-
    1375
    \n-
    \n-\n-
    1381 : graph_(g)
    \n-
    1382 {}
    \n-
    \n-
    \n-\n-
    1387 : graph_(0)
    \n-
    1388 {}
    \n-
    \n-
    1389
    \n-
    1390
    \n-
    \n-
    1395 VertexProperties& operator[](const Vertex& vertex) const
    \n-
    1396 {
    \n-
    1397 return graph_->getVertexProperties(vertex);
    \n-
    1398 }
    \n-
    \n-
    1399 private:
    \n-
    1400 Graph* graph_;
    \n-
    1401 };
    \n-
    \n-
    1402
    \n-
    1407 template<typename G>
    \n-
    \n-\n-
    1409 {
    \n-
    1410 public:
    \n-
    1414 typedef G Graph;
    \n-
    1418 typedef typename G::EdgeProperties EdgeProperties;
    \n-
    1422 typedef typename G::EdgeDescriptor Edge;
    \n-
    1423
    \n-
    \n-\n-
    1429 : graph_(g)
    \n-
    1430 {}
    \n-
    \n-
    \n-\n-
    1435 : graph_(0)
    \n-
    1436 {}
    \n-
    \n-
    1437
    \n-
    \n-
    1442 EdgeProperties& operator[](const Edge& edge) const
    \n-
    1443 {
    \n-
    1444 return graph_->getEdgeProperties(edge);
    \n-
    1445 }
    \n-
    \n-
    1446 private:
    \n-
    1447 Graph* graph_;
    \n-
    1448 };
    \n-
    \n-
    1449
    \n-
    1450
    \n-
    1461 template<class G, class V>
    \n-
    1462 int visitNeighbours(const G& graph, const typename G::VertexDescriptor& vertex,
    \n-
    1463 V& visitor);
    \n-
    1464
    \n-
    1465#ifndef DOXYGEN
    \n-
    1466
    \n-
    1467 template<class M>
    \n-\n-
    1469 : matrix_(matrix)
    \n-
    1470 {
    \n-
    1471 if(matrix_.N()!=matrix_.M())
    \n-
    1472 DUNE_THROW(ISTLError, "Matrix has to have as many columns as rows!");
    \n-
    1473
    \n-
    1474 start_ = new EdgeDescriptor[matrix_.N()+1];
    \n-
    1475
    \n-
    1476 typedef typename M::ConstIterator Iterator;
    \n-
    1477 start_[matrix_.begin().index()] = 0;
    \n-
    1478
    \n-
    1479 for(Iterator row=matrix_.begin(); row != matrix_.end(); ++row)
    \n-
    1480 start_[row.index()+1] = start_[row.index()] + row->size();
    \n-
    1481 }
    \n-
    1482
    \n-
    1483 template<class M>
    \n-
    1484 MatrixGraph<M>::~MatrixGraph()
    \n-
    1485 {
    \n-
    1486 delete[] start_;
    \n-
    1487 }
    \n-
    1488
    \n-
    1489 template<class M>
    \n-
    1490 inline std::size_t MatrixGraph<M>::noEdges() const
    \n-
    1491 {
    \n-
    1492 return start_[matrix_.N()];
    \n-
    1493 }
    \n-
    1494
    \n-
    1495 template<class M>
    \n-
    1496 inline std::size_t MatrixGraph<M>::noVertices() const
    \n-
    1497 {
    \n-
    1498 return matrix_.N();
    \n-
    1499 }
    \n-
    1500
    \n-
    1501 template<class M>
    \n-
    1502 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::maxVertex() const
    \n-
    1503 {
    \n-
    1504 return matrix_.N()-1;
    \n-
    1505 }
    \n-
    1506
    \n-
    1507 template<class M>
    \n-
    1508 typename MatrixGraph<M>::EdgeDescriptor
    \n-
    1509 MatrixGraph<M>::findEdge(const VertexDescriptor& source,
    \n-
    1510 const VertexDescriptor& target) const
    \n-
    1511 {
    \n-
    1512 typename M::ConstColIterator found =matrix_[source].find(target);
    \n-
    1513 if(found == matrix_[source].end())
    \n-
    1514 return std::numeric_limits<EdgeDescriptor>::max();
    \n-
    1515 std::size_t offset = found.offset();
    \n-
    1516 if(target>source)
    \n-
    1517 offset--;
    \n-
    1518
    \n-
    1519 assert(offset<noEdges());
    \n-
    1520
    \n-
    1521 return start_[source]+offset;
    \n-
    1522 }
    \n-
    1523
    \n-
    1524
    \n-
    1525 template<class M>
    \n-
    1526 inline M& MatrixGraph<M>::matrix()
    \n-
    1527 {
    \n-
    1528 return matrix_;
    \n-
    1529 }
    \n-
    1530
    \n-
    1531 template<class M>
    \n-
    1532 inline const M& MatrixGraph<M>::matrix() const
    \n-
    1533 {
    \n-
    1534 return matrix_;
    \n-
    1535 }
    \n-
    1536
    \n-
    1537 template<class M>
    \n-
    1538 template<class C>
    \n-
    1539 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const VertexDescriptor& source, const ColIterator& block,
    \n-
    1540 const ColIterator& end, const EdgeDescriptor& edge)
    \n-
    1541 : source_(source), block_(block), blockEnd_(end), edge_(edge)
    \n-
    1542 {
    \n-
    1543 if(block_!=blockEnd_ && block_.index() == source_) {
    \n-
    1544 // This is the edge from the diagonal to the diagonal. Skip it.
    \n-
    1545 ++block_;
    \n-
    1546 }
    \n-
    1547 }
    \n-
    1548
    \n-
    1549 template<class M>
    \n-
    1550 template<class C>
    \n-
    1551 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const ColIterator& block)
    \n-
    1552 : block_(block)
    \n-
    1553 {}
    \n-
    1554
    \n-
    1555 template<class M>
    \n-
    1556 template<class C>
    \n-
    1557 template<class C1>
    \n-
    1558 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const EdgeIteratorT<C1>& other)
    \n-
    1559 : source_(other.source_), block_(other.block_), blockEnd_(other.blockEnd_), edge_(other.edge_)
    \n-
    1560 {}
    \n-
    1561
    \n-
    1562
    \n-
    1563 template<class M>
    \n-
    1564 template<class C>
    \n-
    1565 inline typename MatrixGraph<M>::template EdgeIteratorT<C>::WeightType&
    \n-
    1566 MatrixGraph<M>::EdgeIteratorT<C>::weight() const
    \n-
    1567 {
    \n-
    1568 return *block_;
    \n-
    1569 }
    \n-
    1570
    \n-
    1571 template<class M>
    \n-
    1572 template<class C>
    \n-
    1573 inline typename MatrixGraph<M>::template EdgeIteratorT<C>& MatrixGraph<M>::EdgeIteratorT<C>::operator++()
    \n-
    1574 {
    \n-
    1575 ++block_;
    \n-
    1576 ++edge_;
    \n-
    1577
    \n-
    1578 if(block_!=blockEnd_ && block_.index() == source_) {
    \n-
    1579 // This is the edge from the diagonal to the diagonal. Skip it.
    \n-
    1580 ++block_;
    \n-
    1581 }
    \n-
    1582
    \n-
    1583 return *this;
    \n-
    1584 }
    \n-
    1585
    \n-
    1586 template<class M>
    \n-
    1587 template<class C>
    \n-
    1588 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator!=(const typename MatrixGraph<M>::template EdgeIteratorT<typename std::remove_const<C>::type>& other) const
    \n-
    1589 {
    \n-
    1590 return block_!=other.block_;
    \n-
    1591 }
    \n-
    1592
    \n-
    1593 template<class M>
    \n-
    1594 template<class C>
    \n-
    1595 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator!=(const typename MatrixGraph<M>::template EdgeIteratorT<const typename std::remove_const<C>::type>& other) const
    \n-
    1596 {
    \n-
    1597 return block_!=other.block_;
    \n-
    1598 }
    \n-
    1599
    \n-
    1600 template<class M>
    \n-
    1601 template<class C>
    \n-
    1602 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator==(const typename MatrixGraph<M>::template EdgeIteratorT<typename std::remove_const<C>::type>& other) const
    \n-
    1603 {
    \n-
    1604 return block_==other.block_;
    \n-
    1605 }
    \n-
    1606
    \n-
    1607 template<class M>
    \n-
    1608 template<class C>
    \n-
    1609 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator==(const typename MatrixGraph<M>::template EdgeIteratorT<const typename std::remove_const<C>::type>& other) const
    \n-
    1610 {
    \n-
    1611 return block_==other.block_;
    \n-
    1612 }
    \n-
    1613
    \n-
    1614 template<class M>
    \n-
    1615 template<class C>
    \n-
    1616 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::EdgeIteratorT<C>::target() const
    \n-
    1617 {
    \n-
    1618 return block_.index();
    \n-
    1619 }
    \n-
    1620
    \n-
    1621 template<class M>
    \n-
    1622 template<class C>
    \n-
    1623 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::EdgeIteratorT<C>::source() const
    \n-
    1624 {
    \n-
    1625 return source_;
    \n-
    1626 }
    \n-
    1627
    \n-
    1628 template<class M>
    \n-
    1629 template<class C>
    \n-
    1630 inline const typename MatrixGraph<M>::EdgeDescriptor& MatrixGraph<M>::EdgeIteratorT<C>::operator*() const
    \n-
    1631 {
    \n-
    1632 return edge_;
    \n-
    1633 }
    \n-
    1634
    \n-
    1635 template<class M>
    \n-
    1636 template<class C>
    \n-
    1637 inline const typename MatrixGraph<M>::EdgeDescriptor* MatrixGraph<M>::EdgeIteratorT<C>::operator->() const
    \n-
    1638 {
    \n-
    1639 return &edge_;
    \n-
    1640 }
    \n-
    1641
    \n-
    1642 template<class M>
    \n-
    1643 template<class C>
    \n-
    1644 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(C* graph,
    \n-
    1645 const VertexDescriptor& current)
    \n-
    1646 : graph_(graph), current_(current)
    \n-
    1647 {}
    \n-
    1648
    \n-
    1649
    \n-
    1650 template<class M>
    \n-
    1651 template<class C>
    \n-
    1652 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(const VertexDescriptor& current)
    \n-
    1653 : current_(current)
    \n-
    1654 {}
    \n-
    1655
    \n-
    1656 template<class M>
    \n-
    1657 template<class C>
    \n-
    1658 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(const VertexIteratorT<MutableContainer>& other)
    \n-
    1659 : graph_(other.graph_), current_(other.current_)
    \n-
    1660 {}
    \n-
    1661
    \n-
    1662 template<class M>
    \n-
    1663 template<class C>
    \n-
    1664 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator!=(const VertexIteratorT<MutableContainer>& other) const
    \n-
    1665 {
    \n-
    1666 return current_ != other.current_;
    \n-
    1667 }
    \n-
    1668
    \n-
    1669 template<class M>
    \n-
    1670 template<class C>
    \n-
    1671 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator!=(const VertexIteratorT<ConstContainer>& other) const
    \n-
    1672 {
    \n-
    1673 return current_ != other.current_;
    \n-
    1674 }
    \n-
    1675
    \n-
    1676
    \n-
    1677 template<class M>
    \n-
    1678 template<class C>
    \n-
    1679 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator==(const VertexIteratorT<MutableContainer>& other) const
    \n-
    1680 {
    \n-
    1681 return current_ == other.current_;
    \n-
    1682 }
    \n-
    1683
    \n-
    1684 template<class M>
    \n-
    1685 template<class C>
    \n-
    1686 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator==(const VertexIteratorT<ConstContainer>& other) const
    \n-
    1687 {
    \n-
    1688 return current_ == other.current_;
    \n-
    1689 }
    \n-
    1690
    \n-
    1691 template<class M>
    \n-
    1692 template<class C>
    \n-
    1693 inline typename MatrixGraph<M>::template VertexIteratorT<C>& MatrixGraph<M>::VertexIteratorT<C>::operator++()
    \n-
    1694 {
    \n-
    1695 ++current_;
    \n-
    1696 return *this;
    \n-
    1697 }
    \n-
    1698
    \n-
    1699 template<class M>
    \n-
    1700 template<class C>
    \n-
    1701 inline typename MatrixGraph<M>::template VertexIteratorT<C>::WeightType&
    \n-
    1702 MatrixGraph<M>::VertexIteratorT<C>::weight() const
    \n-
    1703 {
    \n-
    1704 return graph_->matrix()[current_][current_];
    \n-
    1705 }
    \n-
    1706
    \n-
    1707 template<class M>
    \n-
    1708 template<class C>
    \n-
    1709 inline const typename MatrixGraph<M>::VertexDescriptor&
    \n-
    1710 MatrixGraph<M>::VertexIteratorT<C>::operator*() const
    \n-
    1711 {
    \n-
    1712 return current_;
    \n-
    1713 }
    \n-
    1714
    \n-
    1715 template<class M>
    \n-
    1716 template<class C>
    \n-
    1717 inline typename MatrixGraph<M>::template EdgeIteratorT<C>
    \n-
    1718 MatrixGraph<M>::VertexIteratorT<C>::begin() const
    \n-
    1719 {
    \n-
    1720 return graph_->beginEdges(current_);
    \n-
    1721 }
    \n-
    1722
    \n-
    1723 template<class M>
    \n-
    1724 template<class C>
    \n-
    1725 inline typename MatrixGraph<M>::template EdgeIteratorT<C>
    \n-
    1726 MatrixGraph<M>::VertexIteratorT<C>::end() const
    \n-
    1727 {
    \n-
    1728 return graph_->endEdges(current_);
    \n-
    1729 }
    \n-
    1730
    \n-
    1731 template<class M>
    \n-
    1732 inline typename MatrixGraph<M>::template VertexIteratorT<MatrixGraph<M> >
    \n-
    1733 MatrixGraph<M>::begin()
    \n-
    1734 {
    \n-
    1735 return VertexIterator(this,0);
    \n-
    1736 }
    \n-
    1737
    \n-
    1738 template<class M>
    \n-
    1739 inline typename MatrixGraph<M>::template VertexIteratorT<MatrixGraph<M> >
    \n-
    1740 MatrixGraph<M>::end()
    \n-
    1741 {
    \n-
    1742 return VertexIterator(matrix_.N());
    \n-
    1743 }
    \n-
    1744
    \n-
    1745
    \n-
    1746 template<class M>
    \n-
    1747 inline typename MatrixGraph<M>::template VertexIteratorT<const MatrixGraph<M> >
    \n-
    1748 MatrixGraph<M>::begin() const
    \n-
    1749 {
    \n-
    1750 return ConstVertexIterator(this, 0);
    \n-
    1751 }
    \n-
    1752
    \n-
    1753 template<class M>
    \n-
    1754 inline typename MatrixGraph<M>::template VertexIteratorT<const MatrixGraph<M> >
    \n-
    1755 MatrixGraph<M>::end() const
    \n-
    1756 {
    \n-
    1757 return ConstVertexIterator(matrix_.N());
    \n-
    1758 }
    \n-
    1759
    \n-
    1760 template<class M>
    \n-
    1761 inline typename MatrixGraph<M>::template EdgeIteratorT<MatrixGraph<M> >
    \n-
    1762 MatrixGraph<M>::beginEdges(const VertexDescriptor& source)
    \n-
    1763 {
    \n-
    1764 return EdgeIterator(source, matrix_.operator[](source).begin(),
    \n-
    1765 matrix_.operator[](source).end(), start_[source]);
    \n-
    1766 }
    \n-
    1767
    \n-
    1768 template<class M>
    \n-
    1769 inline typename MatrixGraph<M>::template EdgeIteratorT<MatrixGraph<M> >
    \n-
    1770 MatrixGraph<M>::endEdges(const VertexDescriptor& source)
    \n-
    1771 {
    \n-
    1772 return EdgeIterator(matrix_.operator[](source).end());
    \n-
    1773 }
    \n-
    1774
    \n-
    1775
    \n-
    1776 template<class M>
    \n-
    1777 inline typename MatrixGraph<M>::template EdgeIteratorT<const MatrixGraph<M> >
    \n-
    1778 MatrixGraph<M>::beginEdges(const VertexDescriptor& source) const
    \n-
    1779 {
    \n-
    1780 return ConstEdgeIterator(source, matrix_.operator[](source).begin(),
    \n-
    1781 matrix_.operator[](source).end(), start_[source]);
    \n-
    1782 }
    \n-
    1783
    \n-
    1784 template<class M>
    \n-
    1785 inline typename MatrixGraph<M>::template EdgeIteratorT<const MatrixGraph<M> >
    \n-
    1786 MatrixGraph<M>::endEdges(const VertexDescriptor& source) const
    \n-
    1787 {
    \n-
    1788 return ConstEdgeIterator(matrix_.operator[](source).end());
    \n-
    1789 }
    \n-
    1790
    \n-
    1791
    \n-
    1792 template<class G, class T>
    \n-
    1793 SubGraph<G,T>::EdgeIterator::EdgeIterator(const VertexDescriptor& source,
    \n-
    1794 const EdgeDescriptor& edge)
    \n-
    1795 : source_(source), edge_(edge)
    \n-
    1796 {}
    \n-
    1797
    \n-
    1798
    \n-
    1799 template<class G, class T>
    \n-
    1800 SubGraph<G,T>::EdgeIterator::EdgeIterator(const EdgeDescriptor& edge)
    \n-
    1801 : edge_(edge)
    \n-
    1802 {}
    \n-
    1803
    \n-
    1804 template<class G, class T>
    \n-
    1805 typename SubGraph<G,T>::EdgeIndexMap SubGraph<G,T>::getEdgeIndexMap()
    \n-
    1806 {
    \n-
    1807 return EdgeIndexMap(edges_);
    \n-
    1808 }
    \n-
    1809
    \n-
    1810 template<class G, class T>
    \n-
    1811 inline bool SubGraph<G,T>::EdgeIterator::equals(const EdgeIterator & other) const
    \n-
    1812 {
    \n-
    1813 return other.edge_==edge_;
    \n-
    1814 }
    \n-
    1815
    \n-
    1816 template<class G, class T>
    \n-
    1817 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::increment()
    \n-
    1818 {
    \n-
    1819 ++edge_;
    \n-
    1820 return *this;
    \n-
    1821 }
    \n-
    1822
    \n-
    1823 template<class G, class T>
    \n-
    1824 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::decrement()
    \n-
    1825 {
    \n-
    1826 --edge_;
    \n-
    1827 return *this;
    \n-
    1828 }
    \n-
    1829
    \n-
    1830 template<class G, class T>
    \n-
    1831 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::advance(std::ptrdiff_t n)
    \n-
    1832 {
    \n-
    1833 edge_+=n;
    \n-
    1834 return *this;
    \n-
    1835 }
    \n-
    1836 template<class G, class T>
    \n-
    1837 inline const typename G::VertexDescriptor& SubGraph<G,T>::EdgeIterator::source() const
    \n-
    1838 {
    \n-
    1839 return source_;
    \n-
    1840 }
    \n-
    1841
    \n-
    1842 template<class G, class T>
    \n-
    1843 inline const typename G::VertexDescriptor& SubGraph<G,T>::EdgeIterator::target() const
    \n-
    1844 {
    \n-
    1845 return *edge_;
    \n-
    1846 }
    \n-
    1847
    \n-
    1848
    \n-
    1849 template<class G, class T>
    \n-
    1850 inline const typename SubGraph<G,T>::EdgeDescriptor& SubGraph<G,T>::EdgeIterator::dereference() const
    \n-
    1851 {
    \n-
    1852 return edge_;
    \n-
    1853 }
    \n-
    1854
    \n-
    1855 template<class G, class T>
    \n-
    1856 inline std::ptrdiff_t SubGraph<G,T>::EdgeIterator::distanceTo(const EdgeIterator & other) const
    \n-
    1857 {
    \n-
    1858 return other.edge_-edge_;
    \n-
    1859 }
    \n-
    1860
    \n-
    1861 template<class G, class T>
    \n-
    1862 SubGraph<G,T>::VertexIterator::VertexIterator(const SubGraph<G,T>* graph,
    \n-
    1863 const VertexDescriptor& current,
    \n-
    1864 const VertexDescriptor& end)
    \n-
    1865 : graph_(graph), current_(current), end_(end)
    \n-
    1866 {
    \n-
    1867 // Skip excluded vertices
    \n-
    1868 typedef typename T::const_iterator Iterator;
    \n-
    1869
    \n-
    1870 for(Iterator vertex = graph_->excluded_.begin();
    \n-
    1871 current_ != end_ && *vertex;
    \n-
    1872 ++vertex)
    \n-
    1873 ++current_;
    \n-
    1874 assert(current_ == end_ || !graph_->excluded_[current_]);
    \n-
    1875 }
    \n-
    1876
    \n-
    1877 template<class G, class T>
    \n-
    1878 SubGraph<G,T>::VertexIterator::VertexIterator(const VertexDescriptor& current)
    \n-
    1879 : current_(current)
    \n-
    1880 {}
    \n-
    1881
    \n-
    1882 template<class G, class T>
    \n-
    1883 inline typename SubGraph<G,T>::VertexIterator& SubGraph<G,T>::VertexIterator::increment()
    \n-
    1884 {
    \n-
    1885 ++current_;
    \n-
    1886 //Skip excluded vertices
    \n-
    1887 while(current_ != end_ && graph_->excluded_[current_])
    \n-
    1888 ++current_;
    \n-
    1889
    \n-
    1890 assert(current_ == end_ || !graph_->excluded_[current_]);
    \n-
    1891 return *this;
    \n-
    1892 }
    \n-
    1893
    \n-
    1894 template<class G, class T>
    \n-
    1895 inline bool SubGraph<G,T>::VertexIterator::equals(const VertexIterator & other) const
    \n-
    1896 {
    \n-
    1897 return current_==other.current_;
    \n-
    1898 }
    \n-
    1899
    \n-
    1900 template<class G, class T>
    \n-
    1901 inline const typename G::VertexDescriptor& SubGraph<G,T>::VertexIterator::dereference() const
    \n-
    1902 {
    \n-
    1903 return current_;
    \n-
    1904 }
    \n-
    1905
    \n-
    1906 template<class G, class T>
    \n-
    1907 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::VertexIterator::begin() const
    \n-
    1908 {
    \n-
    1909 return graph_->beginEdges(current_);
    \n-
    1910 }
    \n-
    1911
    \n-
    1912 template<class G, class T>
    \n-
    1913 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::VertexIterator::end() const
    \n-
    1914 {
    \n-
    1915 return graph_->endEdges(current_);
    \n-
    1916 }
    \n-
    1917
    \n-
    1918 template<class G, class T>
    \n-
    1919 inline typename SubGraph<G,T>::VertexIterator SubGraph<G,T>::begin() const
    \n-
    1920 {
    \n-
    1921 return VertexIterator(this, 0, endVertex_);
    \n-
    1922 }
    \n-
    1923
    \n-
    1924
    \n-
    1925 template<class G, class T>
    \n-
    1926 inline typename SubGraph<G,T>::VertexIterator SubGraph<G,T>::end() const
    \n-
    1927 {
    \n-
    1928 return VertexIterator(endVertex_);
    \n-
    1929 }
    \n-
    1930
    \n-
    1931
    \n-
    1932 template<class G, class T>
    \n-
    1933 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::beginEdges(const VertexDescriptor& source) const
    \n-
    1934 {
    \n-
    1935 return EdgeIterator(source, edges_+start_[source]);
    \n-
    1936 }
    \n-
    1937
    \n-
    1938 template<class G, class T>
    \n-
    1939 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::endEdges(const VertexDescriptor& source) const
    \n-
    1940 {
    \n-
    1941 return EdgeIterator(edges_+end_[source]);
    \n-
    1942 }
    \n-
    1943
    \n-
    1944 template<class G, class T>
    \n-
    1945 std::size_t SubGraph<G,T>::noVertices() const
    \n-
    1946 {
    \n-
    1947 return noVertices_;
    \n-
    1948 }
    \n-
    1949
    \n-
    1950 template<class G, class T>
    \n-
    1951 inline typename SubGraph<G,T>::VertexDescriptor SubGraph<G,T>::maxVertex() const
    \n-
    1952 {
    \n-
    1953 return maxVertex_;
    \n-
    1954 }
    \n-
    1955
    \n-
    1956 template<class G, class T>
    \n-
    1957 inline std::size_t SubGraph<G,T>::noEdges() const
    \n-
    1958 {
    \n-
    1959 return noEdges_;
    \n-
    1960 }
    \n-
    1961
    \n-
    1962 template<class G, class T>
    \n-
    1963 inline typename SubGraph<G,T>::EdgeDescriptor SubGraph<G,T>::findEdge(const VertexDescriptor& source,
    \n-
    1964 const VertexDescriptor& target) const
    \n-
    1965 {
    \n-
    1966 const EdgeDescriptor edge = std::lower_bound(edges_+start_[source], edges_+end_[source], target);
    \n-
    1967 if(edge==edges_+end_[source] || *edge!=target)
    \n-
    1968 return std::numeric_limits<EdgeDescriptor>::max();
    \n-
    1969
    \n-
    1970 return edge;
    \n-
    1971 }
    \n-
    1972
    \n-
    1973 template<class G, class T>
    \n-
    1974 SubGraph<G,T>::~SubGraph()
    \n-
    1975 {
    \n-
    1976 delete[] edges_;
    \n-
    1977 delete[] end_;
    \n-
    1978 delete[] start_;
    \n-
    1979 }
    \n-
    1980
    \n-
    1981 template<class G, class T>
    \n-
    1982 SubGraph<G,T>::SubGraph(const G& graph, const T& excluded)
    \n-
    1983 : excluded_(excluded), noVertices_(0), endVertex_(0), maxVertex_(graph.maxVertex())
    \n-
    1984 {
    \n-
    1985 start_ = new std::ptrdiff_t[graph.noVertices()];
    \n-
    1986 end_ = new std::ptrdiff_t[graph.noVertices()];
    \n-
    1987 edges_ = new VertexDescriptor[graph.noEdges()];
    \n-
    1988
    \n-
    1989 VertexDescriptor* edge=edges_;
    \n-
    1990
    \n-
    1991 // Cater for the case that there are no vertices.
    \n-
    1992 // Otherwise endVertex_ will get 1 below.
    \n-
    1993 if ( graph.noVertices() == 0)
    \n-
    1994 return;
    \n-
    1995
    \n-
    1996 typedef typename Graph::ConstVertexIterator Iterator;
    \n-
    1997 Iterator endVertex=graph.end();
    \n-
    1998
    \n-
    1999 for(Iterator vertex = graph.begin(); vertex != endVertex; ++vertex)
    \n-
    2000 if(excluded_[*vertex])
    \n-
    2001 start_[*vertex]=end_[*vertex]=-1;
    \n-
    2002 else{
    \n-
    2003 ++noVertices_;
    \n-
    2004 endVertex_ = std::max(*vertex, endVertex_);
    \n-
    2005
    \n-
    2006 start_[*vertex] = edge-edges_;
    \n-
    2007
    \n-
    2008 auto endEdge = vertex.end();
    \n-
    2009
    \n-
    2010 for(auto iter=vertex.begin(); iter!= endEdge; ++iter)
    \n-
    2011 if(!excluded[iter.target()]) {
    \n-
    2012 *edge = iter.target();
    \n-
    2013 ++edge;
    \n-
    2014 }
    \n-
    2015
    \n-
    2016 end_[*vertex] = edge - edges_;
    \n-
    2017
    \n-
    2018 // Sort the edges
    \n-
    2019 std::sort(edges_+start_[*vertex], edge);
    \n-
    2020 }
    \n-
    2021 noEdges_ = edge-edges_;
    \n-
    2022 ++endVertex_;
    \n-
    2023 }
    \n-
    2024
    \n-
    2025 template<class G, class V, class VM>
    \n-
    2026 inline std::size_t VertexPropertiesGraph<G,V,VM>::noEdges() const
    \n-
    2027 {
    \n-
    2028 return graph_.noEdges();
    \n-
    2029 }
    \n-
    2030
    \n-
    2031 template<class G, class V, class VM>
    \n-
    2032 inline typename VertexPropertiesGraph<G,V,VM>::EdgeIterator
    \n-
    2033 VertexPropertiesGraph<G,V,VM>::beginEdges(const VertexDescriptor& source)
    \n-
    2034 {
    \n-
    2035 return graph_.beginEdges(source);
    \n-
    2036 }
    \n-
    2037
    \n-
    2038 template<class G, class V, class VM>
    \n-
    2039 inline typename VertexPropertiesGraph<G,V,VM>::EdgeIterator
    \n-
    2040 VertexPropertiesGraph<G,V,VM>::endEdges(const VertexDescriptor& source)
    \n-
    2041 {
    \n-
    2042 return graph_.endEdges(source);
    \n-
    2043 }
    \n-
    2044
    \n-
    2045 template<class G, class V, class VM>
    \n-
    2046 typename VertexPropertiesGraph<G,V,VM>::ConstEdgeIterator
    \n-
    2047 inline VertexPropertiesGraph<G,V,VM>::beginEdges(const VertexDescriptor& source) const
    \n-
    2048 {
    \n-
    2049 return graph_.beginEdges(source);
    \n-
    2050 }
    \n-
    2051
    \n-
    2052 template<class G, class V, class VM>
    \n-
    2053 typename VertexPropertiesGraph<G,V,VM>::ConstEdgeIterator
    \n-
    2054 VertexPropertiesGraph<G,V,VM>::endEdges(const VertexDescriptor& source) const
    \n-
    2055 {
    \n-
    2056 return graph_.endEdges(source);
    \n-
    2057 }
    \n-
    2058
    \n-
    2059 template<class G, class V, class VM>
    \n-
    2060 template<class C>
    \n-
    2061 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
    \n-
    2062 ::VertexIteratorT(const Father& iter,
    \n-
    2063 C* graph)
    \n-
    2064 : Father(iter), graph_(graph)
    \n-
    2065 {}
    \n-
    2066
    \n-
    2067 template<class G, class V, class VM>
    \n-
    2068 template<class C>
    \n-
    2069 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
    \n-
    2070 ::VertexIteratorT(const Father& iter)
    \n-
    2071 : Father(iter)
    \n-
    2072 {}
    \n-
    2073
    \n-
    2074 template<class G, class V, class VM>
    \n-
    2075 template<class C>
    \n-
    2076 template<class C1>
    \n-
    2077 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
    \n-
    2078 ::VertexIteratorT(const VertexIteratorT<C1>& other)
    \n-
    2079 : Father(other), graph_(other.graph_)
    \n-
    2080 {}
    \n-
    2081
    \n-
    2082 template<class G, class V, class VM>
    \n-
    2083 template<class C>
    \n-
    2084 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
    \n-
    2085 V&, const V&>::type
    \n-
    2086 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::properties() const
    \n-
    2087 {
    \n-
    2088 return graph_->getVertexProperties(Father::operator*());
    \n-
    2089 }
    \n-
    2090
    \n-
    2091 template<class G, class V, class VM>
    \n-
    2092 template<class C>
    \n-
    2093 typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n-
    2094 C>::value,
    \n-
    2095 typename G::EdgeIterator,
    \n-
    2096 typename G::ConstEdgeIterator>::type
    \n-
    2097 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::begin() const
    \n-
    2098 {
    \n-
    2099 return graph_->beginEdges(Father::operator*());
    \n-
    2100 }
    \n-
    2101
    \n-
    2102 template<class G, class V, class VM>
    \n-
    2103 template<class C>
    \n-
    2104 typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n-
    2105 C>::value,
    \n-
    2106 typename G::EdgeIterator,
    \n-
    2107 typename G::ConstEdgeIterator>::type
    \n-
    2108 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::end() const
    \n-
    2109 {
    \n-
    2110 return graph_->endEdges(Father::operator*());
    \n-
    2111 }
    \n-
    2112
    \n-
    2113 template<class G, class V, class VM>
    \n-
    2114 inline typename VertexPropertiesGraph<G,V,VM>::VertexIterator VertexPropertiesGraph<G,V,VM>::begin()
    \n-
    2115 {
    \n-
    2116 return VertexIterator(graph_.begin(), this);
    \n-
    2117 }
    \n-
    2118
    \n-
    2119 template<class G, class V, class VM>
    \n-
    2120 inline typename VertexPropertiesGraph<G,V,VM>::VertexIterator VertexPropertiesGraph<G,V,VM>::end()
    \n-
    2121 {
    \n-
    2122 return VertexIterator(graph_.end());
    \n-
    2123 }
    \n-
    2124
    \n-
    2125
    \n-
    2126 template<class G, class V, class VM>
    \n-
    2127 inline typename VertexPropertiesGraph<G,V,VM>::ConstVertexIterator VertexPropertiesGraph<G,V,VM>::begin() const
    \n-
    2128 {
    \n-
    2129 return ConstVertexIterator(graph_.begin(), this);
    \n-
    2130 }
    \n-
    2131
    \n-
    2132 template<class G, class V, class VM>
    \n-
    2133 inline typename VertexPropertiesGraph<G,V,VM>::ConstVertexIterator VertexPropertiesGraph<G,V,VM>::end() const
    \n-
    2134 {
    \n-
    2135 return ConstVertexIterator(graph_.end());
    \n-
    2136 }
    \n-
    2137
    \n-
    2138 template<class G, class V, class VM>
    \n-
    2139 inline V& VertexPropertiesGraph<G,V,VM>::getVertexProperties(const VertexDescriptor& vertex)
    \n-
    2140 {
    \n-
    2141 return vertexProperties_[vmap_[vertex]];
    \n-
    2142 }
    \n-
    2143
    \n-
    2144 template<class G, class V, class VM>
    \n-
    2145 inline const V& VertexPropertiesGraph<G,V,VM>::getVertexProperties(const VertexDescriptor& vertex) const
    \n-
    2146 {
    \n-
    2147 return vertexProperties_[vmap_[vertex]];
    \n-
    2148 }
    \n-
    2149
    \n-
    2150 template<class G, class V, class VM>
    \n-
    2151 inline const G& VertexPropertiesGraph<G,V,VM>::graph() const
    \n-
    2152 {
    \n-
    2153 return graph_;
    \n-
    2154 }
    \n-
    2155
    \n-
    2156 template<class G, class V, class VM>
    \n-
    2157 inline std::size_t VertexPropertiesGraph<G,V,VM>::noVertices() const
    \n-
    2158 {
    \n-
    2159 return graph_.noVertices();
    \n-
    2160 }
    \n-
    2161
    \n-
    2162
    \n-
    2163 template<class G, class V, class VM>
    \n-
    2164 inline typename VertexPropertiesGraph<G,V,VM>::VertexDescriptor VertexPropertiesGraph<G,V,VM>::maxVertex() const
    \n-
    2165 {
    \n-
    2166 return graph_.maxVertex();
    \n-
    2167 }
    \n-
    2168
    \n-
    2169 template<class G, class V, class VM>
    \n-
    2170 VertexPropertiesGraph<G,V,VM>::VertexPropertiesGraph(Graph& graph, const VM vmap)
    \n-
    2171 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex()+1], V())
    \n-
    2172 {}
    \n-
    2173
    \n-
    2174 template<class G, class V, class E, class VM, class EM>
    \n-
    2175 template<class C>
    \n-
    2176 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const Father& iter,
    \n-
    2177 C* graph)
    \n-
    2178 : Father(iter), graph_(graph)
    \n-
    2179 {}
    \n-
    2180
    \n-
    2181 template<class G, class V, class E, class VM, class EM>
    \n-
    2182 template<class C>
    \n-
    2183 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const Father& iter)
    \n-
    2184 : Father(iter)
    \n-
    2185 {}
    \n-
    2186
    \n-
    2187 template<class G, class V, class E, class VM, class EM>
    \n-
    2188 template<class C>
    \n-
    2189 template<class C1>
    \n-
    2190 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const EdgeIteratorT<C1>& other)
    \n-
    2191 : Father(other), graph_(other.graph_)
    \n-
    2192 {}
    \n-
    2193
    \n-
    2194
    \n-
    2195 template<class G, class V, class E, class VM, class EM>
    \n-
    2196 inline std::size_t PropertiesGraph<G,V,E,VM,EM>::noEdges() const
    \n-
    2197 {
    \n-
    2198 return graph_.noEdges();
    \n-
    2199 }
    \n-
    2200
    \n-
    2201 template<class G, class V, class E, class VM, class EM>
    \n-
    2202 template<class C>
    \n-
    2203 inline typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,E&,const E&>::type
    \n-
    2204 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::properties() const
    \n-
    2205 {
    \n-
    2206 return graph_->getEdgeProperties(Father::operator*());
    \n-
    2207 }
    \n-
    2208
    \n-
    2209 template<class G, class V, class E, class VM, class EM>
    \n-
    2210 inline typename PropertiesGraph<G,V,E,VM,EM>::EdgeIterator
    \n-
    2211 PropertiesGraph<G,V,E,VM,EM>::beginEdges(const VertexDescriptor& source)
    \n-
    2212 {
    \n-
    2213 return EdgeIterator(graph_.beginEdges(source), this);
    \n-
    2214 }
    \n-
    2215
    \n-
    2216 template<class G, class V, class E, class VM, class EM>
    \n-
    2217 inline typename PropertiesGraph<G,V,E,VM,EM>::EdgeIterator
    \n-
    2218 PropertiesGraph<G,V,E,VM,EM>::endEdges(const VertexDescriptor& source)
    \n-
    2219 {
    \n-
    2220 return EdgeIterator(graph_.endEdges(source));
    \n-
    2221 }
    \n-
    2222
    \n-
    2223 template<class G, class V, class E, class VM, class EM>
    \n-
    2224 typename PropertiesGraph<G,V,E,VM,EM>::ConstEdgeIterator
    \n-
    2225 inline PropertiesGraph<G,V,E,VM,EM>::beginEdges(const VertexDescriptor& source) const
    \n-
    2226 {
    \n-
    2227 return ConstEdgeIterator(graph_.beginEdges(source), this);
    \n-
    2228 }
    \n-
    2229
    \n-
    2230 template<class G, class V, class E, class VM, class EM>
    \n-
    2231 typename PropertiesGraph<G,V,E,VM,EM>::ConstEdgeIterator
    \n-
    2232 PropertiesGraph<G,V,E,VM,EM>::endEdges(const VertexDescriptor& source) const
    \n-
    2233 {
    \n-
    2234 return ConstEdgeIterator(graph_.endEdges(source));
    \n-
    2235 }
    \n-
    2236
    \n-
    2237 template<class G, class V, class E, class VM, class EM>
    \n-
    2238 template<class C>
    \n-
    2239 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
    \n-
    2240 ::VertexIteratorT(const Father& iter,
    \n-
    2241 C* graph)
    \n-
    2242 : Father(iter), graph_(graph)
    \n-
    2243 {}
    \n-
    2244
    \n-
    2245 template<class G, class V, class E, class VM, class EM>
    \n-
    2246 template<class C>
    \n-
    2247 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
    \n-
    2248 ::VertexIteratorT(const Father& iter)
    \n-
    2249 : Father(iter)
    \n-
    2250 {}
    \n-
    2251
    \n-
    2252 template<class G, class V, class E, class VM, class EM>
    \n-
    2253 template<class C>
    \n-
    2254 template<class C1>
    \n-
    2255 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
    \n-
    2256 ::VertexIteratorT(const VertexIteratorT<C1>& other)
    \n-
    2257 : Father(other), graph_(other.graph_)
    \n-
    2258 {}
    \n-
    2259
    \n-
    2260 template<class G, class V, class E, class VM, class EM>
    \n-
    2261 template<class C>
    \n-
    2262 inline typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
    \n-
    2263 V&, const V&>::type
    \n-
    2264 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::properties() const
    \n-
    2265 {
    \n-
    2266 return graph_->getVertexProperties(Father::operator*());
    \n-
    2267 }
    \n-
    2268
    \n-
    2269 template<class G, class V, class E, class VM, class EM>
    \n-
    2270 template<class C>
    \n-
    2271 inline typename PropertiesGraph<G,V,E,VM,EM>::template EdgeIteratorT<C>
    \n-
    2272 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::begin() const
    \n-
    2273 {
    \n-
    2274 return graph_->beginEdges(Father::operator*());
    \n-
    2275 }
    \n-
    2276
    \n-
    2277 template<class G, class V, class E, class VM, class EM>
    \n-
    2278 template<class C>
    \n-
    2279 inline typename PropertiesGraph<G,V,E,VM,EM>::template EdgeIteratorT<C>
    \n-
    2280 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::end() const
    \n-
    2281 {
    \n-
    2282 return graph_->endEdges(Father::operator*());
    \n-
    2283 }
    \n-
    2284
    \n-
    2285 template<class G, class V, class E, class VM, class EM>
    \n-
    2286 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexIterator PropertiesGraph<G,V,E,VM,EM>::begin()
    \n-
    2287 {
    \n-
    2288 return VertexIterator(graph_.begin(), this);
    \n-
    2289 }
    \n-
    2290
    \n-
    2291 template<class G, class V, class E, class VM, class EM>
    \n-
    2292 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexIterator PropertiesGraph<G,V,E,VM,EM>::end()
    \n-
    2293 {
    \n-
    2294 return VertexIterator(graph_.end());
    \n-
    2295 }
    \n-
    2296
    \n-
    2297
    \n-
    2298 template<class G, class V, class E, class VM, class EM>
    \n-
    2299 inline typename PropertiesGraph<G,V,E,VM,EM>::ConstVertexIterator PropertiesGraph<G,V,E,VM,EM>::begin() const
    \n-
    2300 {
    \n-
    2301 return ConstVertexIterator(graph_.begin(), this);
    \n-
    2302 }
    \n-
    2303
    \n-
    2304 template<class G, class V, class E, class VM, class EM>
    \n-
    2305 inline typename PropertiesGraph<G,V,E,VM,EM>::ConstVertexIterator PropertiesGraph<G,V,E,VM,EM>::end() const
    \n-
    2306 {
    \n-
    2307 return ConstVertexIterator(graph_.end());
    \n-
    2308 }
    \n-
    2309
    \n-
    2310 template<class G, class V, class E, class VM, class EM>
    \n-
    2311 inline V& PropertiesGraph<G,V,E,VM,EM>::getVertexProperties(const VertexDescriptor& vertex)
    \n-
    2312 {
    \n-
    2313 return vertexProperties_[vmap_[vertex]];
    \n-
    2314 }
    \n-
    2315
    \n-
    2316 template<class G, class V, class E, class VM, class EM>
    \n-
    2317 inline const V& PropertiesGraph<G,V,E,VM,EM>::getVertexProperties(const VertexDescriptor& vertex) const
    \n-
    2318 {
    \n-
    2319 return vertexProperties_[vmap_[vertex]];
    \n-
    2320 }
    \n-
    2321
    \n-
    2322 template<class G, class V, class E, class VM, class EM>
    \n-
    2323 inline E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const EdgeDescriptor& edge)
    \n-
    2324 {
    \n-
    2325 return edgeProperties_[emap_[edge]];
    \n-
    2326 }
    \n-
    2327
    \n-
    2328 template<class G, class V, class E, class VM, class EM>
    \n-
    2329 inline const E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const EdgeDescriptor& edge) const
    \n-
    2330 {
    \n-
    2331 return edgeProperties_[emap_[edge]];
    \n-
    2332 }
    \n-
    2333
    \n-
    2334 template<class G, class V, class E, class VM, class EM>
    \n-
    2335 inline E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const VertexDescriptor& source,
    \n-
    2336 const VertexDescriptor& target)
    \n-
    2337 {
    \n-
    2338 return getEdgeProperties(graph_.findEdge(source,target));
    \n-
    2339 }
    \n-
    2340
    \n-
    2341 template<class G, class V, class E, class VM, class EM>
    \n-
    2342 inline const E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const VertexDescriptor& source,
    \n-
    2343 const VertexDescriptor& target) const
    \n-
    2344 {
    \n-
    2345 return getEdgeProperties(graph_.findEdge(source,target));
    \n-
    2346 }
    \n-
    2347
    \n-
    2348 template<class G, class V, class E, class VM, class EM>
    \n-
    2349 inline const G& PropertiesGraph<G,V,E,VM,EM>::graph() const
    \n-
    2350 {
    \n-
    2351 return graph_;
    \n-
    2352 }
    \n-
    2353
    \n-
    2354 template<class G, class V, class E, class VM, class EM>
    \n-
    2355 inline std::size_t PropertiesGraph<G,V,E,VM,EM>::noVertices() const
    \n-
    2356 {
    \n-
    2357 return graph_.noVertices();
    \n-
    2358 }
    \n-
    2359
    \n-
    2360
    \n-
    2361 template<class G, class V, class E, class VM, class EM>
    \n-
    2362 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexDescriptor PropertiesGraph<G,V,E,VM,EM>::maxVertex() const
    \n-
    2363 {
    \n-
    2364 return graph_.maxVertex();
    \n-
    2365 }
    \n-
    2366
    \n-
    2367 template<class G, class V, class E, class VM, class EM>
    \n-
    2368 PropertiesGraph<G,V,E,VM,EM>::PropertiesGraph(Graph& graph, const VM& vmap, const EM& emap)
    \n-
    2369 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex()+1], V()),
    \n-
    2370 emap_(emap), edgeProperties_(graph_.noEdges(), E())
    \n-
    2371 {}
    \n-
    2372
    \n-
    2373 template<class G, class V>
    \n-
    2374 inline int visitNeighbours(const G& graph, const typename G::VertexDescriptor& vertex,
    \n-
    2375 V& visitor)
    \n-
    2376 {
    \n-
    2377 typedef typename G::ConstEdgeIterator iterator;
    \n-
    2378 const iterator end = graph.endEdges(vertex);
    \n-
    2379 int noNeighbours=0;
    \n-
    2380 for(iterator edge = graph.beginEdges(vertex); edge != end; ++edge, ++noNeighbours)
    \n-
    2381 visitor(edge);
    \n-
    2382 return noNeighbours;
    \n-
    2383 }
    \n-
    2384
    \n-
    2385#endif // DOXYGEN
    \n-
    2386
    \n-
    2388 }
    \n-
    2389}
    \n-
    2390#endif
    \n-\n-
    int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
    Visit all neighbour vertices of a vertex in a graph.
    \n-
    STL namespace.
    \n+
    8#include <cmath>
    \n+
    9#include <complex>
    \n+
    10#include <map>
    \n+
    11#include <vector>
    \n+
    12
    \n+
    13#include <dune/common/fmatrix.hh>
    \n+
    14#include <dune/common/scalarvectorview.hh>
    \n+
    15#include <dune/common/scalarmatrixview.hh>
    \n+
    16
    \n+
    17#include "istlexception.hh"
    \n+
    18
    \n+
    23namespace Dune
    \n+
    24{
    \n+
    25
    \n+
    \n+
    30 namespace DILU
    \n+
    31 {
    \n+
    32
    \n+
    50 template <class M>
    \n+
    \n+
    51 void blockDILUDecomposition(M &A, std::vector<typename M::block_type> &Dinv_)
    \n+
    52 {
    \n+
    53 auto endi = A.end();
    \n+
    54 for (auto row = A.begin(); row != endi; ++row)
    \n+
    55 {
    \n+
    56 const auto row_i = row.index();
    \n+
    57 const auto col = row->find(row_i);
    \n+
    58 // initialise Dinv[i] = A[i, i]
    \n+
    59 Dinv_[row_i] = *col;
    \n+
    60 }
    \n+
    61
    \n+
    62 for (auto row = A.begin(); row != endi; ++row)
    \n+
    63 {
    \n+
    64 const auto row_i = row.index();
    \n+
    65 for (auto a_ij = row->begin(); a_ij.index() < row_i; ++a_ij)
    \n+
    66 {
    \n+
    67 const auto col_j = a_ij.index();
    \n+
    68 const auto a_ji = A[col_j].find(row_i);
    \n+
    69 // if A[i, j] != 0 and A[j, i] != 0
    \n+
    70 if (a_ji != A[col_j].end())
    \n+
    71 {
    \n+
    72 // Dinv[i] -= A[i, j] * d[j] * A[j, i]
    \n+
    73 Dinv_[row_i] -= (*a_ij) * Dinv_[col_j] * (*a_ji);
    \n+
    74 }
    \n+
    75 }
    \n+
    76
    \n+
    77 // store the inverse
    \n+
    78 try
    \n+
    79 {
    \n+
    80 Impl::asMatrix(Dinv_[row_i]).invert(); // compute inverse of diagonal block
    \n+
    81 }
    \n+
    82 catch (Dune::FMatrixError &e)
    \n+
    83 {
    \n+
    84 DUNE_THROW(MatrixBlockError, "DILU failed to invert matrix block D[" << row_i << "]"
    \n+
    85 << e.what();
    \n+
    86 th__ex.r = row_i;);
    \n+
    87 }
    \n+
    88 }
    \n+
    89 }
    \n+
    \n+
    90
    \n+
    106 template <class M, class X, class Y>
    \n+
    \n+
    107 void blockDILUBacksolve(const M &A, const std::vector<typename M::block_type> Dinv_, X &v, const Y &d)
    \n+
    108 {
    \n+
    109 using dblock = typename Y::block_type;
    \n+
    110 using vblock = typename X::block_type;
    \n+
    111
    \n+
    112 // lower triangular solve: (D + L_A) y = d
    \n+
    113 auto endi = A.end();
    \n+
    114 for (auto row = A.begin(); row != endi; ++row)
    \n+
    115 {
    \n+
    116 const auto row_i = row.index();
    \n+
    117 dblock rhsValue(d[row_i]);
    \n+
    118 auto &&rhs = Impl::asVector(rhsValue);
    \n+
    119 for (auto a_ij = (*row).begin(); a_ij.index() < row_i; ++a_ij)
    \n+
    120 {
    \n+
    121 // if A[i][j] != 0
    \n+
    122 // rhs -= A[i][j]* y[j], where v_j stores y_j
    \n+
    123 const auto col_j = a_ij.index();
    \n+
    124 Impl::asMatrix(*a_ij).mmv(v[col_j], rhs);
    \n+
    125 }
    \n+
    126 // y_i = Dinv_i * rhs
    \n+
    127 // storing y_i in v_i
    \n+
    128 auto &&vi = Impl::asVector(v[row_i]);
    \n+
    129 Impl::asMatrix(Dinv_[row_i]).mv(rhs, vi); // (D + L_A)_ii = D_i
    \n+
    130 }
    \n+
    131
    \n+
    132 // upper triangular solve: (D + U_A) v = Dy
    \n+
    133 auto rendi = A.beforeBegin();
    \n+
    134 for (auto row = A.beforeEnd(); row != rendi; --row)
    \n+
    135 {
    \n+
    136 const auto row_i = row.index();
    \n+
    137 // rhs = 0
    \n+
    138 vblock rhs(0.0);
    \n+
    139 for (auto a_ij = (*row).beforeEnd(); a_ij.index() > row_i; --a_ij)
    \n+
    140 {
    \n+
    141 // if A[i][j] != 0
    \n+
    142 // rhs += A[i][j]*v[j]
    \n+
    143 const auto col_j = a_ij.index();
    \n+
    144 Impl::asMatrix(*a_ij).umv(v[col_j], rhs);
    \n+
    145 }
    \n+
    146 // calculate update v = M^-1*d
    \n+
    147 // v_i = y_i - Dinv_i*rhs
    \n+
    148 // before update v_i is y_i
    \n+
    149 auto &&vi = Impl::asVector(v[row_i]);
    \n+
    150 Impl::asMatrix(Dinv_[row_i]).mmv(rhs, vi);
    \n+
    151 }
    \n+
    152 }
    \n+
    \n+
    153 } // end namespace DILU
    \n+
    \n+
    154
    \n+
    157} // end namespace
    \n+
    158
    \n+
    159#endif
    \n+\n+
    Col col
    Definition matrixmatrix.hh:351
    \n
    Definition allocator.hh:11
    \n-
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    The (undirected) graph of a matrix.
    Definition graph.hh:51
    \n-
    MatrixGraph(Matrix &matrix)
    Constructor.
    \n-
    VertexIterator end()
    Get an iterator over the vertices.
    \n-
    VertexDescriptor maxVertex() const
    Get the maximal vertex descriptor.
    \n-
    M Matrix
    The type of the matrix we are a graph for.
    Definition graph.hh:56
    \n-
    ConstVertexIterator begin() const
    Get an iterator over the vertices.
    \n-
    VertexIteratorT< const MatrixGraph< Matrix > > ConstVertexIterator
    The constant vertex iterator type.
    Definition graph.hh:308
    \n-
    ~MatrixGraph()
    Destructor.
    \n-
    std::ptrdiff_t EdgeDescriptor
    The edge descriptor.
    Definition graph.hh:80
    \n-
    ConstEdgeIterator endEdges(const VertexDescriptor &source) const
    Get an iterator over the edges starting at a vertex.
    \n-
    M::size_type VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:73
    \n-
    const Matrix & matrix() const
    Get the underlying matrix.
    \n-
    @ mutableMatrix
    Definition graph.hh:86
    \n-
    ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
    Get an iterator over the edges starting at a vertex.
    \n-
    ConstVertexIterator end() const
    Get an iterator over the vertices.
    \n-
    EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator
    The constant edge iterator type.
    Definition graph.hh:298
    \n-
    EdgeIterator beginEdges(const VertexDescriptor &source)
    Get an iterator over the edges starting at a vertex.
    \n-
    std::size_t noVertices() const
    Get the number of vertices in the graph.
    \n-
    EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor &target) const
    Find the descriptor of an edge.
    \n-
    M::block_type Weight
    The type of the weights.
    Definition graph.hh:66
    \n-
    std::remove_const< M >::type MutableMatrix
    The mutable type of the matrix we are a graph for.
    Definition graph.hh:61
    \n-
    EdgeIteratorT< MatrixGraph< Matrix > > EdgeIterator
    The mutable edge iterator type.
    Definition graph.hh:303
    \n-
    VertexIteratorT< MatrixGraph< Matrix > > VertexIterator
    The mutable vertex iterator type.
    Definition graph.hh:313
    \n-
    EdgeIterator endEdges(const VertexDescriptor &source)
    Get an iterator over the edges starting at a vertex.
    \n-
    std::size_t noEdges() const
    Get the number of edges in the graph.
    \n-
    Matrix & matrix()
    Get the underlying matrix.
    \n-
    VertexIterator begin()
    Get an iterator over the vertices.
    \n-
    Iterator over all edges starting from a vertex.
    Definition graph.hh:95
    \n-
    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
    \n-
    EdgeIteratorT(const VertexDescriptor &source, const ColIterator &block, const ColIterator &end, const EdgeDescriptor &edge)
    Constructor.
    \n-
    @ isMutable
    whether C is mutable.
    Definition graph.hh:112
    \n-
    VertexDescriptor target() const
    The index of the target vertex of the current edge.
    \n-
    EdgeIteratorT< C > & operator++()
    preincrement operator.
    \n-
    bool operator!=(const EdgeIteratorT< const typename std::remove_const< C >::type > &other) const
    Inequality operator.
    \n-
    bool operator==(const EdgeIteratorT< const typename std::remove_const< C >::type > &other) const
    Equality operator.
    \n-
    EdgeIteratorT(const EdgeIteratorT< C1 > &other)
    Copy Constructor.
    \n-
    bool operator!=(const EdgeIteratorT< typename std::remove_const< C >::type > &other) const
    Inequality operator.
    \n-
    WeightType & weight() const
    Access the edge weight.
    \n-
    VertexDescriptor source() const
    The index of the source vertex of the current edge.
    \n-
    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
    \n-
    const std::remove_const< C >::type ConstContainer
    The constant type of the container type.
    Definition graph.hh:105
    \n-
    bool operator==(const EdgeIteratorT< typename std::remove_const< C >::type > &other) const
    Equality operator.
    \n-
    EdgeIteratorT(const ColIterator &block)
    Constructor for the end iterator.
    \n-
    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
    \n-
    const EdgeDescriptor & operator*() const
    Get the edge descriptor.
    \n-
    const EdgeDescriptor * operator->() const
    Get the edge descriptor.
    \n-
    std::remove_const< C >::type MutableContainer
    The mutable type of the container type.
    Definition graph.hh:101
    \n-
    The vertex iterator type of the graph.
    Definition graph.hh:209
    \n-
    EdgeIteratorT< C > begin() const
    Get an iterator over all edges starting at the current vertex.
    \n-
    const VertexDescriptor & operator*() const
    Get the descriptor of the current vertex.
    \n-
    WeightType & weight() const
    Access the weight of the vertex.
    \n-
    VertexIteratorT(C *graph, const VertexDescriptor &current)
    Constructor.
    \n-
    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
    \n-
    VertexIteratorT(const VertexIteratorT< MutableContainer > &other)
    \n-
    std::remove_const< C >::type MutableContainer
    The mutable type of the container type.
    Definition graph.hh:214
    \n-
    bool operator!=(const VertexIteratorT< MutableContainer > &other) const
    Inequality operator.
    \n-
    @ isMutable
    whether C is mutable.
    Definition graph.hh:225
    \n-
    bool operator==(const VertexIteratorT< MutableContainer > &other) const
    Equality operator.
    \n-
    const std::remove_const< C >::type ConstContainer
    The constant type of the container type.
    Definition graph.hh:218
    \n-
    VertexIteratorT< C > & operator++()
    Move to the next vertex.
    \n-
    EdgeIteratorT< C > end() const
    Get an iterator over all edges starting at the current vertex.
    \n-
    bool operator==(const VertexIteratorT< ConstContainer > &other) const
    Equality operator.
    \n-
    bool operator!=(const VertexIteratorT< ConstContainer > &other) const
    Inequality operator.
    \n-
    VertexIteratorT(const VertexDescriptor &current)
    Constructor for the end iterator.
    \n-
    A subgraph of a graph.
    Definition graph.hh:443
    \n-
    EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor &target) const
    Find the descriptor of an edge.
    \n-
    VertexDescriptor maxVertex() const
    Get the maximal vertex descriptor.
    \n-
    EdgeIndexMap getEdgeIndexMap()
    Get an edge index map for the graph.
    \n-
    std::size_t noEdges() const
    Get the number of edges in the graph.
    \n-
    ConstEdgeIterator endEdges(const VertexDescriptor &source) const
    Get an iterator over the edges starting at a vertex.
    \n-
    ConstVertexIterator end() const
    Get an iterator over the vertices.
    \n-
    ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
    Get an iterator over the edges starting at a vertex.
    \n-
    std::size_t noVertices() const
    Get the number of vertices in the graph.
    \n-
    T Excluded
    Random access container providing information about which vertices are excluded.
    Definition graph.hh:454
    \n-
    ~SubGraph()
    Destructor.
    \n-
    EdgeIterator ConstEdgeIterator
    The constant edge iterator type.
    Definition graph.hh:618
    \n-
    G Graph
    The type of the graph we are a sub graph for.
    Definition graph.hh:448
    \n-
    VertexIterator ConstVertexIterator
    The constant vertex iterator type.
    Definition graph.hh:623
    \n-
    SubGraph(const Graph &graph, const T &excluded)
    Constructor.
    \n-
    ConstVertexIterator begin() const
    Get an iterator over the vertices.
    \n-
    Graph::VertexDescriptor VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:459
    \n-
    VertexDescriptor * EdgeDescriptor
    Definition graph.hh:461
    \n-
    An index map for mapping the edges to indices.
    Definition graph.hh:470
    \n-
    EdgeIndexMap(const EdgeIndexMap &emap)
    Protect copy construction.
    Definition graph.hh:479
    \n-
    ReadablePropertyMapTag Category
    Definition graph.hh:472
    \n-
    EdgeIndexMap(const EdgeDescriptor &firstEdge)
    Definition graph.hh:474
    \n-
    std::size_t operator[](const EdgeDescriptor &edge) const
    Definition graph.hh:483
    \n-
    The edge iterator of the graph.
    Definition graph.hh:505
    \n-
    const EdgeDescriptor & dereference() const
    The descriptor of the current edge.
    \n-
    EdgeIterator(const EdgeDescriptor &edge)
    Constructor for the end iterator.
    \n-
    bool equals(const EdgeIterator &other) const
    Equality operator.
    \n-
    EdgeIterator & advance(std::ptrdiff_t n)
    \n-
    EdgeIterator & increment()
    Preincrement operator.
    \n-
    const VertexDescriptor & target() const
    The index of the target vertex of the current edge.
    \n-
    const VertexDescriptor & source() const
    The index of the source vertex of the current edge.
    \n-
    EdgeIterator & decrement()
    Preincrement operator.
    \n-
    std::ptrdiff_t distanceTo(const EdgeIterator &other) const
    \n-
    EdgeIterator(const VertexDescriptor &source, const EdgeDescriptor &edge)
    Constructor.
    \n-
    The vertex iterator of the graph.
    Definition graph.hh:560
    \n-
    VertexIterator(const VertexDescriptor &current)
    Constructor for end iterator.
    \n-
    VertexIterator & increment()
    Preincrement operator.
    \n-
    EdgeIterator begin() const
    Get an iterator over all edges starting at the current vertex.
    \n-
    bool equals(const VertexIterator &other) const
    Equality iterator.
    \n-
    VertexIterator(const SubGraph< G, T > *graph, const VertexDescriptor &current, const VertexDescriptor &end)
    Constructor.
    \n-
    EdgeIterator end() const
    Get an iterator over all edges starting at the current vertex.
    \n-
    const VertexDescriptor & dereference() const
    Get the descriptor of the current vertex.
    \n-
    Attaches properties to the vertices of a graph.
    Definition graph.hh:723
    \n-
    const Graph & graph() const
    Get the graph the properties are attached to.
    \n-
    Graph::ConstEdgeIterator ConstEdgeIterator
    The type of the constant edge iterator.
    Definition graph.hh:766
    \n-
    VertexProperties & getVertexProperties(const VertexDescriptor &vertex)
    Get the properties associated with a vertex.
    \n-
    std::size_t noEdges() const
    Get the number of edges in the graph.
    \n-
    Graph::EdgeDescriptor EdgeDescriptor
    The edge descritor.
    Definition graph.hh:738
    \n-
    ConstEdgeIterator endEdges(const VertexDescriptor &source) const
    Get the mutable edge iterator over edges starting at a vertex.
    \n-
    Graph::VertexDescriptor VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:733
    \n-
    G Graph
    The graph we attach properties to.
    Definition graph.hh:728
    \n-
    VM VertexMap
    The type of the map for converting the VertexDescriptor to std::size_t.
    Definition graph.hh:756
    \n-
    EdgeIterator endEdges(const VertexDescriptor &source)
    Get the mutable edge iterator over edges starting at a vertex.
    \n-
    EdgeIterator beginEdges(const VertexDescriptor &source)
    Get the mutable edge iterator over edges starting at a vertex.
    \n-
    VP VertexProperties
    The type of the properties of the vertices.
    Definition graph.hh:743
    \n-
    std::size_t noVertices() const
    Get the number of vertices in the graph.
    \n-
    ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
    Get the mutable edge iterator over edges starting at a vertex.
    \n-
    VertexDescriptor maxVertex() const
    Get the maximal vertex descriptor.
    \n-
    Graph::EdgeIterator EdgeIterator
    The type of the mutable edge iterator.
    Definition graph.hh:761
    \n-\n-
    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
    \n-
    std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::value, VertexProperties &, constVertexProperties & >::type properties() const
    Get the properties of the current Vertex.
    \n-
    EdgeIterator end() const
    Get an iterator over the edges starting from the current vertex.
    \n-
    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
    \n-
    EdgeIterator begin() const
    Get an iterator over the edges starting from the current vertex.
    \n-
    Attaches properties to the edges and vertices of a graph.
    Definition graph.hh:978
    \n-
    std::size_t noVertices() const
    Get the number of vertices in the graph.
    \n-
    Graph::EdgeDescriptor EdgeDescriptor
    The edge descritor.
    Definition graph.hh:993
    \n-
    const EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const VertexDescriptor &target) const
    Get the properties associated with a edge.
    \n-
    const EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge) const
    Get the properties associated with a edge.
    \n-
    const Graph & graph() const
    Get the graph the properties are attached to.
    \n-
    VertexDescriptor maxVertex() const
    Get the maximal vertex descriptor.
    \n-
    G Graph
    The graph we attach properties to.
    Definition graph.hh:983
    \n-
    EM EdgeMap
    The type of the map for converting the EdgeDescriptor to std::size_t.
    Definition graph.hh:1030
    \n-
    VM VertexMap
    The type of the map for converting the VertexDescriptor to std::size_t.
    Definition graph.hh:1011
    \n-
    VP VertexProperties
    The type of the properties of the vertices.
    Definition graph.hh:998
    \n-
    std::size_t noEdges() const
    Get the number of edges in the graph.
    \n-
    EP EdgeProperties
    The type of the properties of the edges;.
    Definition graph.hh:1016
    \n-
    EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const VertexDescriptor &target)
    Get the properties associated with a edge.
    \n-
    EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge)
    Get the properties associated with a edge.
    \n-
    Graph::VertexDescriptor VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:988
    \n-
    PropertiesGraph(Graph &graph, const VertexMap &vmap=VertexMap(), const EdgeMap &emap=EdgeMap())
    Constructor.
    \n-\n-
    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
    \n-\n-
    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
    \n-
    Wrapper to access the internal edge properties of a graph via operator[]()
    Definition graph.hh:1361
    \n-
    GraphVertexPropertiesSelector(G &g)
    Constructor.
    Definition graph.hh:1380
    \n-
    VertexProperties & operator[](const Vertex &vertex) const
    Get the properties associated to a vertex.
    Definition graph.hh:1395
    \n-
    G Graph
    The type of the graph with internal properties.
    Definition graph.hh:1366
    \n-
    G::VertexProperties VertexProperties
    The type of the vertex properties.
    Definition graph.hh:1370
    \n-
    GraphVertexPropertiesSelector()
    Default constructor.
    Definition graph.hh:1386
    \n-
    G::VertexDescriptor Vertex
    The vertex descriptor.
    Definition graph.hh:1374
    \n-
    Wrapper to access the internal vertex properties of a graph via operator[]()
    Definition graph.hh:1409
    \n-
    EdgeProperties & operator[](const Edge &edge) const
    Get the properties associated to a vertex.
    Definition graph.hh:1442
    \n-
    G::EdgeProperties EdgeProperties
    The type of the vertex properties.
    Definition graph.hh:1418
    \n-
    G::EdgeDescriptor Edge
    The edge descriptor.
    Definition graph.hh:1422
    \n-
    GraphEdgePropertiesSelector()
    Default constructor.
    Definition graph.hh:1434
    \n-
    G Graph
    The type of the graph with internal properties.
    Definition graph.hh:1414
    \n-
    GraphEdgePropertiesSelector(G &g)
    Constructor.
    Definition graph.hh:1428
    \n+
    void blockDILUDecomposition(M &A, std::vector< typename M::block_type > &Dinv_)
    Definition dilu.hh:51
    \n+
    void blockDILUBacksolve(const M &A, const std::vector< typename M::block_type > Dinv_, X &v, const Y &d)
    Definition dilu.hh:107
    \n+
    Error when performing an operation on a matrix block.
    Definition istlexception.hh:52
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,2286 +1,147 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-graph.hh\n+dilu.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_GRAPH_HH\n-6#define DUNE_AMG_GRAPH_HH\n+5#ifndef DUNE_ISTL_DILU_HH\n+6#define DUNE_ISTL_DILU_HH\n 7\n-8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-16#include \n-17\n-18namespace _\bD_\bu_\bn_\be\n-19{\n-20 namespace Amg\n-21 {\n-49 template\n-_\b5_\b0 class _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-51 {\n-52 public:\n-_\b5_\b6 typedef M _\bM_\ba_\bt_\br_\bi_\bx;\n-57\n-_\b6_\b1 typedef typename std::remove_const::type _\bM_\bu_\bt_\ba_\bb_\bl_\be_\bM_\ba_\bt_\br_\bi_\bx;\n-62\n-_\b6_\b6 typedef typename M::block_type _\bW_\be_\bi_\bg_\bh_\bt;\n-67\n-_\b7_\b3 typedef typename M::size_type _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-74\n-_\b8_\b0 typedef std::ptrdiff_t _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-81\n-82 enum {\n-83 /*\n-84 * @brief Whether Matrix is mutable.\n-85 */\n-86 _\bm_\bu_\bt_\ba_\bb_\bl_\be_\bM_\ba_\bt_\br_\bi_\bx = std::is_same::type>::value\n-_\b8_\b7 };\n-88\n-89\n-93 template\n-_\b9_\b4 class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-95 {\n-96\n-97 public:\n-_\b1_\b0_\b1 typedef typename std::remove_const::type _\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n-_\b1_\b0_\b5 typedef const typename std::remove_const::type _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n-106\n-107 friend class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT<_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br>;\n-108 friend class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT<_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br>;\n-109\n-110 enum {\n-112 _\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be = std::is_same::value\n-_\b1_\b1_\b3 };\n-114\n-118 typedef typename std::conditional<_\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be && C::mutableMatrix,typename\n-Matrix::row_type::Iterator,\n-119 typename Matrix::row_type::ConstIterator>::type\n-_\b1_\b2_\b0 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-121\n-125 typedef typename std::conditional<_\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be && C::mutableMatrix,typename\n-M::block_type,\n-126 const typename M::block_type>::type\n-_\b1_\b2_\b7 _\bW_\be_\bi_\bg_\bh_\bt;\n-128\n-_\b1_\b3_\b6 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bs_\bo_\bu_\br_\bc_\be, const _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& block,\n-137 const _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\be_\bn_\bd, const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& edge);\n-138\n-_\b1_\b4_\b5 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& block);\n-146\n-151 template\n-_\b1_\b5_\b2 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\b1_\b>& other);\n-153\n-154 typedef typename std::conditional::type>::value && C::mutableMatrix,\n-155 typename M::block_type, const typename M::block_type>::type\n-_\b1_\b5_\b6 _\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be;\n-157\n-_\b1_\b6_\b1 _\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be& _\bw_\be_\bi_\bg_\bh_\bt() const;\n-162\n-_\b1_\b6_\b4 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n-165\n-_\b1_\b6_\b7 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>&\n-other) const;\n-168\n-_\b1_\b7_\b0 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::\n-type>& other) const;\n-171\n-_\b1_\b7_\b3 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>&\n-other) const;\n-174\n-_\b1_\b7_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::\n-type>& other) const;\n-177\n-_\b1_\b7_\b9 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bt_\ba_\br_\bg_\be_\bt() const;\n-180\n-_\b1_\b8_\b2 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bs_\bo_\bu_\br_\bc_\be() const;\n-183\n-_\b1_\b8_\b5 const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const;\n-186\n-_\b1_\b8_\b8 const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>() const;\n-189\n-190 private:\n-192 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br source_;\n-194 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br block_;\n-195 /***\n-196 * @brief The column iterator positioned at the end of the row\n-197 * of vertex source_\n-198 */\n-199 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br blockEnd_;\n-201 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br edge_;\n-202 };\n-203\n-207 template\n-_\b2_\b0_\b8 class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-209 {\n-210 public:\n-_\b2_\b1_\b4 typedef typename std::remove_const::type _\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n-_\b2_\b1_\b8 typedef const typename std::remove_const::type _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n-219\n-220 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT<_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br>;\n-221 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT<_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br>;\n-222\n-223 enum {\n-225 _\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be = std::is_same::value\n-_\b2_\b2_\b6 };\n-227\n-_\b2_\b3_\b3 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(C* graph, const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& current);\n-234\n-_\b2_\b4_\b2 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& current);\n-243\n-_\b2_\b4_\b4 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>& other);\n-245\n-_\b2_\b5_\b0 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n-251\n-_\b2_\b5_\b3 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>& other) const;\n-254\n-_\b2_\b5_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>& other) const;\n-257\n-_\b2_\b5_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>& other) const;\n-260\n-_\b2_\b6_\b2 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>& other) const;\n-263\n-264 typedef typename std::conditional::type>::value && C::mutableMatrix,\n-265 typename M::block_type, const typename M::block_type>::type\n-_\b2_\b6_\b6 _\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be;\n-_\b2_\b6_\b8 _\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be& _\bw_\be_\bi_\bg_\bh_\bt() const;\n-269\n-_\b2_\b7_\b4 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const;\n-275\n-_\b2_\b8_\b1 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\b> _\bb_\be_\bg_\bi_\bn() const;\n-282\n-_\b2_\b8_\b8 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\b> _\be_\bn_\bd() const;\n-289\n-290 private:\n-291 C* graph_;\n-292 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br current_;\n-293 };\n-294\n-_\b2_\b9_\b8 typedef _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> > _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-299\n-_\b3_\b0_\b3 typedef _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> > _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-304\n-_\b3_\b0_\b8 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> > _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-309\n-_\b3_\b1_\b3 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> > _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-314\n-_\b3_\b1_\b9 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh(_\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt_\br_\bi_\bx);\n-320\n-_\b3_\b2_\b4 _\b~_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh();\n-325\n-_\b3_\b3_\b0 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn();\n-331\n-_\b3_\b3_\b6 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd();\n-337\n-_\b3_\b4_\b2 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-343\n-_\b3_\b4_\b8 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-349\n-_\b3_\b5_\b6 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source);\n-357\n-_\b3_\b6_\b4 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source);\n-365\n-366\n-_\b3_\b7_\b3 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n-374\n-_\b3_\b8_\b1 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n-382\n-_\b3_\b8_\b7 _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt_\br_\bi_\bx();\n-388\n-_\b3_\b9_\b3 const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt_\br_\bi_\bx() const;\n-394\n-_\b3_\b9_\b8 std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const;\n-399\n-_\b4_\b0_\b6 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx() const;\n-407\n-_\b4_\b1_\b1 std::size_t _\bn_\bo_\bE_\bd_\bg_\be_\bs() const;\n-412\n-_\b4_\b1_\b9 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bf_\bi_\bn_\bd_\bE_\bd_\bg_\be(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source,\n-420 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& target) const;\n-421\n-422 private:\n-424 _\bM_\ba_\bt_\br_\bi_\bx& matrix_;\n-426 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* start_;\n-428 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh(const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh&);\n-429\n-430 };\n-431\n-441 template\n-_\b4_\b4_\b2 class _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n-443 {\n-444 public:\n-_\b4_\b4_\b8 typedef G _\bG_\br_\ba_\bp_\bh;\n-449\n-_\b4_\b5_\b4 typedef T _\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd;\n-455\n-_\b4_\b5_\b9 typedef typename Graph::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-460\n-_\b4_\b6_\b1 typedef _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-462\n-_\b4_\b6_\b9 class _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-470 {\n-471 public:\n-_\b4_\b7_\b2 typedef ReadablePropertyMapTag _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n-473\n-_\b4_\b7_\b4 _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp(const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& firstEdge)\n-475 : firstEdge_(firstEdge)\n-476 {}\n-477\n-_\b4_\b7_\b9 _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp(const _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp& emap)\n-480 : firstEdge_(emap.firstEdge_)\n-481 {}\n-482\n-_\b4_\b8_\b3 std::size_t _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& edge) const\n-484 {\n-485 return edge-firstEdge_;\n-486 }\n-487 private:\n-489 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br firstEdge_;\n-491 _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp()\n-492 {}\n-493 };\n-494\n-_\b4_\b9_\b9 _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp _\bg_\be_\bt_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp();\n-500\n-_\b5_\b0_\b4 class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br : public RandomAccessIteratorFacade\n-505 {\n-506 public:\n-_\b5_\b1_\b2 explicit _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bs_\bo_\bu_\br_\bc_\be, const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n-edge);\n-513\n-_\b5_\b2_\b1 explicit _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& edge);\n-522\n-_\b5_\b2_\b4 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) const;\n-525\n-_\b5_\b2_\b7 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-528\n-_\b5_\b3_\b0 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt();\n-531\n-_\b5_\b3_\b2 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\ba_\bd_\bv_\ba_\bn_\bc_\be(std::ptrdiff_t n);\n-533\n-_\b5_\b3_\b5 const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const;\n-536\n-_\b5_\b3_\b8 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bt_\ba_\br_\bg_\be_\bt() const;\n-539\n-_\b5_\b4_\b1 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bs_\bo_\bu_\br_\bc_\be() const;\n-542\n-_\b5_\b4_\b3 std::ptrdiff_t _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) const;\n-544\n-545 private:\n-547 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br source_;\n-552 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br edge_;\n-553 };\n-554\n-_\b5_\b5_\b8 class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-559 : public ForwardIteratorFacade\n-560 {\n-561 public:\n-_\b5_\b6_\b8 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\bG_\b,_\bT_\b>* graph, const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n-current,\n-569 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\be_\bn_\bd);\n-570\n-571\n-_\b5_\b7_\b8 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& current);\n-579\n-_\b5_\b8_\b1 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n-582\n-_\b5_\b8_\b4 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) const;\n-585\n-_\b5_\b9_\b0 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const;\n-591\n-_\b5_\b9_\b7 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-598\n-_\b6_\b0_\b4 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-605\n-606 private:\n-608 const _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\bG_\br_\ba_\bp_\bh_\b,_\bT_\b>* graph_;\n-610 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br current_;\n-612 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br end_;\n-613 };\n-614\n-_\b6_\b1_\b8 typedef _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-619\n-_\b6_\b2_\b3 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-624\n-_\b6_\b2_\b9 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-630\n-_\b6_\b3_\b5 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-636\n-_\b6_\b4_\b3 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n-644\n-_\b6_\b5_\b1 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n-652\n-_\b6_\b5_\b6 std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const;\n-657\n-_\b6_\b6_\b4 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx() const;\n-665\n-_\b6_\b6_\b9 std::size_t _\bn_\bo_\bE_\bd_\bg_\be_\bs() const;\n-_\b6_\b7_\b6 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bf_\bi_\bn_\bd_\bE_\bd_\bg_\be(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source,\n-677 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& target) const;\n-_\b6_\b8_\b5 _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh(const _\bG_\br_\ba_\bp_\bh& graph, const T& excluded);\n-686\n-_\b6_\b9_\b0 _\b~_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh();\n-691\n-692 private:\n-694 const T& excluded_;\n-696 std::size_t noVertices_;\n-698 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br endVertex_;\n-700 int noEdges_;\n-705 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br maxVertex_;\n-707 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* edges_;\n-709 std::ptrdiff_t* start_;\n-711 std::ptrdiff_t* end_;\n-713 _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh(const _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh&)\n-714 {}\n-715 };\n-716\n-717\n-721 template\n-_\b7_\b2_\b2 class _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n-723 {\n-724 public:\n-_\b7_\b2_\b8 typedef G _\bG_\br_\ba_\bp_\bh;\n-729\n-_\b7_\b3_\b3 typedef typename Graph::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-734\n-_\b7_\b3_\b8 typedef typename Graph::EdgeDescriptor _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-739\n-_\b7_\b4_\b3 typedef VP _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs;\n-744\n-_\b7_\b5_\b6 typedef VM _\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp;\n-757\n-_\b7_\b6_\b1 typedef typename Graph::EdgeIterator _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-762\n-_\b7_\b6_\b6 typedef typename Graph::ConstEdgeIterator _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-767\n-_\b7_\b7_\b3 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source);\n-774\n-_\b7_\b8_\b0 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source);\n-781\n-_\b7_\b8_\b7 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n-788\n-_\b7_\b9_\b4 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n-795\n-796\n-797 template\n-_\b7_\b9_\b8 class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-799 : public std::conditional::type,\n-800 C>::value,\n-801 typename Graph::VertexIterator,\n-802 typename Graph::ConstVertexIterator>::type\n-803 {\n-804 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n-805 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n-806 public:\n-810 typedef typename std::conditional::type,\n-811 C>::value,\n-812 typename Graph::VertexIterator,\n-813 typename Graph::ConstVertexIterator>::type\n-_\b8_\b1_\b4 _\bF_\ba_\bt_\bh_\be_\br;\n-815\n-819 typedef typename std::conditional::type,\n-820 C>::value,\n-821 typename Graph::EdgeIterator,\n-822 typename Graph::ConstEdgeIterator>::type\n-_\b8_\b2_\b3 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-824\n-_\b8_\b3_\b0 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter,\n-831 C* graph);\n-832\n-833\n-_\b8_\b4_\b1 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter);\n-842\n-847 template\n-_\b8_\b4_\b8 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const VertexIteratorT& other);\n-849\n-853 typename std::conditional::\n-type>::value,\n-854 VertexProperties&,\n-855 const VertexProperties&>::type\n-_\b8_\b5_\b6 _\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs() const;\n-857\n-_\b8_\b6_\b3 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-864\n-_\b8_\b7_\b0 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-871\n-872 private:\n-876 C* graph_;\n-877 };\n-878\n-882 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-884\n-888 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-890\n-_\b8_\b9_\b5 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn();\n-896\n-_\b9_\b0_\b1 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd();\n-902\n-_\b9_\b0_\b7 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n-908\n-_\b9_\b1_\b3 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n-914\n-_\b9_\b2_\b0 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const VertexDescriptor& vertex);\n-921\n-_\b9_\b2_\b7 const _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const VertexDescriptor& vertex)\n-const;\n-928\n-_\b9_\b3_\b3 const _\bG_\br_\ba_\bp_\bh& _\bg_\br_\ba_\bp_\bh() const;\n-934\n-_\b9_\b3_\b8 std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const;\n-939\n-_\b9_\b4_\b3 std::size_t _\bn_\bo_\bE_\bd_\bg_\be_\bs() const;\n-944\n-_\b9_\b5_\b1 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx() const;\n-952\n-_\b9_\b5_\b8 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(Graph& graph, const VertexMap vmap=VertexMap());\n-959\n-960 private:\n-961 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(const VertexPropertiesGraph&)\n-962 {}\n-963\n-965 _\bG_\br_\ba_\bp_\bh& graph_;\n-967 _\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp vmap_;\n-_\b9_\b6_\b9 std::vector vertexProperties_;\n-970\n-971 };\n-972\n-976 template\n-_\b9_\b7_\b7 class _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n-978 {\n-979 public:\n-_\b9_\b8_\b3 typedef G _\bG_\br_\ba_\bp_\bh;\n-984\n-_\b9_\b8_\b8 typedef typename Graph::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-989\n-_\b9_\b9_\b3 typedef typename Graph::EdgeDescriptor _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n-994\n-_\b9_\b9_\b8 typedef VP _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs;\n-999\n-_\b1_\b0_\b1_\b1 typedef VM _\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp;\n-1012\n-_\b1_\b0_\b1_\b6 typedef EP _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs;\n-1017\n-1018\n-_\b1_\b0_\b3_\b0 typedef EM _\bE_\bd_\bg_\be_\bM_\ba_\bp;\n-1031\n-1032 template\n-_\b1_\b0_\b3_\b3 class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-1034 : public std::conditional::\n-type,\n-1035 C>::value,\n-1036 typename Graph::EdgeIterator,\n-1037 typename Graph::ConstEdgeIterator>::type\n-1038 {\n-1039\n-1040 friend class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n-1041 friend class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n-1042 public:\n-1046 typedef typename std::conditional::type,\n-1047 C>::value,\n-1048 typename Graph::EdgeIterator,\n-1049 typename Graph::ConstEdgeIterator>::type\n-_\b1_\b0_\b5_\b0 _\bF_\ba_\bt_\bh_\be_\br;\n-1051\n-_\b1_\b0_\b5_\b7 explicit _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter,\n-1058 C* graph);\n-1059\n-_\b1_\b0_\b6_\b7 explicit _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter);\n-1068\n-1073 template\n-_\b1_\b0_\b7_\b4 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const EdgeIteratorT& other);\n-1075\n-1079 typename std::conditional::\n-type>::value,\n-1080 EdgeProperties&,\n-1081 const EdgeProperties&>::type\n-_\b1_\b0_\b8_\b2 properties() const;\n-1083\n-1084 private:\n-_\b1_\b0_\b8_\b8 C* graph_;\n-1089 };\n-1090\n-1094 typedef _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-1097\n-1101 typedef _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-1104\n-_\b1_\b1_\b1_\b0 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br beginEdges(const VertexDescriptor& source);\n-1111\n-_\b1_\b1_\b1_\b7 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endEdges(const VertexDescriptor& source);\n-1118\n-_\b1_\b1_\b2_\b4 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br beginEdges(const VertexDescriptor& source) const;\n-1125\n-_\b1_\b1_\b3_\b1 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endEdges(const VertexDescriptor& source) const;\n-1132\n-1133\n-1134 template\n-_\b1_\b1_\b3_\b5 class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-1136 : public std::conditional::\n-type,\n-1137 C>::value,\n-1138 typename Graph::VertexIterator,\n-1139 typename Graph::ConstVertexIterator>::type\n-1140 {\n-1141 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n-1142 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n-1143 public:\n-1147 typedef typename std::conditional::type,\n-1148 C>::value,\n-1149 typename Graph::VertexIterator,\n-1150 typename Graph::ConstVertexIterator>::type\n-_\b1_\b1_\b5_\b1 _\bF_\ba_\bt_\bh_\be_\br;\n-1152\n-_\b1_\b1_\b5_\b8 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter,\n-1159 C* graph);\n-1160\n-1161\n-_\b1_\b1_\b6_\b9 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter);\n-1170\n-1175 template\n-_\b1_\b1_\b7_\b6 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const VertexIteratorT& other);\n-1177\n-1181 typename std::conditional::\n-type>::value,\n-1182 VertexProperties&,\n-1183 const VertexProperties&>::type\n-_\b1_\b1_\b8_\b4 properties() const;\n-1185\n-_\b1_\b1_\b9_\b1 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT begin() const;\n-1192\n-_\b1_\b1_\b9_\b8 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT end() const;\n-1199\n-1200 private:\n-1204 C* graph_;\n-1205 };\n-1206\n-1210 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-1213\n-1217 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-1220\n-_\b1_\b2_\b2_\b5 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br begin();\n-1226\n-_\b1_\b2_\b3_\b1 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end();\n-1232\n-_\b1_\b2_\b3_\b7 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br begin() const;\n-1238\n-_\b1_\b2_\b4_\b3 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end() const;\n-1244\n-_\b1_\b2_\b5_\b0 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& getVertexProperties(const VertexDescriptor& vertex);\n-1251\n-_\b1_\b2_\b5_\b7 const _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& getVertexProperties(const VertexDescriptor&\n-vertex) const;\n-1258\n-_\b1_\b2_\b6_\b5 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br findEdge(const VertexDescriptor& source,\n-1266 const VertexDescriptor& target)\n-1267 {\n-1268 return graph_.findEdge(source,target);\n-1269 }\n-1270\n-_\b1_\b2_\b7_\b6 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& edge);\n-1277\n-1278\n-_\b1_\b2_\b8_\b4 const _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& edge) const;\n-1285\n-_\b1_\b2_\b9_\b2 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source,\n-1293 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& target);\n-1294\n-_\b1_\b3_\b0_\b1 const _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source,\n-1302 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& target) const;\n-1303\n-_\b1_\b3_\b0_\b8 const _\bG_\br_\ba_\bp_\bh& _\bg_\br_\ba_\bp_\bh() const;\n-1309\n-_\b1_\b3_\b1_\b3 std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const;\n-1314\n-_\b1_\b3_\b1_\b8 std::size_t _\bn_\bo_\bE_\bd_\bg_\be_\bs() const;\n-1319\n-_\b1_\b3_\b2_\b6 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx() const;\n-1327\n-_\b1_\b3_\b3_\b4 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(_\bG_\br_\ba_\bp_\bh& graph, const _\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp& vmap=_\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp(),\n-1335 const _\bE_\bd_\bg_\be_\bM_\ba_\bp& emap=_\bE_\bd_\bg_\be_\bM_\ba_\bp());\n-1336\n-1337 private:\n-1338 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(const _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh&)\n-1339 {}\n-1340\n-1342 Graph& graph_;\n-1345 VertexMap vmap_;\n-1346 std::vector vertexProperties_;\n-1348 EdgeMap emap_;\n-_\b1_\b3_\b5_\b0 std::vector edgeProperties_;\n-1351\n-1352 };\n-1353\n-1354\n-1359 template\n-_\b1_\b3_\b6_\b0 class _\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-1361 {\n-1362 public:\n-_\b1_\b3_\b6_\b6 typedef G _\bG_\br_\ba_\bp_\bh;\n-_\b1_\b3_\b7_\b0 typedef typename G::VertexProperties _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs;\n-_\b1_\b3_\b7_\b4 typedef typename G::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n-1375\n-_\b1_\b3_\b8_\b0 _\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br(G& g)\n-1381 : graph_(g)\n-1382 {}\n-_\b1_\b3_\b8_\b6 _\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br()\n-1387 : graph_(0)\n-1388 {}\n-1389\n-1390\n-_\b1_\b3_\b9_\b5 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bV_\be_\br_\bt_\be_\bx& vertex) const\n-1396 {\n-1397 return graph_->getVertexProperties(vertex);\n-1398 }\n-1399 private:\n-1400 Graph* graph_;\n-1401 };\n-1402\n-1407 template\n-_\b1_\b4_\b0_\b8 class _\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-1409 {\n-1410 public:\n-_\b1_\b4_\b1_\b4 typedef G _\bG_\br_\ba_\bp_\bh;\n-_\b1_\b4_\b1_\b8 typedef typename G::EdgeProperties _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs;\n-_\b1_\b4_\b2_\b2 typedef typename G::EdgeDescriptor _\bE_\bd_\bg_\be;\n-1423\n-_\b1_\b4_\b2_\b8 _\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br(G& g)\n-1429 : graph_(g)\n-1430 {}\n-_\b1_\b4_\b3_\b4 _\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br()\n-1435 : graph_(0)\n-1436 {}\n-1437\n-_\b1_\b4_\b4_\b2 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bE_\bd_\bg_\be& edge) const\n-1443 {\n-1444 return graph_->getEdgeProperties(edge);\n-1445 }\n-1446 private:\n-1447 Graph* graph_;\n-1448 };\n-1449\n-1450\n-1461 template\n-_\b1_\b4_\b6_\b2 int _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(const G& graph, const typename G::VertexDescriptor&\n-vertex,\n-1463 V& visitor);\n-1464\n-1465#ifndef DOXYGEN\n-1466\n-1467 template\n-1468 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh(M& matrix)\n-1469 : matrix_(matrix)\n-1470 {\n-1471 if(matrix_.N()!=matrix_.M())\n-1472 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Matrix has to have as many columns as rows!\");\n-1473\n-1474 start_ = new EdgeDescriptor[matrix_.N()+1];\n-1475\n-1476 typedef typename M::ConstIterator Iterator;\n-1477 start_[matrix_.begin().index()] = 0;\n-1478\n-1479 for(Iterator row=matrix_.begin(); row != matrix_.end(); ++row)\n-1480 start_[row.index()+1] = start_[row.index()] + row->size();\n-1481 }\n-1482\n-1483 template\n-1484 MatrixGraph::~MatrixGraph()\n-1485 {\n-1486 delete[] start_;\n-1487 }\n-1488\n-1489 template\n-1490 inline std::size_t MatrixGraph::noEdges() const\n-1491 {\n-1492 return start_[matrix_.N()];\n-1493 }\n-1494\n-1495 template\n-1496 inline std::size_t MatrixGraph::noVertices() const\n-1497 {\n-1498 return matrix_.N();\n-1499 }\n-1500\n-1501 template\n-1502 inline typename MatrixGraph::VertexDescriptor MatrixGraph::maxVertex\n-() const\n-1503 {\n-1504 return matrix_.N()-1;\n-1505 }\n-1506\n-1507 template\n-1508 typename MatrixGraph::EdgeDescriptor\n-1509 MatrixGraph::findEdge(const VertexDescriptor& source,\n-1510 const VertexDescriptor& target) const\n-1511 {\n-1512 typename M::ConstColIterator found =matrix_[source].find(target);\n-1513 if(found == matrix_[source].end())\n-1514 return std::numeric_limits::max();\n-1515 std::size_t offset = found.offset();\n-1516 if(target>source)\n-1517 offset--;\n-1518\n-1519 assert(offset\n-1526 inline M& MatrixGraph::matrix()\n-1527 {\n-1528 return matrix_;\n-1529 }\n-1530\n-1531 template\n-1532 inline const M& MatrixGraph::matrix() const\n-1533 {\n-1534 return matrix_;\n-1535 }\n-1536\n-1537 template\n-1538 template\n-1539 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const VertexDescriptor&\n-source, const ColIterator& block,\n-1540 const ColIterator& end, const EdgeDescriptor& edge)\n-1541 : source_(source), block_(block), blockEnd_(end), edge_(edge)\n-1542 {\n-1543 if(block_!=blockEnd_ && block_.index() == source_) {\n-1544 // This is the edge from the diagonal to the diagonal. Skip it.\n-1545 ++block_;\n-1546 }\n-1547 }\n-1548\n-1549 template\n-1550 template\n-1551 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const ColIterator& block)\n-1552 : block_(block)\n-1553 {}\n-1554\n-1555 template\n-1556 template\n-1557 template\n-1558 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const EdgeIteratorT&\n-other)\n-1559 : source_(other.source_), block_(other.block_), blockEnd_\n-(other.blockEnd_), edge_(other.edge_)\n-1560 {}\n-1561\n-1562\n-1563 template\n-1564 template\n-1565 inline typename MatrixGraph::template EdgeIteratorT::WeightType&\n-1566 MatrixGraph::EdgeIteratorT::weight() const\n-1567 {\n-1568 return *block_;\n-1569 }\n-1570\n-1571 template\n-1572 template\n-1573 inline typename MatrixGraph::template EdgeIteratorT&\n-MatrixGraph::EdgeIteratorT::operator++()\n-1574 {\n-1575 ++block_;\n-1576 ++edge_;\n-1577\n-1578 if(block_!=blockEnd_ && block_.index() == source_) {\n-1579 // This is the edge from the diagonal to the diagonal. Skip it.\n-1580 ++block_;\n-1581 }\n-1582\n-1583 return *this;\n-1584 }\n-1585\n-1586 template\n-1587 template\n-1588 inline bool MatrixGraph::EdgeIteratorT::operator!=(const typename\n-MatrixGraph::template EdgeIteratorT::type>&\n-other) const\n-1589 {\n-1590 return block_!=other.block_;\n-1591 }\n-1592\n-1593 template\n-1594 template\n-1595 inline bool MatrixGraph::EdgeIteratorT::operator!=(const typename\n-MatrixGraph::template EdgeIteratorT::\n-type>& other) const\n-1596 {\n-1597 return block_!=other.block_;\n-1598 }\n-1599\n-1600 template\n-1601 template\n-1602 inline bool MatrixGraph::EdgeIteratorT::operator==(const typename\n-MatrixGraph::template EdgeIteratorT::type>&\n-other) const\n-1603 {\n-1604 return block_==other.block_;\n-1605 }\n-1606\n-1607 template\n-1608 template\n-1609 inline bool MatrixGraph::EdgeIteratorT::operator==(const typename\n-MatrixGraph::template EdgeIteratorT::\n-type>& other) const\n-1610 {\n-1611 return block_==other.block_;\n-1612 }\n-1613\n-1614 template\n-1615 template\n-1616 inline typename MatrixGraph::VertexDescriptor MatrixGraph::\n-EdgeIteratorT::target() const\n-1617 {\n-1618 return block_.index();\n-1619 }\n-1620\n-1621 template\n-1622 template\n-1623 inline typename MatrixGraph::VertexDescriptor MatrixGraph::\n-EdgeIteratorT::source() const\n-1624 {\n-1625 return source_;\n-1626 }\n-1627\n-1628 template\n-1629 template\n-1630 inline const typename MatrixGraph::EdgeDescriptor& MatrixGraph::\n-EdgeIteratorT::operator*() const\n-1631 {\n-1632 return edge_;\n-1633 }\n-1634\n-1635 template\n-1636 template\n-1637 inline const typename MatrixGraph::EdgeDescriptor* MatrixGraph::\n-EdgeIteratorT::operator->() const\n-1638 {\n-1639 return &edge_;\n-1640 }\n-1641\n-1642 template\n-1643 template\n-1644 MatrixGraph::VertexIteratorT::VertexIteratorT(C* graph,\n-1645 const VertexDescriptor& current)\n-1646 : graph_(graph), current_(current)\n-1647 {}\n-1648\n-1649\n-1650 template\n-1651 template\n-1652 MatrixGraph::VertexIteratorT::VertexIteratorT(const\n-VertexDescriptor& current)\n-1653 : current_(current)\n-1654 {}\n-1655\n-1656 template\n-1657 template\n-1658 MatrixGraph::VertexIteratorT::VertexIteratorT(const\n-VertexIteratorT& other)\n-1659 : graph_(other.graph_), current_(other.current_)\n-1660 {}\n-1661\n-1662 template\n-1663 template\n-1664 inline bool MatrixGraph::VertexIteratorT::operator!=(const\n-VertexIteratorT& other) const\n-1665 {\n-1666 return current_ != other.current_;\n-1667 }\n-1668\n-1669 template\n-1670 template\n-1671 inline bool MatrixGraph::VertexIteratorT::operator!=(const\n-VertexIteratorT& other) const\n-1672 {\n-1673 return current_ != other.current_;\n-1674 }\n-1675\n-1676\n-1677 template\n-1678 template\n-1679 inline bool MatrixGraph::VertexIteratorT::operator==(const\n-VertexIteratorT& other) const\n-1680 {\n-1681 return current_ == other.current_;\n-1682 }\n-1683\n-1684 template\n-1685 template\n-1686 inline bool MatrixGraph::VertexIteratorT::operator==(const\n-VertexIteratorT& other) const\n-1687 {\n-1688 return current_ == other.current_;\n-1689 }\n-1690\n-1691 template\n-1692 template\n-1693 inline typename MatrixGraph::template VertexIteratorT&\n-MatrixGraph::VertexIteratorT::operator++()\n-1694 {\n-1695 ++current_;\n-1696 return *this;\n-1697 }\n-1698\n-1699 template\n-1700 template\n-1701 inline typename MatrixGraph::template VertexIteratorT::WeightType&\n-1702 MatrixGraph::VertexIteratorT::weight() const\n-1703 {\n-1704 return graph_->matrix()[current_][current_];\n-1705 }\n-1706\n-1707 template\n-1708 template\n-1709 inline const typename MatrixGraph::VertexDescriptor&\n-1710 MatrixGraph::VertexIteratorT::operator*() const\n-1711 {\n-1712 return current_;\n-1713 }\n-1714\n-1715 template\n-1716 template\n-1717 inline typename MatrixGraph::template EdgeIteratorT\n-1718 MatrixGraph::VertexIteratorT::begin() const\n-1719 {\n-1720 return graph_->beginEdges(current_);\n-1721 }\n-1722\n-1723 template\n-1724 template\n-1725 inline typename MatrixGraph::template EdgeIteratorT\n-1726 MatrixGraph::VertexIteratorT::end() const\n-1727 {\n-1728 return graph_->endEdges(current_);\n-1729 }\n-1730\n-1731 template\n-1732 inline typename MatrixGraph::template VertexIteratorT >\n-1733 MatrixGraph::begin()\n-1734 {\n-1735 return VertexIterator(this,0);\n-1736 }\n-1737\n-1738 template\n-1739 inline typename MatrixGraph::template VertexIteratorT >\n-1740 MatrixGraph::end()\n-1741 {\n-1742 return VertexIterator(matrix_.N());\n-1743 }\n-1744\n-1745\n-1746 template\n-1747 inline typename MatrixGraph::template VertexIteratorT >\n-1748 MatrixGraph::begin() const\n-1749 {\n-1750 return ConstVertexIterator(this, 0);\n-1751 }\n-1752\n-1753 template\n-1754 inline typename MatrixGraph::template VertexIteratorT >\n-1755 MatrixGraph::end() const\n-1756 {\n-1757 return ConstVertexIterator(matrix_.N());\n-1758 }\n-1759\n-1760 template\n-1761 inline typename MatrixGraph::template EdgeIteratorT >\n-1762 MatrixGraph::beginEdges(const VertexDescriptor& source)\n-1763 {\n-1764 return EdgeIterator(source, matrix_.operator[](source).begin(),\n-1765 matrix_.operator[](source).end(), start_[source]);\n-1766 }\n-1767\n-1768 template\n-1769 inline typename MatrixGraph::template EdgeIteratorT >\n-1770 MatrixGraph::endEdges(const VertexDescriptor& source)\n-1771 {\n-1772 return EdgeIterator(matrix_.operator[](source).end());\n-1773 }\n-1774\n-1775\n-1776 template\n-1777 inline typename MatrixGraph::template EdgeIteratorT >\n-1778 MatrixGraph::beginEdges(const VertexDescriptor& source) const\n-1779 {\n-1780 return ConstEdgeIterator(source, matrix_.operator[](source).begin(),\n-1781 matrix_.operator[](source).end(), start_[source]);\n-1782 }\n-1783\n-1784 template\n-1785 inline typename MatrixGraph::template EdgeIteratorT >\n-1786 MatrixGraph::endEdges(const VertexDescriptor& source) const\n-1787 {\n-1788 return ConstEdgeIterator(matrix_.operator[](source).end());\n-1789 }\n-1790\n-1791\n-1792 template\n-1793 SubGraph::EdgeIterator::EdgeIterator(const VertexDescriptor& source,\n-1794 const EdgeDescriptor& edge)\n-1795 : source_(source), edge_(edge)\n-1796 {}\n-1797\n-1798\n-1799 template\n-1800 SubGraph::EdgeIterator::EdgeIterator(const EdgeDescriptor& edge)\n-1801 : edge_(edge)\n-1802 {}\n-1803\n-1804 template\n-1805 typename SubGraph::EdgeIndexMap SubGraph::getEdgeIndexMap()\n-1806 {\n-1807 return EdgeIndexMap(edges_);\n-1808 }\n-1809\n-1810 template\n-1811 inline bool SubGraph::EdgeIterator::equals(const EdgeIterator &\n-other) const\n-1812 {\n-1813 return other.edge_==edge_;\n-1814 }\n-1815\n-1816 template\n-1817 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator::\n-increment()\n-1818 {\n-1819 ++edge_;\n-1820 return *this;\n-1821 }\n-1822\n-1823 template\n-1824 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator::\n-decrement()\n-1825 {\n-1826 --edge_;\n-1827 return *this;\n-1828 }\n-1829\n-1830 template\n-1831 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator::\n-advance(std::ptrdiff_t n)\n-1832 {\n-1833 edge_+=n;\n-1834 return *this;\n-1835 }\n-1836 template\n-1837 inline const typename G::VertexDescriptor& SubGraph::EdgeIterator::\n-source() const\n-1838 {\n-1839 return source_;\n-1840 }\n-1841\n-1842 template\n-1843 inline const typename G::VertexDescriptor& SubGraph::EdgeIterator::\n-target() const\n-1844 {\n-1845 return *edge_;\n-1846 }\n-1847\n-1848\n-1849 template\n-1850 inline const typename SubGraph::EdgeDescriptor& SubGraph::\n-EdgeIterator::dereference() const\n-1851 {\n-1852 return edge_;\n-1853 }\n-1854\n-1855 template\n-1856 inline std::ptrdiff_t SubGraph::EdgeIterator::distanceTo(const\n-EdgeIterator & other) const\n-1857 {\n-1858 return other.edge_-edge_;\n-1859 }\n-1860\n-1861 template\n-1862 SubGraph::VertexIterator::VertexIterator(const SubGraph* graph,\n-1863 const VertexDescriptor& current,\n-1864 const VertexDescriptor& end)\n-1865 : graph_(graph), current_(current), end_(end)\n-1866 {\n-1867 // Skip excluded vertices\n-1868 typedef typename T::const_iterator Iterator;\n-1869\n-1870 for(Iterator vertex = graph_->excluded_.begin();\n-1871 current_ != end_ && *vertex;\n-1872 ++vertex)\n-1873 ++current_;\n-1874 assert(current_ == end_ || !graph_->excluded_[current_]);\n-1875 }\n-1876\n-1877 template\n-1878 SubGraph::VertexIterator::VertexIterator(const VertexDescriptor&\n-current)\n-1879 : current_(current)\n-1880 {}\n-1881\n-1882 template\n-1883 inline typename SubGraph::VertexIterator& SubGraph::\n-VertexIterator::increment()\n-1884 {\n-1885 ++current_;\n-1886 //Skip excluded vertices\n-1887 while(current_ != end_ && graph_->excluded_[current_])\n-1888 ++current_;\n-1889\n-1890 assert(current_ == end_ || !graph_->excluded_[current_]);\n-1891 return *this;\n-1892 }\n-1893\n-1894 template\n-1895 inline bool SubGraph::VertexIterator::equals(const VertexIterator &\n-other) const\n-1896 {\n-1897 return current_==other.current_;\n-1898 }\n-1899\n-1900 template\n-1901 inline const typename G::VertexDescriptor& SubGraph::VertexIterator::\n-dereference() const\n-1902 {\n-1903 return current_;\n-1904 }\n-1905\n-1906 template\n-1907 inline typename SubGraph::EdgeIterator SubGraph::\n-VertexIterator::begin() const\n-1908 {\n-1909 return graph_->beginEdges(current_);\n-1910 }\n-1911\n-1912 template\n-1913 inline typename SubGraph::EdgeIterator SubGraph::\n-VertexIterator::end() const\n-1914 {\n-1915 return graph_->endEdges(current_);\n-1916 }\n-1917\n-1918 template\n-1919 inline typename SubGraph::VertexIterator SubGraph::begin() const\n-1920 {\n-1921 return VertexIterator(this, 0, endVertex_);\n-1922 }\n-1923\n-1924\n-1925 template\n-1926 inline typename SubGraph::VertexIterator SubGraph::end() const\n-1927 {\n-1928 return VertexIterator(endVertex_);\n-1929 }\n-1930\n-1931\n-1932 template\n-1933 inline typename SubGraph::EdgeIterator SubGraph::beginEdges\n-(const VertexDescriptor& source) const\n-1934 {\n-1935 return EdgeIterator(source, edges_+start_[source]);\n-1936 }\n-1937\n-1938 template\n-1939 inline typename SubGraph::EdgeIterator SubGraph::endEdges(const\n-VertexDescriptor& source) const\n-1940 {\n-1941 return EdgeIterator(edges_+end_[source]);\n-1942 }\n-1943\n-1944 template\n-1945 std::size_t SubGraph::noVertices() const\n-1946 {\n-1947 return noVertices_;\n-1948 }\n-1949\n-1950 template\n-1951 inline typename SubGraph::VertexDescriptor SubGraph::maxVertex()\n-const\n-1952 {\n-1953 return maxVertex_;\n-1954 }\n-1955\n-1956 template\n-1957 inline std::size_t SubGraph::noEdges() const\n-1958 {\n-1959 return noEdges_;\n-1960 }\n-1961\n-1962 template\n-1963 inline typename SubGraph::EdgeDescriptor SubGraph::findEdge\n-(const VertexDescriptor& source,\n-1964 const VertexDescriptor& target) const\n-1965 {\n-1966 const EdgeDescriptor edge = std::lower_bound(edges_+start_[source],\n-edges_+end_[source], target);\n-1967 if(edge==edges_+end_[source] || *edge!=target)\n-1968 return std::numeric_limits::max();\n-1969\n-1970 return edge;\n-1971 }\n-1972\n-1973 template\n-1974 SubGraph::~SubGraph()\n-1975 {\n-1976 delete[] edges_;\n-1977 delete[] end_;\n-1978 delete[] start_;\n-1979 }\n-1980\n-1981 template\n-1982 SubGraph::SubGraph(const G& graph, const T& excluded)\n-1983 : excluded_(excluded), noVertices_(0), endVertex_(0), maxVertex_\n-(graph.maxVertex())\n-1984 {\n-1985 start_ = new std::ptrdiff_t[graph.noVertices()];\n-1986 end_ = new std::ptrdiff_t[graph.noVertices()];\n-1987 edges_ = new VertexDescriptor[graph.noEdges()];\n-1988\n-1989 VertexDescriptor* edge=edges_;\n-1990\n-1991 // Cater for the case that there are no vertices.\n-1992 // Otherwise endVertex_ will get 1 below.\n-1993 if ( graph.noVertices() == 0)\n-1994 return;\n-1995\n-1996 typedef typename Graph::ConstVertexIterator Iterator;\n-1997 Iterator endVertex=graph.end();\n-1998\n-1999 for(Iterator vertex = graph.begin(); vertex != endVertex; ++vertex)\n-2000 if(excluded_[*vertex])\n-2001 start_[*vertex]=end_[*vertex]=-1;\n-2002 else{\n-2003 ++noVertices_;\n-2004 endVertex_ = std::max(*vertex, endVertex_);\n-2005\n-2006 start_[*vertex] = edge-edges_;\n-2007\n-2008 auto endEdge = vertex.end();\n-2009\n-2010 for(auto iter=vertex.begin(); iter!= endEdge; ++iter)\n-2011 if(!excluded[iter.target()]) {\n-2012 *edge = iter.target();\n-2013 ++edge;\n-2014 }\n-2015\n-2016 end_[*vertex] = edge - edges_;\n-2017\n-2018 // Sort the edges\n-2019 std::sort(edges_+start_[*vertex], edge);\n-2020 }\n-2021 noEdges_ = edge-edges_;\n-2022 ++endVertex_;\n-2023 }\n-2024\n-2025 template\n-2026 inline std::size_t VertexPropertiesGraph::noEdges() const\n-2027 {\n-2028 return graph_.noEdges();\n-2029 }\n-2030\n-2031 template\n-2032 inline typename VertexPropertiesGraph::EdgeIterator\n-2033 VertexPropertiesGraph::beginEdges(const VertexDescriptor& source)\n-2034 {\n-2035 return graph_.beginEdges(source);\n-2036 }\n-2037\n-2038 template\n-2039 inline typename VertexPropertiesGraph::EdgeIterator\n-2040 VertexPropertiesGraph::endEdges(const VertexDescriptor& source)\n-2041 {\n-2042 return graph_.endEdges(source);\n-2043 }\n-2044\n-2045 template\n-2046 typename VertexPropertiesGraph::ConstEdgeIterator\n-2047 inline VertexPropertiesGraph::beginEdges(const VertexDescriptor&\n-source) const\n-2048 {\n-2049 return graph_.beginEdges(source);\n-2050 }\n-2051\n-2052 template\n-2053 typename VertexPropertiesGraph::ConstEdgeIterator\n-2054 VertexPropertiesGraph::endEdges(const VertexDescriptor& source)\n-const\n-2055 {\n-2056 return graph_.endEdges(source);\n-2057 }\n-2058\n-2059 template\n-2060 template\n-2061 VertexPropertiesGraph::VertexIteratorT\n-2062 ::VertexIteratorT(const Father& iter,\n-2063 C* graph)\n-2064 : Father(iter), graph_(graph)\n-2065 {}\n-2066\n-2067 template\n-2068 template\n-2069 VertexPropertiesGraph::VertexIteratorT\n-2070 ::VertexIteratorT(const Father& iter)\n-2071 : Father(iter)\n-2072 {}\n-2073\n-2074 template\n-2075 template\n-2076 template\n-2077 VertexPropertiesGraph::VertexIteratorT\n-2078 ::VertexIteratorT(const VertexIteratorT& other)\n-2079 : Father(other), graph_(other.graph_)\n-2080 {}\n-2081\n-2082 template\n-2083 template\n-2084 typename std::conditional::\n-type>::value,\n-2085 V&, const V&>::type\n-2086 inline VertexPropertiesGraph::VertexIteratorT::properties()\n-const\n-2087 {\n-2088 return graph_->getVertexProperties(Father::operator*());\n-2089 }\n-2090\n-2091 template\n-2092 template\n-2093 typename std::conditional::\n-type,\n-2094 C>::value,\n-2095 typename G::EdgeIterator,\n-2096 typename G::ConstEdgeIterator>::type\n-2097 inline VertexPropertiesGraph::VertexIteratorT::begin() const\n-2098 {\n-2099 return graph_->beginEdges(Father::operator*());\n-2100 }\n-2101\n-2102 template\n-2103 template\n-2104 typename std::conditional::\n-type,\n-2105 C>::value,\n-2106 typename G::EdgeIterator,\n-2107 typename G::ConstEdgeIterator>::type\n-2108 inline VertexPropertiesGraph::VertexIteratorT::end() const\n-2109 {\n-2110 return graph_->endEdges(Father::operator*());\n-2111 }\n-2112\n-2113 template\n-2114 inline typename VertexPropertiesGraph::VertexIterator\n-VertexPropertiesGraph::begin()\n-2115 {\n-2116 return VertexIterator(graph_.begin(), this);\n-2117 }\n-2118\n-2119 template\n-2120 inline typename VertexPropertiesGraph::VertexIterator\n-VertexPropertiesGraph::end()\n-2121 {\n-2122 return VertexIterator(graph_.end());\n-2123 }\n-2124\n-2125\n-2126 template\n-2127 inline typename VertexPropertiesGraph::ConstVertexIterator\n-VertexPropertiesGraph::begin() const\n-2128 {\n-2129 return ConstVertexIterator(graph_.begin(), this);\n-2130 }\n-2131\n-2132 template\n-2133 inline typename VertexPropertiesGraph::ConstVertexIterator\n-VertexPropertiesGraph::end() const\n-2134 {\n-2135 return ConstVertexIterator(graph_.end());\n-2136 }\n-2137\n-2138 template\n-2139 inline V& VertexPropertiesGraph::getVertexProperties(const\n-VertexDescriptor& vertex)\n-2140 {\n-2141 return vertexProperties_[vmap_[vertex]];\n-2142 }\n-2143\n-2144 template\n-2145 inline const V& VertexPropertiesGraph::getVertexProperties(const\n-VertexDescriptor& vertex) const\n-2146 {\n-2147 return vertexProperties_[vmap_[vertex]];\n-2148 }\n-2149\n-2150 template\n-2151 inline const G& VertexPropertiesGraph::graph() const\n-2152 {\n-2153 return graph_;\n-2154 }\n-2155\n-2156 template\n-2157 inline std::size_t VertexPropertiesGraph::noVertices() const\n-2158 {\n-2159 return graph_.noVertices();\n-2160 }\n-2161\n-2162\n-2163 template\n-2164 inline typename VertexPropertiesGraph::VertexDescriptor\n-VertexPropertiesGraph::maxVertex() const\n-2165 {\n-2166 return graph_.maxVertex();\n-2167 }\n-2168\n-2169 template\n-2170 VertexPropertiesGraph::VertexPropertiesGraph(Graph& graph, const\n-VM vmap)\n-2171 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex\n-()+1], V())\n-2172 {}\n-2173\n-2174 template\n-2175 template\n-2176 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const\n-Father& iter,\n-2177 C* graph)\n-2178 : Father(iter), graph_(graph)\n-2179 {}\n-2180\n-2181 template\n-2182 template\n-2183 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const\n-Father& iter)\n-2184 : Father(iter)\n-2185 {}\n-2186\n-2187 template\n-2188 template\n-2189 template\n-2190 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const\n-EdgeIteratorT& other)\n-2191 : Father(other), graph_(other.graph_)\n-2192 {}\n-2193\n-2194\n-2195 template\n-2196 inline std::size_t PropertiesGraph::noEdges() const\n-2197 {\n-2198 return graph_.noEdges();\n-2199 }\n-2200\n-2201 template\n-2202 template\n-2203 inline typename std::conditional::type>::value,E&,const E&>::type\n-2204 PropertiesGraph::EdgeIteratorT::properties() const\n-2205 {\n-2206 return graph_->getEdgeProperties(Father::operator*());\n-2207 }\n-2208\n-2209 template\n-2210 inline typename PropertiesGraph::EdgeIterator\n-2211 PropertiesGraph::beginEdges(const VertexDescriptor& source)\n-2212 {\n-2213 return EdgeIterator(graph_.beginEdges(source), this);\n-2214 }\n-2215\n-2216 template\n-2217 inline typename PropertiesGraph::EdgeIterator\n-2218 PropertiesGraph::endEdges(const VertexDescriptor& source)\n-2219 {\n-2220 return EdgeIterator(graph_.endEdges(source));\n-2221 }\n-2222\n-2223 template\n-2224 typename PropertiesGraph::ConstEdgeIterator\n-2225 inline PropertiesGraph::beginEdges(const VertexDescriptor&\n-source) const\n-2226 {\n-2227 return ConstEdgeIterator(graph_.beginEdges(source), this);\n-2228 }\n-2229\n-2230 template\n-2231 typename PropertiesGraph::ConstEdgeIterator\n-2232 PropertiesGraph::endEdges(const VertexDescriptor& source)\n-const\n-2233 {\n-2234 return ConstEdgeIterator(graph_.endEdges(source));\n-2235 }\n-2236\n-2237 template\n-2238 template\n-2239 PropertiesGraph::VertexIteratorT\n-2240 ::VertexIteratorT(const Father& iter,\n-2241 C* graph)\n-2242 : Father(iter), graph_(graph)\n-2243 {}\n-2244\n-2245 template\n-2246 template\n-2247 PropertiesGraph::VertexIteratorT\n-2248 ::VertexIteratorT(const Father& iter)\n-2249 : Father(iter)\n-2250 {}\n-2251\n-2252 template\n-2253 template\n-2254 template\n-2255 PropertiesGraph::VertexIteratorT\n-2256 ::VertexIteratorT(const VertexIteratorT& other)\n-2257 : Father(other), graph_(other.graph_)\n-2258 {}\n-2259\n-2260 template\n-2261 template\n-2262 inline typename std::conditional::type>::value,\n-2263 V&, const V&>::type\n-2264 PropertiesGraph::VertexIteratorT::properties() const\n-2265 {\n-2266 return graph_->getVertexProperties(Father::operator*());\n-2267 }\n-2268\n-2269 template\n-2270 template\n-2271 inline typename PropertiesGraph::template EdgeIteratorT\n-2272 PropertiesGraph::VertexIteratorT::begin() const\n-2273 {\n-2274 return graph_->beginEdges(Father::operator*());\n-2275 }\n-2276\n-2277 template\n-2278 template\n-2279 inline typename PropertiesGraph::template EdgeIteratorT\n-2280 PropertiesGraph::VertexIteratorT::end() const\n-2281 {\n-2282 return graph_->endEdges(Father::operator*());\n-2283 }\n-2284\n-2285 template\n-2286 inline typename PropertiesGraph::VertexIterator\n-PropertiesGraph::begin()\n-2287 {\n-2288 return VertexIterator(graph_.begin(), this);\n-2289 }\n-2290\n-2291 template\n-2292 inline typename PropertiesGraph::VertexIterator\n-PropertiesGraph::end()\n-2293 {\n-2294 return VertexIterator(graph_.end());\n-2295 }\n-2296\n-2297\n-2298 template\n-2299 inline typename PropertiesGraph::ConstVertexIterator\n-PropertiesGraph::begin() const\n-2300 {\n-2301 return ConstVertexIterator(graph_.begin(), this);\n-2302 }\n-2303\n-2304 template\n-2305 inline typename PropertiesGraph::ConstVertexIterator\n-PropertiesGraph::end() const\n-2306 {\n-2307 return ConstVertexIterator(graph_.end());\n-2308 }\n-2309\n-2310 template\n-2311 inline V& PropertiesGraph::getVertexProperties(const\n-VertexDescriptor& vertex)\n-2312 {\n-2313 return vertexProperties_[vmap_[vertex]];\n-2314 }\n-2315\n-2316 template\n-2317 inline const V& PropertiesGraph::getVertexProperties(const\n-VertexDescriptor& vertex) const\n-2318 {\n-2319 return vertexProperties_[vmap_[vertex]];\n-2320 }\n-2321\n-2322 template\n-2323 inline E& PropertiesGraph::getEdgeProperties(const\n-EdgeDescriptor& edge)\n-2324 {\n-2325 return edgeProperties_[emap_[edge]];\n-2326 }\n-2327\n-2328 template\n-2329 inline const E& PropertiesGraph::getEdgeProperties(const\n-EdgeDescriptor& edge) const\n-2330 {\n-2331 return edgeProperties_[emap_[edge]];\n-2332 }\n-2333\n-2334 template\n-2335 inline E& PropertiesGraph::getEdgeProperties(const\n-VertexDescriptor& source,\n-2336 const VertexDescriptor& target)\n-2337 {\n-2338 return getEdgeProperties(graph_.findEdge(source,target));\n-2339 }\n-2340\n-2341 template\n-2342 inline const E& PropertiesGraph::getEdgeProperties(const\n-VertexDescriptor& source,\n-2343 const VertexDescriptor& target) const\n-2344 {\n-2345 return getEdgeProperties(graph_.findEdge(source,target));\n-2346 }\n-2347\n-2348 template\n-2349 inline const G& PropertiesGraph::graph() const\n-2350 {\n-2351 return graph_;\n-2352 }\n-2353\n-2354 template\n-2355 inline std::size_t PropertiesGraph::noVertices() const\n-2356 {\n-2357 return graph_.noVertices();\n-2358 }\n-2359\n-2360\n-2361 template\n-2362 inline typename PropertiesGraph::VertexDescriptor\n-PropertiesGraph::maxVertex() const\n-2363 {\n-2364 return graph_.maxVertex();\n-2365 }\n-2366\n-2367 template\n-2368 PropertiesGraph::PropertiesGraph(Graph& graph, const VM&\n-vmap, const EM& emap)\n-2369 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex\n-()+1], V()),\n-2370 emap_(emap), edgeProperties_(graph_.noEdges(), E())\n-2371 {}\n-2372\n-2373 template\n-2374 inline int _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(const G& graph, const typename G::\n-VertexDescriptor& vertex,\n-2375 V& visitor)\n-2376 {\n-2377 typedef typename G::ConstEdgeIterator iterator;\n-2378 const iterator end = graph.endEdges(vertex);\n-2379 int noNeighbours=0;\n-2380 for(iterator edge = graph.beginEdges(vertex); edge != end; ++edge,\n-++noNeighbours)\n-2381 visitor(edge);\n-2382 return noNeighbours;\n-2383 }\n-2384\n-2385#endif // DOXYGEN\n-2386\n-2388 }\n-2389}\n-2390#endif\n+8#include \n+9#include \n+10#include \n+11#include \n+12\n+13#include \n+14#include \n+15#include \n+16\n+17#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+18\n+23namespace _\bD_\bu_\bn_\be\n+24{\n+25\n+_\b3_\b0 namespace DILU\n+31 {\n+32\n+50 template \n+_\b5_\b1 void _\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn(M &A, std::vector\n+&Dinv_)\n+52 {\n+53 auto endi = A.end();\n+54 for (auto row = A.begin(); row != endi; ++row)\n+55 {\n+56 const auto row_i = row.index();\n+57 const auto _\bc_\bo_\bl = row->find(row_i);\n+58 // initialise Dinv[i] = A[i, i]\n+59 Dinv_[row_i] = *_\bc_\bo_\bl;\n+60 }\n+61\n+62 for (auto row = A.begin(); row != endi; ++row)\n+63 {\n+64 const auto row_i = row.index();\n+65 for (auto a_ij = row->begin(); a_ij.index() < row_i; ++a_ij)\n+66 {\n+67 const auto col_j = a_ij.index();\n+68 const auto a_ji = A[col_j].find(row_i);\n+69 // if A[i, j] != 0 and A[j, i] != 0\n+70 if (a_ji != A[col_j].end())\n+71 {\n+72 // Dinv[i] -= A[i, j] * d[j] * A[j, i]\n+73 Dinv_[row_i] -= (*a_ij) * Dinv_[col_j] * (*a_ji);\n+74 }\n+75 }\n+76\n+77 // store the inverse\n+78 try\n+79 {\n+80 Impl::asMatrix(Dinv_[row_i]).invert(); // compute inverse of diagonal block\n+81 }\n+82 catch (Dune::FMatrixError &e)\n+83 {\n+84 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br, \"DILU failed to invert matrix block D[\" <<\n+row_i << \"]\"\n+85 << e.what();\n+86 th__ex.r = row_i;);\n+87 }\n+88 }\n+89 }\n+90\n+106 template \n+_\b1_\b0_\b7 void _\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be(const M &A, const std::vector Dinv_, X &v, const Y &d)\n+108 {\n+109 using dblock = typename Y::block_type;\n+110 using vblock = typename X::block_type;\n+111\n+112 // lower triangular solve: (D + L_A) y = d\n+113 auto endi = A.end();\n+114 for (auto row = A.begin(); row != endi; ++row)\n+115 {\n+116 const auto row_i = row.index();\n+117 dblock rhsValue(d[row_i]);\n+118 auto &&rhs = Impl::asVector(rhsValue);\n+119 for (auto a_ij = (*row).begin(); a_ij.index() < row_i; ++a_ij)\n+120 {\n+121 // if A[i][j] != 0\n+122 // rhs -= A[i][j]* y[j], where v_j stores y_j\n+123 const auto col_j = a_ij.index();\n+124 Impl::asMatrix(*a_ij).mmv(v[col_j], rhs);\n+125 }\n+126 // y_i = Dinv_i * rhs\n+127 // storing y_i in v_i\n+128 auto &&vi = Impl::asVector(v[row_i]);\n+129 Impl::asMatrix(Dinv_[row_i]).mv(rhs, vi); // (D + L_A)_ii = D_i\n+130 }\n+131\n+132 // upper triangular solve: (D + U_A) v = Dy\n+133 auto rendi = A.beforeBegin();\n+134 for (auto row = A.beforeEnd(); row != rendi; --row)\n+135 {\n+136 const auto row_i = row.index();\n+137 // rhs = 0\n+138 vblock rhs(0.0);\n+139 for (auto a_ij = (*row).beforeEnd(); a_ij.index() > row_i; --a_ij)\n+140 {\n+141 // if A[i][j] != 0\n+142 // rhs += A[i][j]*v[j]\n+143 const auto col_j = a_ij.index();\n+144 Impl::asMatrix(*a_ij).umv(v[col_j], rhs);\n+145 }\n+146 // calculate update v = M^-1*d\n+147 // v_i = y_i - Dinv_i*rhs\n+148 // before update v_i is y_i\n+149 auto &&vi = Impl::asVector(v[row_i]);\n+150 Impl::asMatrix(Dinv_[row_i]).mmv(rhs, vi);\n+151 }\n+152 }\n+153 } // end namespace DILU\n+154\n+157} // end namespace\n+158\n+159#endif\n _\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n-int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex,\n-V &visitor)\n-Visit all neighbour vertices of a vertex in a graph.\n-_\bs_\bt_\bd\n-STL namespace.\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-derive error class from the base class in common\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-The (undirected) graph of a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-MatrixGraph(Matrix &matrix)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd\n-VertexIterator end()\n-Get an iterator over the vertices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx\n-VertexDescriptor maxVertex() const\n-Get the maximal vertex descriptor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-M Matrix\n-The type of the matrix we are a graph for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-ConstVertexIterator begin() const\n-Get an iterator over the vertices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-VertexIteratorT< const MatrixGraph< Matrix > > ConstVertexIterator\n-The constant vertex iterator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:308\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\b~_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-~MatrixGraph()\n-Destructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-std::ptrdiff_t EdgeDescriptor\n-The edge descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd_\bE_\bd_\bg_\be_\bs\n-ConstEdgeIterator endEdges(const VertexDescriptor &source) const\n-Get an iterator over the edges starting at a vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-M::size_type VertexDescriptor\n-The vertex descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n-const Matrix & matrix() const\n-Get the underlying matrix.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\bM_\ba_\bt_\br_\bi_\bx\n-@ mutableMatrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs\n-ConstEdgeIterator beginEdges(const VertexDescriptor &source) const\n-Get an iterator over the edges starting at a vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd\n-ConstVertexIterator end() const\n-Get an iterator over the vertices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator\n-The constant edge iterator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:298\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs\n-EdgeIterator beginEdges(const VertexDescriptor &source)\n-Get an iterator over the edges starting at a vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n-std::size_t noVertices() const\n-Get the number of vertices in the graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bf_\bi_\bn_\bd_\bE_\bd_\bg_\be\n-EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor\n-&target) const\n-Find the descriptor of an edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bW_\be_\bi_\bg_\bh_\bt\n-M::block_type Weight\n-The type of the weights.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bM_\ba_\bt_\br_\bi_\bx\n-std::remove_const< M >::type MutableMatrix\n-The mutable type of the matrix we are a graph for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-EdgeIteratorT< MatrixGraph< Matrix > > EdgeIterator\n-The mutable edge iterator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:303\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-VertexIteratorT< MatrixGraph< Matrix > > VertexIterator\n-The mutable vertex iterator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:313\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd_\bE_\bd_\bg_\be_\bs\n-EdgeIterator endEdges(const VertexDescriptor &source)\n-Get an iterator over the edges starting at a vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bE_\bd_\bg_\be_\bs\n-std::size_t noEdges() const\n-Get the number of edges in the graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n-Matrix & matrix()\n-Get the underlying matrix.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-VertexIterator begin()\n-Get an iterator over the vertices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-Iterator over all edges starting from a vertex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be\n-std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::\n-value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >::\n-type WeightType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:156\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-EdgeIteratorT(const VertexDescriptor &source, const ColIterator &block, const\n-ColIterator &end, const EdgeDescriptor &edge)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be\n-@ isMutable\n-whether C is mutable.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bt_\ba_\br_\bg_\be_\bt\n-VertexDescriptor target() const\n-The index of the target vertex of the current edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-EdgeIteratorT< C > & operator++()\n-preincrement operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const EdgeIteratorT< const typename std::remove_const< C >::\n-type > &other) const\n-Inequality operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const EdgeIteratorT< const typename std::remove_const< C >::\n-type > &other) const\n-Equality operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-EdgeIteratorT(const EdgeIteratorT< C1 > &other)\n-Copy Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const EdgeIteratorT< typename std::remove_const< C >::type >\n-&other) const\n-Inequality operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bw_\be_\bi_\bg_\bh_\bt\n-WeightType & weight() const\n-Access the edge weight.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bs_\bo_\bu_\br_\bc_\be\n-VertexDescriptor source() const\n-The index of the source vertex of the current edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-std::conditional< isMutable &&C::mutableMatrix, typenameMatrix::row_type::\n-Iterator, typenameMatrix::row_type::ConstIterator >::type ColIterator\n-The column iterator of the matrix we use.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-const std::remove_const< C >::type ConstContainer\n-The constant type of the container type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:105\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const EdgeIteratorT< typename std::remove_const< C >::type >\n-&other) const\n-Equality operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-EdgeIteratorT(const ColIterator &block)\n-Constructor for the end iterator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bW_\be_\bi_\bg_\bh_\bt\n-std::conditional< isMutable &&C::mutableMatrix, typenameM::block_type,\n-consttypenameM::block_type >::type Weight\n-The matrix block type we use as weights.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:127\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-const EdgeDescriptor & operator*() const\n-Get the edge descriptor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>\n-const EdgeDescriptor * operator->() const\n-Get the edge descriptor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-std::remove_const< C >::type MutableContainer\n-The mutable type of the container type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-The vertex iterator type of the graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:209\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-EdgeIteratorT< C > begin() const\n-Get an iterator over all edges starting at the current vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-const VertexDescriptor & operator*() const\n-Get the descriptor of the current vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bw_\be_\bi_\bg_\bh_\bt\n-WeightType & weight() const\n-Access the weight of the vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-VertexIteratorT(C *graph, const VertexDescriptor ¤t)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be\n-std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::\n-value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >::\n-type WeightType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:266\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-VertexIteratorT(const VertexIteratorT< MutableContainer > &other)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-std::remove_const< C >::type MutableContainer\n-The mutable type of the container type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:214\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const VertexIteratorT< MutableContainer > &other) const\n-Inequality operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be\n-@ isMutable\n-whether C is mutable.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:225\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const VertexIteratorT< MutableContainer > &other) const\n-Equality operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-const std::remove_const< C >::type ConstContainer\n-The constant type of the container type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-VertexIteratorT< C > & operator++()\n-Move to the next vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\be_\bn_\bd\n-EdgeIteratorT< C > end() const\n-Get an iterator over all edges starting at the current vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const VertexIteratorT< ConstContainer > &other) const\n-Equality operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const VertexIteratorT< ConstContainer > &other) const\n-Inequality operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-VertexIteratorT(const VertexDescriptor ¤t)\n-Constructor for the end iterator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n-A subgraph of a graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:443\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bf_\bi_\bn_\bd_\bE_\bd_\bg_\be\n-EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor\n-&target) const\n-Find the descriptor of an edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx\n-VertexDescriptor maxVertex() const\n-Get the maximal vertex descriptor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-EdgeIndexMap getEdgeIndexMap()\n-Get an edge index map for the graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bE_\bd_\bg_\be_\bs\n-std::size_t noEdges() const\n-Get the number of edges in the graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd_\bE_\bd_\bg_\be_\bs\n-ConstEdgeIterator endEdges(const VertexDescriptor &source) const\n-Get an iterator over the edges starting at a vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd\n-ConstVertexIterator end() const\n-Get an iterator over the vertices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs\n-ConstEdgeIterator beginEdges(const VertexDescriptor &source) const\n-Get an iterator over the edges starting at a vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n-std::size_t noVertices() const\n-Get the number of vertices in the graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd\n-T Excluded\n-Random access container providing information about which vertices are\n-excluded.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:454\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\b~_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n-~SubGraph()\n-Destructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-EdgeIterator ConstEdgeIterator\n-The constant edge iterator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:618\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bG_\br_\ba_\bp_\bh\n-G Graph\n-The type of the graph we are a sub graph for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:448\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-VertexIterator ConstVertexIterator\n-The constant vertex iterator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:623\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n-SubGraph(const Graph &graph, const T &excluded)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-ConstVertexIterator begin() const\n-Get an iterator over the vertices.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-Graph::VertexDescriptor VertexDescriptor\n-The vertex descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:459\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-VertexDescriptor * EdgeDescriptor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:461\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-An index map for mapping the edges to indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:470\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-EdgeIndexMap(const EdgeIndexMap &emap)\n-Protect copy construction.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:479\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-ReadablePropertyMapTag Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:472\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-EdgeIndexMap(const EdgeDescriptor &firstEdge)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:474\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-std::size_t operator[](const EdgeDescriptor &edge) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:483\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-The edge iterator of the graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:505\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-const EdgeDescriptor & dereference() const\n-The descriptor of the current edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-EdgeIterator(const EdgeDescriptor &edge)\n-Constructor for the end iterator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const EdgeIterator &other) const\n-Equality operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be\n-EdgeIterator & advance(std::ptrdiff_t n)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n-EdgeIterator & increment()\n-Preincrement operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bt_\ba_\br_\bg_\be_\bt\n-const VertexDescriptor & target() const\n-The index of the target vertex of the current edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bo_\bu_\br_\bc_\be\n-const VertexDescriptor & source() const\n-The index of the source vertex of the current edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n-EdgeIterator & decrement()\n-Preincrement operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n-std::ptrdiff_t distanceTo(const EdgeIterator &other) const\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-EdgeIterator(const VertexDescriptor &source, const EdgeDescriptor &edge)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-The vertex iterator of the graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-VertexIterator(const VertexDescriptor ¤t)\n-Constructor for end iterator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n-VertexIterator & increment()\n-Preincrement operator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-EdgeIterator begin() const\n-Get an iterator over all edges starting at the current vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const VertexIterator &other) const\n-Equality iterator.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-VertexIterator(const SubGraph< G, T > *graph, const VertexDescriptor ¤t,\n-const VertexDescriptor &end)\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n-EdgeIterator end() const\n-Get an iterator over all edges starting at the current vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-const VertexDescriptor & dereference() const\n-Get the descriptor of the current vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n-Attaches properties to the vertices of a graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:723\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\br_\ba_\bp_\bh\n-const Graph & graph() const\n-Get the graph the properties are attached to.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Graph::ConstEdgeIterator ConstEdgeIterator\n-The type of the constant edge iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:766\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-VertexProperties & getVertexProperties(const VertexDescriptor &vertex)\n-Get the properties associated with a vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bE_\bd_\bg_\be_\bs\n-std::size_t noEdges() const\n-Get the number of edges in the graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-Graph::EdgeDescriptor EdgeDescriptor\n-The edge descritor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:738\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd_\bE_\bd_\bg_\be_\bs\n-ConstEdgeIterator endEdges(const VertexDescriptor &source) const\n-Get the mutable edge iterator over edges starting at a vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-Graph::VertexDescriptor VertexDescriptor\n-The vertex descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:733\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bG_\br_\ba_\bp_\bh\n-G Graph\n-The graph we attach properties to.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:728\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp\n-VM VertexMap\n-The type of the map for converting the VertexDescriptor to std::size_t.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:756\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd_\bE_\bd_\bg_\be_\bs\n-EdgeIterator endEdges(const VertexDescriptor &source)\n-Get the mutable edge iterator over edges starting at a vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs\n-EdgeIterator beginEdges(const VertexDescriptor &source)\n-Get the mutable edge iterator over edges starting at a vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-VP VertexProperties\n-The type of the properties of the vertices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:743\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n-std::size_t noVertices() const\n-Get the number of vertices in the graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs\n-ConstEdgeIterator beginEdges(const VertexDescriptor &source) const\n-Get the mutable edge iterator over edges starting at a vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx\n-VertexDescriptor maxVertex() const\n-Get the maximal vertex descriptor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Graph::EdgeIterator EdgeIterator\n-The type of the mutable edge iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:761\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:803\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::\n-value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type\n-EdgeIterator\n-The class of the edge iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:823\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::\n-value, VertexProperties &, constVertexProperties & >::type properties() const\n-Get the properties of the current Vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\be_\bn_\bd\n-EdgeIterator end() const\n-Get an iterator over the edges starting from the current vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bF_\ba_\bt_\bh_\be_\br\n-std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::\n-value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >::\n-type Father\n-The father class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:814\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-EdgeIterator begin() const\n-Get an iterator over the edges starting from the current vertex.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n-Attaches properties to the edges and vertices of a graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:978\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n-std::size_t noVertices() const\n-Get the number of vertices in the graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-Graph::EdgeDescriptor EdgeDescriptor\n-The edge descritor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:993\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-const EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const\n-VertexDescriptor &target) const\n-Get the properties associated with a edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-const EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge) const\n-Get the properties associated with a edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\br_\ba_\bp_\bh\n-const Graph & graph() const\n-Get the graph the properties are attached to.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx\n-VertexDescriptor maxVertex() const\n-Get the maximal vertex descriptor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bG_\br_\ba_\bp_\bh\n-G Graph\n-The graph we attach properties to.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:983\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bM_\ba_\bp\n-EM EdgeMap\n-The type of the map for converting the EdgeDescriptor to std::size_t.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1030\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp\n-VM VertexMap\n-The type of the map for converting the VertexDescriptor to std::size_t.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1011\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-VP VertexProperties\n-The type of the properties of the vertices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:998\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bE_\bd_\bg_\be_\bs\n-std::size_t noEdges() const\n-Get the number of edges in the graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-EP EdgeProperties\n-The type of the properties of the edges;.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1016\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const\n-VertexDescriptor &target)\n-Get the properties associated with a edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge)\n-Get the properties associated with a edge.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n-Graph::VertexDescriptor VertexDescriptor\n-The vertex descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:988\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n-PropertiesGraph(Graph &graph, const VertexMap &vmap=VertexMap(), const EdgeMap\n-&emap=EdgeMap())\n-Constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1038\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bF_\ba_\bt_\bh_\be_\br\n-std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::\n-value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type\n-Father\n-The father class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1050\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1140\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bF_\ba_\bt_\bh_\be_\br\n-std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::\n-value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >::\n-type Father\n-The father class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-Wrapper to access the internal edge properties of a graph via operator[]()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1361\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-GraphVertexPropertiesSelector(G &g)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1380\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-VertexProperties & operator[](const Vertex &vertex) const\n-Get the properties associated to a vertex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1395\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh\n-G Graph\n-The type of the graph with internal properties.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1366\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-G::VertexProperties VertexProperties\n-The type of the vertex properties.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1370\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-GraphVertexPropertiesSelector()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1386\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-G::VertexDescriptor Vertex\n-The vertex descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1374\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-Wrapper to access the internal vertex properties of a graph via operator[]()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1409\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-EdgeProperties & operator[](const Edge &edge) const\n-Get the properties associated to a vertex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1442\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-G::EdgeProperties EdgeProperties\n-The type of the vertex properties.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1418\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bE_\bd_\bg_\be\n-G::EdgeDescriptor Edge\n-The edge descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1422\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-GraphEdgePropertiesSelector()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1434\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh\n-G Graph\n-The type of the graph with internal properties.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1414\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-GraphEdgePropertiesSelector(G &g)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1428\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n+void blockDILUDecomposition(M &A, std::vector< typename M::block_type > &Dinv_)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dilu.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bD_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n+void blockDILUBacksolve(const M &A, const std::vector< typename M::block_type >\n+Dinv_, X &v, const Y &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dilu.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br\n+Error when performing an operation on a matrix block.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:52\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00116.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00116.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: galerkin.hh File Reference\n+dune-istl: solvertype.hh File Reference\n \n \n \n \n \n \n \n@@ -65,74 +65,44 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n- \n+
    solvertype.hh File Reference
    \n
    \n
    \n \n-

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

    Templates characterizing the type of a solver. \n More...

    \n-
    #include "aggregates.hh"
    \n-#include "pinfo.hh"
    \n-#include <dune/common/poolallocator.hh>
    \n-#include <dune/common/enumset.hh>
    \n-#include <set>
    \n-#include <limits>
    \n-#include <algorithm>
    \n-
    \n+\n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n

    \n Classes

    struct  Dune::Amg::OverlapVertex< T >
     
    class  Dune::Amg::SparsityBuilder< M >
     Functor for building the sparsity pattern of the matrix using examineConnectivity. More...
     
    class  Dune::Amg::BaseGalerkinProduct
     
    class  Dune::Amg::GalerkinProduct< T >
     
    class  Dune::Amg::GalerkinProduct< SequentialInformation >
    struct  Dune::IsDirectSolver< Solver >
     
    struct  Dune::Amg::BaseConnectivityConstructor
     
    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::StoresColumnCompressed< Solver >
     
    \n \n \n \n-\n-\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n

    Detailed Description

    \n-

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

    \n-
    Author
    Markus Blatt
    \n+

    Templates characterizing the type of a solver.

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,60 +1,22 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-galerkin.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Provides a class for building the galerkin product based on a aggregation\n-scheme. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n-#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n-#include \n-#include \n-#include \n-#include \n-#include \n+solvertype.hh File Reference\n+Templates characterizing the type of a solver. _\bM_\bo_\br_\be_\b._\b._\b.\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\b _\bT_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bS_\bo_\bl_\bv_\be_\br_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\b _\bM_\b _\b>\n-\u00a0 Functor for building the sparsity pattern of the matrix using\n- examineConnectivity. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bT_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\b _\bG_\b,_\b _\bS_\b,_\b _\bV_\b _\b>\n-\u00a0 Visitor for identifying connected aggregates during a\n- breadthFirstSearch. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\b _\bG_\b,_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\b _\bG_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\b _\bS_\bo_\bl_\bv_\be_\br_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides a class for building the galerkin product based on a aggregation\n-scheme.\n- Author\n- Markus Blatt\n+Templates characterizing the type of a solver.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00116_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00116_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: galerkin.hh Source File\n+dune-istl: solvertype.hh Source File\n \n \n \n \n \n \n \n@@ -70,742 +70,58 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    galerkin.hh
    \n+
    solvertype.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_GALERKIN_HH
    \n-
    6#define DUNE_GALERKIN_HH
    \n+
    5#ifndef DUNE_ISTL_SOLVERTYPE_HH
    \n+
    6#define DUNE_ISTL_SOLVERTYPE_HH
    \n
    7
    \n-
    8#include "aggregates.hh"
    \n-
    9#include "pinfo.hh"
    \n-
    10#include <dune/common/poolallocator.hh>
    \n-
    11#include <dune/common/enumset.hh>
    \n-
    12#include <set>
    \n-
    13#include <limits>
    \n-
    14#include <algorithm>
    \n-
    15
    \n-
    16namespace Dune
    \n-
    17{
    \n-
    18 namespace Amg
    \n-
    19 {
    \n-
    31 template<class T>
    \n-
    \n-\n-
    33 {
    \n-
    37 typedef T Aggregate;
    \n-
    38
    \n-
    42 typedef T Vertex;
    \n-
    43
    \n-\n-
    48
    \n-\n-
    53 };
    \n+
    12namespace Dune
    \n+
    13{
    \n+
    14 template<typename Solver>
    \n+
    \n+\n+
    16 {
    \n+
    17 enum
    \n+
    18 {
    \n+
    24 value =false
    \n+
    25 };
    \n+
    26 };
    \n+
    \n+
    27
    \n+
    28 template<typename Solver>
    \n+
    \n+\n+
    30 {
    \n+
    31 enum
    \n+
    32 {
    \n+
    36 value = false
    \n+
    37 };
    \n+
    38 };
    \n
    \n-
    54
    \n-
    55
    \n-
    56
    \n-
    61 template<class M>
    \n-
    \n-\n-
    63 {
    \n-
    64 public:
    \n-
    70 SparsityBuilder(M& matrix);
    \n-
    71
    \n-
    72 void insert(const typename M::size_type& index);
    \n-
    73
    \n-
    74 void operator++();
    \n-
    75
    \n-
    76 std::size_t minRowSize();
    \n-
    77
    \n-
    78 std::size_t maxRowSize();
    \n-
    79
    \n-
    80 std::size_t sumRowSize();
    \n-
    \n-
    81 std::size_t index()
    \n-
    82 {
    \n-
    83 return row_.index();
    \n-
    84 }
    \n-
    \n-
    85 private:
    \n-
    87 typename M::CreateIterator row_;
    \n-
    89 std::size_t minRowSize_;
    \n-
    91 std::size_t maxRowSize_;
    \n-
    92 std::size_t sumRowSize_;
    \n-
    93#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    94 bool diagonalInserted;
    \n-
    95#endif
    \n-
    96 };
    \n-
    \n-
    97
    \n-
    \n-\n-
    99 {
    \n-
    100 public:
    \n-
    109 template<class M, class V, class I, class O>
    \n-
    110 void calculate(const M& fine, const AggregatesMap<V>& aggregates, M& coarse,
    \n-
    111 const I& pinfo, const O& copy);
    \n-
    112
    \n-
    113 };
    \n-
    \n-
    114
    \n-
    115 template<class T>
    \n-
    \n-\n-
    117 : public BaseGalerkinProduct
    \n-
    118 {
    \n-
    119 public:
    \n-\n-
    121
    \n-
    131 template<class G, class V, class Set>
    \n-
    132 typename G::MutableMatrix* build(G& fineGraph, V& visitedMap,
    \n-
    133 const ParallelInformation& pinfo,
    \n-\n-
    135 const typename G::Matrix::size_type& size,
    \n-
    136 const Set& copy);
    \n-
    137 private:
    \n-
    138
    \n-
    145 template<class G, class I, class Set>
    \n-\n-
    147 buildOverlapVertices(const G& graph, const I& pinfo,
    \n-\n-
    149 const Set& overlap,
    \n-
    150 std::size_t& overlapCount);
    \n-
    151
    \n-
    152 template<class A>
    \n-
    153 struct OVLess
    \n-
    154 {
    \n-
    \n-\n-
    156 {
    \n-
    157 return *o1.aggregate < *o2.aggregate;
    \n-
    158 }
    \n-
    \n-
    159 };
    \n-
    160 };
    \n-
    \n-
    161
    \n-
    162 template<>
    \n-
    \n-\n-
    164 : public BaseGalerkinProduct
    \n-
    165 {
    \n-
    166 public:
    \n-
    176 template<class G, class V, class Set>
    \n-
    177 typename G::MutableMatrix* build(G& fineGraph, V& visitedMap,
    \n-
    178 const SequentialInformation& pinfo,
    \n-\n-
    180 const typename G::Matrix::size_type& size,
    \n-
    181 const Set& copy);
    \n-
    182 };
    \n-
    \n-
    183
    \n-
    \n-\n-
    185 {
    \n-
    186 template<class R, class G, class V>
    \n-
    187 static void constructOverlapConnectivity(R& row, G& graph, V& visitedMap,
    \n-\n-\n-\n-
    191
    \n-
    195 template<class R, class G, class V>
    \n-
    196 static void constructNonOverlapConnectivity(R& row, G& graph, V& visitedMap,
    \n-\n-
    198 const typename G::VertexDescriptor& seed);
    \n-
    199
    \n-
    200
    \n-
    204 template<class G, class S, class V>
    \n-
    \n-\n-
    206 {
    \n-
    207 public:
    \n-
    211 typedef G Graph;
    \n-
    215 typedef typename Graph::ConstEdgeIterator ConstEdgeIterator;
    \n-
    216
    \n-
    220 typedef S Set;
    \n-
    221
    \n-
    225 typedef V VisitedMap;
    \n-
    226
    \n-
    230 typedef typename Graph::VertexDescriptor Vertex;
    \n-
    231
    \n-
    239 ConnectedBuilder(const AggregatesMap<Vertex>& aggregates, Graph& graph,
    \n-
    240 VisitedMap& visitedMap, Set& connected);
    \n-
    241
    \n-
    246 void operator()(const ConstEdgeIterator& edge);
    \n-
    247
    \n-
    248 private:
    \n-
    252 const AggregatesMap<Vertex>& aggregates_;
    \n-
    253
    \n-
    254 Graph& graph_;
    \n-
    255
    \n-
    259 VisitedMap& visitedMap_;
    \n-
    260
    \n-
    264 Set& connected_;
    \n-
    265 };
    \n-
    \n-
    266
    \n-
    267 };
    \n-
    \n-
    268
    \n-
    269 template<class G, class T>
    \n-
    \n-\n-
    271 {
    \n-
    272 typedef typename G::VertexDescriptor Vertex;
    \n-
    273
    \n-
    274 template<class V, class O, class R>
    \n-
    275 static void examine(G& graph,
    \n-
    276 V& visitedMap,
    \n-
    277 const T& pinfo,
    \n-
    278 const AggregatesMap<Vertex>& aggregates,
    \n-
    279 const O& overlap,
    \n-
    280 const OverlapVertex<Vertex>* overlapVertices,
    \n-
    281 const OverlapVertex<Vertex>* overlapEnd,
    \n-
    282 R& row);
    \n-
    283 };
    \n-
    \n-
    284
    \n-
    285 template<class G>
    \n-
    \n-\n-
    287 {
    \n-
    288 typedef typename G::VertexDescriptor Vertex;
    \n-
    289
    \n-
    290 template<class V, class R>
    \n-
    291 static void examine(G& graph,
    \n-
    292 V& visitedMap,
    \n-
    293 const SequentialInformation& pinfo,
    \n-
    294 const AggregatesMap<Vertex>& aggregates,
    \n-
    295 R& row);
    \n-
    296 };
    \n-
    \n-
    297
    \n-
    298 template<class T>
    \n-
    \n-\n-
    300 {
    \n-
    301 template<class M, class O>
    \n-
    302 static void set(M& coarse, const T& pinfo, const O& copy);
    \n-
    303 };
    \n-
    \n-
    304
    \n-
    305 template<>
    \n-
    \n-\n-
    307 {
    \n-
    308 template<class M, class O>
    \n-
    309 static void set(M& coarse, const SequentialInformation& pinfo, const O& copy);
    \n-
    310 };
    \n-
    \n-
    311
    \n-
    312 template<class R, class G, class V>
    \n-
    \n-\n-\n-
    315 const typename G::VertexDescriptor& seed)
    \n-
    316 {
    \n-
    317 assert(row.index()==aggregates[seed]);
    \n-
    318 row.insert(aggregates[seed]);
    \n-
    319 ConnectedBuilder<G,R,V> conBuilder(aggregates, graph, visitedMap, row);
    \n-
    320 typedef typename G::VertexDescriptor Vertex;
    \n-
    321 typedef std::allocator<Vertex> Allocator;
    \n-
    322 typedef SLList<Vertex,Allocator> VertexList;
    \n-
    323 typedef typename AggregatesMap<Vertex>::DummyEdgeVisitor DummyVisitor;
    \n-
    324 VertexList vlist;
    \n-
    325 DummyVisitor dummy;
    \n-
    326 aggregates.template breadthFirstSearch<true,false>(seed,aggregates[seed], graph, vlist, dummy,
    \n-
    327 conBuilder, visitedMap);
    \n-
    328 }
    \n-
    \n-
    329
    \n-
    330 template<class R, class G, class V>
    \n-
    \n-\n-\n-\n-\n-
    335 {
    \n-
    336 ConnectedBuilder<G,R,V> conBuilder(aggregates, graph, visitedMap, row);
    \n-
    337 const typename G::VertexDescriptor aggregate=*seed->aggregate;
    \n-
    338
    \n-
    339 if (row.index()==*seed->aggregate) {
    \n-
    340 while(seed != overlapEnd && aggregate == *seed->aggregate) {
    \n-
    341 row.insert(*seed->aggregate);
    \n-
    342 // Walk over all neighbours and add them to the connected array.
    \n-
    343 visitNeighbours(graph, seed->vertex, conBuilder);
    \n-
    344 // Mark vertex as visited
    \n-
    345 put(visitedMap, seed->vertex, true);
    \n-
    346 ++seed;
    \n-
    347 }
    \n-
    348 }
    \n-
    349 }
    \n-
    \n-
    350
    \n-
    351 template<class G, class S, class V>
    \n-
    \n-\n-
    353 Graph& graph, VisitedMap& visitedMap,
    \n-
    354 Set& connected)
    \n-
    355 : aggregates_(aggregates), graph_(graph), visitedMap_(visitedMap), connected_(connected)
    \n-
    356 {}
    \n-
    \n-
    357
    \n-
    358 template<class G, class S, class V>
    \n-
    \n-\n-
    360 {
    \n-
    361 const Vertex& vertex = aggregates_[edge.target()];
    \n-\n-\n-
    364 connected_.insert(vertex);
    \n-
    365 }
    \n-
    \n-
    366
    \n-
    367 template<class T>
    \n-
    368 template<class G, class I, class Set>
    \n-\n-
    370 GalerkinProduct<T>::buildOverlapVertices(const G& graph, const I& pinfo,
    \n-\n-
    372 const Set& overlap,
    \n-
    373 std::size_t& overlapCount)
    \n-
    374 {
    \n-
    375 // count the overlap vertices.
    \n-
    376 typedef typename G::ConstVertexIterator ConstIterator;
    \n-
    377 typedef typename I::GlobalLookupIndexSet GlobalLookup;
    \n-
    378 typedef typename GlobalLookup::IndexPair IndexPair;
    \n-
    379
    \n-
    380 const ConstIterator end = graph.end();
    \n-
    381 overlapCount = 0;
    \n-
    382
    \n-
    383 const GlobalLookup& lookup=pinfo.globalLookup();
    \n-
    384
    \n-
    385 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {
    \n-
    386 const IndexPair* pair = lookup.pair(*vertex);
    \n-
    387
    \n-
    388 if(pair!=0 && overlap.contains(pair->local().attribute()))
    \n-
    389 ++overlapCount;
    \n-
    390 }
    \n-
    391 // Allocate space
    \n-
    392 typedef typename G::VertexDescriptor Vertex;
    \n-
    393
    \n-
    394 OverlapVertex<Vertex>* overlapVertices = new OverlapVertex<Vertex>[overlapCount=0 ? 1 : overlapCount];
    \n-
    395 if(overlapCount==0)
    \n-
    396 return overlapVertices;
    \n-
    397
    \n-
    398 // Initialize them
    \n-
    399 overlapCount=0;
    \n-
    400 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {
    \n-
    401 const IndexPair* pair = lookup.pair(*vertex);
    \n-
    402
    \n-
    403 if(pair!=0 && overlap.contains(pair->local().attribute())) {
    \n-
    404 overlapVertices[overlapCount].aggregate = &aggregates[pair->local()];
    \n-
    405 overlapVertices[overlapCount].vertex = pair->local();
    \n-
    406 ++overlapCount;
    \n-
    407 }
    \n-
    408 }
    \n-
    409
    \n-
    410 dverb << overlapCount<<" overlap vertices"<<std::endl;
    \n-
    411
    \n-
    412 std::sort(overlapVertices, overlapVertices+overlapCount, OVLess<Vertex>());
    \n-
    413 // due to the sorting the isolated aggregates (to be skipped) are at the end.
    \n-
    414
    \n-
    415 return overlapVertices;
    \n-
    416 }
    \n-
    417
    \n-
    418 template<class G, class T>
    \n-
    419 template<class V, class O, class R>
    \n-
    \n-\n-
    421 V& visitedMap,
    \n-
    422 const T& pinfo,
    \n-
    423 const AggregatesMap<Vertex>& aggregates,
    \n-
    424 const O& overlap,
    \n-
    425 const OverlapVertex<Vertex>* overlapVertices,
    \n-
    426 const OverlapVertex<Vertex>* overlapEnd,
    \n-
    427 R& row)
    \n-
    428 {
    \n-
    429 typedef typename T::GlobalLookupIndexSet GlobalLookup;
    \n-
    430 const GlobalLookup& lookup = pinfo.globalLookup();
    \n-
    431
    \n-
    432 typedef typename G::VertexIterator VertexIterator;
    \n-
    433
    \n-
    434 VertexIterator vend=graph.end();
    \n-
    435
    \n-
    436#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    437 std::set<Vertex> examined;
    \n-
    438#endif
    \n-
    439
    \n-
    440 // The aggregates owned by the process have lower local indices
    \n-
    441 // then those not owned. We process them in the first pass.
    \n-
    442 // They represent the rows 0, 1, ..., n of the coarse matrix
    \n-
    443 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex)
    \n-
    444 if(!get(visitedMap, *vertex)) {
    \n-
    445 // In the first pass we only process owner nodes
    \n-
    446 typedef typename GlobalLookup::IndexPair IndexPair;
    \n-
    447 const IndexPair* pair = lookup.pair(*vertex);
    \n-
    448 if(pair==0 || !overlap.contains(pair->local().attribute())) {
    \n-
    449#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    450 assert(examined.find(aggregates[*vertex])==examined.end());
    \n-
    451 examined.insert(aggregates[*vertex]);
    \n-
    452#endif
    \n-
    453 constructNonOverlapConnectivity(row, graph, visitedMap, aggregates, *vertex);
    \n-
    454
    \n-
    455 // only needed for ALU
    \n-
    456 // (ghosts with same global id as owners on the same process)
    \n-
    457 if (SolverCategory::category(pinfo) == static_cast<int>(SolverCategory::nonoverlapping)) {
    \n-
    458 if(overlapVertices != overlapEnd) {
    \n-
    459 if(*overlapVertices->aggregate!=AggregatesMap<Vertex>::ISOLATED) {
    \n-
    460 constructOverlapConnectivity(row, graph, visitedMap, aggregates, overlapVertices, overlapEnd);
    \n-
    461 }
    \n-
    462 else{
    \n-
    463 ++overlapVertices;
    \n-
    464 }
    \n-
    465 }
    \n-
    466 }
    \n-
    467 ++row;
    \n-
    468 }
    \n-
    469 }
    \n-
    470
    \n-
    471 dvverb<<"constructed "<<row.index()<<" non-overlapping rows"<<std::endl;
    \n-
    472
    \n-
    473 // Now come the aggregates not owned by use.
    \n-
    474 // They represent the rows n+1, ..., N
    \n-
    475 while(overlapVertices != overlapEnd)
    \n-
    476 if(*overlapVertices->aggregate!=AggregatesMap<Vertex>::ISOLATED) {
    \n-
    477
    \n-
    478#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    479 typedef typename GlobalLookup::IndexPair IndexPair;
    \n-
    480 const IndexPair* pair = lookup.pair(overlapVertices->vertex);
    \n-
    481 assert(pair!=0 && overlap.contains(pair->local().attribute()));
    \n-
    482 assert(examined.find(aggregates[overlapVertices->vertex])==examined.end());
    \n-
    483 examined.insert(aggregates[overlapVertices->vertex]);
    \n-
    484#endif
    \n-
    485 constructOverlapConnectivity(row, graph, visitedMap, aggregates, overlapVertices, overlapEnd);
    \n-
    486 ++row;
    \n-
    487 }else{
    \n-
    488 ++overlapVertices;
    \n-
    489 }
    \n-
    490 }
    \n-
    \n-
    491
    \n-
    492 template<class G>
    \n-
    493 template<class V, class R>
    \n-
    \n-\n-
    495 V& visitedMap,
    \n-
    496 [[maybe_unused]] const SequentialInformation& pinfo,
    \n-
    497 const AggregatesMap<Vertex>& aggregates,
    \n-
    498 R& row)
    \n-
    499 {
    \n-
    500 typedef typename G::VertexIterator VertexIterator;
    \n-
    501
    \n-
    502 VertexIterator vend=graph.end();
    \n-
    503 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex) {
    \n-
    504 if(!get(visitedMap, *vertex)) {
    \n-
    505 constructNonOverlapConnectivity(row, graph, visitedMap, aggregates, *vertex);
    \n-
    506 ++row;
    \n-
    507 }
    \n-
    508 }
    \n-
    509
    \n-
    510 }
    \n-
    \n-
    511
    \n-
    512 template<class M>
    \n-
    \n-\n-
    514 : row_(matrix.createbegin()),
    \n-
    515 minRowSize_(std::numeric_limits<std::size_t>::max()),
    \n-
    516 maxRowSize_(0), sumRowSize_(0)
    \n-
    517 {
    \n-
    518#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    519 diagonalInserted = false;
    \n-
    520#endif
    \n-
    521 }
    \n-
    \n-
    522 template<class M>
    \n-
    \n-\n-
    524 {
    \n-
    525 return maxRowSize_;
    \n-
    526 }
    \n-
    \n-
    527 template<class M>
    \n-
    \n-\n-
    529 {
    \n-
    530 return minRowSize_;
    \n-
    531 }
    \n-
    \n-
    532
    \n-
    533 template<class M>
    \n-
    \n-\n-
    535 {
    \n-
    536 return sumRowSize_;
    \n-
    537 }
    \n-
    \n-
    538 template<class M>
    \n-
    \n-\n-
    540 {
    \n-
    541 sumRowSize_ += row_.size();
    \n-
    542 minRowSize_=std::min(minRowSize_, row_.size());
    \n-
    543 maxRowSize_=std::max(maxRowSize_, row_.size());
    \n-
    544 ++row_;
    \n-
    545#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    546 assert(diagonalInserted);
    \n-
    547 diagonalInserted = false;
    \n-
    548#endif
    \n-
    549 }
    \n-
    \n-
    550
    \n-
    551 template<class M>
    \n-
    \n-
    552 void SparsityBuilder<M>::insert(const typename M::size_type& index)
    \n-
    553 {
    \n-
    554 row_.insert(index);
    \n-
    555#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    556 diagonalInserted = diagonalInserted || row_.index()==index;
    \n-
    557#endif
    \n-
    558 }
    \n-
    \n-
    559
    \n-
    560 template<class T>
    \n-
    561 template<class G, class V, class Set>
    \n-
    562 typename G::MutableMatrix*
    \n-
    \n-
    563 GalerkinProduct<T>::build(G& fineGraph, V& visitedMap,
    \n-
    564 const ParallelInformation& pinfo,
    \n-\n-
    566 const typename G::Matrix::size_type& size,
    \n-
    567 const Set& overlap)
    \n-
    568 {
    \n-\n-
    570
    \n-
    571 std::size_t count;
    \n-
    572
    \n-
    573 const OverlapVertex* overlapVertices = buildOverlapVertices(fineGraph,
    \n-
    574 pinfo,
    \n-
    575 aggregates,
    \n-
    576 overlap,
    \n-
    577 count);
    \n-
    578 typedef typename G::MutableMatrix M;
    \n-
    579 M* coarseMatrix = new M(size, size, M::row_wise);
    \n-
    580
    \n-
    581 // Reset the visited flags of all vertices.
    \n-
    582 // As the isolated nodes will be skipped we simply mark them as visited
    \n-
    583
    \n-
    584 typedef typename G::VertexIterator Vertex;
    \n-
    585 Vertex vend = fineGraph.end();
    \n-
    586 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {
    \n-\n-
    588 put(visitedMap, *vertex, aggregates[*vertex]==AggregatesMap<typename G::VertexDescriptor>::ISOLATED);
    \n-
    589 }
    \n-
    590
    \n-
    591 typedef typename G::MutableMatrix M;
    \n-
    592 SparsityBuilder<M> sparsityBuilder(*coarseMatrix);
    \n-
    593
    \n-
    594 ConnectivityConstructor<G,T>::examine(fineGraph, visitedMap, pinfo,
    \n-
    595 aggregates, overlap,
    \n-
    596 overlapVertices,
    \n-
    597 overlapVertices+count,
    \n-
    598 sparsityBuilder);
    \n-
    599
    \n-
    600 dinfo<<pinfo.communicator().rank()<<": Matrix ("<<coarseMatrix->N()<<"x"<<coarseMatrix->M()<<" row: min="<<sparsityBuilder.minRowSize()<<" max="
    \n-
    601 <<sparsityBuilder.maxRowSize()<<" avg="
    \n-
    602 <<static_cast<double>(sparsityBuilder.sumRowSize())/coarseMatrix->N()
    \n-
    603 <<std::endl;
    \n-
    604
    \n-
    605 delete[] overlapVertices;
    \n-
    606
    \n-
    607 return coarseMatrix;
    \n-
    608 }
    \n-
    \n-
    609
    \n-
    610 template<class G, class V, class Set>
    \n-
    611 typename G::MutableMatrix*
    \n-
    \n-\n-
    613 const SequentialInformation& pinfo,
    \n-\n-
    615 const typename G::Matrix::size_type& size,
    \n-
    616 [[maybe_unused]] const Set& overlap)
    \n-
    617 {
    \n-
    618 typedef typename G::MutableMatrix M;
    \n-
    619 M* coarseMatrix = new M(size, size, M::row_wise);
    \n-
    620
    \n-
    621 // Reset the visited flags of all vertices.
    \n-
    622 // As the isolated nodes will be skipped we simply mark them as visited
    \n-
    623
    \n-
    624 typedef typename G::VertexIterator Vertex;
    \n-
    625 Vertex vend = fineGraph.end();
    \n-
    626 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {
    \n-\n-
    628 put(visitedMap, *vertex, aggregates[*vertex]==AggregatesMap<typename G::VertexDescriptor>::ISOLATED);
    \n-
    629 }
    \n-
    630
    \n-
    631 SparsityBuilder<M> sparsityBuilder(*coarseMatrix);
    \n-
    632
    \n-\n-
    634 aggregates, sparsityBuilder);
    \n-
    635 dinfo<<"Matrix row: min="<<sparsityBuilder.minRowSize()<<" max="
    \n-
    636 <<sparsityBuilder.maxRowSize()<<" average="
    \n-
    637 <<static_cast<double>(sparsityBuilder.sumRowSize())/coarseMatrix->N()<<std::endl;
    \n-
    638 return coarseMatrix;
    \n-
    639 }
    \n-
    \n-
    640
    \n-
    641 template<class M, class V, class P, class O>
    \n-
    \n-
    642 void BaseGalerkinProduct::calculate(const M& fine, const AggregatesMap<V>& aggregates, M& coarse,
    \n-
    643 const P& pinfo, [[maybe_unused]] const O& copy)
    \n-
    644 {
    \n-
    645 coarse = static_cast<typename M::field_type>(0);
    \n-
    646
    \n-
    647 typedef typename M::ConstIterator RowIterator;
    \n-
    648 RowIterator endRow = fine.end();
    \n-
    649
    \n-
    650 for(RowIterator row = fine.begin(); row != endRow; ++row)
    \n-
    651 if(aggregates[row.index()] != AggregatesMap<V>::ISOLATED) {
    \n-
    652 assert(aggregates[row.index()]!=AggregatesMap<V>::UNAGGREGATED);
    \n-
    653 typedef typename M::ConstColIterator ColIterator;
    \n-
    654 ColIterator endCol = row->end();
    \n-
    655
    \n-
    656 for(ColIterator col = row->begin(); col != endCol; ++col)
    \n-
    657 if(aggregates[col.index()] != AggregatesMap<V>::ISOLATED) {
    \n-
    658 assert(aggregates[row.index()]!=AggregatesMap<V>::UNAGGREGATED);
    \n-
    659 coarse[aggregates[row.index()]][aggregates[col.index()]]+=*col;
    \n-
    660 }
    \n-
    661 }
    \n-
    662
    \n-
    663 // get the right diagonal matrix values on copy lines from owner processes
    \n-
    664 typedef typename M::block_type BlockType;
    \n-
    665 std::vector<BlockType> rowsize(coarse.N(),BlockType(0));
    \n-
    666 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)
    \n-
    667 rowsize[row.index()]=coarse[row.index()][row.index()];
    \n-
    668 pinfo.copyOwnerToAll(rowsize,rowsize);
    \n-
    669 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)
    \n-
    670 coarse[row.index()][row.index()] = rowsize[row.index()];
    \n-
    671
    \n-
    672 // don't set dirichlet boundaries for copy lines to make novlp case work,
    \n-
    673 // the preconditioner yields slightly different results now.
    \n-
    674
    \n-
    675 // Set the dirichlet border
    \n-
    676 //DirichletBoundarySetter<P>::template set<M>(coarse, pinfo, copy);
    \n-
    677
    \n-
    678 }
    \n-
    \n-
    679
    \n-
    680 template<class T>
    \n-
    681 template<class M, class O>
    \n-
    \n-
    682 void DirichletBoundarySetter<T>::set(M& coarse, const T& pinfo, const O& copy)
    \n-
    683 {
    \n-
    684 typedef typename T::ParallelIndexSet::const_iterator ConstIterator;
    \n-
    685 ConstIterator end = pinfo.indexSet().end();
    \n-
    686 typedef typename M::block_type Block;
    \n-
    687 Block identity=Block(0.0);
    \n-
    688 for(typename Block::RowIterator b=identity.begin(); b != identity.end(); ++b)
    \n-
    689 b->operator[](b.index())=1.0;
    \n-
    690
    \n-
    691 for(ConstIterator index = pinfo.indexSet().begin();
    \n-
    692 index != end; ++index) {
    \n-
    693 if(copy.contains(index->local().attribute())) {
    \n-
    694 typedef typename M::ColIterator ColIterator;
    \n-
    695 typedef typename M::row_type Row;
    \n-
    696 Row row = coarse[index->local()];
    \n-
    697 ColIterator cend = row.find(index->local());
    \n-
    698 ColIterator col = row.begin();
    \n-
    699 for(; col != cend; ++col)
    \n-
    700 *col = 0;
    \n-
    701
    \n-
    702 cend = row.end();
    \n-
    703
    \n-
    704 assert(col != cend); // There should be a diagonal entry
    \n-
    705 *col = identity;
    \n-
    706
    \n-
    707 for(++col; col != cend; ++col)
    \n-
    708 *col = 0;
    \n-
    709 }
    \n-
    710 }
    \n-
    711 }
    \n-
    \n-
    712
    \n-
    713 template<class M, class O>
    \n-
    \n-\n-
    715 const SequentialInformation& pinfo,
    \n-
    716 const O& overlap)
    \n-
    717 {}
    \n-
    \n-
    718
    \n-
    719 } // namespace Amg
    \n-
    720} // namespace Dune
    \n-
    721#endif
    \n-
    Provides classes for the Coloring process of AMG.
    \n-\n-
    Col col
    Definition matrixmatrix.hh:351
    \n-
    bool operator()(const OverlapVertex< A > &o1, const OverlapVertex< A > &o2)
    Definition galerkin.hh:155
    \n-
    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
    \n-
    G Graph
    The type of the graph.
    Definition galerkin.hh:211
    \n-
    void operator++()
    Definition galerkin.hh:539
    \n-
    void operator()(const ConstEdgeIterator &edge)
    Process an edge pointing to another aggregate.
    Definition galerkin.hh:359
    \n-
    void insert(const typename M::size_type &index)
    Definition galerkin.hh:552
    \n-
    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
    \n-
    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
    \n-
    std::size_t index()
    Definition galerkin.hh:81
    \n-
    T ParallelInformation
    Definition galerkin.hh:120
    \n-
    G::VertexDescriptor Vertex
    Definition galerkin.hh:272
    \n-
    T Aggregate
    The aggregate descriptor.
    Definition galerkin.hh:37
    \n-
    SparsityBuilder(M &matrix)
    Constructor.
    Definition galerkin.hh:513
    \n-
    ConnectedBuilder(const AggregatesMap< Vertex > &aggregates, Graph &graph, VisitedMap &visitedMap, Set &connected)
    Constructor.
    Definition galerkin.hh:352
    \n-
    Graph::ConstEdgeIterator ConstEdgeIterator
    The constant edge iterator.
    Definition galerkin.hh:215
    \n-
    T Vertex
    The vertex descriptor.
    Definition galerkin.hh:42
    \n-
    G::VertexDescriptor Vertex
    Definition galerkin.hh:288
    \n-
    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
    \n-
    V VisitedMap
    The type of the map for marking vertices as visited.
    Definition galerkin.hh:225
    \n-
    int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
    Visit all neighbour vertices of a vertex in a graph.
    \n-
    S Set
    The type of the connected set.
    Definition galerkin.hh:220
    \n-
    Aggregate * aggregate
    The aggregate the vertex belongs to.
    Definition galerkin.hh:47
    \n-
    std::size_t sumRowSize()
    Definition galerkin.hh:534
    \n-
    Vertex vertex
    The vertex descriptor.
    Definition galerkin.hh:52
    \n-
    std::size_t minRowSize()
    Definition galerkin.hh:528
    \n-
    static void set(M &coarse, const T &pinfo, const O &copy)
    Definition galerkin.hh:682
    \n-
    Graph::VertexDescriptor Vertex
    The vertex descriptor of the graph.
    Definition galerkin.hh:230
    \n-
    void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
    Calculate the galerkin product.
    \n-
    std::size_t maxRowSize()
    Definition galerkin.hh:523
    \n-
    STL namespace.
    \n+
    39} // end namespace Dune
    \n+
    40#endif
    \n
    Definition allocator.hh:11
    \n-
    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
    \n-
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n-
    A Dummy visitor that does nothing for each visited edge.
    Definition aggregates.hh:598
    \n-
    Definition galerkin.hh:33
    \n-
    Functor for building the sparsity pattern of the matrix using examineConnectivity.
    Definition galerkin.hh:63
    \n-
    Definition galerkin.hh:99
    \n-
    Definition galerkin.hh:118
    \n-
    Definition galerkin.hh:185
    \n-
    Visitor for identifying connected aggregates during a breadthFirstSearch.
    Definition galerkin.hh:206
    \n-
    Definition galerkin.hh:271
    \n-
    Definition galerkin.hh:300
    \n-
    Definition pinfo.hh:28
    \n-
    @ nonoverlapping
    Category for non-overlapping solvers.
    Definition solvercategory.hh:27
    \n-
    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
    \n+
    Definition solvertype.hh:16
    \n+
    @ value
    Whether this is a direct solver.
    Definition solvertype.hh:24
    \n+
    Definition solvertype.hh:30
    \n+
    @ value
    whether the solver internally uses column compressed storage
    Definition solvertype.hh:36
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,816 +1,53 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-galerkin.hh\n+solvertype.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_GALERKIN_HH\n-6#define DUNE_GALERKIN_HH\n+5#ifndef DUNE_ISTL_SOLVERTYPE_HH\n+6#define DUNE_ISTL_SOLVERTYPE_HH\n 7\n-8#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n-9#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15\n-16namespace _\bD_\bu_\bn_\be\n-17{\n-18 namespace Amg\n-19 {\n-31 template\n-_\b3_\b2 struct _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx\n-33 {\n-_\b3_\b7 typedef T _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be;\n-38\n-_\b4_\b2 typedef T _\bV_\be_\br_\bt_\be_\bx;\n-43\n-_\b4_\b7 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be* _\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be;\n-48\n-_\b5_\b2 _\bV_\be_\br_\bt_\be_\bx _\bv_\be_\br_\bt_\be_\bx;\n-53 };\n-54\n-55\n-56\n-61 template\n-_\b6_\b2 class _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br\n-63 {\n-64 public:\n-70 _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br(M& matrix);\n-71\n-72 void _\bi_\bn_\bs_\be_\br_\bt(const typename M::size_type& _\bi_\bn_\bd_\be_\bx);\n-73\n-74 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n-75\n-76 std::size_t _\bm_\bi_\bn_\bR_\bo_\bw_\bS_\bi_\bz_\be();\n-77\n-78 std::size_t _\bm_\ba_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be();\n-79\n-80 std::size_t _\bs_\bu_\bm_\bR_\bo_\bw_\bS_\bi_\bz_\be();\n-_\b8_\b1 std::size_t _\bi_\bn_\bd_\be_\bx()\n-82 {\n-83 return row_.index();\n-84 }\n-85 private:\n-87 typename M::CreateIterator row_;\n-89 std::size_t minRowSize_;\n-91 std::size_t maxRowSize_;\n-92 std::size_t sumRowSize_;\n-93#ifdef DUNE_ISTL_WITH_CHECKING\n-94 bool diagonalInserted;\n-95#endif\n-96 };\n-97\n-_\b9_\b8 class _\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-99 {\n-100 public:\n-109 template\n-_\b1_\b1_\b0 void _\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be(const M& fine, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>& aggregates, M&\n-coarse,\n-111 const I& pinfo, const O& copy);\n-112\n-113 };\n-114\n-115 template\n-_\b1_\b1_\b6 class _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-117 : public _\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-118 {\n-119 public:\n-_\b1_\b2_\b0 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n-121\n-131 template\n-132 typename G::MutableMatrix* _\bb_\bu_\bi_\bl_\bd(G& fineGraph, V& visitedMap,\n-133 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n-134 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-135 const typename G::Matrix::size_type& size,\n-136 const Set& copy);\n-137 private:\n-138\n-145 template\n-146 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>*\n-147 buildOverlapVertices(const G& graph, const I& pinfo,\n-148 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-149 const Set& overlap,\n-150 std::size_t& overlapCount);\n-151\n-152 template\n-153 struct OVLess\n-154 {\n-_\b1_\b5_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bA_\b>& o1, const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bA_\b>& o2)\n-156 {\n-157 return *o1._\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be < *o2._\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be;\n-158 }\n-159 };\n-160 };\n-161\n-162 template<>\n-_\b1_\b6_\b3 class _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn>\n-164 : public _\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-165 {\n-166 public:\n-176 template\n-177 typename G::MutableMatrix* _\bb_\bu_\bi_\bl_\bd(G& fineGraph, V& visitedMap,\n-178 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n-179 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-180 const typename G::Matrix::size_type& size,\n-181 const Set& copy);\n-182 };\n-183\n-_\b1_\b8_\b4 struct _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n-185 {\n-186 template\n-187 static void _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(R& row, G& graph, V& visitedMap,\n-188 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-189 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>*& seed,\n-190 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>* overlapEnd);\n-191\n-195 template\n-196 static void _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bN_\bo_\bn_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(R& row, G& graph, V&\n-visitedMap,\n-197 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-198 const typename G::VertexDescriptor& seed);\n-199\n-200\n-204 template\n-_\b2_\b0_\b5 class _\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br\n-206 {\n-207 public:\n-_\b2_\b1_\b1 typedef G _\bG_\br_\ba_\bp_\bh;\n-_\b2_\b1_\b5 typedef typename Graph::ConstEdgeIterator _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-216\n-_\b2_\b2_\b0 typedef S _\bS_\be_\bt;\n-221\n-_\b2_\b2_\b5 typedef V _\bV_\bi_\bs_\bi_\bt_\be_\bd_\bM_\ba_\bp;\n-226\n-_\b2_\b3_\b0 typedef typename Graph::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n-231\n-239 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, _\bG_\br_\ba_\bp_\bh& graph,\n-240 _\bV_\bi_\bs_\bi_\bt_\be_\bd_\bM_\ba_\bp& visitedMap, _\bS_\be_\bt& connected);\n-241\n-246 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n-247\n-248 private:\n-252 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n-253\n-254 _\bG_\br_\ba_\bp_\bh& graph_;\n-255\n-259 _\bV_\bi_\bs_\bi_\bt_\be_\bd_\bM_\ba_\bp& visitedMap_;\n-260\n-264 _\bS_\be_\bt& connected_;\n-265 };\n-266\n-267 };\n-268\n-269 template\n-_\b2_\b7_\b0 struct _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br : public _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n-271 {\n-_\b2_\b7_\b2 typedef typename G::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n-273\n-274 template\n-275 static void _\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph,\n-276 V& visitedMap,\n-277 const T& pinfo,\n-278 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-279 const O& overlap,\n-280 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>* overlapVertices,\n-281 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>* overlapEnd,\n-282 R& row);\n-283 };\n-284\n-285 template\n-_\b2_\b8_\b6 struct _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br : public\n-_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n-287 {\n-_\b2_\b8_\b8 typedef typename G::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n-289\n-290 template\n-291 static void _\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph,\n-292 V& visitedMap,\n-293 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n-294 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-295 R& row);\n-296 };\n-297\n-298 template\n-_\b2_\b9_\b9 struct _\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br\n-300 {\n-301 template\n-302 static void _\bs_\be_\bt(M& coarse, const T& pinfo, const O& copy);\n-303 };\n-304\n-305 template<>\n-_\b3_\b0_\b6 struct _\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn>\n-307 {\n-308 template\n-309 static void _\bs_\be_\bt(M& coarse, const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo, const O&\n-copy);\n-310 };\n-311\n-312 template\n-_\b3_\b1_\b3 void _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bN_\bo_\bn_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(R& row,\n-G& graph, V& visitedMap,\n-314 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-315 const typename G::VertexDescriptor& seed)\n-316 {\n-317 assert(row.index()==aggregates[seed]);\n-318 row.insert(aggregates[seed]);\n-319 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bG_\b,_\bR_\b,_\bV_\b> conBuilder(aggregates, graph, visitedMap, row);\n-320 typedef typename G::VertexDescriptor Vertex;\n-321 typedef std::allocator Allocator;\n-322 typedef SLList VertexList;\n-323 typedef typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br DummyVisitor;\n-324 VertexList vlist;\n-325 DummyVisitor dummy;\n-326 aggregates.template breadthFirstSearch(seed,aggregates[seed],\n-graph, vlist, dummy,\n-327 conBuilder, visitedMap);\n-328 }\n-329\n-330 template\n-_\b3_\b3_\b1 void _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(R& row, G&\n-graph, V& visitedMap,\n-332 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-333 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>*& seed,\n-334 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>* overlapEnd)\n-335 {\n-336 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bG_\b,_\bR_\b,_\bV_\b> conBuilder(aggregates, graph, visitedMap, row);\n-337 const typename G::VertexDescriptor aggregate=*seed->_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be;\n-338\n-339 if (row.index()==*seed->_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be) {\n-340 while(seed != overlapEnd && aggregate == *seed->_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be) {\n-341 row.insert(*seed->_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be);\n-342 // Walk over all neighbours and add them to the connected array.\n-343 _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(graph, seed->_\bv_\be_\br_\bt_\be_\bx, conBuilder);\n-344 // Mark vertex as visited\n-345 put(visitedMap, seed->_\bv_\be_\br_\bt_\be_\bx, true);\n-346 ++seed;\n-347 }\n-348 }\n-349 }\n-350\n-351 template\n-_\b3_\b5_\b2 _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bG_\b,_\bS_\b,_\bV_\b>_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br\n-(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-353 _\bG_\br_\ba_\bp_\bh& graph, _\bV_\bi_\bs_\bi_\bt_\be_\bd_\bM_\ba_\bp& visitedMap,\n-354 _\bS_\be_\bt& connected)\n-355 : aggregates_(aggregates), graph_(graph), visitedMap_(visitedMap),\n-connected_(connected)\n-356 {}\n-357\n-358 template\n-_\b3_\b5_\b9 void _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bG_\b,_\bS_\b,_\bV_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const\n-_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n-360 {\n-361 const _\bV_\be_\br_\bt_\be_\bx& vertex = aggregates_[edge.target()];\n-362 assert(vertex!= _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n-363 if(vertex!= _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n-364 connected_.insert(vertex);\n-365 }\n-366\n-367 template\n-368 template\n-369 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>*\n-370 _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bT_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\bi_\bc_\be_\bs(const G& graph, const I& pinfo,\n-371 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-372 const Set& overlap,\n-373 std::size_t& overlapCount)\n-374 {\n-375 // count the overlap vertices.\n-376 typedef typename G::ConstVertexIterator ConstIterator;\n-377 typedef typename I::GlobalLookupIndexSet GlobalLookup;\n-378 typedef typename GlobalLookup::IndexPair IndexPair;\n-379\n-380 const ConstIterator end = graph.end();\n-381 overlapCount = 0;\n-382\n-383 const GlobalLookup& lookup=pinfo.globalLookup();\n-384\n-385 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {\n-386 const IndexPair* pair = lookup.pair(*vertex);\n-387\n-388 if(pair!=0 && overlap.contains(pair->local().attribute()))\n-389 ++overlapCount;\n-390 }\n-391 // Allocate space\n-392 typedef typename G::VertexDescriptor Vertex;\n-393\n-394 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>* overlapVertices = new _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>\n-[overlapCount=0 ? 1 : overlapCount];\n-395 if(overlapCount==0)\n-396 return overlapVertices;\n-397\n-398 // Initialize them\n-399 overlapCount=0;\n-400 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {\n-401 const IndexPair* pair = lookup.pair(*vertex);\n-402\n-403 if(pair!=0 && overlap.contains(pair->local().attribute())) {\n-404 overlapVertices[overlapCount]._\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be = &aggregates[pair->local()];\n-405 overlapVertices[overlapCount]._\bv_\be_\br_\bt_\be_\bx = pair->local();\n-406 ++overlapCount;\n-407 }\n-408 }\n-409\n-410 dverb << overlapCount<<\" overlap vertices\"<());\n-413 // due to the sorting the isolated aggregates (to be skipped) are at the\n-end.\n-414\n-415 return overlapVertices;\n-416 }\n-417\n-418 template\n-419 template\n-_\b4_\b2_\b0 void _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\bG_\b,_\bT_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph,\n-421 V& visitedMap,\n-422 const T& pinfo,\n-423 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-424 const O& overlap,\n-425 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>* overlapVertices,\n-426 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>* overlapEnd,\n-427 R& row)\n-428 {\n-429 typedef typename T::GlobalLookupIndexSet GlobalLookup;\n-430 const GlobalLookup& lookup = pinfo.globalLookup();\n-431\n-432 typedef typename G::VertexIterator VertexIterator;\n-433\n-434 VertexIterator vend=graph.end();\n-435\n-436#ifdef DUNE_ISTL_WITH_CHECKING\n-437 std::set examined;\n-438#endif\n-439\n-440 // The aggregates owned by the process have lower local indices\n-441 // then those not owned. We process them in the first pass.\n-442 // They represent the rows 0, 1, ..., n of the coarse matrix\n-443 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex)\n-444 if(!_\bg_\be_\bt(visitedMap, *vertex)) {\n-445 // In the first pass we only process owner nodes\n-446 typedef typename GlobalLookup::IndexPair IndexPair;\n-447 const IndexPair* pair = lookup.pair(*vertex);\n-448 if(pair==0 || !overlap.contains(pair->local().attribute())) {\n-449#ifdef DUNE_ISTL_WITH_CHECKING\n-450 assert(examined.find(aggregates[*vertex])==examined.end());\n-451 examined.insert(aggregates[*vertex]);\n-452#endif\n-453 _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bN_\bo_\bn_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(row, graph, visitedMap, aggregates,\n-*vertex);\n-454\n-455 // only needed for ALU\n-456 // (ghosts with same global id as owners on the same process)\n-457 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(pinfo) == static_cast(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:\n-_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg)) {\n-458 if(overlapVertices != overlapEnd) {\n-459 if(*overlapVertices->_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n-460 _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(row, graph, visitedMap, aggregates,\n-overlapVertices, overlapEnd);\n-461 }\n-462 else{\n-463 ++overlapVertices;\n-464 }\n-465 }\n-466 }\n-467 ++row;\n-468 }\n-469 }\n-470\n-471 dvverb<<\"constructed \"<_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n-477\n-478#ifdef DUNE_ISTL_WITH_CHECKING\n-479 typedef typename GlobalLookup::IndexPair IndexPair;\n-480 const IndexPair* pair = lookup.pair(overlapVertices->_\bv_\be_\br_\bt_\be_\bx);\n-481 assert(pair!=0 && overlap.contains(pair->local().attribute()));\n-482 assert(examined.find(aggregates[overlapVertices->_\bv_\be_\br_\bt_\be_\bx])==examined.end());\n-483 examined.insert(aggregates[overlapVertices->_\bv_\be_\br_\bt_\be_\bx]);\n-484#endif\n-485 _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(row, graph, visitedMap, aggregates,\n-overlapVertices, overlapEnd);\n-486 ++row;\n-487 }else{\n-488 ++overlapVertices;\n-489 }\n-490 }\n-491\n-492 template\n-493 template\n-_\b4_\b9_\b4 void _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\bG_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph,\n-495 V& visitedMap,\n-496 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n-497 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-498 R& row)\n-499 {\n-500 typedef typename G::VertexIterator VertexIterator;\n-501\n-502 VertexIterator vend=graph.end();\n-503 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex) {\n-504 if(!_\bg_\be_\bt(visitedMap, *vertex)) {\n-505 _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bN_\bo_\bn_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(row, graph, visitedMap, aggregates,\n-*vertex);\n-506 ++row;\n-507 }\n-508 }\n-509\n-510 }\n-511\n-512 template\n-_\b5_\b1_\b3 _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br(M& matrix)\n-514 : row_(matrix.createbegin()),\n-515 minRowSize_(_\bs_\bt_\bd::numeric_limits<_\bs_\bt_\bd::size_t>::max()),\n-516 maxRowSize_(0), sumRowSize_(0)\n-517 {\n-518#ifdef DUNE_ISTL_WITH_CHECKING\n-519 diagonalInserted = false;\n-520#endif\n-521 }\n-522 template\n-_\b5_\b2_\b3 std::size_t _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bm_\ba_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be()\n-524 {\n-525 return maxRowSize_;\n-526 }\n-527 template\n-_\b5_\b2_\b8 std::size_t _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bm_\bi_\bn_\bR_\bo_\bw_\bS_\bi_\bz_\be()\n-529 {\n-530 return minRowSize_;\n-531 }\n-532\n-533 template\n-_\b5_\b3_\b4 std::size_t _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bs_\bu_\bm_\bR_\bo_\bw_\bS_\bi_\bz_\be()\n-535 {\n-536 return sumRowSize_;\n-537 }\n-538 template\n-_\b5_\b3_\b9 void _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-540 {\n-541 sumRowSize_ += row_.size();\n-542 minRowSize_=std::min(minRowSize_, row_.size());\n-543 maxRowSize_=std::max(maxRowSize_, row_.size());\n-544 ++row_;\n-545#ifdef DUNE_ISTL_WITH_CHECKING\n-546 assert(diagonalInserted);\n-547 diagonalInserted = false;\n-548#endif\n-549 }\n-550\n-551 template\n-_\b5_\b5_\b2 void _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(const typename M::size_type& index)\n-553 {\n-554 row_.insert(index);\n-555#ifdef DUNE_ISTL_WITH_CHECKING\n-556 diagonalInserted = diagonalInserted || row_.index()==index;\n-557#endif\n-558 }\n-559\n-560 template\n-561 template\n-562 typename G::MutableMatrix*\n-_\b5_\b6_\b3 _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bT_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd(G& fineGraph, V& visitedMap,\n-564 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n-565 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-566 const typename G::Matrix::size_type& size,\n-567 const Set& overlap)\n-568 {\n-569 typedef _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b> _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx;\n-570\n-571 std::size_t count;\n-572\n-573 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx* overlapVertices = buildOverlapVertices(fineGraph,\n-574 pinfo,\n-575 aggregates,\n-576 overlap,\n-577 count);\n-578 typedef typename G::MutableMatrix M;\n-579 M* coarseMatrix = new M(size, size, M::row_wise);\n-580\n-581 // Reset the visited flags of all vertices.\n-582 // As the isolated nodes will be skipped we simply mark them as visited\n-583\n-584 typedef typename G::VertexIterator Vertex;\n-585 Vertex vend = fineGraph.end();\n-586 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {\n-587 assert(aggregates[*vertex] != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:\n-_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n-588 put(visitedMap, *vertex, aggregates[*vertex]==_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n-589 }\n-590\n-591 typedef typename G::MutableMatrix M;\n-592 _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b> sparsityBuilder(*coarseMatrix);\n-593\n-594 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\bG_\b,_\bT_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(fineGraph, visitedMap, pinfo,\n-595 aggregates, overlap,\n-596 overlapVertices,\n-597 overlapVertices+count,\n-598 sparsityBuilder);\n-599\n-600 dinfo<N\n-()<<\"x\"<M()<<\" row: min=\"<(sparsityBuilder._\bs_\bu_\bm_\bR_\bo_\bw_\bS_\bi_\bz_\be())/coarseMatrix->N()\n-603 <\n-611 typename G::MutableMatrix*\n-_\b6_\b1_\b2 _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd(G& fineGraph, V& visitedMap,\n-613 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n-614 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n-615 const typename G::Matrix::size_type& size,\n-616 [[maybe_unused]] const Set& overlap)\n-617 {\n-618 typedef typename G::MutableMatrix M;\n-619 M* coarseMatrix = new M(size, size, M::row_wise);\n-620\n-621 // Reset the visited flags of all vertices.\n-622 // As the isolated nodes will be skipped we simply mark them as visited\n-623\n-624 typedef typename G::VertexIterator Vertex;\n-625 Vertex vend = fineGraph.end();\n-626 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {\n-627 assert(aggregates[*vertex] != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:\n-_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n-628 put(visitedMap, *vertex, aggregates[*vertex]==_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n-629 }\n-630\n-631 _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b> sparsityBuilder(*coarseMatrix);\n-632\n-633 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\bG_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(fineGraph,\n-visitedMap, pinfo,\n-634 aggregates, sparsityBuilder);\n-635 dinfo<<\"Matrix row: min=\"<(sparsityBuilder._\bs_\bu_\bm_\bR_\bo_\bw_\bS_\bi_\bz_\be())/coarseMatrix->N\n-()<\n-_\b6_\b4_\b2 void _\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be(const M& fine, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>&\n-aggregates, M& coarse,\n-643 const P& pinfo, [[maybe_unused]] const O& copy)\n-644 {\n-645 coarse = static_cast(0);\n-646\n-647 typedef typename M::ConstIterator RowIterator;\n-648 RowIterator endRow = fine.end();\n-649\n-650 for(RowIterator row = fine.begin(); row != endRow; ++row)\n-651 if(aggregates[row.index()] != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n-652 assert(aggregates[row.index()]!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n-653 typedef typename M::ConstColIterator ColIterator;\n-654 ColIterator endCol = row->end();\n-655\n-656 for(ColIterator _\bc_\bo_\bl = row->begin(); _\bc_\bo_\bl != endCol; ++_\bc_\bo_\bl)\n-657 if(aggregates[_\bc_\bo_\bl.index()] != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n-658 assert(aggregates[row.index()]!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n-659 coarse[aggregates[row.index()]][aggregates[_\bc_\bo_\bl.index()]]+=*_\bc_\bo_\bl;\n-660 }\n-661 }\n-662\n-663 // get the right diagonal matrix values on copy lines from owner processes\n-664 typedef typename M::block_type BlockType;\n-665 std::vector rowsize(coarse.N(),BlockType(0));\n-666 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)\n-667 rowsize[row.index()]=coarse[row.index()][row.index()];\n-668 pinfo.copyOwnerToAll(rowsize,rowsize);\n-669 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)\n-670 coarse[row.index()][row.index()] = rowsize[row.index()];\n-671\n-672 // don't set dirichlet boundaries for copy lines to make novlp case work,\n-673 // the preconditioner yields slightly different results now.\n-674\n-675 // Set the dirichlet border\n-676 //DirichletBoundarySetter

    ::template set(coarse, pinfo, copy);\n-677\n-678 }\n-679\n-680 template\n-681 template\n-_\b6_\b8_\b2 void _\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\be_\bt(M& coarse, const T& pinfo, const O&\n-copy)\n-683 {\n-684 typedef typename T::ParallelIndexSet::const_iterator ConstIterator;\n-685 ConstIterator end = pinfo.indexSet().end();\n-686 typedef typename M::block_type Block;\n-687 Block identity=Block(0.0);\n-688 for(typename Block::RowIterator b=identity.begin(); b != identity.end();\n-++b)\n-689 b->operator[](b.index())=1.0;\n-690\n-691 for(ConstIterator index = pinfo.indexSet().begin();\n-692 index != end; ++index) {\n-693 if(copy.contains(index->local().attribute())) {\n-694 typedef typename M::ColIterator ColIterator;\n-695 typedef typename M::row_type Row;\n-696 Row row = coarse[index->local()];\n-697 ColIterator cend = row.find(index->local());\n-698 ColIterator _\bc_\bo_\bl = row.begin();\n-699 for(; _\bc_\bo_\bl != cend; ++_\bc_\bo_\bl)\n-700 *_\bc_\bo_\bl = 0;\n-701\n-702 cend = row.end();\n-703\n-704 assert(_\bc_\bo_\bl != cend); // There should be a diagonal entry\n-705 *_\bc_\bo_\bl = identity;\n-706\n-707 for(++_\bc_\bo_\bl; _\bc_\bo_\bl != cend; ++_\bc_\bo_\bl)\n-708 *_\bc_\bo_\bl = 0;\n-709 }\n-710 }\n-711 }\n-712\n-713 template\n-_\b7_\b1_\b4 void _\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br_\b<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bs_\be_\bt(M& coarse,\n-715 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n-716 const O& overlap)\n-717 {}\n-718\n-719 } // namespace Amg\n-720} // namespace Dune\n-721#endif\n-_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n-Provides classes for the Coloring process of AMG.\n-_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bO_\bV_\bL_\be_\bs_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-bool operator()(const OverlapVertex< A > &o1, const OverlapVertex< A > &o2)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bN_\bo_\bn_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by\n-static void constructNonOverlapConnectivity(R &row, G &graph, V &visitedMap,\n-const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename\n-G::VertexDescriptor &seed)\n-Construct the connectivity of an aggregate in the overlap.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:313\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh\n-G Graph\n-The type of the graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-void operator++()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:539\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const ConstEdgeIterator &edge)\n-Process an edge pointing to another aggregate.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:359\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n-void insert(const typename M::size_type &index)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:552\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by\n-static void constructOverlapConnectivity(R &row, G &graph, V &visitedMap, const\n-AggregatesMap< typename G::VertexDescriptor > &aggregates, const OverlapVertex<\n-typename G::VertexDescriptor > *&seed, const OverlapVertex< typename G::\n-VertexDescriptor > *overlapEnd)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:331\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bb_\bu_\bi_\bl_\bd\n-G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation\n-&pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const\n-typename G::Matrix::size_type &size, const Set ©)\n-Calculates the coarse matrix via a Galerkin product.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:563\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n-std::size_t index()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-T ParallelInformation\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-G::VertexDescriptor Vertex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:272\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n-T Aggregate\n-The aggregate descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br\n-SparsityBuilder(M &matrix)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:513\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br\n-ConnectedBuilder(const AggregatesMap< Vertex > &aggregates, Graph &graph,\n-VisitedMap &visitedMap, Set &connected)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:352\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Graph::ConstEdgeIterator ConstEdgeIterator\n-The constant edge iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:215\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-T Vertex\n-The vertex descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\b _\bG_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-G::VertexDescriptor Vertex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:288\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n-static void examine(G &graph, V &visitedMap, const T &pinfo, const\n-AggregatesMap< Vertex > &aggregates, const O &overlap, const OverlapVertex<\n-Vertex > *overlapVertices, const OverlapVertex< Vertex > *overlapEnd, R &row)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:420\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bM_\ba_\bp\n-V VisitedMap\n-The type of the map for marking vertices as visited.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:225\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n-int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex,\n-V &visitor)\n-Visit all neighbour vertices of a vertex in a graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bS_\be_\bt\n-S Set\n-The type of the connected set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:220\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n-Aggregate * aggregate\n-The aggregate the vertex belongs to.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bs_\bu_\bm_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t sumRowSize()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:534\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b:_\b:_\bv_\be_\br_\bt_\be_\bx\n-Vertex vertex\n-The vertex descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bm_\bi_\bn_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t minRowSize()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:528\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br_\b:_\b:_\bs_\be_\bt\n-static void set(M &coarse, const T &pinfo, const O ©)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:682\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-Graph::VertexDescriptor Vertex\n-The vertex descriptor of the graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be\n-void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse,\n-const I &pinfo, const O ©)\n-Calculate the galerkin product.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bm_\ba_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t maxRowSize()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:523\n-_\bs_\bt_\bd\n-STL namespace.\n+12namespace _\bD_\bu_\bn_\be\n+13{\n+14 template\n+_\b1_\b5 struct _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n+16 {\n+17 enum\n+18 {\n+24 _\bv_\ba_\bl_\bu_\be =false\n+_\b2_\b5 };\n+26 };\n+27\n+28 template\n+_\b2_\b9 struct _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n+30 {\n+31 enum\n+32 {\n+36 _\bv_\ba_\bl_\bu_\be = false\n+_\b3_\b7 };\n+38 };\n+39} // end namespace Dune\n+40#endif\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-Class providing information about the mapping of the vertices onto aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n-A Dummy visitor that does nothing for each visited edge.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:598\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br\n-Functor for building the sparsity pattern of the matrix using\n-examineConnectivity.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:99\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:118\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:185\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br\n-Visitor for identifying connected aggregates during a breadthFirstSearch.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:206\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:271\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:300\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n-@ nonoverlapping\n-Category for non-overlapping solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-static Category category(const OP &op, decltype(op.category()) *=nullptr)\n-Helperfunction to extract the solver category either from an enum, or from the\n-newly introduced virtu...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+@ value\n+Whether this is a direct solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+@ value\n+whether the solver internally uses column compressed storage\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:36\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00119.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00119.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: hierarchy.hh File Reference\n+dune-istl: solverregistry.hh File Reference\n \n \n \n \n \n \n \n@@ -65,56 +65,150 @@\n

    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n \n+
    solverregistry.hh File Reference
    \n \n
    \n-\n-

    Provides a classes representing the hierarchies in AMG. \n-More...

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

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n-\n+\n \n

    \n Classes

    class  Dune::Amg::Hierarchy< T, A >
     A hierarchy of containers (e.g. matrices or vectors) More...
    class  Dune::UnsupportedType
     
    class  Dune::Amg::Hierarchy< T, A >::LevelIterator< C, T1 >
     Iterator over the levels in the hierarchy. More...
    class  Dune::InvalidSolverFactoryConfiguration
     
    \n \n \n \n-\n-\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n+\n+\n+\n+\n+\n+\n+\n+

    \n+Macros

    #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_ITERATIVE_SOLVER(name, ...)    DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__)
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+Functions

    template<template< class, class, class, int >class Preconditioner, int blockLevel = 1>
    auto Dune::defaultPreconditionerBlockLevelCreator ()
     
    template<template< class, class, class >class Preconditioner>
    auto Dune::defaultPreconditionerCreator ()
     
    template<template< class... >class Solver>
    auto Dune::defaultIterativeSolverCreator ()
     
    \n-

    Detailed Description

    \n-

    Provides a classes representing the hierarchies in AMG.

    \n-
    Author
    Markus Blatt
    \n-
    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ DUNE_REGISTER_DIRECT_SOLVER

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_REGISTER_DIRECT_SOLVER( name,
     ... 
    )    DUNE_REGISTRY_PUT(DirectSolverTag, name, __VA_ARGS__)
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ DUNE_REGISTER_ITERATIVE_SOLVER

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_REGISTER_ITERATIVE_SOLVER( name,
     ... 
    )    DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__)
    \n+
    \n+\n+
    \n+
    \n+\n+

    ◆ DUNE_REGISTER_PRECONDITIONER

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+ \n+
    #define DUNE_REGISTER_PRECONDITIONER( name,
     ... 
    )    DUNE_REGISTRY_PUT(PreconditionerTag, name, __VA_ARGS__)
    \n+
    \n+\n+
    \n+
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,38 +1,60 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-hierarchy.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Provides a classes representing the hierarchies in AMG. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+solverregistry.hh File Reference\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n-\u00a0 A hierarchy of containers (e.g. matrices or vectors) _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bC_\b,_\b _\bT_\b1_\b _\b>\n-\u00a0 Iterator over the levels in the hierarchy. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\bC_\bo_\bn_\bf_\bi_\bg_\bu_\br_\ba_\bt_\bi_\bo_\bn\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(name, ...)\u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT\n+ (DirectSolverTag, name, __VA_ARGS__)\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides a classes representing the hierarchies in AMG.\n- Author\n- Markus Blatt\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(name, ...)\u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT\n+ (PreconditionerTag, name, __VA_ARGS__)\n+\u00a0\n+#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bI_\bT_\bE_\bR_\bA_\bT_\bI_\bV_\bE_\b__\bS_\bO_\bL_\bV_\bE_\bR(name, ...)\u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT\n+ (IterativeSolverTag, name, __VA_ARGS__)\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+templateclass Preconditioner, int\n+blockLevel = 1>\n+auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br ()\n+\u00a0\n+templateclass Preconditioner>\n+auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br ()\n+\u00a0\n+templateclass Solver>\n+auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br ()\n+\u00a0\n+*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_R\bRE\bEG\bGI\bIS\bST\bTE\bER\bR_\b_D\bDI\bIR\bRE\bEC\bCT\bT_\b_S\bSO\bOL\bLV\bVE\bER\bR *\b**\b**\b**\b**\b*\n+#define DUNE_REGISTER_DIRECT_SOLVER ( \u00a0 name,\n+ \u00a0 .\b..\b..\b.\u00a0\n+ ) \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT(DirectSolverTag,\n+ name, __VA_ARGS__)\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_R\bRE\bEG\bGI\bIS\bST\bTE\bER\bR_\b_I\bIT\bTE\bER\bRA\bAT\bTI\bIV\bVE\bE_\b_S\bSO\bOL\bLV\bVE\bER\bR *\b**\b**\b**\b**\b*\n+#define DUNE_REGISTER_ITERATIVE_SOLVER ( \u00a0 name,\n+ \u00a0 .\b..\b..\b.\u00a0\n+ \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT\n+ ) (IterativeSolverTag, name,\n+ __VA_ARGS__)\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_R\bRE\bEG\bGI\bIS\bST\bTE\bER\bR_\b_P\bPR\bRE\bEC\bCO\bON\bND\bDI\bIT\bTI\bIO\bON\bNE\bER\bR *\b**\b**\b**\b**\b*\n+#define DUNE_REGISTER_PRECONDITIONER ( \u00a0 name,\n+ \u00a0 .\b..\b..\b.\u00a0\n+ ) \u00a0\u00a0\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT\n+ (PreconditionerTag, name, __VA_ARGS__)\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00119_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00119_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: hierarchy.hh Source File\n+dune-istl: solverregistry.hh Source File\n \n \n \n \n \n \n \n@@ -70,423 +70,122 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    hierarchy.hh
    \n+
    solverregistry.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMGHIERARCHY_HH
    \n-
    6#define DUNE_AMGHIERARCHY_HH
    \n-
    7
    \n-
    8#include <list>
    \n-
    9#include <memory>
    \n-
    10#include <limits>
    \n-
    11#include <dune/common/stdstreams.hh>
    \n-
    12#include <dune/common/timer.hh>
    \n-
    13#include <dune/common/bigunsignedint.hh>
    \n-\n-
    15
    \n-
    16namespace Dune
    \n-
    17{
    \n-
    18 namespace Amg
    \n-
    19 {
    \n-
    38 template<typename T, typename A=std::allocator<T> >
    \n-
    \n-\n-
    40 {
    \n-
    41 public:
    \n-
    45 typedef T MemberType;
    \n-
    46
    \n-
    47 template<typename T1, typename T2>
    \n-
    48 class LevelIterator;
    \n-
    49
    \n-
    50 private:
    \n-
    54 struct Element
    \n-
    55 {
    \n-
    56 friend class LevelIterator<Hierarchy<T,A>, T>;
    \n-
    57 friend class LevelIterator<const Hierarchy<T,A>, const T>;
    \n-
    58
    \n-
    60 std::weak_ptr<Element> coarser_;
    \n-
    61
    \n-
    63 std::shared_ptr<Element> finer_;
    \n-
    64
    \n-
    66 std::shared_ptr<MemberType> element_;
    \n-
    67
    \n-
    69 std::shared_ptr<MemberType> redistributed_;
    \n-
    70 };
    \n-
    71 public:
    \n-
    72
    \n-
    76 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<Element>;
    \n-
    77
    \n-\n-
    79
    \n-
    \n-
    84 Hierarchy(const std::shared_ptr<MemberType> & first);
    \n-
    85
    \n-
    \n-
    89 Hierarchy() : levels_(0)
    \n-
    90 {}
    \n-
    \n-
    91
    \n-
    \n-
    95 Hierarchy(const Hierarchy& other);
    \n-
    96
    \n-
    \n-\n-
    102
    \n-
    \n-\n-
    104
    \n-
    \n-
    109 void addFiner(Arguments& args);
    \n-
    110
    \n-
    117 template<class C, class T1>
    \n-
    \n-\n-
    119 : public BidirectionalIteratorFacade<LevelIterator<C,T1>,T1,T1&>
    \n-
    120 {
    \n-
    121 friend class LevelIterator<typename std::remove_const<C>::type,
    \n-
    122 typename std::remove_const<T1>::type >;
    \n-
    123 friend class LevelIterator<const typename std::remove_const<C>::type,
    \n-
    124 const typename std::remove_const<T1>::type >;
    \n-
    125
    \n-
    126 public:
    \n-
    \n-\n-
    129 {}
    \n-
    \n-
    130
    \n-
    \n-
    131 LevelIterator(std::shared_ptr<Element> element)
    \n-
    132 : element_(element)
    \n-
    133 {}
    \n-
    \n-
    134
    \n-
    \n-
    136 LevelIterator(const LevelIterator<typename std::remove_const<C>::type,
    \n-
    137 typename std::remove_const<T1>::type>& other)
    \n-
    138 : element_(other.element_)
    \n-
    139 {}
    \n-
    \n-
    140
    \n-
    \n-
    142 LevelIterator(const LevelIterator<const typename std::remove_const<C>::type,
    \n-
    143 const typename std::remove_const<T1>::type>& other)
    \n-
    144 : element_(other.element_)
    \n-
    145 {}
    \n-
    \n-
    146
    \n-
    \n-
    150 bool equals(const LevelIterator<typename std::remove_const<C>::type,
    \n-
    151 typename std::remove_const<T1>::type>& other) const
    \n-
    152 {
    \n-
    153 return element_ == other.element_;
    \n-
    154 }
    \n-
    \n-
    155
    \n-
    \n-
    159 bool equals(const LevelIterator<const typename std::remove_const<C>::type,
    \n-
    160 const typename std::remove_const<T1>::type>& other) const
    \n-
    161 {
    \n-
    162 return element_ == other.element_;
    \n-
    163 }
    \n-
    \n-
    164
    \n-
    \n-
    166 T1& dereference() const
    \n-
    167 {
    \n-
    168 return *(element_->element_);
    \n-
    169 }
    \n-
    \n-
    170
    \n-
    \n-\n-
    173 {
    \n-
    174 element_ = element_->coarser_.lock();
    \n-
    175 }
    \n-
    \n-
    176
    \n-
    \n-\n-
    179 {
    \n-
    180 element_ = element_->finer_;
    \n-
    181 }
    \n-
    \n-
    182
    \n-
    \n-
    187 bool isRedistributed() const
    \n-
    188 {
    \n-
    189 return (bool)element_->redistributed_;
    \n-
    190 }
    \n-
    \n-
    191
    \n-
    \n-\n-
    197 {
    \n-
    198 assert(element_->redistributed_);
    \n-
    199 return *element_->redistributed_;
    \n-
    200 }
    \n-
    \n-
    \n-
    201 void addRedistributed(std::shared_ptr<T1> t)
    \n-
    202 {
    \n-
    203 element_->redistributed_ = t;
    \n-
    204 }
    \n-
    \n-
    205
    \n-
    \n-\n-
    207 {
    \n-
    208 element_->redistributed_ = nullptr;
    \n-
    209 }
    \n-
    \n-
    210
    \n-
    211 private:
    \n-
    212 std::shared_ptr<Element> element_;
    \n-
    213 };
    \n-
    \n-
    214
    \n-\n-
    217
    \n-\n-
    220
    \n-
    \n-\n-
    226
    \n-
    \n-\n-
    232
    \n-
    233
    \n-
    \n-\n-
    239
    \n-
    \n-\n-
    245
    \n-
    \n-
    250 std::size_t levels() const;
    \n-
    251
    \n-
    252 private:
    \n-
    258 std::shared_ptr<MemberType> originalFinest_;
    \n-
    260 std::shared_ptr<Element> finest_;
    \n-
    262 std::shared_ptr<Element> coarsest_;
    \n-
    264 Allocator allocator_;
    \n-
    266 int levels_;
    \n-
    267 };
    \n-
    268
    \n-
    269 template<class T, class A>
    \n-
    \n-
    270 Hierarchy<T,A>::Hierarchy(const std::shared_ptr<MemberType> & first)
    \n-
    271 : originalFinest_(first)
    \n-
    272 {
    \n-
    273 finest_ = std::allocate_shared<Element>(allocator_);
    \n-
    274 finest_->element_ = originalFinest_;
    \n-
    275 coarsest_ = finest_;
    \n-
    276 levels_ = 1;
    \n-
    277 }
    \n-
    \n-
    278
    \n-
    280 //TODO: do we actually want to support this? This might be very expensive?!
    \n-
    281 template<class T, class A>
    \n-
    \n-\n-
    283 : allocator_(other.allocator_),
    \n-
    284 levels_(other.levels_)
    \n-
    285 {
    \n-
    286 if(!other.finest_)
    \n-
    287 {
    \n-
    288 finest_=coarsest_=nullptr;
    \n-
    289 return;
    \n-
    290 }
    \n-
    291 finest_ = std::allocate_shared<Element>(allocator_);
    \n-
    292 std::shared_ptr<Element> finer_;
    \n-
    293 std::shared_ptr<Element> current_ = finest_;
    \n-
    294 std::weak_ptr<Element> otherWeak_ = other.finest_;
    \n-
    295
    \n-
    296 while(! otherWeak_.expired())
    \n-
    297 {
    \n-
    298 // create shared_ptr from weak_ptr, we just checked that this is safe
    \n-
    299 std::shared_ptr<Element> otherCurrent_ = std::shared_ptr<Element>(otherWeak_);
    \n-
    300 // clone current level
    \n-
    301 //TODO: should we use the allocator?
    \n-
    302 current_->element_ =
    \n-
    303 std::make_shared<MemberType>(*(otherCurrent_->element_));
    \n-
    304 current_->finer_=finer_;
    \n-
    305 if(otherCurrent_->redistributed_)
    \n-
    306 current_->redistributed_ =
    \n-
    307 std::make_shared<MemberType>(*(otherCurrent_->redistributed_));
    \n-
    308 finer_=current_;
    \n-
    309 if(not otherCurrent_->coarser_.expired())
    \n-
    310 {
    \n-
    311 auto c = std::allocate_shared<Element>(allocator_);
    \n-
    312 current_->coarser_ = c;
    \n-
    313 current_ = c;
    \n-
    314 }
    \n-
    315 // go to coarser level
    \n-
    316 otherWeak_ = otherCurrent_->coarser_;
    \n-
    317 }
    \n-
    318 coarsest_=current_;
    \n-
    319 }
    \n-
    \n-
    320
    \n-
    321 template<class T, class A>
    \n-
    \n-
    322 std::size_t Hierarchy<T,A>::levels() const
    \n-
    323 {
    \n-
    324 return levels_;
    \n-
    325 }
    \n-
    \n-
    \n-
    326
    \n-
    327 template<class T, class A>
    \n-
    \n-\n-
    329 {
    \n-
    330 coarsest_->redistributed_ = ConstructionTraits<MemberType>::construct(args);
    \n-
    331 }
    \n-
    \n-
    332
    \n-
    333 template<class T, class A>
    \n-
    \n-\n-
    335 {
    \n-
    336 if(!coarsest_) {
    \n-
    337 // we have no levels at all...
    \n-
    338 assert(!finest_);
    \n-
    339 // allocate into the shared_ptr
    \n-
    340 originalFinest_ = ConstructionTraits<MemberType>::construct(args);
    \n-
    341 coarsest_ = std::allocate_shared<Element>(allocator_);
    \n-
    342 coarsest_->element_ = originalFinest_;
    \n-
    343 finest_ = coarsest_;
    \n-
    344 }else{
    \n-
    345 auto old_coarsest = coarsest_;
    \n-
    346 coarsest_ = std::allocate_shared<Element>(allocator_);
    \n-
    347 coarsest_->finer_ = old_coarsest;
    \n-
    348 coarsest_->element_ = ConstructionTraits<MemberType>::construct(args);
    \n-
    349 old_coarsest->coarser_ = coarsest_;
    \n-
    350 }
    \n-
    351 ++levels_;
    \n-
    352 }
    \n-
    \n-
    353
    \n-
    354
    \n-
    355 template<class T, class A>
    \n-
    \n-\n-
    357 {
    \n-
    358 //TODO: wouldn't it be better to do this in the constructor?'
    \n-
    359 if(!finest_) {
    \n-
    360 // we have no levels at all...
    \n-
    361 assert(!coarsest_);
    \n-
    362 // allocate into the shared_ptr
    \n-
    363 originalFinest_ = ConstructionTraits<MemberType>::construct(args);
    \n-
    364 finest_ = std::allocate_shared<Element>(allocator_);
    \n-
    365 finest_->element = originalFinest_;
    \n-
    366 coarsest_ = finest_;
    \n-
    367 }else{
    \n-
    368 finest_->finer_ = std::allocate_shared<Element>(allocator_);
    \n-
    369 finest_->finer_->coarser_ = finest_;
    \n-
    370 finest_ = finest_->finer_;
    \n-
    371 finest_->element = ConstructionTraits<T>::construct(args);
    \n-
    372 }
    \n-
    373 ++levels_;
    \n-
    374 }
    \n-
    \n-
    375
    \n-
    376 template<class T, class A>
    \n-
    \n-\n-
    378 {
    \n-
    379 return Iterator(finest_);
    \n-
    380 }
    \n-
    \n-
    381
    \n-
    382 template<class T, class A>
    \n-
    \n-\n-
    384 {
    \n-
    385 return Iterator(coarsest_);
    \n-
    386 }
    \n-
    \n-
    387
    \n-
    388 template<class T, class A>
    \n-
    \n-\n-
    390 {
    \n-
    391 return ConstIterator(finest_);
    \n-
    392 }
    \n-
    \n-
    393
    \n-
    394 template<class T, class A>
    \n-
    \n-\n-
    396 {
    \n-
    397 return ConstIterator(coarsest_);
    \n-
    398 }
    \n-
    \n-
    \n-
    400 } // namespace Amg
    \n-
    401} // namespace Dune
    \n-
    402
    \n-
    403#endif
    \n-
    \n-
    \n-
    \n-
    \n+
    5
    \n+
    6#ifndef DUNE_ISTL_SOLVERREGISTRY_HH
    \n+
    7#define DUNE_ISTL_SOLVERREGISTRY_HH
    \n+
    8
    \n+\n+\n+
    11#include <dune/istl/solver.hh>
    \n+
    12
    \n+
    \n+
    13#define DUNE_REGISTER_DIRECT_SOLVER(name, ...) \\
    \n+
    14 DUNE_REGISTRY_PUT(DirectSolverTag, name, __VA_ARGS__)
    \n
    \n-
    \n-
    \n-
    \n-
    \n-
    Helper classes for the construction of classes without empty constructor.
    \n-
    Hierarchy(const Hierarchy &other)
    Copy constructor (deep copy!).
    Definition hierarchy.hh:282
    \n-
    void addRedistributedOnCoarsest(Arguments &args)
    Definition hierarchy.hh:328
    \n-
    std::size_t levels() const
    Get the number of levels in the hierarchy.
    Definition hierarchy.hh:322
    \n-
    ConstIterator coarsest() const
    Get an iterator positioned at the coarsest level.
    Definition hierarchy.hh:395
    \n-
    void addCoarser(Arguments &args)
    Add an element on a coarser level.
    Definition hierarchy.hh:334
    \n-
    void addFiner(Arguments &args)
    Add an element on a finer level.
    Definition hierarchy.hh:356
    \n-
    Hierarchy(const std::shared_ptr< MemberType > &first)
    Construct a new hierarchy.
    Definition hierarchy.hh:270
    \n-
    const void * Arguments
    A type holding all the arguments needed to call the constructor.
    Definition construction.hh:44
    \n-
    static std::shared_ptr< T > construct(Arguments &args)
    Construct an object with the specified arguments.
    Definition construction.hh:52
    \n-
    Iterator coarsest()
    Get an iterator positioned at the coarsest level.
    Definition hierarchy.hh:383
    \n-
    ConstIterator finest() const
    Get an iterator positioned at the finest level.
    Definition hierarchy.hh:389
    \n-
    Iterator finest()
    Get an iterator positioned at the finest level.
    Definition hierarchy.hh:377
    \n-
    STL namespace.
    \n+
    15
    \n+
    \n+
    16#define DUNE_REGISTER_PRECONDITIONER(name, ...) \\
    \n+
    17 DUNE_REGISTRY_PUT(PreconditionerTag, name, __VA_ARGS__)
    \n+
    \n+
    18
    \n+
    \n+
    19#define DUNE_REGISTER_ITERATIVE_SOLVER(name, ...) \\
    \n+
    20 DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__)
    \n+
    \n+
    21
    \n+
    22namespace Dune{
    \n+
    27 namespace {
    \n+
    28 struct DirectSolverTag {};
    \n+
    29 struct PreconditionerTag {};
    \n+
    30 struct IterativeSolverTag {};
    \n+
    31 }
    \n+
    32 template<template<class,class,class,int>class Preconditioner, int blockLevel=1>
    \n+
    \n+\n+
    34 return [](auto typeList, const auto& matrix, const Dune::ParameterTree& config)
    \n+
    35 {
    \n+
    36 using Matrix = typename Dune::TypeListElement<0, decltype(typeList)>::type;
    \n+
    37 using Domain = typename Dune::TypeListElement<1, decltype(typeList)>::type;
    \n+
    38 using Range = typename Dune::TypeListElement<2, decltype(typeList)>::type;
    \n+
    39 std::shared_ptr<Dune::Preconditioner<Domain, Range>> preconditioner
    \n+
    40 = std::make_shared<Preconditioner<Matrix, Domain, Range, blockLevel>>(matrix, config);
    \n+
    41 return preconditioner;
    \n+
    42 };
    \n+
    43 }
    \n+
    \n+
    44
    \n+
    45 template<template<class,class,class>class Preconditioner>
    \n+
    \n+\n+
    47 return [](auto typeList, const auto& matrix, const Dune::ParameterTree& config)
    \n+
    48 {
    \n+
    49 using Matrix = typename Dune::TypeListElement<0, decltype(typeList)>::type;
    \n+
    50 using Domain = typename Dune::TypeListElement<1, decltype(typeList)>::type;
    \n+
    51 using Range = typename Dune::TypeListElement<2, decltype(typeList)>::type;
    \n+
    52 std::shared_ptr<Dune::Preconditioner<Domain, Range>> preconditioner
    \n+
    53 = std::make_shared<Preconditioner<Matrix, Domain, Range>>(matrix, config);
    \n+
    54 return preconditioner;
    \n+
    55 };
    \n+
    56 }
    \n+
    \n+
    57
    \n+
    58 template<template<class...>class Solver>
    \n+
    \n+\n+
    60 return [](auto typeList,
    \n+
    61 const auto& linearOperator,
    \n+
    62 const auto& scalarProduct,
    \n+
    63 const auto& preconditioner,
    \n+
    64 const Dune::ParameterTree& config)
    \n+
    65 {
    \n+
    66 using Domain = typename Dune::TypeListElement<0, decltype(typeList)>::type;
    \n+
    67 using Range = typename Dune::TypeListElement<1, decltype(typeList)>::type;
    \n+
    68 std::shared_ptr<Dune::InverseOperator<Domain, Range>> solver
    \n+
    69 = std::make_shared<Solver<Domain>>(linearOperator, scalarProduct, preconditioner, config);
    \n+
    70 return solver;
    \n+
    71 };
    \n+
    72 }
    \n+
    \n+
    73
    \n+
    74 /* This exception is thrown, when the requested solver is in the factory but
    \n+
    75 cannot be instantiated for the required template parameters
    \n+
    76 */
    \n+
    77 class UnsupportedType : public NotImplemented {};
    \n+
    78
    \n+
    79 class InvalidSolverFactoryConfiguration : public InvalidStateException{};
    \n+
    80} // end namespace Dune
    \n+
    81
    \n+
    82#endif // DUNE_ISTL_SOLVERREGISTRY_HH
    \n+\n+\n+
    Define general, extensible interface for inverse operators.
    \n+
    auto defaultIterativeSolverCreator()
    Definition solverregistry.hh:59
    \n+
    auto defaultPreconditionerBlockLevelCreator()
    Definition solverregistry.hh:33
    \n+
    auto defaultPreconditionerCreator()
    Definition solverregistry.hh:46
    \n
    Definition allocator.hh:11
    \n-
    A hierarchy of containers (e.g. matrices or vectors)
    Definition hierarchy.hh:40
    \n-
    T MemberType
    The type of the container we store.
    Definition hierarchy.hh:45
    \n-
    LevelIterator< Hierarchy< T, A >, T > Iterator
    Type of the mutable iterator.
    Definition hierarchy.hh:216
    \n-
    LevelIterator< const Hierarchy< T, A >, const T > ConstIterator
    Type of the const iterator.
    Definition hierarchy.hh:219
    \n-
    ConstructionTraits< T >::Arguments Arguments
    Definition hierarchy.hh:78
    \n-
    Hierarchy()
    Construct an empty hierarchy.
    Definition hierarchy.hh:89
    \n-
    typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator
    The allocator to use for the list elements.
    Definition hierarchy.hh:76
    \n-
    Iterator over the levels in the hierarchy.
    Definition hierarchy.hh:120
    \n-
    LevelIterator(const LevelIterator< typename std::remove_const< C >::type, typename std::remove_const< T1 >::type > &other)
    Copy constructor.
    Definition hierarchy.hh:136
    \n-
    void addRedistributed(std::shared_ptr< T1 > t)
    Definition hierarchy.hh:201
    \n-
    T1 & dereference() const
    Dereference the iterator.
    Definition hierarchy.hh:166
    \n-
    bool equals(const LevelIterator< typename std::remove_const< C >::type, typename std::remove_const< T1 >::type > &other) const
    Equality check.
    Definition hierarchy.hh:150
    \n-
    bool isRedistributed() const
    Check whether there was a redistribution at the current level.
    Definition hierarchy.hh:187
    \n-
    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
    \n-
    void increment()
    Move to the next coarser level.
    Definition hierarchy.hh:172
    \n-
    LevelIterator(const LevelIterator< const typename std::remove_const< C >::type, const typename std::remove_const< T1 >::type > &other)
    Copy constructor.
    Definition hierarchy.hh:142
    \n-
    void deleteRedistributed()
    Definition hierarchy.hh:206
    \n-
    void decrement()
    Move to the next fine level.
    Definition hierarchy.hh:178
    \n-
    LevelIterator(std::shared_ptr< Element > element)
    Definition hierarchy.hh:131
    \n-
    T1 & getRedistributed() const
    Get the redistributed container.
    Definition hierarchy.hh:196
    \n+
    constexpr std::size_t blockLevel()
    Determine the block level of a possibly nested vector/matrix type.
    Definition blocklevel.hh:176
    \n+
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    Definition solverregistry.hh:77
    \n+
    Definition solverregistry.hh:79
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,442 +1,120 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-hierarchy.hh\n+solverregistry.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMGHIERARCHY_HH\n-6#define DUNE_AMGHIERARCHY_HH\n-7\n-8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+5\n+6#ifndef DUNE_ISTL_SOLVERREGISTRY_HH\n+7#define DUNE_ISTL_SOLVERREGISTRY_HH\n+8\n+9#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bc_\bo_\bm_\bm_\bo_\bn_\b/_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh>\n+10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh>\n+11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n+12\n+_\b1_\b3#define DUNE_REGISTER_DIRECT_SOLVER(name, ...) \\\n+14 DUNE_REGISTRY_PUT(DirectSolverTag, name, __VA_ARGS__)\n 15\n-16namespace _\bD_\bu_\bn_\be\n-17{\n-18 namespace Amg\n-19 {\n-38 template >\n-_\b3_\b9 class _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-40 {\n-41 public:\n-_\b4_\b5 typedef T _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be;\n-46\n-47 template\n-48 class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-49\n-50 private:\n-54 struct Element\n-55 {\n-56 friend class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br<_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by, T>;\n-57 friend class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br, const T>;\n-58\n-60 std::weak_ptr coarser_;\n-61\n-63 std::shared_ptr finer_;\n-64\n-66 std::shared_ptr element_;\n-67\n-_\b6_\b9 std::shared_ptr redistributed_;\n-70 };\n-71 public:\n-72\n-_\b7_\b6 using _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br = typename std::allocator_traits::template\n-rebind_alloc;\n-77\n-_\b7_\b8 typedef typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n-79\n-_\b8_\b4 _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(const std::shared_ptr & first);\n-85\n-_\b8_\b9 _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by() : levels_(0)\n-90 {}\n-91\n-_\b9_\b5 _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(const _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& other);\n-96\n-_\b1_\b0_\b1 void _\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args);\n-102\n-_\b1_\b0_\b3 void _\ba_\bd_\bd_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd_\bO_\bn_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args);\n-104\n-_\b1_\b0_\b9 void _\ba_\bd_\bd_\bF_\bi_\bn_\be_\br(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args);\n-110\n-117 template\n-_\b1_\b1_\b8 class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-119 : public BidirectionalIteratorFacade,T1,T1&>\n-120 {\n-121 friend class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n-122 typename std::remove_const::type >;\n-123 friend class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n-124 const typename std::remove_const::type >;\n-125\n-126 public:\n-_\b1_\b2_\b8 _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br()\n-129 {}\n-130\n-_\b1_\b3_\b1 _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(std::shared_ptr element)\n-132 : element_(element)\n-133 {}\n-134\n-_\b1_\b3_\b6 _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n-137 typename std::remove_const::type>& other)\n-138 : element_(other.element_)\n-139 {}\n-140\n-_\b1_\b4_\b2 _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::\n-type,\n-143 const typename std::remove_const::type>& other)\n-144 : element_(other.element_)\n-145 {}\n-146\n-_\b1_\b5_\b0 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n-151 typename std::remove_const::type>& other) const\n-152 {\n-153 return element_ == other.element_;\n-154 }\n-155\n-_\b1_\b5_\b9 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n-160 const typename std::remove_const::type>& other) const\n-161 {\n-162 return element_ == other.element_;\n-163 }\n-164\n-_\b1_\b6_\b6 T1& _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const\n-167 {\n-168 return *(element_->element_);\n-169 }\n-170\n-_\b1_\b7_\b2 void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n-173 {\n-174 element_ = element_->coarser_.lock();\n-175 }\n-176\n-_\b1_\b7_\b8 void _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt()\n-179 {\n-180 element_ = element_->finer_;\n-181 }\n-182\n-_\b1_\b8_\b7 bool _\bi_\bs_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd() const\n-188 {\n-189 return (bool)element_->redistributed_;\n-190 }\n-191\n-_\b1_\b9_\b6 T1& _\bg_\be_\bt_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd() const\n-197 {\n-198 assert(element_->redistributed_);\n-199 return *element_->redistributed_;\n-200 }\n-_\b2_\b0_\b1 void _\ba_\bd_\bd_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd(std::shared_ptr t)\n-202 {\n-203 element_->redistributed_ = t;\n-204 }\n-205\n-_\b2_\b0_\b6 void _\bd_\be_\bl_\be_\bt_\be_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd()\n-207 {\n-208 element_->redistributed_ = nullptr;\n-209 }\n-210\n-211 private:\n-212 std::shared_ptr element_;\n-213 };\n-214\n-_\b2_\b1_\b6 typedef _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>,T> _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-217\n-_\b2_\b1_\b9 typedef _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>, const T> _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-220\n-_\b2_\b2_\b5 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\be_\bs_\bt();\n-226\n-_\b2_\b3_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\ba_\br_\bs_\be_\bs_\bt();\n-232\n-233\n-_\b2_\b3_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\be_\bs_\bt() const;\n-239\n-_\b2_\b4_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\ba_\br_\bs_\be_\bs_\bt() const;\n-245\n-_\b2_\b5_\b0 std::size_t _\bl_\be_\bv_\be_\bl_\bs() const;\n-251\n-252 private:\n-258 std::shared_ptr originalFinest_;\n-260 std::shared_ptr finest_;\n-262 std::shared_ptr coarsest_;\n-264 _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br allocator_;\n-266 int levels_;\n-267 };\n-268\n-269 template\n-_\b2_\b7_\b0 _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(const std::shared_ptr & first)\n-271 : originalFinest_(first)\n-272 {\n-273 finest_ = std::allocate_shared(allocator_);\n-274 finest_->element_ = originalFinest_;\n-275 coarsest_ = finest_;\n-276 levels_ = 1;\n-277 }\n-278\n-280 //TODO: do we actually want to support this? This might be very expensive?!\n-281 template\n-_\b2_\b8_\b2 _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(const _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& other)\n-283 : allocator_(other.allocator_),\n-284 levels_(other.levels_)\n-285 {\n-286 if(!other.finest_)\n-287 {\n-288 finest_=coarsest_=nullptr;\n-289 return;\n-290 }\n-291 finest_ = std::allocate_shared(allocator_);\n-292 std::shared_ptr finer_;\n-293 std::shared_ptr current_ = finest_;\n-294 std::weak_ptr otherWeak_ = other.finest_;\n-295\n-296 while(! otherWeak_.expired())\n-297 {\n-298 // create shared_ptr from weak_ptr, we just checked that this is safe\n-299 std::shared_ptr otherCurrent_ = std::shared_ptr\n-(otherWeak_);\n-300 // clone current level\n-301 //TODO: should we use the allocator?\n-302 current_->element_ =\n-303 std::make_shared(*(otherCurrent_->element_));\n-304 current_->finer_=finer_;\n-305 if(otherCurrent_->redistributed_)\n-306 current_->redistributed_ =\n-307 std::make_shared(*(otherCurrent_->redistributed_));\n-308 finer_=current_;\n-309 if(not otherCurrent_->coarser_.expired())\n-310 {\n-311 auto c = std::allocate_shared(allocator_);\n-312 current_->coarser_ = c;\n-313 current_ = c;\n-314 }\n-315 // go to coarser level\n-316 otherWeak_ = otherCurrent_->coarser_;\n-317 }\n-318 coarsest_=current_;\n-319 }\n-320\n-321 template\n-_\b3_\b2_\b2 std::size_t _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs() const\n-323 {\n-324 return levels_;\n-325 }\n-326\n-327 template\n-_\b3_\b2_\b8 void _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd_\bO_\bn_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-329 {\n-330 coarsest_->redistributed_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-(args);\n-331 }\n-332\n-333 template\n-_\b3_\b3_\b4 void _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-335 {\n-336 if(!coarsest_) {\n-337 // we have no levels at all...\n-338 assert(!finest_);\n-339 // allocate into the shared_ptr\n-340 originalFinest_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(args);\n-341 coarsest_ = std::allocate_shared(allocator_);\n-342 coarsest_->element_ = originalFinest_;\n-343 finest_ = coarsest_;\n-344 }else{\n-345 auto old_coarsest = coarsest_;\n-346 coarsest_ = std::allocate_shared(allocator_);\n-347 coarsest_->finer_ = old_coarsest;\n-348 coarsest_->element_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(args);\n-349 old_coarsest->coarser_ = coarsest_;\n-350 }\n-351 ++levels_;\n-352 }\n-353\n-354\n-355 template\n-_\b3_\b5_\b6 void _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bF_\bi_\bn_\be_\br(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n-357 {\n-358 //TODO: wouldn't it be better to do this in the constructor?'\n-359 if(!finest_) {\n-360 // we have no levels at all...\n-361 assert(!coarsest_);\n-362 // allocate into the shared_ptr\n-363 originalFinest_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(args);\n-364 finest_ = std::allocate_shared(allocator_);\n-365 finest_->element = originalFinest_;\n-366 coarsest_ = finest_;\n-367 }else{\n-368 finest_->finer_ = std::allocate_shared(allocator_);\n-369 finest_->finer_->coarser_ = finest_;\n-370 finest_ = finest_->finer_;\n-371 finest_->element = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(args);\n-372 }\n-373 ++levels_;\n-374 }\n-375\n-376 template\n-_\b3_\b7_\b7 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bf_\bi_\bn_\be_\bs_\bt()\n-378 {\n-379 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(finest_);\n-380 }\n-381\n-382 template\n-_\b3_\b8_\b3 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bs_\bt()\n-384 {\n-385 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(coarsest_);\n-386 }\n-387\n-388 template\n-_\b3_\b8_\b9 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bf_\bi_\bn_\be_\bs_\bt() const\n-390 {\n-391 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(finest_);\n-392 }\n-393\n-394 template\n-_\b3_\b9_\b5 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bs_\bt() const\n-396 {\n-397 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(coarsest_);\n-398 }\n-400 } // namespace Amg\n-401} // namespace Dune\n-402\n-403#endif\n-_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-Helper classes for the construction of classes without empty constructor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-Hierarchy(const Hierarchy &other)\n-Copy constructor (deep copy!).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:282\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\ba_\bd_\bd_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd_\bO_\bn_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt\n-void addRedistributedOnCoarsest(Arguments &args)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:328\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs\n-std::size_t levels() const\n-Get the number of levels in the hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:322\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bs_\bt\n-ConstIterator coarsest() const\n-Get an iterator positioned at the coarsest level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:395\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br\n-void addCoarser(Arguments &args)\n-Add an element on a coarser level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:334\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\ba_\bd_\bd_\bF_\bi_\bn_\be_\br\n-void addFiner(Arguments &args)\n-Add an element on a finer level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:356\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-Hierarchy(const std::shared_ptr< MemberType > &first)\n-Construct a new hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:270\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-const void * Arguments\n-A type holding all the arguments needed to call the constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< T > construct(Arguments &args)\n-Construct an object with the specified arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bs_\bt\n-Iterator coarsest()\n-Get an iterator positioned at the coarsest level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:383\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bf_\bi_\bn_\be_\bs_\bt\n-ConstIterator finest() const\n-Get an iterator positioned at the finest level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:389\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bf_\bi_\bn_\be_\bs_\bt\n-Iterator finest()\n-Get an iterator positioned at the finest level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:377\n-_\bs_\bt_\bd\n-STL namespace.\n+_\b1_\b6#define DUNE_REGISTER_PRECONDITIONER(name, ...) \\\n+17 DUNE_REGISTRY_PUT(PreconditionerTag, name, __VA_ARGS__)\n+18\n+_\b1_\b9#define DUNE_REGISTER_ITERATIVE_SOLVER(name, ...) \\\n+20 DUNE_REGISTRY_PUT(IterativeSolverTag, name, __VA_ARGS__)\n+21\n+22namespace _\bD_\bu_\bn_\be{\n+27 namespace {\n+28 struct DirectSolverTag {};\n+29 struct PreconditionerTag {};\n+30 struct IterativeSolverTag {};\n+31 }\n+32 templateclass Preconditioner, int\n+_\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl=1>\n+_\b3_\b3 auto _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br(){\n+34 return [](auto typeList, const auto& matrix, const Dune::ParameterTree&\n+config)\n+35 {\n+36 using _\bM_\ba_\bt_\br_\bi_\bx = typename Dune::TypeListElement<0, decltype(typeList)>::type;\n+37 using Domain = typename Dune::TypeListElement<1, decltype(typeList)>::type;\n+38 using Range = typename Dune::TypeListElement<2, decltype(typeList)>::type;\n+39 std::shared_ptr> preconditioner\n+40 = std::make_shared>\n+(matrix, config);\n+41 return preconditioner;\n+42 };\n+43 }\n+44\n+45 templateclass Preconditioner>\n+_\b4_\b6 auto _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br(){\n+47 return [](auto typeList, const auto& matrix, const Dune::ParameterTree&\n+config)\n+48 {\n+49 using _\bM_\ba_\bt_\br_\bi_\bx = typename Dune::TypeListElement<0, decltype(typeList)>::type;\n+50 using Domain = typename Dune::TypeListElement<1, decltype(typeList)>::type;\n+51 using Range = typename Dune::TypeListElement<2, decltype(typeList)>::type;\n+52 std::shared_ptr> preconditioner\n+53 = std::make_shared>(matrix, config);\n+54 return preconditioner;\n+55 };\n+56 }\n+57\n+58 templateclass Solver>\n+_\b5_\b9 auto _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br(){\n+60 return [](auto typeList,\n+61 const auto& linearOperator,\n+62 const auto& scalarProduct,\n+63 const auto& preconditioner,\n+64 const Dune::ParameterTree& config)\n+65 {\n+66 using Domain = typename Dune::TypeListElement<0, decltype(typeList)>::type;\n+67 using Range = typename Dune::TypeListElement<1, decltype(typeList)>::type;\n+68 std::shared_ptr> solver\n+69 = std::make_shared>(linearOperator, scalarProduct,\n+preconditioner, config);\n+70 return solver;\n+71 };\n+72 }\n+73\n+74 /* This exception is thrown, when the requested solver is in the factory but\n+75 cannot be instantiated for the required template parameters\n+76 */\n+_\b7_\b7 class _\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be : public NotImplemented {};\n+78\n+_\b7_\b9 class _\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\bC_\bo_\bn_\bf_\bi_\bg_\bu_\br_\ba_\bt_\bi_\bo_\bn : public InvalidStateException{};\n+80} // end namespace Dune\n+81\n+82#endif // DUNE_ISTL_SOLVERREGISTRY_HH\n+_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh\n+_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n+Define general, extensible interface for inverse operators.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br\n+auto defaultIterativeSolverCreator()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bB_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl_\bC_\br_\be_\ba_\bt_\bo_\br\n+auto defaultPreconditionerBlockLevelCreator()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bC_\br_\be_\ba_\bt_\bo_\br\n+auto defaultPreconditionerCreator()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:46\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-A hierarchy of containers (e.g. matrices or vectors)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be\n-T MemberType\n-The type of the container we store.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:45\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-LevelIterator< Hierarchy< T, A >, T > Iterator\n-Type of the mutable iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-LevelIterator< const Hierarchy< T, A >, const T > ConstIterator\n-Type of the const iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-ConstructionTraits< T >::Arguments Arguments\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-Hierarchy()\n-Construct an empty hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:89\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n-typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator\n-The allocator to use for the list elements.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator over the levels in the hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-LevelIterator(const LevelIterator< typename std::remove_const< C >::type,\n-typename std::remove_const< T1 >::type > &other)\n-Copy constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bd_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd\n-void addRedistributed(std::shared_ptr< T1 > t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:201\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-T1 & dereference() const\n-Dereference the iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:166\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const LevelIterator< typename std::remove_const< C >::type,\n-typename std::remove_const< T1 >::type > &other) const\n-Equality check.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd\n-bool isRedistributed() const\n-Check whether there was a redistribution at the current level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:187\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n-bool equals(const LevelIterator< const typename std::remove_const< C >::type,\n-const typename std::remove_const< T1 >::type > &other) const\n-Equality check.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:159\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n-void increment()\n-Move to the next coarser level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:172\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-LevelIterator(const LevelIterator< const typename std::remove_const< C >::type,\n-const typename std::remove_const< T1 >::type > &other)\n-Copy constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bl_\be_\bt_\be_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd\n-void deleteRedistributed()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:206\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n-void decrement()\n-Move to the next fine level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:178\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-LevelIterator(std::shared_ptr< Element > element)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:131\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd\n-T1 & getRedistributed() const\n-Get the redistributed container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:196\n+_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bL_\be_\bv_\be_\bl\n+constexpr std::size_t blockLevel()\n+Determine the block level of a possibly nested vector/matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn blocklevel.hh:176\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+A generic dynamic dense matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\bC_\bo_\bn_\bf_\bi_\bg_\bu_\br_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:79\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00122.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00122.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: pinfo.hh File Reference\n+dune-istl: operators.hh File Reference\n \n \n \n \n \n \n \n@@ -65,47 +65,58 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    pinfo.hh File Reference
    \n+ \n
    \n
    \n-
    #include <dune/common/parallel/communication.hh>
    \n-#include <dune/common/enumset.hh>
    \n-#include <dune/common/parallel/mpicommunication.hh>
    \n-#include <dune/common/parallel/mpitraits.hh>
    \n-#include <dune/common/parallel/remoteindices.hh>
    \n-#include <dune/common/parallel/interface.hh>
    \n-#include <dune/common/parallel/communicator.hh>
    \n-#include <dune/istl/solvercategory.hh>
    \n+\n+

    Define general, extensible interface for operators. The available implementation wraps a matrix. \n+More...

    \n+
    #include <dune-istl-config.hh>
    \n+#include <cmath>
    \n+#include <complex>
    \n+#include <iostream>
    \n+#include <iomanip>
    \n+#include <string>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/shared_ptr.hh>
    \n+#include "solvercategory.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::Amg::SequentialInformation
    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...
     
    \n \n \n \n-\n-\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n-
    \n+

    Detailed Description

    \n+

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

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,28 +1,40 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-pinfo.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh>\n+operators.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+_\bc_\bo_\bn_\bc_\be_\bp_\bt\n+Define general, extensible interface for operators. The available\n+implementation wraps a matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0 A linear operator. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0 A linear operator exporting itself in matrix form. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0 Adapter to turn a matrix into a linear operator. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Define general, extensible interface for operators. The available\n+implementation wraps a matrix.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00122_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00122_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: pinfo.hh Source File\n+dune-istl: operators.hh Source File\n \n \n \n \n \n \n \n@@ -70,170 +70,171 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    pinfo.hh
    \n+
    operators.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_PINFO_HH
    \n-
    6#define DUNE_AMG_PINFO_HH
    \n+
    5#ifndef DUNE_ISTL_OPERATORS_HH
    \n+
    6#define DUNE_ISTL_OPERATORS_HH
    \n
    7
    \n-
    8#include <dune/common/parallel/communication.hh>
    \n-
    9#include <dune/common/enumset.hh>
    \n-
    10
    \n-
    11#if HAVE_MPI
    \n-
    12
    \n-
    13#include <dune/common/parallel/mpicommunication.hh>
    \n-
    14#include <dune/common/parallel/mpitraits.hh>
    \n-
    15#include <dune/common/parallel/remoteindices.hh>
    \n-
    16#include <dune/common/parallel/interface.hh>
    \n-
    17#include <dune/common/parallel/communicator.hh>
    \n+
    8#include <dune-istl-config.hh> // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n+
    9
    \n+
    10#include <cmath>
    \n+
    11#include <complex>
    \n+
    12#include <iostream>
    \n+
    13#include <iomanip>
    \n+
    14#include <string>
    \n+
    15
    \n+
    16#include <dune/common/exceptions.hh>
    \n+
    17#include <dune/common/shared_ptr.hh>
    \n
    18
    \n-
    19#endif
    \n+
    19#include "solvercategory.hh"
    \n
    20
    \n-\n-
    22namespace Dune
    \n-
    23{
    \n-
    24 namespace Amg
    \n-
    25 {
    \n-
    26
    \n-
    \n-\n-
    28 {
    \n-
    29 public:
    \n-
    30 typedef Communication<void*> MPICommunicator;
    \n-
    31 typedef EmptySet<int> CopyFlags;
    \n-
    32 typedef AllSet<int> OwnerSet;
    \n-
    33
    \n-
    \n-\n-\n-
    36 }
    \n-
    \n-
    37
    \n-
    \n-\n-
    39 {
    \n-
    40 return comm_;
    \n-
    41 }
    \n-
    \n-
    42
    \n-
    \n-
    43 int procs() const
    \n-
    44 {
    \n-
    45 return 1;
    \n-
    46 }
    \n-
    \n-
    47
    \n-
    48 template<typename T>
    \n-
    \n-
    49 T globalSum(const T& t) const
    \n-
    50 {
    \n-
    51 return t;
    \n-
    52 }
    \n-
    \n-
    53
    \n-\n-
    55
    \n-
    56 void buildGlobalLookup(std::size_t){}
    \n-
    57
    \n-\n-
    59
    \n-
    \n-\n-
    61 {
    \n-
    62 return gli;
    \n-
    63 }
    \n-
    \n-
    64
    \n-
    65 template<class V>
    \n-
    \n-
    66 void copyOwnerToAll([[maybe_unused]] V& v, [[maybe_unused]] V& v1) const
    \n-
    67 {}
    \n-
    \n-
    68
    \n-
    69 template<class V>
    \n-
    \n-
    70 void project([[maybe_unused]] V& v) const
    \n-
    71 {}
    \n-
    \n-
    72
    \n-
    73 template<class T1, class T2>
    \n-
    \n-
    74 void dot (const T1& x, const T1& y, T2& result) const
    \n-
    75 {
    \n-
    76 result = x.dot(y);
    \n-
    77 }
    \n-
    \n-
    78
    \n-
    79 template<class T1>
    \n-
    \n-
    80 typename FieldTraits<typename T1::field_type>::real_type norm (const T1& x) const
    \n-
    81 {
    \n-
    82 return x.two_norm();
    \n-
    83 }
    \n-
    \n-
    84
    \n-
    85 template<class T>
    \n-
    \n-
    86 SequentialInformation(const Communication<T>&)
    \n-
    87 {}
    \n-
    \n-
    88
    \n-
    \n-\n-
    90 {}
    \n-
    \n-
    91
    \n-\n-
    94 private:
    \n-
    95 MPICommunicator comm_{};
    \n-\n-
    97 };
    \n-
    \n-
    98
    \n-
    99
    \n-
    100 } // namespace Amg
    \n-
    101} //namespace Dune
    \n-
    102#endif
    \n-\n+
    21
    \n+
    22namespace Dune {
    \n+
    23
    \n+
    46 //=====================================================================
    \n+
    47 // Abstract operator interface
    \n+
    48 //=====================================================================
    \n+
    49
    \n+
    50
    \n+
    68 template<class X, class Y>
    \n+
    \n+\n+
    70 public:
    \n+
    72 typedef X domain_type;
    \n+
    74 typedef Y range_type;
    \n+
    76 typedef typename X::field_type field_type;
    \n+
    77
    \n+
    82 virtual void apply (const X& x, Y& y) const = 0;
    \n+
    83
    \n+
    85 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const = 0;
    \n+
    86
    \n+
    88 virtual ~LinearOperator () {}
    \n+
    89
    \n+\n+
    92#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n+
    93 {
    \n+
    94 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method in a derived classes, in the future this method will pure virtual.");
    \n+
    95 };
    \n+
    96#else
    \n+
    97 = 0;
    \n+
    98#endif
    \n+
    99 };
    \n+
    \n+
    100
    \n+
    101
    \n+
    110 template<class M, class X, class Y>
    \n+
    \n+\n+
    112 public:
    \n+
    114 typedef M matrix_type;
    \n+
    115 typedef X domain_type;
    \n+
    116 typedef Y range_type;
    \n+
    117 typedef typename X::field_type field_type;
    \n+
    118
    \n+
    120 virtual const M& getmat () const = 0;
    \n+
    121 };
    \n+
    \n+
    122
    \n+
    123
    \n+
    124
    \n+
    125 //=====================================================================
    \n+
    126 // Implementation for ISTL-matrix based operator
    \n+
    127 //=====================================================================
    \n+
    128
    \n+
    134 template<class M, class X, class Y>
    \n+
    \n+\n+
    136 {
    \n+
    137 public:
    \n+
    139 typedef M matrix_type;
    \n+
    140 typedef X domain_type;
    \n+
    141 typedef Y range_type;
    \n+
    142 typedef typename X::field_type field_type;
    \n+
    143
    \n+
    145 explicit MatrixAdapter (const M& A) : _A_(stackobject_to_shared_ptr(A)) {}
    \n+
    146
    \n+
    148 explicit MatrixAdapter (std::shared_ptr<const M> A) : _A_(A) {}
    \n+
    149
    \n+
    \n+
    151 void apply (const X& x, Y& y) const override
    \n+
    152 {
    \n+
    153 _A_->mv(x,y);
    \n+
    154 }
    \n+
    \n+
    155
    \n+
    \n+
    157 void applyscaleadd (field_type alpha, const X& x, Y& y) const override
    \n+
    158 {
    \n+
    159 _A_->usmv(alpha,x,y);
    \n+
    160 }
    \n+
    \n+
    161
    \n+
    \n+
    163 const M& getmat () const override
    \n+
    164 {
    \n+
    165 return *_A_;
    \n+
    166 }
    \n+
    \n+
    167
    \n+
    \n+\n+
    170 {
    \n+\n+
    172 }
    \n+
    \n+
    173
    \n+
    174 private:
    \n+
    175 const std::shared_ptr<const M> _A_;
    \n+
    176 };
    \n+
    \n+
    177
    \n+
    180} // end namespace
    \n+
    181
    \n+
    182#endif
    \n+\n
    Definition allocator.hh:11
    \n-
    Definition pinfo.hh:28
    \n-
    SequentialInformation()
    Definition pinfo.hh:89
    \n-
    T globalSum(const T &t) const
    Definition pinfo.hh:49
    \n-
    EmptySet< int > CopyFlags
    Definition pinfo.hh:31
    \n-
    void dot(const T1 &x, const T1 &y, T2 &result) const
    Definition pinfo.hh:74
    \n-
    AllSet< int > OwnerSet
    Definition pinfo.hh:32
    \n-
    void copyOwnerToAll(V &v, V &v1) const
    Definition pinfo.hh:66
    \n-
    MPICommunicator communicator() const
    Definition pinfo.hh:38
    \n-
    void buildGlobalLookup(std::size_t)
    Definition pinfo.hh:56
    \n-
    void project(V &v) const
    Definition pinfo.hh:70
    \n-
    Communication< void * > MPICommunicator
    Definition pinfo.hh:30
    \n-
    SequentialInformation(const Communication< T > &)
    Definition pinfo.hh:86
    \n-
    const GlobalLookupIndexSet & globalLookup() const
    Definition pinfo.hh:60
    \n-
    SequentialInformation(const SequentialInformation &)
    Definition pinfo.hh:92
    \n-
    FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const
    Definition pinfo.hh:80
    \n-
    void freeGlobalLookup()
    Definition pinfo.hh:58
    \n-
    int GlobalLookupIndexSet
    Definition pinfo.hh:54
    \n-
    SolverCategory::Category category() const
    Definition pinfo.hh:34
    \n-
    int procs() const
    Definition pinfo.hh:43
    \n+
    A linear operator.
    Definition operators.hh:69
    \n+
    virtual ~LinearOperator()
    every abstract base class has a virtual destructor
    Definition operators.hh:88
    \n+
    X::field_type field_type
    The field type of the operator.
    Definition operators.hh:76
    \n+
    virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0
    apply operator to x, scale and add:
    \n+
    virtual SolverCategory::Category category() const =0
    Category of the linear operator (see SolverCategory::Category)
    \n+
    Y range_type
    The type of the range of the operator.
    Definition operators.hh:74
    \n+
    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...
    \n+
    X domain_type
    The type of the domain of the operator.
    Definition operators.hh:72
    \n+
    A linear operator exporting itself in matrix form.
    Definition operators.hh:111
    \n+
    virtual const M & getmat() const =0
    get matrix via *
    \n+
    X domain_type
    Definition operators.hh:115
    \n+
    X::field_type field_type
    Definition operators.hh:117
    \n+
    Y range_type
    Definition operators.hh:116
    \n+
    M matrix_type
    export types, usually they come from the derived class
    Definition operators.hh:114
    \n+
    Adapter to turn a matrix into a linear operator.
    Definition operators.hh:136
    \n+
    MatrixAdapter(std::shared_ptr< const M > A)
    constructor: store an std::shared_ptr to a matrix
    Definition operators.hh:148
    \n+
    MatrixAdapter(const M &A)
    constructor: just store a reference to a matrix
    Definition operators.hh:145
    \n+
    void applyscaleadd(field_type alpha, const X &x, Y &y) const override
    apply operator to x, scale and add:
    Definition operators.hh:157
    \n+
    Y range_type
    Definition operators.hh:141
    \n+
    X domain_type
    Definition operators.hh:140
    \n+
    X::field_type field_type
    Definition operators.hh:142
    \n+
    const M & getmat() const override
    get matrix via *
    Definition operators.hh:163
    \n+
    SolverCategory::Category category() const override
    Category of the solver (see SolverCategory::Category)
    Definition operators.hh:169
    \n+
    void apply(const X &x, Y &y) const override
    apply operator to x:
    Definition operators.hh:151
    \n+
    M matrix_type
    export types
    Definition operators.hh:139
    \n
    Category
    Definition solvercategory.hh:23
    \n
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,179 +1,217 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-pinfo.hh\n+operators.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_PINFO_HH\n-6#define DUNE_AMG_PINFO_HH\n+5#ifndef DUNE_ISTL_OPERATORS_HH\n+6#define DUNE_ISTL_OPERATORS_HH\n 7\n-8#include \n-9#include \n-10\n-11#if HAVE_MPI\n-12\n-13#include \n-14#include \n-15#include \n-16#include \n-17#include \n+8#include // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n+9\n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15\n+16#include \n+17#include \n 18\n-19#endif\n+19#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n 20\n-21#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh>\n-22namespace _\bD_\bu_\bn_\be\n-23{\n-24 namespace Amg\n-25 {\n-26\n-_\b2_\b7 class _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-28 {\n-29 public:\n-_\b3_\b0 typedef Communication _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n-_\b3_\b1 typedef EmptySet _\bC_\bo_\bp_\by_\bF_\bl_\ba_\bg_\bs;\n-_\b3_\b2 typedef AllSet _\bO_\bw_\bn_\be_\br_\bS_\be_\bt;\n-33\n-_\b3_\b4 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by () const {\n-35 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-36 }\n-37\n-_\b3_\b8 _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br() const\n-39 {\n-40 return comm_;\n-41 }\n-42\n-_\b4_\b3 int _\bp_\br_\bo_\bc_\bs() const\n-44 {\n-45 return 1;\n-46 }\n-47\n-48 template\n-_\b4_\b9 T _\bg_\bl_\bo_\bb_\ba_\bl_\bS_\bu_\bm(const T& t) const\n-50 {\n-51 return t;\n-52 }\n-53\n-_\b5_\b4 typedef int _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-55\n-_\b5_\b6 void _\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp(std::size_t){}\n-57\n-_\b5_\b8 void _\bf_\br_\be_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp(){}\n-59\n-_\b6_\b0 const _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bg_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp() const\n-61 {\n-62 return gli;\n-63 }\n-64\n-65 template\n-_\b6_\b6 void _\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl([[maybe_unused]] V& v, [[maybe_unused]] V& v1) const\n-67 {}\n-68\n-69 template\n-_\b7_\b0 void _\bp_\br_\bo_\bj_\be_\bc_\bt([[maybe_unused]] V& v) const\n-71 {}\n-72\n-73 template\n-_\b7_\b4 void _\bd_\bo_\bt (const T1& x, const T1& y, T2& result) const\n-75 {\n-76 result = x.dot(y);\n-77 }\n-78\n-79 template\n-_\b8_\b0 typename FieldTraits::real_type _\bn_\bo_\br_\bm (const T1& x)\n-const\n-81 {\n-82 return x.two_norm();\n-83 }\n-84\n-85 template\n-_\b8_\b6 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(const Communication&)\n-87 {}\n-88\n-_\b8_\b9 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn()\n-90 {}\n-91\n-_\b9_\b2 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn&)\n-93 {}\n-94 private:\n-95 _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br comm_{};\n-96 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt gli{};\n-97 };\n-98\n-99\n-100 } // namespace Amg\n-101} //namespace Dune\n-102#endif\n+21\n+22namespace _\bD_\bu_\bn_\be {\n+23\n+46 //=====================================================================\n+47 // Abstract operator interface\n+48 //=====================================================================\n+49\n+50\n+68 template\n+_\b6_\b9 class _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br {\n+70 public:\n+_\b7_\b2 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b7_\b4 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b7_\b6 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+77\n+_\b8_\b2 virtual void _\ba_\bp_\bp_\bl_\by (const X& x, Y& y) const = 0;\n+83\n+_\b8_\b5 virtual void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha, const X& x, Y& y) const = 0;\n+86\n+_\b8_\b8 virtual _\b~_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br () {}\n+89\n+_\b9_\b1 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+92#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n+93 {\n+94 DUNE_THROW(Dune::Exception,\"It is necessary to implement the category method\n+in a derived classes, in the future this method will pure virtual.\");\n+95 };\n+96#else\n+97 = 0;\n+98#endif\n+99 };\n+100\n+101\n+110 template\n+_\b1_\b1_\b1 class _\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br : public _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br {\n+112 public:\n+_\b1_\b1_\b4 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b1_\b1_\b5 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b1_\b1_\b6 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b1_\b1_\b7 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+118\n+_\b1_\b2_\b0 virtual const M& _\bg_\be_\bt_\bm_\ba_\bt () const = 0;\n+121 };\n+122\n+123\n+124\n+125 //=====================================================================\n+126 // Implementation for ISTL-matrix based operator\n+127 //=====================================================================\n+128\n+134 template\n+_\b1_\b3_\b5 class _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br : public _\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+136 {\n+137 public:\n+_\b1_\b3_\b9 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b1_\b4_\b0 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b1_\b4_\b1 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+_\b1_\b4_\b2 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+143\n+_\b1_\b4_\b5 explicit _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br (const M& A) : _A_(stackobject_to_shared_ptr(A)) {}\n+146\n+_\b1_\b4_\b8 explicit _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br (std::shared_ptr A) : _A_(A) {}\n+149\n+_\b1_\b5_\b1 void _\ba_\bp_\bp_\bl_\by (const X& x, Y& y) const override\n+152 {\n+153 _A_->mv(x,y);\n+154 }\n+155\n+_\b1_\b5_\b7 void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha, const X& x, Y& y) const override\n+158 {\n+159 _A_->usmv(alpha,x,y);\n+160 }\n+161\n+_\b1_\b6_\b3 const M& _\bg_\be_\bt_\bm_\ba_\bt () const override\n+164 {\n+165 return *_A_;\n+166 }\n+167\n+_\b1_\b6_\b9 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const override\n+170 {\n+171 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+172 }\n+173\n+174 private:\n+175 const std::shared_ptr _A_;\n+176 };\n+177\n+180} // end namespace\n+181\n+182#endif\n _\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-SequentialInformation()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:89\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bS_\bu_\bm\n-T globalSum(const T &t) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bF_\bl_\ba_\bg_\bs\n-EmptySet< int > CopyFlags\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:31\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bd_\bo_\bt\n-void dot(const T1 &x, const T1 &y, T2 &result) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n-AllSet< int > OwnerSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:32\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl\n-void copyOwnerToAll(V &v, V &v1) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-MPICommunicator communicator() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n-void buildGlobalLookup(std::size_t)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bj_\be_\bc_\bt\n-void project(V &v) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-Communication< void * > MPICommunicator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-SequentialInformation(const Communication< T > &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n-const GlobalLookupIndexSet & globalLookup() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-SequentialInformation(const SequentialInformation &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:92\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bn_\bo_\br_\bm\n-FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bf_\br_\be_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n-void freeGlobalLookup()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:58\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-int GlobalLookupIndexSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-SolverCategory::Category category() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bc_\bs\n-int procs() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A linear operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\b~_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+virtual ~LinearOperator()\n+every abstract base class has a virtual destructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:88\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd\n+virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0\n+apply operator to x, scale and add:\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const =0\n+Category of the linear operator (see SolverCategory::Category)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The type of the range of the operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(const X &x, Y &y) const =0\n+apply operator to x: The input vector is consistent and the output must also be\n+consistent on the in...\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The type of the domain of the operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A linear operator exporting itself in matrix form.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bm_\ba_\bt\n+virtual const M & getmat() const =0\n+get matrix via *\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:115\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:117\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+export types, usually they come from the derived class\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:114\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n+Adapter to turn a matrix into a linear operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n+MatrixAdapter(std::shared_ptr< const M > A)\n+constructor: store an std::shared_ptr to a matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:148\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n+MatrixAdapter(const M &A)\n+constructor: just store a reference to a matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:145\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd\n+void applyscaleadd(field_type alpha, const X &x, Y &y) const override\n+apply operator to x, scale and add:\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:157\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:141\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:140\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bg_\be_\bt_\bm_\ba_\bt\n+const M & getmat() const override\n+get matrix via *\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:163\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+SolverCategory::Category category() const override\n+Category of the solver (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:169\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(const X &x, Y &y) const override\n+apply operator to x:\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+M matrix_type\n+export types\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:139\n _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n Category\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n @ sequential\n Category for sequential solvers.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00125.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00125.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: fastamg.hh File Reference\n+dune-istl: bccsmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -65,81 +65,36 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n-
    fastamg.hh File Reference
    \n+Namespaces
    \n+
    bccsmatrix.hh File Reference
    \n \n
    \n-\n-

    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. \n-More...

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

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::Amg::FastAMG< M, X, PI, A >
     A fast (sequential) algebraic multigrid based on agglomeration that saves memory bandwidth. More...
     
    \n \n \n \n-\n+\n \n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
    namespace  Dune::ISTL
     
    \n-\n-\n-\n

    \n-Macros

    #define DIRECTSOLVER   SuperLU
     
    \n-

    Detailed Description

    \n-

    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.

    \n-
    Author
    Markus Blatt
    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ DIRECTSOLVER

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define DIRECTSOLVER   SuperLU
    \n-
    \n-\n-
    \n-
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,51 +1,19 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs\n-fastamg.hh File Reference\n-A fast AMG method, that currently only allows only Gauss-Seidel smoothing and\n-is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep\n-with the defect calculation to reduce memory transfers. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+bccsmatrix.hh File Reference\n+#include \n+#include \n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bo_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n-#include \"_\bf_\ba_\bs_\bt_\ba_\bm_\bg_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bP_\bI_\b,_\b _\bA_\b _\b>\n-\u00a0 A fast (sequential) algebraic multigrid based on agglomeration that\n- saves memory bandwidth. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bI_\bR_\bE_\bC_\bT_\bS_\bO_\bL_\bV_\bE_\bR\u00a0\u00a0\u00a0SuperLU\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-A fast AMG method, that currently only allows only Gauss-Seidel smoothing and\n-is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep\n-with the defect calculation to reduce memory transfers.\n- Author\n- Markus Blatt\n-*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDI\bIR\bRE\bEC\bCT\bTS\bSO\bOL\bLV\bVE\bER\bR *\b**\b**\b**\b**\b*\n-#define DIRECTSOLVER\u00a0\u00a0\u00a0SuperLU\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00125_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00125_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: fastamg.hh Source File\n+dune-istl: bccsmatrix.hh Source File\n \n \n \n \n \n \n \n@@ -70,679 +70,135 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    fastamg.hh
    \n+
    bccsmatrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_FASTAMG_HH
    \n-
    6#define DUNE_ISTL_FASTAMG_HH
    \n+
    5#ifndef DUNE_ISTL_BCCSMATRIX_HH
    \n+
    6#define DUNE_ISTL_BCCSMATRIX_HH
    \n
    7
    \n-
    8#include <memory>
    \n-
    9#include <dune/common/exceptions.hh>
    \n+
    8#include <dune/common/fmatrix.hh>
    \n+
    9#include <dune/common/fvector.hh>
    \n
    10#include <dune/common/typetraits.hh>
    \n-\n-\n-\n-
    14#include <dune/istl/solvers.hh>
    \n-\n-
    16#include <dune/istl/superlu.hh>
    \n-
    17#include <dune/istl/umfpack.hh>
    \n-\n-
    19#include <dune/istl/io.hh>
    \n-\n-
    21
    \n-
    22#include "fastamgsmoother.hh"
    \n-
    23
    \n-
    32namespace Dune
    \n-
    33{
    \n-
    34 namespace Amg
    \n-
    35 {
    \n-
    58 template<class M, class X, class PI=SequentialInformation, class A=std::allocator<X> >
    \n-
    \n-
    59 class FastAMG : public Preconditioner<X,X>
    \n-
    60 {
    \n-
    61 public:
    \n-
    63 typedef M Operator;
    \n-\n-\n-\n-
    75
    \n-
    77 typedef X Domain;
    \n-
    79 typedef X Range;
    \n-\n-
    82
    \n-
    90 FastAMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
    \n-
    91 const Parameters& parms,
    \n-
    92 bool symmetric=true);
    \n-
    93
    \n-
    105 template<class C>
    \n-
    106 FastAMG(std::shared_ptr<const Operator> fineOperator,
    \n-
    107 const C& criterion,
    \n-
    108 const Parameters& parms=Parameters(),
    \n-
    109 bool symmetric=true,
    \n-\n-
    111
    \n-
    124 template<class C>
    \n-
    \n-
    125 FastAMG(const Operator& fineOperator,
    \n-
    126 const C& criterion,
    \n-
    127 const Parameters& parms=Parameters(),
    \n-
    128 bool symmetric=true,
    \n-\n-
    130 : FastAMG(stackobject_to_shared_ptr(fineOperator),
    \n-
    131 criterion, parms, symmetric, pinfo)
    \n-
    132 {}
    \n+
    11
    \n+
    \n+
    12namespace Dune::ISTL::Impl
    \n+
    13{
    \n+
    27 template<class B, class I = typename std::allocator<B>::size_type>
    \n+
    28 class BCCSMatrix
    \n+
    29 {
    \n+
    30 public:
    \n+
    31 using Index = I;
    \n+
    32 using size_type = std::size_t;
    \n+
    33
    \n+
    36 BCCSMatrix()
    \n+
    37 : N_(0), M_(0), Nnz_(0), values(0), rowindex(0), colstart(0)
    \n+
    38 {}
    \n+
    39
    \n+
    41 ~BCCSMatrix()
    \n+
    42 {
    \n+
    43 if(N_+M_+Nnz_!=0)
    \n+
    44 free();
    \n+
    45 }
    \n+
    46
    \n+
    48 void setSize(size_type rows, size_type columns)
    \n+
    49 {
    \n+
    50 N_ = rows;
    \n+
    51 M_ = columns;
    \n+
    52 }
    \n+
    53
    \n+
    58 size_type N() const
    \n+
    59 {
    \n+
    60 return N_;
    \n+
    61 }
    \n+
    62
    \n+
    64 size_type nonzeroes() const
    \n+
    65 {
    \n+
    66 return Nnz_;
    \n+
    67 }
    \n+
    68
    \n+
    73 size_type M() const
    \n+
    74 {
    \n+
    75 return M_;
    \n+
    76 }
    \n+
    77
    \n+
    84 B* getValues() const
    \n+
    85 {
    \n+
    86 return values;
    \n+
    87 }
    \n+
    88
    \n+
    95 Index* getRowIndex() const
    \n+
    96 {
    \n+
    97 return rowindex;
    \n+
    98 }
    \n+
    99
    \n+
    106 Index* getColStart() const
    \n+
    107 {
    \n+
    108 return colstart;
    \n+
    109 }
    \n+
    110
    \n+
    112 BCCSMatrix& operator=(const BCCSMatrix& mat)
    \n+
    113 {
    \n+
    114 if(N_+M_+Nnz_!=0)
    \n+
    115 free();
    \n+
    116 N_=mat.N_;
    \n+
    117 M_=mat.M_;
    \n+
    118 Nnz_= mat.Nnz_;
    \n+
    119 if(M_>0) {
    \n+
    120 colstart=new size_type[M_+1];
    \n+
    121 for(size_type i=0; i<=M_; ++i)
    \n+
    122 colstart[i]=mat.colstart[i];
    \n+
    123 }
    \n+
    124
    \n+
    125 if(Nnz_>0) {
    \n+
    126 values = new B[Nnz_];
    \n+
    127 rowindex = new size_type[Nnz_];
    \n+
    128
    \n+
    129 for(size_type i=0; i<Nnz_; ++i)
    \n+
    130 values[i]=mat.values[i];
    \n+
    131
    \n+
    132 for(size_type i=0; i<Nnz_; ++i)
    \n+
    133 rowindex[i]=mat.rowindex[i];
    \n+
    134 }
    \n+
    135 return *this;
    \n+
    136 }
    \n+
    137
    \n+
    139 virtual void free()
    \n+
    140 {
    \n+
    141 delete[] values;
    \n+
    142 delete[] rowindex;
    \n+
    143 delete[] colstart;
    \n+
    144 N_ = 0;
    \n+
    145 M_ = 0;
    \n+
    146 Nnz_ = 0;
    \n+
    147 }
    \n+
    148
    \n+
    149 public:
    \n+
    150 size_type N_, M_, Nnz_;
    \n+
    151 B* values;
    \n+
    152 Index* rowindex;
    \n+
    153 Index* colstart;
    \n+
    154 };
    \n+
    155
    \n+
    156}
    \n
    \n-
    133
    \n-
    137 FastAMG(const FastAMG& amg);
    \n-
    138
    \n-
    140 void pre(Domain& x, Range& b);
    \n-
    141
    \n-
    143 void apply(Domain& v, const Range& d);
    \n-
    144
    \n-
    \n-\n-
    147 {
    \n-\n-
    149 }
    \n-
    \n-
    150
    \n-
    152 void post(Domain& x);
    \n-
    153
    \n-
    158 template<class A1>
    \n-
    159 void getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont);
    \n-
    160
    \n-
    161 std::size_t levels();
    \n-
    162
    \n-
    163 std::size_t maxlevels();
    \n-
    164
    \n-
    \n-\n-
    174 {
    \n-
    175 matrices_->recalculateGalerkin(NegateSet<typename PI::OwnerSet>());
    \n-
    176 }
    \n-
    \n-
    177
    \n-
    182 bool usesDirectCoarseLevelSolver() const;
    \n-
    183
    \n-
    184 private:
    \n-
    191 template<class C>
    \n-
    192 void createHierarchies(C& criterion,
    \n-
    193 std::shared_ptr<const Operator> fineOperator,
    \n-
    194 const PI& pinfo);
    \n-
    195
    \n-
    202 struct LevelContext
    \n-
    203 {
    \n-
    207 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix;
    \n-\n-
    215 typename OperatorHierarchy::RedistributeInfoList::const_iterator redist;
    \n-
    219 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates;
    \n-\n-\n-\n-
    235 std::size_t level;
    \n-
    236 };
    \n-
    237
    \n-
    239 void mgc(LevelContext& levelContext, Domain& x, const Range& b);
    \n-
    240
    \n-
    247 void presmooth(LevelContext& levelContext, Domain& x, const Range& b);
    \n-
    248
    \n-
    255 void postsmooth(LevelContext& levelContext, Domain& x, const Range& b);
    \n-
    256
    \n-
    263 void moveToFineLevel(LevelContext& levelContext, bool processedFineLevel,
    \n-
    264 Domain& fineX);
    \n-
    265
    \n-
    270 bool moveToCoarseLevel(LevelContext& levelContext);
    \n-
    271
    \n-
    276 void initIteratorsWithFineLevel(LevelContext& levelContext);
    \n-
    277
    \n-
    279 std::shared_ptr<OperatorHierarchy> matrices_;
    \n-
    281 std::shared_ptr<CoarseSolver> solver_;
    \n-
    283 std::shared_ptr<Hierarchy<Range,A>> rhs_;
    \n-
    285 std::shared_ptr<Hierarchy<Domain,A>> lhs_;
    \n-
    287 std::shared_ptr<Hierarchy<Domain,A>> residual_;
    \n-
    288
    \n-\n-
    292 std::shared_ptr<ScalarProduct> scalarProduct_;
    \n-
    294 std::size_t gamma_;
    \n-
    296 std::size_t preSteps_;
    \n-
    298 std::size_t postSteps_;
    \n-
    299 std::size_t level;
    \n-
    300 bool buildHierarchy_;
    \n-
    301 bool symmetric;
    \n-
    302 bool coarsesolverconverged;
    \n-\n-
    304 typedef std::shared_ptr<Smoother> SmootherPointer;
    \n-
    305 SmootherPointer coarseSmoother_;
    \n-
    307 std::size_t verbosity_;
    \n-
    308 };
    \n-
    \n-
    309
    \n-
    310 template<class M, class X, class PI, class A>
    \n-
    \n-\n-
    312 : matrices_(amg.matrices_), solver_(amg.solver_),
    \n-
    313 rhs_(), lhs_(), residual_(), scalarProduct_(amg.scalarProduct_),
    \n-
    314 gamma_(amg.gamma_), preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),
    \n-
    315 symmetric(amg.symmetric), coarsesolverconverged(amg.coarsesolverconverged),
    \n-
    316 coarseSmoother_(amg.coarseSmoother_), verbosity_(amg.verbosity_)
    \n-
    317 {}
    \n-
    \n-
    318
    \n-
    319 template<class M, class X, class PI, class A>
    \n-
    \n-\n-
    321 const Parameters& parms, bool symmetric_)
    \n-
    322 : matrices_(stackobject_to_shared_ptr(matrices)), solver_(&coarseSolver),
    \n-
    323 rhs_(), lhs_(), residual_(), scalarProduct_(),
    \n-
    324 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),
    \n-
    325 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),
    \n-
    326 symmetric(symmetric_), coarsesolverconverged(true),
    \n-
    327 coarseSmoother_(), verbosity_(parms.debugLevel())
    \n-
    328 {
    \n-
    329 if(preSteps_>1||postSteps_>1)
    \n-
    330 {
    \n-
    331 std::cerr<<"WARNING only one step of smoothing is supported!"<<std::endl;
    \n-
    332 preSteps_=postSteps_=0;
    \n-
    333 }
    \n-
    334 assert(matrices_->isBuilt());
    \n-
    335 static_assert(std::is_same<PI,SequentialInformation>::value,
    \n-
    336 "Currently only sequential runs are supported");
    \n-
    337 }
    \n-
    \n-
    338 template<class M, class X, class PI, class A>
    \n-
    339 template<class C>
    \n-
    \n-
    340 FastAMG<M,X,PI,A>::FastAMG(std::shared_ptr<const Operator> fineOperator,
    \n-
    341 const C& criterion,
    \n-
    342 const Parameters& parms,
    \n-
    343 bool symmetric_,
    \n-
    344 const PI& pinfo)
    \n-
    345 : solver_(), rhs_(), lhs_(), residual_(), scalarProduct_(), gamma_(parms.getGamma()),
    \n-
    346 preSteps_(parms.getNoPreSmoothSteps()), postSteps_(parms.getNoPostSmoothSteps()),
    \n-
    347 buildHierarchy_(true),
    \n-
    348 symmetric(symmetric_), coarsesolverconverged(true),
    \n-
    349 coarseSmoother_(), verbosity_(criterion.debugLevel())
    \n-
    350 {
    \n-
    351 if(preSteps_>1||postSteps_>1)
    \n-
    352 {
    \n-
    353 std::cerr<<"WARNING only one step of smoothing is supported!"<<std::endl;
    \n-
    354 preSteps_=postSteps_=1;
    \n-
    355 }
    \n-
    356 static_assert(std::is_same<PI,SequentialInformation>::value,
    \n-
    357 "Currently only sequential runs are supported");
    \n-
    358 // TODO: reestablish compile time checks.
    \n-
    359 //static_assert(static_cast<int>(PI::category)==static_cast<int>(S::category),
    \n-
    360 // "Matrix and Solver must match in terms of category!");
    \n-
    361 createHierarchies(criterion, std::move(fineOperator), pinfo);
    \n-
    362 }
    \n-
    \n-
    363
    \n-
    364 template<class M, class X, class PI, class A>
    \n-
    365 template<class C>
    \n-
    366 void FastAMG<M,X,PI,A>::createHierarchies(C& criterion,
    \n-
    367 std::shared_ptr<const Operator> fineOperator,
    \n-
    368 const PI& pinfo)
    \n-
    369 {
    \n-
    370 Timer watch;
    \n-
    371 matrices_ = std::make_shared<OperatorHierarchy>(
    \n-
    372 std::const_pointer_cast<Operator>(std::move(fineOperator)),
    \n-
    373 stackobject_to_shared_ptr(const_cast<PI&>(pinfo)));
    \n-
    374
    \n-
    375 matrices_->template build<NegateSet<typename PI::OwnerSet> >(criterion);
    \n-
    376
    \n-
    377 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
    \n-
    378 std::cout<<"Building Hierarchy of "<<matrices_->maxlevels()<<" levels took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n-
    379
    \n-
    380 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels()) {
    \n-
    381 // We have the carsest level. Create the coarse Solver
    \n-
    382 typedef typename SmootherTraits<Smoother>::Arguments SmootherArgs;
    \n-
    383 SmootherArgs sargs;
    \n-
    384 sargs.iterations = 1;
    \n-
    385
    \n-\n-
    387 cargs.setArgs(sargs);
    \n-
    388 if(matrices_->redistributeInformation().back().isSetup()) {
    \n-
    389 // Solve on the redistributed partitioning
    \n-
    390 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat());
    \n-
    391 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed());
    \n-
    392 }else{
    \n-
    393 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());
    \n-
    394 cargs.setComm(*matrices_->parallelInformation().coarsest());
    \n-
    395 }
    \n-
    396
    \n-
    397 coarseSmoother_ = ConstructionTraits<Smoother>::construct(cargs);
    \n-
    398 scalarProduct_ = createScalarProduct<X>(cargs.getComm(),category());
    \n-
    399
    \n-
    400#if HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK
    \n-
    401#if HAVE_SUITESPARSE_UMFPACK
    \n-
    402#define DIRECTSOLVER UMFPack
    \n-
    403#else
    \n-
    404#define DIRECTSOLVER SuperLU
    \n-
    405#endif
    \n-
    406 // Use superlu if we are purely sequential or with only one processor on the coarsest level.
    \n-
    407 if(std::is_same<ParallelInformation,SequentialInformation>::value // sequential mode
    \n-
    408 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //parallel mode and only one processor
    \n-
    409 || (matrices_->parallelInformation().coarsest().isRedistributed()
    \n-
    410 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()==1
    \n-
    411 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()>0)) { // redistribute and 1 proc
    \n-
    412 if(verbosity_>0 && matrices_->parallelInformation().coarsest()->communicator().rank()==0)
    \n-
    413 std::cout<<"Using superlu"<<std::endl;
    \n-
    414 if(matrices_->parallelInformation().coarsest().isRedistributed())
    \n-
    415 {
    \n-
    416 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
    \n-
    417 // We are still participating on this level
    \n-
    418 solver_.reset(new DIRECTSOLVER<typename M::matrix_type>(matrices_->matrices().coarsest().getRedistributed().getmat(), false, false));
    \n-
    419 else
    \n-
    420 solver_.reset();
    \n-
    421 }else
    \n-
    422 solver_.reset(new DIRECTSOLVER<typename M::matrix_type>(matrices_->matrices().coarsest()->getmat(), false, false));
    \n-
    423 }else
    \n-
    424#undef DIRECTSOLVER
    \n-
    425#endif // HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK
    \n-
    426 {
    \n-
    427 if(matrices_->parallelInformation().coarsest().isRedistributed())
    \n-
    428 {
    \n-
    429 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
    \n-
    430 // We are still participating on this level
    \n-
    431 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(matrices_->matrices().coarsest().getRedistributed()),
    \n-
    432 *scalarProduct_,
    \n-
    433 *coarseSmoother_, 1E-2, 1000, 0));
    \n-
    434 else
    \n-
    435 solver_.reset();
    \n-
    436 }else
    \n-
    437 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(*matrices_->matrices().coarsest()),
    \n-
    438 *scalarProduct_,
    \n-
    439 *coarseSmoother_, 1E-2, 1000, 0));
    \n-
    440 }
    \n-
    441 }
    \n-
    442
    \n-
    443 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
    \n-
    444 std::cout<<"Building Hierarchy of "<<matrices_->maxlevels()<<" levels took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n-
    445 }
    \n-
    446
    \n-
    447
    \n-
    448 template<class M, class X, class PI, class A>
    \n-
    \n-\n-
    450 {
    \n-
    451 Timer watch, watch1;
    \n-
    452 // Detect Matrix rows where all offdiagonal entries are
    \n-
    453 // zero and set x such that A_dd*x_d=b_d
    \n-
    454 // Thus users can be more careless when setting up their linear
    \n-
    455 // systems.
    \n-
    456 typedef typename M::matrix_type Matrix;
    \n-
    457 typedef typename Matrix::ConstRowIterator RowIter;
    \n-
    458 typedef typename Matrix::ConstColIterator ColIter;
    \n-
    459 typedef typename Matrix::block_type Block;
    \n-
    460 Block zero;
    \n-
    461 zero=typename Matrix::field_type();
    \n-
    462
    \n-
    463 const Matrix& mat=matrices_->matrices().finest()->getmat();
    \n-
    464 for(RowIter row=mat.begin(); row!=mat.end(); ++row) {
    \n-
    465 bool isDirichlet = true;
    \n-
    466 bool hasDiagonal = false;
    \n-
    467 ColIter diag;
    \n-
    468 for(ColIter col=row->begin(); col!=row->end(); ++col) {
    \n-
    469 if(row.index()==col.index()) {
    \n-
    470 diag = col;
    \n-
    471 hasDiagonal = (*col != zero);
    \n-
    472 }else{
    \n-
    473 if(*col!=zero)
    \n-
    474 isDirichlet = false;
    \n-
    475 }
    \n-
    476 }
    \n-
    477 if(isDirichlet && hasDiagonal)
    \n-
    478 diag->solve(x[row.index()], b[row.index()]);
    \n-
    479 }
    \n-
    480 if (verbosity_>0)
    \n-
    481 std::cout<<" Preprocessing Dirichlet took "<<watch1.elapsed()<<std::endl;
    \n-
    482 watch1.reset();
    \n-
    483 // No smoother to make x consistent! Do it by hand
    \n-
    484 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x);
    \n-
    485 rhs_ = std::make_shared<Hierarchy<Range,A>>(std::make_shared<Range>(b));
    \n-
    486 lhs_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
    \n-
    487 residual_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
    \n-
    488 matrices_->coarsenVector(*rhs_);
    \n-
    489 matrices_->coarsenVector(*lhs_);
    \n-
    490 matrices_->coarsenVector(*residual_);
    \n-
    491
    \n-
    492 // The preconditioner might change x and b. So we have to
    \n-
    493 // copy the changes to the original vectors.
    \n-
    494 x = *lhs_->finest();
    \n-
    495 b = *rhs_->finest();
    \n-
    496 }
    \n-
    \n-
    497 template<class M, class X, class PI, class A>
    \n-
    \n-\n-
    499 {
    \n-
    500 return matrices_->levels();
    \n-
    501 }
    \n-
    \n-
    502 template<class M, class X, class PI, class A>
    \n-
    \n-\n-
    504 {
    \n-
    505 return matrices_->maxlevels();
    \n-
    506 }
    \n-
    \n-
    507
    \n-
    509 template<class M, class X, class PI, class A>
    \n-
    \n-\n-
    511 {
    \n-
    512 LevelContext levelContext;
    \n-
    513 // Init all iterators for the current level
    \n-
    514 initIteratorsWithFineLevel(levelContext);
    \n-
    515
    \n-
    516 assert(v.two_norm()==0);
    \n-
    517
    \n-
    518 level=0;
    \n-
    519 if(matrices_->maxlevels()==1){
    \n-
    520 // The coarse solver might modify the d!
    \n-
    521 Range b(d);
    \n-
    522 mgc(levelContext, v, b);
    \n-
    523 }else
    \n-
    524 mgc(levelContext, v, d);
    \n-
    525 if(postSteps_==0||matrices_->maxlevels()==1)
    \n-
    526 levelContext.pinfo->copyOwnerToAll(v, v);
    \n-
    527 }
    \n-
    \n-
    528
    \n-
    529 template<class M, class X, class PI, class A>
    \n-
    530 void FastAMG<M,X,PI,A>::initIteratorsWithFineLevel(LevelContext& levelContext)
    \n-
    531 {
    \n-
    532 levelContext.matrix = matrices_->matrices().finest();
    \n-
    533 levelContext.pinfo = matrices_->parallelInformation().finest();
    \n-
    534 levelContext.redist =
    \n-
    535 matrices_->redistributeInformation().begin();
    \n-
    536 levelContext.aggregates = matrices_->aggregatesMaps().begin();
    \n-
    537 levelContext.lhs = lhs_->finest();
    \n-
    538 levelContext.residual = residual_->finest();
    \n-
    539 levelContext.rhs = rhs_->finest();
    \n-
    540 levelContext.level=0;
    \n-
    541 }
    \n-
    542
    \n-
    543 template<class M, class X, class PI, class A>
    \n-
    544 bool FastAMG<M,X,PI,A>
    \n-
    545 ::moveToCoarseLevel(LevelContext& levelContext)
    \n-
    546 {
    \n-
    547 bool processNextLevel=true;
    \n-
    548
    \n-
    549 if(levelContext.redist->isSetup()) {
    \n-
    550 throw "bla";
    \n-
    551 levelContext.redist->redistribute(static_cast<const Range&>(*levelContext.residual),
    \n-
    552 levelContext.residual.getRedistributed());
    \n-
    553 processNextLevel = levelContext.residual.getRedistributed().size()>0;
    \n-
    554 if(processNextLevel) {
    \n-
    555 //restrict defect to coarse level right hand side.
    \n-
    556 ++levelContext.pinfo;
    \n-
    557 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n-
    558 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
    \n-
    559 static_cast<const Range&>(levelContext.residual.getRedistributed()),
    \n-
    560 *levelContext.pinfo);
    \n-
    561 }
    \n-
    562 }else{
    \n-
    563 //restrict defect to coarse level right hand side.
    \n-
    564 ++levelContext.rhs;
    \n-
    565 ++levelContext.pinfo;
    \n-
    566 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n-
    567 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
    \n-
    568 static_cast<const Range&>(*levelContext.residual), *levelContext.pinfo);
    \n-
    569 }
    \n-
    570
    \n-
    571 if(processNextLevel) {
    \n-
    572 // prepare coarse system
    \n-
    573 ++levelContext.residual;
    \n-
    574 ++levelContext.lhs;
    \n-
    575 ++levelContext.matrix;
    \n-
    576 ++levelContext.level;
    \n-
    577 ++levelContext.redist;
    \n-
    578
    \n-
    579 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
    \n-
    580 // next level is not the globally coarsest one
    \n-
    581 ++levelContext.aggregates;
    \n-
    582 }
    \n-
    583 // prepare the lhs on the next level
    \n-
    584 *levelContext.lhs=0;
    \n-
    585 *levelContext.residual=0;
    \n-
    586 }
    \n-
    587 return processNextLevel;
    \n-
    588 }
    \n-
    589
    \n-
    590 template<class M, class X, class PI, class A>
    \n-
    591 void FastAMG<M,X,PI,A>
    \n-
    592 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel, Domain& x)
    \n-
    593 {
    \n-
    594 if(processNextLevel) {
    \n-
    595 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
    \n-
    596 // previous level is not the globally coarsest one
    \n-
    597 --levelContext.aggregates;
    \n-
    598 }
    \n-
    599 --levelContext.redist;
    \n-
    600 --levelContext.level;
    \n-
    601 //prolongate and add the correction (update is in coarse left hand side)
    \n-
    602 --levelContext.matrix;
    \n-
    603 --levelContext.residual;
    \n-
    604
    \n-
    605 }
    \n-
    606
    \n-
    607 typename Hierarchy<Domain,A>::Iterator coarseLhs = levelContext.lhs--;
    \n-
    608 if(levelContext.redist->isSetup()) {
    \n-
    609
    \n-
    610 // Need to redistribute during prolongate
    \n-
    611 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n-
    612 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,
    \n-
    613 levelContext.lhs.getRedistributed(),
    \n-
    614 matrices_->getProlongationDampingFactor(),
    \n-
    615 *levelContext.pinfo, *levelContext.redist);
    \n-
    616 }else{
    \n-
    617 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n-
    618 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,
    \n-
    619 matrices_->getProlongationDampingFactor(), *levelContext.pinfo);
    \n-
    620
    \n-
    621 // printvector(std::cout, *lhs, "prolongated coarse grid correction", "lhs", 10, 10, 10);
    \n-
    622 }
    \n-
    623
    \n-
    624
    \n-
    625 if(processNextLevel) {
    \n-
    626 --levelContext.rhs;
    \n-
    627 }
    \n-
    628
    \n-
    629 }
    \n-
    630
    \n-
    631
    \n-
    632 template<class M, class X, class PI, class A>
    \n-
    633 void FastAMG<M,X,PI,A>
    \n-
    634 ::presmooth(LevelContext& levelContext, Domain& x, const Range& b)
    \n-
    635 {
    \n-
    636 constexpr auto bl = blockLevel<typename M::matrix_type>();
    \n-
    637 GaussSeidelPresmoothDefect<bl>::apply(levelContext.matrix->getmat(),
    \n-
    638 x,
    \n-
    639 *levelContext.residual,
    \n-
    640 b);
    \n-
    641 }
    \n-
    642
    \n-
    643 template<class M, class X, class PI, class A>
    \n-
    644 void FastAMG<M,X,PI,A>
    \n-
    645 ::postsmooth(LevelContext& levelContext, Domain& x, const Range& b)
    \n-
    646 {
    \n-
    647 constexpr auto bl = blockLevel<typename M::matrix_type>();
    \n-
    648 GaussSeidelPostsmoothDefect<bl>
    \n-
    649 ::apply(levelContext.matrix->getmat(), x, *levelContext.residual, b);
    \n-
    650 }
    \n-
    651
    \n-
    652
    \n-
    653 template<class M, class X, class PI, class A>
    \n-\n-
    658
    \n-
    659 template<class M, class X, class PI, class A>
    \n-
    660 void FastAMG<M,X,PI,A>::mgc(LevelContext& levelContext, Domain& v, const Range& b){
    \n-
    661
    \n-
    662 if(levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels()) {
    \n-
    663 // Solve directly
    \n-\n-
    665 res.converged=true; // If we do not compute this flag will not get updated
    \n-
    666 if(levelContext.redist->isSetup()) {
    \n-
    667 levelContext.redist->redistribute(b, levelContext.rhs.getRedistributed());
    \n-
    668 if(levelContext.rhs.getRedistributed().size()>0) {
    \n-
    669 // We are still participating in the computation
    \n-
    670 levelContext.pinfo.getRedistributed().copyOwnerToAll(levelContext.rhs.getRedistributed(),
    \n-
    671 levelContext.rhs.getRedistributed());
    \n-
    672 solver_->apply(levelContext.lhs.getRedistributed(), levelContext.rhs.getRedistributed(), res);
    \n-
    673 }
    \n-
    674 levelContext.redist->redistributeBackward(v, levelContext.lhs.getRedistributed());
    \n-
    675 levelContext.pinfo->copyOwnerToAll(v, v);
    \n-
    676 }else{
    \n-
    677 levelContext.pinfo->copyOwnerToAll(b, b);
    \n-
    678 solver_->apply(v, const_cast<Range&>(b), res);
    \n-
    679 }
    \n-
    680
    \n-
    681 // printvector(std::cout, *lhs, "coarse level update", "u", 10, 10, 10);
    \n-
    682 // printvector(std::cout, *rhs, "coarse level rhs", "rhs", 10, 10, 10);
    \n-
    683 if (!res.converged)
    \n-
    684 coarsesolverconverged = false;
    \n-
    685 }else{
    \n-
    686 // presmoothing
    \n-
    687 presmooth(levelContext, v, b);
    \n-
    688 // printvector(std::cout, *lhs, "update", "u", 10, 10, 10);
    \n-
    689 // printvector(std::cout, *residual, "post presmooth residual", "r", 10);
    \n-
    690#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
    \n-
    691 bool processNextLevel = moveToCoarseLevel(levelContext);
    \n-
    692
    \n-
    693 if(processNextLevel) {
    \n-
    694 // next level
    \n-
    695 for(std::size_t i=0; i<gamma_; i++)
    \n-
    696 mgc(levelContext, *levelContext.lhs, *levelContext.rhs);
    \n-
    697 }
    \n-
    698
    \n-
    699 moveToFineLevel(levelContext, processNextLevel, v);
    \n-
    700#else
    \n-
    701 *lhs=0;
    \n-
    702#endif
    \n-
    703
    \n-
    704 if(levelContext.matrix == matrices_->matrices().finest()) {
    \n-
    705 coarsesolverconverged = matrices_->parallelInformation().finest()->communicator().prod(coarsesolverconverged);
    \n-
    706 if(!coarsesolverconverged)
    \n-
    707 DUNE_THROW(MathError, "Coarse solver did not converge");
    \n-
    708 }
    \n-
    709
    \n-
    710 postsmooth(levelContext, v, b);
    \n-
    711 }
    \n-
    712 }
    \n-
    713
    \n-
    714
    \n-
    716 template<class M, class X, class PI, class A>
    \n-
    \n-
    717 void FastAMG<M,X,PI,A>::post([[maybe_unused]] Domain& x)
    \n-
    718 {
    \n-
    719 lhs_=nullptr;
    \n-
    720 rhs_=nullptr;
    \n-
    721 residual_=nullptr;
    \n-
    722 }
    \n-
    \n-
    723
    \n-
    724 template<class M, class X, class PI, class A>
    \n-
    725 template<class A1>
    \n-
    \n-
    726 void FastAMG<M,X,PI,A>::getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont)
    \n-
    727 {
    \n-
    728 matrices_->getCoarsestAggregatesOnFinest(cont);
    \n-
    729 }
    \n-
    \n-
    730
    \n-
    731 } // end namespace Amg
    \n-
    732} // end namespace Dune
    \n-
    733
    \n-
    734#endif
    \n-
    Classes for using SuperLU with ISTL matrices.
    \n-
    Some generic functions for pretty printing vectors and matrices.
    \n-
    Define general preconditioner interface.
    \n-
    Define base class for scalar product and norm.
    \n-
    Classes for using UMFPack with ISTL matrices.
    \n-
    Implementations of the inverse operator interface.
    \n-
    Prolongation and restriction for amg.
    \n-
    Provides a classes representing the hierarchies in AMG.
    \n-
    Classes for the generic construction and application of the smoothers.
    \n-\n-
    Templates characterizing the type of a solver.
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n+
    157#endif
    \n
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n-
    void presmooth(LevelContext &levelContext, size_t steps)
    Apply pre smoothing on the current level.
    Definition smoother.hh:406
    \n-
    const void * Arguments
    A type holding all the arguments needed to call the constructor.
    Definition construction.hh:44
    \n-
    static std::shared_ptr< T > construct(Arguments &args)
    Construct an object with the specified arguments.
    Definition construction.hh:52
    \n-
    void postsmooth(LevelContext &levelContext, size_t steps)
    Apply post smoothing on the current level.
    Definition smoother.hh:428
    \n-
    int iterations
    The number of iterations to perform.
    Definition smoother.hh:47
    \n-
    OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix
    The iterator over the matrices.
    Definition fastamg.hh:207
    \n-
    void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)
    Get the aggregate number of each unknown on the coarsest level.
    Definition fastamg.hh:726
    \n-
    ParallelInformationHierarchy::Iterator pinfo
    The iterator over the parallel information.
    Definition fastamg.hh:211
    \n-
    void recalculateHierarchy()
    Recalculate the matrix hierarchy.
    Definition fastamg.hh:173
    \n-
    void post(Domain &x)
    Clean up.
    Definition fastamg.hh:717
    \n-
    std::size_t maxlevels()
    Definition fastamg.hh:503
    \n-
    X Domain
    The domain type.
    Definition fastamg.hh:77
    \n-
    Hierarchy< Domain, A >::Iterator residual
    The iterator over the residuals.
    Definition fastamg.hh:227
    \n-
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition fastamg.hh:146
    \n-
    MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy
    The operator hierarchy type.
    Definition fastamg.hh:72
    \n-
    OperatorHierarchy::RedistributeInfoList::const_iterator redist
    The iterator over the redistribution information.
    Definition fastamg.hh:215
    \n-
    X Range
    The range type.
    Definition fastamg.hh:79
    \n-
    PI ParallelInformation
    The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
    Definition fastamg.hh:70
    \n-
    M Operator
    The matrix operator type.
    Definition fastamg.hh:63
    \n-
    std::size_t levels()
    Definition fastamg.hh:498
    \n-
    FastAMG(const Operator &fineOperator, const C &criterion, const Parameters &parms=Parameters(), bool symmetric=true, const ParallelInformation &pinfo=ParallelInformation())
    Construct an AMG with an inexact coarse solver based on the smoother.
    Definition fastamg.hh:125
    \n-
    InverseOperator< X, X > CoarseSolver
    the type of the coarse solver.
    Definition fastamg.hh:81
    \n-
    bool usesDirectCoarseLevelSolver() const
    Check whether the coarse solver used is a direct solver.
    Definition fastamg.hh:654
    \n-
    Hierarchy< Domain, A >::Iterator lhs
    The iterator over the left hand side.
    Definition fastamg.hh:223
    \n-
    Hierarchy< Range, A >::Iterator rhs
    The iterator over the right hand sided.
    Definition fastamg.hh:231
    \n-
    std::size_t level
    The level index.
    Definition fastamg.hh:235
    \n-
    void apply(Domain &v, const Range &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition fastamg.hh:510
    \n-
    OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy
    The parallal data distribution hierarchy type.
    Definition fastamg.hh:74
    \n-
    void pre(Domain &x, Range &b)
    Prepare the preconditioner.
    Definition fastamg.hh:449
    \n-
    FastAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const Parameters &parms, bool symmetric=true)
    Construct a new amg with a specific coarse solver.
    Definition fastamg.hh:320
    \n-
    OperatorHierarchy::AggregatesMapList::const_iterator aggregates
    The iterator over the aggregates maps.
    Definition fastamg.hh:219
    \n-
    Definition allocator.hh:11
    \n-
    ConstIterator class for sequential access.
    Definition matrix.hh:404
    \n-
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n-
    typename Imp::BlockTraits< T >::field_type field_type
    Export the type representing the underlying field.
    Definition matrix.hh:565
    \n-
    row_type::const_iterator ConstColIterator
    Const iterator for the entries of each row.
    Definition matrix.hh:589
    \n-
    T block_type
    Export the type representing the components.
    Definition matrix.hh:568
    \n-
    A fast (sequential) algebraic multigrid based on agglomeration that saves memory bandwidth.
    Definition fastamg.hh:60
    \n-
    static void apply(const M &A, X &x, Y &d, const Y &b)
    Definition fastamgsmoother.hh:19
    \n-\n-
    LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
    Type of the mutable iterator.
    Definition hierarchy.hh:216
    \n-
    Iterator over the levels in the hierarchy.
    Definition hierarchy.hh:120
    \n-
    The hierarchies build by the coarsening process.
    Definition matrixhierarchy.hh:61
    \n-
    All parameters for AMG.
    Definition parameters.hh:416
    \n-
    The default class for the smoother arguments.
    Definition smoother.hh:38
    \n-
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n-
    Sequential SSOR preconditioner.
    Definition preconditioners.hh:142
    \n-
    Base class for scalar product and norm computation.
    Definition scalarproducts.hh:52
    \n-
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n-
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n-
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n-
    Definition solvertype.hh:16
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,841 +1,125 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-fastamg.hh\n+bccsmatrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_FASTAMG_HH\n-6#define DUNE_ISTL_FASTAMG_HH\n+5#ifndef DUNE_ISTL_BCCSMATRIX_HH\n+6#define DUNE_ISTL_BCCSMATRIX_HH\n 7\n-8#include \n-9#include \n+8#include \n+9#include \n 10#include \n-11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n-13#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh>\n-16#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh>\n-17#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bo_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n-21\n-22#include \"_\bf_\ba_\bs_\bt_\ba_\bm_\bg_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\"\n-23\n-32namespace _\bD_\bu_\bn_\be\n-33{\n-34 namespace Amg\n-35 {\n-58 template >\n-_\b5_\b9 class _\bF_\ba_\bs_\bt_\bA_\bM_\bG : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-60 {\n-61 public:\n-_\b6_\b3 typedef M _\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n-_\b7_\b0 typedef PI _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n-_\b7_\b2 typedef _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\b> _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n-_\b7_\b4 typedef typename _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n-75\n-_\b7_\b7 typedef X _\bD_\bo_\bm_\ba_\bi_\bn;\n-_\b7_\b9 typedef X _\bR_\ba_\bn_\bg_\be;\n-_\b8_\b1 typedef _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bX_\b> _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br;\n-82\n-90 _\bF_\ba_\bs_\bt_\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br& coarseSolver,\n-91 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms,\n-92 bool symmetric=true);\n-93\n-105 template\n-106 _\bF_\ba_\bs_\bt_\bA_\bM_\bG(std::shared_ptr fineOperator,\n-107 const C& criterion,\n-108 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms=_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(),\n-109 bool symmetric=true,\n-110 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo=_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n-111\n-124 template\n-_\b1_\b2_\b5 _\bF_\ba_\bs_\bt_\bA_\bM_\bG(const _\bO_\bp_\be_\br_\ba_\bt_\bo_\br& fineOperator,\n-126 const C& criterion,\n-127 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms=_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(),\n-128 bool symmetric=true,\n-129 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo=_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn())\n-130 : _\bF_\ba_\bs_\bt_\bA_\bM_\bG(stackobject_to_shared_ptr(fineOperator),\n-131 criterion, parms, symmetric, pinfo)\n-132 {}\n-133\n-137 _\bF_\ba_\bs_\bt_\bA_\bM_\bG(const _\bF_\ba_\bs_\bt_\bA_\bM_\bG& amg);\n-138\n-140 void _\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b);\n-141\n-143 void _\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d);\n-144\n-_\b1_\b4_\b6 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-147 {\n-148 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-149 }\n-150\n-152 void _\bp_\bo_\bs_\bt(_\bD_\bo_\bm_\ba_\bi_\bn& x);\n-153\n-158 template\n-159 void _\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs(std::vector& cont);\n-160\n-161 std::size_t _\bl_\be_\bv_\be_\bl_\bs();\n-162\n-163 std::size_t _\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs();\n-164\n-_\b1_\b7_\b3 void _\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by()\n-174 {\n-175 matrices_->recalculateGalerkin(NegateSet());\n-176 }\n-177\n-182 bool _\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br() const;\n-183\n-184 private:\n-191 template\n-192 void createHierarchies(C& criterion,\n-193 std::shared_ptr fineOperator,\n-194 const PI& pinfo);\n-195\n-202 struct LevelContext\n-203 {\n-_\b2_\b0_\b7 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator _\bm_\ba_\bt_\br_\bi_\bx;\n-_\b2_\b1_\b1 typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bp_\bi_\bn_\bf_\bo;\n-_\b2_\b1_\b5 typename OperatorHierarchy::RedistributeInfoList::const_iterator _\br_\be_\bd_\bi_\bs_\bt;\n-_\b2_\b1_\b9 typename OperatorHierarchy::AggregatesMapList::const_iterator _\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs;\n-_\b2_\b2_\b3 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bl_\bh_\bs;\n-_\b2_\b2_\b7 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\be_\bs_\bi_\bd_\bu_\ba_\bl;\n-_\b2_\b3_\b1 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bR_\ba_\bn_\bg_\be_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\bh_\bs;\n-_\b2_\b3_\b5 std::size_t _\bl_\be_\bv_\be_\bl;\n-236 };\n-237\n-239 void mgc(LevelContext& levelContext, _\bD_\bo_\bm_\ba_\bi_\bn& x, const _\bR_\ba_\bn_\bg_\be& b);\n-240\n-247 void presmooth(LevelContext& levelContext, _\bD_\bo_\bm_\ba_\bi_\bn& x, const _\bR_\ba_\bn_\bg_\be& b);\n-248\n-255 void postsmooth(LevelContext& levelContext, _\bD_\bo_\bm_\ba_\bi_\bn& x, const _\bR_\ba_\bn_\bg_\be& b);\n-256\n-263 void moveToFineLevel(LevelContext& levelContext, bool processedFineLevel,\n-264 _\bD_\bo_\bm_\ba_\bi_\bn& fineX);\n-265\n-270 bool moveToCoarseLevel(LevelContext& levelContext);\n-271\n-276 void initIteratorsWithFineLevel(LevelContext& levelContext);\n-277\n-279 std::shared_ptr matrices_;\n-281 std::shared_ptr solver_;\n-283 std::shared_ptr> rhs_;\n-285 std::shared_ptr> lhs_;\n-287 std::shared_ptr> residual_;\n-288\n-290 using _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt = _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bX_\b>;\n-292 std::shared_ptr scalarProduct_;\n-294 std::size_t gamma_;\n-296 std::size_t preSteps_;\n-298 std::size_t postSteps_;\n-299 std::size_t level;\n-300 bool buildHierarchy_;\n-301 bool symmetric;\n-302 bool coarsesolverconverged;\n-303 typedef _\bS_\be_\bq_\bS_\bS_\bO_\bR_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b,_\bX_\b,_\bX_\b> _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n-304 typedef std::shared_ptr SmootherPointer;\n-305 SmootherPointer coarseSmoother_;\n-307 std::size_t verbosity_;\n-308 };\n-309\n-310 template\n-_\b3_\b1_\b1 _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG(const _\bF_\ba_\bs_\bt_\bA_\bM_\bG& amg)\n-312 : matrices_(amg.matrices_), solver_(amg.solver_),\n-313 rhs_(), lhs_(), residual_(), scalarProduct_(amg.scalarProduct_),\n-314 gamma_(amg.gamma_), preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),\n-315 symmetric(amg.symmetric), coarsesolverconverged(amg.coarsesolverconverged),\n-316 coarseSmoother_(amg.coarseSmoother_), verbosity_(amg.verbosity_)\n-317 {}\n-318\n-319 template\n-_\b3_\b2_\b0 _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br&\n-coarseSolver,\n-321 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms, bool symmetric_)\n-322 : matrices_(stackobject_to_shared_ptr(matrices)), solver_(&coarseSolver),\n-323 rhs_(), lhs_(), residual_(), scalarProduct_(),\n-324 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),\n-325 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),\n-326 symmetric(symmetric_), coarsesolverconverged(true),\n-327 coarseSmoother_(), verbosity_(parms.debugLevel())\n-328 {\n-329 if(preSteps_>1||postSteps_>1)\n-330 {\n-331 std::cerr<<\"WARNING only one step of smoothing is supported!\"<isBuilt());\n-335 static_assert(std::is_same::value,\n-336 \"Currently only sequential runs are supported\");\n-337 }\n-338 template\n-339 template\n-_\b3_\b4_\b0 _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG(std::shared_ptr fineOperator,\n-341 const C& criterion,\n-342 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms,\n-343 bool symmetric_,\n-344 const PI& pinfo)\n-345 : solver_(), rhs_(), lhs_(), residual_(), scalarProduct_(), gamma_\n-(parms.getGamma()),\n-346 preSteps_(parms.getNoPreSmoothSteps()), postSteps_\n-(parms.getNoPostSmoothSteps()),\n-347 buildHierarchy_(true),\n-348 symmetric(symmetric_), coarsesolverconverged(true),\n-349 coarseSmoother_(), verbosity_(criterion.debugLevel())\n-350 {\n-351 if(preSteps_>1||postSteps_>1)\n-352 {\n-353 std::cerr<<\"WARNING only one step of smoothing is supported!\"<::value,\n-357 \"Currently only sequential runs are supported\");\n-358 // TODO: reestablish compile time checks.\n-359 //static_assert(static_cast(PI::category)==static_cast(S::\n-category),\n-360 // \"Matrix and Solver must match in terms of category!\");\n-361 createHierarchies(criterion, std::move(fineOperator), pinfo);\n-362 }\n-363\n-364 template\n-365 template\n-366 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\bi_\be_\bs(C& criterion,\n-367 std::shared_ptr fineOperator,\n-368 const PI& pinfo)\n-369 {\n-370 Timer watch;\n-371 matrices_ = std::make_shared(\n-372 std::const_pointer_cast(std::move(fineOperator)),\n-373 stackobject_to_shared_ptr(const_cast(pinfo)));\n-374\n-375 matrices_->template build >(criterion);\n-376\n-377 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator\n-().rank()==0)\n-378 std::cout<<\"Building Hierarchy of \"<maxlevels()<<\" levels took\n-\"<levels()==matrices_->maxlevels()) {\n-381 // We have the carsest level. Create the coarse Solver\n-382 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs SmootherArgs;\n-383 SmootherArgs sargs;\n-384 sargs._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 1;\n-385\n-386 typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs cargs;\n-387 cargs.setArgs(sargs);\n-388 if(matrices_->redistributeInformation().back().isSetup()) {\n-389 // Solve on the redistributed partitioning\n-390 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat\n-());\n-391 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed\n-());\n-392 }else{\n-393 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());\n-394 cargs.setComm(*matrices_->parallelInformation().coarsest());\n-395 }\n-396\n-397 coarseSmoother_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(cargs);\n-398 scalarProduct_ = createScalarProduct(cargs.getComm(),category());\n-399\n-400#if HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK\n-401#if HAVE_SUITESPARSE_UMFPACK\n-402#define DIRECTSOLVER UMFPack\n-403#else\n-404#define DIRECTSOLVER SuperLU\n-405#endif\n-406 // Use superlu if we are purely sequential or with only one processor on\n-the coarsest level.\n-407 if(std::is_same::value /\n-/ sequential mode\n-408 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //\n-parallel mode and only one processor\n-409 || (matrices_->parallelInformation().coarsest().isRedistributed()\n-410 && matrices_->parallelInformation().coarsest().getRedistributed\n-().communicator().size()==1\n-411 && matrices_->parallelInformation().coarsest().getRedistributed\n-().communicator().size()>0)) { // redistribute and 1 proc\n-412 if(verbosity_>0 && matrices_->parallelInformation().coarsest()-\n->communicator().rank()==0)\n-413 std::cout<<\"Using superlu\"<parallelInformation().coarsest().isRedistributed())\n-415 {\n-416 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)\n-417 // We are still participating on this level\n-418 solver_.reset(new DIRECTSOLVER(matrices_->matrices\n-().coarsest().getRedistributed().getmat(), false, false));\n-419 else\n-420 solver_.reset();\n-421 }else\n-422 solver_.reset(new DIRECTSOLVER(matrices_->matrices\n-().coarsest()->getmat(), false, false));\n-423 }else\n-424#undef DIRECTSOLVER\n-425#endif // HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK\n-426 {\n-427 if(matrices_->parallelInformation().coarsest().isRedistributed())\n-428 {\n-429 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)\n-430 // We are still participating on this level\n-431 solver_.reset(new BiCGSTABSolver(const_cast(matrices_->matrices\n-().coarsest().getRedistributed()),\n-432 *scalarProduct_,\n-433 *coarseSmoother_, 1E-2, 1000, 0));\n-434 else\n-435 solver_.reset();\n-436 }else\n-437 solver_.reset(new BiCGSTABSolver(const_cast(*matrices_->matrices\n-().coarsest()),\n-438 *scalarProduct_,\n-439 *coarseSmoother_, 1E-2, 1000, 0));\n-440 }\n-441 }\n-442\n-443 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator\n-().rank()==0)\n-444 std::cout<<\"Building Hierarchy of \"<maxlevels()<<\" levels took\n-\"<\n-_\b4_\b4_\b9 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b)\n-450 {\n-451 Timer watch, watch1;\n-452 // Detect Matrix rows where all offdiagonal entries are\n-453 // zero and set x such that A_dd*x_d=b_d\n-454 // Thus users can be more careless when setting up their linear\n-455 // systems.\n-456 typedef typename M::matrix_type _\bM_\ba_\bt_\br_\bi_\bx;\n-457 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br RowIter;\n-458 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ColIter;\n-459 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be Block;\n-460 Block zero;\n-461 zero=typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be();\n-462\n-463 const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt=matrices_->matrices().finest()->getmat();\n-464 for(RowIter row=_\bm_\ba_\bt.begin(); row!=_\bm_\ba_\bt.end(); ++row) {\n-465 bool isDirichlet = true;\n-466 bool hasDiagonal = false;\n-467 ColIter diag;\n-468 for(ColIter _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl!=row->end(); ++_\bc_\bo_\bl) {\n-469 if(row.index()==_\bc_\bo_\bl.index()) {\n-470 diag = _\bc_\bo_\bl;\n-471 hasDiagonal = (*_\bc_\bo_\bl != zero);\n-472 }else{\n-473 if(*_\bc_\bo_\bl!=zero)\n-474 isDirichlet = false;\n-475 }\n-476 }\n-477 if(isDirichlet && hasDiagonal)\n-478 diag->solve(x[row.index()], b[row.index()]);\n-479 }\n-480 if (verbosity_>0)\n-481 std::cout<<\" Preprocessing Dirichlet took \"<parallelInformation().coarsest()->copyOwnerToAll(x,x);\n-485 rhs_ = std::make_shared>(std::make_shared(b));\n-486 lhs_ = std::make_shared>(std::make_shared(x));\n-487 residual_ = std::make_shared>(std::make_shared\n-(x));\n-488 matrices_->coarsenVector(*rhs_);\n-489 matrices_->coarsenVector(*lhs_);\n-490 matrices_->coarsenVector(*residual_);\n-491\n-492 // The preconditioner might change x and b. So we have to\n-493 // copy the changes to the original vectors.\n-494 x = *lhs_->finest();\n-495 b = *rhs_->finest();\n-496 }\n-497 template\n-_\b4_\b9_\b8 std::size_t _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs()\n-499 {\n-500 return matrices_->levels();\n-501 }\n-502 template\n-_\b5_\b0_\b3 std::size_t _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs()\n-504 {\n-505 return matrices_->maxlevels();\n-506 }\n-507\n-509 template\n-_\b5_\b1_\b0 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n-511 {\n-512 LevelContext levelContext;\n-513 // Init all iterators for the current level\n-514 initIteratorsWithFineLevel(levelContext);\n-515\n-516 assert(v.two_norm()==0);\n-517\n-518 level=0;\n-519 if(matrices_->maxlevels()==1){\n-520 // The coarse solver might modify the d!\n-521 _\bR_\ba_\bn_\bg_\be b(d);\n-522 mgc(levelContext, v, b);\n-523 }else\n-524 mgc(levelContext, v, d);\n-525 if(postSteps_==0||matrices_->maxlevels()==1)\n-526 levelContext.pinfo->copyOwnerToAll(v, v);\n-527 }\n-528\n-529 template\n-530 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\bW_\bi_\bt_\bh_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl(LevelContext&\n-levelContext)\n-531 {\n-532 levelContext.matrix = matrices_->matrices().finest();\n-533 levelContext.pinfo = matrices_->parallelInformation().finest();\n-534 levelContext.redist =\n-535 matrices_->redistributeInformation().begin();\n-536 levelContext.aggregates = matrices_->aggregatesMaps().begin();\n-537 levelContext.lhs = lhs_->finest();\n-538 levelContext.residual = residual_->finest();\n-539 levelContext.rhs = rhs_->finest();\n-540 levelContext.level=0;\n-541 }\n-542\n-543 template\n-544 bool FastAMG\n-545 ::moveToCoarseLevel(LevelContext& levelContext)\n-546 {\n-547 bool processNextLevel=true;\n-548\n-549 if(levelContext.redist->isSetup()) {\n-550 throw \"bla\";\n-551 levelContext.redist->redistribute(static_cast\n-(*levelContext.residual),\n-552 levelContext.residual.getRedistributed());\n-553 processNextLevel = levelContext.residual.getRedistributed().size()>0;\n-554 if(processNextLevel) {\n-555 //restrict defect to coarse level right hand side.\n-556 ++levelContext.pinfo;\n-557 Transfer\n-558 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,\n-559 static_cast(levelContext.residual.getRedistributed()),\n-560 *levelContext.pinfo);\n-561 }\n-562 }else{\n-563 //restrict defect to coarse level right hand side.\n-564 ++levelContext.rhs;\n-565 ++levelContext.pinfo;\n-566 Transfer\n-567 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,\n-568 static_cast(*levelContext.residual), *levelContext.pinfo);\n-569 }\n-570\n-571 if(processNextLevel) {\n-572 // prepare coarse system\n-573 ++levelContext.residual;\n-574 ++levelContext.lhs;\n-575 ++levelContext.matrix;\n-576 ++levelContext.level;\n-577 ++levelContext.redist;\n-578\n-579 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_-\n->levels()maxlevels()) {\n-580 // next level is not the globally coarsest one\n-581 ++levelContext.aggregates;\n-582 }\n-583 // prepare the lhs on the next level\n-584 *levelContext.lhs=0;\n-585 *levelContext.residual=0;\n-586 }\n-587 return processNextLevel;\n-588 }\n-589\n-590 template\n-591 void FastAMG\n-592 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel,\n-Domain& x)\n-593 {\n-594 if(processNextLevel) {\n-595 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_-\n->levels()maxlevels()) {\n-596 // previous level is not the globally coarsest one\n-597 --levelContext.aggregates;\n-598 }\n-599 --levelContext.redist;\n-600 --levelContext.level;\n-601 //prolongate and add the correction (update is in coarse left hand side)\n-602 --levelContext.matrix;\n-603 --levelContext.residual;\n-604\n-605 }\n-606\n-607 typename Hierarchy::Iterator coarseLhs = levelContext.lhs--;\n-608 if(levelContext.redist->isSetup()) {\n-609\n-610 // Need to redistribute during prolongate\n-611 Transfer\n-612 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,\n-613 levelContext.lhs.getRedistributed(),\n-614 matrices_->getProlongationDampingFactor(),\n-615 *levelContext.pinfo, *levelContext.redist);\n-616 }else{\n-617 Transfer\n-618 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,\n-619 matrices_->getProlongationDampingFactor(), *levelContext.pinfo);\n-620\n-621 // printvector(std::cout, *lhs, \"prolongated coarse grid correction\",\n-\"lhs\", 10, 10, 10);\n-622 }\n-623\n-624\n-625 if(processNextLevel) {\n-626 --levelContext.rhs;\n-627 }\n-628\n-629 }\n-630\n-631\n-632 template\n-633 void FastAMG\n-634 ::presmooth(LevelContext& levelContext, Domain& x, const Range& b)\n-635 {\n-636 constexpr auto bl = blockLevel();\n-637 _\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b<_\bb_\bl_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(levelContext.matrix->getmat(),\n-638 x,\n-639 *levelContext.residual,\n-640 b);\n-641 }\n-642\n-643 template\n-644 void FastAMG\n-645 ::postsmooth(LevelContext& levelContext, Domain& x, const Range& b)\n-646 {\n-647 constexpr auto bl = blockLevel();\n-648 GaussSeidelPostsmoothDefect\n-649 ::apply(levelContext.matrix->getmat(), x, *levelContext.residual, b);\n-650 }\n-651\n-652\n-653 template\n-_\b6_\b5_\b4 bool _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br() const\n-655 {\n-656 return _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be;\n-657 }\n-658\n-659 template\n-660 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bm_\bg_\bc(LevelContext& levelContext, Domain& v, const\n-Range& b){\n-661\n-662 if(levelContext.matrix == matrices_->matrices().coarsest() && levels\n-()==maxlevels()) {\n-663 // Solve directly\n-664 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt res;\n-665 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd=true; // If we do not compute this flag will not get updated\n-666 if(levelContext.redist->isSetup()) {\n-667 levelContext.redist->redistribute(b, levelContext.rhs.getRedistributed());\n-668 if(levelContext.rhs.getRedistributed().size()>0) {\n-669 // We are still participating in the computation\n-670 levelContext.pinfo.getRedistributed().copyOwnerToAll\n-(levelContext.rhs.getRedistributed(),\n-671 levelContext.rhs.getRedistributed());\n-672 solver_->apply(levelContext.lhs.getRedistributed(),\n-levelContext.rhs.getRedistributed(), res);\n-673 }\n-674 levelContext.redist->redistributeBackward(v,\n-levelContext.lhs.getRedistributed());\n-675 levelContext.pinfo->copyOwnerToAll(v, v);\n-676 }else{\n-677 levelContext.pinfo->copyOwnerToAll(b, b);\n-678 solver_->apply(v, const_cast(b), res);\n-679 }\n-680\n-681 // printvector(std::cout, *lhs, \"coarse level update\", \"u\", 10, 10, 10);\n-682 // printvector(std::cout, *rhs, \"coarse level rhs\", \"rhs\", 10, 10, 10);\n-683 if (!res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd)\n-684 coarsesolverconverged = false;\n-685 }else{\n-686 // presmoothing\n-687 _\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh(levelContext, v, b);\n-688 // printvector(std::cout, *lhs, \"update\", \"u\", 10, 10, 10);\n-689 // printvector(std::cout, *residual, \"post presmooth residual\", \"r\", 10);\n-690#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION\n-691 bool processNextLevel = moveToCoarseLevel(levelContext);\n-692\n-693 if(processNextLevel) {\n-694 // next level\n-695 for(std::size_t i=0; imatrices().finest()) {\n-705 coarsesolverconverged = matrices_->parallelInformation().finest()-\n->communicator().prod(coarsesolverconverged);\n-706 if(!coarsesolverconverged)\n-707 DUNE_THROW(MathError, \"Coarse solver did not converge\");\n-708 }\n-709\n-710 _\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh(levelContext, v, b);\n-711 }\n-712 }\n-713\n-714\n-716 template\n-_\b7_\b1_\b7 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bp_\bo_\bs_\bt([[maybe_unused]] _\bD_\bo_\bm_\ba_\bi_\bn& x)\n-718 {\n-719 lhs_=nullptr;\n-720 rhs_=nullptr;\n-721 residual_=nullptr;\n-722 }\n-723\n-724 template\n-725 template\n-_\b7_\b2_\b6 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs(std::vector& cont)\n-727 {\n-728 matrices_->getCoarsestAggregatesOnFinest(cont);\n-729 }\n-730\n-731 } // end namespace Amg\n-732} // end namespace Dune\n-733\n-734#endif\n-_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh\n-Classes for using SuperLU with ISTL matrices.\n-_\bi_\bo_\b._\bh_\bh\n-Some generic functions for pretty printing vectors and matrices.\n-_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n-Define general preconditioner interface.\n-_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\n-Define base class for scalar product and norm.\n-_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh\n-Classes for using UMFPack with ISTL matrices.\n-_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n-Implementations of the inverse operator interface.\n-_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh\n-Prolongation and restriction for amg.\n-_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh\n-Provides a classes representing the hierarchies in AMG.\n-_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\n-Classes for the generic construction and application of the smoothers.\n-_\bf_\ba_\bs_\bt_\ba_\bm_\bg_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\n-_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n-Templates characterizing the type of a solver.\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+11\n+_\b1_\b2namespace Dune::ISTL::Impl\n+13{\n+27 template::size_type>\n+28 class BCCSMatrix\n+29 {\n+30 public:\n+31 using Index = I;\n+32 using size_type = std::size_t;\n+33\n+36 BCCSMatrix()\n+37 : N_(0), M_(0), Nnz_(0), values(0), rowindex(0), colstart(0)\n+38 {}\n+39\n+41 ~BCCSMatrix()\n+42 {\n+43 if(N_+M_+Nnz_!=0)\n+44 free();\n+45 }\n+46\n+48 void setSize(size_type rows, size_type columns)\n+49 {\n+50 N_ = rows;\n+51 M_ = columns;\n+52 }\n+53\n+58 size_type N() const\n+59 {\n+60 return N_;\n+61 }\n+62\n+64 size_type nonzeroes() const\n+65 {\n+66 return Nnz_;\n+67 }\n+68\n+73 size_type M() const\n+74 {\n+75 return M_;\n+76 }\n+77\n+84 B* getValues() const\n+85 {\n+86 return values;\n+87 }\n+88\n+95 Index* getRowIndex() const\n+96 {\n+97 return rowindex;\n+98 }\n+99\n+106 Index* getColStart() const\n+107 {\n+108 return colstart;\n+109 }\n+110\n+112 BCCSMatrix& operator=(const BCCSMatrix& _\bm_\ba_\bt)\n+113 {\n+114 if(N_+M_+Nnz_!=0)\n+115 free();\n+116 N_=_\bm_\ba_\bt.N_;\n+117 M_=_\bm_\ba_\bt.M_;\n+118 Nnz_= _\bm_\ba_\bt.Nnz_;\n+119 if(M_>0) {\n+120 colstart=new size_type[M_+1];\n+121 for(size_type i=0; i<=M_; ++i)\n+122 colstart[i]=_\bm_\ba_\bt.colstart[i];\n+123 }\n+124\n+125 if(Nnz_>0) {\n+126 values = new B[Nnz_];\n+127 rowindex = new size_type[Nnz_];\n+128\n+129 for(size_type i=0; i construct(Arguments &args)\n-Construct an object with the specified arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh\n-void postsmooth(LevelContext &levelContext, size_t steps)\n-Apply post smoothing on the current level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:428\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n-int iterations\n-The number of iterations to perform.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n-OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix\n-The iterator over the matrices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:207\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs\n-void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)\n-Get the aggregate number of each unknown on the coarsest level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:726\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bp_\bi_\bn_\bf_\bo\n-ParallelInformationHierarchy::Iterator pinfo\n-The iterator over the parallel information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-void recalculateHierarchy()\n-Recalculate the matrix hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:173\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bp_\bo_\bs_\bt\n-void post(Domain &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:717\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs\n-std::size_t maxlevels()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:503\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n-X Domain\n-The domain type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\br_\be_\bs_\bi_\bd_\bu_\ba_\bl\n-Hierarchy< Domain, A >::Iterator residual\n-The iterator over the residuals.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:227\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:146\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy\n-The operator hierarchy type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt\n-OperatorHierarchy::RedistributeInfoList::const_iterator redist\n-The iterator over the redistribution information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:215\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be\n-X Range\n-The range type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-PI ParallelInformation\n-The type of the parallel information. Either OwnerOverlapCommunication or\n-another type describing the...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-M Operator\n-The matrix operator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs\n-std::size_t levels()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:498\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG\n-FastAMG(const Operator &fineOperator, const C &criterion, const Parameters\n-&parms=Parameters(), bool symmetric=true, const ParallelInformation\n-&pinfo=ParallelInformation())\n-Construct an AMG with an inexact coarse solver based on the smoother.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br\n-InverseOperator< X, X > CoarseSolver\n-the type of the coarse solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n-bool usesDirectCoarseLevelSolver() const\n-Check whether the coarse solver used is a direct solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:654\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bl_\bh_\bs\n-Hierarchy< Domain, A >::Iterator lhs\n-The iterator over the left hand side.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:223\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\br_\bh_\bs\n-Hierarchy< Range, A >::Iterator rhs\n-The iterator over the right hand sided.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:231\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bl_\be_\bv_\be_\bl\n-std::size_t level\n-The level index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:235\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(Domain &v, const Range &d)\n-Apply one step of the preconditioner to the system A(v)=d.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:510\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy\n-The parallal data distribution hierarchy type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bp_\br_\be\n-void pre(Domain &x, Range &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:449\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG\n-FastAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const\n-Parameters &parms, bool symmetric=true)\n-Construct a new amg with a specific coarse solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:320\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs\n-OperatorHierarchy::AggregatesMapList::const_iterator aggregates\n-The iterator over the aggregates maps.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:219\n-_\bD_\bu_\bn_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:404\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-A generic dynamic dense matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< T >::field_type field_type\n-Export the type representing the underlying field.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:565\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::const_iterator ConstColIterator\n-Const iterator for the entries of each row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:589\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-T block_type\n-Export the type representing the components.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:568\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG\n-A fast (sequential) algebraic multigrid based on agglomeration that saves\n-memory bandwidth.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-static void apply(const M &A, X &x, Y &d, const Y &b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamgsmoother.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation\n-> Iterator\n-Type of the mutable iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator over the levels in the hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-The hierarchies build by the coarsening process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-All parameters for AMG.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-The default class for the smoother arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Base class for matrix free definition of preconditioners.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n-Sequential SSOR preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-Base class for scalar product and norm computation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-Statistics about the application of an inverse operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n-bool converged\n-True if convergence criterion has been met.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Abstract base class for all solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00128.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00128.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: graphcreator.hh File Reference\n+dune-istl: bvector.hh File Reference\n \n \n \n \n \n \n \n@@ -65,47 +65,71 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n-
    graphcreator.hh File Reference
    \n+Namespaces |\n+Functions
    \n+
    bvector.hh File Reference
    \n \n
    \n-
    #include <tuple>
    \n-#include "graph.hh"
    \n-#include "dependency.hh"
    \n-#include "pinfo.hh"
    \n-#include <dune/istl/operators.hh>
    \n-#include <dune/istl/bcrsmatrix.hh>
    \n+\n+

    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. \n+More...

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

    Go to the source code of this file.

    \n \n \n-\n+\n+\n \n-\n+\n \n

    \n Classes

    struct  Dune::Amg::PropertiesGraphCreator< M, PI >
    class  Dune::BlockVector< B, A >
     A vector of blocks with memory management. More...
     
    struct  Dune::Amg::PropertiesGraphCreator< M, SequentialInformation >
    struct  Dune::FieldTraits< BlockVector< B, A > >
     
    \n \n \n \n-\n-\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n+\n+\n+\n+\n+\n

    \n+Functions

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

    Detailed Description

    \n+

    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.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,28 +1,49 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-graphcreator.hh File Reference\n-#include \n-#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n-#include \"_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh\"\n-#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+bvector.hh File Reference\n+This file implements a vector space as a tensor product of a given vector\n+space. The number of components can be given at run-time. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+#include \"_\bb_\ba_\bs_\be_\ba_\br_\br_\ba_\by_\b._\bh_\bh\"\n+#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bP_\bI_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n+\u00a0 A vector of blocks with memory management. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &s, const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br< K, A >\n+ &v)\n+\u00a0 Send _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br to an output stream.\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+This file implements a vector space as a tensor product of a given vector\n+space. The number of components can be given at run-time.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00128_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00128_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: graphcreator.hh Source File\n+dune-istl: bvector.hh Source File\n \n \n \n \n \n \n \n@@ -70,156 +70,949 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    graphcreator.hh
    \n+
    bvector.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_GRAPHCREATOR_HH
    \n-
    6#define DUNE_AMG_GRAPHCREATOR_HH
    \n-
    7
    \n-
    8#include <tuple>
    \n-
    9
    \n-
    10#include "graph.hh"
    \n-
    11#include "dependency.hh"
    \n-
    12#include "pinfo.hh"
    \n-\n-\n-
    15
    \n-
    16namespace Dune
    \n-
    17{
    \n-
    18 namespace Amg
    \n-
    19 {
    \n-
    20 template<class M, class PI>
    \n-
    \n-\n-
    22 {
    \n-
    23 typedef typename M::matrix_type Matrix;
    \n-\n-\n-
    26 std::vector<bool> > SubGraph;
    \n-\n-\n-\n-
    30 IdentityMap,
    \n-\n-\n-
    33
    \n-
    34 typedef std::tuple<MatrixGraph*,PropertiesGraph*,SubGraph*> GraphTuple;
    \n-
    35
    \n-
    36 template<class OF, class T>
    \n-
    \n-
    37 static GraphTuple create(const M& matrix, T& excluded,
    \n-
    38 PI& pinfo, const OF& of)
    \n-
    39 {
    \n-
    40 MatrixGraph* mg = new MatrixGraph(matrix.getmat());
    \n-
    41 typedef typename PI::ParallelIndexSet ParallelIndexSet;
    \n-
    42 typedef typename ParallelIndexSet::const_iterator IndexIterator;
    \n-
    43 IndexIterator iend = pinfo.indexSet().end();
    \n-
    44
    \n-
    45 for(IndexIterator index = pinfo.indexSet().begin(); index != iend; ++index)
    \n-
    46 excluded[index->local()] = of.contains(index->local().attribute());
    \n-
    47
    \n-
    48 SubGraph* sg= new SubGraph(*mg, excluded);
    \n-
    49 PropertiesGraph* pg = new PropertiesGraph(*sg, IdentityMap(), sg->getEdgeIndexMap());
    \n-
    50 return GraphTuple(mg,pg,sg);
    \n-
    51 }
    \n-
    \n-
    52
    \n-
    \n-
    53 static void free(GraphTuple& graphs)
    \n-
    54 {
    \n-
    55 delete std::get<2>(graphs);
    \n-
    56 delete std::get<1>(graphs);
    \n-
    57 }
    \n-
    \n-
    58 };
    \n-
    \n-
    59
    \n-
    60 template<class M>
    \n-
    \n-\n-
    62 {
    \n-
    63 typedef typename M::matrix_type Matrix;
    \n+
    5
    \n+
    6#ifndef DUNE_ISTL_BVECTOR_HH
    \n+
    7#define DUNE_ISTL_BVECTOR_HH
    \n+
    8
    \n+
    9#include <algorithm>
    \n+
    10#include <cmath>
    \n+
    11#include <complex>
    \n+
    12#include <initializer_list>
    \n+
    13#include <limits>
    \n+
    14#include <memory>
    \n+
    15#include <utility>
    \n+
    16#include <vector>
    \n+
    17
    \n+
    18#include <dune/common/dotproduct.hh>
    \n+
    19#include <dune/common/ftraits.hh>
    \n+
    20#include <dune/common/fmatrix.hh>
    \n+
    21#include <dune/common/fvector.hh>
    \n+
    22#include <dune/common/promotiontraits.hh>
    \n+
    23#include <dune/common/typetraits.hh>
    \n+
    24#include <dune/common/scalarvectorview.hh>
    \n+
    25
    \n+\n+
    27
    \n+
    28#include "basearray.hh"
    \n+
    29#include "istlexception.hh"
    \n+
    30
    \n+
    38namespace Dune {
    \n+
    39
    \n+
    41namespace Imp {
    \n+
    42
    \n+
    48 template <class B, bool isNumber>
    \n+
    49 class BlockTraitsImp;
    \n+
    50
    \n+
    51 template <class B>
    \n+
    52 class BlockTraitsImp<B,true>
    \n+
    53 {
    \n+
    54 public:
    \n+
    55 using field_type = B;
    \n+
    56 };
    \n+
    57
    \n+
    58 template <class B>
    \n+
    59 class BlockTraitsImp<B,false>
    \n+
    60 {
    \n+
    61 public:
    \n+
    62 using field_type = typename B::field_type;
    \n+
    63 };
    \n
    64
    \n-\n-
    66
    \n-\n-\n-\n-
    70 IdentityMap,
    \n-
    71 IdentityMap> PropertiesGraph;
    \n-
    72
    \n-
    73 typedef std::tuple<MatrixGraph*,PropertiesGraph*> GraphTuple;
    \n-
    74
    \n-
    75 template<class OF, class T>
    \n-
    \n-
    76 static GraphTuple create([[maybe_unused]] const M& matrix,
    \n-
    77 [[maybe_unused]] T& excluded,
    \n-
    78 [[maybe_unused]] const SequentialInformation& pinfo,
    \n-
    79 const OF&)
    \n-
    80 {
    \n-
    81 MatrixGraph* mg = new MatrixGraph(matrix.getmat());
    \n-
    82 PropertiesGraph* pg = new PropertiesGraph(*mg, IdentityMap(), IdentityMap());
    \n-
    83 return GraphTuple(mg,pg);
    \n-
    84 }
    \n-
    \n-
    85
    \n-
    \n-
    86 static void free(GraphTuple& graphs)
    \n-
    87 {
    \n-
    88 delete std::get<1>(graphs);
    \n-
    89 }
    \n-
    \n+
    67 template <class B>
    \n+
    68 using BlockTraits = BlockTraitsImp<B,IsNumber<B>::value>;
    \n+
    69
    \n+
    83 template<class B, class ST=std::size_t >
    \n+
    84 class block_vector_unmanaged : public base_array_unmanaged<B,ST>
    \n+
    85 {
    \n+
    86 public:
    \n+
    87
    \n+
    88 //===== type definitions and constants
    \n+
    89 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n
    90
    \n-
    91 };
    \n-
    \n-
    92
    \n-
    93 } //namespace Amg
    \n-
    94} // namespace Dune
    \n-
    95#endif
    \n-
    Implementation of the BCRSMatrix class.
    \n-
    Provides classes for building the matrix graph.
    \n-\n-
    Provides classes for initializing the link attributes of a matrix graph.
    \n-
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n+
    92 typedef B block_type;
    \n+
    93
    \n+
    95 typedef ST size_type;
    \n+
    96
    \n+
    98 typedef typename base_array_unmanaged<B,ST>::iterator Iterator;
    \n+
    99
    \n+
    101 typedef typename base_array_unmanaged<B,ST>::const_iterator ConstIterator;
    \n+
    102
    \n+
    104 typedef B value_type;
    \n+
    105
    \n+
    107 typedef B& reference;
    \n+
    108
    \n+
    110 typedef const B& const_reference;
    \n+
    111
    \n+
    112 //===== assignment from scalar
    \n+
    114
    \n+
    115 block_vector_unmanaged& operator= (const field_type& k)
    \n+
    116 {
    \n+
    117 for (size_type i=0; i<this->n; i++)
    \n+
    118 (*this)[i] = k;
    \n+
    119 return *this;
    \n+
    120 }
    \n+
    121
    \n+
    122 //===== vector space arithmetic
    \n+
    124 block_vector_unmanaged& operator+= (const block_vector_unmanaged& y)
    \n+
    125 {
    \n+
    126#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    127 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n+
    128#endif
    \n+
    129 for (size_type i=0; i<this->n; ++i) (*this)[i] += y[i];
    \n+
    130 return *this;
    \n+
    131 }
    \n+
    132
    \n+
    134 block_vector_unmanaged& operator-= (const block_vector_unmanaged& y)
    \n+
    135 {
    \n+
    136#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    137 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n+
    138#endif
    \n+
    139 for (size_type i=0; i<this->n; ++i) (*this)[i] -= y[i];
    \n+
    140 return *this;
    \n+
    141 }
    \n+
    142
    \n+
    144 block_vector_unmanaged& operator*= (const field_type& k)
    \n+
    145 {
    \n+
    146 for (size_type i=0; i<this->n; ++i) (*this)[i] *= k;
    \n+
    147 return *this;
    \n+
    148 }
    \n+
    149
    \n+
    151 block_vector_unmanaged& operator/= (const field_type& k)
    \n+
    152 {
    \n+
    153 for (size_type i=0; i<this->n; ++i) (*this)[i] /= k;
    \n+
    154 return *this;
    \n+
    155 }
    \n+
    156
    \n+
    158 block_vector_unmanaged& axpy (const field_type& a, const block_vector_unmanaged& y)
    \n+
    159 {
    \n+
    160#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    161 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n+
    162#endif
    \n+
    163 for (size_type i=0; i<this->n; ++i)
    \n+
    164 Impl::asVector((*this)[i]).axpy(a,Impl::asVector(y[i]));
    \n+
    165
    \n+
    166 return *this;
    \n+
    167 }
    \n+
    168
    \n+
    169
    \n+
    177 template<class OtherB, class OtherST>
    \n+
    178 auto operator* (const block_vector_unmanaged<OtherB,OtherST>& y) const
    \n+
    179 {
    \n+
    180 typedef typename PromotionTraits<field_type,typename BlockTraits<OtherB>::field_type>::PromotedType PromotedType;
    \n+
    181 PromotedType sum(0);
    \n+
    182#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    183 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n+
    184#endif
    \n+
    185 for (size_type i=0; i<this->n; ++i) {
    \n+
    186 sum += PromotedType(((*this)[i])*y[i]);
    \n+
    187 }
    \n+
    188 return sum;
    \n+
    189 }
    \n+
    190
    \n+
    198 template<class OtherB, class OtherST>
    \n+
    199 auto dot(const block_vector_unmanaged<OtherB,OtherST>& y) const
    \n+
    200 {
    \n+
    201 typedef typename PromotionTraits<field_type,typename BlockTraits<OtherB>::field_type>::PromotedType PromotedType;
    \n+
    202 PromotedType sum(0);
    \n+
    203#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    204 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n+
    205#endif
    \n+
    206
    \n+
    207 for (size_type i=0; i<this->n; ++i)
    \n+
    208 sum += Impl::asVector((*this)[i]).dot(Impl::asVector(y[i]));
    \n+
    209
    \n+
    210 return sum;
    \n+
    211 }
    \n+
    212
    \n+
    213 //===== norms
    \n+
    214
    \n+
    216 typename FieldTraits<field_type>::real_type one_norm () const
    \n+
    217 {
    \n+
    218 typename FieldTraits<field_type>::real_type sum=0;
    \n+
    219 for (size_type i=0; i<this->n; ++i)
    \n+
    220 sum += Impl::asVector((*this)[i]).one_norm();
    \n+
    221 return sum;
    \n+
    222 }
    \n+
    223
    \n+
    225 typename FieldTraits<field_type>::real_type one_norm_real () const
    \n+
    226 {
    \n+
    227 typename FieldTraits<field_type>::real_type sum=0;
    \n+
    228 for (size_type i=0; i<this->n; ++i)
    \n+
    229 sum += Impl::asVector((*this)[i]).one_norm_real();
    \n+
    230 return sum;
    \n+
    231 }
    \n+
    232
    \n+
    234 typename FieldTraits<field_type>::real_type two_norm () const
    \n+
    235 {
    \n+
    236 using std::sqrt;
    \n+
    237 return sqrt(two_norm2());
    \n+
    238 }
    \n+
    239
    \n+
    241 typename FieldTraits<field_type>::real_type two_norm2 () const
    \n+
    242 {
    \n+
    243 typename FieldTraits<field_type>::real_type sum=0;
    \n+
    244 for (size_type i=0; i<this->n; ++i)
    \n+
    245 sum += Impl::asVector((*this)[i]).two_norm2();
    \n+
    246 return sum;
    \n+
    247 }
    \n+
    248
    \n+
    250 template <typename ft = field_type,
    \n+
    251 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n+
    252 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n+
    253 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    254 using std::max;
    \n+
    255
    \n+
    256 real_type norm = 0;
    \n+
    257 for (auto const &xi : *this) {
    \n+
    258 real_type const a = Impl::asVector(xi).infinity_norm();
    \n+
    259 norm = max(a, norm);
    \n+
    260 }
    \n+
    261 return norm;
    \n+
    262 }
    \n+
    263
    \n+
    265 template <typename ft = field_type,
    \n+
    266 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n+
    267 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n+
    268 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    269 using std::max;
    \n+
    270
    \n+
    271 real_type norm = 0;
    \n+
    272 for (auto const &xi : *this) {
    \n+
    273 real_type const a = Impl::asVector(xi).infinity_norm_real();
    \n+
    274 norm = max(a, norm);
    \n+
    275 }
    \n+
    276 return norm;
    \n+
    277 }
    \n+
    278
    \n+
    280 template <typename ft = field_type,
    \n+
    281 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n+
    282 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n+
    283 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    284 using std::max;
    \n+
    285 using std::abs;
    \n+
    286
    \n+
    287 real_type norm = 0;
    \n+
    288 real_type isNaN = 1;
    \n+
    289
    \n+
    290 for (auto const &xi : *this) {
    \n+
    291 real_type const a = Impl::asVector(xi).infinity_norm();
    \n+
    292 norm = max(a, norm);
    \n+
    293 isNaN += a;
    \n+
    294 }
    \n+
    295 return norm * (isNaN / isNaN);
    \n+
    296 }
    \n+
    297
    \n+
    299 template <typename ft = field_type,
    \n+
    300 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n+
    301 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n+
    302 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    303 using std::max;
    \n+
    304
    \n+
    305 real_type norm = 0;
    \n+
    306 real_type isNaN = 1;
    \n+
    307
    \n+
    308 for (auto const &xi : *this) {
    \n+
    309 real_type const a = Impl::asVector(xi).infinity_norm_real();
    \n+
    310 norm = max(a, norm);
    \n+
    311 isNaN += a;
    \n+
    312 }
    \n+
    313
    \n+
    314 return norm * (isNaN / isNaN);
    \n+
    315 }
    \n+
    316
    \n+
    317 //===== sizes
    \n+
    318
    \n+
    320 size_type N () const
    \n+
    321 {
    \n+
    322 return this->n;
    \n+
    323 }
    \n+
    324
    \n+
    326 size_type dim () const
    \n+
    327 {
    \n+
    328 size_type d=0;
    \n+
    329
    \n+
    330 for (size_type i=0; i<this->n; i++)
    \n+
    331 d += Impl::asVector((*this)[i]).dim();
    \n+
    332
    \n+
    333 return d;
    \n+
    334 }
    \n+
    335
    \n+
    336 protected:
    \n+
    338 block_vector_unmanaged () : base_array_unmanaged<B,ST>()
    \n+
    339 { }
    \n+
    340 };
    \n+
    341
    \n+
    343
    \n+
    348 template<class F>
    \n+
    349 class ScopeGuard {
    \n+
    350 F cleanupFunc_;
    \n+
    351 public:
    \n+
    352 ScopeGuard(F cleanupFunc) : cleanupFunc_(std::move(cleanupFunc)) {}
    \n+
    353 ScopeGuard(const ScopeGuard &) = delete;
    \n+
    354 ScopeGuard(ScopeGuard &&) = delete;
    \n+
    355 ScopeGuard &operator=(ScopeGuard) = delete;
    \n+
    356 ~ScopeGuard() { cleanupFunc_(); }
    \n+
    357 };
    \n+
    358
    \n+
    360
    \n+
    369 template<class F>
    \n+
    370 ScopeGuard<F> makeScopeGuard(F cleanupFunc)
    \n+
    371 {
    \n+
    372 return { std::move(cleanupFunc) };
    \n+
    373 }
    \n+
    374
    \n+
    375} // end namespace Imp
    \n+
    390 template<class B, class A=std::allocator<B> >
    \n+
    \n+
    391 class BlockVector : public Imp::block_vector_unmanaged<B,typename A::size_type>
    \n+
    392 {
    \n+
    393 public:
    \n+
    394
    \n+
    395 //===== type definitions and constants
    \n+
    396
    \n+
    398 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n+
    399
    \n+
    401 typedef B block_type;
    \n+
    402
    \n+
    404 typedef A allocator_type;
    \n+
    405
    \n+
    407 typedef typename A::size_type size_type;
    \n+
    408
    \n+
    410 typedef typename Imp::block_vector_unmanaged<B,size_type>::Iterator Iterator;
    \n+
    411
    \n+
    413 typedef typename Imp::block_vector_unmanaged<B,size_type>::ConstIterator ConstIterator;
    \n+
    414
    \n+
    415 //===== constructors and such
    \n+
    416
    \n+
    \n+\n+
    419 {
    \n+
    420 syncBaseArray();
    \n+
    421 }
    \n+
    \n+
    422
    \n+
    \n+
    424 explicit BlockVector (size_type _n) : storage_(_n)
    \n+
    425 {
    \n+
    426 syncBaseArray();
    \n+
    427 }
    \n+
    \n+
    428
    \n+
    \n+
    430 BlockVector (std::initializer_list<B> const &l) : storage_(l)
    \n+
    431 {
    \n+
    432 syncBaseArray();
    \n+
    433 }
    \n+
    \n+
    434
    \n+
    435
    \n+
    447 template<typename S>
    \n+
    \n+
    448 BlockVector (size_type _n, S _capacity)
    \n+
    449 {
    \n+
    450 static_assert(std::numeric_limits<S>::is_integer,
    \n+
    451 "capacity must be an unsigned integral type (be aware, that this constructor does not set the default value!)" );
    \n+
    452 if((size_type)_capacity > _n)
    \n+
    453 storage_.reserve(_capacity);
    \n+
    454 storage_.resize(_n);
    \n+
    455 syncBaseArray();
    \n+
    456 }
    \n+
    \n+
    457
    \n+
    458
    \n+
    \n+\n+
    469 {
    \n+
    470 [[maybe_unused]] const auto &guard =
    \n+
    471 Imp::makeScopeGuard([this]{ syncBaseArray(); });
    \n+
    472 storage_.reserve(capacity);
    \n+
    473 }
    \n+
    \n+
    474
    \n+
    \n+\n+
    482 {
    \n+
    483 return storage_.capacity();
    \n+
    484 }
    \n+
    \n+
    485
    \n+
    \n+
    496 void resize(size_type size)
    \n+
    497 {
    \n+
    498 [[maybe_unused]] const auto &guard =
    \n+
    499 Imp::makeScopeGuard([this]{ syncBaseArray(); });
    \n+
    500 storage_.resize(size);
    \n+
    501 }
    \n+
    \n+
    502
    \n+
    \n+\n+
    505 noexcept(noexcept(std::declval<BlockVector>().storage_ = a.storage_))
    \n+
    506 {
    \n+
    507 storage_ = a.storage_;
    \n+
    508 syncBaseArray();
    \n+
    509 }
    \n+
    \n+
    510
    \n+
    \n+\n+
    513 noexcept(noexcept(std::declval<BlockVector>().swap(a)))
    \n+
    514 {
    \n+
    515 swap(a);
    \n+
    516 }
    \n+
    \n+
    517
    \n+
    \n+\n+
    520 noexcept(noexcept(std::declval<BlockVector>().storage_ = a.storage_))
    \n+
    521 {
    \n+
    522 [[maybe_unused]] const auto &guard =
    \n+
    523 Imp::makeScopeGuard([this]{ syncBaseArray(); });
    \n+
    524 storage_ = a.storage_;
    \n+
    525 return *this;
    \n+
    526 }
    \n+
    \n+
    527
    \n+
    \n+\n+
    530 noexcept(noexcept(std::declval<BlockVector>().swap(a)))
    \n+
    531 {
    \n+
    532 swap(a);
    \n+
    533 return *this;
    \n+
    534 }
    \n+
    \n+
    535
    \n+
    \n+
    537 void swap(BlockVector &other)
    \n+
    538 noexcept(noexcept(
    \n+
    539 std::declval<BlockVector&>().storage_.swap(other.storage_)))
    \n+
    540 {
    \n+
    541 [[maybe_unused]] const auto &guard = Imp::makeScopeGuard([&]{
    \n+
    542 syncBaseArray();
    \n+
    543 other.syncBaseArray();
    \n+
    544 });
    \n+
    545 storage_.swap(other.storage_);
    \n+
    546 }
    \n+
    \n+
    547
    \n+
    \n+\n+
    550 {
    \n+
    551 // forward to operator= in base class
    \n+
    552 (static_cast<Imp::block_vector_unmanaged<B,size_type>&>(*this)) = k;
    \n+
    553 return *this;
    \n+
    554 }
    \n+
    \n+
    555
    \n+
    556 private:
    \n+
    557 void syncBaseArray() noexcept
    \n+
    558 {
    \n+
    559 this->p = storage_.data();
    \n+
    560 this->n = storage_.size();
    \n+
    561 }
    \n+
    562
    \n+
    563 std::vector<B, A> storage_;
    \n+
    564 };
    \n+
    \n+
    565
    \n+
    571 template<class B, class A>
    \n+
    \n+
    572 struct FieldTraits< BlockVector<B, A> >
    \n+
    573 {
    \n+
    574 typedef typename FieldTraits<B>::field_type field_type;
    \n+
    575 typedef typename FieldTraits<B>::real_type real_type;
    \n+
    576 };
    \n+
    \n+
    582 template<class K, class A>
    \n+
    \n+
    583 std::ostream& operator<< (std::ostream& s, const BlockVector<K, A>& v)
    \n+
    584 {
    \n+
    585 typedef typename BlockVector<K, A>::size_type size_type;
    \n+
    586
    \n+
    587 for (size_type i=0; i<v.size(); i++)
    \n+
    588 s << v[i] << std::endl;
    \n+
    589
    \n+
    590 return s;
    \n+
    591 }
    \n+
    \n+
    592
    \n+
    594namespace Imp {
    \n+
    595
    \n+
    614#ifndef DOXYGEN
    \n+
    615 template<class B, class A>
    \n+
    616#else
    \n+
    617 template<class B, class A=std::allocator<B> >
    \n+
    618#endif
    \n+
    619 class BlockVectorWindow : public Imp::block_vector_unmanaged<B,typename A::size_type>
    \n+
    620 {
    \n+
    621 public:
    \n+
    622
    \n+
    623 //===== type definitions and constants
    \n+
    624
    \n+
    626 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n+
    627
    \n+
    629 typedef B block_type;
    \n+
    630
    \n+
    632 typedef A allocator_type;
    \n+
    633
    \n+
    635 typedef typename A::size_type size_type;
    \n+
    636
    \n+
    638 typedef typename Imp::block_vector_unmanaged<B,size_type>::Iterator Iterator;
    \n+
    639
    \n+
    641 typedef typename Imp::block_vector_unmanaged<B,size_type>::ConstIterator ConstIterator;
    \n+
    642
    \n+
    643
    \n+
    644 //===== constructors and such
    \n+
    646 BlockVectorWindow () : Imp::block_vector_unmanaged<B,size_type>()
    \n+
    647 { }
    \n+
    648
    \n+
    650 BlockVectorWindow (B* _p, size_type _n)
    \n+
    651 {
    \n+
    652 this->n = _n;
    \n+
    653 this->p = _p;
    \n+
    654 }
    \n+
    655
    \n+
    657 BlockVectorWindow (const BlockVectorWindow& a)
    \n+
    658 {
    \n+
    659 this->n = a.n;
    \n+
    660 this->p = a.p;
    \n+
    661 }
    \n+
    662
    \n+
    664 BlockVectorWindow& operator= (const BlockVectorWindow& a)
    \n+
    665 {
    \n+
    666 // check correct size
    \n+
    667#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    668 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n+
    669#endif
    \n+
    670
    \n+
    671 if (&a!=this) // check if this and a are different objects
    \n+
    672 {
    \n+
    673 // copy data
    \n+
    674 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
    \n+
    675 }
    \n+
    676 return *this;
    \n+
    677 }
    \n+
    678
    \n+
    680 BlockVectorWindow& operator= (const field_type& k)
    \n+
    681 {
    \n+
    682 (static_cast<Imp::block_vector_unmanaged<B,size_type>&>(*this)) = k;
    \n+
    683 return *this;
    \n+
    684 }
    \n+
    685
    \n+
    687 operator BlockVector<B, A>() const {
    \n+
    688 auto bv = BlockVector<B, A>(this->n);
    \n+
    689
    \n+
    690 std::copy(this->begin(), this->end(), bv.begin());
    \n+
    691
    \n+
    692 return bv;
    \n+
    693 }
    \n+
    694
    \n+
    695 //===== window manipulation methods
    \n+
    696
    \n+
    698 void set (size_type _n, B* _p)
    \n+
    699 {
    \n+
    700 this->n = _n;
    \n+
    701 this->p = _p;
    \n+
    702 }
    \n+
    703
    \n+
    705 void setsize (size_type _n)
    \n+
    706 {
    \n+
    707 this->n = _n;
    \n+
    708 }
    \n+
    709
    \n+
    711 void setptr (B* _p)
    \n+
    712 {
    \n+
    713 this->p = _p;
    \n+
    714 }
    \n+
    715
    \n+
    717 B* getptr ()
    \n+
    718 {
    \n+
    719 return this->p;
    \n+
    720 }
    \n+
    721
    \n+
    723 size_type getsize () const
    \n+
    724 {
    \n+
    725 return this->n;
    \n+
    726 }
    \n+
    727 };
    \n+
    728
    \n+
    729
    \n+
    730
    \n+
    741 template<class B, class ST=std::size_t >
    \n+
    742 class compressed_block_vector_unmanaged : public compressed_base_array_unmanaged<B,ST>
    \n+
    743 {
    \n+
    744 public:
    \n+
    745
    \n+
    746 //===== type definitions and constants
    \n+
    747
    \n+
    749 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n+
    750
    \n+
    752 typedef B block_type;
    \n+
    753
    \n+
    755 typedef typename compressed_base_array_unmanaged<B,ST>::iterator Iterator;
    \n+
    756
    \n+
    758 typedef typename compressed_base_array_unmanaged<B,ST>::const_iterator ConstIterator;
    \n+
    759
    \n+
    761 typedef ST size_type;
    \n+
    762
    \n+
    763 //===== assignment from scalar
    \n+
    764
    \n+
    765 compressed_block_vector_unmanaged& operator= (const field_type& k)
    \n+
    766 {
    \n+
    767 for (size_type i=0; i<this->n; i++)
    \n+
    768 (this->p)[i] = k;
    \n+
    769 return *this;
    \n+
    770 }
    \n+
    771
    \n+
    772
    \n+
    773 //===== vector space arithmetic
    \n+
    774
    \n+
    776 template<class V>
    \n+
    777 compressed_block_vector_unmanaged& operator+= (const V& y)
    \n+
    778 {
    \n+
    779#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    780 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
    \n+
    781#endif
    \n+
    782 for (size_type i=0; i<y.n; ++i) this->operator[](y.j[i]) += y.p[i];
    \n+
    783 return *this;
    \n+
    784 }
    \n+
    785
    \n+
    787 template<class V>
    \n+
    788 compressed_block_vector_unmanaged& operator-= (const V& y)
    \n+
    789 {
    \n+
    790#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    791 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
    \n+
    792#endif
    \n+
    793 for (size_type i=0; i<y.n; ++i) this->operator[](y.j[i]) -= y.p[i];
    \n+
    794 return *this;
    \n+
    795 }
    \n+
    796
    \n+
    798 template<class V>
    \n+
    799 compressed_block_vector_unmanaged& axpy (const field_type& a, const V& y)
    \n+
    800 {
    \n+
    801#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    802 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
    \n+
    803#endif
    \n+
    804 for (size_type i=0; i<y.n; ++i)
    \n+
    805 Impl::asVector((*this)[y.j[i]]).axpy(a,Impl::asVector(y.p[i]));
    \n+
    806 return *this;
    \n+
    807 }
    \n+
    808
    \n+
    810 compressed_block_vector_unmanaged& operator*= (const field_type& k)
    \n+
    811 {
    \n+
    812 for (size_type i=0; i<this->n; ++i) (this->p)[i] *= k;
    \n+
    813 return *this;
    \n+
    814 }
    \n+
    815
    \n+
    817 compressed_block_vector_unmanaged& operator/= (const field_type& k)
    \n+
    818 {
    \n+
    819 for (size_type i=0; i<this->n; ++i) (this->p)[i] /= k;
    \n+
    820 return *this;
    \n+
    821 }
    \n+
    822
    \n+
    823
    \n+
    824 //===== Euclidean scalar product
    \n+
    825
    \n+
    827 field_type operator* (const compressed_block_vector_unmanaged& y) const
    \n+
    828 {
    \n+
    829#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    830 if (!includesindexset(y) || !y.includesindexset(*this) )
    \n+
    831 DUNE_THROW(ISTLError,"index set mismatch");
    \n+
    832#endif
    \n+
    833 field_type sum=0;
    \n+
    834 for (size_type i=0; i<this->n; ++i)
    \n+
    835 sum += (this->p)[i] * y[(this->j)[i]];
    \n+
    836 return sum;
    \n+
    837 }
    \n+
    838
    \n+
    839
    \n+
    840 //===== norms
    \n+
    841
    \n+
    843 typename FieldTraits<field_type>::real_type one_norm () const
    \n+
    844 {
    \n+
    845 typename FieldTraits<field_type>::real_type sum=0;
    \n+
    846 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].one_norm();
    \n+
    847 return sum;
    \n+
    848 }
    \n+
    849
    \n+
    851 typename FieldTraits<field_type>::real_type one_norm_real () const
    \n+
    852 {
    \n+
    853 typename FieldTraits<field_type>::real_type sum=0;
    \n+
    854 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].one_norm_real();
    \n+
    855 return sum;
    \n+
    856 }
    \n+
    857
    \n+
    859 typename FieldTraits<field_type>::real_type two_norm () const
    \n+
    860 {
    \n+
    861 using std::sqrt;
    \n+
    862 typename FieldTraits<field_type>::real_type sum=0;
    \n+
    863 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].two_norm2();
    \n+
    864 return sqrt(sum);
    \n+
    865 }
    \n+
    866
    \n+
    868 typename FieldTraits<field_type>::real_type two_norm2 () const
    \n+
    869 {
    \n+
    870 typename FieldTraits<field_type>::real_type sum=0;
    \n+
    871 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].two_norm2();
    \n+
    872 return sum;
    \n+
    873 }
    \n+
    874
    \n+
    876 template <typename ft = field_type,
    \n+
    877 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n+
    878 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n+
    879 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    880 using std::max;
    \n+
    881
    \n+
    882 real_type norm = 0;
    \n+
    883 for (auto const &x : *this) {
    \n+
    884 real_type const a = x.infinity_norm();
    \n+
    885 norm = max(a, norm);
    \n+
    886 }
    \n+
    887 return norm;
    \n+
    888 }
    \n+
    889
    \n+
    891 template <typename ft = field_type,
    \n+
    892 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n+
    893 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n+
    894 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    895 using std::max;
    \n+
    896
    \n+
    897 real_type norm = 0;
    \n+
    898 for (auto const &x : *this) {
    \n+
    899 real_type const a = x.infinity_norm_real();
    \n+
    900 norm = max(a, norm);
    \n+
    901 }
    \n+
    902 return norm;
    \n+
    903 }
    \n+
    904
    \n+
    906 template <typename ft = field_type,
    \n+
    907 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n+
    908 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n+
    909 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    910 using std::max;
    \n+
    911
    \n+
    912 real_type norm = 0;
    \n+
    913 real_type isNaN = 1;
    \n+
    914 for (auto const &x : *this) {
    \n+
    915 real_type const a = x.infinity_norm();
    \n+
    916 norm = max(a, norm);
    \n+
    917 isNaN += a;
    \n+
    918 }
    \n+
    919 return norm * (isNaN / isNaN);
    \n+
    920 }
    \n+
    921
    \n+
    923 template <typename ft = field_type,
    \n+
    924 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n+
    925 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n+
    926 using real_type = typename FieldTraits<ft>::real_type;
    \n+
    927 using std::max;
    \n+
    928
    \n+
    929 real_type norm = 0;
    \n+
    930 real_type isNaN = 1;
    \n+
    931 for (auto const &x : *this) {
    \n+
    932 real_type const a = x.infinity_norm_real();
    \n+
    933 norm = max(a, norm);
    \n+
    934 isNaN += a;
    \n+
    935 }
    \n+
    936 return norm * (isNaN / isNaN);
    \n+
    937 }
    \n+
    938
    \n+
    939 //===== sizes
    \n+
    940
    \n+
    942 size_type N () const
    \n+
    943 {
    \n+
    944 return this->n;
    \n+
    945 }
    \n+
    946
    \n+
    948 size_type dim () const
    \n+
    949 {
    \n+
    950 size_type d=0;
    \n+
    951 for (size_type i=0; i<this->n; i++)
    \n+
    952 d += (this->p)[i].dim();
    \n+
    953 return d;
    \n+
    954 }
    \n+
    955
    \n+
    956 protected:
    \n+
    958 compressed_block_vector_unmanaged () : compressed_base_array_unmanaged<B,ST>()
    \n+
    959 { }
    \n+
    960
    \n+
    962 template<class V>
    \n+
    963 bool includesindexset (const V& y)
    \n+
    964 {
    \n+
    965 typename V::ConstIterator e=this->end();
    \n+
    966 for (size_type i=0; i<y.n; i++)
    \n+
    967 if (this->find(y.j[i])==e)
    \n+
    968 return false;
    \n+
    969 return true;
    \n+
    970 }
    \n+
    971 };
    \n+
    972
    \n+
    973
    \n+
    992 template<class B, class ST=std::size_t >
    \n+
    993 class CompressedBlockVectorWindow : public compressed_block_vector_unmanaged<B,ST>
    \n+
    994 {
    \n+
    995 public:
    \n+
    996
    \n+
    997 //===== type definitions and constants
    \n+
    998
    \n+
    1000 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n+
    1001
    \n+
    1003 typedef B block_type;
    \n+
    1004
    \n+
    1006 typedef ST size_type;
    \n+
    1007
    \n+
    1009 typedef typename compressed_block_vector_unmanaged<B,ST>::Iterator Iterator;
    \n+
    1010
    \n+
    1012 typedef typename compressed_block_vector_unmanaged<B,ST>::ConstIterator ConstIterator;
    \n+
    1013
    \n+
    1014
    \n+
    1015 //===== constructors and such
    \n+
    1017 CompressedBlockVectorWindow () : compressed_block_vector_unmanaged<B,ST>()
    \n+
    1018 { }
    \n+
    1019
    \n+
    1021 CompressedBlockVectorWindow (B* _p, size_type* _j, size_type _n)
    \n+
    1022 {
    \n+
    1023 this->n = _n;
    \n+
    1024 this->p = _p;
    \n+
    1025 this->j = _j;
    \n+
    1026 }
    \n+
    1027
    \n+
    1029 CompressedBlockVectorWindow (const CompressedBlockVectorWindow& a)
    \n+
    1030 {
    \n+
    1031 this->n = a.n;
    \n+
    1032 this->p = a.p;
    \n+
    1033 this->j = a.j;
    \n+
    1034 }
    \n+
    1035
    \n+
    1037 CompressedBlockVectorWindow& operator= (const CompressedBlockVectorWindow& a)
    \n+
    1038 {
    \n+
    1039 // check correct size
    \n+
    1040#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    1041 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n+
    1042#endif
    \n+
    1043
    \n+
    1044 if (&a!=this) // check if this and a are different objects
    \n+
    1045 {
    \n+
    1046 // copy data
    \n+
    1047 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
    \n+
    1048 for (size_type i=0; i<this->n; i++) this->j[i]=a.j[i];
    \n+
    1049 }
    \n+
    1050 return *this;
    \n+
    1051 }
    \n+
    1052
    \n+
    1054 CompressedBlockVectorWindow& operator= (const field_type& k)
    \n+
    1055 {
    \n+
    1056 (static_cast<compressed_block_vector_unmanaged<B,ST>&>(*this)) = k;
    \n+
    1057 return *this;
    \n+
    1058 }
    \n+
    1059
    \n+
    1060
    \n+
    1061 //===== window manipulation methods
    \n+
    1062
    \n+
    1064 void set (size_type _n, B* _p, size_type* _j)
    \n+
    1065 {
    \n+
    1066 this->n = _n;
    \n+
    1067 this->p = _p;
    \n+
    1068 this->j = _j;
    \n+
    1069 }
    \n+
    1070
    \n+
    1072 void setsize (size_type _n)
    \n+
    1073 {
    \n+
    1074 this->n = _n;
    \n+
    1075 }
    \n+
    1076
    \n+
    1078 void setptr (B* _p)
    \n+
    1079 {
    \n+
    1080 this->p = _p;
    \n+
    1081 }
    \n+
    1082
    \n+
    1084 void setindexptr (size_type* _j)
    \n+
    1085 {
    \n+
    1086 this->j = _j;
    \n+
    1087 }
    \n+
    1088
    \n+
    1090 B* getptr ()
    \n+
    1091 {
    \n+
    1092 return this->p;
    \n+
    1093 }
    \n+
    1094
    \n+
    1096 size_type* getindexptr ()
    \n+
    1097 {
    \n+
    1098 return this->j;
    \n+
    1099 }
    \n+
    1100
    \n+
    1102 const B* getptr () const
    \n+
    1103 {
    \n+
    1104 return this->p;
    \n+
    1105 }
    \n+
    1106
    \n+
    1108 const size_type* getindexptr () const
    \n+
    1109 {
    \n+
    1110 return this->j;
    \n+
    1111 }
    \n+
    1113 size_type getsize () const
    \n+
    1114 {
    \n+
    1115 return this->n;
    \n+
    1116 }
    \n+
    1117 };
    \n+
    1118
    \n+
    1119} // end namespace 'Imp'
    \n+
    1120
    \n+
    1121
    \n+
    1123 template<typename B, typename A>
    \n+
    1124 struct AutonomousValueType<Imp::BlockVectorWindow<B,A>>
    \n+
    1125 {
    \n+
    1126 using type = BlockVector<B, A>;
    \n+
    1127 };
    \n+
    1128
    \n+
    1129
    \n+
    1130} // end namespace 'Dune'
    \n+
    1131
    \n+
    1132#endif
    \n+\n+
    Implements several basic array containers.
    \n+
    Helper functions for determining the vector/matrix block level.
    \n+
    STL namespace.
    \n
    Definition allocator.hh:11
    \n-
    Class representing the properties of an edge in the matrix graph.
    Definition dependency.hh:39
    \n-
    Class representing a node in the matrix graph.
    Definition dependency.hh:126
    \n-
    The (undirected) graph of a matrix.
    Definition graph.hh:51
    \n-
    A subgraph of a graph.
    Definition graph.hh:443
    \n-
    EdgeIndexMap getEdgeIndexMap()
    Get an edge index map for the graph.
    \n-
    An index map for mapping the edges to indices.
    Definition graph.hh:470
    \n-
    Attaches properties to the edges and vertices of a graph.
    Definition graph.hh:978
    \n-
    Definition graphcreator.hh:22
    \n-
    Dune::Amg::SubGraph< MatrixGraph, std::vector< bool > > SubGraph
    Definition graphcreator.hh:26
    \n-
    Dune::Amg::PropertiesGraph< SubGraph, VertexProperties, EdgeProperties, IdentityMap, typename SubGraph::EdgeIndexMap > PropertiesGraph
    Definition graphcreator.hh:32
    \n-
    M::matrix_type Matrix
    Definition graphcreator.hh:23
    \n-
    static GraphTuple create(const M &matrix, T &excluded, PI &pinfo, const OF &of)
    Definition graphcreator.hh:37
    \n-
    static void free(GraphTuple &graphs)
    Definition graphcreator.hh:53
    \n-
    Dune::Amg::MatrixGraph< const Matrix > MatrixGraph
    Definition graphcreator.hh:24
    \n-
    std::tuple< MatrixGraph *, PropertiesGraph *, SubGraph * > GraphTuple
    Definition graphcreator.hh:34
    \n-
    Dune::Amg::MatrixGraph< const Matrix > MatrixGraph
    Definition graphcreator.hh:65
    \n-
    M::matrix_type Matrix
    Definition graphcreator.hh:63
    \n-
    Dune::Amg::PropertiesGraph< MatrixGraph, VertexProperties, EdgeProperties, IdentityMap, IdentityMap > PropertiesGraph
    Definition graphcreator.hh:71
    \n-
    std::tuple< MatrixGraph *, PropertiesGraph * > GraphTuple
    Definition graphcreator.hh:73
    \n-
    static GraphTuple create(const M &matrix, T &excluded, const SequentialInformation &pinfo, const OF &)
    Definition graphcreator.hh:76
    \n-
    static void free(GraphTuple &graphs)
    Definition graphcreator.hh:86
    \n-
    Definition pinfo.hh:28
    \n+
    std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
    Send BlockVector to an output stream.
    Definition bvector.hh:583
    \n+
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n+
    BlockVector()
    makes empty vector
    Definition bvector.hh:418
    \n+
    Imp::block_vector_unmanaged< B, size_type >::ConstIterator ConstIterator
    make iterators available as types
    Definition bvector.hh:413
    \n+
    void reserve(size_type capacity)
    Reserve space.
    Definition bvector.hh:468
    \n+
    BlockVector(BlockVector &&a) noexcept(noexcept(std::declval< BlockVector >().swap(a)))
    move constructor
    Definition bvector.hh:512
    \n+
    BlockVector(size_type _n)
    make vector with _n components
    Definition bvector.hh:424
    \n+
    void resize(size_type size)
    Resize the vector.
    Definition bvector.hh:496
    \n+
    Imp::block_vector_unmanaged< B, size_type >::Iterator Iterator
    make iterators available as types
    Definition bvector.hh:410
    \n+
    BlockVector(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector >().storage_=a.storage_))
    copy constructor
    Definition bvector.hh:504
    \n+
    A allocator_type
    export the allocator type
    Definition bvector.hh:404
    \n+
    BlockVector & operator=(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector >().storage_=a.storage_))
    assignment
    Definition bvector.hh:519
    \n+
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bvector.hh:398
    \n+
    A::size_type size_type
    The type for the index access.
    Definition bvector.hh:407
    \n+
    BlockVector(std::initializer_list< B > const &l)
    Construct from a std::initializer_list.
    Definition bvector.hh:430
    \n+
    size_type capacity() const
    Get the capacity of the vector.
    Definition bvector.hh:481
    \n+
    BlockVector(size_type _n, S _capacity)
    Make vector with _n components but preallocating capacity components.
    Definition bvector.hh:448
    \n+
    B block_type
    export the type representing the components
    Definition bvector.hh:401
    \n+
    void swap(BlockVector &other) noexcept(noexcept(std::declval< BlockVector & >().storage_.swap(other.storage_)))
    swap operation
    Definition bvector.hh:537
    \n+
    FieldTraits< B >::real_type real_type
    Definition bvector.hh:575
    \n+
    FieldTraits< B >::field_type field_type
    Definition bvector.hh:574
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,188 +1,992 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-graphcreator.hh\n+bvector.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_GRAPHCREATOR_HH\n-6#define DUNE_AMG_GRAPHCREATOR_HH\n-7\n-8#include \n-9\n-10#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n-11#include \"_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh\"\n-12#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n-13#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-15\n-16namespace _\bD_\bu_\bn_\be\n-17{\n-18 namespace Amg\n-19 {\n-20 template\n-_\b2_\b1 struct _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br\n-22 {\n-_\b2_\b3 typedef typename M::matrix_type _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b2_\b4 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\ba_\bt_\br_\bi_\bx_\b> _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh;\n-25 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh,\n-_\b2_\b6 std::vector > _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh;\n-27 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh<_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh,\n-28 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n-29 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n-30 IdentityMap,\n-31 typename _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp>\n-_\b3_\b2 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh;\n-33\n-_\b3_\b4 typedef std::tuple _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be;\n-35\n-36 template\n-_\b3_\b7 static _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be _\bc_\br_\be_\ba_\bt_\be(const M& matrix, T& excluded,\n-38 PI& pinfo, const OF& of)\n-39 {\n-40 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh* mg = new _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh(matrix.getmat());\n-41 typedef typename PI::ParallelIndexSet ParallelIndexSet;\n-42 typedef typename ParallelIndexSet::const_iterator IndexIterator;\n-43 IndexIterator iend = pinfo.indexSet().end();\n-44\n-45 for(IndexIterator index = pinfo.indexSet().begin(); index != iend; ++index)\n-46 excluded[index->local()] = of.contains(index->local().attribute());\n-47\n-48 _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh* sg= new _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh(*mg, excluded);\n-49 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh* pg = new _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(*sg, IdentityMap(), sg-\n->_\bg_\be_\bt_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp());\n-50 return _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be(mg,pg,sg);\n-51 }\n-52\n-_\b5_\b3 static void _\bf_\br_\be_\be(_\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be& graphs)\n-54 {\n-55 delete std::get<2>(graphs);\n-56 delete std::get<1>(graphs);\n-57 }\n-58 };\n-59\n-60 template\n-_\b6_\b1 struct _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br\n-62 {\n-_\b6_\b3 typedef typename M::matrix_type _\bM_\ba_\bt_\br_\bi_\bx;\n+5\n+6#ifndef DUNE_ISTL_BVECTOR_HH\n+7#define DUNE_ISTL_BVECTOR_HH\n+8\n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \n+17\n+18#include \n+19#include \n+20#include \n+21#include \n+22#include \n+23#include \n+24#include \n+25\n+26#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+27\n+28#include \"_\bb_\ba_\bs_\be_\ba_\br_\br_\ba_\by_\b._\bh_\bh\"\n+29#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+30\n+38namespace _\bD_\bu_\bn_\be {\n+39\n+41namespace Imp {\n+42\n+48 template \n+49 class BlockTraitsImp;\n+50\n+51 template \n+52 class BlockTraitsImp\n+53 {\n+54 public:\n+55 using field_type = B;\n+56 };\n+57\n+58 template \n+59 class BlockTraitsImp\n+60 {\n+61 public:\n+62 using field_type = typename B::field_type;\n+63 };\n 64\n-_\b6_\b5 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\ba_\bt_\br_\bi_\bx_\b> _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh;\n-66\n-67 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh,\n-68 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n-69 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n-70 IdentityMap,\n-_\b7_\b1 IdentityMap> _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh;\n-72\n-_\b7_\b3 typedef std::tuple _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be;\n-74\n-75 template\n-_\b7_\b6 static _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be _\bc_\br_\be_\ba_\bt_\be([[maybe_unused]] const M& matrix,\n-77 [[maybe_unused]] T& excluded,\n-78 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n-79 const OF&)\n-80 {\n-81 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh* mg = new _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh(matrix.getmat());\n-82 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh* pg = new _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(*mg, IdentityMap(), IdentityMap\n-());\n-83 return _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be(mg,pg);\n-84 }\n-85\n-_\b8_\b6 static void _\bf_\br_\be_\be(_\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be& graphs)\n-87 {\n-88 delete std::get<1>(graphs);\n-89 }\n+67 template \n+68 using BlockTraits = BlockTraitsImp::value>;\n+69\n+83 template\n+84 class block_vector_unmanaged : public base_array_unmanaged\n+85 {\n+86 public:\n+87\n+88 //===== type definitions and constants\n+89 using field_type = typename Imp::BlockTraits::field_type;\n 90\n-91 };\n-92\n-93 } //namespace Amg\n-94} // namespace Dune\n-95#endif\n-_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implementation of the BCRSMatrix class.\n-_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\n-Provides classes for building the matrix graph.\n-_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n-_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh\n-Provides classes for initializing the link attributes of a matrix graph.\n-_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n-Define general, extensible interface for operators. The available\n-implementation wraps a matrix.\n+92 typedef B block_type;\n+93\n+95 typedef ST size_type;\n+96\n+98 typedef typename base_array_unmanaged::iterator Iterator;\n+99\n+101 typedef typename base_array_unmanaged::const_iterator ConstIterator;\n+102\n+104 typedef B value_type;\n+105\n+107 typedef B& reference;\n+108\n+110 typedef const B& const_reference;\n+111\n+112 //===== assignment from scalar\n+114\n+115 block_vector_unmanaged& operator= (const field_type& k)\n+116 {\n+117 for (size_type i=0; in; i++)\n+118 (*this)[i] = k;\n+119 return *this;\n+120 }\n+121\n+122 //===== vector space arithmetic\n+124 block_vector_unmanaged& operator+= (const block_vector_unmanaged& y)\n+125 {\n+126#ifdef DUNE_ISTL_WITH_CHECKING\n+127 if (this->n!=y.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n+128#endif\n+129 for (size_type i=0; in; ++i) (*this)[i] += y[i];\n+130 return *this;\n+131 }\n+132\n+134 block_vector_unmanaged& operator-= (const block_vector_unmanaged& y)\n+135 {\n+136#ifdef DUNE_ISTL_WITH_CHECKING\n+137 if (this->n!=y.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n+138#endif\n+139 for (size_type i=0; in; ++i) (*this)[i] -= y[i];\n+140 return *this;\n+141 }\n+142\n+144 block_vector_unmanaged& operator*= (const field_type& k)\n+145 {\n+146 for (size_type i=0; in; ++i) (*this)[i] *= k;\n+147 return *this;\n+148 }\n+149\n+151 block_vector_unmanaged& operator/= (const field_type& k)\n+152 {\n+153 for (size_type i=0; in; ++i) (*this)[i] /= k;\n+154 return *this;\n+155 }\n+156\n+158 block_vector_unmanaged& axpy (const field_type& a, const\n+block_vector_unmanaged& y)\n+159 {\n+160#ifdef DUNE_ISTL_WITH_CHECKING\n+161 if (this->n!=y.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n+162#endif\n+163 for (size_type i=0; in; ++i)\n+164 Impl::asVector((*this)[i]).axpy(a,Impl::asVector(y[i]));\n+165\n+166 return *this;\n+167 }\n+168\n+169\n+177 template\n+178 auto operator* (const block_vector_unmanaged& y) const\n+179 {\n+180 typedef typename PromotionTraits::\n+field_type>::PromotedType PromotedType;\n+181 PromotedType sum(0);\n+182#ifdef DUNE_ISTL_WITH_CHECKING\n+183 if (this->n!=y.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n+184#endif\n+185 for (size_type i=0; in; ++i) {\n+186 sum += PromotedType(((*this)[i])*y[i]);\n+187 }\n+188 return sum;\n+189 }\n+190\n+198 template\n+199 auto dot(const block_vector_unmanaged& y) const\n+200 {\n+201 typedef typename PromotionTraits::\n+field_type>::PromotedType PromotedType;\n+202 PromotedType sum(0);\n+203#ifdef DUNE_ISTL_WITH_CHECKING\n+204 if (this->n!=y.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n+205#endif\n+206\n+207 for (size_type i=0; in; ++i)\n+208 sum += Impl::asVector((*this)[i]).dot(Impl::asVector(y[i]));\n+209\n+210 return sum;\n+211 }\n+212\n+213 //===== norms\n+214\n+216 typename FieldTraits::real_type one_norm () const\n+217 {\n+218 typename FieldTraits::real_type sum=0;\n+219 for (size_type i=0; in; ++i)\n+220 sum += Impl::asVector((*this)[i]).one_norm();\n+221 return sum;\n+222 }\n+223\n+225 typename FieldTraits::real_type one_norm_real () const\n+226 {\n+227 typename FieldTraits::real_type sum=0;\n+228 for (size_type i=0; in; ++i)\n+229 sum += Impl::asVector((*this)[i]).one_norm_real();\n+230 return sum;\n+231 }\n+232\n+234 typename FieldTraits::real_type two_norm () const\n+235 {\n+236 using std::sqrt;\n+237 return sqrt(two_norm2());\n+238 }\n+239\n+241 typename FieldTraits::real_type two_norm2 () const\n+242 {\n+243 typename FieldTraits::real_type sum=0;\n+244 for (size_type i=0; in; ++i)\n+245 sum += Impl::asVector((*this)[i]).two_norm2();\n+246 return sum;\n+247 }\n+248\n+250 template ::value, int>::type = 0>\n+252 typename FieldTraits::real_type infinity_norm() const {\n+253 using real_type = typename FieldTraits::real_type;\n+254 using std::max;\n+255\n+256 real_type norm = 0;\n+257 for (auto const &xi : *this) {\n+258 real_type const a = Impl::asVector(xi).infinity_norm();\n+259 norm = max(a, norm);\n+260 }\n+261 return norm;\n+262 }\n+263\n+265 template ::value, int>::type = 0>\n+267 typename FieldTraits::real_type infinity_norm_real() const {\n+268 using real_type = typename FieldTraits::real_type;\n+269 using std::max;\n+270\n+271 real_type norm = 0;\n+272 for (auto const &xi : *this) {\n+273 real_type const a = Impl::asVector(xi).infinity_norm_real();\n+274 norm = max(a, norm);\n+275 }\n+276 return norm;\n+277 }\n+278\n+280 template ::value, int>::type = 0>\n+282 typename FieldTraits::real_type infinity_norm() const {\n+283 using real_type = typename FieldTraits::real_type;\n+284 using std::max;\n+285 using std::abs;\n+286\n+287 real_type norm = 0;\n+288 real_type isNaN = 1;\n+289\n+290 for (auto const &xi : *this) {\n+291 real_type const a = Impl::asVector(xi).infinity_norm();\n+292 norm = max(a, norm);\n+293 isNaN += a;\n+294 }\n+295 return norm * (isNaN / isNaN);\n+296 }\n+297\n+299 template ::value, int>::type = 0>\n+301 typename FieldTraits::real_type infinity_norm_real() const {\n+302 using real_type = typename FieldTraits::real_type;\n+303 using std::max;\n+304\n+305 real_type norm = 0;\n+306 real_type isNaN = 1;\n+307\n+308 for (auto const &xi : *this) {\n+309 real_type const a = Impl::asVector(xi).infinity_norm_real();\n+310 norm = max(a, norm);\n+311 isNaN += a;\n+312 }\n+313\n+314 return norm * (isNaN / isNaN);\n+315 }\n+316\n+317 //===== sizes\n+318\n+320 size_type N () const\n+321 {\n+322 return this->n;\n+323 }\n+324\n+326 size_type dim () const\n+327 {\n+328 size_type d=0;\n+329\n+330 for (size_type i=0; in; i++)\n+331 d += Impl::asVector((*this)[i]).dim();\n+332\n+333 return d;\n+334 }\n+335\n+336 protected:\n+338 block_vector_unmanaged () : base_array_unmanaged()\n+339 { }\n+340 };\n+341\n+343\n+348 template\n+349 class ScopeGuard {\n+350 F cleanupFunc_;\n+351 public:\n+352 ScopeGuard(F cleanupFunc) : cleanupFunc_(_\bs_\bt_\bd::move(cleanupFunc)) {}\n+353 ScopeGuard(const ScopeGuard &) = delete;\n+354 ScopeGuard(ScopeGuard &&) = delete;\n+355 ScopeGuard &operator=(ScopeGuard) = delete;\n+356 ~ScopeGuard() { cleanupFunc_(); }\n+357 };\n+358\n+360\n+369 template\n+370 ScopeGuard makeScopeGuard(F cleanupFunc)\n+371 {\n+372 return { std::move(cleanupFunc) };\n+373 }\n+374\n+375} // end namespace Imp\n+390 template >\n+_\b3_\b9_\b1 class _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br : public Imp::block_vector_unmanaged\n+392 {\n+393 public:\n+394\n+395 //===== type definitions and constants\n+396\n+_\b3_\b9_\b8 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n+399\n+_\b4_\b0_\b1 typedef B _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+402\n+_\b4_\b0_\b4 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n+405\n+_\b4_\b0_\b7 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+408\n+_\b4_\b1_\b0 typedef typename Imp::block_vector_unmanaged::Iterator\n+_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+411\n+_\b4_\b1_\b3 typedef typename Imp::block_vector_unmanaged::ConstIterator\n+_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+414\n+415 //===== constructors and such\n+416\n+_\b4_\b1_\b8 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br ()\n+419 {\n+420 syncBaseArray();\n+421 }\n+422\n+_\b4_\b2_\b4 explicit _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n) : storage_(_n)\n+425 {\n+426 syncBaseArray();\n+427 }\n+428\n+_\b4_\b3_\b0 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (std::initializer_list const &l) : storage_(l)\n+431 {\n+432 syncBaseArray();\n+433 }\n+434\n+435\n+447 template\n+_\b4_\b4_\b8 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n, S _capacity)\n+449 {\n+450 static_assert(std::numeric_limits::is_integer,\n+451 \"capacity must be an unsigned integral type (be aware, that this\n+constructor does not set the default value!)\" );\n+452 if((_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be)_capacity > _n)\n+453 storage_.reserve(_capacity);\n+454 storage_.resize(_n);\n+455 syncBaseArray();\n+456 }\n+457\n+458\n+_\b4_\b6_\b8 void _\br_\be_\bs_\be_\br_\bv_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by)\n+469 {\n+470 [[maybe_unused]] const auto &guard =\n+471 Imp::makeScopeGuard([this]{ syncBaseArray(); });\n+472 storage_.reserve(_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by);\n+473 }\n+474\n+_\b4_\b8_\b1 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by() const\n+482 {\n+483 return storage_.capacity();\n+484 }\n+485\n+_\b4_\b9_\b6 void _\br_\be_\bs_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size)\n+497 {\n+498 [[maybe_unused]] const auto &guard =\n+499 Imp::makeScopeGuard([this]{ syncBaseArray(); });\n+500 storage_.resize(size);\n+501 }\n+502\n+_\b5_\b0_\b4 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br(const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br &a)\n+505 noexcept(noexcept(std::declval().storage_ = a.storage_))\n+506 {\n+507 storage_ = a.storage_;\n+508 syncBaseArray();\n+509 }\n+510\n+_\b5_\b1_\b2 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br(_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br &&a)\n+513 noexcept(noexcept(std::declval().swap(a)))\n+514 {\n+515 _\bs_\bw_\ba_\bp(a);\n+516 }\n+517\n+_\b5_\b1_\b9 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& a)\n+520 noexcept(noexcept(std::declval().storage_ = a.storage_))\n+521 {\n+522 [[maybe_unused]] const auto &guard =\n+523 Imp::makeScopeGuard([this]{ syncBaseArray(); });\n+524 storage_ = a.storage_;\n+525 return *this;\n+526 }\n+527\n+_\b5_\b2_\b9 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br&& a)\n+530 noexcept(noexcept(std::declval().swap(a)))\n+531 {\n+532 _\bs_\bw_\ba_\bp(a);\n+533 return *this;\n+534 }\n+535\n+_\b5_\b3_\b7 void _\bs_\bw_\ba_\bp(_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br &other)\n+538 noexcept(noexcept(\n+539 std::declval().storage_.swap(other.storage_)))\n+540 {\n+541 [[maybe_unused]] const auto &guard = Imp::makeScopeGuard([&]{\n+542 syncBaseArray();\n+543 other.syncBaseArray();\n+544 });\n+545 storage_.swap(other.storage_);\n+546 }\n+547\n+_\b5_\b4_\b9 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n+550 {\n+551 // forward to operator= in base class\n+552 (static_cast&>(*this)) = k;\n+553 return *this;\n+554 }\n+555\n+556 private:\n+557 void syncBaseArray() noexcept\n+558 {\n+559 this->p = storage_.data();\n+560 this->n = storage_.size();\n+561 }\n+562\n+563 std::vector storage_;\n+564 };\n+565\n+571 template\n+_\b5_\b7_\b2 struct FieldTraits< _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n+573 {\n+_\b5_\b7_\b4 typedef typename FieldTraits::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b5_\b7_\b5 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+576 };\n+582 template\n+_\b5_\b8_\b3 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bA_\b>& v)\n+584 {\n+585 typedef typename _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bA_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size_type;\n+586\n+587 for (size_type i=0; i\n+616#else\n+617 template >\n+618#endif\n+619 class BlockVectorWindow : public Imp::block_vector_unmanaged\n+620 {\n+621 public:\n+622\n+623 //===== type definitions and constants\n+624\n+626 using field_type = typename Imp::BlockTraits::field_type;\n+627\n+629 typedef B block_type;\n+630\n+632 typedef A allocator_type;\n+633\n+635 typedef typename A::size_type size_type;\n+636\n+638 typedef typename Imp::block_vector_unmanaged::Iterator\n+Iterator;\n+639\n+641 typedef typename Imp::block_vector_unmanaged::ConstIterator\n+ConstIterator;\n+642\n+643\n+644 //===== constructors and such\n+646 BlockVectorWindow () : Imp::block_vector_unmanaged()\n+647 { }\n+648\n+650 BlockVectorWindow (B* _p, size_type _n)\n+651 {\n+652 this->n = _n;\n+653 this->p = _p;\n+654 }\n+655\n+657 BlockVectorWindow (const BlockVectorWindow& a)\n+658 {\n+659 this->n = a.n;\n+660 this->p = a.p;\n+661 }\n+662\n+664 BlockVectorWindow& operator= (const BlockVectorWindow& a)\n+665 {\n+666 // check correct size\n+667#ifdef DUNE_ISTL_WITH_CHECKING\n+668 if (this->n!=a.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n+669#endif\n+670\n+671 if (&a!=this) // check if this and a are different objects\n+672 {\n+673 // copy data\n+674 for (size_type i=0; in; i++) this->p[i]=a.p[i];\n+675 }\n+676 return *this;\n+677 }\n+678\n+680 BlockVectorWindow& operator= (const field_type& k)\n+681 {\n+682 (static_cast&>(*this)) = k;\n+683 return *this;\n+684 }\n+685\n+687 operator BlockVector() const {\n+688 auto bv = BlockVector(this->n);\n+689\n+690 std::copy(this->begin(), this->end(), bv.begin());\n+691\n+692 return bv;\n+693 }\n+694\n+695 //===== window manipulation methods\n+696\n+698 void set (size_type _n, B* _p)\n+699 {\n+700 this->n = _n;\n+701 this->p = _p;\n+702 }\n+703\n+705 void setsize (size_type _n)\n+706 {\n+707 this->n = _n;\n+708 }\n+709\n+711 void setptr (B* _p)\n+712 {\n+713 this->p = _p;\n+714 }\n+715\n+717 B* getptr ()\n+718 {\n+719 return this->p;\n+720 }\n+721\n+723 size_type getsize () const\n+724 {\n+725 return this->n;\n+726 }\n+727 };\n+728\n+729\n+730\n+741 template\n+742 class compressed_block_vector_unmanaged : public\n+compressed_base_array_unmanaged\n+743 {\n+744 public:\n+745\n+746 //===== type definitions and constants\n+747\n+749 using field_type = typename Imp::BlockTraits::field_type;\n+750\n+752 typedef B block_type;\n+753\n+755 typedef typename compressed_base_array_unmanaged::iterator Iterator;\n+756\n+758 typedef typename compressed_base_array_unmanaged::const_iterator\n+ConstIterator;\n+759\n+761 typedef ST size_type;\n+762\n+763 //===== assignment from scalar\n+764\n+765 compressed_block_vector_unmanaged& operator= (const field_type& k)\n+766 {\n+767 for (size_type i=0; in; i++)\n+768 (this->p)[i] = k;\n+769 return *this;\n+770 }\n+771\n+772\n+773 //===== vector space arithmetic\n+774\n+776 template\n+777 compressed_block_vector_unmanaged& operator+= (const V& y)\n+778 {\n+779#ifdef DUNE_ISTL_WITH_CHECKING\n+780 if (!includesindexset(y)) DUNE_THROW(ISTLError,\"index set mismatch\");\n+781#endif\n+782 for (size_type i=0; ioperator[](y.j[i]) += y.p[i];\n+783 return *this;\n+784 }\n+785\n+787 template\n+788 compressed_block_vector_unmanaged& operator-= (const V& y)\n+789 {\n+790#ifdef DUNE_ISTL_WITH_CHECKING\n+791 if (!includesindexset(y)) DUNE_THROW(ISTLError,\"index set mismatch\");\n+792#endif\n+793 for (size_type i=0; ioperator[](y.j[i]) -= y.p[i];\n+794 return *this;\n+795 }\n+796\n+798 template\n+799 compressed_block_vector_unmanaged& axpy (const field_type& a, const V& y)\n+800 {\n+801#ifdef DUNE_ISTL_WITH_CHECKING\n+802 if (!includesindexset(y)) DUNE_THROW(ISTLError,\"index set mismatch\");\n+803#endif\n+804 for (size_type i=0; in; ++i) (this->p)[i] *= k;\n+813 return *this;\n+814 }\n+815\n+817 compressed_block_vector_unmanaged& operator/= (const field_type& k)\n+818 {\n+819 for (size_type i=0; in; ++i) (this->p)[i] /= k;\n+820 return *this;\n+821 }\n+822\n+823\n+824 //===== Euclidean scalar product\n+825\n+827 field_type operator* (const compressed_block_vector_unmanaged& y) const\n+828 {\n+829#ifdef DUNE_ISTL_WITH_CHECKING\n+830 if (!includesindexset(y) || !y.includesindexset(*this) )\n+831 DUNE_THROW(ISTLError,\"index set mismatch\");\n+832#endif\n+833 field_type sum=0;\n+834 for (size_type i=0; in; ++i)\n+835 sum += (this->p)[i] * y[(this->j)[i]];\n+836 return sum;\n+837 }\n+838\n+839\n+840 //===== norms\n+841\n+843 typename FieldTraits::real_type one_norm () const\n+844 {\n+845 typename FieldTraits::real_type sum=0;\n+846 for (size_type i=0; in; ++i) sum += (this->p)[i].one_norm();\n+847 return sum;\n+848 }\n+849\n+851 typename FieldTraits::real_type one_norm_real () const\n+852 {\n+853 typename FieldTraits::real_type sum=0;\n+854 for (size_type i=0; in; ++i) sum += (this->p)[i].one_norm_real();\n+855 return sum;\n+856 }\n+857\n+859 typename FieldTraits::real_type two_norm () const\n+860 {\n+861 using std::sqrt;\n+862 typename FieldTraits::real_type sum=0;\n+863 for (size_type i=0; in; ++i) sum += (this->p)[i].two_norm2();\n+864 return sqrt(sum);\n+865 }\n+866\n+868 typename FieldTraits::real_type two_norm2 () const\n+869 {\n+870 typename FieldTraits::real_type sum=0;\n+871 for (size_type i=0; in; ++i) sum += (this->p)[i].two_norm2();\n+872 return sum;\n+873 }\n+874\n+876 template ::value, int>::type = 0>\n+878 typename FieldTraits::real_type infinity_norm() const {\n+879 using real_type = typename FieldTraits::real_type;\n+880 using std::max;\n+881\n+882 real_type norm = 0;\n+883 for (auto const &x : *this) {\n+884 real_type const a = x.infinity_norm();\n+885 norm = max(a, norm);\n+886 }\n+887 return norm;\n+888 }\n+889\n+891 template ::value, int>::type = 0>\n+893 typename FieldTraits::real_type infinity_norm_real() const {\n+894 using real_type = typename FieldTraits::real_type;\n+895 using std::max;\n+896\n+897 real_type norm = 0;\n+898 for (auto const &x : *this) {\n+899 real_type const a = x.infinity_norm_real();\n+900 norm = max(a, norm);\n+901 }\n+902 return norm;\n+903 }\n+904\n+906 template ::value, int>::type = 0>\n+908 typename FieldTraits::real_type infinity_norm() const {\n+909 using real_type = typename FieldTraits::real_type;\n+910 using std::max;\n+911\n+912 real_type norm = 0;\n+913 real_type isNaN = 1;\n+914 for (auto const &x : *this) {\n+915 real_type const a = x.infinity_norm();\n+916 norm = max(a, norm);\n+917 isNaN += a;\n+918 }\n+919 return norm * (isNaN / isNaN);\n+920 }\n+921\n+923 template ::value, int>::type = 0>\n+925 typename FieldTraits::real_type infinity_norm_real() const {\n+926 using real_type = typename FieldTraits::real_type;\n+927 using std::max;\n+928\n+929 real_type norm = 0;\n+930 real_type isNaN = 1;\n+931 for (auto const &x : *this) {\n+932 real_type const a = x.infinity_norm_real();\n+933 norm = max(a, norm);\n+934 isNaN += a;\n+935 }\n+936 return norm * (isNaN / isNaN);\n+937 }\n+938\n+939 //===== sizes\n+940\n+942 size_type N () const\n+943 {\n+944 return this->n;\n+945 }\n+946\n+948 size_type dim () const\n+949 {\n+950 size_type d=0;\n+951 for (size_type i=0; in; i++)\n+952 d += (this->p)[i].dim();\n+953 return d;\n+954 }\n+955\n+956 protected:\n+958 compressed_block_vector_unmanaged () :\n+compressed_base_array_unmanaged()\n+959 { }\n+960\n+962 template\n+963 bool includesindexset (const V& y)\n+964 {\n+965 typename V::ConstIterator e=this->end();\n+966 for (size_type i=0; ifind(y.j[i])==e)\n+968 return false;\n+969 return true;\n+970 }\n+971 };\n+972\n+973\n+992 template\n+993 class CompressedBlockVectorWindow : public\n+compressed_block_vector_unmanaged\n+994 {\n+995 public:\n+996\n+997 //===== type definitions and constants\n+998\n+1000 using field_type = typename Imp::BlockTraits::field_type;\n+1001\n+1003 typedef B block_type;\n+1004\n+1006 typedef ST size_type;\n+1007\n+1009 typedef typename compressed_block_vector_unmanaged::Iterator\n+Iterator;\n+1010\n+1012 typedef typename compressed_block_vector_unmanaged::ConstIterator\n+ConstIterator;\n+1013\n+1014\n+1015 //===== constructors and such\n+1017 CompressedBlockVectorWindow () : compressed_block_vector_unmanaged()\n+1018 { }\n+1019\n+1021 CompressedBlockVectorWindow (B* _p, size_type* _j, size_type _n)\n+1022 {\n+1023 this->n = _n;\n+1024 this->p = _p;\n+1025 this->j = _j;\n+1026 }\n+1027\n+1029 CompressedBlockVectorWindow (const CompressedBlockVectorWindow& a)\n+1030 {\n+1031 this->n = a.n;\n+1032 this->p = a.p;\n+1033 this->j = a.j;\n+1034 }\n+1035\n+1037 CompressedBlockVectorWindow& operator= (const CompressedBlockVectorWindow&\n+a)\n+1038 {\n+1039 // check correct size\n+1040#ifdef DUNE_ISTL_WITH_CHECKING\n+1041 if (this->n!=a.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n+1042#endif\n+1043\n+1044 if (&a!=this) // check if this and a are different objects\n+1045 {\n+1046 // copy data\n+1047 for (size_type i=0; in; i++) this->p[i]=a.p[i];\n+1048 for (size_type i=0; in; i++) this->j[i]=a.j[i];\n+1049 }\n+1050 return *this;\n+1051 }\n+1052\n+1054 CompressedBlockVectorWindow& operator= (const field_type& k)\n+1055 {\n+1056 (static_cast&>(*this)) = k;\n+1057 return *this;\n+1058 }\n+1059\n+1060\n+1061 //===== window manipulation methods\n+1062\n+1064 void set (size_type _n, B* _p, size_type* _j)\n+1065 {\n+1066 this->n = _n;\n+1067 this->p = _p;\n+1068 this->j = _j;\n+1069 }\n+1070\n+1072 void setsize (size_type _n)\n+1073 {\n+1074 this->n = _n;\n+1075 }\n+1076\n+1078 void setptr (B* _p)\n+1079 {\n+1080 this->p = _p;\n+1081 }\n+1082\n+1084 void setindexptr (size_type* _j)\n+1085 {\n+1086 this->j = _j;\n+1087 }\n+1088\n+1090 B* getptr ()\n+1091 {\n+1092 return this->p;\n+1093 }\n+1094\n+1096 size_type* getindexptr ()\n+1097 {\n+1098 return this->j;\n+1099 }\n+1100\n+1102 const B* getptr () const\n+1103 {\n+1104 return this->p;\n+1105 }\n+1106\n+1108 const size_type* getindexptr () const\n+1109 {\n+1110 return this->j;\n+1111 }\n+1113 size_type getsize () const\n+1114 {\n+1115 return this->n;\n+1116 }\n+1117 };\n+1118\n+1119} // end namespace 'Imp'\n+1120\n+1121\n+1123 template\n+1124 struct AutonomousValueType>\n+1125 {\n+1126 using type = BlockVector;\n+1127 };\n+1128\n+1129\n+1130} // end namespace 'Dune'\n+1131\n+1132#endif\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bb_\ba_\bs_\be_\ba_\br_\br_\ba_\by_\b._\bh_\bh\n+Implements several basic array containers.\n+_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n+Helper functions for determining the vector/matrix block level.\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-Class representing the properties of an edge in the matrix graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-Class representing a node in the matrix graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-The (undirected) graph of a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n-A subgraph of a graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:443\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-EdgeIndexMap getEdgeIndexMap()\n-Get an edge index map for the graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-An index map for mapping the edges to indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:470\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n-Attaches properties to the edges and vertices of a graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:978\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:22\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n-Dune::Amg::SubGraph< MatrixGraph, std::vector< bool > > SubGraph\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:26\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n-Dune::Amg::PropertiesGraph< SubGraph, VertexProperties, EdgeProperties,\n-IdentityMap, typename SubGraph::EdgeIndexMap > PropertiesGraph\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:32\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-M::matrix_type Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be\n-static GraphTuple create(const M &matrix, T &excluded, PI &pinfo, const OF &of)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bf_\br_\be_\be\n-static void free(GraphTuple &graphs)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-Dune::Amg::MatrixGraph< const Matrix > MatrixGraph\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be\n-std::tuple< MatrixGraph *, PropertiesGraph *, SubGraph * > GraphTuple\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-Dune::Amg::MatrixGraph< const Matrix > MatrixGraph\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-M::matrix_type Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n-Dune::Amg::PropertiesGraph< MatrixGraph, VertexProperties, EdgeProperties,\n-IdentityMap, IdentityMap > PropertiesGraph\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be\n-std::tuple< MatrixGraph *, PropertiesGraph * > GraphTuple\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be\n-static GraphTuple create(const M &matrix, T &excluded, const\n-SequentialInformation &pinfo, const OF &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bf_\br_\be_\be\n-static void free(GraphTuple &graphs)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:86\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)\n+Send BlockVector to an output stream.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:583\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A vector of blocks with memory management.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+BlockVector()\n+makes empty vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:418\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Imp::block_vector_unmanaged< B, size_type >::ConstIterator ConstIterator\n+make iterators available as types\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:413\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\be_\br_\bv_\be\n+void reserve(size_type capacity)\n+Reserve space.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:468\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+BlockVector(BlockVector &&a) noexcept(noexcept(std::declval< BlockVector >\n+().swap(a)))\n+move constructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:512\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+BlockVector(size_type _n)\n+make vector with _n components\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:424\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(size_type size)\n+Resize the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:496\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Imp::block_vector_unmanaged< B, size_type >::Iterator Iterator\n+make iterators available as types\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:410\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+BlockVector(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector >\n+().storage_=a.storage_))\n+copy constructor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:504\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n+A allocator_type\n+export the allocator type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:404\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+BlockVector & operator=(const BlockVector &a) noexcept(noexcept(std::declval<\n+BlockVector >().storage_=a.storage_))\n+assignment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:519\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< B >::field_type field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:398\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+The type for the index access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:407\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+BlockVector(std::initializer_list< B > const &l)\n+Construct from a std::initializer_list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:430\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by\n+size_type capacity() const\n+Get the capacity of the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:481\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+BlockVector(size_type _n, S _capacity)\n+Make vector with _n components but preallocating capacity components.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:448\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+B block_type\n+export the type representing the components\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:401\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bw_\ba_\bp\n+void swap(BlockVector &other) noexcept(noexcept(std::declval< BlockVector & >\n+().storage_.swap(other.storage_)))\n+swap operation\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:537\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< B >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:575\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+FieldTraits< B >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:574\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00131.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00131.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: twolevelmethod.hh File Reference\n+dune-istl: btdmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -65,59 +65,51 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n \n- \n+
    btdmatrix.hh File Reference
    \n
    \n
    \n \n-

    Algebraic twolevel methods. \n+

    Implementation of the BTDMatrix class. \n More...

    \n-
    #include <tuple>
    \n-#include <dune/istl/operators.hh>
    \n-#include "amg.hh"
    \n-#include "galerkin.hh"
    \n-#include <dune/istl/solver.hh>
    \n+
    #include <dune/common/fmatrix.hh>
    \n+#include <dune/common/scalarvectorview.hh>
    \n+#include <dune/common/scalarmatrixview.hh>
    \n+#include <dune/istl/bcrsmatrix.hh>
    \n+#include <dune/istl/blocklevel.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n-\n-\n-\n-\n-\n-\n+\n \n

    \n Classes

    class  Dune::Amg::LevelTransferPolicy< FO, CO >
     Abstract base class for transfer between levels and creation of the coarse level system. More...
    class  Dune::BTDMatrix< B, A >
     A block-tridiagonal matrix. More...
     
    class  Dune::Amg::AggregationLevelTransferPolicy< O, C >
     A LeveTransferPolicy that used aggregation to construct the coarse level system. 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 >
    struct  Dune::FieldTraits< BTDMatrix< B, A > >
     
    \n \n \n \n-\n-\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n

    Detailed Description

    \n-

    Algebraic twolevel methods.

    \n-
    Author
    Markus Blatt
    \n+

    Implementation of the BTDMatrix class.

    \n+
    Author
    Oliver Sander
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,44 +1,30 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-twolevelmethod.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Algebraic twolevel methods. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n-#include \"_\ba_\bm_\bg_\b._\bh_\bh\"\n-#include \"_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\"\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n+btdmatrix.hh File Reference\n+Implementation of the BTDMatrix class. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bF_\bO_\b,_\b _\bC_\bO_\b _\b>\n-\u00a0 Abstract base class for transfer between levels and creation of the\n- coarse level system. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n+\u00a0 A block-tridiagonal matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bO_\b,_\b _\bC_\b _\b>\n-\u00a0 A LeveTransferPolicy that used aggregation to construct the coarse\n- level system. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bO_\b,_\b _\bS_\b,_\b _\bC_\b _\b>\n-\u00a0 A policy class for solving the coarse level system using one step of\n- _\bA_\bM_\bG. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b<_\b _\bF_\bO_\b,_\b _\bC_\bS_\bP_\b,_\b _\bS_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Algebraic twolevel methods.\n+Implementation of the BTDMatrix class.\n Author\n- Markus Blatt\n+ Oliver Sander\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00131_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00131_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: twolevelmethod.hh Source File\n+dune-istl: btdmatrix.hh Source File\n \n \n \n \n \n \n \n@@ -70,482 +70,240 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    twolevelmethod.hh
    \n+
    btdmatrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_TWOLEVELMETHOD_HH
    \n-
    6#define DUNE_ISTL_TWOLEVELMETHOD_HH
    \n+
    5#ifndef DUNE_ISTL_BTDMATRIX_HH
    \n+
    6#define DUNE_ISTL_BTDMATRIX_HH
    \n
    7
    \n-
    8#include <tuple>
    \n-
    9
    \n-\n-
    11#include"amg.hh"
    \n-
    12#include"galerkin.hh"
    \n-
    13#include<dune/istl/solver.hh>
    \n-
    14
    \n-
    22namespace Dune
    \n-
    23{
    \n-
    24namespace Amg
    \n-
    25{
    \n-
    26
    \n-
    36template<class FO, class CO>
    \n-
    \n-\n-
    38{
    \n-
    39public:
    \n-
    44 typedef FO FineOperatorType;
    \n-
    48 typedef typename FineOperatorType::range_type FineRangeType;
    \n-
    52 typedef typename FineOperatorType::domain_type FineDomainType;
    \n-\n-
    61 typedef typename CoarseOperatorType::range_type CoarseRangeType;
    \n-
    65 typedef typename CoarseOperatorType::domain_type CoarseDomainType;
    \n-
    \n-
    70 std::shared_ptr<CoarseOperatorType>& getCoarseLevelOperator()
    \n-
    71 {
    \n-
    72 return operator_;
    \n-
    73 }
    \n-
    \n-
    \n-\n-
    79 {
    \n-
    80 return rhs_;
    \n-
    81 }
    \n-
    \n-
    82
    \n-
    \n-\n-
    88 {
    \n-
    89 return lhs_;
    \n-
    90 }
    \n-
    \n-
    100 virtual void moveToCoarseLevel(const FineRangeType& fineRhs)=0;
    \n-
    110 virtual void moveToFineLevel(FineDomainType& fineLhs)=0;
    \n-
    118 virtual void createCoarseLevelSystem(const FineOperatorType& fineOperator)=0;
    \n-
    119
    \n-
    121 virtual LevelTransferPolicy* clone() const =0;
    \n+
    8#include <dune/common/fmatrix.hh>
    \n+
    9#include <dune/common/scalarvectorview.hh>
    \n+
    10#include <dune/common/scalarmatrixview.hh>
    \n+\n+\n+
    13
    \n+
    19namespace Dune {
    \n+
    29 template <class B, class A=std::allocator<B> >
    \n+
    \n+
    30 class BTDMatrix : public BCRSMatrix<B,A>
    \n+
    31 {
    \n+
    32 public:
    \n+
    33
    \n+
    34 //===== type definitions and constants
    \n+
    35
    \n+
    37 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n+
    38
    \n+
    40 typedef B block_type;
    \n+
    41
    \n+
    43 typedef A allocator_type;
    \n+
    44
    \n+
    46 //typedef BCRSMatrix<B,A>::row_type row_type;
    \n+
    47
    \n+
    49 typedef typename A::size_type size_type;
    \n+
    50
    \n+
    52 BTDMatrix() : BCRSMatrix<B,A>() {}
    \n+
    53
    \n+
    \n+
    54 explicit BTDMatrix(size_type size)
    \n+
    55 : BCRSMatrix<B,A>(size, size, BCRSMatrix<B,A>::random)
    \n+
    56 {
    \n+
    57 // Set number of entries for each row
    \n+
    58 // All rows get three entries, except for the first and the last one
    \n+
    59 for (size_t i=0; i<size; i++)
    \n+
    60 this->BCRSMatrix<B,A>::setrowsize(i, 3 - (i==0) - (i==(size-1)));
    \n+
    61
    \n+\n+
    63
    \n+
    64 // The actual entries for each row
    \n+
    65 for (size_t i=0; i<size; i++) {
    \n+
    66 if (i>0)
    \n+
    67 this->BCRSMatrix<B,A>::addindex(i, i-1);
    \n+
    68 this->BCRSMatrix<B,A>::addindex(i, i );
    \n+
    69 if (i<size-1)
    \n+
    70 this->BCRSMatrix<B,A>::addindex(i, i+1);
    \n+
    71 }
    \n+
    72
    \n+\n+
    74 }
    \n+
    \n+
    75
    \n+
    \n+
    77 void setSize(size_type size)
    \n+
    78 {
    \n+
    79 auto nonZeros = (size==0) ? 0 : size + 2*(size-1);
    \n+
    80 this->BCRSMatrix<B,A>::setSize(size, // rows
    \n+
    81 size, // columns
    \n+
    82 nonZeros);
    \n+
    83
    \n+
    84 // Set number of entries for each row
    \n+
    85 // All rows get three entries, except for the first and the last one
    \n+
    86 for (size_t i=0; i<size; i++)
    \n+
    87 this->BCRSMatrix<B,A>::setrowsize(i, 3 - (i==0) - (i==(size-1)));
    \n+
    88
    \n+\n+
    90
    \n+
    91 // The actual entries for each row
    \n+
    92 for (size_t i=0; i<size; i++) {
    \n+
    93 if (i>0)
    \n+
    94 this->BCRSMatrix<B,A>::addindex(i, i-1);
    \n+
    95 this->BCRSMatrix<B,A>::addindex(i, i );
    \n+
    96 if (i<size-1)
    \n+
    97 this->BCRSMatrix<B,A>::addindex(i, i+1);
    \n+
    98 }
    \n+
    99
    \n+\n+
    101 }
    \n+
    \n+
    102
    \n+
    \n+\n+
    105 this->BCRSMatrix<B,A>::operator=(other);
    \n+
    106 return *this;
    \n+
    107 }
    \n+
    \n+
    108
    \n+
    \n+\n+\n+
    112 return *this;
    \n+
    113 }
    \n+
    \n+
    114
    \n+
    120 template <class V>
    \n+
    \n+
    121 void solve (V& x, const V& rhs) const {
    \n
    122
    \n-\n-
    125
    \n-
    126 protected:
    \n-\n-\n-
    132 std::shared_ptr<CoarseOperatorType> operator_;
    \n-
    133};
    \n-
    \n-
    134
    \n-
    140template<class O, class C>
    \n-
    \n-\n-
    142 : public LevelTransferPolicy<O,O>
    \n-
    143{
    \n-\n-
    145public:
    \n-\n-
    147 typedef C Criterion;
    \n-\n-
    149
    \n-
    \n-\n-
    151 : criterion_(crit)
    \n-
    152 {}
    \n-
    \n-
    153
    \n-
    \n-
    154 void createCoarseLevelSystem(const O& fineOperator)
    \n-
    155 {
    \n-
    156 prolongDamp_ = criterion_.getProlongationDampingFactor();
    \n-\n-\n-\n-
    160 Dune::Amg::EdgeProperties,Dune::IdentityMap,Dune::IdentityMap> PropertiesGraph;
    \n-
    161 MatrixGraph mg(fineOperator.getmat());
    \n-
    162 PropertiesGraph pg(mg,Dune::IdentityMap(),Dune::IdentityMap());
    \n-
    163 typedef NegateSet<typename ParallelInformation::OwnerSet> OverlapFlags;
    \n-
    164
    \n-
    165 aggregatesMap_ = std::make_shared<AggregatesMap>(pg.maxVertex()+1);
    \n-
    166
    \n-
    167 int noAggregates, isoAggregates, oneAggregates, skippedAggregates;
    \n-
    168
    \n-
    169 std::tie(noAggregates, isoAggregates, oneAggregates, skippedAggregates) =
    \n-
    170 aggregatesMap_->buildAggregates(fineOperator.getmat(), pg, criterion_, true);
    \n-
    171 std::cout<<"no aggregates="<<noAggregates<<" iso="<<isoAggregates<<" one="<<oneAggregates<<" skipped="<<skippedAggregates<<std::endl;
    \n-
    172 // misuse coarsener to renumber aggregates
    \n-\n-
    174 typedef std::vector<bool>::iterator Iterator;
    \n-
    175 typedef Dune::IteratorPropertyMap<Iterator, Dune::IdentityMap> VisitedMap;
    \n-
    176 std::vector<bool> excluded(fineOperator.getmat().N(), false);
    \n-
    177 VisitedMap vm(excluded.begin(), Dune::IdentityMap());
    \n-\n-
    179 std::size_t aggregates = renumberer.coarsen(pinfo, pg, vm,
    \n-
    180 *aggregatesMap_, pinfo,
    \n-
    181 noAggregates);
    \n-
    182 std::vector<bool>& visited=excluded;
    \n+
    123 // special handling for 1x1 matrices. The generic algorithm doesn't work for them
    \n+
    124 if (this->N()==1) {
    \n+
    125 auto&& x0 = Impl::asVector(x[0]);
    \n+
    126 auto&& rhs0 = Impl::asVector(rhs[0]);
    \n+
    127 Impl::asMatrix((*this)[0][0]).solve(x0, rhs0);
    \n+
    128 return;
    \n+
    129 }
    \n+
    130
    \n+
    131 // Make copies of the rhs and the right matrix band
    \n+
    132 V d = rhs;
    \n+
    133 std::vector<block_type> c(this->N()-1);
    \n+
    134 for (size_t i=0; i<this->N()-1; i++)
    \n+
    135 c[i] = (*this)[i][i+1];
    \n+
    136
    \n+
    137 /* Modify the coefficients. */
    \n+
    138 block_type a_00_inv = (*this)[0][0];
    \n+
    139 Impl::asMatrix(a_00_inv).invert();
    \n+
    140
    \n+
    141 //c[0] /= (*this)[0][0]; /* Division by zero risk. */
    \n+
    142 block_type tmp = a_00_inv;
    \n+
    143 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[0]));
    \n+
    144 c[0] = tmp;
    \n+
    145
    \n+
    146 // d = a^{-1} d /* Division by zero would imply a singular matrix. */
    \n+
    147 auto d_0_tmp = d[0];
    \n+
    148 auto&& d_0 = Impl::asVector(d[0]);
    \n+
    149 Impl::asMatrix(a_00_inv).mv(Impl::asVector(d_0_tmp),d_0);
    \n+
    150
    \n+
    151 for (unsigned int i = 1; i < this->N(); i++) {
    \n+
    152
    \n+
    153 // id = ( a_ii - c_{i-1} a_{i, i-1} ) ^{-1}
    \n+
    154 block_type tmp;
    \n+
    155 tmp = (*this)[i][i-1];
    \n+
    156 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[i-1]));
    \n+
    157
    \n+
    158 block_type id = (*this)[i][i];
    \n+
    159 id -= tmp;
    \n+
    160 Impl::asMatrix(id).invert(); /* Division by zero risk. */
    \n+
    161
    \n+
    162 if (i<c.size()) {
    \n+
    163 Impl::asMatrix(c[i]).leftmultiply(Impl::asMatrix(id)); /* Last value calculated is redundant. */
    \n+
    164 }
    \n+
    165
    \n+
    166 // d[i] = (d[i] - d[i-1] * (*this)[i][i-1]) * id;
    \n+
    167 auto&& d_i = Impl::asVector(d[i]);
    \n+
    168 Impl::asMatrix((*this)[i][i-1]).mmv(Impl::asVector(d[i-1]), d_i);
    \n+
    169 auto tmpVec = d[i];
    \n+
    170 Impl::asMatrix(id).mv(Impl::asVector(tmpVec), d_i);
    \n+
    171 }
    \n+
    172
    \n+
    173 /* Now back substitute. */
    \n+
    174 x[this->N() - 1] = d[this->N() - 1];
    \n+
    175 for (int i = this->N() - 2; i >= 0; i--) {
    \n+
    176 //x[i] = d[i] - c[i] * x[i + 1];
    \n+
    177 x[i] = d[i];
    \n+
    178 auto&& x_i = Impl::asVector(x[i]);
    \n+
    179 Impl::asMatrix(c[i]).mmv(Impl::asVector(x[i+1]), x_i);
    \n+
    180 }
    \n+
    181
    \n+
    182 }
    \n+
    \n
    183
    \n-
    184 typedef std::vector<bool>::iterator Iterator;
    \n+
    184 private:
    \n
    185
    \n-
    186 for(Iterator iter= visited.begin(), end=visited.end();
    \n-
    187 iter != end; ++iter)
    \n-
    188 *iter=false;
    \n-
    189 matrix_.reset(productBuilder.build(mg, vm,
    \n-\n-
    191 *aggregatesMap_,
    \n-
    192 aggregates,
    \n-
    193 OverlapFlags()));
    \n-
    194 productBuilder.calculate(fineOperator.getmat(), *aggregatesMap_, *matrix_, pinfo, OverlapFlags());
    \n-
    195 this->lhs_.resize(this->matrix_->M());
    \n-
    196 this->rhs_.resize(this->matrix_->N());
    \n-
    197 this->operator_ = std::make_shared<O>(*matrix_);
    \n-
    198 }
    \n+
    186 // ////////////////////////////////////////////////////////////////////////////
    \n+
    187 // The following methods from the base class should now actually be called
    \n+
    188 // ////////////////////////////////////////////////////////////////////////////
    \n+
    189
    \n+
    190 // createbegin and createend should be in there, too, but I can't get it to compile
    \n+
    191 // BCRSMatrix<B,A>::CreateIterator createbegin () {}
    \n+
    192 // BCRSMatrix<B,A>::CreateIterator createend () {}
    \n+
    193 void setrowsize (size_type i, size_type s) {}
    \n+
    194 void incrementrowsize (size_type i) {}
    \n+
    195 void endrowsizes () {}
    \n+
    196 void addindex (size_type row, size_type col) {}
    \n+
    197 void endindices () {}
    \n+
    198 };
    \n
    \n
    199
    \n-
    \n-
    200 void moveToCoarseLevel(const typename FatherType::FineRangeType& fineRhs)
    \n-
    201 {
    \n-\n-
    203 ::restrictVector(*aggregatesMap_, this->rhs_, fineRhs, ParallelInformation());
    \n-
    204 this->lhs_=0;
    \n-
    205 }
    \n+
    200 template<typename B, typename A>
    \n+
    \n+
    201 struct FieldTraits< BTDMatrix<B, A> >
    \n+
    202 {
    \n+\n+
    204 using real_type = typename FieldTraits<field_type>::real_type;
    \n+
    205 };
    \n
    \n
    206
    \n-
    \n-\n-
    208 {
    \n-\n-
    210 ::prolongateVector(*aggregatesMap_, this->lhs_, fineLhs,
    \n-
    211 prolongDamp_, ParallelInformation());
    \n-
    212 }
    \n-
    \n-
    213
    \n-
    \n-\n-
    215 {
    \n-
    216 return new AggregationLevelTransferPolicy(*this);
    \n-
    217 }
    \n-
    \n-
    218
    \n-
    219private:
    \n-
    220 typename O::matrix_type::field_type prolongDamp_;
    \n-
    221 std::shared_ptr<AggregatesMap> aggregatesMap_;
    \n-
    222 Criterion criterion_;
    \n-
    223 std::shared_ptr<typename O::matrix_type> matrix_;
    \n-
    224};
    \n-
    \n-
    225
    \n-
    232template<class O, class S, class C>
    \n-
    \n-\n-
    234{
    \n-
    235public:
    \n-
    237 typedef O Operator;
    \n-
    239 typedef typename O::range_type X;
    \n-
    241 typedef C Criterion;
    \n-
    243 typedef S Smoother;
    \n-\n-\n-
    \n-\n-
    254 : smootherArgs_(args), criterion_(c)
    \n-
    255 {}
    \n-
    \n-
    \n-\n-
    258 : coarseOperator_(other.coarseOperator_), smootherArgs_(other.smootherArgs_),
    \n-
    259 criterion_(other.criterion_)
    \n-
    260 {}
    \n-
    \n-
    261private:
    \n-
    268 struct AMGInverseOperator : public InverseOperator<X,X>
    \n-
    269 {
    \n-
    270 AMGInverseOperator(const typename AMGType::Operator& op,
    \n-
    271 const Criterion& crit,
    \n-
    272 const typename AMGType::SmootherArgs& args)
    \n-
    273 : amg_(op, crit,args), first_(true)
    \n-
    274 {}
    \n-
    275
    \n-
    276 void apply(X& x, X& b, [[maybe_unused]] double reduction, [[maybe_unused]] InverseOperatorResult& res)
    \n-
    277 {
    \n-
    278 if(first_)
    \n-
    279 {
    \n-
    280 amg_.pre(x,b);
    \n-
    281 first_=false;
    \n-
    282 x_=x;
    \n-
    283 }
    \n-
    284 amg_.apply(x,b);
    \n-
    285 }
    \n-
    286
    \n-
    287 void apply(X& x, X& b, InverseOperatorResult& res)
    \n-
    288 {
    \n-
    289 return apply(x,b,1e-8,res);
    \n-
    290 }
    \n-
    291
    \n-
    293 virtual SolverCategory::Category category() const
    \n-
    294 {
    \n-
    295 return amg_.category();
    \n-
    296 }
    \n-
    297
    \n-
    298 ~AMGInverseOperator()
    \n-
    299 {
    \n-
    300 if(!first_)
    \n-
    301 amg_.post(x_);
    \n-
    302 }
    \n-
    303 AMGInverseOperator(const AMGInverseOperator& other)
    \n-
    304 : x_(other.x_), amg_(other.amg_), first_(other.first_)
    \n-
    305 {
    \n-
    306 }
    \n-
    307 private:
    \n-
    308 X x_;
    \n-
    309 AMGType amg_;
    \n-
    310 bool first_;
    \n-
    311 };
    \n-
    312
    \n-
    313public:
    \n-
    315 typedef AMGInverseOperator CoarseLevelSolver;
    \n-
    316
    \n-
    324 template<class P>
    \n-
    \n-\n-
    326 {
    \n-
    327 coarseOperator_=transferPolicy.getCoarseLevelOperator();
    \n-
    328 AMGInverseOperator* inv = new AMGInverseOperator(*coarseOperator_,
    \n-
    329 criterion_,
    \n-
    330 smootherArgs_);
    \n-
    331
    \n-
    332 return inv; //std::shared_ptr<InverseOperator<X,X> >(inv);
    \n-
    333
    \n-
    334 }
    \n-
    \n-
    335
    \n-
    336private:
    \n-
    338 std::shared_ptr<Operator> coarseOperator_;
    \n-
    340 SmootherArgs smootherArgs_;
    \n-
    342 Criterion criterion_;
    \n-
    343};
    \n-
    \n-
    344
    \n-
    350template<class FO, class CSP, class S>
    \n-
    \n-\n-
    352 public Preconditioner<typename FO::domain_type, typename FO::range_type>
    \n-
    353{
    \n-
    354public:
    \n-\n-
    358 typedef typename CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver;
    \n-\n-
    367 typedef typename FineOperatorType::range_type FineRangeType;
    \n-
    371 typedef typename FineOperatorType::domain_type FineDomainType;
    \n-
    376 typedef typename CSP::Operator CoarseOperatorType;
    \n-
    380 typedef typename CoarseOperatorType::range_type CoarseRangeType;
    \n-
    384 typedef typename CoarseOperatorType::domain_type CoarseDomainType;
    \n-
    388 typedef S SmootherType;
    \n-
    389
    \n-
    \n-\n-
    405 std::shared_ptr<SmootherType> smoother,
    \n-\n-
    407 CoarseOperatorType>& policy,
    \n-
    408 CoarseLevelSolverPolicy& coarsePolicy,
    \n-
    409 std::size_t preSteps=1, std::size_t postSteps=1)
    \n-
    410 : operator_(&op), smoother_(smoother),
    \n-
    411 preSteps_(preSteps), postSteps_(postSteps)
    \n-
    412 {
    \n-
    413 policy_ = policy.clone();
    \n-
    414 policy_->createCoarseLevelSystem(*operator_);
    \n-
    415 coarseSolver_=coarsePolicy.createCoarseLevelSolver(*policy_);
    \n-
    416 }
    \n-
    \n-
    417
    \n-
    \n-\n-
    419 : operator_(other.operator_), coarseSolver_(new CoarseLevelSolver(*other.coarseSolver_)),
    \n-
    420 smoother_(other.smoother_), policy_(other.policy_->clone()),
    \n-
    421 preSteps_(other.preSteps_), postSteps_(other.postSteps_)
    \n-
    422 {}
    \n-
    \n-
    423
    \n-
    \n-\n-
    425 {
    \n-
    426 // Each instance has its own policy.
    \n-
    427 delete policy_;
    \n-
    428 delete coarseSolver_;
    \n-
    429 }
    \n-
    \n-
    430
    \n-
    \n-\n-
    432 {
    \n-
    433 smoother_->pre(x,b);
    \n-
    434 }
    \n-
    \n-
    435
    \n-
    \n-
    436 void post([[maybe_unused]] FineDomainType& x)
    \n-
    437 {}
    \n-
    \n-
    438
    \n-
    \n-\n-
    440 {
    \n-
    441 FineDomainType u(v);
    \n-
    442 FineRangeType rhs(d);
    \n-
    443 LevelContext context;
    \n-\n-
    445 context.pinfo=&info;
    \n-
    446 context.lhs=&u;
    \n-
    447 context.update=&v;
    \n-
    448 context.smoother=smoother_;
    \n-
    449 context.rhs=&rhs;
    \n-
    450 context.matrix=operator_;
    \n-
    451 // Presmoothing
    \n-
    452 presmooth(context, preSteps_);
    \n-
    453 //Coarse grid correction
    \n-
    454 policy_->moveToCoarseLevel(*context.rhs);
    \n-\n-
    456 coarseSolver_->apply(policy_->getCoarseLevelLhs(), policy_->getCoarseLevelRhs(), res);
    \n-
    457 *context.lhs=0;
    \n-
    458 policy_->moveToFineLevel(*context.lhs);
    \n-
    459 *context.update += *context.lhs;
    \n-
    460 // Postsmoothing
    \n-
    461 postsmooth(context, postSteps_);
    \n-
    462
    \n-
    463 }
    \n-
    \n-
    464
    \n-
    \n-\n-
    467 {
    \n-\n-
    469 }
    \n-
    \n-
    470
    \n-
    471private:
    \n-
    475 struct LevelContext
    \n-
    476 {
    \n-
    478 typedef S SmootherType;
    \n-
    480 std::shared_ptr<SmootherType> smoother;
    \n-
    482 FineDomainType* lhs;
    \n-
    483 /*
    \n-
    484 * @brief The right hand side holding the current residual.
    \n-
    485 *
    \n-
    486 * This is passed to the smoother as the right hand side.
    \n-
    487 */
    \n-
    488 FineRangeType* rhs;
    \n-
    494 FineDomainType* update;
    \n-\n-
    502 const FineOperatorType* matrix;
    \n-
    503 };
    \n-
    504 const FineOperatorType* operator_;
    \n-
    506 CoarseLevelSolver* coarseSolver_;
    \n-
    508 std::shared_ptr<S> smoother_;
    \n-
    510 LevelTransferPolicy<FO,typename CSP::Operator>* policy_;
    \n-
    512 std::size_t preSteps_;
    \n-
    514 std::size_t postSteps_;
    \n-
    515};
    \n-
    \n-
    516}// end namespace Amg
    \n-
    517}// end namespace Dune
    \n-
    518
    \n-
    520#endif
    \n-
    Provides a class for building the galerkin product based on a aggregation scheme.
    \n-
    The AMG preconditioner.
    \n-
    Define general, extensible interface for inverse operators.
    \n-
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n-
    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
    \n-
    SmootherTraits< Smoother >::Arguments SmootherArgs
    The argument type for the construction of the smoother.
    Definition amg.hh:100
    \n-
    Operator Operator
    The matrix operator type.
    Definition amg.hh:73
    \n-
    void presmooth(LevelContext &levelContext, size_t steps)
    Apply pre smoothing on the current level.
    Definition smoother.hh:406
    \n-
    void postsmooth(LevelContext &levelContext, size_t steps)
    Apply post smoothing on the current level.
    Definition smoother.hh:428
    \n-
    void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
    Calculate the galerkin product.
    \n+
    209} // end namespace Dune
    \n+
    210
    \n+
    211#endif
    \n+
    Implementation of the BCRSMatrix class.
    \n+
    Helper functions for determining the vector/matrix block level.
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n
    Definition allocator.hh:11
    \n-
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n-
    Parallel algebraic multigrid based on agglomeration.
    Definition amg.hh:65
    \n-
    Class representing the properties of an edge in the matrix graph.
    Definition dependency.hh:39
    \n-
    Class representing a node in the matrix graph.
    Definition dependency.hh:126
    \n-
    Definition galerkin.hh:118
    \n-
    The (undirected) graph of a matrix.
    Definition graph.hh:51
    \n-
    Attaches properties to the edges and vertices of a graph.
    Definition graph.hh:978
    \n-
    VertexDescriptor maxVertex() const
    Get the maximal vertex descriptor.
    \n-
    Definition indicescoarsener.hh:36
    \n-
    Definition pinfo.hh:28
    \n-
    The default class for the smoother arguments.
    Definition smoother.hh:38
    \n-
    Definition transfer.hh:32
    \n-
    Abstract base class for transfer between levels and creation of the coarse level system.
    Definition twolevelmethod.hh:38
    \n-
    CO CoarseOperatorType
    The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
    Definition twolevelmethod.hh:57
    \n-
    virtual void moveToCoarseLevel(const FineRangeType &fineRhs)=0
    Transfers the data to the coarse level.
    \n-
    FineOperatorType::range_type FineRangeType
    The type of the range of the fine level operator.
    Definition twolevelmethod.hh:48
    \n-
    virtual void createCoarseLevelSystem(const FineOperatorType &fineOperator)=0
    Algebraically creates the coarse level system.
    \n-
    CoarseOperatorType::range_type CoarseRangeType
    The type of the range of the coarse level operator.
    Definition twolevelmethod.hh:61
    \n-
    virtual ~LevelTransferPolicy()
    Destructor.
    Definition twolevelmethod.hh:124
    \n-
    CoarseDomainType lhs_
    The coarse level lhs.
    Definition twolevelmethod.hh:130
    \n-
    virtual LevelTransferPolicy * clone() const =0
    Clone the current object.
    \n-
    CoarseDomainType & getCoarseLevelLhs()
    Get the coarse level left hand side.
    Definition twolevelmethod.hh:87
    \n-
    std::shared_ptr< CoarseOperatorType > operator_
    the coarse level linear operator.
    Definition twolevelmethod.hh:132
    \n-
    CoarseRangeType rhs_
    The coarse level rhs.
    Definition twolevelmethod.hh:128
    \n-
    virtual void moveToFineLevel(FineDomainType &fineLhs)=0
    Updates the fine level linear system after the correction of the coarse levels system.
    \n-
    std::shared_ptr< CoarseOperatorType > & getCoarseLevelOperator()
    Get the coarse level operator.
    Definition twolevelmethod.hh:70
    \n-
    CoarseRangeType & getCoarseLevelRhs()
    Get the coarse level right hand side.
    Definition twolevelmethod.hh:78
    \n-
    FO FineOperatorType
    The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
    Definition twolevelmethod.hh:44
    \n-
    CoarseOperatorType::domain_type CoarseDomainType
    The type of the domain of the coarse level operator.
    Definition twolevelmethod.hh:65
    \n-
    FineOperatorType::domain_type FineDomainType
    The type of the domain of the fine level operator.
    Definition twolevelmethod.hh:52
    \n-
    A LeveTransferPolicy that used aggregation to construct the coarse level system.
    Definition twolevelmethod.hh:143
    \n-
    C Criterion
    Definition twolevelmethod.hh:147
    \n-
    AggregationLevelTransferPolicy(const Criterion &crit)
    Definition twolevelmethod.hh:150
    \n-
    AggregationLevelTransferPolicy * clone() const
    Clone the current object.
    Definition twolevelmethod.hh:214
    \n-
    void moveToFineLevel(typename FatherType::FineDomainType &fineLhs)
    Updates the fine level linear system after the correction of the coarse levels system.
    Definition twolevelmethod.hh:207
    \n-
    void moveToCoarseLevel(const typename FatherType::FineRangeType &fineRhs)
    Definition twolevelmethod.hh:200
    \n-
    SequentialInformation ParallelInformation
    Definition twolevelmethod.hh:148
    \n-
    LevelTransferPolicy< O, O > FatherType
    Definition twolevelmethod.hh:146
    \n-
    void createCoarseLevelSystem(const O &fineOperator)
    Algebraically creates the coarse level system.
    Definition twolevelmethod.hh:154
    \n-
    A policy class for solving the coarse level system using one step of AMG.
    Definition twolevelmethod.hh:234
    \n-
    OneStepAMGCoarseSolverPolicy(const SmootherArgs &args, const Criterion &c)
    Constructs the coarse solver policy.
    Definition twolevelmethod.hh:253
    \n-
    AMGInverseOperator CoarseLevelSolver
    The type of solver constructed for the coarse level.
    Definition twolevelmethod.hh:315
    \n-
    OneStepAMGCoarseSolverPolicy(const OneStepAMGCoarseSolverPolicy &other)
    Copy constructor.
    Definition twolevelmethod.hh:257
    \n-
    O::range_type X
    The type of the range and domain of the operator.
    Definition twolevelmethod.hh:239
    \n-
    C Criterion
    The type of the crition used for the aggregation within AMG.
    Definition twolevelmethod.hh:241
    \n-
    Dune::Amg::SmootherTraits< S >::Arguments SmootherArgs
    The type of the arguments used for constructing the smoother.
    Definition twolevelmethod.hh:245
    \n-
    O Operator
    The type of the linear operator used.
    Definition twolevelmethod.hh:237
    \n-
    AMG< Operator, X, Smoother > AMGType
    The type of the AMG construct on the coarse level.
    Definition twolevelmethod.hh:247
    \n-
    CoarseLevelSolver * createCoarseLevelSolver(P &transferPolicy)
    Constructs a coarse level solver.
    Definition twolevelmethod.hh:325
    \n-
    S Smoother
    The type of the smoother used in AMG.
    Definition twolevelmethod.hh:243
    \n-
    Definition twolevelmethod.hh:353
    \n-
    CoarseOperatorType::range_type CoarseRangeType
    The type of the range of the coarse level operator.
    Definition twolevelmethod.hh:380
    \n-
    FineOperatorType::domain_type FineDomainType
    The type of the domain of the fine level operator.
    Definition twolevelmethod.hh:371
    \n-
    TwoLevelMethod(const TwoLevelMethod &other)
    Definition twolevelmethod.hh:418
    \n-
    void pre(FineDomainType &x, FineRangeType &b)
    Definition twolevelmethod.hh:431
    \n-
    FO FineOperatorType
    The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
    Definition twolevelmethod.hh:363
    \n-
    CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver
    The type of the coarse level solver.
    Definition twolevelmethod.hh:358
    \n-
    void apply(FineDomainType &v, const FineRangeType &d)
    Definition twolevelmethod.hh:439
    \n-
    CSP CoarseLevelSolverPolicy
    The type of the policy for constructing the coarse level solver.
    Definition twolevelmethod.hh:356
    \n-
    CoarseOperatorType::domain_type CoarseDomainType
    The type of the domain of the coarse level operator.
    Definition twolevelmethod.hh:384
    \n-
    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
    \n-
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition twolevelmethod.hh:466
    \n-
    FineOperatorType::range_type FineRangeType
    The type of the range of the fine level operator.
    Definition twolevelmethod.hh:367
    \n-
    ~TwoLevelMethod()
    Definition twolevelmethod.hh:424
    \n-
    CSP::Operator CoarseOperatorType
    The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
    Definition twolevelmethod.hh:376
    \n-
    void post(FineDomainType &x)
    Definition twolevelmethod.hh:436
    \n-
    S SmootherType
    The type of the fine level smoother.
    Definition twolevelmethod.hh:388
    \n-
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n-
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n-
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n-
    virtual void apply(X &x, X &b, InverseOperatorResult &res)=0
    Apply inverse operator,.
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    void endrowsizes()
    indicate that size of all rows is defined
    Definition bcrsmatrix.hh:1146
    \n+
    @ random
    Build entries randomly.
    Definition bcrsmatrix.hh:526
    \n+
    void addindex(size_type row, size_type col)
    add index (row,col) to the matrix
    Definition bcrsmatrix.hh:1188
    \n+
    void endindices()
    indicate that all indices are defined, check consistency
    Definition bcrsmatrix.hh:1269
    \n+
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n+
    void setSize(size_type rows, size_type columns, size_type nnz=0)
    Set the size of the matrix.
    Definition bcrsmatrix.hh:858
    \n+
    BCRSMatrix & operator=(const BCRSMatrix &Mat)
    assignment
    Definition bcrsmatrix.hh:908
    \n+
    A block-tridiagonal matrix.
    Definition btdmatrix.hh:31
    \n+
    BTDMatrix(size_type size)
    Definition btdmatrix.hh:54
    \n+
    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:121
    \n+
    A::size_type size_type
    implement row_type with compressed vector
    Definition btdmatrix.hh:49
    \n+
    A allocator_type
    export the allocator type
    Definition btdmatrix.hh:43
    \n+
    B block_type
    export the type representing the components
    Definition btdmatrix.hh:40
    \n+
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition btdmatrix.hh:37
    \n+
    BTDMatrix & operator=(const BTDMatrix &other)
    assignment
    Definition btdmatrix.hh:104
    \n+
    BTDMatrix()
    Default constructor.
    Definition btdmatrix.hh:52
    \n+
    void setSize(size_type size)
    Resize the matrix. Invalidates the content!
    Definition btdmatrix.hh:77
    \n+
    typename FieldTraits< field_type >::real_type real_type
    Definition btdmatrix.hh:204
    \n+
    typename BTDMatrix< B, A >::field_type field_type
    Definition btdmatrix.hh:203
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,663 +1,281 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-twolevelmethod.hh\n+btdmatrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_TWOLEVELMETHOD_HH\n-6#define DUNE_ISTL_TWOLEVELMETHOD_HH\n+5#ifndef DUNE_ISTL_BTDMATRIX_HH\n+6#define DUNE_ISTL_BTDMATRIX_HH\n 7\n-8#include \n-9\n-10#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n-11#include\"_\ba_\bm_\bg_\b._\bh_\bh\"\n-12#include\"_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\"\n-13#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n-14\n-22namespace _\bD_\bu_\bn_\be\n-23{\n-24namespace Amg\n-25{\n-26\n-36template\n-_\b3_\b7class _\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-38{\n-39public:\n-_\b4_\b4 typedef FO _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be;\n-_\b4_\b8 typedef typename FineOperatorType::range_type _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n-_\b5_\b2 typedef typename FineOperatorType::domain_type _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n-_\b5_\b7 typedef CO _\bC_\bo_\ba_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be;\n-_\b6_\b1 typedef typename CoarseOperatorType::range_type _\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n-_\b6_\b5 typedef typename CoarseOperatorType::domain_type _\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n-_\b7_\b0 std::shared_ptr& _\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br()\n-71 {\n-72 return _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n-73 }\n-_\b7_\b8 _\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& _\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bR_\bh_\bs()\n-79 {\n-80 return _\br_\bh_\bs_\b_;\n-81 }\n-82\n-_\b8_\b7 _\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& _\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bL_\bh_\bs()\n-88 {\n-89 return _\bl_\bh_\bs_\b_;\n-90 }\n-_\b1_\b0_\b0 virtual void _\bm_\bo_\bv_\be_\bT_\bo_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl(const _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& fineRhs)=0;\n-_\b1_\b1_\b0 virtual void _\bm_\bo_\bv_\be_\bT_\bo_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl(_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& fineLhs)=0;\n-_\b1_\b1_\b8 virtual void _\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\by_\bs_\bt_\be_\bm(const _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be&\n-fineOperator)=0;\n-119\n-_\b1_\b2_\b1 virtual _\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by* _\bc_\bl_\bo_\bn_\be() const =0;\n+8#include \n+9#include \n+10#include \n+11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+13\n+19namespace _\bD_\bu_\bn_\be {\n+29 template >\n+_\b3_\b0 class _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx : public _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+31 {\n+32 public:\n+33\n+34 //===== type definitions and constants\n+35\n+_\b3_\b7 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n+38\n+_\b4_\b0 typedef B _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+41\n+_\b4_\b3 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n+44\n+46 //typedef BCRSMatrix::row_type row_type;\n+47\n+_\b4_\b9 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+50\n+_\b5_\b2 _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx() : _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx() {}\n+53\n+_\b5_\b4 explicit _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size)\n+55 : _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx(size, size, _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx::_\br_\ba_\bn_\bd_\bo_\bm)\n+56 {\n+57 // Set number of entries for each row\n+58 // All rows get three entries, except for the first and the last one\n+59 for (size_t i=0; i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be(i, 3 - (i==0) - (i==(size-1)));\n+61\n+62 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs();\n+63\n+64 // The actual entries for each row\n+65 for (size_t i=0; i0)\n+67 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i-1);\n+68 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i );\n+69 if (i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i+1);\n+71 }\n+72\n+73 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs();\n+74 }\n+75\n+_\b7_\b7 void _\bs_\be_\bt_\bS_\bi_\bz_\be(size_type size)\n+78 {\n+79 auto nonZeros = (size==0) ? 0 : size + 2*(size-1);\n+80 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be(size, // rows\n+81 size, // columns\n+82 nonZeros);\n+83\n+84 // Set number of entries for each row\n+85 // All rows get three entries, except for the first and the last one\n+86 for (size_t i=0; i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be(i, 3 - (i==0) - (i==(size-1)));\n+88\n+89 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs();\n+90\n+91 // The actual entries for each row\n+92 for (size_t i=0; i0)\n+94 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i-1);\n+95 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i );\n+96 if (i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i+1);\n+98 }\n+99\n+100 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs();\n+101 }\n+102\n+_\b1_\b0_\b4 _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx& other) {\n+105 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(other);\n+106 return *this;\n+107 }\n+108\n+_\b1_\b1_\b0 _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k) {\n+111 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(k);\n+112 return *this;\n+113 }\n+114\n+120 template \n+_\b1_\b2_\b1 void _\bs_\bo_\bl_\bv_\be (V& x, const V& rhs) const {\n 122\n-_\b1_\b2_\b4 virtual _\b~_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by(){}\n-125\n-126 protected:\n-_\b1_\b2_\b8 _\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be _\br_\bh_\bs_\b_;\n-_\b1_\b3_\b0 _\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be _\bl_\bh_\bs_\b_;\n-_\b1_\b3_\b2 std::shared_ptr _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n-133};\n-134\n-140template\n-_\b1_\b4_\b1class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-142 : public _\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-143{\n-144 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b>\n-_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp;\n-145public:\n-_\b1_\b4_\b6 typedef _\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bO_\b,_\bO_\b> _\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be;\n-_\b1_\b4_\b7 typedef C _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn;\n-_\b1_\b4_\b8 typedef _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n-149\n-_\b1_\b5_\b0 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by(const _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn& crit)\n-151 : criterion_(crit)\n-152 {}\n-153\n-_\b1_\b5_\b4 void _\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\by_\bs_\bt_\be_\bm(const O& fineOperator)\n-155 {\n-156 prolongDamp_ = criterion_.getProlongationDampingFactor();\n-157 _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b> productBuilder;\n-158 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b>\n-_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh;\n-159 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh,_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n-160 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,Dune::IdentityMap,Dune::IdentityMap>\n-_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh;\n-161 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh mg(fineOperator.getmat());\n-162 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh pg(mg,Dune::IdentityMap(),Dune::IdentityMap());\n-163 typedef NegateSet OverlapFlags;\n-164\n-165 aggregatesMap_ = std::make_shared(pg._\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx()+1);\n-166\n-167 int noAggregates, isoAggregates, oneAggregates, skippedAggregates;\n-168\n-169 std::tie(noAggregates, isoAggregates, oneAggregates, skippedAggregates) =\n-170 aggregatesMap_->buildAggregates(fineOperator.getmat(), pg, criterion_,\n-true);\n-171 std::cout<<\"no aggregates=\"<\n-renumberer;\n-174 typedef std::vector::iterator Iterator;\n-175 typedef Dune::IteratorPropertyMap VisitedMap;\n-176 std::vector excluded(fineOperator.getmat().N(), false);\n-177 VisitedMap vm(excluded.begin(), Dune::IdentityMap());\n-178 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn pinfo;\n-179 std::size_t aggregates = renumberer.coarsen(pinfo, pg, vm,\n-180 *aggregatesMap_, pinfo,\n-181 noAggregates);\n-182 std::vector& visited=excluded;\n+123 // special handling for 1x1 matrices. The generic algorithm doesn't work\n+for them\n+124 if (this->_\bN()==1) {\n+125 auto&& x0 = Impl::asVector(x[0]);\n+126 auto&& rhs0 = Impl::asVector(rhs[0]);\n+127 Impl::asMatrix((*this)[0][0]).solve(x0, rhs0);\n+128 return;\n+129 }\n+130\n+131 // Make copies of the rhs and the right matrix band\n+132 V d = rhs;\n+133 std::vector c(this->_\bN()-1);\n+134 for (size_t i=0; i_\bN()-1; i++)\n+135 c[i] = (*this)[i][i+1];\n+136\n+137 /* Modify the coefficients. */\n+138 _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be a_00_inv = (*this)[0][0];\n+139 Impl::asMatrix(a_00_inv).invert();\n+140\n+141 //c[0] /= (*this)[0][0]; /* Division by zero risk. */\n+142 _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be tmp = a_00_inv;\n+143 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[0]));\n+144 c[0] = tmp;\n+145\n+146 // d = a^{-1} d /* Division by zero would imply a singular matrix. */\n+147 auto d_0_tmp = d[0];\n+148 auto&& d_0 = Impl::asVector(d[0]);\n+149 Impl::asMatrix(a_00_inv).mv(Impl::asVector(d_0_tmp),d_0);\n+150\n+151 for (unsigned int i = 1; i < this->_\bN(); i++) {\n+152\n+153 // id = ( a_ii - c_{i-1} a_{i, i-1} ) ^{-1}\n+154 _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be tmp;\n+155 tmp = (*this)[i][i-1];\n+156 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[i-1]));\n+157\n+158 _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be id = (*this)[i][i];\n+159 id -= tmp;\n+160 Impl::asMatrix(id).invert(); /* Division by zero risk. */\n+161\n+162 if (i_\bN() - 1] = d[this->_\bN() - 1];\n+175 for (int i = this->_\bN() - 2; i >= 0; i--) {\n+176 //x[i] = d[i] - c[i] * x[i + 1];\n+177 x[i] = d[i];\n+178 auto&& x_i = Impl::asVector(x[i]);\n+179 Impl::asMatrix(c[i]).mmv(Impl::asVector(x[i+1]), x_i);\n+180 }\n+181\n+182 }\n 183\n-184 typedef std::vector::iterator Iterator;\n+184 private:\n 185\n-186 for(Iterator iter= visited.begin(), end=visited.end();\n-187 iter != end; ++iter)\n-188 *iter=false;\n-189 matrix_.reset(productBuilder._\bb_\bu_\bi_\bl_\bd(mg, vm,\n-190 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(),\n-191 *aggregatesMap_,\n-192 aggregates,\n-193 OverlapFlags()));\n-194 productBuilder._\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be(fineOperator.getmat(), *aggregatesMap_, *matrix_,\n-pinfo, OverlapFlags());\n-195 this->_\bl_\bh_\bs_\b_.resize(this->matrix_->M());\n-196 this->_\br_\bh_\bs_\b_.resize(this->matrix_->N());\n-197 this->_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b_ = std::make_shared(*matrix_);\n-198 }\n+186 // ////////////////////////////////////////////////////////////////////////\n+////\n+187 // The following methods from the base class should now actually be called\n+188 // ////////////////////////////////////////////////////////////////////////\n+////\n+189\n+190 // createbegin and createend should be in there, too, but I can't get it to\n+compile\n+191 // BCRSMatrix::CreateIterator createbegin () {}\n+192 // BCRSMatrix::CreateIterator createend () {}\n+193 void setrowsize (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s) {}\n+194 void incrementrowsize (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) {}\n+195 void endrowsizes () {}\n+196 void addindex (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl) {}\n+197 void endindices () {}\n+198 };\n 199\n-_\b2_\b0_\b0 void _\bm_\bo_\bv_\be_\bT_\bo_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl(const typename _\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b:_\b:_\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& fineRhs)\n-201 {\n-202 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b:_\b:\n-_\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>\n-203_\b _\b:_\b:_\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(*aggregatesMap_, this->_\br_\bh_\bs_\b_, fineRhs, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-());\n-204 this->_\bl_\bh_\bs_\b_=0;\n-205 }\n+200 template\n+_\b2_\b0_\b1 struct FieldTraits< _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx >\n+202 {\n+_\b2_\b0_\b3 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\b _\bA_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b2_\b0_\b4 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename FieldTraits::real_type;\n+205 };\n 206\n-_\b2_\b0_\b7 void _\bm_\bo_\bv_\be_\bT_\bo_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl(typename _\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b:_\b:_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& fineLhs)\n-208 {\n-209 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b:_\b:\n-_\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>\n-210_\b _\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(*aggregatesMap_, this->_\bl_\bh_\bs_\b_, fineLhs,\n-211 prolongDamp_, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n-212 }\n-213\n-_\b2_\b1_\b4 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by* _\bc_\bl_\bo_\bn_\be() const\n-215 {\n-216 return new _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by(*this);\n-217 }\n-218\n-219private:\n-220 typename O::matrix_type::field_type prolongDamp_;\n-221 std::shared_ptr aggregatesMap_;\n-222 _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn criterion_;\n-223 std::shared_ptr matrix_;\n-224};\n-225\n-232template\n-_\b2_\b3_\b3class _\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-234{\n-235public:\n-_\b2_\b3_\b7 typedef O _\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n-_\b2_\b3_\b9 typedef typename O::range_type _\bX;\n-_\b2_\b4_\b1 typedef C _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn;\n-_\b2_\b4_\b3 typedef S _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n-_\b2_\b4_\b5 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n-_\b2_\b4_\b7 typedef _\bA_\bM_\bG_\b<_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\bX_\b,_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b> _\bA_\bM_\bG_\bT_\by_\bp_\be;\n-_\b2_\b5_\b3 _\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by(const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& args, const _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn& c)\n-254 : smootherArgs_(args), criterion_(c)\n-255 {}\n-_\b2_\b5_\b7 _\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by(const _\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by& other)\n-258 : coarseOperator_(other.coarseOperator_), smootherArgs_\n-(other.smootherArgs_),\n-259 criterion_(other.criterion_)\n-260 {}\n-261private:\n-268 struct AMGInverseOperator : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-269 {\n-270 AMGInverseOperator(const typename _\bA_\bM_\bG_\bT_\by_\bp_\be_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br& op,\n-271 const _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn& crit,\n-272 const typename _\bA_\bM_\bG_\bT_\by_\bp_\be_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& args)\n-273 : amg_(op, crit,args), first_(true)\n-274 {}\n-275\n-276 void apply(_\bX& x, _\bX& b, [[maybe_unused]] double reduction, [[maybe_unused]]\n-_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n-277 {\n-278 if(first_)\n-279 {\n-280 amg_.pre(x,b);\n-281 first_=false;\n-282 x_=x;\n-283 }\n-284 amg_.apply(x,b);\n-285 }\n-286\n-287 void _\ba_\bp_\bp_\bl_\by(_\bX& x, _\bX& b, InverseOperatorResult& res)\n-288 {\n-289 return _\ba_\bp_\bp_\bl_\by(x,b,1e-8,res);\n-290 }\n-291\n-293 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category() const\n-294 {\n-295 return amg_.category();\n-296 }\n-297\n-298 ~AMGInverseOperator()\n-299 {\n-300 if(!first_)\n-301 amg_.post(x_);\n-302 }\n-303 AMGInverseOperator(const AMGInverseOperator& other)\n-304 : x_(other.x_), amg_(other.amg_), first_(other.first_)\n-305 {\n-306 }\n-307 private:\n-308 _\bX x_;\n-309 _\bA_\bM_\bG_\bT_\by_\bp_\be amg_;\n-310 bool first_;\n-311 };\n-312\n-313public:\n-_\b3_\b1_\b5 typedef AMGInverseOperator _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br;\n-316\n-324 template\n-_\b3_\b2_\b5 _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br* _\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br(P& transferPolicy)\n-326 {\n-327 coarseOperator_=transferPolicy.getCoarseLevelOperator();\n-328 AMGInverseOperator* inv = new AMGInverseOperator(*coarseOperator_,\n-329 criterion_,\n-330 smootherArgs_);\n-331\n-332 return inv; //std::shared_ptr >(inv);\n-333\n-334 }\n-335\n-336private:\n-338 std::shared_ptr coarseOperator_;\n-340 _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs smootherArgs_;\n-342 _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn criterion_;\n-343};\n-344\n-350template\n-_\b3_\b5_\b1class _\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd :\n-352 public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-353{\n-354public:\n-_\b3_\b5_\b6 typedef CSP _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by;\n-_\b3_\b5_\b8 typedef typename CoarseLevelSolverPolicy::CoarseLevelSolver\n-_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br;\n-_\b3_\b6_\b3 typedef FO _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be;\n-_\b3_\b6_\b7 typedef typename FineOperatorType::range_type _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n-_\b3_\b7_\b1 typedef typename FineOperatorType::domain_type _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n-_\b3_\b7_\b6 typedef typename CSP::Operator _\bC_\bo_\ba_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be;\n-_\b3_\b8_\b0 typedef typename CoarseOperatorType::range_type _\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n-_\b3_\b8_\b4 typedef typename CoarseOperatorType::domain_type _\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n-_\b3_\b8_\b8 typedef S _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be;\n-389\n-_\b4_\b0_\b4 _\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd(const _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be& op,\n-405 std::shared_ptr smoother,\n-406 const _\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by<_\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be,\n-407 _\bC_\bo_\ba_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be>& policy,\n-408 _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by& coarsePolicy,\n-409 std::size_t preSteps=1, std::size_t postSteps=1)\n-410 : operator_(&op), smoother_(smoother),\n-411 preSteps_(preSteps), postSteps_(postSteps)\n-412 {\n-413 policy_ = policy._\bc_\bl_\bo_\bn_\be();\n-414 policy_->_\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\by_\bs_\bt_\be_\bm(*operator_);\n-415 coarseSolver_=coarsePolicy.createCoarseLevelSolver(*policy_);\n-416 }\n-417\n-_\b4_\b1_\b8 _\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd(const _\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd& other)\n-419 : operator_(other.operator_), coarseSolver_(new _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n-(*other.coarseSolver_)),\n-420 smoother_(other.smoother_), policy_(other.policy_->clone()),\n-421 preSteps_(other.preSteps_), postSteps_(other.postSteps_)\n-422 {}\n-423\n-_\b4_\b2_\b4 _\b~_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd()\n-425 {\n-426 // Each instance has its own policy.\n-427 delete policy_;\n-428 delete coarseSolver_;\n-429 }\n-430\n-_\b4_\b3_\b1 void _\bp_\br_\be(_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& x, _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& b)\n-432 {\n-433 smoother_->pre(x,b);\n-434 }\n-435\n-_\b4_\b3_\b6 void _\bp_\bo_\bs_\bt([[maybe_unused]] _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& x)\n-437 {}\n-438\n-_\b4_\b3_\b9 void _\ba_\bp_\bp_\bl_\by(_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& v, const _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& d)\n-440 {\n-441 _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be u(v);\n-442 _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be rhs(d);\n-443 LevelContext context;\n-444 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn info;\n-445 context.pinfo=&info;\n-446 context.lhs=&u;\n-447 context.update=&v;\n-448 context.smoother=smoother_;\n-449 context.rhs=&rhs;\n-450 context.matrix=operator_;\n-451 // Presmoothing\n-452 _\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh(context, preSteps_);\n-453 //Coarse grid correction\n-454 policy_->_\bm_\bo_\bv_\be_\bT_\bo_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl(*context.rhs);\n-455 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt res;\n-456 coarseSolver_->apply(policy_->_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bL_\bh_\bs(), policy_-\n->_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bR_\bh_\bs(), res);\n-457 *context.lhs=0;\n-458 policy_->_\bm_\bo_\bv_\be_\bT_\bo_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl(*context.lhs);\n-459 *context.update += *context.lhs;\n-460 // Postsmoothing\n-461 _\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh(context, postSteps_);\n-462\n-463 }\n-464\n-_\b4_\b6_\b6 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-467 {\n-468 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-469 }\n-470\n-471private:\n-475 struct LevelContext\n-476 {\n-478 typedef S SmootherType;\n-480 std::shared_ptr smoother;\n-482 _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be* lhs;\n-483 /*\n-484 * @brief The right hand side holding the current residual.\n-485 *\n-486 * This is passed to the smoother as the right hand side.\n-487 */\n-488 _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be* rhs;\n-494 _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be* update;\n-496 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn* pinfo;\n-502 const _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be* matrix;\n-503 };\n-504 const _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be* operator_;\n-506 _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br* coarseSolver_;\n-508 std::shared_ptr smoother_;\n-510 LevelTransferPolicy* policy_;\n-512 std::size_t preSteps_;\n-514 std::size_t postSteps_;\n-515};\n-516}// end namespace Amg\n-517}// end namespace Dune\n-518\n-520#endif\n-_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\n-Provides a class for building the galerkin product based on a aggregation\n-scheme.\n-_\ba_\bm_\bg_\b._\bh_\bh\n-The AMG preconditioner.\n-_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n-Define general, extensible interface for inverse operators.\n-_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n-Define general, extensible interface for operators. The available\n-implementation wraps a matrix.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bb_\bu_\bi_\bl_\bd\n-G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation\n-&pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const\n-typename G::Matrix::size_type &size, const Set ©)\n-Calculates the coarse matrix via a Galerkin product.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:563\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b<_\b _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bX_\b,_\b _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b _\b>_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-SmootherTraits< Smoother >::Arguments SmootherArgs\n-The argument type for the construction of the smoother.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b<_\b _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bX_\b,_\b _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b _\b>_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Operator Operator\n-The matrix operator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh\n-void presmooth(LevelContext &levelContext, size_t steps)\n-Apply pre smoothing on the current level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:406\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh\n-void postsmooth(LevelContext &levelContext, size_t steps)\n-Apply post smoothing on the current level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:428\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be\n-void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse,\n-const I &pinfo, const O ©)\n-Calculate the galerkin product.\n+209} // end namespace Dune\n+210\n+211#endif\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n+_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n+Helper functions for determining the vector/matrix block level.\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-Class providing information about the mapping of the vertices onto aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG\n-Parallel algebraic multigrid based on agglomeration.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-Class representing the properties of an edge in the matrix graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-Class representing a node in the matrix graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:118\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-The (undirected) graph of a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n-Attaches properties to the edges and vertices of a graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:978\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx\n-VertexDescriptor maxVertex() const\n-Get the maximal vertex descriptor.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-The default class for the smoother arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:32\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-Abstract base class for transfer between levels and creation of the coarse\n-level system.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be\n-CO CoarseOperatorType\n-The linear operator of the finel level system. Has to be derived from\n-AssembledLinearOperator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bm_\bo_\bv_\be_\bT_\bo_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl\n-virtual void moveToCoarseLevel(const FineRangeType &fineRhs)=0\n-Transfers the data to the coarse level.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n-FineOperatorType::range_type FineRangeType\n-The type of the range of the fine level operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\by_\bs_\bt_\be_\bm\n-virtual void createCoarseLevelSystem(const FineOperatorType &fineOperator)=0\n-Algebraically creates the coarse level system.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n-CoarseOperatorType::range_type CoarseRangeType\n-The type of the range of the coarse level operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\b~_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-virtual ~LevelTransferPolicy()\n-Destructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:124\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bl_\bh_\bs_\b_\n-CoarseDomainType lhs_\n-The coarse level lhs.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:130\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bc_\bl_\bo_\bn_\be\n-virtual LevelTransferPolicy * clone() const =0\n-Clone the current object.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bL_\bh_\bs\n-CoarseDomainType & getCoarseLevelLhs()\n-Get the coarse level left hand side.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b_\n-std::shared_ptr< CoarseOperatorType > operator_\n-the coarse level linear operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\br_\bh_\bs_\b_\n-CoarseRangeType rhs_\n-The coarse level rhs.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:128\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bm_\bo_\bv_\be_\bT_\bo_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl\n-virtual void moveToFineLevel(FineDomainType &fineLhs)=0\n-Updates the fine level linear system after the correction of the coarse levels\n-system.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-std::shared_ptr< CoarseOperatorType > & getCoarseLevelOperator()\n-Get the coarse level operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bR_\bh_\bs\n-CoarseRangeType & getCoarseLevelRhs()\n-Get the coarse level right hand side.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be\n-FO FineOperatorType\n-The linear operator of the finel level system. Has to be derived from\n-AssembledLinearOperator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n-CoarseOperatorType::domain_type CoarseDomainType\n-The type of the domain of the coarse level operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n-FineOperatorType::domain_type FineDomainType\n-The type of the domain of the fine level operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-A LeveTransferPolicy that used aggregation to construct the coarse level\n-system.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:143\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-C Criterion\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:147\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-AggregationLevelTransferPolicy(const Criterion &crit)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bc_\bl_\bo_\bn_\be\n-AggregationLevelTransferPolicy * clone() const\n-Clone the current object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:214\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bm_\bo_\bv_\be_\bT_\bo_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl\n-void moveToFineLevel(typename FatherType::FineDomainType &fineLhs)\n-Updates the fine level linear system after the correction of the coarse levels\n-system.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:207\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bm_\bo_\bv_\be_\bT_\bo_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl\n-void moveToCoarseLevel(const typename FatherType::FineRangeType &fineRhs)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:200\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-SequentialInformation ParallelInformation\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:148\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be\n-LevelTransferPolicy< O, O > FatherType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:146\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\by_\bs_\bt_\be_\bm\n-void createCoarseLevelSystem(const O &fineOperator)\n-Algebraically creates the coarse level system.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:154\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-A policy class for solving the coarse level system using one step of AMG.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:234\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-OneStepAMGCoarseSolverPolicy(const SmootherArgs &args, const Criterion &c)\n-Constructs the coarse solver policy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:253\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n-AMGInverseOperator CoarseLevelSolver\n-The type of solver constructed for the coarse level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:315\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-OneStepAMGCoarseSolverPolicy(const OneStepAMGCoarseSolverPolicy &other)\n-Copy constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:257\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bX\n-O::range_type X\n-The type of the range and domain of the operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:239\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-C Criterion\n-The type of the crition used for the aggregation within AMG.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:241\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-Dune::Amg::SmootherTraits< S >::Arguments SmootherArgs\n-The type of the arguments used for constructing the smoother.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:245\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-O Operator\n-The type of the linear operator used.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:237\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bA_\bM_\bG_\bT_\by_\bp_\be\n-AMG< Operator, X, Smoother > AMGType\n-The type of the AMG construct on the coarse level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:247\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n-CoarseLevelSolver * createCoarseLevelSolver(P &transferPolicy)\n-Constructs a coarse level solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:325\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n-S Smoother\n-The type of the smoother used in AMG.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:243\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:353\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n-CoarseOperatorType::range_type CoarseRangeType\n-The type of the range of the coarse level operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:380\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n-FineOperatorType::domain_type FineDomainType\n-The type of the domain of the fine level operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:371\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd\n-TwoLevelMethod(const TwoLevelMethod &other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:418\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bp_\br_\be\n-void pre(FineDomainType &x, FineRangeType &b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:431\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be\n-FO FineOperatorType\n-The linear operator of the finel level system. Has to be derived from\n-AssembledLinearOperator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:363\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n-CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver\n-The type of the coarse level solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:358\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(FineDomainType &v, const FineRangeType &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:439\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n-CSP CoarseLevelSolverPolicy\n-The type of the policy for constructing the coarse level solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:356\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n-CoarseOperatorType::domain_type CoarseDomainType\n-The type of the domain of the coarse level operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:384\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd\n-TwoLevelMethod(const FineOperatorType &op, std::shared_ptr< SmootherType >\n-smoother, const LevelTransferPolicy< FineOperatorType, CoarseOperatorType >\n-&policy, CoarseLevelSolverPolicy &coarsePolicy, std::size_t preSteps=1, std::\n-size_t postSteps=1)\n-Constructs a two level method.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:404\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n-FineOperatorType::range_type FineRangeType\n-The type of the range of the fine level operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:367\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\b~_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd\n-~TwoLevelMethod()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:424\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be\n-CSP::Operator CoarseOperatorType\n-The linear operator of the finel level system. Has to be derived from\n-AssembledLinearOperator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:376\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bp_\bo_\bs_\bt\n-void post(FineDomainType &x)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:436\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be\n-S SmootherType\n-The type of the fine level smoother.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:388\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Base class for matrix free definition of preconditioners.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-Statistics about the application of an inverse operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Abstract base class for all solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bX_\b,_\b _\bX_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &x, X &b, InverseOperatorResult &res)=0\n-Apply inverse operator,.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs\n+void endrowsizes()\n+indicate that size of all rows is defined\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1146\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\ba_\bn_\bd_\bo_\bm\n+@ random\n+Build entries randomly.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:526\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx\n+void addindex(size_type row, size_type col)\n+add index (row,col) to the matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs\n+void endindices()\n+indicate that all indices are defined, check consistency\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1269\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+size_type N() const\n+number of rows (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n+void setSize(size_type rows, size_type columns, size_type nnz=0)\n+Set the size of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:858\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+BCRSMatrix & operator=(const BCRSMatrix &Mat)\n+assignment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:908\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx\n+A block-tridiagonal matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:31\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx\n+BTDMatrix(size_type size)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bo_\bl_\bv_\be\n+void solve(V &x, const V &rhs) const\n+Use the Thomas algorithm to solve the system Ax=b in O(n) time.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:121\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+implement row_type with compressed vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n+A allocator_type\n+export the allocator type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+B block_type\n+export the type representing the components\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< B >::field_type field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+BTDMatrix & operator=(const BTDMatrix &other)\n+assignment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:104\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx\n+BTDMatrix()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n+void setSize(size_type size)\n+Resize the matrix. Invalidates the content!\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+typename FieldTraits< field_type >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:204\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename BTDMatrix< B, A >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:203\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00134.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00134.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: properties.hh File Reference\n+dune-istl: solver.hh File Reference\n \n \n \n \n \n \n \n@@ -65,50 +65,77 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n \n
    \n \n-

    Provides classes for handling internal properties in a graph. \n+

    Define general, extensible interface for inverse operators. \n More...

    \n-
    #include <dune/common/propertymap.hh>
    \n+
    #include <dune-istl-config.hh>
    \n+#include <iomanip>
    \n+#include <ostream>
    \n+#include <string>
    \n+#include <functional>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/shared_ptr.hh>
    \n+#include <dune/common/simd/io.hh>
    \n+#include <dune/common/simd/simd.hh>
    \n+#include <dune/common/parametertree.hh>
    \n+#include <dune/common/timer.hh>
    \n+#include "solvertype.hh"
    \n+#include "preconditioner.hh"
    \n+#include "operators.hh"
    \n+#include "scalarproducts.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::Amg::VertexVisitedTag
     Tag idnetifying the visited property of a vertex. More...
    struct  Dune::InverseOperatorResult
     Statistics about the application of an inverse operator. More...
     
    class  Dune::Amg::RandomAccessBundledPropertyMap< C, K, i, T, R >
     A property map that extracts one property out of a bundle using 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...
     
    \n \n \n \n-\n-\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n

    Detailed Description

    \n-

    Provides classes for handling internal properties in a graph.

    \n-
    Author
    Markus Blatt
    \n+

    Define general, extensible interface for inverse operators.

    \n+

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

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,33 +1,63 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-properties.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Provides classes for handling internal properties in a graph. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n+solver.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs\n+Define general, extensible interface for inverse operators. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \"_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\"\n+#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\"\n+#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n+#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n-\u00a0 Tag idnetifying the visited property of a vertex. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+\u00a0 Statistics about the application of an inverse operator. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b<_\b _\bC_\b,_\b _\bK_\b,_\b _\bi_\b,_\b _\bT_\b,_\b _\bR_\b _\b>\n-\u00a0 A property map that extracts one property out of a bundle using\n- _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b(_\b) _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0 Abstract base class for all solvers. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0 Base class for all implementations of iterative solvers. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bC_\bo_\bu_\bn_\bt_\bT_\by_\bp_\be_\b _\b>\n+\u00a0 Class for controlling iterative methods. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b,_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b _\b>\n+ Helper class for notifying a DUNE-ISTL linear solver about a change of\n+\u00a0 the iteration matrix object in a unified way, i.e. independent from\n+ the solver's type (direct/iterative). _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b,_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b _\b>_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b<\n+ _\bi_\bs_\b__\bd_\bi_\br_\be_\bc_\bt_\b__\bs_\bo_\bl_\bv_\be_\br_\b,_\b _\bD_\bu_\bm_\bm_\by_\b _\b>\n+\u00a0 _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn that works together with iterative _\bI_\bS_\bT_\bL solvers, e.g.\n+ _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br or _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bC_\bG_\bS_\bT_\bA_\bB_\bS_\bo_\bl_\bv_\be_\br. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b,_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b _\b>_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b<\n+ _\bt_\br_\bu_\be_\b,_\b _\bD_\bu_\bm_\bm_\by_\b _\b>\n+\u00a0 _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn that works together with direct _\bI_\bS_\bT_\bL solvers, e.g.\n+ _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU or _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides classes for handling internal properties in a graph.\n- Author\n- Markus Blatt\n+Define general, extensible interface for inverse operators.\n+Implementation here covers only inversion of linear operators, but the\n+implementation might be used for nonlinear operators as well.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00134_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00134_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: properties.hh Source File\n+dune-istl: solver.hh Source File\n \n \n \n \n \n \n \n@@ -70,99 +70,501 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    properties.hh
    \n+
    solver.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_AMG_PROPERTIES_HH
    \n-
    6#define DUNE_ISTL_AMG_PROPERTIES_HH
    \n-
    7
    \n-
    8#include <dune/common/propertymap.hh>
    \n-
    9
    \n-
    10namespace Dune
    \n-
    11{
    \n-
    12
    \n-
    13 namespace Amg
    \n-
    14 {
    \n-
    \n-\n-
    29 {};
    \n-
    \n-
    30
    \n-
    31
    \n-
    38 template<typename C, typename K, std::size_t i,typename T=typename C::ValueType,
    \n-
    39 typename R = typename C::Reference>
    \n-
    \n-\n-
    41 : public RAPropertyMapHelper<R,
    \n-
    42 RandomAccessBundledPropertyMap<C,K,i,T,R> >
    \n-
    43 {
    \n-
    44 public:
    \n-
    46 typedef C Container;
    \n-
    47
    \n-
    49 typedef R Reference;
    \n-
    50
    \n-
    52 typedef K Key;
    \n-
    53
    \n-
    57 typedef LvaluePropertyMapTag Category;
    \n-
    58
    \n-
    59 enum {
    \n-
    61 index = i
    \n-
    62 };
    \n-
    63
    \n-
    \n-
    69 Reference operator[](const Key& key) const
    \n-
    70 {
    \n-
    71 return container_[key][index];
    \n-
    72 }
    \n-
    \n+
    5
    \n+
    6#ifndef DUNE_ISTL_SOLVER_HH
    \n+
    7#define DUNE_ISTL_SOLVER_HH
    \n+
    8
    \n+
    9#include <dune-istl-config.hh> // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n+
    10
    \n+
    11#include <iomanip>
    \n+
    12#include <ostream>
    \n+
    13#include <string>
    \n+
    14#include <functional>
    \n+
    15
    \n+
    16#include <dune/common/exceptions.hh>
    \n+
    17#include <dune/common/shared_ptr.hh>
    \n+
    18#include <dune/common/simd/io.hh>
    \n+
    19#include <dune/common/simd/simd.hh>
    \n+
    20#include <dune/common/parametertree.hh>
    \n+
    21#include <dune/common/timer.hh>
    \n+
    22
    \n+
    23#include "solvertype.hh"
    \n+
    24#include "preconditioner.hh"
    \n+
    25#include "operators.hh"
    \n+
    26#include "scalarproducts.hh"
    \n+
    27
    \n+
    28namespace Dune
    \n+
    29{
    \n+
    \n+\n+
    50 {
    \n+
    \n+\n+
    53 {
    \n+
    54 clear();
    \n+
    55 }
    \n+
    \n+
    56
    \n+
    \n+
    58 void clear ()
    \n+
    59 {
    \n+
    60 iterations = 0;
    \n+
    61 reduction = 0;
    \n+
    62 converged = false;
    \n+
    63 conv_rate = 1;
    \n+
    64 elapsed = 0;
    \n+\n+
    66 }
    \n+
    \n+
    67
    \n+\n+
    70
    \n+
    72 double reduction;
    \n
    73
    \n-
    \n-\n-
    79 : container_(&container)
    \n-
    80 {}
    \n-
    \n-
    81
    \n-
    \n-\n-
    84 : container_(0)
    \n-
    85 {}
    \n+\n+
    76
    \n+
    78 double conv_rate;
    \n+
    79
    \n+
    81 double condition_estimate = -1;
    \n+
    82
    \n+
    84 double elapsed;
    \n+
    85 };
    \n
    \n
    86
    \n-
    87 private:
    \n-
    89 Container* container_;
    \n-
    90 };
    \n-
    \n-
    91 }
    \n-
    92}
    \n-
    93
    \n-
    94#endif
    \n-
    Reference operator[](const Key &key) const
    Get the property for a key.
    Definition properties.hh:69
    \n-
    RandomAccessBundledPropertyMap()
    The default constructor.
    Definition properties.hh:83
    \n-
    R Reference
    The reference type of the container.
    Definition properties.hh:49
    \n-
    RandomAccessBundledPropertyMap(Container &container)
    Constructor.
    Definition properties.hh:78
    \n-
    K Key
    The key of the property map.
    Definition properties.hh:52
    \n-
    LvaluePropertyMapTag Category
    The category of the property map.
    Definition properties.hh:57
    \n-
    C Container
    The container that holds the properties.
    Definition properties.hh:46
    \n-
    @ index
    The index of the property in the bundle.
    Definition properties.hh:61
    \n+
    87
    \n+
    88 //=====================================================================
    \n+
    100 template<class X, class Y>
    \n+
    \n+\n+
    102 public:
    \n+
    104 typedef X domain_type;
    \n+
    105
    \n+
    107 typedef Y range_type;
    \n+
    108
    \n+
    110 typedef typename X::field_type field_type;
    \n+
    111
    \n+
    113 typedef typename FieldTraits<field_type>::real_type real_type;
    \n+
    114
    \n+
    116 typedef Simd::Scalar<real_type> scalar_real_type;
    \n+
    117
    \n+
    130 virtual void apply (X& x, Y& b, InverseOperatorResult& res) = 0;
    \n+
    131
    \n+
    145 virtual void apply (X& x, Y& b, double reduction, InverseOperatorResult& res) = 0;
    \n+
    146
    \n+\n+
    149#ifdef DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n+
    150 {
    \n+
    151 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method in a derived classes, in the future this method will pure virtual.");
    \n+
    152 }
    \n+
    153#else
    \n+
    154 = 0;
    \n+
    155#endif
    \n+
    156
    \n+
    158 virtual ~InverseOperator () {}
    \n+
    159
    \n+
    160 protected:
    \n+
    161 // spacing values
    \n+
    162 enum { iterationSpacing = 5 , normSpacing = 16 };
    \n+
    163
    \n+
    \n+
    165 void printHeader(std::ostream& s) const
    \n+
    166 {
    \n+
    167 s << std::setw(iterationSpacing) << " Iter";
    \n+
    168 s << std::setw(normSpacing) << "Defect";
    \n+
    169 s << std::setw(normSpacing) << "Rate" << std::endl;
    \n+
    170 }
    \n+
    \n+
    171
    \n+
    173 template <typename CountType, typename DataType>
    \n+
    \n+
    174 void printOutput(std::ostream& s,
    \n+
    175 const CountType& iter,
    \n+
    176 const DataType& norm,
    \n+
    177 const DataType& norm_old) const
    \n+
    178 {
    \n+
    179 const DataType rate = norm/norm_old;
    \n+
    180 s << std::setw(iterationSpacing) << iter << " ";
    \n+
    181 s << std::setw(normSpacing) << Simd::io(norm) << " ";
    \n+
    182 s << std::setw(normSpacing) << Simd::io(rate) << std::endl;
    \n+
    183 }
    \n+
    \n+
    184
    \n+
    186 template <typename CountType, typename DataType>
    \n+
    \n+
    187 void printOutput(std::ostream& s,
    \n+
    188 const CountType& iter,
    \n+
    189 const DataType& norm) const
    \n+
    190 {
    \n+
    191 s << std::setw(iterationSpacing) << iter << " ";
    \n+
    192 s << std::setw(normSpacing) << Simd::io(norm) << std::endl;
    \n+
    193 }
    \n+
    \n+
    194 };
    \n+
    \n+
    195
    \n+
    204 template<class X, class Y>
    \n+
    \n+
    205 class IterativeSolver : public InverseOperator<X,Y>{
    \n+
    206 public:
    \n+\n+\n+\n+
    210 using typename InverseOperator<X,Y>::real_type;
    \n+\n+
    212
    \n+
    \n+
    232 IterativeSolver (const LinearOperator<X,Y>& op, Preconditioner<X,Y>& prec, scalar_real_type reduction, int maxit, int verbose) :
    \n+
    233 _op(stackobject_to_shared_ptr(op)),
    \n+
    234 _prec(stackobject_to_shared_ptr(prec)),
    \n+
    235 _sp(new SeqScalarProduct<X>),
    \n+
    236 _reduction(reduction), _maxit(maxit), _verbose(verbose), _category(SolverCategory::sequential)
    \n+
    237 {
    \n+\n+
    239 DUNE_THROW(InvalidSolverCategory, "LinearOperator has to be sequential!");
    \n+\n+
    241 DUNE_THROW(InvalidSolverCategory, "Preconditioner has to be sequential!");
    \n+
    242 }
    \n+
    \n+
    243
    \n+
    \n+\n+
    265 scalar_real_type reduction, int maxit, int verbose) :
    \n+
    266 _op(stackobject_to_shared_ptr(op)),
    \n+
    267 _prec(stackobject_to_shared_ptr(prec)),
    \n+
    268 _sp(stackobject_to_shared_ptr(sp)),
    \n+
    269 _reduction(reduction), _maxit(maxit), _verbose(verbose), _category(SolverCategory::category(op))
    \n+
    270 {
    \n+\n+
    272 DUNE_THROW(InvalidSolverCategory, "LinearOperator and Preconditioner must have the same SolverCategory!");
    \n+\n+
    274 DUNE_THROW(InvalidSolverCategory, "LinearOperator and ScalarProduct must have the same SolverCategory!");
    \n+
    275 }
    \n+
    \n+
    276
    \n+
    \n+
    292 IterativeSolver (std::shared_ptr<const LinearOperator<X,Y> > op, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
    \n+
    293 IterativeSolver(op,std::make_shared<SeqScalarProduct<X>>(),prec,
    \n+
    294 configuration.get<real_type>("reduction"),
    \n+
    295 configuration.get<int>("maxit"),
    \n+
    296 configuration.get<int>("verbose"))
    \n+
    297 {}
    \n+
    \n+
    298
    \n+
    \n+
    315 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) :
    \n+
    316 IterativeSolver(op,sp,prec,
    \n+
    317 configuration.get<scalar_real_type>("reduction"),
    \n+
    318 configuration.get<int>("maxit"),
    \n+
    319 configuration.get<int>("verbose"))
    \n+
    320 {}
    \n+
    \n+
    321
    \n+
    \n+
    342 IterativeSolver (std::shared_ptr<const LinearOperator<X,Y>> op,
    \n+
    343 std::shared_ptr<const ScalarProduct<X>> sp,
    \n+
    344 std::shared_ptr<Preconditioner<X,Y>> prec,
    \n+
    345 scalar_real_type reduction, int maxit, int verbose) :
    \n+
    346 _op(op),
    \n+
    347 _prec(prec),
    \n+
    348 _sp(sp),
    \n+
    349 _reduction(reduction), _maxit(maxit), _verbose(verbose),
    \n+\n+
    351 {
    \n+\n+
    353 DUNE_THROW(InvalidSolverCategory, "LinearOperator and Preconditioner must have the same SolverCategory!");
    \n+\n+
    355 DUNE_THROW(InvalidSolverCategory, "LinearOperator and ScalarProduct must have the same SolverCategory!");
    \n+
    356 }
    \n+
    \n+
    357
    \n+
    358 // #warning actually we want to have this as the default and just implement the second one
    \n+
    359 // //! \\copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&)
    \n+
    360 // virtual void apply (X& x, Y& b, InverseOperatorResult& res)
    \n+
    361 // {
    \n+
    362 // apply(x,b,_reduction,res);
    \n+
    363 // }
    \n+
    364
    \n+
    365#ifndef DOXYGEN
    \n+
    366 // make sure the three-argument apply from the base class does not get shadowed
    \n+
    367 // by the redefined four-argument version below
    \n+
    368 using InverseOperator<X,Y>::apply;
    \n+
    369#endif
    \n+
    370
    \n+
    \n+
    376 virtual void apply (X& x, X& b, double reduction, InverseOperatorResult& res)
    \n+
    377 {
    \n+
    378 scalar_real_type saved_reduction = _reduction;
    \n+
    379 _reduction = reduction;
    \n+
    380 this->apply(x,b,res);
    \n+
    381 _reduction = saved_reduction;
    \n+
    382 }
    \n+
    \n+
    383
    \n+
    \n+\n+
    386 {
    \n+
    387 return _category;
    \n+
    388 }
    \n+
    \n+
    389
    \n+
    \n+
    390 std::string name() const{
    \n+
    391 std::string name = className(*this);
    \n+
    392 return name.substr(0, name.find("<"));
    \n+
    393 }
    \n+
    \n+
    394
    \n+
    412 template<class CountType = unsigned int>
    \n+
    \n+
    413 class Iteration {
    \n+
    414 public:
    \n+
    \n+\n+
    416 : _i(0)
    \n+
    417 , _res(res)
    \n+
    418 , _parent(parent)
    \n+
    419 , _valid(true)
    \n+
    420 {
    \n+
    421 res.clear();
    \n+
    422 if(_parent._verbose>0){
    \n+
    423 std::cout << "=== " << parent.name() << std::endl;
    \n+
    424 if(_parent._verbose > 1)
    \n+
    425 _parent.printHeader(std::cout);
    \n+
    426 }
    \n+
    427 }
    \n+
    \n+
    428
    \n+
    429 Iteration(const Iteration&) = delete;
    \n+
    \n+\n+
    431 : _def0(other._def0)
    \n+
    432 , _def(other._def)
    \n+
    433 , _i(other._i)
    \n+
    434 , _watch(other._watch)
    \n+
    435 , _res(other._res)
    \n+
    436 , _parent(other._parent)
    \n+
    437 , _valid(other._valid)
    \n+
    438 {
    \n+
    439 other._valid = false;
    \n+
    440 }
    \n+
    \n+
    441
    \n+
    \n+\n+
    443 if(_valid)
    \n+
    444 finalize();
    \n+
    445 }
    \n+
    \n+
    446
    \n+
    \n+
    457 bool step(CountType i, real_type def){
    \n+
    458 if (!Simd::allTrue(isFinite(def))) // check for inf or NaN
    \n+
    459 {
    \n+
    460 if (_parent._verbose>0)
    \n+
    461 std::cout << "=== " << _parent.name() << ": abort due to infinite or NaN defect"
    \n+
    462 << std::endl;
    \n+
    463 DUNE_THROW(SolverAbort,
    \n+
    464 _parent.name() << ": defect=" << Simd::io(def)
    \n+
    465 << " is infinite or NaN");
    \n+
    466 }
    \n+
    467 if(i == 0)
    \n+
    468 _def0 = def;
    \n+
    469 if(_parent._verbose > 1){
    \n+
    470 if(i!=0)
    \n+
    471 _parent.printOutput(std::cout,i,def,_def);
    \n+
    472 else
    \n+
    473 _parent.printOutput(std::cout,i,def);
    \n+
    474 }
    \n+
    475 _def = def;
    \n+
    476 _i = i;
    \n+
    477 _res.converged = (Simd::allTrue(def<_def0*_parent._reduction || def<real_type(1E-30))); // convergence check
    \n+
    478 return _res.converged;
    \n+
    479 }
    \n+
    \n+
    480
    \n+
    481 protected:
    \n+
    \n+
    482 void finalize(){
    \n+
    483 _res.converged = (Simd::allTrue(_def<_def0*_parent._reduction || _def<real_type(1E-30)));
    \n+\n+
    485 _res.reduction = static_cast<double>(Simd::max(_def/_def0));
    \n+
    486 _res.conv_rate = pow(_res.reduction,1.0/_i);
    \n+
    487 _res.elapsed = _watch.elapsed();
    \n+
    488 if (_parent._verbose>0) // final print
    \n+
    489 {
    \n+
    490 std::cout << "=== rate=" << _res.conv_rate
    \n+
    491 << ", T=" << _res.elapsed
    \n+
    492 << ", TIT=" << _res.elapsed/_res.iterations
    \n+
    493 << ", IT=" << _res.iterations << std::endl;
    \n+
    494 }
    \n+
    495 }
    \n+
    \n+
    496
    \n+
    497 real_type _def0 = 0.0, _def = 0.0;
    \n+
    498 CountType _i;
    \n+
    499 Timer _watch;
    \n+\n+\n+
    502 bool _valid;
    \n+
    503 };
    \n+
    \n+
    504
    \n+
    505 protected:
    \n+
    506 std::shared_ptr<const LinearOperator<X,Y>> _op;
    \n+
    507 std::shared_ptr<Preconditioner<X,Y>> _prec;
    \n+
    508 std::shared_ptr<const ScalarProduct<X>> _sp;
    \n+\n+\n+\n+\n+
    513 };
    \n+
    \n+
    514
    \n+
    522 template <typename ISTLLinearSolver, typename BCRSMatrix>
    \n+
    \n+\n+
    524 {
    \n+
    525 public:
    \n+
    \n+
    526 static void setMatrix (ISTLLinearSolver& solver,
    \n+
    527 const BCRSMatrix& matrix)
    \n+
    528 {
    \n+
    529 static const bool is_direct_solver
    \n+\n+\n+\n+
    533 }
    \n+
    \n+
    534
    \n+
    535 protected:
    \n+
    540 template <bool is_direct_solver, typename Dummy = void>
    \n+
    \n+\n+
    542 {
    \n+
    \n+
    543 static void setMatrix (ISTLLinearSolver&,
    \n+
    544 const BCRSMatrix&)
    \n+
    545 {}
    \n+
    \n+
    546 };
    \n+
    \n+
    547
    \n+
    552 template <typename Dummy>
    \n+
    \n+
    553 struct Implementation<true,Dummy>
    \n+
    554 {
    \n+
    \n+
    555 static void setMatrix (ISTLLinearSolver& solver,
    \n+
    556 const BCRSMatrix& matrix)
    \n+
    557 {
    \n+
    558 solver.setMatrix(matrix);
    \n+
    559 }
    \n+
    \n+
    560 };
    \n+
    \n+
    561 };
    \n+
    \n+
    562
    \n+
    566}
    \n+
    567
    \n+
    568#endif
    \n+
    Define base class for scalar product and norm.
    \n+\n+
    Templates characterizing the type of a solver.
    \n+
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n+
    STL namespace.
    \n
    Definition allocator.hh:11
    \n-
    Tag idnetifying the visited property of a vertex.
    Definition properties.hh:29
    \n-
    A property map that extracts one property out of a bundle using operator[]()
    Definition properties.hh:43
    \n+
    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
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    Thrown when a solver aborts due to some problem.
    Definition istlexception.hh:46
    \n+
    A linear operator.
    Definition operators.hh:69
    \n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    Base class for scalar product and norm computation.
    Definition scalarproducts.hh:52
    \n+
    Default implementation for the scalar case.
    Definition scalarproducts.hh:168
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    InverseOperatorResult()
    Default constructor.
    Definition solver.hh:52
    \n+
    double condition_estimate
    Estimate of condition number.
    Definition solver.hh:81
    \n+
    double elapsed
    Elapsed time in seconds.
    Definition solver.hh:84
    \n+
    int iterations
    Number of iterations.
    Definition solver.hh:69
    \n+
    double reduction
    Reduction achieved: .
    Definition solver.hh:72
    \n+
    void clear()
    Resets all data.
    Definition solver.hh:58
    \n+
    double conv_rate
    Convergence rate (average reduction per step)
    Definition solver.hh:78
    \n+
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n+
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n+
    void printHeader(std::ostream &s) const
    helper function for printing header of solver output
    Definition solver.hh:165
    \n+
    virtual ~InverseOperator()
    Destructor.
    Definition solver.hh:158
    \n+
    void printOutput(std::ostream &s, const CountType &iter, const DataType &norm) const
    helper function for printing solver output
    Definition solver.hh:187
    \n+
    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:174
    \n+
    virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)=0
    apply inverse operator, with given convergence criteria.
    \n+
    Simd::Scalar< real_type > scalar_real_type
    scalar type underlying the field_type
    Definition solver.hh:116
    \n+
    Y range_type
    Type of the range of the operator to be inverted.
    Definition solver.hh:107
    \n+
    @ normSpacing
    Definition solver.hh:162
    \n+
    @ iterationSpacing
    Definition solver.hh:162
    \n+
    X domain_type
    Type of the domain of the operator to be inverted.
    Definition solver.hh:104
    \n+
    virtual void apply(X &x, Y &b, InverseOperatorResult &res)=0
    Apply inverse operator,.
    \n+
    X::field_type field_type
    The field type of the operator.
    Definition solver.hh:110
    \n+
    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:113
    \n+
    virtual SolverCategory::Category category() const =0
    Category of the solver (see SolverCategory::Category)
    \n+
    Base class for all implementations of iterative solvers.
    Definition solver.hh:205
    \n+
    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:315
    \n+
    IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
    Constructor.
    Definition solver.hh:292
    \n+
    virtual void apply(X &x, X &b, double reduction, InverseOperatorResult &res)
    Apply inverse operator with given reduction factor.
    Definition solver.hh:376
    \n+
    std::shared_ptr< const ScalarProduct< X > > _sp
    Definition solver.hh:508
    \n+
    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:342
    \n+
    std::string name() const
    Definition solver.hh:390
    \n+
    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:232
    \n+
    std::shared_ptr< const LinearOperator< X, Y > > _op
    Definition solver.hh:506
    \n+
    int _maxit
    Definition solver.hh:510
    \n+
    int _verbose
    Definition solver.hh:511
    \n+
    scalar_real_type _reduction
    Definition solver.hh:509
    \n+
    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:264
    \n+
    SolverCategory::Category _category
    Definition solver.hh:512
    \n+
    std::shared_ptr< Preconditioner< X, Y > > _prec
    Definition solver.hh:507
    \n+
    virtual SolverCategory::Category category() const
    Category of the solver (see SolverCategory::Category)
    Definition solver.hh:385
    \n+
    Class for controlling iterative methods.
    Definition solver.hh:413
    \n+
    Iteration(const IterativeSolver &parent, InverseOperatorResult &res)
    Definition solver.hh:415
    \n+
    Iteration(Iteration &&other)
    Definition solver.hh:430
    \n+
    InverseOperatorResult & _res
    Definition solver.hh:500
    \n+
    const IterativeSolver & _parent
    Definition solver.hh:501
    \n+
    Timer _watch
    Definition solver.hh:499
    \n+
    Iteration(const Iteration &)=delete
    \n+
    CountType _i
    Definition solver.hh:498
    \n+
    real_type _def0
    Definition solver.hh:497
    \n+
    bool step(CountType i, real_type def)
    registers the iteration step, checks for invalid defect norm and convergence.
    Definition solver.hh:457
    \n+
    void finalize()
    Definition solver.hh:482
    \n+
    real_type _def
    Definition solver.hh:497
    \n+
    ~Iteration()
    Definition solver.hh:442
    \n+
    bool _valid
    Definition solver.hh:502
    \n+
    Helper class for notifying a DUNE-ISTL linear solver about a change of the iteration matrix object in...
    Definition solver.hh:524
    \n+
    static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
    Definition solver.hh:526
    \n+
    Implementation that works together with iterative ISTL solvers, e.g. Dune::CGSolver or Dune::BiCGSTAB...
    Definition solver.hh:542
    \n+
    static void setMatrix(ISTLLinearSolver &, const BCRSMatrix &)
    Definition solver.hh:543
    \n+
    static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
    Definition solver.hh:555
    \n+
    Categories for the solvers.
    Definition solvercategory.hh:22
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    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
    \n+
    Definition solvercategory.hh:54
    \n+
    Definition solvertype.hh:16
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,110 +1,644 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-properties.hh\n+solver.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_AMG_PROPERTIES_HH\n-6#define DUNE_ISTL_AMG_PROPERTIES_HH\n-7\n-8#include \n-9\n-10namespace _\bD_\bu_\bn_\be\n-11{\n-12\n-13 namespace Amg\n-14 {\n-_\b2_\b8 struct _\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n-29 {};\n-30\n-31\n-38 template\n-_\b4_\b0 class _\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n-41 : public RAPropertyMapHelper >\n-43 {\n-44 public:\n-_\b4_\b6 typedef C _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n-47\n-_\b4_\b9 typedef R _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-50\n-_\b5_\b2 typedef K _\bK_\be_\by;\n-53\n-_\b5_\b7 typedef LvaluePropertyMapTag _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n-58\n-59 enum {\n-61 _\bi_\bn_\bd_\be_\bx = i\n-_\b6_\b2 };\n-63\n-_\b6_\b9 _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bK_\be_\by& key) const\n-70 {\n-71 return container_[key][_\bi_\bn_\bd_\be_\bx];\n-72 }\n+5\n+6#ifndef DUNE_ISTL_SOLVER_HH\n+7#define DUNE_ISTL_SOLVER_HH\n+8\n+9#include // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n+10\n+11#include \n+12#include \n+13#include \n+14#include \n+15\n+16#include \n+17#include \n+18#include \n+19#include \n+20#include \n+21#include \n+22\n+23#include \"_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\"\n+24#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\"\n+25#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n+26#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n+27\n+28namespace _\bD_\bu_\bn_\be\n+29{\n+_\b4_\b9 struct _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+50 {\n+_\b5_\b2 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt ()\n+53 {\n+54 _\bc_\bl_\be_\ba_\br();\n+55 }\n+56\n+_\b5_\b8 void _\bc_\bl_\be_\ba_\br ()\n+59 {\n+60 _\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 0;\n+61 _\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn = 0;\n+62 _\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = false;\n+63 _\bc_\bo_\bn_\bv_\b__\br_\ba_\bt_\be = 1;\n+64 _\be_\bl_\ba_\bp_\bs_\be_\bd = 0;\n+65 _\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\b__\be_\bs_\bt_\bi_\bm_\ba_\bt_\be = -1;\n+66 }\n+67\n+_\b6_\b9 int _\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs;\n+70\n+_\b7_\b2 double _\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n 73\n-_\b7_\b8 _\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp(_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& container)\n-79 : container_(&container)\n-80 {}\n-81\n-_\b8_\b3 _\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp()\n-84 : container_(0)\n-85 {}\n+_\b7_\b5 bool _\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd;\n+76\n+_\b7_\b8 double _\bc_\bo_\bn_\bv_\b__\br_\ba_\bt_\be;\n+79\n+_\b8_\b1 double _\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\b__\be_\bs_\bt_\bi_\bm_\ba_\bt_\be = -1;\n+82\n+_\b8_\b4 double _\be_\bl_\ba_\bp_\bs_\be_\bd;\n+85 };\n 86\n-87 private:\n-89 _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br* container_;\n-90 };\n-91 }\n-92}\n-93\n-94#endif\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-Reference operator[](const Key &key) const\n-Get the property for a key.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n-RandomAccessBundledPropertyMap()\n-The default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-R Reference\n-The reference type of the container.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n-RandomAccessBundledPropertyMap(Container &container)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bK_\be_\by\n-K Key\n-The key of the property map.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-LvaluePropertyMapTag Category\n-The category of the property map.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-C Container\n-The container that holds the properties.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bi_\bn_\bd_\be_\bx\n-@ index\n-The index of the property in the bundle.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:61\n+87\n+88 //=====================================================================\n+100 template\n+_\b1_\b0_\b1 class _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br {\n+102 public:\n+_\b1_\b0_\b4 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+105\n+_\b1_\b0_\b7 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+108\n+_\b1_\b1_\b0 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+111\n+_\b1_\b1_\b3 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+114\n+_\b1_\b1_\b6 typedef Simd::Scalar _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+117\n+_\b1_\b3_\b0 virtual void _\ba_\bp_\bp_\bl_\by (X& x, Y& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res) = 0;\n+131\n+_\b1_\b4_\b5 virtual void _\ba_\bp_\bp_\bl_\by (X& x, Y& b, double reduction, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt&\n+res) = 0;\n+146\n+_\b1_\b4_\b8 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+149#ifdef DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n+150 {\n+151 DUNE_THROW(Dune::Exception,\"It is necessary to implement the category\n+method in a derived classes, in the future this method will pure virtual.\");\n+152 }\n+153#else\n+154 = 0;\n+155#endif\n+156\n+_\b1_\b5_\b8 virtual _\b~_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br () {}\n+159\n+160 protected:\n+161 // spacing values\n+_\b1_\b6_\b2 enum { _\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bS_\bp_\ba_\bc_\bi_\bn_\bg = 5 , _\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg = 16 };\n+163\n+_\b1_\b6_\b5 void _\bp_\br_\bi_\bn_\bt_\bH_\be_\ba_\bd_\be_\br(std::ostream& s) const\n+166 {\n+167 s << std::setw(_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << \" Iter\";\n+168 s << std::setw(_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << \"Defect\";\n+169 s << std::setw(_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << \"Rate\" << std::endl;\n+170 }\n+171\n+173 template \n+_\b1_\b7_\b4 void _\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt(std::ostream& s,\n+175 const CountType& iter,\n+176 const DataType& norm,\n+177 const DataType& norm_old) const\n+178 {\n+179 const DataType rate = norm/norm_old;\n+180 s << std::setw(_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << iter << \" \";\n+181 s << std::setw(_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << Simd::io(norm) << \" \";\n+182 s << std::setw(_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << Simd::io(rate) << std::endl;\n+183 }\n+184\n+186 template \n+_\b1_\b8_\b7 void _\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt(std::ostream& s,\n+188 const CountType& iter,\n+189 const DataType& norm) const\n+190 {\n+191 s << std::setw(_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << iter << \" \";\n+192 s << std::setw(_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << Simd::io(norm) << std::endl;\n+193 }\n+194 };\n+195\n+204 template\n+_\b2_\b0_\b5 class _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br{\n+206 public:\n+207 using typename _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+208 using typename _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+209 using typename _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+210 using typename _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+211 using typename _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+212\n+_\b2_\b3_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br (const _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>& op, _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b>& prec,\n+_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose) :\n+233 _\b__\bo_\bp(stackobject_to_shared_ptr(op)),\n+234 _\b__\bp_\br_\be_\bc(stackobject_to_shared_ptr(prec)),\n+235 _\b__\bs_\bp(new _\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt),\n+236 _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn(reduction), _\b__\bm_\ba_\bx_\bi_\bt(maxit), _\b__\bv_\be_\br_\bb_\bo_\bs_\be(verbose), _\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::sequential)\n+237 {\n+238 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(op) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl)\n+239 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"LinearOperator has to be sequential!\");\n+240 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(prec) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl)\n+241 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"Preconditioner has to be sequential!\");\n+242 }\n+243\n+_\b2_\b6_\b4 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br (const _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>& op, const _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bX_\b>& sp,\n+_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b>& prec,\n+265 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose) :\n+266 _\b__\bo_\bp(stackobject_to_shared_ptr(op)),\n+267 _\b__\bp_\br_\be_\bc(stackobject_to_shared_ptr(prec)),\n+268 _\b__\bs_\bp(stackobject_to_shared_ptr(sp)),\n+269 _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn(reduction), _\b__\bm_\ba_\bx_\bi_\bt(maxit), _\b__\bv_\be_\br_\bb_\bo_\bs_\be(verbose), _\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(op))\n+270 {\n+271 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(op) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(prec))\n+272 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"LinearOperator and Preconditioner must\n+have the same SolverCategory!\");\n+273 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(op) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(sp))\n+274 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"LinearOperator and ScalarProduct must\n+have the same SolverCategory!\");\n+275 }\n+276\n+_\b2_\b9_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr > op, std::\n+shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b> > prec, const ParameterTree& configuration) :\n+293 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,_\bs_\bt_\bd::make_shared<_\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt>(),prec,\n+294 configuration._\bg_\be_\bt<_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be>(\"reduction\"),\n+295 configuration._\bg_\be_\bt(\"maxit\"),\n+296 configuration._\bg_\be_\bt(\"verbose\"))\n+297 {}\n+298\n+_\b3_\b1_\b5 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr > op, std::\n+shared_ptr > sp, std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b> >\n+prec, const ParameterTree& configuration) :\n+316 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,sp,prec,\n+317 configuration._\bg_\be_\bt<_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be>(\"reduction\"),\n+318 configuration._\bg_\be_\bt(\"maxit\"),\n+319 configuration._\bg_\be_\bt(\"verbose\"))\n+320 {}\n+321\n+_\b3_\b4_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr> op,\n+343 std::shared_ptr> sp,\n+344 std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b>> prec,\n+345 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose) :\n+346 _\b__\bo_\bp(op),\n+347 _\b__\bp_\br_\be_\bc(prec),\n+348 _\b__\bs_\bp(sp),\n+349 _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn(reduction), _\b__\bm_\ba_\bx_\bi_\bt(maxit), _\b__\bv_\be_\br_\bb_\bo_\bs_\be(verbose),\n+350 _\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*op))\n+351 {\n+352 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*op) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*prec))\n+353 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"LinearOperator and Preconditioner must\n+have the same SolverCategory!\");\n+354 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*op) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*sp))\n+355 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"LinearOperator and ScalarProduct must\n+have the same SolverCategory!\");\n+356 }\n+357\n+358 // #warning actually we want to have this as the default and just implement\n+the second one\n+359 // //! \\copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&)\n+360 // virtual void apply (X& x, Y& b, InverseOperatorResult& res)\n+361 // {\n+362 // apply(x,b,_reduction,res);\n+363 // }\n+364\n+365#ifndef DOXYGEN\n+366 // make sure the three-argument apply from the base class does not get\n+shadowed\n+367 // by the redefined four-argument version below\n+368 using _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by;\n+369#endif\n+370\n+_\b3_\b7_\b6 virtual void _\ba_\bp_\bp_\bl_\by (X& x, X& b, double reduction, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt&\n+res)\n+377 {\n+378 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be saved_reduction = _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+379 _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn = reduction;\n+380 this->_\ba_\bp_\bp_\bl_\by(x,b,res);\n+381 _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn = saved_reduction;\n+382 }\n+383\n+_\b3_\b8_\b5 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+386 {\n+387 return _\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by;\n+388 }\n+389\n+_\b3_\b9_\b0 std::string _\bn_\ba_\bm_\be() const{\n+391 std::string _\bn_\ba_\bm_\be = className(*this);\n+392 return _\bn_\ba_\bm_\be.substr(0, _\bn_\ba_\bm_\be.find(\"<\"));\n+393 }\n+394\n+412 template\n+_\b4_\b1_\b3 class _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn {\n+414 public:\n+_\b4_\b1_\b5 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn(const _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br& parent, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+416 : _\b__\bi(0)\n+417 , _\b__\br_\be_\bs(res)\n+418 , _\b__\bp_\ba_\br_\be_\bn_\bt(parent)\n+419 , _\b__\bv_\ba_\bl_\bi_\bd(true)\n+420 {\n+421 res._\bc_\bl_\be_\ba_\br();\n+422 if(_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\bv_\be_\br_\bb_\bo_\bs_\be>0){\n+423 std::cout << \"=== \" << parent._\bn_\ba_\bm_\be() << std::endl;\n+424 if(_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\bv_\be_\br_\bb_\bo_\bs_\be > 1)\n+425 _\b__\bp_\ba_\br_\be_\bn_\bt._\bp_\br_\bi_\bn_\bt_\bH_\be_\ba_\bd_\be_\br(std::cout);\n+426 }\n+427 }\n+428\n+_\b4_\b2_\b9 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn(const _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn&) = delete;\n+_\b4_\b3_\b0 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn(_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn&& other)\n+431 : _\b__\bd_\be_\bf_\b0(other._\b__\bd_\be_\bf_\b0)\n+432 , _\b__\bd_\be_\bf(other._\b__\bd_\be_\bf)\n+433 , _\b__\bi(other._\b__\bi)\n+434 , _\b__\bw_\ba_\bt_\bc_\bh(other._\b__\bw_\ba_\bt_\bc_\bh)\n+435 , _\b__\br_\be_\bs(other._\b__\br_\be_\bs)\n+436 , _\b__\bp_\ba_\br_\be_\bn_\bt(other._\b__\bp_\ba_\br_\be_\bn_\bt)\n+437 , _\b__\bv_\ba_\bl_\bi_\bd(other._\b__\bv_\ba_\bl_\bi_\bd)\n+438 {\n+439 other._valid = false;\n+440 }\n+441\n+_\b4_\b4_\b2 _\b~_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn(){\n+443 if(_\b__\bv_\ba_\bl_\bi_\bd)\n+444 _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be();\n+445 }\n+446\n+_\b4_\b5_\b7 bool _\bs_\bt_\be_\bp(CountType i, _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be def){\n+458 if (!Simd::allTrue(isFinite(def))) // check for inf or NaN\n+459 {\n+460 if (_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\bv_\be_\br_\bb_\bo_\bs_\be>0)\n+461 std::cout << \"=== \" << _\b__\bp_\ba_\br_\be_\bn_\bt._\bn_\ba_\bm_\be() << \": abort due to infinite or NaN\n+defect\"\n+462 << std::endl;\n+463 DUNE_THROW(_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt,\n+464 _\b__\bp_\ba_\br_\be_\bn_\bt._\bn_\ba_\bm_\be() << \": defect=\" << Simd::io(def)\n+465 << \" is infinite or NaN\");\n+466 }\n+467 if(i == 0)\n+468 _\b__\bd_\be_\bf_\b0 = def;\n+469 if(_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\bv_\be_\br_\bb_\bo_\bs_\be > 1){\n+470 if(i!=0)\n+471 _\b__\bp_\ba_\br_\be_\bn_\bt._\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt(std::cout,i,def,_\b__\bd_\be_\bf);\n+472 else\n+473 _\b__\bp_\ba_\br_\be_\bn_\bt._\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt(std::cout,i,def);\n+474 }\n+475 _\b__\bd_\be_\bf = def;\n+476 _\b__\bi = i;\n+477 _\b__\br_\be_\bs._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = (Simd::allTrue(def<_\b__\bd_\be_\bf_\b0*_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn ||\n+def<_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1E-30))); // convergence check\n+478 return _\b__\br_\be_\bs._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd;\n+479 }\n+480\n+481 protected:\n+_\b4_\b8_\b2 void _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be(){\n+483 _\b__\br_\be_\bs._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = (Simd::allTrue(_\b__\bd_\be_\bf<_\b__\bd_\be_\bf_\b0*_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn ||\n+_\b__\bd_\be_\bf<_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1E-30)));\n+484 _\b__\br_\be_\bs._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = _\b__\bi;\n+485 _\b__\br_\be_\bs._\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn = static_cast(Simd::max(_\b__\bd_\be_\bf/_\b__\bd_\be_\bf_\b0));\n+486 _\b__\br_\be_\bs._\bc_\bo_\bn_\bv_\b__\br_\ba_\bt_\be = pow(_\b__\br_\be_\bs._\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn,1.0/_\b__\bi);\n+487 _\b__\br_\be_\bs._\be_\bl_\ba_\bp_\bs_\be_\bd = _\b__\bw_\ba_\bt_\bc_\bh.elapsed();\n+488 if (_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\bv_\be_\br_\bb_\bo_\bs_\be>0) // final print\n+489 {\n+490 std::cout << \"=== rate=\" << _\b__\br_\be_\bs._\bc_\bo_\bn_\bv_\b__\br_\ba_\bt_\be\n+491 << \", T=\" << _\b__\br_\be_\bs._\be_\bl_\ba_\bp_\bs_\be_\bd\n+492 << \", TIT=\" << _\b__\br_\be_\bs._\be_\bl_\ba_\bp_\bs_\be_\bd/_\b__\br_\be_\bs._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+493 << \", IT=\" << _\b__\br_\be_\bs._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs << std::endl;\n+494 }\n+495 }\n+496\n+_\b4_\b9_\b7 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\b__\bd_\be_\bf_\b0 = 0.0, _\b__\bd_\be_\bf = 0.0;\n+_\b4_\b9_\b8 CountType _\b__\bi;\n+_\b4_\b9_\b9 Timer _\b__\bw_\ba_\bt_\bc_\bh;\n+_\b5_\b0_\b0 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& _\b__\br_\be_\bs;\n+_\b5_\b0_\b1 const _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br& _\b__\bp_\ba_\br_\be_\bn_\bt;\n+_\b5_\b0_\b2 bool _\b__\bv_\ba_\bl_\bi_\bd;\n+503 };\n+504\n+505 protected:\n+_\b5_\b0_\b6 std::shared_ptr> _\b__\bo_\bp;\n+_\b5_\b0_\b7 std::shared_ptr> _\b__\bp_\br_\be_\bc;\n+_\b5_\b0_\b8 std::shared_ptr> _\b__\bs_\bp;\n+_\b5_\b0_\b9 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n+_\b5_\b1_\b0 int _\b__\bm_\ba_\bx_\bi_\bt;\n+_\b5_\b1_\b1 int _\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n+_\b5_\b1_\b2 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by;\n+513 };\n+514\n+522 template \n+_\b5_\b2_\b3 class _\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+524 {\n+525 public:\n+_\b5_\b2_\b6 static void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx (ISTLLinearSolver& solver,\n+527 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n+528 {\n+529 static const bool is_direct_solver\n+530 = _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be;\n+531 _\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b,_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:\n+532_\b _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bs_\b__\bd_\bi_\br_\be_\bc_\bt_\b__\bs_\bo_\bl_\bv_\be_\br_\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(solver,matrix);\n+533 }\n+534\n+535 protected:\n+540 template \n+_\b5_\b4_\b1 struct _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn\n+542 {\n+_\b5_\b4_\b3 static void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx (ISTLLinearSolver&,\n+544 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx&)\n+545 {}\n+546 };\n+547\n+552 template \n+_\b5_\b5_\b3 struct _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn\n+554 {\n+_\b5_\b5_\b5 static void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx (ISTLLinearSolver& solver,\n+556 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n+557 {\n+558 solver.setMatrix(matrix);\n+559 }\n+560 };\n+561 };\n+562\n+566}\n+567\n+568#endif\n+_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\n+Define base class for scalar product and norm.\n+_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n+Templates characterizing the type of a solver.\n+_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n+Define general, extensible interface for operators. The available\n+implementation wraps a matrix.\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n-Tag idnetifying the visited property of a vertex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:29\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n-A property map that extracts one property out of a bundle using operator[]()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt\n+Thrown when a solver aborts due to some problem.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A linear operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Base class for scalar product and norm computation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Default implementation for the scalar case.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:168\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+InverseOperatorResult()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\b__\be_\bs_\bt_\bi_\bm_\ba_\bt_\be\n+double condition_estimate\n+Estimate of condition number.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\be_\bl_\ba_\bp_\bs_\be_\bd\n+double elapsed\n+Elapsed time in seconds.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+int iterations\n+Number of iterations.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn\n+double reduction\n+Reduction achieved: .\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bl_\be_\ba_\br\n+void clear()\n+Resets all data.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\b__\br_\ba_\bt_\be\n+double conv_rate\n+Convergence rate (average reduction per step)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n+bool converged\n+True if convergence criterion has been met.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Abstract base class for all solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bH_\be_\ba_\bd_\be_\br\n+void printHeader(std::ostream &s) const\n+helper function for printing header of solver output\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\b~_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+virtual ~InverseOperator()\n+Destructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt\n+void printOutput(std::ostream &s, const CountType &iter, const DataType &norm)\n+const\n+helper function for printing solver output\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:187\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt\n+void printOutput(std::ostream &s, const CountType &iter, const DataType &norm,\n+const DataType &norm_old) const\n+helper function for printing solver output\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:174\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)=0\n+apply inverse operator, with given convergence criteria.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+Simd::Scalar< real_type > scalar_real_type\n+scalar type underlying the field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+Type of the range of the operator to be inverted.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:107\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg\n+@ normSpacing\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bS_\bp_\ba_\bc_\bi_\bn_\bg\n+@ iterationSpacing\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+Type of the domain of the operator to be inverted.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:104\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, Y &b, InverseOperatorResult &res)=0\n+Apply inverse operator,.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< field_type >::real_type real_type\n+The real type of the field type (is the same if using real numbers, but differs\n+for std::complex)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const =0\n+Category of the solver (see SolverCategory::Category)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n+Base class for all implementations of iterative solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:205\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n+IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::\n+shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X,\n+X > > prec, const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:315\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n+IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::\n+shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:292\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, X &b, double reduction, InverseOperatorResult &res)\n+Apply inverse operator with given reduction factor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:376\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bs_\bp\n+std::shared_ptr< const ScalarProduct< X > > _sp\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:508\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n+IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::\n+shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X,\n+Y > > prec, scalar_real_type reduction, int maxit, int verbose)\n+General constructor to initialize an iterative solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:342\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bn_\ba_\bm_\be\n+std::string name() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:390\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n+IterativeSolver(const LinearOperator< X, Y > &op, Preconditioner< X, Y > &prec,\n+scalar_real_type reduction, int maxit, int verbose)\n+General constructor to initialize an iterative solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:232\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bo_\bp\n+std::shared_ptr< const LinearOperator< X, Y > > _op\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:506\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt\n+int _maxit\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:510\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be\n+int _verbose\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:511\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn\n+scalar_real_type _reduction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:509\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n+IterativeSolver(const LinearOperator< X, Y > &op, const ScalarProduct< X > &sp,\n+Preconditioner< X, Y > &prec, scalar_real_type reduction, int maxit, int\n+verbose)\n+General constructor to initialize an iterative solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:264\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+SolverCategory::Category _category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:512\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bp_\br_\be_\bc\n+std::shared_ptr< Preconditioner< X, Y > > _prec\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:507\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the solver (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:385\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+Class for controlling iterative methods.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:413\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+Iteration(const IterativeSolver &parent, InverseOperatorResult &res)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:415\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+Iteration(Iteration &&other)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:430\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\br_\be_\bs\n+InverseOperatorResult & _res\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:500\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bp_\ba_\br_\be_\bn_\bt\n+const IterativeSolver & _parent\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:501\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bw_\ba_\bt_\bc_\bh\n+Timer _watch\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:499\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+Iteration(const Iteration &)=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bi\n+CountType _i\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:498\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bd_\be_\bf_\b0\n+real_type _def0\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:497\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bt_\be_\bp\n+bool step(CountType i, real_type def)\n+registers the iteration step, checks for invalid defect norm and convergence.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:457\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be\n+void finalize()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:482\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bd_\be_\bf\n+real_type _def\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:497\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b~_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+~Iteration()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:442\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bv_\ba_\bl_\bi_\bd\n+bool _valid\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:502\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+Helper class for notifying a DUNE-ISTL linear solver about a change of the\n+iteration matrix object in...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:524\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:526\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn\n+Implementation that works together with iterative ISTL solvers, e.g. Dune::\n+CGSolver or Dune::BiCGSTAB...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:542\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+static void setMatrix(ISTLLinearSolver &, const BCRSMatrix &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:543\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bt_\br_\bu_\be_\b,_\b _\bD_\bu_\bm_\bm_\by_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:555\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Categories for the solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+static Category category(const OP &op, decltype(op.category()) *=nullptr)\n+Helperfunction to extract the solver category either from an enum, or from the\n+newly introduced virtu...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00137.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00137.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: globalaggregates.hh File Reference\n+dune-istl: matrixmarket.hh File Reference\n \n \n \n \n \n \n \n@@ -65,60 +65,270 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n \n+ \n \n
    \n \n-

    Provdes class for identifying aggregates globally. \n+

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

    \n-
    #include "aggregates.hh"
    \n-#include "pinfo.hh"
    \n-#include <dune/common/parallel/indexset.hh>
    \n+
    #include <algorithm>
    \n+#include <complex>
    \n+#include <cstddef>
    \n+#include <fstream>
    \n+#include <ios>
    \n+#include <iostream>
    \n+#include <istream>
    \n+#include <limits>
    \n+#include <ostream>
    \n+#include <set>
    \n+#include <sstream>
    \n+#include <string>
    \n+#include <tuple>
    \n+#include <type_traits>
    \n+#include <vector>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/fmatrix.hh>
    \n+#include <dune/common/fvector.hh>
    \n+#include <dune/common/hybridutilities.hh>
    \n+#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/simd/simd.hh>
    \n+#include <dune/istl/bcrsmatrix.hh>
    \n+#include <dune/istl/bvector.hh>
    \n+#include <dune/istl/matrixutils.hh>
    \n+#include <dune/istl/owneroverlapcopy.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n-\n+\n \n-\n+\n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::Amg::GlobalAggregatesMap< T, TI >
    struct  Dune::MatrixMarketImpl::mm_numeric_type< T >
     Helper metaprogram to get the matrix market string representation of the numeric type. More...
     
    class  Dune::Amg::GlobalAggregatesMap< T, TI >::Proxy
    struct  Dune::MatrixMarketImpl::mm_numeric_type< int >
     
    struct  Dune::Amg::AggregatesGatherScatter< T, TI >
    struct  Dune::MatrixMarketImpl::mm_numeric_type< double >
     
    struct  Dune::Amg::AggregatesPublisher< T, O, I >
    struct  Dune::MatrixMarketImpl::mm_numeric_type< float >
     
    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::MatrixMarketImpl::mm_numeric_type< std::complex< double > >
     
    struct  Dune::Amg::AggregatesPublisher< T, O, SequentialInformation >
    struct  Dune::MatrixMarketImpl::mm_numeric_type< std::complex< float > >
     
    struct  Dune::CommPolicy< Amg::GlobalAggregatesMap< T, TI > >
    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::MatrixMarketImpl::mm_block_structure_header< BlockVector< T, A > >
     
    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
     
    \n \n \n \n-\n+\n \n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
    namespace  Dune::MatrixMarketImpl
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Enumerations

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

    \n+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.
     
    \n+\n+\n+\n

    \n+Variables

    static const int Dune::default_precision = -1
     
    \n

    Detailed Description

    \n-

    Provdes class for identifying aggregates globally.

    \n+

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

    \n
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,45 +1,316 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-globalaggregates.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Provdes class for identifying aggregates globally. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n-#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n+matrixmarket.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bS_\bp_\ba_\br_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bc_\bl_\ba_\bs_\bs_\be_\bs \u00bb\n+_\bI_\bO_\b _\bf_\bo_\br_\b _\bm_\ba_\bt_\br_\bi_\bc_\be_\bs_\b _\ba_\bn_\bd_\b _\bv_\be_\bc_\bt_\bo_\br_\bs_\b.\n+Provides classes for reading and writing MatrixMarket Files with an extension\n+for parallel matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bT_\b _\b>\n+\u00a0 Helper metaprogram to get the matrix market string representation of\n+ the numeric type. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b:_\b:_\bP_\br_\bo_\bx_\by\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bi_\bn_\bt_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bI_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<\n- _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>\n-\u00a0 Utility class for publishing the aggregate number of the DOFs in the\n- overlap to other processors and convert them to local indices. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bj_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,_\b _\bj_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<\n+ _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bi_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<\n+ _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,_\b _\bj_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,\n+ _\bj_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bi_\b _\b>\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\b _\bT_\b _\b>\n+\u00a0 a wrapper class of numeric values. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by\n+\u00a0 Utility class for marking the pattern type of the MatrixMarket\n+ matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\b _\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b<_\b _\bD_\b,_\b _\bb_\br_\bo_\bw_\bs_\b,_\b _\bb_\bc_\bo_\bl_\bs_\b _\b>\n+\u00a0 Functor to the data values of the matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b<_\b _\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by_\b,_\b _\bb_\br_\bo_\bw_\bs_\b,_\b _\bb_\bc_\bo_\bl_\bs\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bT_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\b _\bM_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bi_\b,\n+ _\bj_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl\n+\u00a0\n+E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n+enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bL_\bi_\bn_\be_\bT_\by_\bp_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bH_\bE_\bA_\bD_\bE_\bR ,\n+ _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bI_\bS_\bT_\bL_\bS_\bT_\bR_\bU_\bC_\bT , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bD_\bA_\bT_\bA }\n+\u00a0\n+enum \u00a0 { _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bM_\bA_\bX_\b__\bL_\bI_\bN_\bE_\b__\bL_\bE_\bN_\bG_\bT_\bH =1025 }\n+\u00a0\n+enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bT_\bY_\bP_\bE { _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:\n+ _\bc_\bo_\bo_\br_\bd_\bi_\bn_\ba_\bt_\be_\b__\bt_\by_\bp_\be , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\ba_\br_\br_\ba_\by_\b__\bt_\by_\bp_\be , _\bD_\bu_\bn_\be_\b:_\b:\n+ _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bt_\by_\bp_\be }\n+\u00a0\n+enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bC_\bT_\bY_\bP_\bE {\n+ \u00a0\u00a0_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bt_\by_\bp_\be , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:\n+ _\bd_\bo_\bu_\bb_\bl_\be_\b__\bt_\by_\bp_\be , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b__\bt_\by_\bp_\be , _\bD_\bu_\bn_\be_\b:_\b:\n+ _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bp_\ba_\bt_\bt_\be_\br_\bn ,\n+ \u00a0\u00a0_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bc_\bt_\by_\bp_\be\n+ }\n+\u00a0\n+enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bS_\bT_\bR_\bU_\bC_\bT_\bU_\bR_\bE {\n+ \u00a0\u00a0_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bg_\be_\bn_\be_\br_\ba_\bl , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc ,\n+ _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:\n+ _\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn ,\n+ \u00a0\u00a0_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be\n+ }\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bl_\bi_\bn_\be_\bF_\be_\be_\bd (std::\n+ istream &file)\n+\u00a0\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bk_\bi_\bp_\bC_\bo_\bm_\bm_\be_\bn_\bt_\bs\n+ (std::istream &file)\n+\u00a0\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:\n+ _\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bB_\ba_\bn_\bn_\be_\br (std::istream\n+ &file, _\bM_\bM_\bH_\be_\ba_\bd_\be_\br &mmHeader)\n+\u00a0\n+template\n+ std::tuple< std::size_t, std::size_t, _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bN_\bN_\bZ\n+ std::size_t >\u00a0 (std::size_t rows, std::size_t cols,\n+ std::size_t entries, const _\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n+ &header)\n+\u00a0\n+template\n+ std::istream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n+ (std::istream &is, _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br< T >\n+ &num)\n+\u00a0\n+ std::istream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n+ (std::istream &is, _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br<\n+ _\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by > &num)\n+\u00a0\n+template\n+ bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n+ (const _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba< T > &i1, const\n+ _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba< T > &i2)\n+\u00a0 LessThan operator.\n+\u00a0\n+template\n+ std::istream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n+ (std::istream &is, _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba< T >\n+ &data)\n+\u00a0 Read _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba from a stream.\n+\u00a0\n+template\n+ std::istream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n+ (std::istream &is, _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba<\n+ _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br< std::complex< T > > >\n+ &data)\n+\u00a0 Read _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba from a stream.\n+ Specialization for std::complex.\n+\u00a0\n+template\n+ std::enable_if_t:: _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bn_\bj (const T\n+ value, T >\u00a0 &r)\n+\u00a0\n+template\n+ std::enable_if_t< _\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx< T >:: _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bn_\bj (const T\n+ value, T >\u00a0 &r)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:\n+ _\br_\be_\ba_\bd_\bS_\bp_\ba_\br_\bs_\be_\bE_\bn_\bt_\br_\bi_\be_\bs (_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< T,\n+ A > &matrix, std::istream &file, std::\n+ size_t entries, const _\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n+ &mmHeader, const D &)\n+\u00a0\n+std::tuple< std::string, std::string >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n+ (const std::string &filename)\n+\u00a0\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bh_\be_\ba_\bd_\be_\br (std::size_t\n+ &rows, std::size_t &cols,\n+ _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br &header,\n+ std::istream &istr, bool isVector)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs (_\bD_\bu_\bn_\be_\b:_\b:\n+ _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br< T, A > &vector, std::\n+ size_t size, std::istream &istr, size_t\n+ lane)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs (_\bD_\bu_\bn_\be_\b:_\b:\n+ _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br< Dune::FieldVector< T,\n+ entries >, A > &vector, std::size_t\n+ size, std::istream &istr, size_t lane)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (_\bD_\bu_\bn_\be_\b:_\b:\n+ _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br< T, A > &vector, std::\n+ istream &istr)\n+\u00a0 Reads a _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br from a matrix\n+ market file.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (_\bD_\bu_\bn_\be_\b:_\b:\n+ _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< T, A > &matrix, std::\n+ istream &istr)\n+\u00a0 Reads a sparse matrix from a matrix\n+ market file.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\be_\bn_\bt_\br_\by (const B &entry,\n+ std::size_t rowidx, std::size_t colidx,\n+ std::ostream &ostr)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by (const V\n+ &entry, std::ostream &ostr, const std::\n+ integral_constant< int, 1 > &, size_t\n+ lane)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by (const V\n+ &vector, std::ostream &ostr, const\n+ std::integral_constant< int, 0 > &,\n+ size_t lane)\n+\u00a0\n+template\n+ std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs (const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br<\n+ T, A > &vector)\n+\u00a0\n+template\n+ std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs (const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br<\n+ FieldVector< T, i >, A > &vector)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (const V\n+ &vector, std::ostream &ostr, const\n+ std::integral_constant< int, 0 > &)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (const M\n+ &matrix, std::ostream &ostr, const\n+ std::integral_constant< int, 1 > &)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (const M\n+ &matrix, std::ostream &ostr)\n+\u00a0 writes a _\bI_\bS_\bT_\bL matrix or vector to a\n+ stream in matrix market format.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\bo_\br_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (const M\n+ &matrix, std::string filename, int\n+ prec=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn)\n+\u00a0 Stores a parallel matrix/vector in\n+ matrix market format in a file.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\bo_\br_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (const M\n+ &matrix, std::string filename, const\n+ _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn< G, L >\n+ &comm, bool storeIndices=true, int\n+ prec=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn)\n+\u00a0 Stores a parallel matrix/vector in\n+ matrix market format in a file.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (M &matrix,\n+ const std::string &filename,\n+ _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn< G, L >\n+ &comm, bool readIndices=true)\n+\u00a0 Load a parallel matrix/vector stored in\n+ matrix market format.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (M &matrix,\n+ const std::string &filename)\n+\u00a0 Load a matrix/vector stored in matrix\n+ market format.\n+\u00a0\n+V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n+static const int\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn = -1\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provdes class for identifying aggregates globally.\n+Provides classes for reading and writing MatrixMarket Files with an extension\n+for parallel matrices.\n Author\n Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00137_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00137_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: globalaggregates.hh Source File\n+dune-istl: matrixmarket.hh Source File\n \n \n \n \n \n \n \n@@ -70,342 +70,1503 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    globalaggregates.hh
    \n+
    matrixmarket.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_GLOBALAGGREGATES_HH
    \n-
    6#define DUNE_GLOBALAGGREGATES_HH
    \n+
    5#ifndef DUNE_ISTL_MATRIXMARKET_HH
    \n+
    6#define DUNE_ISTL_MATRIXMARKET_HH
    \n
    7
    \n-
    18#include "aggregates.hh"
    \n-
    19#include "pinfo.hh"
    \n-
    20#include <dune/common/parallel/indexset.hh>
    \n-
    21
    \n-
    22namespace Dune
    \n-
    23{
    \n-
    24 namespace Amg
    \n-
    25 {
    \n-
    26
    \n-
    27 template<typename T, typename TI>
    \n-
    \n-\n-
    29 {
    \n-
    30 public:
    \n-
    31 typedef TI ParallelIndexSet;
    \n-
    32
    \n-
    33 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
    \n-
    34
    \n-
    35 typedef typename ParallelIndexSet::GlobalIndex IndexedType;
    \n-
    36
    \n-
    37 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
    \n+
    8#include <algorithm>
    \n+
    9#include <complex>
    \n+
    10#include <cstddef>
    \n+
    11#include <fstream>
    \n+
    12#include <ios>
    \n+
    13#include <iostream>
    \n+
    14#include <istream>
    \n+
    15#include <limits>
    \n+
    16#include <ostream>
    \n+
    17#include <set>
    \n+
    18#include <sstream>
    \n+
    19#include <string>
    \n+
    20#include <tuple>
    \n+
    21#include <type_traits>
    \n+
    22#include <vector>
    \n+
    23
    \n+
    24#include <dune/common/exceptions.hh>
    \n+
    25#include <dune/common/fmatrix.hh>
    \n+
    26#include <dune/common/fvector.hh>
    \n+
    27#include <dune/common/hybridutilities.hh>
    \n+
    28#include <dune/common/stdstreams.hh>
    \n+
    29#include <dune/common/simd/simd.hh>
    \n+
    30
    \n+\n+
    32#include <dune/istl/bvector.hh>
    \n+
    33#include <dune/istl/matrixutils.hh> // countNonZeros()
    \n+\n+
    35
    \n+
    36namespace Dune
    \n+
    37{
    \n
    38
    \n-
    39 typedef T Vertex;
    \n-
    40
    \n-
    \n-\n-
    42 const GlobalLookupIndexSet<ParallelIndexSet>& indexset)
    \n-
    43 : aggregates_(aggregates), indexset_(indexset)
    \n-
    44 {}
    \n-
    \n-
    45
    \n-
    \n-
    46 inline const GlobalIndex& operator[](std::size_t index) const
    \n-
    47 {
    \n-
    48 const Vertex& aggregate = aggregates_[index];
    \n-
    49 if(aggregate >= AggregatesMap<Vertex>::ISOLATED) {
    \n-
    50 assert(aggregate != AggregatesMap<Vertex>::UNAGGREGATED);
    \n-
    51 return isolatedMarker;
    \n-
    52 }else{
    \n-
    53 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
    \n-
    54 assert(pair!=0);
    \n-
    55 return pair->global();
    \n-
    56 }
    \n-
    57 }
    \n-
    \n-
    58
    \n-
    59
    \n-
    \n-
    60 inline GlobalIndex& get(std::size_t index)
    \n-
    61 {
    \n-
    62 const Vertex& aggregate = aggregates_[index];
    \n-
    63 assert(aggregate < AggregatesMap<Vertex>::ISOLATED);
    \n-
    64 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
    \n-
    65 assert(pair!=0);
    \n-
    66 return const_cast<GlobalIndex&>(pair->global());
    \n-
    67 }
    \n-
    \n-
    68
    \n-
    \n-
    69 class Proxy
    \n-
    70 {
    \n-
    71 public:
    \n-
    \n-
    72 Proxy(const GlobalLookupIndexSet<ParallelIndexSet>& indexset, Vertex& aggregate)
    \n-
    73 : indexset_(&indexset), aggregate_(&aggregate)
    \n-
    74 {}
    \n-
    \n-
    75
    \n-
    \n-
    76 Proxy& operator=(const GlobalIndex& global)
    \n-
    77 {
    \n-
    78 if(global==isolatedMarker)
    \n-\n-
    80 else{
    \n-
    81 //assert(global < AggregatesMap<Vertex>::ISOLATED);
    \n-
    82 *aggregate_ = indexset_->operator[](global).local();
    \n-
    83 }
    \n-
    84 return *this;
    \n-
    85 }
    \n-
    \n-
    86 private:
    \n-
    87 const GlobalLookupIndexSet<ParallelIndexSet>* indexset_;
    \n-
    88 Vertex* aggregate_;
    \n-
    89 };
    \n-
    \n-
    90
    \n-
    \n-
    91 inline Proxy operator[](std::size_t index)
    \n-
    92 {
    \n-
    93 return Proxy(indexset_, aggregates_[index]);
    \n-
    94 }
    \n-
    \n-
    95
    \n-
    \n-
    96 inline void put(const GlobalIndex& global, size_t i)
    \n-
    97 {
    \n-
    98 aggregates_[i]=indexset_[global].local();
    \n-
    99
    \n-
    100 }
    \n-
    \n-
    101
    \n-
    102 private:
    \n-
    103 AggregatesMap<Vertex>& aggregates_;
    \n-
    104 const GlobalLookupIndexSet<ParallelIndexSet>& indexset_;
    \n-
    105 static const GlobalIndex isolatedMarker;
    \n-
    106 };
    \n-
    \n-
    107
    \n-
    108 template<typename T, typename TI>
    \n-
    109 const typename TI::GlobalIndex GlobalAggregatesMap<T,TI>::isolatedMarker =
    \n-
    110 std::numeric_limits<typename TI::GlobalIndex>::max();
    \n-
    111
    \n-
    112 template<typename T, typename TI>
    \n-
    \n-\n-
    114 {
    \n-\n-
    116 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
    \n-
    117
    \n-
    \n-
    118 static const GlobalIndex& gather(const GlobalAggregatesMap<T,TI>& ga, size_t i)
    \n-
    119 {
    \n-
    120 return ga[i];
    \n-
    121 }
    \n-
    \n-
    122
    \n-
    \n-
    123 static void scatter(GlobalAggregatesMap<T,TI>& ga, GlobalIndex global, size_t i)
    \n-
    124 {
    \n-
    125 ga[i]=global;
    \n-
    126 }
    \n-
    \n-
    127 };
    \n-
    \n-
    128
    \n-
    129 template<typename T, typename O, typename I>
    \n-
    \n-\n-
    131 {};
    \n+
    \n+
    64 namespace MatrixMarketImpl
    \n+
    65 {
    \n+
    75 template<class T>
    \n+
    \n+\n+
    77 enum {
    \n+
    81 is_numeric=false
    \n+
    82 };
    \n+
    83 };
    \n+
    \n+
    84
    \n+
    85 template<>
    \n+
    \n+
    86 struct mm_numeric_type<int>
    \n+
    87 {
    \n+
    88 enum {
    \n+
    92 is_numeric=true
    \n+
    93 };
    \n+
    94
    \n+
    \n+
    95 static std::string str()
    \n+
    96 {
    \n+
    97 return "integer";
    \n+
    98 }
    \n+
    \n+
    99 };
    \n+
    \n+
    100
    \n+
    101 template<>
    \n+
    \n+
    102 struct mm_numeric_type<double>
    \n+
    103 {
    \n+
    104 enum {
    \n+
    108 is_numeric=true
    \n+
    109 };
    \n+
    110
    \n+
    \n+
    111 static std::string str()
    \n+
    112 {
    \n+
    113 return "real";
    \n+
    114 }
    \n+
    \n+
    115 };
    \n+
    \n+
    116
    \n+
    117 template<>
    \n+
    \n+
    118 struct mm_numeric_type<float>
    \n+
    119 {
    \n+
    120 enum {
    \n+
    124 is_numeric=true
    \n+
    125 };
    \n+
    126
    \n+
    \n+
    127 static std::string str()
    \n+
    128 {
    \n+
    129 return "real";
    \n+
    130 }
    \n+
    \n+
    131 };
    \n
    \n
    132
    \n-
    133#if HAVE_MPI
    \n-
    134
    \n-
    135#endif
    \n-
    136
    \n-
    137 } // namespace Amg
    \n-
    138
    \n-
    139#if HAVE_MPI
    \n-
    140 // forward declaration
    \n-
    141 template<class T1, class T2>
    \n-\n-
    143#endif
    \n-
    144
    \n-
    145 namespace Amg
    \n-
    146 {
    \n-
    147
    \n-
    148#if HAVE_MPI
    \n-
    158 template<typename T, typename O, typename T1, typename T2>
    \n-
    \n-\n-
    160 {
    \n-
    161 typedef T Vertex;
    \n-
    162 typedef O OverlapFlags;
    \n-\n-\n-\n-
    166
    \n-
    \n-
    167 static void publish(AggregatesMap<Vertex>& aggregates,
    \n-
    168 ParallelInformation& pinfo,
    \n-
    169 const GlobalLookupIndexSet& globalLookup)
    \n-
    170 {
    \n-\n-
    172 GlobalMap gmap(aggregates, globalLookup);
    \n-
    173 pinfo.copyOwnerToAll(gmap,gmap);
    \n-
    174 // communication only needed for ALU
    \n-
    175 // (ghosts with same global id as owners on the same process)
    \n-
    176 if (SolverCategory::category(pinfo) == static_cast<int>(SolverCategory::nonoverlapping))
    \n-
    177 pinfo.copyCopyToAll(gmap,gmap);
    \n-
    178
    \n-
    179 typedef typename ParallelInformation::RemoteIndices::const_iterator Lists;
    \n-
    180 Lists lists = pinfo.remoteIndices().find(pinfo.communicator().rank());
    \n-
    181 if(lists!=pinfo.remoteIndices().end()) {
    \n-
    182
    \n-
    183 // For periodic boundary conditions we must renumber
    \n-
    184 // the aggregates of vertices in the overlap whose owners are
    \n-
    185 // on the same process
    \n-
    186 Vertex maxAggregate =0;
    \n-
    187 typedef typename AggregatesMap<Vertex>::const_iterator Iter;
    \n-
    188 for(Iter i=aggregates.begin(), end=aggregates.end(); i!=end; ++i)
    \n-
    189 maxAggregate = std::max(maxAggregate, *i);
    \n-
    190
    \n-
    191 // Compute new mapping of aggregates in the overlap that we also own
    \n-
    192 std::map<Vertex,Vertex> newMapping;
    \n-
    193
    \n-
    194 // insert all elements into map
    \n-
    195 typedef typename ParallelInformation::RemoteIndices::RemoteIndexList
    \n-
    196 ::const_iterator RIter;
    \n-
    197 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
    \n-
    198 ri!=rend; ++ri)
    \n-
    199 if(O::contains(ri->localIndexPair().local().attribute()))
    \n-
    200 newMapping.insert(std::make_pair(aggregates[ri->localIndexPair().local()],
    \n-
    201 maxAggregate));
    \n-
    202 // renumber
    \n-
    203 typedef typename std::map<Vertex,Vertex>::iterator MIter;
    \n-
    204 for(MIter mi=newMapping.begin(), mend=newMapping.end();
    \n-
    205 mi != mend; ++mi)
    \n-
    206 mi->second=++maxAggregate;
    \n-
    207
    \n-
    208
    \n-
    209 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
    \n-
    210 ri!=rend; ++ri)
    \n-
    211 if(O::contains(ri->localIndexPair().local().attribute()))
    \n-
    212 aggregates[ri->localIndexPair().local()] =
    \n-
    213 newMapping[aggregates[ri->localIndexPair().local()]];
    \n-
    214 }
    \n-
    215 }
    \n-
    \n-
    216 };
    \n-
    \n-
    217#endif
    \n-
    218
    \n-
    219 template<typename T, typename O>
    \n-
    \n-\n-
    221 {
    \n-
    222 typedef T Vertex;
    \n-\n-\n-
    225
    \n-
    \n-
    226 static void publish([[maybe_unused]] AggregatesMap<Vertex>& aggregates,
    \n-
    227 [[maybe_unused]] ParallelInformation& pinfo,
    \n-
    228 [[maybe_unused]] const GlobalLookupIndexSet& globalLookup)
    \n-
    229 {}
    \n-
    \n-
    230 };
    \n-
    \n-
    231
    \n-
    232 } // end Amg namespace
    \n-
    233
    \n-
    234
    \n-
    235#if HAVE_MPI
    \n-
    236 template<typename T, typename TI>
    \n-
    \n-
    237 struct CommPolicy<Amg::GlobalAggregatesMap<T,TI> >
    \n-
    238 {
    \n-\n-\n-
    241 typedef SizeOne IndexedTypeFlag;
    \n-
    \n-
    242 static int getSize(const Type&, int)
    \n-
    243 {
    \n-
    244 return 1;
    \n-
    245 }
    \n-
    \n-
    246 };
    \n-
    \n-
    247#endif
    \n-
    248
    \n-
    249} // end Dune namespace
    \n-
    251#endif
    \n-
    Provides classes for the Coloring process of AMG.
    \n-\n-
    const_iterator begin() const
    Definition aggregates.hh:725
    \n-
    const_iterator end() const
    Definition aggregates.hh:730
    \n-
    const AggregateDescriptor * const_iterator
    Definition aggregates.hh:723
    \n+
    133 template<>
    \n+
    \n+
    134 struct mm_numeric_type<std::complex<double> >
    \n+
    135 {
    \n+
    136 enum {
    \n+
    140 is_numeric=true
    \n+
    141 };
    \n+
    142
    \n+
    \n+
    143 static std::string str()
    \n+
    144 {
    \n+
    145 return "complex";
    \n+
    146 }
    \n+
    \n+
    147 };
    \n+
    \n+
    148
    \n+
    149 template<>
    \n+
    \n+
    150 struct mm_numeric_type<std::complex<float> >
    \n+
    151 {
    \n+
    152 enum {
    \n+
    156 is_numeric=true
    \n+
    157 };
    \n+
    158
    \n+
    \n+
    159 static std::string str()
    \n+
    160 {
    \n+
    161 return "complex";
    \n+
    162 }
    \n+
    \n+
    163 };
    \n+
    \n+
    164
    \n+
    173 template<class M>
    \n+\n+
    175
    \n+
    176 template<typename T, typename A>
    \n+
    \n+\n+
    178 {
    \n+
    \n+
    179 static void print(std::ostream& os)
    \n+
    180 {
    \n+
    181 os<<"%%MatrixMarket matrix coordinate ";
    \n+
    182 os<<mm_numeric_type<Simd::Scalar<typename Imp::BlockTraits<T>::field_type>>::str()<<" general"<<std::endl;
    \n+
    183 }
    \n+
    \n+
    184 };
    \n+
    \n+
    185
    \n+
    186 template<typename B, typename A>
    \n+
    \n+\n+
    188 {
    \n+
    \n+
    189 static void print(std::ostream& os)
    \n+
    190 {
    \n+
    191 os<<"%%MatrixMarket matrix array ";
    \n+
    192 os<<mm_numeric_type<Simd::Scalar<typename Imp::BlockTraits<B>::field_type>>::str()<<" general"<<std::endl;
    \n+
    193 }
    \n+
    \n+
    194 };
    \n+
    \n+
    195
    \n+
    196 template<typename T, int j>
    \n+
    \n+
    197 struct mm_header_printer<FieldVector<T,j> >
    \n+
    198 {
    \n+
    \n+
    199 static void print(std::ostream& os)
    \n+
    200 {
    \n+
    201 os<<"%%MatrixMarket matrix array ";
    \n+
    202 os<<mm_numeric_type<T>::str()<<" general"<<std::endl;
    \n+
    203 }
    \n+
    \n+
    204 };
    \n+
    \n+
    205
    \n+
    206 template<typename T, int i, int j>
    \n+
    \n+\n+
    208 {
    \n+
    \n+
    209 static void print(std::ostream& os)
    \n+
    210 {
    \n+
    211 os<<"%%MatrixMarket matrix array ";
    \n+
    212 os<<mm_numeric_type<T>::str()<<" general"<<std::endl;
    \n+
    213 }
    \n+
    \n+
    214 };
    \n+
    \n+
    215
    \n+
    224 template<class M>
    \n+\n+
    226
    \n+
    227 template<typename T, typename A>
    \n+
    \n+\n+
    229 {
    \n+\n+
    231 static_assert(IsNumber<T>::value, "Only scalar entries are expected here!");
    \n+
    232
    \n+
    \n+
    233 static void print(std::ostream& os, const M&)
    \n+
    234 {
    \n+
    235 os<<"% ISTL_STRUCT blocked ";
    \n+
    236 os<<"1 1"<<std::endl;
    \n+
    237 }
    \n+
    \n+
    238 };
    \n+
    \n+
    239
    \n+
    240 template<typename T, typename A, int i>
    \n+
    \n+
    241 struct mm_block_structure_header<BlockVector<FieldVector<T,i>,A> >
    \n+
    242 {
    \n+\n+
    244
    \n+
    \n+
    245 static void print(std::ostream& os, const M&)
    \n+
    246 {
    \n+
    247 os<<"% ISTL_STRUCT blocked ";
    \n+
    248 os<<i<<" "<<1<<std::endl;
    \n+
    249 }
    \n+
    \n+
    250 };
    \n+
    \n+
    251
    \n+
    252 template<typename T, typename A>
    \n+
    \n+\n+
    254 {
    \n+\n+
    256 static_assert(IsNumber<T>::value, "Only scalar entries are expected here!");
    \n+
    257
    \n+
    \n+
    258 static void print(std::ostream& os, const M&)
    \n+
    259 {
    \n+
    260 os<<"% ISTL_STRUCT blocked ";
    \n+
    261 os<<"1 1"<<std::endl;
    \n+
    262 }
    \n+
    \n+
    263 };
    \n+
    \n+
    264
    \n+
    265 template<typename T, typename A, int i, int j>
    \n+
    \n+\n+
    267 {
    \n+\n+
    269
    \n+
    \n+
    270 static void print(std::ostream& os, const M&)
    \n+
    271 {
    \n+
    272 os<<"% ISTL_STRUCT blocked ";
    \n+
    273 os<<i<<" "<<j<<std::endl;
    \n+
    274 }
    \n+
    \n+
    275 };
    \n+
    \n+
    276
    \n+
    277
    \n+
    278 template<typename T, int i, int j>
    \n+
    \n+\n+
    280 {
    \n+\n+
    282
    \n+
    \n+
    283 static void print(std::ostream& os, const M& m)
    \n+
    284 {}
    \n+
    \n+
    285 };
    \n+
    \n+
    286
    \n+
    287 template<typename T, int i>
    \n+
    \n+
    288 struct mm_block_structure_header<FieldVector<T,i> >
    \n+
    289 {
    \n+
    290 typedef FieldVector<T,i> M;
    \n+
    291
    \n+
    \n+
    292 static void print(std::ostream& os, const M& m)
    \n+
    293 {}
    \n+
    \n+
    294 };
    \n+
    \n+
    295
    \n+\n+
    297 enum { MM_MAX_LINE_LENGTH=1025 };
    \n+
    298
    \n+\n+
    300
    \n+\n+
    302
    \n+\n+
    304
    \n+
    \n+
    305 struct MMHeader
    \n+
    306 {
    \n+\n+\n+\n+\n+
    313 };
    \n+
    \n+
    314
    \n+
    \n+
    315 inline bool lineFeed(std::istream& file)
    \n+
    316 {
    \n+
    317 char c;
    \n+
    318 if(!file.eof())
    \n+
    319 c=file.peek();
    \n+
    320 else
    \n+
    321 return false;
    \n+
    322 // ignore whitespace
    \n+
    323 while(c==' ')
    \n+
    324 {
    \n+
    325 file.get();
    \n+
    326 if(file.eof())
    \n+
    327 return false;
    \n+
    328 c=file.peek();
    \n+
    329 }
    \n+
    330
    \n+
    331 if(c=='\\n') {
    \n+
    332 /* eat the line feed */
    \n+
    333 file.get();
    \n+
    334 return true;
    \n+
    335 }
    \n+
    336 return false;
    \n+
    337 }
    \n+
    \n+
    338
    \n+
    \n+
    339 inline void skipComments(std::istream& file)
    \n+
    340 {
    \n+
    341 lineFeed(file);
    \n+
    342 char c=file.peek();
    \n+
    343 // ignore comment lines
    \n+
    344 while(c=='%')
    \n+
    345 {
    \n+
    346 /* discard the rest of the line */
    \n+
    347 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    348 c=file.peek();
    \n+
    349 }
    \n+
    350 }
    \n+
    \n+
    351
    \n+
    352
    \n+
    \n+
    353 inline bool readMatrixMarketBanner(std::istream& file, MMHeader& mmHeader)
    \n+
    354 {
    \n+
    355 std::string buffer;
    \n+
    356 char c;
    \n+
    357 file >> buffer;
    \n+
    358 c=buffer[0];
    \n+
    359 mmHeader=MMHeader();
    \n+
    360 if(c!='%')
    \n+
    361 return false;
    \n+
    362 dverb<<buffer<<std::endl;
    \n+
    363 /* read the banner */
    \n+
    364 if(buffer!="%%MatrixMarket") {
    \n+
    365 /* discard the rest of the line */
    \n+
    366 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    367 return false;
    \n+
    368 }
    \n+
    369
    \n+
    370 if(lineFeed(file))
    \n+
    371 /* premature end of line */
    \n+
    372 return false;
    \n+
    373
    \n+
    374 /* read the matrix_type */
    \n+
    375 file >> buffer;
    \n+
    376
    \n+
    377 if(buffer != "matrix")
    \n+
    378 {
    \n+
    379 /* discard the rest of the line */
    \n+
    380 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    381 return false;
    \n+
    382 }
    \n+
    383
    \n+
    384 if(lineFeed(file))
    \n+
    385 /* premature end of line */
    \n+
    386 return false;
    \n+
    387
    \n+
    388 /* The type of the matrix */
    \n+
    389 file >> buffer;
    \n+
    390
    \n+
    391 if(buffer.empty())
    \n+
    392 return false;
    \n+
    393
    \n+
    394 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
    \n+
    395 ::tolower);
    \n+
    396
    \n+
    397 switch(buffer[0])
    \n+
    398 {
    \n+
    399 case 'a' :
    \n+
    400 /* sanity check */
    \n+
    401 if(buffer != "array")
    \n+
    402 {
    \n+
    403 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    404 return false;
    \n+
    405 }
    \n+
    406 mmHeader.type=array_type;
    \n+
    407 break;
    \n+
    408 case 'c' :
    \n+
    409 /* sanity check */
    \n+
    410 if(buffer != "coordinate")
    \n+
    411 {
    \n+
    412 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    413 return false;
    \n+
    414 }
    \n+
    415 mmHeader.type=coordinate_type;
    \n+
    416 break;
    \n+
    417 default :
    \n+
    418 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    419 return false;
    \n+
    420 }
    \n+
    421
    \n+
    422 if(lineFeed(file))
    \n+
    423 /* premature end of line */
    \n+
    424 return false;
    \n+
    425
    \n+
    426 /* The numeric type used. */
    \n+
    427 file >> buffer;
    \n+
    428
    \n+
    429 if(buffer.empty())
    \n+
    430 return false;
    \n+
    431
    \n+
    432 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
    \n+
    433 ::tolower);
    \n+
    434 switch(buffer[0])
    \n+
    435 {
    \n+
    436 case 'i' :
    \n+
    437 /* sanity check */
    \n+
    438 if(buffer != "integer")
    \n+
    439 {
    \n+
    440 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    441 return false;
    \n+
    442 }
    \n+
    443 mmHeader.ctype=integer_type;
    \n+
    444 break;
    \n+
    445 case 'r' :
    \n+
    446 /* sanity check */
    \n+
    447 if(buffer != "real")
    \n+
    448 {
    \n+
    449 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    450 return false;
    \n+
    451 }
    \n+
    452 mmHeader.ctype=double_type;
    \n+
    453 break;
    \n+
    454 case 'c' :
    \n+
    455 /* sanity check */
    \n+
    456 if(buffer != "complex")
    \n+
    457 {
    \n+
    458 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    459 return false;
    \n+
    460 }
    \n+
    461 mmHeader.ctype=complex_type;
    \n+
    462 break;
    \n+
    463 case 'p' :
    \n+
    464 /* sanity check */
    \n+
    465 if(buffer != "pattern")
    \n+
    466 {
    \n+
    467 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    468 return false;
    \n+
    469 }
    \n+
    470 mmHeader.ctype=pattern;
    \n+
    471 break;
    \n+
    472 default :
    \n+
    473 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    474 return false;
    \n+
    475 }
    \n+
    476
    \n+
    477 if(lineFeed(file))
    \n+
    478 return false;
    \n+
    479
    \n+
    480 file >> buffer;
    \n+
    481
    \n+
    482 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
    \n+
    483 ::tolower);
    \n+
    484 switch(buffer[0])
    \n+
    485 {
    \n+
    486 case 'g' :
    \n+
    487 /* sanity check */
    \n+
    488 if(buffer != "general")
    \n+
    489 {
    \n+
    490 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    491 return false;
    \n+
    492 }
    \n+
    493 mmHeader.structure=general;
    \n+
    494 break;
    \n+
    495 case 'h' :
    \n+
    496 /* sanity check */
    \n+
    497 if(buffer != "hermitian")
    \n+
    498 {
    \n+
    499 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    500 return false;
    \n+
    501 }
    \n+
    502 mmHeader.structure=hermitian;
    \n+
    503 break;
    \n+
    504 case 's' :
    \n+
    505 if(buffer.size()==1) {
    \n+
    506 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    507 return false;
    \n+
    508 }
    \n+
    509
    \n+
    510 switch(buffer[1])
    \n+
    511 {
    \n+
    512 case 'y' :
    \n+
    513 /* sanity check */
    \n+
    514 if(buffer != "symmetric")
    \n+
    515 {
    \n+
    516 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    517 return false;
    \n+
    518 }
    \n+
    519 mmHeader.structure=symmetric;
    \n+
    520 break;
    \n+
    521 case 'k' :
    \n+
    522 /* sanity check */
    \n+
    523 if(buffer != "skew-symmetric")
    \n+
    524 {
    \n+
    525 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    526 return false;
    \n+
    527 }
    \n+
    528 mmHeader.structure=skew_symmetric;
    \n+
    529 break;
    \n+
    530 default :
    \n+
    531 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    532 return false;
    \n+
    533 }
    \n+
    534 break;
    \n+
    535 default :
    \n+
    536 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    537 return false;
    \n+
    538 }
    \n+
    539 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    540 c=file.peek();
    \n+
    541 return true;
    \n+
    542
    \n+
    543 }
    \n+
    \n+
    544
    \n+
    545 template<std::size_t brows, std::size_t bcols>
    \n+
    546 std::tuple<std::size_t, std::size_t, std::size_t>
    \n+
    \n+
    547 calculateNNZ(std::size_t rows, std::size_t cols, std::size_t entries, const MMHeader& header)
    \n+
    548 {
    \n+
    549 std::size_t blockrows=rows/brows;
    \n+
    550 std::size_t blockcols=cols/bcols;
    \n+
    551 std::size_t blocksize=brows*bcols;
    \n+
    552 std::size_t blockentries=0;
    \n+
    553
    \n+
    554 switch(header.structure)
    \n+
    555 {
    \n+
    556 case general :
    \n+
    557 blockentries = entries/blocksize; break;
    \n+
    558 case skew_symmetric :
    \n+
    559 blockentries = 2*entries/blocksize; break;
    \n+
    560 case symmetric :
    \n+
    561 blockentries = (2*entries-rows)/blocksize; break;
    \n+
    562 case hermitian :
    \n+
    563 blockentries = (2*entries-rows)/blocksize; break;
    \n+
    564 default :
    \n+
    565 throw Dune::NotImplemented();
    \n+
    566 }
    \n+
    567 return std::make_tuple(blockrows, blockcols, blockentries);
    \n+
    568 }
    \n+
    \n+
    569
    \n+
    570 /*
    \n+
    571 * @brief Storage class for the column index and the numeric value.
    \n+
    572 *
    \n+
    573 * \\tparam T Either a NumericWrapper of the numeric type or PatternDummy
    \n+
    574 * for MatrixMarket pattern case.
    \n+
    575 */
    \n+
    576 template<typename T>
    \n+
    \n+
    577 struct IndexData : public T
    \n+
    578 {
    \n+
    579 std::size_t index = {};
    \n+
    580 };
    \n+
    \n+
    581
    \n+
    582
    \n+
    593 template<typename T>
    \n+
    \n+\n+
    595 {
    \n+
    596 T number = {};
    \n+
    \n+
    597 operator T&()
    \n+
    598 {
    \n+
    599 return number;
    \n+
    600 }
    \n+
    \n+
    601 };
    \n+
    \n+
    602
    \n+
    \n+\n+
    607 {};
    \n+
    \n+
    608
    \n+
    609 template<>
    \n+
    \n+\n+
    611 {};
    \n+
    \n+
    612
    \n+
    613 template<typename T>
    \n+
    \n+
    614 std::istream& operator>>(std::istream& is, NumericWrapper<T>& num)
    \n+
    615 {
    \n+
    616 return is>>num.number;
    \n+
    617 }
    \n+
    \n+
    618
    \n+
    \n+
    619 inline std::istream& operator>>(std::istream& is, [[maybe_unused]] NumericWrapper<PatternDummy>& num)
    \n+
    620 {
    \n+
    621 return is;
    \n+
    622 }
    \n+
    \n+
    623
    \n+
    629 template<typename T>
    \n+
    \n+
    630 bool operator<(const IndexData<T>& i1, const IndexData<T>& i2)
    \n+
    631 {
    \n+
    632 return i1.index<i2.index;
    \n+
    633 }
    \n+
    \n+
    634
    \n+
    640 template<typename T>
    \n+
    \n+
    641 std::istream& operator>>(std::istream& is, IndexData<T>& data)
    \n+
    642 {
    \n+
    643 is>>data.index;
    \n+
    644 /* MatrixMarket indices are one based. Decrement for C++ */
    \n+
    645 --data.index;
    \n+
    646 return is>>data.number;
    \n+
    647 }
    \n+
    \n+
    648
    \n+
    654 template<typename T>
    \n+
    \n+
    655 std::istream& operator>>(std::istream& is, IndexData<NumericWrapper<std::complex<T>>>& data)
    \n+
    656 {
    \n+
    657 is>>data.index;
    \n+
    658 /* MatrixMarket indices are one based. Decrement for C++ */
    \n+
    659 --data.index;
    \n+
    660 // real and imaginary part needs to be read separately as
    \n+
    661 // complex numbers are not provided in pair form. (x,y)
    \n+
    662 NumericWrapper<T> real, imag;
    \n+
    663 is>>real;
    \n+
    664 is>>imag;
    \n+
    665 data.number = {real.number, imag.number};
    \n+
    666 return is;
    \n+
    667 }
    \n+
    \n+
    668
    \n+
    675 template<typename D, int brows, int bcols>
    \n+
    \n+\n+
    677 {
    \n+
    683 template<typename T>
    \n+
    \n+
    684 void operator()(const std::vector<std::set<IndexData<D> > >& rows,
    \n+
    685 BCRSMatrix<T>& matrix)
    \n+
    686 {
    \n+
    687 static_assert(IsNumber<T>::value && brows==1 && bcols==1, "Only scalar entries are expected here!");
    \n+
    688 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter)
    \n+
    689 {
    \n+
    690 auto brow=iter.index();
    \n+
    691 for (auto siter=rows[brow].begin(); siter != rows[brow].end(); ++siter)
    \n+
    692 (*iter)[siter->index] = siter->number;
    \n+
    693 }
    \n+
    694 }
    \n+
    \n+
    695
    \n+
    701 template<typename T>
    \n+
    \n+
    702 void operator()(const std::vector<std::set<IndexData<D> > >& rows,
    \n+\n+
    704 {
    \n+
    705 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter)
    \n+
    706 {
    \n+
    707 for (auto brow=iter.index()*brows,
    \n+
    708 browend=iter.index()*brows+brows;
    \n+
    709 brow<browend; ++brow)
    \n+
    710 {
    \n+
    711 for (auto siter=rows[brow].begin(), send=rows[brow].end();
    \n+
    712 siter != send; ++siter)
    \n+
    713 (*iter)[siter->index/bcols][brow%brows][siter->index%bcols]=siter->number;
    \n+
    714 }
    \n+
    715 }
    \n+
    716 }
    \n+
    \n+
    717 };
    \n+
    \n+
    718
    \n+
    719 template<int brows, int bcols>
    \n+
    \n+\n+
    721 {
    \n+
    722 template<typename M>
    \n+
    \n+
    723 void operator()(const std::vector<std::set<IndexData<PatternDummy> > >& rows,
    \n+
    724 M& matrix)
    \n+
    725 {}
    \n+
    \n+
    726 };
    \n+
    \n+
    727
    \n+
    728 template<class T> struct is_complex : std::false_type {};
    \n+
    729 template<class T> struct is_complex<std::complex<T>> : std::true_type {};
    \n+
    730
    \n+
    731 // wrapper for std::conj. Returns T if T is not complex.
    \n+
    732 template<class T>
    \n+
    \n+
    733 std::enable_if_t<!is_complex<T>::value, T> conj(const T& r){
    \n+
    734 return r;
    \n+
    735 }
    \n+
    \n+
    736
    \n+
    737 template<class T>
    \n+
    \n+
    738 std::enable_if_t<is_complex<T>::value, T> conj(const T& r){
    \n+
    739 return std::conj(r);
    \n+
    740 }
    \n+
    \n+
    741
    \n+
    742 template<typename M>
    \n+
    \n+\n+
    744 {};
    \n+
    \n+
    745
    \n+
    746 template<typename B, typename A>
    \n+
    \n+\n+
    748 {
    \n+
    749 enum {
    \n+
    750 rows = 1,
    \n+
    751 cols = 1
    \n+
    752 };
    \n+
    753 };
    \n+
    \n+
    754
    \n+
    755 template<typename B, int i, int j, typename A>
    \n+
    \n+\n+
    757 {
    \n+
    758 enum {
    \n+
    759 rows = i,
    \n+
    760 cols = j
    \n+
    761 };
    \n+
    762 };
    \n+
    \n+
    763
    \n+
    764 template<typename T, typename A, typename D>
    \n+
    \n+\n+
    766 std::istream& file, std::size_t entries,
    \n+
    767 const MMHeader& mmHeader, const D&)
    \n+
    768 {
    \n+\n+
    770
    \n+
    771 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)
    \n+
    772 constexpr int brows = mm_multipliers<Matrix>::rows;
    \n+
    773 constexpr int bcols = mm_multipliers<Matrix>::cols;
    \n+
    774
    \n+
    775 // First path
    \n+
    776 // store entries together with column index in a separate
    \n+
    777 // data structure
    \n+
    778 std::vector<std::set<IndexData<D> > > rows(matrix.N()*brows);
    \n+
    779
    \n+
    780 auto readloop = [&] (auto symmetryFixup) {
    \n+
    781 for(std::size_t i = 0; i < entries; ++i) {
    \n+
    782 std::size_t row;
    \n+
    783 IndexData<D> data;
    \n+
    784 skipComments(file);
    \n+
    785 file>>row;
    \n+
    786 --row; // Index was 1 based.
    \n+
    787 assert(row/bcols<matrix.N());
    \n+
    788 file>>data;
    \n+
    789 assert(data.index/bcols<matrix.M());
    \n+
    790 rows[row].insert(data);
    \n+
    791 if(row!=data.index)
    \n+
    792 symmetryFixup(row, data);
    \n+
    793 }
    \n+
    794 };
    \n+
    795
    \n+
    796 switch(mmHeader.structure)
    \n+
    797 {
    \n+
    798 case general:
    \n+
    799 readloop([](auto...){});
    \n+
    800 break;
    \n+
    801 case symmetric :
    \n+
    802 readloop([&](auto row, auto data) {
    \n+
    803 IndexData<D> data_sym(data);
    \n+
    804 data_sym.index = row;
    \n+
    805 rows[data.index].insert(data_sym);
    \n+
    806 });
    \n+
    807 break;
    \n+
    808 case skew_symmetric :
    \n+
    809 readloop([&](auto row, auto data) {
    \n+
    810 IndexData<D> data_sym;
    \n+
    811 data_sym.number = -data.number;
    \n+
    812 data_sym.index = row;
    \n+
    813 rows[data.index].insert(data_sym);
    \n+
    814 });
    \n+
    815 break;
    \n+
    816 case hermitian :
    \n+
    817 readloop([&](auto row, auto data) {
    \n+
    818 IndexData<D> data_sym;
    \n+
    819 data_sym.number = conj(data.number);
    \n+
    820 data_sym.index = row;
    \n+
    821 rows[data.index].insert(data_sym);
    \n+
    822 });
    \n+
    823 break;
    \n+
    824 default:
    \n+
    825 DUNE_THROW(Dune::NotImplemented,
    \n+
    826 "Only general, symmetric, skew-symmetric and hermitian is supported right now!");
    \n+
    827 }
    \n+
    828
    \n+
    829 // Setup the matrix sparsity pattern
    \n+
    830 int nnz=0;
    \n+
    831 for(typename Matrix::CreateIterator iter=matrix.createbegin();
    \n+
    832 iter!= matrix.createend(); ++iter)
    \n+
    833 {
    \n+
    834 for(std::size_t brow=iter.index()*brows, browend=iter.index()*brows+brows;
    \n+
    835 brow<browend; ++brow)
    \n+
    836 {
    \n+
    837 typedef typename std::set<IndexData<D> >::const_iterator Siter;
    \n+
    838 for(Siter siter=rows[brow].begin(), send=rows[brow].end();
    \n+
    839 siter != send; ++siter, ++nnz)
    \n+
    840 iter.insert(siter->index/bcols);
    \n+
    841 }
    \n+
    842 }
    \n+
    843
    \n+
    844 //Set the matrix values
    \n+
    845 matrix=0;
    \n+
    846
    \n+\n+
    848
    \n+
    849 Setter(rows, matrix);
    \n+
    850 }
    \n+
    \n+
    851
    \n+
    \n+
    852 inline std::tuple<std::string, std::string> splitFilename(const std::string& filename) {
    \n+
    853 std::size_t lastdot = filename.find_last_of(".");
    \n+
    854 if(lastdot == std::string::npos)
    \n+
    855 return std::make_tuple(filename, "");
    \n+
    856 else {
    \n+
    857 std::string potentialFileExtension = filename.substr(lastdot);
    \n+
    858 if (potentialFileExtension == ".mm" || potentialFileExtension == ".mtx")
    \n+
    859 return std::make_tuple(filename.substr(0, lastdot), potentialFileExtension);
    \n+
    860 else
    \n+
    861 return std::make_tuple(filename, "");
    \n+
    862 }
    \n+
    863 }
    \n+
    \n+
    864
    \n+
    865 } // end namespace MatrixMarketImpl
    \n+
    \n+
    866
    \n+
    \n+
    867 class MatrixMarketFormatError : public Dune::Exception
    \n+
    868 {};
    \n+
    \n+
    869
    \n+
    870
    \n+
    \n+
    871 inline void mm_read_header(std::size_t& rows, std::size_t& cols,
    \n+
    872 MatrixMarketImpl::MMHeader& header, std::istream& istr,
    \n+
    873 bool isVector)
    \n+
    874 {
    \n+
    875 using namespace MatrixMarketImpl;
    \n+
    876
    \n+
    877 if(!readMatrixMarketBanner(istr, header)) {
    \n+
    878 std::cerr << "First line was not a correct Matrix Market banner. Using default:\\n"
    \n+
    879 << "%%MatrixMarket matrix coordinate real general"<<std::endl;
    \n+
    880 // Go to the beginning of the file
    \n+
    881 istr.clear() ;
    \n+
    882 istr.seekg(0, std::ios::beg);
    \n+
    883 if(isVector)
    \n+
    884 header.type=array_type;
    \n+
    885 }
    \n+
    886
    \n+
    887 skipComments(istr);
    \n+
    888
    \n+
    889 if(lineFeed(istr))
    \n+\n+
    891
    \n+
    892 istr >> rows;
    \n+
    893
    \n+
    894 if(lineFeed(istr))
    \n+\n+
    896 istr >> cols;
    \n+
    897 }
    \n+
    \n+
    898
    \n+
    899 template<typename T, typename A>
    \n+
    \n+\n+
    901 std::size_t size,
    \n+
    902 std::istream& istr,
    \n+
    903 size_t lane)
    \n+
    904 {
    \n+
    905 for (int i=0; size>0; ++i, --size)
    \n+
    906 istr>>Simd::lane(lane,vector[i]);
    \n+
    907 }
    \n+
    \n+
    908
    \n+
    909 template<typename T, typename A, int entries>
    \n+
    \n+
    910 void mm_read_vector_entries(Dune::BlockVector<Dune::FieldVector<T,entries>,A>& vector,
    \n+
    911 std::size_t size,
    \n+
    912 std::istream& istr,
    \n+
    913 size_t lane)
    \n+
    914 {
    \n+
    915 for(int i=0; size>0; ++i, --size) {
    \n+
    916 Simd::Scalar<T> val;
    \n+
    917 istr>>val;
    \n+
    918 Simd::lane(lane, vector[i/entries][i%entries])=val;
    \n+
    919 }
    \n+
    920 }
    \n+
    \n+
    921
    \n+
    922
    \n+
    929 template<typename T, typename A>
    \n+
    \n+\n+
    931 std::istream& istr)
    \n+
    932 {
    \n+
    933 typedef typename Dune::BlockVector<T,A>::field_type field_type;
    \n+
    934 using namespace MatrixMarketImpl;
    \n+
    935
    \n+
    936 MMHeader header;
    \n+
    937 std::size_t rows, cols;
    \n+
    938 mm_read_header(rows,cols,header,istr, true);
    \n+
    939 if(cols!=Simd::lanes<field_type>()) {
    \n+
    940 if(Simd::lanes<field_type>() == 1)
    \n+
    941 DUNE_THROW(MatrixMarketFormatError, "cols!=1, therefore this is no vector!");
    \n+
    942 else
    \n+
    943 DUNE_THROW(MatrixMarketFormatError, "cols does not match the number of lanes in the field_type!");
    \n+
    944 }
    \n+
    945
    \n+
    946 if(header.type!=array_type)
    \n+
    947 DUNE_THROW(MatrixMarketFormatError, "Vectors have to be stored in array format!");
    \n+
    948
    \n+
    949
    \n+
    950 if constexpr (Dune::IsNumber<T>())
    \n+
    951 vector.resize(rows);
    \n+
    952 else
    \n+
    953 {
    \n+
    954 T dummy;
    \n+
    955 auto blocksize = dummy.size();
    \n+
    956 std::size_t size=rows/blocksize;
    \n+
    957 if(size*blocksize!=rows)
    \n+
    958 DUNE_THROW(MatrixMarketFormatError, "Block size of vector is not correct!");
    \n+
    959
    \n+
    960 vector.resize(size);
    \n+
    961 }
    \n+
    962
    \n+
    963 istr.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    964 for(size_t l=0;l<Simd::lanes<field_type>();++l){
    \n+
    965 mm_read_vector_entries(vector, rows, istr, l);
    \n+
    966 }
    \n+
    967 }
    \n+
    \n+
    968
    \n+
    975 template<typename T, typename A>
    \n+
    \n+\n+
    977 std::istream& istr)
    \n+
    978 {
    \n+
    979 using namespace MatrixMarketImpl;
    \n+\n+
    981
    \n+
    982 MMHeader header;
    \n+
    983 if(!readMatrixMarketBanner(istr, header)) {
    \n+
    984 std::cerr << "First line was not a correct Matrix Market banner. Using default:\\n"
    \n+
    985 << "%%MatrixMarket matrix coordinate real general"<<std::endl;
    \n+
    986 // Go to the beginning of the file
    \n+
    987 istr.clear() ;
    \n+
    988 istr.seekg(0, std::ios::beg);
    \n+
    989 }
    \n+
    990 skipComments(istr);
    \n+
    991
    \n+
    992 std::size_t rows, cols, entries;
    \n+
    993
    \n+
    994 if(lineFeed(istr))
    \n+\n+
    996
    \n+
    997 istr >> rows;
    \n+
    998
    \n+
    999 if(lineFeed(istr))
    \n+\n+
    1001 istr >> cols;
    \n+
    1002
    \n+
    1003 if(lineFeed(istr))
    \n+\n+
    1005
    \n+
    1006 istr >>entries;
    \n+
    1007
    \n+
    1008 std::size_t nnz, blockrows, blockcols;
    \n+
    1009
    \n+
    1010 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)
    \n+
    1011 constexpr int brows = mm_multipliers<Matrix>::rows;
    \n+
    1012 constexpr int bcols = mm_multipliers<Matrix>::cols;
    \n+
    1013
    \n+
    1014 std::tie(blockrows, blockcols, nnz) = calculateNNZ<brows, bcols>(rows, cols, entries, header);
    \n+
    1015
    \n+
    1016 istr.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n+
    1017
    \n+
    1018
    \n+
    1019 matrix.setSize(blockrows, blockcols, nnz);
    \n+\n+
    1021
    \n+
    1022 if(header.type==array_type)
    \n+
    1023 DUNE_THROW(Dune::NotImplemented, "Array format currently not supported for matrices!");
    \n+
    1024
    \n+
    1025 readSparseEntries(matrix, istr, entries, header, NumericWrapper<typename Matrix::field_type>());
    \n+
    1026 }
    \n+
    \n+
    1027
    \n+
    1028 // Print a scalar entry
    \n+
    1029 template<typename B>
    \n+
    \n+
    1030 void mm_print_entry(const B& entry,
    \n+
    1031 std::size_t rowidx,
    \n+
    1032 std::size_t colidx,
    \n+
    1033 std::ostream& ostr)
    \n+
    1034 {
    \n+
    1035 if constexpr (IsNumber<B>())
    \n+
    1036 ostr << rowidx << " " << colidx << " " << entry << std::endl;
    \n+
    1037 else
    \n+
    1038 {
    \n+
    1039 for (auto row=entry.begin(); row != entry.end(); ++row, ++rowidx) {
    \n+
    1040 int coli=colidx;
    \n+
    1041 for (auto col = row->begin(); col != row->end(); ++col, ++coli)
    \n+
    1042 ostr<< rowidx<<" "<<coli<<" "<<*col<<std::endl;
    \n+
    1043 }
    \n+
    1044 }
    \n+
    1045 }
    \n+
    \n+
    1046
    \n+
    1047 // Write a vector entry
    \n+
    1048 template<typename V>
    \n+
    \n+
    1049 void mm_print_vector_entry(const V& entry, std::ostream& ostr,
    \n+
    1050 const std::integral_constant<int,1>&,
    \n+
    1051 size_t lane)
    \n+
    1052 {
    \n+
    1053 ostr<<Simd::lane(lane,entry)<<std::endl;
    \n+
    1054 }
    \n+
    \n+
    1055
    \n+
    1056 // Write a vector
    \n+
    1057 template<typename V>
    \n+
    \n+
    1058 void mm_print_vector_entry(const V& vector, std::ostream& ostr,
    \n+
    1059 const std::integral_constant<int,0>&,
    \n+
    1060 size_t lane)
    \n+
    1061 {
    \n+
    1062 using namespace MatrixMarketImpl;
    \n+
    1063
    \n+
    1064 // Is the entry a supported numeric type?
    \n+
    1065 const int isnumeric = mm_numeric_type<Simd::Scalar<typename V::block_type>>::is_numeric;
    \n+
    1066 typedef typename V::const_iterator VIter;
    \n+
    1067
    \n+
    1068 for(VIter i=vector.begin(); i != vector.end(); ++i)
    \n+
    1069
    \n+
    1070 mm_print_vector_entry(*i, ostr,
    \n+
    1071 std::integral_constant<int,isnumeric>(),
    \n+
    1072 lane);
    \n+
    1073 }
    \n+
    \n+
    1074
    \n+
    1075 template<typename T, typename A>
    \n+
    \n+
    1076 std::size_t countEntries(const BlockVector<T,A>& vector)
    \n+
    1077 {
    \n+
    1078 return vector.size();
    \n+
    1079 }
    \n+
    \n+
    1080
    \n+
    1081 template<typename T, typename A, int i>
    \n+
    \n+
    1082 std::size_t countEntries(const BlockVector<FieldVector<T,i>,A>& vector)
    \n+
    1083 {
    \n+
    1084 return vector.size()*i;
    \n+
    1085 }
    \n+
    \n+
    1086
    \n+
    1087 // Version for writing vectors.
    \n+
    1088 template<typename V>
    \n+
    \n+
    1089 void writeMatrixMarket(const V& vector, std::ostream& ostr,
    \n+
    1090 const std::integral_constant<int,0>&)
    \n+
    1091 {
    \n+
    1092 using namespace MatrixMarketImpl;
    \n+
    1093 typedef typename V::field_type field_type;
    \n+
    1094
    \n+
    1095 ostr<<countEntries(vector)<<" "<<Simd::lanes<field_type>()<<std::endl;
    \n+
    1096 const int isnumeric = mm_numeric_type<Simd::Scalar<V>>::is_numeric;
    \n+
    1097 for(size_t l=0;l<Simd::lanes<field_type>(); ++l){
    \n+
    1098 mm_print_vector_entry(vector,ostr, std::integral_constant<int,isnumeric>(), l);
    \n+
    1099 }
    \n+
    1100 }
    \n+
    \n+
    1101
    \n+
    1102 // Versions for writing matrices
    \n+
    1103 template<typename M>
    \n+
    \n+
    1104 void writeMatrixMarket(const M& matrix,
    \n+
    1105 std::ostream& ostr,
    \n+
    1106 const std::integral_constant<int,1>&)
    \n+
    1107 {
    \n+
    1108 ostr<<matrix.N()*MatrixMarketImpl::mm_multipliers<M>::rows<<" "
    \n+\n+
    1110 <<countNonZeros(matrix)<<std::endl;
    \n+
    1111
    \n+
    1112 typedef typename M::const_iterator riterator;
    \n+
    1113 typedef typename M::ConstColIterator citerator;
    \n+
    1114 for(riterator row=matrix.begin(); row != matrix.end(); ++row)
    \n+
    1115 for(citerator col = row->begin(); col != row->end(); ++col)
    \n+
    1116 // Matrix Market indexing start with 1!
    \n+\n+\n+
    1119 }
    \n+
    \n+
    1120
    \n+
    1121
    \n+
    1125 template<typename M>
    \n+
    \n+
    1126 void writeMatrixMarket(const M& matrix,
    \n+
    1127 std::ostream& ostr)
    \n+
    1128 {
    \n+
    1129 using namespace MatrixMarketImpl;
    \n+
    1130
    \n+
    1131 // Write header information
    \n+
    1132 mm_header_printer<M>::print(ostr);
    \n+
    1133 mm_block_structure_header<M>::print(ostr,matrix);
    \n+
    1134 // Choose the correct function for matrix and vector
    \n+
    1135 writeMatrixMarket(matrix,ostr,std::integral_constant<int,IsMatrix<M>::value>());
    \n+
    1136 }
    \n+
    \n+
    1137
    \n+
    1138 static const int default_precision = -1;
    \n+
    1150 template<typename M>
    \n+
    \n+
    1151 void storeMatrixMarket(const M& matrix,
    \n+
    1152 std::string filename,
    \n+
    1153 int prec=default_precision)
    \n+
    1154 {
    \n+
    1155 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
    \n+
    1156 std::string rfilename;
    \n+
    1157 std::ofstream file;
    \n+
    1158 if (extension != "") {
    \n+
    1159 rfilename = pureFilename + extension;
    \n+
    1160 file.open(rfilename.c_str());
    \n+
    1161 if(!file)
    \n+
    1162 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
    \n+
    1163 }
    \n+
    1164 else {
    \n+
    1165 // only try .mm so we do not ignore potential errors
    \n+
    1166 rfilename = pureFilename + ".mm";
    \n+
    1167 file.open(rfilename.c_str());
    \n+
    1168 if(!file)
    \n+
    1169 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
    \n+
    1170 }
    \n+
    1171
    \n+
    1172 file.setf(std::ios::scientific,std::ios::floatfield);
    \n+
    1173 if(prec>0)
    \n+
    1174 file.precision(prec);
    \n+
    1175 writeMatrixMarket(matrix, file);
    \n+
    1176 file.close();
    \n+
    1177 }
    \n+
    \n+
    1178
    \n+
    1179#if HAVE_MPI
    \n+
    1194 template<typename M, typename G, typename L>
    \n+
    \n+
    1195 void storeMatrixMarket(const M& matrix,
    \n+
    1196 std::string filename,
    \n+\n+
    1198 bool storeIndices=true,
    \n+
    1199 int prec=default_precision)
    \n+
    1200 {
    \n+
    1201 // Get our rank
    \n+
    1202 int rank = comm.communicator().rank();
    \n+
    1203 // Write the local matrix
    \n+
    1204 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
    \n+
    1205 std::string rfilename;
    \n+
    1206 std::ofstream file;
    \n+
    1207 if (extension != "") {
    \n+
    1208 rfilename = pureFilename + "_" + std::to_string(rank) + extension;
    \n+
    1209 file.open(rfilename.c_str());
    \n+
    1210 dverb<< rfilename <<std::endl;
    \n+
    1211 if(!file)
    \n+
    1212 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
    \n+
    1213 }
    \n+
    1214 else {
    \n+
    1215 // only try .mm so we do not ignore potential errors
    \n+
    1216 rfilename = pureFilename + "_" + std::to_string(rank) + ".mm";
    \n+
    1217 file.open(rfilename.c_str());
    \n+
    1218 dverb<< rfilename <<std::endl;
    \n+
    1219 if(!file)
    \n+
    1220 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
    \n+
    1221 }
    \n+
    1222 file.setf(std::ios::scientific,std::ios::floatfield);
    \n+
    1223 if(prec>0)
    \n+
    1224 file.precision(prec);
    \n+
    1225 writeMatrixMarket(matrix, file);
    \n+
    1226 file.close();
    \n+
    1227
    \n+
    1228 if(!storeIndices)
    \n+
    1229 return;
    \n+
    1230
    \n+
    1231 // Write the global to local index mapping
    \n+
    1232 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx";
    \n+
    1233 file.open(rfilename.c_str());
    \n+
    1234 if(!file)
    \n+
    1235 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
    \n+
    1236 file.setf(std::ios::scientific,std::ios::floatfield);
    \n+\n+
    1238 typedef typename IndexSet::const_iterator Iterator;
    \n+
    1239 for(Iterator iter = comm.indexSet().begin();
    \n+
    1240 iter != comm.indexSet().end(); ++iter) {
    \n+
    1241 file << iter->global()<<" "<<(std::size_t)iter->local()<<" "
    \n+
    1242 <<(int)iter->local().attribute()<<" "<<(int)iter->local().isPublic()<<std::endl;
    \n+
    1243 }
    \n+
    1244 // Store neighbour information for efficient remote indices setup.
    \n+
    1245 file<<"neighbours:";
    \n+
    1246 const std::set<int>& neighbours=comm.remoteIndices().getNeighbours();
    \n+
    1247 typedef std::set<int>::const_iterator SIter;
    \n+
    1248 for(SIter neighbour=neighbours.begin(); neighbour != neighbours.end(); ++neighbour) {
    \n+
    1249 file<<" "<< *neighbour;
    \n+
    1250 }
    \n+
    1251 file.close();
    \n+
    1252 }
    \n+
    \n+
    1253
    \n+
    1268 template<typename M, typename G, typename L>
    \n+
    \n+
    1269 void loadMatrixMarket(M& matrix,
    \n+
    1270 const std::string& filename,
    \n+\n+
    1272 bool readIndices=true)
    \n+
    1273 {
    \n+
    1274 using namespace MatrixMarketImpl;
    \n+
    1275
    \n+\n+
    1277 typedef typename LocalIndexT::Attribute Attribute;
    \n+
    1278 // Get our rank
    \n+
    1279 int rank = comm.communicator().rank();
    \n+
    1280 // load local matrix
    \n+
    1281 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
    \n+
    1282 std::string rfilename;
    \n+
    1283 std::ifstream file;
    \n+
    1284 if (extension != "") {
    \n+
    1285 rfilename = pureFilename + "_" + std::to_string(rank) + extension;
    \n+
    1286 file.open(rfilename.c_str(), std::ios::in);
    \n+
    1287 dverb<< rfilename <<std::endl;
    \n+
    1288 if(!file)
    \n+
    1289 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
    \n+
    1290 }
    \n+
    1291 else {
    \n+
    1292 // try both .mm and .mtx
    \n+
    1293 rfilename = pureFilename + "_" + std::to_string(rank) + ".mm";
    \n+
    1294 file.open(rfilename.c_str(), std::ios::in);
    \n+
    1295 if(!file) {
    \n+
    1296 rfilename = pureFilename + "_" + std::to_string(rank) + ".mtx";
    \n+
    1297 file.open(rfilename.c_str(), std::ios::in);
    \n+
    1298 dverb<< rfilename <<std::endl;
    \n+
    1299 if(!file)
    \n+
    1300 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
    \n+
    1301 }
    \n+
    1302 }
    \n+
    1303 readMatrixMarket(matrix,file);
    \n+
    1304 file.close();
    \n+
    1305
    \n+
    1306 if(!readIndices)
    \n+
    1307 return;
    \n+
    1308
    \n+
    1309 // read indices
    \n+\n+
    1311 IndexSet& pis=comm.pis;
    \n+
    1312 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx";
    \n+
    1313 file.open(rfilename.c_str());
    \n+
    1314 if(!file)
    \n+
    1315 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
    \n+
    1316 if(pis.size()!=0)
    \n+
    1317 DUNE_THROW(InvalidIndexSetState, "Index set is not empty!");
    \n+
    1318
    \n+
    1319 pis.beginResize();
    \n+
    1320 while(!file.eof() && file.peek()!='n') {
    \n+
    1321 G g;
    \n+
    1322 file >>g;
    \n+
    1323 std::size_t l;
    \n+
    1324 file >>l;
    \n+
    1325 int c;
    \n+
    1326 file >>c;
    \n+
    1327 bool b;
    \n+
    1328 file >> b;
    \n+
    1329 pis.add(g,LocalIndexT(l,Attribute(c),b));
    \n+
    1330 lineFeed(file);
    \n+
    1331 }
    \n+
    1332 pis.endResize();
    \n+
    1333 if(!file.eof()) {
    \n+
    1334 // read neighbours
    \n+
    1335 std::string s;
    \n+
    1336 file>>s;
    \n+
    1337 if(s!="neighbours:")
    \n+
    1338 DUNE_THROW(MatrixMarketFormatError, "was expecting the string: \\"neighbours:\\"");
    \n+
    1339 std::set<int> nb;
    \n+
    1340 while(!file.eof()) {
    \n+
    1341 int i;
    \n+
    1342 file >> i;
    \n+
    1343 nb.insert(i);
    \n+
    1344 }
    \n+
    1345 file.close();
    \n+
    1346 comm.ri.setNeighbours(nb);
    \n+
    1347 }
    \n+
    1348 comm.ri.template rebuild<false>();
    \n+
    1349 }
    \n+
    \n+
    1350
    \n+
    1351 #endif
    \n+
    1352
    \n+
    1363 template<typename M>
    \n+
    \n+
    1364 void loadMatrixMarket(M& matrix,
    \n+
    1365 const std::string& filename)
    \n+
    1366 {
    \n+
    1367 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
    \n+
    1368 std::string rfilename;
    \n+
    1369 std::ifstream file;
    \n+
    1370 if (extension != "") {
    \n+
    1371 rfilename = pureFilename + extension;
    \n+
    1372 file.open(rfilename.c_str());
    \n+
    1373 if(!file)
    \n+
    1374 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
    \n+
    1375 }
    \n+
    1376 else {
    \n+
    1377 // try both .mm and .mtx
    \n+
    1378 rfilename = pureFilename + ".mm";
    \n+
    1379 file.open(rfilename.c_str(), std::ios::in);
    \n+
    1380 if(!file) {
    \n+
    1381 rfilename = pureFilename + ".mtx";
    \n+
    1382 file.open(rfilename.c_str(), std::ios::in);
    \n+
    1383 if(!file)
    \n+
    1384 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
    \n+
    1385 }
    \n+
    1386 }
    \n+
    1387 readMatrixMarket(matrix,file);
    \n+
    1388 file.close();
    \n+
    1389 }
    \n+
    \n+
    1390
    \n+
    1392}
    \n+
    1393#endif
    \n+
    Implementation of the BCRSMatrix class.
    \n+
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+
    Some handy generic functions for ISTL matrices.
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n+
    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
    \n+
    void readMatrixMarket(Dune::BlockVector< T, A > &vector, std::istream &istr)
    Reads a BlockVector from a matrix market file.
    Definition matrixmarket.hh:930
    \n+
    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
    \n+
    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
    \n+
    std::size_t countEntries(const BlockVector< T, A > &vector)
    Definition matrixmarket.hh:1076
    \n+
    void writeMatrixMarket(const V &vector, std::ostream &ostr, const std::integral_constant< int, 0 > &)
    Definition matrixmarket.hh:1089
    \n+
    void mm_print_vector_entry(const V &entry, std::ostream &ostr, const std::integral_constant< int, 1 > &, size_t lane)
    Definition matrixmarket.hh:1049
    \n+
    static const int default_precision
    Definition matrixmarket.hh:1138
    \n+
    void mm_read_vector_entries(Dune::BlockVector< T, A > &vector, std::size_t size, std::istream &istr, size_t lane)
    Definition matrixmarket.hh:900
    \n+
    void mm_read_header(std::size_t &rows, std::size_t &cols, MatrixMarketImpl::MMHeader &header, std::istream &istr, bool isVector)
    Definition matrixmarket.hh:871
    \n+
    void mm_print_entry(const B &entry, std::size_t rowidx, std::size_t colidx, std::ostream &ostr)
    Definition matrixmarket.hh:1030
    \n+
    STL namespace.
    \n
    Definition allocator.hh:11
    \n+
    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
    \n+
    bool operator<(const IndexData< T > &i1, const IndexData< T > &i2)
    LessThan operator.
    Definition matrixmarket.hh:630
    \n+
    LineType
    Definition matrixmarket.hh:296
    \n+
    @ DATA
    Definition matrixmarket.hh:296
    \n+
    @ MM_HEADER
    Definition matrixmarket.hh:296
    \n+
    @ MM_ISTLSTRUCT
    Definition matrixmarket.hh:296
    \n+
    bool readMatrixMarketBanner(std::istream &file, MMHeader &mmHeader)
    Definition matrixmarket.hh:353
    \n+
    void readSparseEntries(Dune::BCRSMatrix< T, A > &matrix, std::istream &file, std::size_t entries, const MMHeader &mmHeader, const D &)
    Definition matrixmarket.hh:765
    \n+
    MM_TYPE
    Definition matrixmarket.hh:299
    \n+
    @ array_type
    Definition matrixmarket.hh:299
    \n+
    @ coordinate_type
    Definition matrixmarket.hh:299
    \n+
    @ unknown_type
    Definition matrixmarket.hh:299
    \n+
    std::istream & operator>>(std::istream &is, NumericWrapper< T > &num)
    Definition matrixmarket.hh:614
    \n+
    void skipComments(std::istream &file)
    Definition matrixmarket.hh:339
    \n+
    bool lineFeed(std::istream &file)
    Definition matrixmarket.hh:315
    \n+
    @ MM_MAX_LINE_LENGTH
    Definition matrixmarket.hh:297
    \n+
    MM_STRUCTURE
    Definition matrixmarket.hh:303
    \n+
    @ skew_symmetric
    Definition matrixmarket.hh:303
    \n+
    @ general
    Definition matrixmarket.hh:303
    \n+
    @ hermitian
    Definition matrixmarket.hh:303
    \n+
    @ unknown_structure
    Definition matrixmarket.hh:303
    \n+
    @ symmetric
    Definition matrixmarket.hh:303
    \n+
    MM_CTYPE
    Definition matrixmarket.hh:301
    \n+
    @ unknown_ctype
    Definition matrixmarket.hh:301
    \n+
    @ pattern
    Definition matrixmarket.hh:301
    \n+
    @ complex_type
    Definition matrixmarket.hh:301
    \n+
    @ double_type
    Definition matrixmarket.hh:301
    \n+
    @ integer_type
    Definition matrixmarket.hh:301
    \n+
    std::enable_if_t<!is_complex< T >::value, T > conj(const T &r)
    Definition matrixmarket.hh:733
    \n+
    std::tuple< std::string, std::string > splitFilename(const std::string &filename)
    Definition matrixmarket.hh:852
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    Iterator begin()
    Get iterator to first row.
    Definition bcrsmatrix.hh:671
    \n+
    Iterator end()
    Get iterator to one beyond last row.
    Definition bcrsmatrix.hh:677
    \n+
    CreateIterator createend()
    get create iterator pointing to one after the last block
    Definition bcrsmatrix.hh:1100
    \n+
    size_type M() const
    number of columns (counted in blocks)
    Definition bcrsmatrix.hh:2007
    \n+
    CreateIterator createbegin()
    get initial create iterator
    Definition bcrsmatrix.hh:1094
    \n+
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n+
    void setBuildMode(BuildMode bm)
    Sets the build mode of the matrix.
    Definition bcrsmatrix.hh:830
    \n+
    void setSize(size_type rows, size_type columns, size_type nnz=0)
    Set the size of the matrix.
    Definition bcrsmatrix.hh:858
    \n+
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n+
    void resize(size_type size)
    Resize the vector.
    Definition bvector.hh:496
    \n+
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bvector.hh:398
    \n+
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    Helper metaprogram to get the matrix market string representation of the numeric type.
    Definition matrixmarket.hh:76
    \n+
    @ is_numeric
    Whether T is a supported numeric type.
    Definition matrixmarket.hh:81
    \n+
    static std::string str()
    Definition matrixmarket.hh:95
    \n+
    static std::string str()
    Definition matrixmarket.hh:111
    \n+
    static std::string str()
    Definition matrixmarket.hh:127
    \n+
    static std::string str()
    Definition matrixmarket.hh:143
    \n+
    static std::string str()
    Definition matrixmarket.hh:159
    \n+
    Meta program to write the correct Matrix Market header.
    Definition matrixmarket.hh:174
    \n+
    static void print(std::ostream &os)
    Definition matrixmarket.hh:179
    \n+
    static void print(std::ostream &os)
    Definition matrixmarket.hh:189
    \n+
    static void print(std::ostream &os)
    Definition matrixmarket.hh:199
    \n+
    static void print(std::ostream &os)
    Definition matrixmarket.hh:209
    \n+
    Metaprogram for writing the ISTL block structure header.
    Definition matrixmarket.hh:225
    \n+
    static void print(std::ostream &os, const M &)
    Definition matrixmarket.hh:233
    \n+
    BlockVector< T, A > M
    Definition matrixmarket.hh:230
    \n+
    BlockVector< FieldVector< T, i >, A > M
    Definition matrixmarket.hh:243
    \n+
    static void print(std::ostream &os, const M &)
    Definition matrixmarket.hh:245
    \n+
    BCRSMatrix< T, A > M
    Definition matrixmarket.hh:255
    \n+
    static void print(std::ostream &os, const M &)
    Definition matrixmarket.hh:258
    \n+
    BCRSMatrix< FieldMatrix< T, i, j >, A > M
    Definition matrixmarket.hh:268
    \n+
    static void print(std::ostream &os, const M &)
    Definition matrixmarket.hh:270
    \n+
    static void print(std::ostream &os, const M &m)
    Definition matrixmarket.hh:283
    \n+
    FieldMatrix< T, i, j > M
    Definition matrixmarket.hh:281
    \n+
    static void print(std::ostream &os, const M &m)
    Definition matrixmarket.hh:292
    \n+
    FieldVector< T, i > M
    Definition matrixmarket.hh:290
    \n+
    Definition matrixmarket.hh:306
    \n+
    MM_STRUCTURE structure
    Definition matrixmarket.hh:312
    \n+
    MM_TYPE type
    Definition matrixmarket.hh:310
    \n+
    MMHeader()
    Definition matrixmarket.hh:307
    \n+
    MM_CTYPE ctype
    Definition matrixmarket.hh:311
    \n+
    Definition matrixmarket.hh:578
    \n+
    std::size_t index
    Definition matrixmarket.hh:579
    \n+
    a wrapper class of numeric values.
    Definition matrixmarket.hh:595
    \n+
    T number
    Definition matrixmarket.hh:596
    \n+
    Utility class for marking the pattern type of the MatrixMarket matrices.
    Definition matrixmarket.hh:607
    \n+
    Functor to the data values of the matrix.
    Definition matrixmarket.hh:677
    \n+
    void operator()(const std::vector< std::set< IndexData< D > > > &rows, BCRSMatrix< T > &matrix)
    Sets the matrix values.
    Definition matrixmarket.hh:684
    \n+
    void operator()(const std::vector< std::set< IndexData< D > > > &rows, BCRSMatrix< FieldMatrix< T, brows, bcols > > &matrix)
    Sets the matrix values.
    Definition matrixmarket.hh:702
    \n+
    void operator()(const std::vector< std::set< IndexData< PatternDummy > > > &rows, M &matrix)
    Definition matrixmarket.hh:723
    \n+
    Definition matrixmarket.hh:728
    \n+
    Definition matrixmarket.hh:744
    \n+
    Definition matrixmarket.hh:868
    \n+
    Definition matrixutils.hh:27
    \n+
    Test whether a type is an ISTL Matrix.
    Definition matrixutils.hh:504
    \n
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n-
    void copyCopyToAll(const T &source, T &dest) const
    Communicate values from copy data points to all other data points.
    Definition owneroverlapcopy.hh:328
    \n-
    Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
    The type of the reverse lookup of indices.
    Definition owneroverlapcopy.hh:456
    \n+
    const ParallelIndexSet & indexSet() const
    Get the underlying parallel index set.
    Definition owneroverlapcopy.hh:462
    \n
    const Communication< MPI_Comm > & communicator() const
    Definition owneroverlapcopy.hh:299
    \n-
    void copyOwnerToAll(const T &source, T &dest) const
    Communicate values from owner data points to all other data points.
    Definition owneroverlapcopy.hh:311
    \n
    const RemoteIndices & remoteIndices() const
    Get the underlying remote indices.
    Definition owneroverlapcopy.hh:471
    \n
    Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
    The type of the parallel index set.
    Definition owneroverlapcopy.hh:449
    \n-
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n-
    Definition globalaggregates.hh:29
    \n-
    const GlobalIndex & operator[](std::size_t index) const
    Definition globalaggregates.hh:46
    \n-
    GlobalIndex & get(std::size_t index)
    Definition globalaggregates.hh:60
    \n-
    ParallelIndexSet::GlobalIndex GlobalIndex
    Definition globalaggregates.hh:33
    \n-
    void put(const GlobalIndex &global, size_t i)
    Definition globalaggregates.hh:96
    \n-
    T Vertex
    Definition globalaggregates.hh:39
    \n-
    GlobalAggregatesMap(AggregatesMap< Vertex > &aggregates, const GlobalLookupIndexSet< ParallelIndexSet > &indexset)
    Definition globalaggregates.hh:41
    \n-
    TI ParallelIndexSet
    Definition globalaggregates.hh:31
    \n-
    ParallelIndexSet::LocalIndex LocalIndex
    Definition globalaggregates.hh:37
    \n-
    ParallelIndexSet::GlobalIndex IndexedType
    Definition globalaggregates.hh:35
    \n-
    Proxy operator[](std::size_t index)
    Definition globalaggregates.hh:91
    \n-
    Definition globalaggregates.hh:70
    \n-
    Proxy(const GlobalLookupIndexSet< ParallelIndexSet > &indexset, Vertex &aggregate)
    Definition globalaggregates.hh:72
    \n-
    Proxy & operator=(const GlobalIndex &global)
    Definition globalaggregates.hh:76
    \n-
    Definition globalaggregates.hh:114
    \n-
    static void scatter(GlobalAggregatesMap< T, TI > &ga, GlobalIndex global, size_t i)
    Definition globalaggregates.hh:123
    \n-
    ParallelIndexSet::GlobalIndex GlobalIndex
    Definition globalaggregates.hh:116
    \n-
    TI ParallelIndexSet
    Definition globalaggregates.hh:115
    \n-
    static const GlobalIndex & gather(const GlobalAggregatesMap< T, TI > &ga, size_t i)
    Definition globalaggregates.hh:118
    \n-
    Definition globalaggregates.hh:131
    \n-
    ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet
    Definition globalaggregates.hh:164
    \n-\n-\n-
    ParallelInformation::ParallelIndexSet IndexSet
    Definition globalaggregates.hh:165
    \n-
    OwnerOverlapCopyCommunication< T1, T2 > ParallelInformation
    Definition globalaggregates.hh:163
    \n-
    static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation &pinfo, const GlobalLookupIndexSet &globalLookup)
    Definition globalaggregates.hh:167
    \n-
    static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation &pinfo, const GlobalLookupIndexSet &globalLookup)
    Definition globalaggregates.hh:226
    \n-
    SequentialInformation ParallelInformation
    Definition globalaggregates.hh:223
    \n-\n-
    ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet
    Definition globalaggregates.hh:224
    \n-
    static int getSize(const Type &, int)
    Definition globalaggregates.hh:242
    \n-
    Amg::GlobalAggregatesMap< T, TI >::IndexedType IndexedType
    Definition globalaggregates.hh:240
    \n-
    Amg::AggregatesMap< T > Type
    Definition globalaggregates.hh:239
    \n-
    SizeOne IndexedTypeFlag
    Definition globalaggregates.hh:241
    \n-
    Definition pinfo.hh:28
    \n-
    int GlobalLookupIndexSet
    Definition pinfo.hh:54
    \n-
    @ nonoverlapping
    Category for non-overlapping solvers.
    Definition solvercategory.hh:27
    \n-
    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
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,423 +1,1632 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-globalaggregates.hh\n+matrixmarket.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_GLOBALAGGREGATES_HH\n-6#define DUNE_GLOBALAGGREGATES_HH\n+5#ifndef DUNE_ISTL_MATRIXMARKET_HH\n+6#define DUNE_ISTL_MATRIXMARKET_HH\n 7\n-18#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n-19#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n-20#include \n-21\n-22namespace _\bD_\bu_\bn_\be\n-23{\n-24 namespace Amg\n-25 {\n-26\n-27 template\n-_\b2_\b8 struct _\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-29 {\n-30 public:\n-_\b3_\b1 typedef TI _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-32\n-_\b3_\b3 typedef typename ParallelIndexSet::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-34\n-_\b3_\b5 typedef typename ParallelIndexSet::GlobalIndex _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be;\n-36\n-_\b3_\b7 typedef typename ParallelIndexSet::LocalIndex _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15#include \n+16#include \n+17#include \n+18#include \n+19#include \n+20#include \n+21#include \n+22#include \n+23\n+24#include \n+25#include \n+26#include \n+27#include \n+28#include \n+29#include \n+30\n+31#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+32#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+33#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh> // countNonZeros()\n+34#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n+35\n+36namespace _\bD_\bu_\bn_\be\n+37{\n 38\n-_\b3_\b9 typedef T _\bV_\be_\br_\bt_\be_\bx;\n-40\n-_\b4_\b1 _\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-42 const GlobalLookupIndexSet& indexset)\n-43 : aggregates_(aggregates), indexset_(indexset)\n-44 {}\n-45\n-_\b4_\b6 inline const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t index) const\n-47 {\n-48 const _\bV_\be_\br_\bt_\be_\bx& aggregate = aggregates_[index];\n-49 if(aggregate >= _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n-50 assert(aggregate != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n-51 return isolatedMarker;\n-52 }else{\n-53 const Dune::IndexPair* pair = indexset_.pair\n-(aggregate);\n-54 assert(pair!=0);\n-55 return pair->global();\n-56 }\n-57 }\n-58\n-59\n-_\b6_\b0 inline _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\be_\bt(std::size_t index)\n-61 {\n-62 const _\bV_\be_\br_\bt_\be_\bx& aggregate = aggregates_[index];\n-63 assert(aggregate < _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n-64 const Dune::IndexPair* pair = indexset_.pair\n-(aggregate);\n-65 assert(pair!=0);\n-66 return const_cast<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx&>(pair->global());\n-67 }\n-68\n-_\b6_\b9 class _\bP_\br_\bo_\bx_\by\n-70 {\n-71 public:\n-_\b7_\b2 _\bP_\br_\bo_\bx_\by(const GlobalLookupIndexSet& indexset, _\bV_\be_\br_\bt_\be_\bx&\n-aggregate)\n-73 : indexset_(&indexset), aggregate_(&aggregate)\n-74 {}\n-75\n-_\b7_\b6 _\bP_\br_\bo_\bx_\by& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global)\n-77 {\n-78 if(global==isolatedMarker)\n-79 *aggregate_ = _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD;\n-80 else{\n-81 //assert(global < AggregatesMap::ISOLATED);\n-82 *aggregate_ = indexset_->operator[](global).local();\n-83 }\n-84 return *this;\n-85 }\n-86 private:\n-87 const GlobalLookupIndexSet* indexset_;\n-88 _\bV_\be_\br_\bt_\be_\bx* aggregate_;\n-89 };\n-90\n-_\b9_\b1 inline _\bP_\br_\bo_\bx_\by _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t index)\n-92 {\n-93 return _\bP_\br_\bo_\bx_\by(indexset_, aggregates_[index]);\n-94 }\n-95\n-_\b9_\b6 inline void _\bp_\bu_\bt(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global, size_t i)\n-97 {\n-98 aggregates_[i]=indexset_[global].local();\n-99\n-100 }\n-101\n-102 private:\n-103 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n-104 const GlobalLookupIndexSet& indexset_;\n-105 static const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx isolatedMarker;\n-106 };\n-107\n-108 template\n-109 const typename TI::GlobalIndex GlobalAggregatesMap::isolatedMarker =\n-110 std::numeric_limits::max();\n-111\n-112 template\n-_\b1_\b1_\b3 struct _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-114 {\n-_\b1_\b1_\b5 typedef TI _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-_\b1_\b1_\b6 typedef typename ParallelIndexSet::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-117\n-_\b1_\b1_\b8 static const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\ba_\bt_\bh_\be_\br(const _\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bT_\b,_\bT_\bI_\b>& ga,\n-size_t i)\n+_\b6_\b4 namespace MatrixMarketImpl\n+65 {\n+75 template\n+_\b7_\b6 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be {\n+77 enum {\n+81 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=false\n+_\b8_\b2 };\n+83 };\n+84\n+85 template<>\n+_\b8_\b6 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be\n+87 {\n+88 enum {\n+92 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=true\n+_\b9_\b3 };\n+94\n+_\b9_\b5 static std::string _\bs_\bt_\br()\n+96 {\n+97 return \"integer\";\n+98 }\n+99 };\n+100\n+101 template<>\n+_\b1_\b0_\b2 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be\n+103 {\n+104 enum {\n+108 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=true\n+_\b1_\b0_\b9 };\n+110\n+_\b1_\b1_\b1 static std::string _\bs_\bt_\br()\n+112 {\n+113 return \"real\";\n+114 }\n+115 };\n+116\n+117 template<>\n+_\b1_\b1_\b8 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be\n 119 {\n-120 return ga[i];\n-121 }\n-122\n-_\b1_\b2_\b3 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bT_\b,_\bT_\bI_\b>& ga, _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx global,\n-size_t i)\n-124 {\n-125 ga[i]=global;\n-126 }\n-127 };\n-128\n-129 template\n-_\b1_\b3_\b0 struct _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br\n-131 {};\n+120 enum {\n+124 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=true\n+_\b1_\b2_\b5 };\n+126\n+_\b1_\b2_\b7 static std::string _\bs_\bt_\br()\n+128 {\n+129 return \"real\";\n+130 }\n+131 };\n 132\n-133#if HAVE_MPI\n-134\n-135#endif\n-136\n-137 } // namespace Amg\n-138\n-139#if HAVE_MPI\n-140 // forward declaration\n-141 template\n-142 class _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn;\n-143#endif\n-144\n-145 namespace Amg\n-146 {\n-147\n-148#if HAVE_MPI\n-158 template\n-_\b1_\b5_\b9 struct _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br >\n+133 template<>\n+_\b1_\b3_\b4 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be<_\bs_\bt_\bd::complex >\n+135 {\n+136 enum {\n+140 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=true\n+_\b1_\b4_\b1 };\n+142\n+_\b1_\b4_\b3 static std::string _\bs_\bt_\br()\n+144 {\n+145 return \"complex\";\n+146 }\n+147 };\n+148\n+149 template<>\n+_\b1_\b5_\b0 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be<_\bs_\bt_\bd::complex >\n+151 {\n+152 enum {\n+156 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=true\n+_\b1_\b5_\b7 };\n+158\n+_\b1_\b5_\b9 static std::string _\bs_\bt_\br()\n 160 {\n-_\b1_\b6_\b1 typedef T _\bV_\be_\br_\bt_\be_\bx;\n-_\b1_\b6_\b2 typedef O _\bO_\bv_\be_\br_\bl_\ba_\bp_\bF_\bl_\ba_\bg_\bs;\n-_\b1_\b6_\b3 typedef _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b> _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n-_\b1_\b6_\b4 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-_\b1_\b6_\b5 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-166\n-_\b1_\b6_\b7 static void _\bp_\bu_\bb_\bl_\bi_\bs_\bh(_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-168 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n-169 const _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& globalLookup)\n-170 {\n-171 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> GlobalMap;\n-172 GlobalMap gmap(aggregates, globalLookup);\n-173 pinfo._\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl(gmap,gmap);\n-174 // communication only needed for ALU\n-175 // (ghosts with same global id as owners on the same process)\n-176 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(pinfo) == static_cast(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:\n-_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg))\n-177 pinfo._\bc_\bo_\bp_\by_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl(gmap,gmap);\n-178\n-179 typedef typename ParallelInformation::RemoteIndices::const_iterator Lists;\n-180 Lists lists = pinfo._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().find(pinfo._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br().rank());\n-181 if(lists!=pinfo._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().end()) {\n-182\n-183 // For periodic boundary conditions we must renumber\n-184 // the aggregates of vertices in the overlap whose owners are\n-185 // on the same process\n-186 _\bV_\be_\br_\bt_\be_\bx maxAggregate =0;\n-187 typedef typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br Iter;\n-188 for(Iter i=aggregates._\bb_\be_\bg_\bi_\bn(), end=aggregates._\be_\bn_\bd(); i!=end; ++i)\n-189 maxAggregate = std::max(maxAggregate, *i);\n-190\n-191 // Compute new mapping of aggregates in the overlap that we also own\n-192 std::map newMapping;\n-193\n-194 // insert all elements into map\n-195 typedef typename ParallelInformation::RemoteIndices::RemoteIndexList\n-196 ::const_iterator RIter;\n-197 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end\n-();\n-198 ri!=rend; ++ri)\n-199 if(O::contains(ri->localIndexPair().local().attribute()))\n-200 newMapping.insert(std::make_pair(aggregates[ri->localIndexPair().local()],\n-201 maxAggregate));\n-202 // renumber\n-203 typedef typename std::map::iterator MIter;\n-204 for(MIter mi=newMapping.begin(), mend=newMapping.end();\n-205 mi != mend; ++mi)\n-206 mi->second=++maxAggregate;\n-207\n-208\n-209 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end\n-();\n-210 ri!=rend; ++ri)\n-211 if(O::contains(ri->localIndexPair().local().attribute()))\n-212 aggregates[ri->localIndexPair().local()] =\n-213 newMapping[aggregates[ri->localIndexPair().local()]];\n-214 }\n-215 }\n-216 };\n-217#endif\n-218\n-219 template\n-_\b2_\b2_\b0 struct _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br\n-221 {\n-_\b2_\b2_\b2 typedef T _\bV_\be_\br_\bt_\be_\bx;\n-_\b2_\b2_\b3 typedef _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n-_\b2_\b2_\b4 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-225\n-_\b2_\b2_\b6 static void _\bp_\bu_\bb_\bl_\bi_\bs_\bh([[maybe_unused]] _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n-227 [[maybe_unused]] _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n-228 [[maybe_unused]] const _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& globalLookup)\n-229 {}\n-230 };\n-231\n-232 } // end Amg namespace\n-233\n-234\n-235#if HAVE_MPI\n-236 template\n-_\b2_\b3_\b7 struct CommPolicy >\n-238 {\n-_\b2_\b3_\b9 typedef _\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bT_\b> _\bT_\by_\bp_\be;\n-_\b2_\b4_\b0 typedef typename _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bT_\b,_\bT_\bI_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be;\n-_\b2_\b4_\b1 typedef SizeOne _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg;\n-_\b2_\b4_\b2 static int _\bg_\be_\bt_\bS_\bi_\bz_\be(const _\bT_\by_\bp_\be&, int)\n-243 {\n-244 return 1;\n-245 }\n-246 };\n-247#endif\n-248\n-249} // end Dune namespace\n-251#endif\n-_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n-Provides classes for the Coloring process of AMG.\n-_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-const_iterator begin() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:725\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n-const_iterator end() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:730\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-const AggregateDescriptor * const_iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:723\n+161 return \"complex\";\n+162 }\n+163 };\n+164\n+173 template\n+_\b1_\b7_\b4 struct _\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br;\n+175\n+176 template\n+_\b1_\b7_\b7 struct _\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n+178 {\n+_\b1_\b7_\b9 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os)\n+180 {\n+181 os<<\"%%MatrixMarket matrix coordinate \";\n+182 os<::\n+field_type>>::str()<<\" general\"<\n+_\b1_\b8_\b7 struct _\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n+188 {\n+_\b1_\b8_\b9 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os)\n+190 {\n+191 os<<\"%%MatrixMarket matrix array \";\n+192 os<::\n+field_type>>::str()<<\" general\"<\n+_\b1_\b9_\b7 struct _\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br >\n+198 {\n+_\b1_\b9_\b9 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os)\n+200 {\n+201 os<<\"%%MatrixMarket matrix array \";\n+202 os<::str()<<\" general\"<\n+_\b2_\b0_\b7 struct _\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n+208 {\n+_\b2_\b0_\b9 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os)\n+210 {\n+211 os<<\"%%MatrixMarket matrix array \";\n+212 os<::str()<<\" general\"<\n+_\b2_\b2_\b5 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br;\n+226\n+227 template\n+_\b2_\b2_\b8 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n+229 {\n+_\b2_\b3_\b0 typedef _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bM;\n+231 static_assert(IsNumber::value, \"Only scalar entries are expected\n+here!\");\n+232\n+_\b2_\b3_\b3 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM&)\n+234 {\n+235 os<<\"% ISTL_STRUCT blocked \";\n+236 os<<\"1 1\"<\n+_\b2_\b4_\b1 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br,A> >\n+242 {\n+_\b2_\b4_\b3 typedef _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bi_\b>,A> _\bM;\n+244\n+_\b2_\b4_\b5 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM&)\n+246 {\n+247 os<<\"% ISTL_STRUCT blocked \";\n+248 os<\n+_\b2_\b5_\b3 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n+254 {\n+_\b2_\b5_\b5 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b> _\bM;\n+256 static_assert(IsNumber::value, \"Only scalar entries are expected\n+here!\");\n+257\n+_\b2_\b5_\b8 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM&)\n+259 {\n+260 os<<\"% ISTL_STRUCT blocked \";\n+261 os<<\"1 1\"<\n+_\b2_\b6_\b6 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A> >\n+267 {\n+_\b2_\b6_\b8 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bi_\b,_\bj_\b>,A> _\bM;\n+269\n+_\b2_\b7_\b0 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM&)\n+271 {\n+272 os<<\"% ISTL_STRUCT blocked \";\n+273 os<\n+_\b2_\b7_\b9 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n+280 {\n+_\b2_\b8_\b1 typedef _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bi_\b,_\bj_\b> _\bM;\n+282\n+_\b2_\b8_\b3 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM& m)\n+284 {}\n+285 };\n+286\n+287 template\n+_\b2_\b8_\b8 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br >\n+289 {\n+_\b2_\b9_\b0 typedef FieldVector _\bM;\n+291\n+_\b2_\b9_\b2 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM& m)\n+293 {}\n+294 };\n+295\n+_\b2_\b9_\b6 enum _\bL_\bi_\bn_\be_\bT_\by_\bp_\be { _\bM_\bM_\b__\bH_\bE_\bA_\bD_\bE_\bR, _\bM_\bM_\b__\bI_\bS_\bT_\bL_\bS_\bT_\bR_\bU_\bC_\bT, _\bD_\bA_\bT_\bA };\n+_\b2_\b9_\b7 enum { _\bM_\bM_\b__\bM_\bA_\bX_\b__\bL_\bI_\bN_\bE_\b__\bL_\bE_\bN_\bG_\bT_\bH=1025 };\n+298\n+_\b2_\b9_\b9 enum _\bM_\bM_\b__\bT_\bY_\bP_\bE { _\bc_\bo_\bo_\br_\bd_\bi_\bn_\ba_\bt_\be_\b__\bt_\by_\bp_\be, _\ba_\br_\br_\ba_\by_\b__\bt_\by_\bp_\be, _\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bt_\by_\bp_\be };\n+300\n+_\b3_\b0_\b1 enum _\bM_\bM_\b__\bC_\bT_\bY_\bP_\bE { _\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bt_\by_\bp_\be, _\bd_\bo_\bu_\bb_\bl_\be_\b__\bt_\by_\bp_\be, _\bc_\bo_\bm_\bp_\bl_\be_\bx_\b__\bt_\by_\bp_\be, _\bp_\ba_\bt_\bt_\be_\br_\bn,\n+_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bc_\bt_\by_\bp_\be };\n+302\n+_\b3_\b0_\b3 enum _\bM_\bM_\b__\bS_\bT_\bR_\bU_\bC_\bT_\bU_\bR_\bE { _\bg_\be_\bn_\be_\br_\ba_\bl, _\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc, _\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc, _\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn,\n+_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be };\n+304\n+_\b3_\b0_\b5 struct _\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n+306 {\n+_\b3_\b0_\b7 _\bM_\bM_\bH_\be_\ba_\bd_\be_\br()\n+308 : _\bt_\by_\bp_\be(_\bc_\bo_\bo_\br_\bd_\bi_\bn_\ba_\bt_\be_\b__\bt_\by_\bp_\be), _\bc_\bt_\by_\bp_\be(_\bd_\bo_\bu_\bb_\bl_\be_\b__\bt_\by_\bp_\be), _\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be(_\bg_\be_\bn_\be_\br_\ba_\bl)\n+309 {}\n+_\b3_\b1_\b0 _\bM_\bM_\b__\bT_\bY_\bP_\bE _\bt_\by_\bp_\be;\n+_\b3_\b1_\b1 _\bM_\bM_\b__\bC_\bT_\bY_\bP_\bE _\bc_\bt_\by_\bp_\be;\n+_\b3_\b1_\b2 _\bM_\bM_\b__\bS_\bT_\bR_\bU_\bC_\bT_\bU_\bR_\bE _\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be;\n+313 };\n+314\n+_\b3_\b1_\b5 inline bool _\bl_\bi_\bn_\be_\bF_\be_\be_\bd(std::istream& file)\n+316 {\n+317 char c;\n+318 if(!file.eof())\n+319 c=file.peek();\n+320 else\n+321 return false;\n+322 // ignore whitespace\n+323 while(c==' ')\n+324 {\n+325 file.get();\n+326 if(file.eof())\n+327 return false;\n+328 c=file.peek();\n+329 }\n+330\n+331 if(c=='\\n') {\n+332 /* eat the line feed */\n+333 file.get();\n+334 return true;\n+335 }\n+336 return false;\n+337 }\n+338\n+_\b3_\b3_\b9 inline void _\bs_\bk_\bi_\bp_\bC_\bo_\bm_\bm_\be_\bn_\bt_\bs(std::istream& file)\n+340 {\n+341 _\bl_\bi_\bn_\be_\bF_\be_\be_\bd(file);\n+342 char c=file.peek();\n+343 // ignore comment lines\n+344 while(c=='%')\n+345 {\n+346 /* discard the rest of the line */\n+347 file.ignore(std::numeric_limits::max(),'\\n');\n+348 c=file.peek();\n+349 }\n+350 }\n+351\n+352\n+_\b3_\b5_\b3 inline bool _\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bB_\ba_\bn_\bn_\be_\br(std::istream& file, _\bM_\bM_\bH_\be_\ba_\bd_\be_\br& mmHeader)\n+354 {\n+355 std::string buffer;\n+356 char c;\n+357 file >> buffer;\n+358 c=buffer[0];\n+359 mmHeader=_\bM_\bM_\bH_\be_\ba_\bd_\be_\br();\n+360 if(c!='%')\n+361 return false;\n+362 dverb<::max(),'\\n');\n+367 return false;\n+368 }\n+369\n+370 if(_\bl_\bi_\bn_\be_\bF_\be_\be_\bd(file))\n+371 /* premature end of line */\n+372 return false;\n+373\n+374 /* read the matrix_type */\n+375 file >> buffer;\n+376\n+377 if(buffer != \"matrix\")\n+378 {\n+379 /* discard the rest of the line */\n+380 file.ignore(std::numeric_limits::max(),'\\n');\n+381 return false;\n+382 }\n+383\n+384 if(_\bl_\bi_\bn_\be_\bF_\be_\be_\bd(file))\n+385 /* premature end of line */\n+386 return false;\n+387\n+388 /* The type of the matrix */\n+389 file >> buffer;\n+390\n+391 if(buffer.empty())\n+392 return false;\n+393\n+394 std::transform(buffer.begin(), buffer.end(), buffer.begin(),\n+395 ::tolower);\n+396\n+397 switch(buffer[0])\n+398 {\n+399 case 'a' :\n+400 /* sanity check */\n+401 if(buffer != \"array\")\n+402 {\n+403 file.ignore(std::numeric_limits::max(),'\\n');\n+404 return false;\n+405 }\n+406 mmHeader._\bt_\by_\bp_\be=_\ba_\br_\br_\ba_\by_\b__\bt_\by_\bp_\be;\n+407 break;\n+408 case 'c' :\n+409 /* sanity check */\n+410 if(buffer != \"coordinate\")\n+411 {\n+412 file.ignore(std::numeric_limits::max(),'\\n');\n+413 return false;\n+414 }\n+415 mmHeader._\bt_\by_\bp_\be=_\bc_\bo_\bo_\br_\bd_\bi_\bn_\ba_\bt_\be_\b__\bt_\by_\bp_\be;\n+416 break;\n+417 default :\n+418 file.ignore(std::numeric_limits::max(),'\\n');\n+419 return false;\n+420 }\n+421\n+422 if(_\bl_\bi_\bn_\be_\bF_\be_\be_\bd(file))\n+423 /* premature end of line */\n+424 return false;\n+425\n+426 /* The numeric type used. */\n+427 file >> buffer;\n+428\n+429 if(buffer.empty())\n+430 return false;\n+431\n+432 std::transform(buffer.begin(), buffer.end(), buffer.begin(),\n+433 ::tolower);\n+434 switch(buffer[0])\n+435 {\n+436 case 'i' :\n+437 /* sanity check */\n+438 if(buffer != \"integer\")\n+439 {\n+440 file.ignore(std::numeric_limits::max(),'\\n');\n+441 return false;\n+442 }\n+443 mmHeader._\bc_\bt_\by_\bp_\be=_\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bt_\by_\bp_\be;\n+444 break;\n+445 case 'r' :\n+446 /* sanity check */\n+447 if(buffer != \"real\")\n+448 {\n+449 file.ignore(std::numeric_limits::max(),'\\n');\n+450 return false;\n+451 }\n+452 mmHeader._\bc_\bt_\by_\bp_\be=_\bd_\bo_\bu_\bb_\bl_\be_\b__\bt_\by_\bp_\be;\n+453 break;\n+454 case 'c' :\n+455 /* sanity check */\n+456 if(buffer != \"complex\")\n+457 {\n+458 file.ignore(std::numeric_limits::max(),'\\n');\n+459 return false;\n+460 }\n+461 mmHeader._\bc_\bt_\by_\bp_\be=_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b__\bt_\by_\bp_\be;\n+462 break;\n+463 case 'p' :\n+464 /* sanity check */\n+465 if(buffer != \"pattern\")\n+466 {\n+467 file.ignore(std::numeric_limits::max(),'\\n');\n+468 return false;\n+469 }\n+470 mmHeader._\bc_\bt_\by_\bp_\be=_\bp_\ba_\bt_\bt_\be_\br_\bn;\n+471 break;\n+472 default :\n+473 file.ignore(std::numeric_limits::max(),'\\n');\n+474 return false;\n+475 }\n+476\n+477 if(_\bl_\bi_\bn_\be_\bF_\be_\be_\bd(file))\n+478 return false;\n+479\n+480 file >> buffer;\n+481\n+482 std::transform(buffer.begin(), buffer.end(), buffer.begin(),\n+483 ::tolower);\n+484 switch(buffer[0])\n+485 {\n+486 case 'g' :\n+487 /* sanity check */\n+488 if(buffer != \"general\")\n+489 {\n+490 file.ignore(std::numeric_limits::max(),'\\n');\n+491 return false;\n+492 }\n+493 mmHeader._\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be=_\bg_\be_\bn_\be_\br_\ba_\bl;\n+494 break;\n+495 case 'h' :\n+496 /* sanity check */\n+497 if(buffer != \"hermitian\")\n+498 {\n+499 file.ignore(std::numeric_limits::max(),'\\n');\n+500 return false;\n+501 }\n+502 mmHeader._\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be=_\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn;\n+503 break;\n+504 case 's' :\n+505 if(buffer.size()==1) {\n+506 file.ignore(std::numeric_limits::max(),'\\n');\n+507 return false;\n+508 }\n+509\n+510 switch(buffer[1])\n+511 {\n+512 case 'y' :\n+513 /* sanity check */\n+514 if(buffer != \"symmetric\")\n+515 {\n+516 file.ignore(std::numeric_limits::max(),'\\n');\n+517 return false;\n+518 }\n+519 mmHeader._\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be=_\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc;\n+520 break;\n+521 case 'k' :\n+522 /* sanity check */\n+523 if(buffer != \"skew-symmetric\")\n+524 {\n+525 file.ignore(std::numeric_limits::max(),'\\n');\n+526 return false;\n+527 }\n+528 mmHeader._\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be=_\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc;\n+529 break;\n+530 default :\n+531 file.ignore(std::numeric_limits::max(),'\\n');\n+532 return false;\n+533 }\n+534 break;\n+535 default :\n+536 file.ignore(std::numeric_limits::max(),'\\n');\n+537 return false;\n+538 }\n+539 file.ignore(std::numeric_limits::max(),'\\n');\n+540 c=file.peek();\n+541 return true;\n+542\n+543 }\n+544\n+545 template\n+546 std::tuple\n+_\b5_\b4_\b7 _\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bN_\bN_\bZ(std::size_t rows, std::size_t cols, std::size_t entries, const\n+_\bM_\bM_\bH_\be_\ba_\bd_\be_\br& header)\n+548 {\n+549 std::size_t blockrows=rows/brows;\n+550 std::size_t blockcols=cols/bcols;\n+551 std::size_t blocksize=brows*bcols;\n+552 std::size_t blockentries=0;\n+553\n+554 switch(header._\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be)\n+555 {\n+556 case _\bg_\be_\bn_\be_\br_\ba_\bl :\n+557 blockentries = entries/blocksize; break;\n+558 case _\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc :\n+559 blockentries = 2*entries/blocksize; break;\n+560 case _\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc :\n+561 blockentries = (2*entries-rows)/blocksize; break;\n+562 case _\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn :\n+563 blockentries = (2*entries-rows)/blocksize; break;\n+564 default :\n+565 throw Dune::NotImplemented();\n+566 }\n+567 return std::make_tuple(blockrows, blockcols, blockentries);\n+568 }\n+569\n+570 /*\n+571 * @brief Storage class for the column index and the numeric value.\n+572 *\n+573 * \\tparam T Either a NumericWrapper of the numeric type or PatternDummy\n+574 * for MatrixMarket pattern case.\n+575 */\n+576 template\n+_\b5_\b7_\b7 struct _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba : public T\n+578 {\n+_\b5_\b7_\b9 std::size_t _\bi_\bn_\bd_\be_\bx = {};\n+580 };\n+581\n+582\n+593 template\n+_\b5_\b9_\b4 struct _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br\n+595 {\n+_\b5_\b9_\b6 T _\bn_\bu_\bm_\bb_\be_\br = {};\n+_\b5_\b9_\b7 operator T&()\n+598 {\n+599 return _\bn_\bu_\bm_\bb_\be_\br;\n+600 }\n+601 };\n+602\n+_\b6_\b0_\b6 struct _\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by\n+607 {};\n+608\n+609 template<>\n+_\b6_\b1_\b0 struct _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br<_\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by>\n+611 {};\n+612\n+613 template\n+_\b6_\b1_\b4 std::istream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(std::istream& is, _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\bT_\b>& num)\n+615 {\n+616 return is>>num._\bn_\bu_\bm_\bb_\be_\br;\n+617 }\n+618\n+_\b6_\b1_\b9 inline std::istream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(std::istream& is, [[maybe_unused]]\n+_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by_\b>& num)\n+620 {\n+621 return is;\n+622 }\n+623\n+629 template\n+_\b6_\b3_\b0 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bT_\b>& i1, const _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bT_\b>& i2)\n+631 {\n+632 return i1._\bi_\bn_\bd_\be_\bx\n+_\b6_\b4_\b1 std::istream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(std::istream& is, _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bT_\b>& data)\n+642 {\n+643 is>>data._\bi_\bn_\bd_\be_\bx;\n+644 /* MatrixMarket indices are one based. Decrement for C++ */\n+645 --data._\bi_\bn_\bd_\be_\bx;\n+646 return is>>data.number;\n+647 }\n+648\n+654 template\n+_\b6_\b5_\b5 std::istream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(std::istream& is, _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba<_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br>>& data)\n+656 {\n+657 is>>data._\bi_\bn_\bd_\be_\bx;\n+658 /* MatrixMarket indices are one based. Decrement for C++ */\n+659 --data.index;\n+660 // real and imaginary part needs to be read separately as\n+661 // complex numbers are not provided in pair form. (x,y)\n+662 _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\bT_\b> real, imag;\n+663 is>>real;\n+664 is>>imag;\n+665 data._\bn_\bu_\bm_\bb_\be_\br = {real._\bn_\bu_\bm_\bb_\be_\br, imag._\bn_\bu_\bm_\bb_\be_\br};\n+666 return is;\n+667 }\n+668\n+675 template\n+_\b6_\b7_\b6 struct _\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br\n+677 {\n+683 template\n+_\b6_\b8_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const std::vector > >& rows,\n+685 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& matrix)\n+686 {\n+687 static_assert(IsNumber::value && brows==1 && bcols==1, \"Only scalar\n+entries are expected here!\");\n+688 for (auto iter=matrix._\bb_\be_\bg_\bi_\bn(); iter!= matrix._\be_\bn_\bd(); ++iter)\n+689 {\n+690 auto brow=iter.index();\n+691 for (auto siter=rows[brow].begin(); siter != rows[brow].end(); ++siter)\n+692 (*iter)[siter->index] = siter->number;\n+693 }\n+694 }\n+695\n+701 template\n+_\b7_\b0_\b2 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const std::vector > >& rows,\n+703 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bb_\br_\bo_\bw_\bs_\b,_\bb_\bc_\bo_\bl_\bs_\b> >& matrix)\n+704 {\n+705 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter)\n+706 {\n+707 for (auto brow=iter.index()*brows,\n+708 browend=iter.index()*brows+brows;\n+709 browindex/bcols][brow%brows][siter->index%bcols]=siter->number;\n+714 }\n+715 }\n+716 }\n+717 };\n+718\n+719 template\n+_\b7_\b2_\b0 struct _\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br<_\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by,brows,bcols>\n+721 {\n+722 template\n+_\b7_\b2_\b3 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const std::vector > >&\n+rows,\n+724 M& matrix)\n+725 {}\n+726 };\n+727\n+_\b7_\b2_\b8 template struct _\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx : std::false_type {};\n+_\b7_\b2_\b9 template struct _\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx<_\bs_\bt_\bd::complex> : std::true_type {};\n+730\n+731 // wrapper for std::conj. Returns T if T is not complex.\n+732 template\n+_\b7_\b3_\b3 std::enable_if_t::value, T> _\bc_\bo_\bn_\bj(const T& r){\n+734 return r;\n+735 }\n+736\n+737 template\n+_\b7_\b3_\b8 std::enable_if_t::value, T> _\bc_\bo_\bn_\bj(const T& r){\n+739 return std::conj(r);\n+740 }\n+741\n+742 template\n+_\b7_\b4_\b3 struct _\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs\n+744 {};\n+745\n+746 template\n+_\b7_\b4_\b7 struct _\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n+748 {\n+749 enum {\n+_\b7_\b5_\b0 rows = 1,\n+751 cols = 1\n+_\b7_\b5_\b2 };\n+753 };\n+754\n+755 template\n+_\b7_\b5_\b6 struct _\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A> >\n+757 {\n+758 enum {\n+_\b7_\b5_\b9 rows = i,\n+760 cols = j\n+_\b7_\b6_\b1 };\n+762 };\n+763\n+764 template\n+_\b7_\b6_\b5 void _\br_\be_\ba_\bd_\bS_\bp_\ba_\br_\bs_\be_\bE_\bn_\bt_\br_\bi_\be_\bs(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>& matrix,\n+766 std::istream& file, std::size_t entries,\n+767 const _\bM_\bM_\bH_\be_\ba_\bd_\be_\br& mmHeader, const D&)\n+768 {\n+769 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n+770\n+771 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)\n+772 constexpr int brows = _\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bs;\n+773 constexpr int bcols = _\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bs;\n+774\n+775 // First path\n+776 // store entries together with column index in a separate\n+777 // data structure\n+778 std::vector > > rows(matrix._\bN()*brows);\n+779\n+780 auto readloop = [&] (auto symmetryFixup) {\n+781 for(std::size_t i = 0; i < entries; ++i) {\n+782 std::size_t row;\n+783 _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bD_\b> data;\n+784 _\bs_\bk_\bi_\bp_\bC_\bo_\bm_\bm_\be_\bn_\bt_\bs(file);\n+785 file>>row;\n+786 --row; // Index was 1 based.\n+787 assert(row/bcols>data;\n+789 assert(data._\bi_\bn_\bd_\be_\bx/bcols data_sym(data);\n+804 data_sym._\bi_\bn_\bd_\be_\bx = row;\n+805 rows[data.index].insert(data_sym);\n+806 });\n+807 break;\n+808 case _\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc :\n+809 readloop([&](auto row, auto data) {\n+810 _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bD_\b> data_sym;\n+811 data_sym.number = -data.number;\n+812 data_sym._\bi_\bn_\bd_\be_\bx = row;\n+813 rows[data.index].insert(data_sym);\n+814 });\n+815 break;\n+816 case _\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn :\n+817 readloop([&](auto row, auto data) {\n+818 _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bD_\b> data_sym;\n+819 data_sym.number = _\bc_\bo_\bn_\bj(data.number);\n+820 data_sym._\bi_\bn_\bd_\be_\bx = row;\n+821 rows[data.index].insert(data_sym);\n+822 });\n+823 break;\n+824 default:\n+825 DUNE_THROW(Dune::NotImplemented,\n+826 \"Only general, symmetric, skew-symmetric and hermitian is supported right\n+now!\");\n+827 }\n+828\n+829 // Setup the matrix sparsity pattern\n+830 int nnz=0;\n+831 for(typename Matrix::CreateIterator iter=matrix._\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn();\n+832 iter!= matrix._\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd(); ++iter)\n+833 {\n+834 for(std::size_t brow=iter.index()*brows, browend=iter.index()*brows+brows;\n+835 brow >::const_iterator Siter;\n+838 for(Siter siter=rows[brow].begin(), send=rows[brow].end();\n+839 siter != send; ++siter, ++nnz)\n+840 iter.insert(siter->index/bcols);\n+841 }\n+842 }\n+843\n+844 //Set the matrix values\n+845 matrix=0;\n+846\n+847 _\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b<_\bD_\b,_\bb_\br_\bo_\bw_\bs_\b,_\bb_\bc_\bo_\bl_\bs_\b> Setter;\n+848\n+849 Setter(rows, matrix);\n+850 }\n+851\n+_\b8_\b5_\b2 inline std::tuple _\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be(const std::\n+string& filename) {\n+853 std::size_t lastdot = filename.find_last_of(\".\");\n+854 if(lastdot == std::string::npos)\n+855 return std::make_tuple(filename, \"\");\n+856 else {\n+857 std::string potentialFileExtension = filename.substr(lastdot);\n+858 if (potentialFileExtension == \".mm\" || potentialFileExtension == \".mtx\")\n+859 return std::make_tuple(filename.substr(0, lastdot),\n+potentialFileExtension);\n+860 else\n+861 return std::make_tuple(filename, \"\");\n+862 }\n+863 }\n+864\n+865 } // end namespace MatrixMarketImpl\n+866\n+_\b8_\b6_\b7 class _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br : public Dune::Exception\n+868 {};\n+869\n+870\n+_\b8_\b7_\b1 inline void _\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bh_\be_\ba_\bd_\be_\br(std::size_t& rows, std::size_t& cols,\n+872 _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br& header, std::istream& istr,\n+873 bool isVector)\n+874 {\n+875 using namespace MatrixMarketImpl;\n+876\n+877 if(!readMatrixMarketBanner(istr, header)) {\n+878 std::cerr << \"First line was not a correct Matrix Market banner. Using\n+default:\\n\"\n+879 << \"%%MatrixMarket matrix coordinate real general\"<> rows;\n+893\n+894 if(lineFeed(istr))\n+895 throw _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br();\n+896 istr >> cols;\n+897 }\n+898\n+899 template\n+_\b9_\b0_\b0 void _\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& vector,\n+901 std::size_t size,\n+902 std::istream& istr,\n+903 size_t lane)\n+904 {\n+905 for (int i=0; size>0; ++i, --size)\n+906 istr>>Simd::lane(lane,vector[i]);\n+907 }\n+908\n+909 template\n+_\b9_\b1_\b0 void _\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br,A>& vector,\n+911 std::size_t size,\n+912 std::istream& istr,\n+913 size_t lane)\n+914 {\n+915 for(int i=0; size>0; ++i, --size) {\n+916 Simd::Scalar val;\n+917 istr>>val;\n+918 Simd::lane(lane, vector[i/entries][i%entries])=val;\n+919 }\n+920 }\n+921\n+922\n+929 template\n+_\b9_\b3_\b0 void _\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& vector,\n+931 std::istream& istr)\n+932 {\n+933 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be field_type;\n+934 using namespace MatrixMarketImpl;\n+935\n+936 MMHeader header;\n+937 std::size_t rows, cols;\n+938 _\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bh_\be_\ba_\bd_\be_\br(rows,cols,header,istr, true);\n+939 if(cols!=Simd::lanes()) {\n+940 if(Simd::lanes() == 1)\n+941 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br, \"cols!=1, therefore this is no\n+vector!\");\n+942 else\n+943 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br, \"cols does not match the number of\n+lanes in the field_type!\");\n+944 }\n+945\n+946 if(header.type!=array_type)\n+947 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br, \"Vectors have to be stored in array\n+format!\");\n+948\n+949\n+950 if constexpr (Dune::IsNumber())\n+951 vector._\br_\be_\bs_\bi_\bz_\be(rows);\n+952 else\n+953 {\n+954 T dummy;\n+955 auto blocksize = dummy.size();\n+956 std::size_t size=rows/blocksize;\n+957 if(size*blocksize!=rows)\n+958 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br, \"Block size of vector is not\n+correct!\");\n+959\n+960 vector._\br_\be_\bs_\bi_\bz_\be(size);\n+961 }\n+962\n+963 istr.ignore(std::numeric_limits::max(),'\\n');\n+964 for(size_t l=0;l();++l){\n+965 _\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs(vector, rows, istr, l);\n+966 }\n+967 }\n+968\n+975 template\n+_\b9_\b7_\b6 void _\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>& matrix,\n+977 std::istream& istr)\n+978 {\n+979 using namespace MatrixMarketImpl;\n+980 using _\bM_\ba_\bt_\br_\bi_\bx = _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>;\n+981\n+982 MMHeader header;\n+983 if(!readMatrixMarketBanner(istr, header)) {\n+984 std::cerr << \"First line was not a correct Matrix Market banner. Using\n+default:\\n\"\n+985 << \"%%MatrixMarket matrix coordinate real general\"<> rows;\n+998\n+999 if(lineFeed(istr))\n+1000 throw _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br();\n+1001 istr >> cols;\n+1002\n+1003 if(lineFeed(istr))\n+1004 throw _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br();\n+1005\n+1006 istr >>entries;\n+1007\n+1008 std::size_t nnz, blockrows, blockcols;\n+1009\n+1010 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)\n+1011 constexpr int brows = mm_multipliers::rows;\n+1012 constexpr int bcols = mm_multipliers::cols;\n+1013\n+1014 std::tie(blockrows, blockcols, nnz) = calculateNNZ(rows,\n+cols, entries, header);\n+1015\n+1016 istr.ignore(std::numeric_limits::max(),'\\n');\n+1017\n+1018\n+1019 matrix._\bs_\be_\bt_\bS_\bi_\bz_\be(blockrows, blockcols, nnz);\n+1020 matrix._\bs_\be_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\br_\bo_\bw_\b__\bw_\bi_\bs_\be);\n+1021\n+1022 if(header.type==array_type)\n+1023 DUNE_THROW(Dune::NotImplemented, \"Array format currently not supported for\n+matrices!\");\n+1024\n+1025 readSparseEntries(matrix, istr, entries, header, NumericWrapper());\n+1026 }\n+1027\n+1028 // Print a scalar entry\n+1029 template\n+_\b1_\b0_\b3_\b0 void _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\be_\bn_\bt_\br_\by(const B& entry,\n+1031 std::size_t rowidx,\n+1032 std::size_t colidx,\n+1033 std::ostream& ostr)\n+1034 {\n+1035 if constexpr (IsNumber())\n+1036 ostr << rowidx << \" \" << colidx << \" \" << entry << std::endl;\n+1037 else\n+1038 {\n+1039 for (auto row=entry.begin(); row != entry.end(); ++row, ++rowidx) {\n+1040 int coli=colidx;\n+1041 for (auto _\bc_\bo_\bl = row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl, ++coli)\n+1042 ostr<< rowidx<<\" \"<\n+_\b1_\b0_\b4_\b9 void _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by(const V& entry, std::ostream& ostr,\n+1050 const std::integral_constant&,\n+1051 size_t lane)\n+1052 {\n+1053 ostr<\n+_\b1_\b0_\b5_\b8 void _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by(const V& vector, std::ostream& ostr,\n+1059 const std::integral_constant&,\n+1060 size_t lane)\n+1061 {\n+1062 using namespace MatrixMarketImpl;\n+1063\n+1064 // Is the entry a supported numeric type?\n+1065 const int isnumeric = mm_numeric_type>::is_numeric;\n+1066 typedef typename V::const_iterator VIter;\n+1067\n+1068 for(VIter i=vector.begin(); i != vector.end(); ++i)\n+1069\n+1070 _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by(*i, ostr,\n+1071 std::integral_constant(),\n+1072 lane);\n+1073 }\n+1074\n+1075 template\n+_\b1_\b0_\b7_\b6 std::size_t _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& vector)\n+1077 {\n+1078 return vector.size();\n+1079 }\n+1080\n+1081 template\n+_\b1_\b0_\b8_\b2 std::size_t _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br,A>& vector)\n+1083 {\n+1084 return vector.size()*i;\n+1085 }\n+1086\n+1087 // Version for writing vectors.\n+1088 template\n+_\b1_\b0_\b8_\b9 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(const V& vector, std::ostream& ostr,\n+1090 const std::integral_constant&)\n+1091 {\n+1092 using namespace MatrixMarketImpl;\n+1093 typedef typename V::field_type field_type;\n+1094\n+1095 ostr<<_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(vector)<<\" \"<()<>::is_numeric;\n+1097 for(size_t l=0;l(); ++l){\n+1098 _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by(vector,ostr, std::integral_constant\n+(), l);\n+1099 }\n+1100 }\n+1101\n+1102 // Versions for writing matrices\n+1103 template\n+_\b1_\b1_\b0_\b4 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(const M& matrix,\n+1105 std::ostream& ostr,\n+1106 const std::integral_constant&)\n+1107 {\n+1108 ostr<_\b:_\b:_\br_\bo_\bw_\bs<<\" \"\n+1109 <_\b:_\b:_\bc_\bo_\bl_\bs<<\" \"\n+1110 <<_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs(matrix)<begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl)\n+1116 // Matrix Market indexing start with 1!\n+1117 _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\be_\bn_\bt_\br_\by(*_\bc_\bo_\bl, row.index()*_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\bM_\b>_\b:_\b:\n+_\br_\bo_\bw_\bs+1,\n+1118 _\bc_\bo_\bl.index()*_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\bM_\b>_\b:_\b:_\bc_\bo_\bl_\bs+1, ostr);\n+1119 }\n+1120\n+1121\n+1125 template\n+_\b1_\b1_\b2_\b6 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(const M& matrix,\n+1127 std::ostream& ostr)\n+1128 {\n+1129 using namespace MatrixMarketImpl;\n+1130\n+1131 // Write header information\n+1132 mm_header_printer::print(ostr);\n+1133 mm_block_structure_header::print(ostr,matrix);\n+1134 // Choose the correct function for matrix and vector\n+1135 _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(matrix,ostr,std::integral_constant_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be>());\n+1136 }\n+1137\n+_\b1_\b1_\b3_\b8 static const int _\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn = -1;\n+1150 template\n+_\b1_\b1_\b5_\b1 void _\bs_\bt_\bo_\br_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(const M& matrix,\n+1152 std::string filename,\n+1153 int prec=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn)\n+1154 {\n+1155 auto [pureFilename, extension] = _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n+(filename);\n+1156 std::string rfilename;\n+1157 std::ofstream file;\n+1158 if (extension != \"\") {\n+1159 rfilename = pureFilename + extension;\n+1160 file.open(rfilename.c_str());\n+1161 if(!file)\n+1162 DUNE_THROW(IOError, \"Could not open file for storage: \" << rfilename.c_str\n+());\n+1163 }\n+1164 else {\n+1165 // only try .mm so we do not ignore potential errors\n+1166 rfilename = pureFilename + \".mm\";\n+1167 file.open(rfilename.c_str());\n+1168 if(!file)\n+1169 DUNE_THROW(IOError, \"Could not open file for storage: \" << rfilename.c_str\n+());\n+1170 }\n+1171\n+1172 file.setf(std::ios::scientific,std::ios::floatfield);\n+1173 if(prec>0)\n+1174 file.precision(prec);\n+1175 _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(matrix, file);\n+1176 file.close();\n+1177 }\n+1178\n+1179#if HAVE_MPI\n+1194 template\n+_\b1_\b1_\b9_\b5 void _\bs_\bt_\bo_\br_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(const M& matrix,\n+1196 std::string filename,\n+1197 const _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bG_\b,_\bL_\b>& comm,\n+1198 bool storeIndices=true,\n+1199 int prec=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn)\n+1200 {\n+1201 // Get our rank\n+1202 int rank = comm._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br().rank();\n+1203 // Write the local matrix\n+1204 auto [pureFilename, extension] = _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n+(filename);\n+1205 std::string rfilename;\n+1206 std::ofstream file;\n+1207 if (extension != \"\") {\n+1208 rfilename = pureFilename + \"_\" + std::to_string(rank) + extension;\n+1209 file.open(rfilename.c_str());\n+1210 dverb<< rfilename <0)\n+1224 file.precision(prec);\n+1225 _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(matrix, file);\n+1226 file.close();\n+1227\n+1228 if(!storeIndices)\n+1229 return;\n+1230\n+1231 // Write the global to local index mapping\n+1232 rfilename = pureFilename + \"_\" + std::to_string(rank) + \".idx\";\n+1233 file.open(rfilename.c_str());\n+1234 if(!file)\n+1235 DUNE_THROW(IOError, \"Could not open file for storage: \" << rfilename.c_str\n+());\n+1236 file.setf(std::ios::scientific,std::ios::floatfield);\n+1237 typedef typename _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bG_\b,_\bL_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+IndexSet;\n+1238 typedef typename IndexSet::const_iterator Iterator;\n+1239 for(Iterator iter = comm._\bi_\bn_\bd_\be_\bx_\bS_\be_\bt().begin();\n+1240 iter != comm._\bi_\bn_\bd_\be_\bx_\bS_\be_\bt().end(); ++iter) {\n+1241 file << iter->global()<<\" \"<<(std::size_t)iter->local()<<\" \"\n+1242 <<(int)iter->local().attribute()<<\" \"<<(int)iter->local().isPublic\n+()<& neighbours=comm._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().getNeighbours();\n+1247 typedef std::set::const_iterator SIter;\n+1248 for(SIter neighbour=neighbours.begin(); neighbour != neighbours.end();\n+++neighbour) {\n+1249 file<<\" \"<< *neighbour;\n+1250 }\n+1251 file.close();\n+1252 }\n+1253\n+1268 template\n+_\b1_\b2_\b6_\b9 void _\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(M& matrix,\n+1270 const std::string& filename,\n+1271 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bG_\b,_\bL_\b>& comm,\n+1272 bool readIndices=true)\n+1273 {\n+1274 using namespace MatrixMarketImpl;\n+1275\n+1276 using LocalIndexT = typename _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bG_\b,_\bL_\b>_\b:_\b:\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+1277 typedef typename LocalIndexT::Attribute Attribute;\n+1278 // Get our rank\n+1279 int rank = comm._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br().rank();\n+1280 // load local matrix\n+1281 auto [pureFilename, extension] = _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n+(filename);\n+1282 std::string rfilename;\n+1283 std::ifstream file;\n+1284 if (extension != \"\") {\n+1285 rfilename = pureFilename + \"_\" + std::to_string(rank) + extension;\n+1286 file.open(rfilename.c_str(), std::ios::in);\n+1287 dverb<< rfilename <_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+IndexSet;\n+1311 IndexSet& pis=comm.pis;\n+1312 rfilename = pureFilename + \"_\" + std::to_string(rank) + \".idx\";\n+1313 file.open(rfilename.c_str());\n+1314 if(!file)\n+1315 DUNE_THROW(IOError, \"Could not open file: \" << rfilename.c_str());\n+1316 if(pis.size()!=0)\n+1317 DUNE_THROW(InvalidIndexSetState, \"Index set is not empty!\");\n+1318\n+1319 pis.beginResize();\n+1320 while(!file.eof() && file.peek()!='n') {\n+1321 G g;\n+1322 file >>g;\n+1323 std::size_t l;\n+1324 file >>l;\n+1325 int c;\n+1326 file >>c;\n+1327 bool b;\n+1328 file >> b;\n+1329 pis.add(g,LocalIndexT(l,Attribute(c),b));\n+1330 lineFeed(file);\n+1331 }\n+1332 pis.endResize();\n+1333 if(!file.eof()) {\n+1334 // read neighbours\n+1335 std::string s;\n+1336 file>>s;\n+1337 if(s!=\"neighbours:\")\n+1338 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br, \"was expecting the string:\n+\\\"neighbours:\\\"\");\n+1339 std::set nb;\n+1340 while(!file.eof()) {\n+1341 int i;\n+1342 file >> i;\n+1343 nb.insert(i);\n+1344 }\n+1345 file.close();\n+1346 comm.ri.setNeighbours(nb);\n+1347 }\n+1348 comm.ri.template rebuild();\n+1349 }\n+1350\n+1351 #endif\n+1352\n+1363 template\n+_\b1_\b3_\b6_\b4 void _\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(M& matrix,\n+1365 const std::string& filename)\n+1366 {\n+1367 auto [pureFilename, extension] = _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n+(filename);\n+1368 std::string rfilename;\n+1369 std::ifstream file;\n+1370 if (extension != \"\") {\n+1371 rfilename = pureFilename + extension;\n+1372 file.open(rfilename.c_str());\n+1373 if(!file)\n+1374 DUNE_THROW(IOError, \"Could not open file: \" << rfilename.c_str());\n+1375 }\n+1376 else {\n+1377 // try both .mm and .mtx\n+1378 rfilename = pureFilename + \".mm\";\n+1379 file.open(rfilename.c_str(), std::ios::in);\n+1380 if(!file) {\n+1381 rfilename = pureFilename + \".mtx\";\n+1382 file.open(rfilename.c_str(), std::ios::in);\n+1383 if(!file)\n+1384 DUNE_THROW(IOError, \"Could not open file: \" << rfilename.c_str());\n+1385 }\n+1386 }\n+1387 _\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(matrix,file);\n+1388 file.close();\n+1389 }\n+1390\n+1392}\n+1393#endif\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n+_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n+Classes providing communication interfaces for overlapping Schwarz methods.\n+_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+This file implements a vector space as a tensor product of a given vector\n+space. The number of compon...\n+_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\n+Some handy generic functions for ISTL matrices.\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs\n+auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::\n+value > *sfinae=nullptr)\n+Get the number of nonzero fields in the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:119\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt\n+void readMatrixMarket(Dune::BlockVector< T, A > &vector, std::istream &istr)\n+Reads a BlockVector from a matrix market file.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:930\n+_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\bo_\br_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt\n+void storeMatrixMarket(const M &matrix, std::string filename, int\n+prec=default_precision)\n+Stores a parallel matrix/vector in matrix market format in a file.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt\n+void loadMatrixMarket(M &matrix, const std::string &filename,\n+OwnerOverlapCopyCommunication< G, L > &comm, bool readIndices=true)\n+Load a parallel matrix/vector stored in matrix market format.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1269\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs\n+std::size_t countEntries(const BlockVector< T, A > &vector)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1076\n+_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt\n+void writeMatrixMarket(const V &vector, std::ostream &ostr, const std::\n+integral_constant< int, 0 > &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1089\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by\n+void mm_print_vector_entry(const V &entry, std::ostream &ostr, const std::\n+integral_constant< int, 1 > &, size_t lane)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1049\n+_\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn\n+static const int default_precision\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1138\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs\n+void mm_read_vector_entries(Dune::BlockVector< T, A > &vector, std::size_t\n+size, std::istream &istr, size_t lane)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:900\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bh_\be_\ba_\bd_\be_\br\n+void mm_read_header(std::size_t &rows, std::size_t &cols, MatrixMarketImpl::\n+MMHeader &header, std::istream &istr, bool isVector)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:871\n+_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\be_\bn_\bt_\br_\by\n+void mm_print_entry(const B &entry, std::size_t rowidx, std::size_t colidx,\n+std::ostream &ostr)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1030\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bN_\bN_\bZ\n+std::tuple< std::size_t, std::size_t, std::size_t > calculateNNZ(std::size_t\n+rows, std::size_t cols, std::size_t entries, const MMHeader &header)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:547\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n+bool operator<(const IndexData< T > &i1, const IndexData< T > &i2)\n+LessThan operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:630\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bL_\bi_\bn_\be_\bT_\by_\bp_\be\n+LineType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:296\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bD_\bA_\bT_\bA\n+@ DATA\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:296\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bH_\bE_\bA_\bD_\bE_\bR\n+@ MM_HEADER\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:296\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bI_\bS_\bT_\bL_\bS_\bT_\bR_\bU_\bC_\bT\n+@ MM_ISTLSTRUCT\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:296\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bB_\ba_\bn_\bn_\be_\br\n+bool readMatrixMarketBanner(std::istream &file, MMHeader &mmHeader)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:353\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\br_\be_\ba_\bd_\bS_\bp_\ba_\br_\bs_\be_\bE_\bn_\bt_\br_\bi_\be_\bs\n+void readSparseEntries(Dune::BCRSMatrix< T, A > &matrix, std::istream &file,\n+std::size_t entries, const MMHeader &mmHeader, const D &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:765\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bT_\bY_\bP_\bE\n+MM_TYPE\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\ba_\br_\br_\ba_\by_\b__\bt_\by_\bp_\be\n+@ array_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bo_\br_\bd_\bi_\bn_\ba_\bt_\be_\b__\bt_\by_\bp_\be\n+@ coordinate_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bt_\by_\bp_\be\n+@ unknown_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n+std::istream & operator>>(std::istream &is, NumericWrapper< T > &num)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:614\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bk_\bi_\bp_\bC_\bo_\bm_\bm_\be_\bn_\bt_\bs\n+void skipComments(std::istream &file)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:339\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bl_\bi_\bn_\be_\bF_\be_\be_\bd\n+bool lineFeed(std::istream &file)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:315\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bM_\bA_\bX_\b__\bL_\bI_\bN_\bE_\b__\bL_\bE_\bN_\bG_\bT_\bH\n+@ MM_MAX_LINE_LENGTH\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:297\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bS_\bT_\bR_\bU_\bC_\bT_\bU_\bR_\bE\n+MM_STRUCTURE\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc\n+@ skew_symmetric\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bg_\be_\bn_\be_\br_\ba_\bl\n+@ general\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn\n+@ hermitian\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be\n+@ unknown_structure\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc\n+@ symmetric\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bC_\bT_\bY_\bP_\bE\n+MM_CTYPE\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bc_\bt_\by_\bp_\be\n+@ unknown_ctype\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bp_\ba_\bt_\bt_\be_\br_\bn\n+@ pattern\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b__\bt_\by_\bp_\be\n+@ complex_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bd_\bo_\bu_\bb_\bl_\be_\b__\bt_\by_\bp_\be\n+@ double_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bt_\by_\bp_\be\n+@ integer_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bn_\bj\n+std::enable_if_t::value, T > conj(const T &r)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:733\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n+std::tuple< std::string, std::string > splitFilename(const std::string\n+&filename)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:852\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+Iterator begin()\n+Get iterator to first row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:671\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+Iterator end()\n+Get iterator to one beyond last row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:677\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd\n+CreateIterator createend()\n+get create iterator pointing to one after the last block\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+size_type M() const\n+number of columns (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2007\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn\n+CreateIterator createbegin()\n+get initial create iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1094\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+size_type N() const\n+number of rows (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be\n+void setBuildMode(BuildMode bm)\n+Sets the build mode of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:830\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n+void setSize(size_type rows, size_type columns, size_type nnz=0)\n+Set the size of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:858\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A vector of blocks with memory management.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n+void resize(size_type size)\n+Resize the vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:496\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< B >::field_type field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:398\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+A generic dynamic dense matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be\n+Helper metaprogram to get the matrix market string representation of the\n+numeric type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b:_\b:_\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n+@ is_numeric\n+Whether T is a supported numeric type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bi_\bn_\bt_\b _\b>_\b:_\b:_\bs_\bt_\br\n+static std::string str()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bs_\bt_\br\n+static std::string str()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:111\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b:_\b:_\bs_\bt_\br\n+static std::string str()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:127\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bs_\bt_\br\n+static std::string str()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:143\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b _\b>_\b:_\b:_\bs_\bt_\br\n+static std::string str()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:159\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br\n+Meta program to write the correct Matrix Market header.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:174\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n+static void print(std::ostream &os)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:179\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n+static void print(std::ostream &os)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:189\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bj_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n+static void print(std::ostream &os)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:199\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,_\b _\bj_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n+static void print(std::ostream &os)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:209\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br\n+Metaprogram for writing the ISTL block structure header.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:225\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n+static void print(std::ostream &os, const M &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:233\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM\n+BlockVector< T, A > M\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,\n+_\bi_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM\n+BlockVector< FieldVector< T, i >, A > M\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:243\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,\n+_\bi_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n+static void print(std::ostream &os, const M &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:245\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM\n+BCRSMatrix< T, A > M\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:255\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n+static void print(std::ostream &os, const M &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:258\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,\n+_\bi_\b,_\b _\bj_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM\n+BCRSMatrix< FieldMatrix< T, i, j >, A > M\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:268\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,\n+_\bi_\b,_\b _\bj_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n+static void print(std::ostream &os, const M &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:270\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,_\b _\bj_\b _\b>_\b _\b>_\b:_\b:\n+_\bp_\br_\bi_\bn_\bt\n+static void print(std::ostream &os, const M &m)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:283\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,_\b _\bj_\b _\b>_\b _\b>_\b:_\b:_\bM\n+FieldMatrix< T, i, j > M\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:281\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bi_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n+static void print(std::ostream &os, const M &m)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:292\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bi_\b _\b>_\b _\b>_\b:_\b:_\bM\n+FieldVector< T, i > M\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:290\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:306\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br_\b:_\b:_\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be\n+MM_STRUCTURE structure\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:312\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br_\b:_\b:_\bt_\by_\bp_\be\n+MM_TYPE type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:310\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n+MMHeader()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:307\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br_\b:_\b:_\bc_\bt_\by_\bp_\be\n+MM_CTYPE ctype\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:311\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:578\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b:_\b:_\bi_\bn_\bd_\be_\bx\n+std::size_t index\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:579\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br\n+a wrapper class of numeric values.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:595\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b:_\b:_\bn_\bu_\bm_\bb_\be_\br\n+T number\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:596\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by\n+Utility class for marking the pattern type of the MatrixMarket matrices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:607\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br\n+Functor to the data values of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:677\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const std::vector< std::set< IndexData< D > > > &rows,\n+BCRSMatrix< T > &matrix)\n+Sets the matrix values.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:684\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const std::vector< std::set< IndexData< D > > > &rows,\n+BCRSMatrix< FieldMatrix< T, brows, bcols > > &matrix)\n+Sets the matrix values.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:702\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b<_\b _\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by_\b,_\b _\bb_\br_\bo_\bw_\bs_\b,_\b _\bb_\bc_\bo_\bl_\bs_\b _\b>_\b:_\b:\n+_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const std::vector< std::set< IndexData< PatternDummy > > >\n+&rows, M &matrix)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:723\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:728\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:744\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:868\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx\n+Test whether a type is an ISTL Matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:504\n _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n A class setting up standard communication for a two-valued attribute set with\n owner/overlap/copy sema...\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl\n-void copyCopyToAll(const T &source, T &dest) const\n-Communicate values from copy data points to all other data points.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:328\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet\n-The type of the reverse lookup of indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:456\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bn_\bd_\be_\bx_\bS_\be_\bt\n+const ParallelIndexSet & indexSet() const\n+Get the underlying parallel index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:462\n _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n const Communication< MPI_Comm > & communicator() const\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl\n-void copyOwnerToAll(const T &source, T &dest) const\n-Communicate values from owner data points to all other data points.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:311\n _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n const RemoteIndices & remoteIndices() const\n Get the underlying remote indices.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:471\n _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet\n The type of the parallel index set.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:449\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-Class providing information about the mapping of the vertices onto aggregates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:29\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-const GlobalIndex & operator[](std::size_t index) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bg_\be_\bt\n-GlobalIndex & get(std::size_t index)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::GlobalIndex GlobalIndex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bp_\bu_\bt\n-void put(const GlobalIndex &global, size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:96\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-T Vertex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n-GlobalAggregatesMap(AggregatesMap< Vertex > &aggregates, const\n-GlobalLookupIndexSet< ParallelIndexSet > &indexset)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-TI ParallelIndexSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:31\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::LocalIndex LocalIndex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be\n-ParallelIndexSet::GlobalIndex IndexedType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-Proxy operator[](std::size_t index)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bP_\br_\bo_\bx_\by\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bP_\br_\bo_\bx_\by_\b:_\b:_\bP_\br_\bo_\bx_\by\n-Proxy(const GlobalLookupIndexSet< ParallelIndexSet > &indexset, Vertex\n-&aggregate)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bP_\br_\bo_\bx_\by_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-Proxy & operator=(const GlobalIndex &global)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n-static void scatter(GlobalAggregatesMap< T, TI > &ga, GlobalIndex global,\n-size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:123\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-ParallelIndexSet::GlobalIndex GlobalIndex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-TI ParallelIndexSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:115\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n-static const GlobalIndex & gather(const GlobalAggregatesMap< T, TI > &ga,\n-size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:118\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:131\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n-_\b>_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:164\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n-_\b>_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bF_\bl_\ba_\bg_\bs\n-O OverlapFlags\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:162\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n-_\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-T Vertex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:161\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n-_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-ParallelInformation::ParallelIndexSet IndexSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:165\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n-_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-OwnerOverlapCopyCommunication< T1, T2 > ParallelInformation\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:163\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n-_\b>_\b:_\b:_\bp_\bu_\bb_\bl_\bi_\bs_\bh\n-static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation\n-&pinfo, const GlobalLookupIndexSet &globalLookup)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:167\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bp_\bu_\bb_\bl_\bi_\bs_\bh\n-static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation\n-&pinfo, const GlobalLookupIndexSet &globalLookup)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:226\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-SequentialInformation ParallelInformation\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:223\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-T Vertex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:222\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:\n-_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:224\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bS_\bi_\bz_\be\n-static int getSize(const Type &, int)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:242\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be\n-Amg::GlobalAggregatesMap< T, TI >::IndexedType IndexedType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:240\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n-Amg::AggregatesMap< T > Type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:239\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg\n-SizeOne IndexedTypeFlag\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:241\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-int GlobalLookupIndexSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n-@ nonoverlapping\n-Category for non-overlapping solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-static Category category(const OP &op, decltype(op.category()) *=nullptr)\n-Helperfunction to extract the solver category either from an enum, or from the\n-newly introduced virtu...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00140.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00140.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: kamg.hh File Reference\n+dune-istl: matrixredistribute.hh File Reference\n \n \n \n \n \n \n \n@@ -65,51 +65,92 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n \n+
    matrixredistribute.hh File Reference
    \n \n
    \n \n-

    Provides an algebraic multigrid using a Krylov cycle. \n+

    Functionality for redistributing a sparse matrix. \n More...

    \n-
    #include <dune/istl/preconditioners.hh>
    \n-#include "amg.hh"
    \n+
    #include <memory>
    \n+#include "repartition.hh"
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/common/parallel/indexset.hh>
    \n+#include <dune/istl/owneroverlapcopy.hh>
    \n+#include <dune/istl/paamg/pinfo.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::Amg::KAmgTwoGrid< AMG >
     Two grid operator for AMG with Krylov cycle. More...
    struct  Dune::RedistributeInformation< T >
     
    class  Dune::Amg::KAMG< M, X, S, PI, K, A >
     an algebraic multigrid method using a Krylov-cycle. More...
    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...
     
    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 >
     
    \n \n \n \n-\n-\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+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)
     
    \n

    Detailed Description

    \n-

    Provides an algebraic multigrid using a Krylov cycle.

    \n-
    Author
    Markus Blatt
    \n+

    Functionality for redistributing a sparse matrix.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,33 +1,80 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-kamg.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Provides an algebraic multigrid using a Krylov cycle. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n-#include \"_\ba_\bm_\bg_\b._\bh_\bh\"\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+matrixredistribute.hh File Reference\n+Functionality for redistributing a sparse matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \"_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\b _\bA_\bM_\bG_\b _\b>\n-\u00a0 Two grid operator for _\bA_\bM_\bG with Krylov cycle. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b _\b>\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bS_\b,_\b _\bP_\bI_\b,_\b _\bK_\b,_\b _\bA_\b _\b>\n-\u00a0 an algebraic multigrid method using a Krylov-cycle. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b<_\b _\bM_\b,_\b _\bR_\bI_\b _\b>\n+\u00a0 Utility class to communicate and set the row sizes of a redistributed\n+ matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>\n+\u00a0 Utility class to communicate and build the sparsity pattern of a\n+ redistributed matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>\n+\u00a0 Utility class for comunicating the matrix entries. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bI_\b,_\b _\bR_\bI_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bI_\b,_\b _\bR_\bI_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bI_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bI_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn (M &origMatrix, M &newMatrix, C\n+ &origComm, C &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< C > &ri)\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs (M &origMatrix, M &newMatrix, C\n+ &origComm, C &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< C > &ri)\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx (M &origMatrix, M &newMatrix, C &origComm, C\n+ &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< C > &ri)\n+\u00a0 Redistribute a matrix according to given domain decompositions.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs (M &origMatrix, M &newMatrix, _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:\n+ _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn &origComm, _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+ &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn >\n+ &ri)\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx (M &origMatrix, M &newMatrix, _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:\n+ _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn &origComm, _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+ &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn >\n+ &ri)\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides an algebraic multigrid using a Krylov cycle.\n+Functionality for redistributing a sparse matrix.\n Author\n Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00140_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00140_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: kamg.hh Source File\n+dune-istl: matrixredistribute.hh Source File\n \n \n \n \n \n \n \n@@ -70,336 +70,1000 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    kamg.hh
    \n+
    matrixredistribute.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_KAMG_HH
    \n-
    6#define DUNE_AMG_KAMG_HH
    \n-
    7
    \n-\n-
    9#include "amg.hh"
    \n-
    10
    \n-
    11namespace Dune
    \n-
    12{
    \n-
    13 namespace Amg
    \n-
    14 {
    \n-
    15
    \n-
    30 template<class AMG>
    \n-
    \n-\n-
    32 : public Preconditioner<typename AMG::Domain,typename AMG::Range>
    \n-
    33 {
    \n-
    35 typedef typename AMG::Domain Domain;
    \n-
    37 typedef typename AMG::Range Range;
    \n-
    38 public:
    \n-
    39
    \n+
    5#ifndef DUNE_ISTL_MATRIXREDISTRIBUTE_HH
    \n+
    6#define DUNE_ISTL_MATRIXREDISTRIBUTE_HH
    \n+
    7#include <memory>
    \n+
    8#include "repartition.hh"
    \n+
    9#include <dune/common/exceptions.hh>
    \n+
    10#include <dune/common/parallel/indexset.hh>
    \n+\n+\n+
    18namespace Dune
    \n+
    19{
    \n+
    20 template<typename T>
    \n+
    \n+\n+
    22 {
    \n+
    \n+
    23 bool isSetup() const
    \n+
    24 {
    \n+
    25 return false;
    \n+
    26 }
    \n+
    \n+
    27 template<class D>
    \n+
    \n+
    28 void redistribute([[maybe_unused]] const D& from, [[maybe_unused]] D& to) const
    \n+
    29 {}
    \n+
    \n+
    30
    \n+
    31 template<class D>
    \n+
    \n+
    32 void redistributeBackward([[maybe_unused]] D& from, [[maybe_unused]]const D& to) const
    \n+
    33 {}
    \n+
    \n+
    34
    \n+
    \n+\n+
    36 {}
    \n+
    \n+
    37
    \n+
    \n+
    38 void setNoRows([[maybe_unused]] std::size_t size)
    \n+
    39 {}
    \n+
    \n+
    40
    \n
    \n-\n-
    42 {
    \n-
    43 return amg_.category();
    \n-
    44 };
    \n-
    \n-
    45
    \n-
    \n-\n-
    54 : amg_(amg), coarseSolver_(coarseSolver)
    \n-
    55 {}
    \n+
    41 void setNoCopyRows([[maybe_unused]] std::size_t size)
    \n+
    42 {}
    \n+
    \n+
    43
    \n+
    \n+
    44 void setNoBackwardsCopyRows([[maybe_unused]] std::size_t size)
    \n+
    45 {}
    \n+
    \n+
    46
    \n+
    \n+
    47 std::size_t getRowSize([[maybe_unused]] std::size_t index) const
    \n+
    48 {
    \n+
    49 return -1;
    \n+
    50 }
    \n+
    \n+
    51
    \n+
    \n+
    52 std::size_t getCopyRowSize([[maybe_unused]] std::size_t index) const
    \n+
    53 {
    \n+
    54 return -1;
    \n+
    55 }
    \n
    \n
    56
    \n-
    \n-
    58 void pre([[maybe_unused]] typename AMG::Domain& x, [[maybe_unused]] typename AMG::Range& b)
    \n-
    59 {}
    \n-
    \n-
    60
    \n-
    \n-
    62 void post([[maybe_unused]] typename AMG::Domain& x)
    \n-
    63 {}
    \n-
    \n-
    64
    \n-
    \n-
    66 void apply(typename AMG::Domain& v, const typename AMG::Range& d)
    \n-
    67 {
    \n-
    68 // Copy data
    \n-
    69 *levelContext_->update=0;
    \n-
    70 *levelContext_->rhs = d;
    \n-
    71 *levelContext_->lhs = v;
    \n-
    72
    \n-
    73 presmooth(*levelContext_, amg_.preSteps_);
    \n-
    74 bool processFineLevel =
    \n-
    75 amg_.moveToCoarseLevel(*levelContext_);
    \n-
    76
    \n-
    77 if(processFineLevel) {
    \n-
    78 typename AMG::Range b=*levelContext_->rhs;
    \n-
    79 typename AMG::Domain x=*levelContext_->update;
    \n-\n-
    81 coarseSolver_->apply(x, b, res);
    \n-
    82 *levelContext_->update=x;
    \n-
    83 }
    \n-
    84
    \n-
    85 amg_.moveToFineLevel(*levelContext_, processFineLevel);
    \n-
    86
    \n-
    87 postsmooth(*levelContext_, amg_.postSteps_);
    \n-
    88 v=*levelContext_->update;
    \n-
    89 }
    \n-
    \n-
    90
    \n-
    \n-\n-
    96 {
    \n-
    97 return coarseSolver_;
    \n-
    98 }
    \n-
    \n-
    99
    \n-
    \n-
    104 void setLevelContext(std::shared_ptr<typename AMG::LevelContext> p)
    \n-
    105 {
    \n-
    106 levelContext_=p;
    \n-
    107 }
    \n-
    \n-
    108
    \n-
    \n-\n-
    111 {}
    \n-
    \n-
    112
    \n-
    113 private:
    \n-
    115 AMG& amg_;
    \n-
    117 std::shared_ptr<InverseOperator<Domain,Range> > coarseSolver_;
    \n-
    119 std::shared_ptr<typename AMG::LevelContext> levelContext_;
    \n-
    120 };
    \n-
    \n-
    121
    \n-
    122
    \n-
    123
    \n-
    137 template<class M, class X, class S, class PI=SequentialInformation,
    \n-
    138 class K=GeneralizedPCGSolver<X>, class A=std::allocator<X> >
    \n-
    \n-
    139 class KAMG : public Preconditioner<X,X>
    \n-
    140 {
    \n-
    141 public:
    \n-\n-
    145 typedef K KrylovSolver;
    \n-\n-\n-\n-\n-
    155 typedef typename Amg::Operator Operator;
    \n-
    157 typedef typename Amg::Domain Domain;
    \n-
    159 typedef typename Amg::Range Range;
    \n-\n-\n-
    164
    \n-
    \n-\n-
    167 {
    \n-
    168 return amg.category();
    \n-
    169 };
    \n-
    \n-
    170
    \n-
    182 KAMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
    \n-
    183 const SmootherArgs& smootherArgs, const Parameters& parms,
    \n-
    184 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1);
    \n-
    185
    \n-
    199 template<class C>
    \n-
    200 KAMG(const Operator& fineOperator, const C& criterion,
    \n-
    201 const SmootherArgs& smootherArgs=SmootherArgs(),
    \n-
    202 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1,
    \n-\n-
    204
    \n-
    206 void pre(Domain& x, Range& b);
    \n-
    208 void post(Domain& x);
    \n-
    210 void apply(Domain& v, const Range& d);
    \n-
    211
    \n-
    212 std::size_t maxlevels();
    \n-
    213
    \n-
    214 private:
    \n-
    216 Amg amg;
    \n-
    217
    \n-
    219 std::size_t maxLevelKrylovSteps;
    \n+
    \n+
    57 std::size_t getBackwardsCopyRowSize([[maybe_unused]] std::size_t index) const
    \n+
    58 {
    \n+
    59 return -1;
    \n+
    60 }
    \n+
    \n+
    61
    \n+
    62 };
    \n+
    \n+
    63
    \n+
    64#if HAVE_MPI
    \n+
    65 template<typename T, typename T1>
    \n+
    \n+\n+
    67 {
    \n+
    68 public:
    \n+\n+
    70
    \n+
    \n+\n+
    72 : interface(), setup_(false)
    \n+
    73 {}
    \n+
    \n+
    74
    \n+
    \n+\n+
    76 {
    \n+
    77 return interface;
    \n+
    78 }
    \n+
    \n+
    79 template<typename IS>
    \n+
    \n+
    80 void checkInterface(const IS& source,
    \n+
    81 const IS& target, MPI_Comm comm)
    \n+
    82 {
    \n+
    83 auto ri = std::make_unique<RemoteIndices<IS> >(source, target, comm);
    \n+
    84 ri->template rebuild<true>();
    \n+
    85 Interface inf;
    \n+\n+
    87 int rank;
    \n+
    88 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    \n+
    89 inf.free();
    \n+
    90 inf.build(*ri, flags, flags);
    \n+
    91
    \n+
    92
    \n+
    93#ifdef DEBUG_REPART
    \n+
    94 if(inf!=interface) {
    \n+
    95
    \n+
    96 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    \n+
    97 if(rank==0)
    \n+
    98 std::cout<<"Interfaces do not match!"<<std::endl;
    \n+
    99 std::cout<<rank<<": redist interface new :"<<inf<<std::endl;
    \n+
    100 std::cout<<rank<<": redist interface :"<<interface<<std::endl;
    \n+
    101
    \n+
    102 throw "autsch!";
    \n+
    103 }
    \n+
    104#endif
    \n+
    105 }
    \n+
    \n+
    \n+
    106 void setSetup()
    \n+
    107 {
    \n+
    108 setup_=true;
    \n+
    109 interface.strip();
    \n+
    110 }
    \n+
    \n+
    111
    \n+
    \n+\n+
    113 {
    \n+
    114 setup_=false;
    \n+
    115 }
    \n+
    \n+
    116
    \n+
    117 template<class GatherScatter, class D>
    \n+
    \n+
    118 void redistribute(const D& from, D& to) const
    \n+
    119 {
    \n+
    120 BufferedCommunicator communicator;
    \n+
    121 communicator.template build<D>(from,to, interface);
    \n+
    122 communicator.template forward<GatherScatter>(from, to);
    \n+
    123 communicator.free();
    \n+
    124 }
    \n+
    \n+
    125 template<class GatherScatter, class D>
    \n+
    \n+
    126 void redistributeBackward(D& from, const D& to) const
    \n+
    127 {
    \n+
    128
    \n+
    129 BufferedCommunicator communicator;
    \n+
    130 communicator.template build<D>(from,to, interface);
    \n+
    131 communicator.template backward<GatherScatter>(from, to);
    \n+
    132 communicator.free();
    \n+
    133 }
    \n+
    \n+
    134
    \n+
    135 template<class D>
    \n+
    \n+
    136 void redistribute(const D& from, D& to) const
    \n+
    137 {
    \n+
    138 redistribute<CopyGatherScatter<D> >(from,to);
    \n+
    139 }
    \n+
    \n+
    140 template<class D>
    \n+
    \n+
    141 void redistributeBackward(D& from, const D& to) const
    \n+
    142 {
    \n+
    143 redistributeBackward<CopyGatherScatter<D> >(from,to);
    \n+
    144 }
    \n+
    \n+
    \n+
    145 bool isSetup() const
    \n+
    146 {
    \n+
    147 return setup_;
    \n+
    148 }
    \n+
    \n+
    149
    \n+
    \n+
    150 void reserve(std::size_t size)
    \n+
    151 {}
    \n+
    \n+
    152
    \n+
    \n+
    153 std::size_t& getRowSize(std::size_t index)
    \n+
    154 {
    \n+
    155 return rowSize[index];
    \n+
    156 }
    \n+
    \n+
    157
    \n+
    \n+
    158 std::size_t getRowSize(std::size_t index) const
    \n+
    159 {
    \n+
    160 return rowSize[index];
    \n+
    161 }
    \n+
    \n+
    162
    \n+
    \n+
    163 std::size_t& getCopyRowSize(std::size_t index)
    \n+
    164 {
    \n+
    165 return copyrowSize[index];
    \n+
    166 }
    \n+
    \n+
    167
    \n+
    \n+
    168 std::size_t getCopyRowSize(std::size_t index) const
    \n+
    169 {
    \n+
    170 return copyrowSize[index];
    \n+
    171 }
    \n+
    \n+
    172
    \n+
    \n+
    173 std::size_t& getBackwardsCopyRowSize(std::size_t index)
    \n+
    174 {
    \n+
    175 return backwardscopyrowSize[index];
    \n+
    176 }
    \n+
    \n+
    177
    \n+
    \n+
    178 std::size_t getBackwardsCopyRowSize(std::size_t index) const
    \n+
    179 {
    \n+
    180 return backwardscopyrowSize[index];
    \n+
    181 }
    \n+
    \n+
    182
    \n+
    \n+
    183 void setNoRows(std::size_t rows)
    \n+
    184 {
    \n+
    185 rowSize.resize(rows, 0);
    \n+
    186 }
    \n+
    \n+
    187
    \n+
    \n+
    188 void setNoCopyRows(std::size_t rows)
    \n+
    189 {
    \n+
    190 copyrowSize.resize(rows, 0);
    \n+
    191 }
    \n+
    \n+
    192
    \n+
    \n+
    193 void setNoBackwardsCopyRows(std::size_t rows)
    \n+
    194 {
    \n+
    195 backwardscopyrowSize.resize(rows, 0);
    \n+
    196 }
    \n+
    \n+
    197
    \n+
    198 private:
    \n+
    199 std::vector<std::size_t> rowSize;
    \n+
    200 std::vector<std::size_t> copyrowSize;
    \n+
    201 std::vector<std::size_t> backwardscopyrowSize;
    \n+
    202 RedistributeInterface interface;
    \n+
    203 bool setup_;
    \n+
    204 };
    \n+
    \n+
    205
    \n+
    214 template<class M, class RI>
    \n+
    \n+\n+
    216 {
    \n+
    217 // Make the default communication policy work.
    \n+
    218 typedef typename M::size_type value_type;
    \n+
    219 typedef typename M::size_type size_type;
    \n
    220
    \n-
    222 double levelDefectReduction;
    \n-
    223
    \n-
    225 std::vector<std::shared_ptr<typename Amg::ScalarProduct> > scalarproducts;
    \n-
    226
    \n-
    228 std::vector<std::shared_ptr<KAmgTwoGrid<Amg> > > ksolvers;
    \n-
    229 };
    \n+
    \n+
    226 CommMatrixRowSize(const M& m_, RI& rowsize_)
    \n+
    227 : matrix(m_), rowsize(rowsize_)
    \n+
    228 {}
    \n
    \n-
    230
    \n+
    229 const M& matrix;
    \n+\n
    231
    \n-
    232 template<class M, class X, class S, class P, class K, class A>
    \n-
    \n-\n-
    234 const SmootherArgs& smootherArgs, const Parameters& params,
    \n-
    235 std::size_t ksteps, double reduction)
    \n-
    236 : amg(matrices, coarseSolver, smootherArgs, params),
    \n-
    237 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
    \n-
    238 {}
    \n-
    \n-
    239
    \n-
    240
    \n-
    241 template<class M, class X, class S, class P, class K, class A>
    \n-
    242 template<class C>
    \n-
    \n-
    243 KAMG<M,X,S,P,K,A>::KAMG(const Operator& fineOperator, const C& criterion,
    \n-
    244 const SmootherArgs& smootherArgs,
    \n-
    245 std::size_t ksteps, double reduction,
    \n-
    246 const ParallelInformation& pinfo)
    \n-
    247 : amg(fineOperator, criterion, smootherArgs, pinfo),
    \n-
    248 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
    \n-
    249 {}
    \n-
    \n-
    250
    \n-
    251
    \n-
    252 template<class M, class X, class S, class P, class K, class A>
    \n-
    \n-\n-
    254 {
    \n-
    255 amg.pre(x,b);
    \n-
    256 scalarproducts.reserve(amg.levels());
    \n-
    257 ksolvers.reserve(amg.levels());
    \n-
    258
    \n-
    259 typename OperatorHierarchy::ParallelMatrixHierarchy::Iterator
    \n-
    260 matrix = amg.matrices_->matrices().coarsest();
    \n-\n-
    262 pinfo = amg.matrices_->parallelInformation().coarsest();
    \n-
    263 bool hasCoarsest=(amg.levels()==amg.maxlevels());
    \n-
    264
    \n-
    265 if(hasCoarsest) {
    \n-
    266 if(matrix==amg.matrices_->matrices().finest())
    \n-
    267 return;
    \n-
    268 --matrix;
    \n-
    269 --pinfo;
    \n-
    270 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, amg.solver_)));
    \n-
    271 }else
    \n-
    272 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, std::shared_ptr<InverseOperator<Domain,Range> >())));
    \n-
    273
    \n-
    274 std::ostringstream s;
    \n-
    275
    \n-
    276 if(matrix!=amg.matrices_->matrices().finest())
    \n-
    277 while(true) {
    \n-
    278 scalarproducts.push_back(createScalarProduct<X>(*pinfo,category()));
    \n-
    279 std::shared_ptr<InverseOperator<Domain,Range> > ks =
    \n-
    280 std::shared_ptr<InverseOperator<Domain,Range> >(new KrylovSolver(*matrix, *(scalarproducts.back()),
    \n-
    281 *(ksolvers.back()), levelDefectReduction,
    \n-
    282 maxLevelKrylovSteps, 0));
    \n-
    283 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, ks)));
    \n-
    284 --matrix;
    \n-
    285 --pinfo;
    \n-
    286 if(matrix==amg.matrices_->matrices().finest())
    \n-
    287 break;
    \n-
    288 }
    \n-
    289 }
    \n-
    \n-
    290
    \n-
    291
    \n-
    292 template<class M, class X, class S, class P, class K, class A>
    \n-
    \n-\n-
    294 {
    \n-
    295 amg.post(x);
    \n-
    296
    \n-
    297 }
    \n+
    232 };
    \n
    \n+
    233
    \n+
    234
    \n+
    243 template<class M, class I>
    \n+
    \n+\n+
    245 {
    \n+
    246 typedef typename M::size_type size_type;
    \n+
    247
    \n+
    \n+
    254 CommMatrixSparsityPattern(const M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_)
    \n+
    255 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize()
    \n+
    256 {}
    \n+
    \n+
    257
    \n+
    \n+
    265 CommMatrixSparsityPattern(const M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_,
    \n+
    266 const std::vector<typename M::size_type>& rowsize_)
    \n+
    267 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), sparsity(aggidxset_.size()), rowsize(&rowsize_)
    \n+
    268 {}
    \n+
    \n+
    269
    \n+
    \n+\n+
    277 {
    \n+
    278 // insert diagonal to overlap rows
    \n+
    279 typedef typename Dune::GlobalLookupIndexSet<I>::const_iterator IIter;
    \n+\n+
    281 std::size_t nnz=0;
    \n+
    282#ifdef DEBUG_REPART
    \n+
    283 int rank;
    \n+
    284
    \n+
    285 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    \n+
    286#endif
    \n+
    287 for(IIter i= aggidxset.begin(), end=aggidxset.end(); i!=end; ++i) {
    \n+
    288 if(!OwnerSet::contains(i->local().attribute())) {
    \n+
    289#ifdef DEBUG_REPART
    \n+
    290 std::cout<<rank<<" Inserting diagonal for"<<i->local()<<std::endl;
    \n+
    291#endif
    \n+
    292 sparsity[i->local()].insert(i->local());
    \n+
    293 }
    \n+
    294
    \n+
    295 nnz+=sparsity[i->local()].size();
    \n+
    296 }
    \n+
    297 assert( aggidxset.size()==sparsity.size());
    \n
    298
    \n-
    299 template<class M, class X, class S, class P, class K, class A>
    \n-
    \n-\n-
    301 {
    \n-
    302 if(ksolvers.size()==0)
    \n-
    303 {
    \n-
    304 Range td=d;
    \n-\n-
    306 amg.solver_->apply(v,td,res);
    \n-
    307 }else
    \n-
    308 {
    \n-
    309 typedef typename Amg::LevelContext LevelContext;
    \n-
    310 std::shared_ptr<LevelContext> levelContext(new LevelContext);
    \n-
    311 amg.initIteratorsWithFineLevel(*levelContext);
    \n-
    312 typedef typename std::vector<std::shared_ptr<KAmgTwoGrid<Amg> > >::iterator Iter;
    \n-
    313 for(Iter solver=ksolvers.begin(); solver!=ksolvers.end(); ++solver)
    \n-
    314 (*solver)->setLevelContext(levelContext);
    \n-
    315 ksolvers.back()->apply(v,d);
    \n-
    316 }
    \n-
    317 }
    \n-
    \n-
    318
    \n-
    319 template<class M, class X, class S, class P, class K, class A>
    \n-
    \n-\n-
    321 {
    \n-
    322 return amg.maxlevels();
    \n-
    323 }
    \n-
    \n-
    324
    \n-
    326 } // Amg
    \n-
    327} // Dune
    \n-
    328
    \n+
    299 if(nnz>0) {
    \n+
    300 m.setSize(aggidxset.size(), aggidxset.size(), nnz);
    \n+
    301 m.setBuildMode(M::row_wise);
    \n+
    302 typename M::CreateIterator citer=m.createbegin();
    \n+
    303#ifdef DEBUG_REPART
    \n+
    304 std::size_t idx=0;
    \n+
    305 bool correct=true;
    \n+
    306 Dune::GlobalLookupIndexSet<I> global(aggidxset);
    \n+
    307#endif
    \n+
    308 typedef typename std::vector<std::set<size_type> >::const_iterator Iter;
    \n+
    309 for(Iter i=sparsity.begin(), end=sparsity.end(); i!=end; ++i, ++citer)
    \n+
    310 {
    \n+
    311 typedef typename std::set<size_type>::const_iterator SIter;
    \n+
    312 for(SIter si=i->begin(), send=i->end(); si!=send; ++si)
    \n+
    313 citer.insert(*si);
    \n+
    314#ifdef DEBUG_REPART
    \n+
    315 if(i->find(idx)==i->end()) {
    \n+
    316 const typename I::IndexPair* gi=global.pair(idx);
    \n+
    317 assert(gi);
    \n+
    318 std::cout<<rank<<": row "<<idx<<" is missing a diagonal entry! global="<<gi->global()<<" attr="<<gi->local().attribute()<<" "<<
    \n+
    319 OwnerSet::contains(gi->local().attribute())<<
    \n+
    320 " row size="<<i->size()<<std::endl;
    \n+
    321 correct=false;
    \n+
    322 }
    \n+
    323 ++idx;
    \n+
    324#endif
    \n+
    325 }
    \n+
    326#ifdef DEBUG_REPART
    \n+
    327 if(!correct)
    \n+
    328 throw "bla";
    \n
    329#endif
    \n-
    Define general preconditioner interface.
    \n-
    The AMG preconditioner.
    \n-
    void apply(Domain &v, const Range &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition kamg.hh:300
    \n-
    X Domain
    The domain type.
    Definition amg.hh:87
    \n-
    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
    \n-
    std::size_t maxlevels()
    Definition kamg.hh:320
    \n-
    SmootherTraits< Smoother >::Arguments SmootherArgs
    The argument type for the construction of the smoother.
    Definition amg.hh:100
    \n-
    M Operator
    The matrix operator type.
    Definition amg.hh:73
    \n-
    void post(Domain &x)
    Clean up.
    Definition kamg.hh:293
    \n-
    X Range
    The range type.
    Definition amg.hh:89
    \n-
    void presmooth(LevelContext &levelContext, size_t steps)
    Apply pre smoothing on the current level.
    Definition smoother.hh:406
    \n-
    void postsmooth(LevelContext &levelContext, size_t steps)
    Apply post smoothing on the current level.
    Definition smoother.hh:428
    \n-
    void pre(Domain &x, Range &b)
    Prepare the preconditioner.
    Definition kamg.hh:253
    \n-
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition amg.hh:194
    \n-
    PI ParallelInformation
    The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
    Definition amg.hh:80
    \n+
    330 }
    \n+
    331 }
    \n+
    \n+
    332
    \n+
    \n+
    340 void completeSparsityPattern(std::vector<std::set<size_type> > add_sparsity)
    \n+
    341 {
    \n+
    342 for (unsigned int i = 0; i != sparsity.size(); ++i) {
    \n+
    343 if (add_sparsity[i].size() != 0) {
    \n+
    344 typedef std::set<size_type> Set;
    \n+
    345 Set tmp_set;
    \n+
    346 std::insert_iterator<Set> tmp_insert (tmp_set, tmp_set.begin());
    \n+
    347 std::set_union(add_sparsity[i].begin(), add_sparsity[i].end(),
    \n+
    348 sparsity[i].begin(), sparsity[i].end(), tmp_insert);
    \n+
    349 sparsity[i].swap(tmp_set);
    \n+
    350 }
    \n+
    351 }
    \n+
    352 }
    \n+
    \n+
    353
    \n+
    354 const M& matrix;
    \n+
    355 typedef Dune::GlobalLookupIndexSet<I> LookupIndexSet;
    \n+
    356 const Dune::GlobalLookupIndexSet<I>& idxset;
    \n+
    357 const I& aggidxset;
    \n+
    358 std::vector<std::set<size_type> > sparsity;
    \n+
    359 const std::vector<size_type>* rowsize;
    \n+
    360 };
    \n+
    \n+
    361
    \n+
    362 template<class M, class I>
    \n+
    \n+
    363 struct CommPolicy<CommMatrixSparsityPattern<M,I> >
    \n+
    364 {
    \n+\n+
    366
    \n+
    371 typedef typename I::GlobalIndex IndexedType;
    \n+
    372
    \n+
    374 typedef VariableSize IndexedTypeFlag;
    \n+
    375
    \n+
    \n+
    376 static typename M::size_type getSize(const Type& t, std::size_t i)
    \n+
    377 {
    \n+
    378 if(!t.rowsize)
    \n+
    379 return t.matrix[i].size();
    \n+
    380 else
    \n+
    381 {
    \n+
    382 assert((*t.rowsize)[i]>0);
    \n+
    383 return (*t.rowsize)[i];
    \n+
    384 }
    \n+
    385 }
    \n+
    \n+
    386 };
    \n+
    \n+
    387
    \n+
    394 template<class M, class I>
    \n+
    \n+\n+
    396 {
    \n+
    \n+
    405 CommMatrixRow(M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_)
    \n+
    406 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize()
    \n+
    407 {}
    \n+
    \n+
    408
    \n+
    \n+
    412 CommMatrixRow(M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_,
    \n+
    413 std::vector<size_t>& rowsize_)
    \n+
    414 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize(&rowsize_)
    \n+
    415 {}
    \n+
    \n+
    \n+\n+
    422 {
    \n+
    423 typedef typename Dune::GlobalLookupIndexSet<I>::const_iterator Iter;
    \n+\n+
    425
    \n+
    426 for(Iter i= aggidxset.begin(), end=aggidxset.end(); i!=end; ++i)
    \n+
    427 if(!OwnerSet::contains(i->local().attribute())) {
    \n+
    428 // Set to Dirchlet
    \n+
    429 typedef typename M::ColIterator CIter;
    \n+
    430 for(CIter c=matrix[i->local()].begin(), cend= matrix[i->local()].end();
    \n+
    431 c!= cend; ++c)
    \n+
    432 {
    \n+
    433 *c=0;
    \n+
    434 if(c.index()==i->local()) {
    \n+
    435 auto setDiagonal = [](auto&& scalarOrMatrix, const auto& value) {
    \n+
    436 auto&& matrixView = Dune::Impl::asMatrix(scalarOrMatrix);
    \n+
    437 for (auto rowIt = matrixView.begin(); rowIt != matrixView.end(); ++rowIt)
    \n+
    438 (*rowIt)[rowIt.index()] = value;
    \n+
    439 };
    \n+
    440 setDiagonal(*c, 1);
    \n+
    441 }
    \n+
    442 }
    \n+
    443 }
    \n+
    444 }
    \n+
    \n+\n+
    448 const Dune::GlobalLookupIndexSet<I>& idxset;
    \n+
    450 const I& aggidxset;
    \n+
    452 std::vector<size_t>* rowsize; // row sizes differ from sender side in overlap!
    \n+
    453 };
    \n+
    \n+
    454
    \n+
    455 template<class M, class I>
    \n+
    \n+
    456 struct CommPolicy<CommMatrixRow<M,I> >
    \n+
    457 {
    \n+\n+
    459
    \n+
    464 typedef std::pair<typename I::GlobalIndex,typename M::block_type> IndexedType;
    \n+
    465
    \n+
    467 typedef VariableSize IndexedTypeFlag;
    \n+
    468
    \n+
    \n+
    469 static std::size_t getSize(const Type& t, std::size_t i)
    \n+
    470 {
    \n+
    471 if(!t.rowsize)
    \n+
    472 return t.matrix[i].size();
    \n+
    473 else
    \n+
    474 {
    \n+
    475 assert((*t.rowsize)[i]>0);
    \n+
    476 return (*t.rowsize)[i];
    \n+
    477 }
    \n+
    478 }
    \n+
    \n+
    479 };
    \n+
    \n+
    480
    \n+
    481 template<class M, class I, class RI>
    \n+
    \n+\n+
    483 {
    \n+\n+
    485
    \n+
    \n+
    486 static const typename M::size_type gather(const Container& cont, std::size_t i)
    \n+
    487 {
    \n+
    488 return cont.matrix[i].size();
    \n+
    489 }
    \n+
    \n+
    \n+
    490 static void scatter(Container& cont, const typename M::size_type& rowsize, std::size_t i)
    \n+
    491 {
    \n+
    492 assert(rowsize);
    \n+
    493 cont.rowsize.getRowSize(i)=rowsize;
    \n+
    494 }
    \n+
    \n+
    495
    \n+
    496 };
    \n+
    \n+
    497
    \n+
    498 template<class M, class I, class RI>
    \n+
    \n+\n+
    500 {
    \n+\n+
    502
    \n+
    \n+
    503 static const typename M::size_type gather(const Container& cont, std::size_t i)
    \n+
    504 {
    \n+
    505 return cont.matrix[i].size();
    \n+
    506 }
    \n+
    \n+
    \n+
    507 static void scatter(Container& cont, const typename M::size_type& rowsize, std::size_t i)
    \n+
    508 {
    \n+
    509 assert(rowsize);
    \n+
    510 if (rowsize > cont.rowsize.getCopyRowSize(i))
    \n+
    511 cont.rowsize.getCopyRowSize(i)=rowsize;
    \n+
    512 }
    \n+
    \n+
    513
    \n+
    514 };
    \n+
    \n+
    515
    \n+
    516 template<class M, class I>
    \n+
    \n+\n+
    518 {
    \n+
    519 typedef typename I::GlobalIndex GlobalIndex;
    \n+\n+
    521 typedef typename M::ConstColIterator ColIter;
    \n+
    522
    \n+
    523 static ColIter col;
    \n+\n+
    525
    \n+
    \n+
    526 static const GlobalIndex& gather(const Container& cont, std::size_t i, std::size_t j)
    \n+
    527 {
    \n+
    528 if(j==0)
    \n+
    529 col=cont.matrix[i].begin();
    \n+
    530 else if (col!=cont.matrix[i].end())
    \n+
    531 ++col;
    \n+
    532
    \n+
    533 //copy communication: different row sizes for copy rows with the same global index
    \n+
    534 //are possible. If all values of current matrix row are sent, send
    \n+
    535 //std::numeric_limits<GlobalIndex>::max()
    \n+
    536 //and receiver will ignore it.
    \n+
    537 if (col==cont.matrix[i].end()) {
    \n+
    538 numlimits = std::numeric_limits<GlobalIndex>::max();
    \n+
    539 return numlimits;
    \n+
    540 }
    \n+
    541 else {
    \n+
    542 const typename I::IndexPair* index=cont.idxset.pair(col.index());
    \n+
    543 assert(index);
    \n+
    544 // Only send index if col is no ghost
    \n+
    545 if ( index->local().attribute() != 2)
    \n+
    546 return index->global();
    \n+
    547 else {
    \n+
    548 numlimits = std::numeric_limits<GlobalIndex>::max();
    \n+
    549 return numlimits;
    \n+
    550 }
    \n+
    551 }
    \n+
    552 }
    \n+
    \n+
    \n+
    553 static void scatter(Container& cont, const GlobalIndex& gi, std::size_t i, [[maybe_unused]] std::size_t j)
    \n+
    554 {
    \n+
    555 try{
    \n+
    556 if (gi != std::numeric_limits<GlobalIndex>::max()) {
    \n+
    557 const typename I::IndexPair& ip=cont.aggidxset.at(gi);
    \n+
    558 assert(ip.global()==gi);
    \n+
    559 std::size_t column = ip.local();
    \n+
    560 cont.sparsity[i].insert(column);
    \n+
    561
    \n+\n+
    563 if(!OwnerSet::contains(ip.local().attribute()))
    \n+
    564 // preserve symmetry for overlap
    \n+
    565 cont.sparsity[column].insert(i);
    \n+
    566 }
    \n+
    567 }
    \n+
    568 catch(const Dune::RangeError&) {
    \n+
    569 // Entry not present in the new index set. Ignore!
    \n+
    570#ifdef DEBUG_REPART
    \n+
    571 typedef typename Container::LookupIndexSet GlobalLookup;
    \n+
    572 typedef typename GlobalLookup::IndexPair IndexPair;
    \n+\n+
    574
    \n+
    575 GlobalLookup lookup(cont.aggidxset);
    \n+
    576 const IndexPair* pi=lookup.pair(i);
    \n+
    577 assert(pi);
    \n+
    578 if(OwnerSet::contains(pi->local().attribute())) {
    \n+
    579 int rank;
    \n+
    580 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    \n+
    581 std::cout<<rank<<cont.aggidxset<<std::endl;
    \n+
    582 std::cout<<rank<<": row "<<i<<" (global="<<gi <<") not in index set for owner index "<<pi->global()<<std::endl;
    \n+
    583 throw;
    \n+
    584 }
    \n+
    585#endif
    \n+
    586 }
    \n+
    587 }
    \n+
    \n+
    588
    \n+
    589 };
    \n+
    \n+
    590 template<class M, class I>
    \n+\n+
    592
    \n+
    593 template<class M, class I>
    \n+\n+
    595
    \n+
    596
    \n+
    597 template<class M, class I>
    \n+
    \n+\n+
    599 {
    \n+
    600 typedef typename I::GlobalIndex GlobalIndex;
    \n+\n+
    602 typedef typename M::ConstColIterator ColIter;
    \n+
    603 typedef typename std::pair<GlobalIndex,typename M::block_type> Data;
    \n+
    604 static ColIter col;
    \n+\n+\n+
    607
    \n+
    \n+
    608 static const Data& gather(const Container& cont, std::size_t i, std::size_t j)
    \n+
    609 {
    \n+
    610 if(j==0)
    \n+
    611 col=cont.matrix[i].begin();
    \n+
    612 else if (col!=cont.matrix[i].end())
    \n+
    613 ++col;
    \n+
    614 // copy communication: different row sizes for copy rows with the same global index
    \n+
    615 // are possible. If all values of current matrix row are sent, send
    \n+
    616 // std::numeric_limits<GlobalIndex>::max()
    \n+
    617 // and receiver will ignore it.
    \n+
    618 if (col==cont.matrix[i].end()) {
    \n+
    619 numlimits = std::numeric_limits<GlobalIndex>::max();
    \n+\n+
    621 return datastore;
    \n+
    622 }
    \n+
    623 else {
    \n+
    624 // convert local column index to global index
    \n+
    625 const typename I::IndexPair* index=cont.idxset.pair(col.index());
    \n+
    626 assert(index);
    \n+
    627 // Store the data to prevent reference to temporary
    \n+
    628 // Only send index if col is no ghost
    \n+
    629 if ( index->local().attribute() != 2)
    \n+
    630 datastore = Data(index->global(),*col);
    \n+
    631 else {
    \n+
    632 numlimits = std::numeric_limits<GlobalIndex>::max();
    \n+\n+
    634 }
    \n+
    635 return datastore;
    \n+
    636 }
    \n+
    637 }
    \n+
    \n+
    \n+
    638 static void scatter(Container& cont, const Data& data, std::size_t i, [[maybe_unused]] std::size_t j)
    \n+
    639 {
    \n+
    640 try{
    \n+
    641 if (data.first != std::numeric_limits<GlobalIndex>::max()) {
    \n+
    642 typename M::size_type column=cont.aggidxset.at(data.first).local();
    \n+
    643 cont.matrix[i][column]=data.second;
    \n+
    644 }
    \n+
    645 }
    \n+
    646 catch(const Dune::RangeError&) {
    \n+
    647 // This an overlap row and might therefore lack some entries!
    \n+
    648 }
    \n+
    649
    \n+
    650 }
    \n+
    \n+
    651 };
    \n+
    \n+
    652
    \n+
    653 template<class M, class I>
    \n+\n+
    655
    \n+
    656 template<class M, class I>
    \n+\n+
    658
    \n+
    659 template<class M, class I>
    \n+\n+
    661
    \n+
    662 template<typename M, typename C>
    \n+
    \n+
    663 void redistributeSparsityPattern(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
    \n+\n+
    665 {
    \n+
    666 typename C::CopySet copyflags;
    \n+
    667 typename C::OwnerSet ownerflags;
    \n+
    668 typedef typename C::ParallelIndexSet IndexSet;
    \n+\n+
    670 std::vector<typename M::size_type> rowsize(newComm.indexSet().size(), 0);
    \n+
    671 std::vector<typename M::size_type> copyrowsize(newComm.indexSet().size(), 0);
    \n+
    672 std::vector<typename M::size_type> backwardscopyrowsize(origComm.indexSet().size(), 0);
    \n+
    673
    \n+
    674 // get owner rowsizes
    \n+
    675 CommMatrixRowSize<M,RI> commRowSize(origMatrix, ri);
    \n+
    676 ri.template redistribute<MatrixRowSizeGatherScatter<M,IndexSet,RI> >(commRowSize,commRowSize);
    \n+
    677
    \n+
    678 origComm.buildGlobalLookup();
    \n+
    679
    \n+
    680 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
    \n+
    681 rowsize[i] = ri.getRowSize(i);
    \n+
    682 }
    \n+
    683 // get sparsity pattern from owner rows
    \n+\n+
    685 origsp(origMatrix, origComm.globalLookup(), newComm.indexSet());
    \n+\n+
    687 newsp(origMatrix, origComm.globalLookup(), newComm.indexSet(), rowsize);
    \n+
    688
    \n+
    689 ri.template redistribute<MatrixSparsityPatternGatherScatter<M,IndexSet> >(origsp,newsp);
    \n+
    690
    \n+
    691 // build copy to owner interface to get missing matrix values for novlp case
    \n+\n+
    693 RemoteIndices<IndexSet> *ris = new RemoteIndices<IndexSet>(origComm.indexSet(),
    \n+
    694 newComm.indexSet(),
    \n+
    695 origComm.communicator());
    \n+
    696 ris->template rebuild<true>();
    \n+
    697
    \n+
    698 ri.getInterface().free();
    \n+
    699 ri.getInterface().build(*ris,copyflags,ownerflags);
    \n+
    700
    \n+
    701 // get copy rowsizes
    \n+
    702 CommMatrixRowSize<M,RI> commRowSize_copy(origMatrix, ri);
    \n+
    703 ri.template redistribute<MatrixCopyRowSizeGatherScatter<M,IndexSet,RI> >(commRowSize_copy,
    \n+
    704 commRowSize_copy);
    \n+
    705
    \n+
    706 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
    \n+
    707 copyrowsize[i] = ri.getCopyRowSize(i);
    \n+
    708 }
    \n+
    709 //get copy rowsizes for sender
    \n+
    710 ri.redistributeBackward(backwardscopyrowsize,copyrowsize);
    \n+
    711 for (std::size_t i=0; i < origComm.indexSet().size(); i++) {
    \n+
    712 ri.getBackwardsCopyRowSize(i) = backwardscopyrowsize[i];
    \n+
    713 }
    \n+
    714
    \n+
    715 // get sparsity pattern from copy rows
    \n+
    716 CommMatrixSparsityPattern<M,IndexSet> origsp_copy(origMatrix,
    \n+
    717 origComm.globalLookup(),
    \n+
    718 newComm.indexSet(),
    \n+
    719 backwardscopyrowsize);
    \n+
    720 CommMatrixSparsityPattern<M,IndexSet> newsp_copy(origMatrix, origComm.globalLookup(),
    \n+
    721 newComm.indexSet(), copyrowsize);
    \n+
    722 ri.template redistribute<MatrixSparsityPatternGatherScatter<M,IndexSet> >(origsp_copy,
    \n+
    723 newsp_copy);
    \n+
    724
    \n+
    725 newsp.completeSparsityPattern(newsp_copy.sparsity);
    \n+
    726 newsp.storeSparsityPattern(newMatrix);
    \n+
    727 }
    \n+
    728 else
    \n+
    729 newsp.storeSparsityPattern(newMatrix);
    \n+
    730
    \n+
    731#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    732 // Check for symmetry
    \n+
    733 int ret=0;
    \n+
    734 typedef typename M::ConstRowIterator RIter;
    \n+
    735 for(RIter row=newMatrix.begin(), rend=newMatrix.end(); row != rend; ++row) {
    \n+
    736 typedef typename M::ConstColIterator CIter;
    \n+
    737 for(CIter col=row->begin(), cend=row->end(); col!=cend; ++col)
    \n+
    738 {
    \n+
    739 try{
    \n+
    740 newMatrix[col.index()][row.index()];
    \n+
    741 }catch(const Dune::ISTLError&) {
    \n+
    742 std::cerr<<newComm.communicator().rank()<<": entry ("
    \n+
    743 <<col.index()<<","<<row.index()<<") missing! for symmetry!"<<std::endl;
    \n+
    744 ret=1;
    \n+
    745
    \n+
    746 }
    \n+
    747
    \n+
    748 }
    \n+
    749 }
    \n+
    750
    \n+
    751 if(ret)
    \n+
    752 DUNE_THROW(ISTLError, "Matrix not symmetric!");
    \n+
    753#endif
    \n+
    754 }
    \n+
    \n+
    755
    \n+
    756 template<typename M, typename C>
    \n+
    \n+
    757 void redistributeMatrixEntries(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
    \n+\n+
    759 {
    \n+
    760 typedef typename C::ParallelIndexSet IndexSet;
    \n+
    761 typename C::OwnerSet ownerflags;
    \n+
    762 std::vector<typename M::size_type> rowsize(newComm.indexSet().size(), 0);
    \n+
    763 std::vector<typename M::size_type> copyrowsize(newComm.indexSet().size(), 0);
    \n+
    764 std::vector<typename M::size_type> backwardscopyrowsize(origComm.indexSet().size(), 0);
    \n+
    765
    \n+
    766 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
    \n+
    767 rowsize[i] = ri.getRowSize(i);
    \n+\n+
    769 copyrowsize[i] = ri.getCopyRowSize(i);
    \n+
    770 }
    \n+
    771 }
    \n+
    772
    \n+
    773 for (std::size_t i=0; i < origComm.indexSet().size(); i++)
    \n+\n+
    775 backwardscopyrowsize[i] = ri.getBackwardsCopyRowSize(i);
    \n+
    776
    \n+
    777
    \n+\n+
    779 // fill sparsity pattern from copy rows
    \n+
    780 CommMatrixRow<M,IndexSet> origrow_copy(origMatrix, origComm.globalLookup(),
    \n+
    781 newComm.indexSet(), backwardscopyrowsize);
    \n+
    782 CommMatrixRow<M,IndexSet> newrow_copy(newMatrix, origComm.globalLookup(),
    \n+
    783 newComm.indexSet(),copyrowsize);
    \n+
    784 ri.template redistribute<MatrixRowGatherScatter<M,IndexSet> >(origrow_copy,
    \n+
    785 newrow_copy);
    \n+
    786 ri.getInterface().free();
    \n+
    787 RemoteIndices<IndexSet> *ris = new RemoteIndices<IndexSet>(origComm.indexSet(),
    \n+
    788 newComm.indexSet(),
    \n+
    789 origComm.communicator());
    \n+
    790 ris->template rebuild<true>();
    \n+
    791 ri.getInterface().build(*ris,ownerflags,ownerflags);
    \n+
    792 }
    \n+
    793
    \n+\n+
    795 origrow(origMatrix, origComm.globalLookup(), newComm.indexSet());
    \n+\n+
    797 newrow(newMatrix, origComm.globalLookup(), newComm.indexSet(),rowsize);
    \n+
    798 ri.template redistribute<MatrixRowGatherScatter<M,IndexSet> >(origrow,newrow);
    \n+
    799 if (SolverCategory::category(origComm) != static_cast<int>(SolverCategory::nonoverlapping))
    \n+\n+
    801 }
    \n+
    \n+
    802
    \n+
    819 template<typename M, typename C>
    \n+
    \n+
    820 void redistributeMatrix(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
    \n+\n+
    822 {
    \n+
    823 ri.setNoRows(newComm.indexSet().size());
    \n+
    824 ri.setNoCopyRows(newComm.indexSet().size());
    \n+
    825 ri.setNoBackwardsCopyRows(origComm.indexSet().size());
    \n+
    826 redistributeSparsityPattern(origMatrix, newMatrix, origComm, newComm, ri);
    \n+
    827 redistributeMatrixEntries(origMatrix, newMatrix, origComm, newComm, ri);
    \n+
    828 }
    \n+
    \n+
    829#endif
    \n+
    830
    \n+
    831template<typename M>
    \n+
    \n+
    832 void redistributeMatrixEntries(M& origMatrix, M& newMatrix,
    \n+\n+\n+\n+
    836 {
    \n+
    837 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential program!");
    \n+
    838 }
    \n+
    \n+
    839 template<typename M>
    \n+
    \n+
    840 void redistributeMatrix(M& origMatrix, M& newMatrix,
    \n+\n+\n+\n+
    844 {
    \n+
    845 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential program!");
    \n+
    846 }
    \n+
    \n+
    847}
    \n+
    848#endif
    \n+
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n+
    Functionality for redistributing a parallel index set using graph partitioning.
    \n+\n+
    Col col
    Definition matrixmatrix.hh:351
    \n
    Definition allocator.hh:11
    \n-
    an algebraic multigrid method using a Krylov-cycle.
    Definition kamg.hh:140
    \n-
    Amg::Domain Domain
    the type of the domain.
    Definition kamg.hh:157
    \n-
    Amg::SmootherArgs SmootherArgs
    The type of the arguments for construction of the smoothers.
    Definition kamg.hh:153
    \n-
    Amg::ParallelInformation ParallelInformation
    the type of the parallelinformation to use.
    Definition kamg.hh:151
    \n-
    Amg::CoarseSolver CoarseSolver
    The type of the coarse solver.
    Definition kamg.hh:149
    \n-
    Amg::OperatorHierarchy OperatorHierarchy
    The type of the hierarchy of operators.
    Definition kamg.hh:147
    \n-
    Amg::Range Range
    The type of the range.
    Definition kamg.hh:159
    \n-
    Amg::ScalarProduct ScalarProduct
    The type of the scalar product.
    Definition kamg.hh:163
    \n-
    AMG< M, X, S, PI, A > Amg
    The type of the underlying AMG.
    Definition kamg.hh:143
    \n-
    Amg::Operator Operator
    the type of the lineatr operator.
    Definition kamg.hh:155
    \n-
    Amg::ParallelInformationHierarchy ParallelInformationHierarchy
    The type of the hierarchy of parallel information.
    Definition kamg.hh:161
    \n-
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition kamg.hh:166
    \n-
    K KrylovSolver
    The type of the Krylov solver for the cycle.
    Definition kamg.hh:145
    \n-
    Two grid operator for AMG with Krylov cycle.
    Definition kamg.hh:33
    \n-
    void pre(typename AMG::Domain &x, typename AMG::Range &b)
    Prepare the preconditioner.
    Definition kamg.hh:58
    \n-
    KAmgTwoGrid(AMG &amg, std::shared_ptr< InverseOperator< Domain, Range > > coarseSolver)
    Constructor.
    Definition kamg.hh:53
    \n-
    ~KAmgTwoGrid()
    Destructor.
    Definition kamg.hh:110
    \n-
    void post(typename AMG::Domain &x)
    Clean up.
    Definition kamg.hh:62
    \n-
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition kamg.hh:41
    \n-
    void setLevelContext(std::shared_ptr< typename AMG::LevelContext > p)
    Set the level context pointer.
    Definition kamg.hh:104
    \n-
    InverseOperator< Domain, Range > * coarseSolver()
    Get a pointer to the coarse grid solver.
    Definition kamg.hh:95
    \n-
    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
    \n-
    Parallel algebraic multigrid based on agglomeration.
    Definition amg.hh:65
    \n-\n-
    LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
    Type of the mutable iterator.
    Definition hierarchy.hh:216
    \n-
    The hierarchies build by the coarsening process.
    Definition matrixhierarchy.hh:61
    \n-
    All parameters for AMG.
    Definition parameters.hh:416
    \n-
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n-
    Base class for scalar product and norm computation.
    Definition scalarproducts.hh:52
    \n-
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n-
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    Generalized preconditioned conjugate gradient solver.
    Definition solvers.hh:1307
    \n+
    void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
    Definition matrixredistribute.hh:757
    \n+
    void redistributeSparsityPattern(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
    Definition matrixredistribute.hh:663
    \n+
    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
    \n+
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    Definition matrixredistribute.hh:22
    \n+
    void setNoBackwardsCopyRows(std::size_t size)
    Definition matrixredistribute.hh:44
    \n+
    void redistribute(const D &from, D &to) const
    Definition matrixredistribute.hh:28
    \n+
    void resetSetup()
    Definition matrixredistribute.hh:35
    \n+
    void setNoCopyRows(std::size_t size)
    Definition matrixredistribute.hh:41
    \n+
    bool isSetup() const
    Definition matrixredistribute.hh:23
    \n+
    void setNoRows(std::size_t size)
    Definition matrixredistribute.hh:38
    \n+
    void redistributeBackward(D &from, const D &to) const
    Definition matrixredistribute.hh:32
    \n+
    std::size_t getBackwardsCopyRowSize(std::size_t index) const
    Definition matrixredistribute.hh:57
    \n+
    std::size_t getRowSize(std::size_t index) const
    Definition matrixredistribute.hh:47
    \n+
    std::size_t getCopyRowSize(std::size_t index) const
    Definition matrixredistribute.hh:52
    \n+
    std::size_t getRowSize(std::size_t index) const
    Definition matrixredistribute.hh:158
    \n+
    std::size_t & getBackwardsCopyRowSize(std::size_t index)
    Definition matrixredistribute.hh:173
    \n+
    RedistributeInterface & getInterface()
    Definition matrixredistribute.hh:75
    \n+
    void redistribute(const D &from, D &to) const
    Definition matrixredistribute.hh:136
    \n+
    void setNoBackwardsCopyRows(std::size_t rows)
    Definition matrixredistribute.hh:193
    \n+
    std::size_t & getCopyRowSize(std::size_t index)
    Definition matrixredistribute.hh:163
    \n+\n+
    std::size_t getCopyRowSize(std::size_t index) const
    Definition matrixredistribute.hh:168
    \n+
    void setNoRows(std::size_t rows)
    Definition matrixredistribute.hh:183
    \n+
    void reserve(std::size_t size)
    Definition matrixredistribute.hh:150
    \n+
    OwnerOverlapCopyCommunication< T, T1 > Comm
    Definition matrixredistribute.hh:69
    \n+
    void setNoCopyRows(std::size_t rows)
    Definition matrixredistribute.hh:188
    \n+
    void redistributeBackward(D &from, const D &to) const
    Definition matrixredistribute.hh:141
    \n+\n+
    std::size_t getBackwardsCopyRowSize(std::size_t index) const
    Definition matrixredistribute.hh:178
    \n+
    void redistribute(const D &from, D &to) const
    Definition matrixredistribute.hh:118
    \n+\n+
    void redistributeBackward(D &from, const D &to) const
    Definition matrixredistribute.hh:126
    \n+
    void checkInterface(const IS &source, const IS &target, MPI_Comm comm)
    Definition matrixredistribute.hh:80
    \n+
    bool isSetup() const
    Definition matrixredistribute.hh:145
    \n+
    std::size_t & getRowSize(std::size_t index)
    Definition matrixredistribute.hh:153
    \n+
    Utility class to communicate and set the row sizes of a redistributed matrix.
    Definition matrixredistribute.hh:216
    \n+
    M::size_type size_type
    Definition matrixredistribute.hh:219
    \n+
    M::size_type value_type
    Definition matrixredistribute.hh:218
    \n+
    RI & rowsize
    Definition matrixredistribute.hh:230
    \n+
    const M & matrix
    Definition matrixredistribute.hh:229
    \n+
    CommMatrixRowSize(const M &m_, RI &rowsize_)
    Constructor.
    Definition matrixredistribute.hh:226
    \n+
    Utility class to communicate and build the sparsity pattern of a redistributed matrix.
    Definition matrixredistribute.hh:245
    \n+
    M::size_type size_type
    Definition matrixredistribute.hh:246
    \n+
    const Dune::GlobalLookupIndexSet< I > & idxset
    Definition matrixredistribute.hh:356
    \n+
    void storeSparsityPattern(M &m)
    Creates and stores the sparsity pattern of the redistributed matrix.
    Definition matrixredistribute.hh:276
    \n+
    const I & aggidxset
    Definition matrixredistribute.hh:357
    \n+
    const std::vector< size_type > * rowsize
    Definition matrixredistribute.hh:359
    \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...
    Definition matrixredistribute.hh:340
    \n+
    CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_)
    Constructor for the original side.
    Definition matrixredistribute.hh:254
    \n+
    const M & matrix
    Definition matrixredistribute.hh:354
    \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.
    Definition matrixredistribute.hh:265
    \n+
    std::vector< std::set< size_type > > sparsity
    Definition matrixredistribute.hh:358
    \n+
    Dune::GlobalLookupIndexSet< I > LookupIndexSet
    Definition matrixredistribute.hh:355
    \n+
    static M::size_type getSize(const Type &t, std::size_t i)
    Definition matrixredistribute.hh:376
    \n+
    CommMatrixSparsityPattern< M, I > Type
    Definition matrixredistribute.hh:365
    \n+
    I::GlobalIndex IndexedType
    The indexed type we send. This is the global index indentitfying the column.
    Definition matrixredistribute.hh:371
    \n+
    VariableSize IndexedTypeFlag
    Each row varies in size.
    Definition matrixredistribute.hh:374
    \n+
    Utility class for comunicating the matrix entries.
    Definition matrixredistribute.hh:396
    \n+
    std::vector< size_t > * rowsize
    row size information for the receiving side.
    Definition matrixredistribute.hh:452
    \n+
    M & matrix
    The matrix to communicate the values of.
    Definition matrixredistribute.hh:446
    \n+
    CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_, std::vector< size_t > &rowsize_)
    Constructor.
    Definition matrixredistribute.hh:412
    \n+
    const Dune::GlobalLookupIndexSet< I > & idxset
    Index set for the original matrix.
    Definition matrixredistribute.hh:448
    \n+
    void setOverlapRowsToDirichlet()
    Sets the non-owner rows correctly as Dirichlet boundaries.
    Definition matrixredistribute.hh:421
    \n+
    const I & aggidxset
    Index set for the redistributed matrix.
    Definition matrixredistribute.hh:450
    \n+
    CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_)
    Constructor.
    Definition matrixredistribute.hh:405
    \n+
    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
    \n+
    CommMatrixRow< M, I > Type
    Definition matrixredistribute.hh:458
    \n+
    static std::size_t getSize(const Type &t, std::size_t i)
    Definition matrixredistribute.hh:469
    \n+
    VariableSize IndexedTypeFlag
    Each row varies in size.
    Definition matrixredistribute.hh:467
    \n+
    Definition matrixredistribute.hh:483
    \n+
    static void scatter(Container &cont, const typename M::size_type &rowsize, std::size_t i)
    Definition matrixredistribute.hh:490
    \n+
    static const M::size_type gather(const Container &cont, std::size_t i)
    Definition matrixredistribute.hh:486
    \n+
    CommMatrixRowSize< M, RI > Container
    Definition matrixredistribute.hh:484
    \n+
    Definition matrixredistribute.hh:500
    \n+
    static const M::size_type gather(const Container &cont, std::size_t i)
    Definition matrixredistribute.hh:503
    \n+
    static void scatter(Container &cont, const typename M::size_type &rowsize, std::size_t i)
    Definition matrixredistribute.hh:507
    \n+
    CommMatrixRowSize< M, RI > Container
    Definition matrixredistribute.hh:501
    \n+
    Definition matrixredistribute.hh:518
    \n+
    M::ConstColIterator ColIter
    Definition matrixredistribute.hh:521
    \n+
    static void scatter(Container &cont, const GlobalIndex &gi, std::size_t i, std::size_t j)
    Definition matrixredistribute.hh:553
    \n+
    CommMatrixSparsityPattern< M, I > Container
    Definition matrixredistribute.hh:520
    \n+
    static GlobalIndex numlimits
    Definition matrixredistribute.hh:524
    \n+
    static ColIter col
    Definition matrixredistribute.hh:523
    \n+
    I::GlobalIndex GlobalIndex
    Definition matrixredistribute.hh:519
    \n+
    static const GlobalIndex & gather(const Container &cont, std::size_t i, std::size_t j)
    Definition matrixredistribute.hh:526
    \n+
    Definition matrixredistribute.hh:599
    \n+
    I::GlobalIndex GlobalIndex
    Definition matrixredistribute.hh:600
    \n+
    static Data datastore
    Definition matrixredistribute.hh:605
    \n+
    static GlobalIndex numlimits
    Definition matrixredistribute.hh:606
    \n+
    M::ConstColIterator ColIter
    Definition matrixredistribute.hh:602
    \n+
    static const Data & gather(const Container &cont, std::size_t i, std::size_t j)
    Definition matrixredistribute.hh:608
    \n+
    std::pair< GlobalIndex, typename M::block_type > Data
    Definition matrixredistribute.hh:603
    \n+
    static void scatter(Container &cont, const Data &data, std::size_t i, std::size_t j)
    Definition matrixredistribute.hh:638
    \n+
    static ColIter col
    Definition matrixredistribute.hh:604
    \n+
    CommMatrixRow< M, I > Container
    Definition matrixredistribute.hh:601
    \n+
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n+
    EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet
    Definition owneroverlapcopy.hh:194
    \n+
    Definition pinfo.hh:28
    \n+
    Definition repartition.hh:260
    \n+
    @ nonoverlapping
    Category for non-overlapping solvers.
    Definition solvercategory.hh:27
    \n+
    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
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,433 +1,1173 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-kamg.hh\n+matrixredistribute.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_KAMG_HH\n-6#define DUNE_AMG_KAMG_HH\n-7\n-8#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n-9#include \"_\ba_\bm_\bg_\b._\bh_\bh\"\n-10\n-11namespace _\bD_\bu_\bn_\be\n-12{\n-13 namespace Amg\n-14 {\n-15\n-30 template\n-_\b3_\b1 class _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd\n-32 : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-33 {\n-35 typedef typename _\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn Domain;\n-37 typedef typename _\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be Range;\n-38 public:\n-39\n-_\b4_\b1 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-42 {\n-43 return amg_._\bc_\ba_\bt_\be_\bg_\bo_\br_\by();\n-44 };\n-45\n-_\b5_\b3 _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd(_\bA_\bM_\bG& amg, std::shared_ptr<_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bR_\ba_\bn_\bg_\be_\b> >\n-_\bc_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br)\n-54 : amg_(amg), coarseSolver_(_\bc_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br)\n-55 {}\n+5#ifndef DUNE_ISTL_MATRIXREDISTRIBUTE_HH\n+6#define DUNE_ISTL_MATRIXREDISTRIBUTE_HH\n+7#include \n+8#include \"_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+9#include \n+10#include \n+11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n+12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh>\n+18namespace _\bD_\bu_\bn_\be\n+19{\n+20 template\n+_\b2_\b1 struct _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+22 {\n+_\b2_\b3 bool _\bi_\bs_\bS_\be_\bt_\bu_\bp() const\n+24 {\n+25 return false;\n+26 }\n+27 template\n+_\b2_\b8 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be([[maybe_unused]] const D& from, [[maybe_unused]] D& to)\n+const\n+29 {}\n+30\n+31 template\n+_\b3_\b2 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd([[maybe_unused]] D& from, [[maybe_unused]]const D&\n+to) const\n+33 {}\n+34\n+_\b3_\b5 void _\br_\be_\bs_\be_\bt_\bS_\be_\bt_\bu_\bp()\n+36 {}\n+37\n+_\b3_\b8 void _\bs_\be_\bt_\bN_\bo_\bR_\bo_\bw_\bs([[maybe_unused]] std::size_t size)\n+39 {}\n+40\n+_\b4_\b1 void _\bs_\be_\bt_\bN_\bo_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs([[maybe_unused]] std::size_t size)\n+42 {}\n+43\n+_\b4_\b4 void _\bs_\be_\bt_\bN_\bo_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs([[maybe_unused]] std::size_t size)\n+45 {}\n+46\n+_\b4_\b7 std::size_t _\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be([[maybe_unused]] std::size_t index) const\n+48 {\n+49 return -1;\n+50 }\n+51\n+_\b5_\b2 std::size_t _\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be([[maybe_unused]] std::size_t index) const\n+53 {\n+54 return -1;\n+55 }\n 56\n-_\b5_\b8 void _\bp_\br_\be([[maybe_unused]] typename _\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn& x, [[maybe_unused]] typename\n-_\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be& b)\n-59 {}\n-60\n-_\b6_\b2 void _\bp_\bo_\bs_\bt([[maybe_unused]] typename _\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn& x)\n-63 {}\n-64\n-_\b6_\b6 void _\ba_\bp_\bp_\bl_\by(typename _\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn& v, const typename _\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be& d)\n+_\b5_\b7 std::size_t _\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be([[maybe_unused]] std::size_t index)\n+const\n+58 {\n+59 return -1;\n+60 }\n+61\n+62 };\n+63\n+64#if HAVE_MPI\n+65 template\n+_\b6_\b6 class _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn<_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn >\n 67 {\n-68 // Copy data\n-69 *levelContext_->update=0;\n-70 *levelContext_->rhs = d;\n-71 *levelContext_->lhs = v;\n-72\n-73 _\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh(*levelContext_, amg_.preSteps_);\n-74 bool processFineLevel =\n-75 amg_.moveToCoarseLevel(*levelContext_);\n-76\n-77 if(processFineLevel) {\n-78 typename _\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be b=*levelContext_->rhs;\n-79 typename _\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn x=*levelContext_->update;\n-80 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt res;\n-81 coarseSolver_->apply(x, b, res);\n-82 *levelContext_->update=x;\n-83 }\n-84\n-85 amg_.moveToFineLevel(*levelContext_, processFineLevel);\n-86\n-87 _\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh(*levelContext_, amg_.postSteps_);\n-88 v=*levelContext_->update;\n-89 }\n-90\n-_\b9_\b5 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bR_\ba_\bn_\bg_\be_\b>* _\bc_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br()\n-96 {\n-97 return coarseSolver_;\n-98 }\n-99\n-_\b1_\b0_\b4 void _\bs_\be_\bt_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt(std::shared_ptr p)\n-105 {\n-106 levelContext_=p;\n-107 }\n-108\n-_\b1_\b1_\b0 _\b~_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd()\n-111 {}\n-112\n-113 private:\n-115 _\bA_\bM_\bG& amg_;\n-117 std::shared_ptr > coarseSolver_;\n-119 std::shared_ptr levelContext_;\n-120 };\n-121\n-122\n-123\n-137 template, class A=std::allocator >\n-_\b1_\b3_\b9 class _\bK_\bA_\bM_\bG : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-140 {\n-141 public:\n-_\b1_\b4_\b3 typedef _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b> _\bA_\bm_\bg;\n-_\b1_\b4_\b5 typedef K _\bK_\br_\by_\bl_\bo_\bv_\bS_\bo_\bl_\bv_\be_\br;\n-_\b1_\b4_\b7 typedef typename _\bA_\bm_\bg_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n-_\b1_\b4_\b9 typedef typename _\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br;\n-_\b1_\b5_\b1 typedef typename _\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n-_\b1_\b5_\b3 typedef typename _\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n-_\b1_\b5_\b5 typedef typename _\bA_\bm_\bg_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br _\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n-_\b1_\b5_\b7 typedef typename _\bA_\bm_\bg_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn _\bD_\bo_\bm_\ba_\bi_\bn;\n-_\b1_\b5_\b9 typedef typename _\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bg_\be _\bR_\ba_\bn_\bg_\be;\n-_\b1_\b6_\b1 typedef typename _\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n-_\b1_\b6_\b3 typedef typename _\bA_\bm_\bg_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt;\n-164\n-_\b1_\b6_\b6 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-167 {\n-168 return amg._\bc_\ba_\bt_\be_\bg_\bo_\br_\by();\n-169 };\n-170\n-182 _\bK_\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br& coarseSolver,\n-183 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs, const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms,\n-184 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1);\n-185\n-199 template\n-200 _\bK_\bA_\bM_\bG(const _\bO_\bp_\be_\br_\ba_\bt_\bo_\br& fineOperator, const C& criterion,\n-201 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs=_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs(),\n-202 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1,\n-203 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo=_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n-204\n-206 void _\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b);\n-208 void _\bp_\bo_\bs_\bt(_\bD_\bo_\bm_\ba_\bi_\bn& x);\n-210 void _\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d);\n-211\n-212 std::size_t _\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs();\n-213\n-214 private:\n-216 _\bA_\bm_\bg amg;\n-217\n-219 std::size_t maxLevelKrylovSteps;\n+68 public:\n+_\b6_\b9 typedef _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b,_\bT_\b1_\b> _\bC_\bo_\bm_\bm;\n+70\n+_\b7_\b1 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn()\n+72 : interface(), setup_(false)\n+73 {}\n+74\n+_\b7_\b5 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be& _\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be()\n+76 {\n+77 return interface;\n+78 }\n+79 template\n+_\b8_\b0 void _\bc_\bh_\be_\bc_\bk_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be(const IS& source,\n+81 const IS& target, MPI_Comm comm)\n+82 {\n+83 auto ri = std::make_unique >(source, target, comm);\n+84 ri->template rebuild();\n+85 Interface inf;\n+86 typename _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bn_\bt_\b>_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt flags;\n+87 int rank;\n+88 MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n+89 inf.free();\n+90 inf.build(*ri, flags, flags);\n+91\n+92\n+93#ifdef DEBUG_REPART\n+94 if(inf!=interface) {\n+95\n+96 MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n+97 if(rank==0)\n+98 std::cout<<\"Interfaces do not match!\"<\n+_\b1_\b1_\b8 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be(const D& from, D& to) const\n+119 {\n+120 BufferedCommunicator communicator;\n+121 communicator.template build(from,to, interface);\n+122 communicator.template forward(from, to);\n+123 communicator.free();\n+124 }\n+125 template\n+_\b1_\b2_\b6 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd(D& from, const D& to) const\n+127 {\n+128\n+129 BufferedCommunicator communicator;\n+130 communicator.template build(from,to, interface);\n+131 communicator.template backward(from, to);\n+132 communicator.free();\n+133 }\n+134\n+135 template\n+_\b1_\b3_\b6 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be(const D& from, D& to) const\n+137 {\n+138 redistribute >(from,to);\n+139 }\n+140 template\n+_\b1_\b4_\b1 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd(D& from, const D& to) const\n+142 {\n+143 redistributeBackward >(from,to);\n+144 }\n+_\b1_\b4_\b5 bool _\bi_\bs_\bS_\be_\bt_\bu_\bp() const\n+146 {\n+147 return setup_;\n+148 }\n+149\n+_\b1_\b5_\b0 void _\br_\be_\bs_\be_\br_\bv_\be(std::size_t size)\n+151 {}\n+152\n+_\b1_\b5_\b3 std::size_t& _\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index)\n+154 {\n+155 return rowSize[index];\n+156 }\n+157\n+_\b1_\b5_\b8 std::size_t _\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index) const\n+159 {\n+160 return rowSize[index];\n+161 }\n+162\n+_\b1_\b6_\b3 std::size_t& _\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index)\n+164 {\n+165 return copyrowSize[index];\n+166 }\n+167\n+_\b1_\b6_\b8 std::size_t _\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index) const\n+169 {\n+170 return copyrowSize[index];\n+171 }\n+172\n+_\b1_\b7_\b3 std::size_t& _\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index)\n+174 {\n+175 return backwardscopyrowSize[index];\n+176 }\n+177\n+_\b1_\b7_\b8 std::size_t _\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index) const\n+179 {\n+180 return backwardscopyrowSize[index];\n+181 }\n+182\n+_\b1_\b8_\b3 void _\bs_\be_\bt_\bN_\bo_\bR_\bo_\bw_\bs(std::size_t rows)\n+184 {\n+185 rowSize.resize(rows, 0);\n+186 }\n+187\n+_\b1_\b8_\b8 void _\bs_\be_\bt_\bN_\bo_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs(std::size_t rows)\n+189 {\n+190 copyrowSize.resize(rows, 0);\n+191 }\n+192\n+_\b1_\b9_\b3 void _\bs_\be_\bt_\bN_\bo_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs(std::size_t rows)\n+194 {\n+195 backwardscopyrowSize.resize(rows, 0);\n+196 }\n+197\n+198 private:\n+199 std::vector rowSize;\n+200 std::vector copyrowSize;\n+201 std::vector backwardscopyrowSize;\n+202 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be interface;\n+203 bool setup_;\n+204 };\n+205\n+214 template\n+_\b2_\b1_\b5 struct _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+216 {\n+217 // Make the default communication policy work.\n+_\b2_\b1_\b8 typedef typename M::size_type _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n+_\b2_\b1_\b9 typedef typename M::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n 220\n-222 double levelDefectReduction;\n-223\n-225 std::vector > scalarproducts;\n-226\n-228 std::vector > > ksolvers;\n-229 };\n-230\n+_\b2_\b2_\b6 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be(const M& m_, RI& rowsize_)\n+227 : _\bm_\ba_\bt_\br_\bi_\bx(m_), _\br_\bo_\bw_\bs_\bi_\bz_\be(rowsize_)\n+228 {}\n+_\b2_\b2_\b9 const M& _\bm_\ba_\bt_\br_\bi_\bx;\n+_\b2_\b3_\b0 RI& _\br_\bo_\bw_\bs_\bi_\bz_\be;\n 231\n-232 template\n-_\b2_\b3_\b3 _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\bK_\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br&\n-coarseSolver,\n-234 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs, const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& params,\n-235 std::size_t ksteps, double reduction)\n-236 : amg(matrices, coarseSolver, smootherArgs, params),\n-237 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)\n-238 {}\n-239\n-240\n-241 template\n-242 template\n-_\b2_\b4_\b3 _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\bK_\bA_\bM_\bG(const _\bO_\bp_\be_\br_\ba_\bt_\bo_\br& fineOperator, const C& criterion,\n-244 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs,\n-245 std::size_t ksteps, double reduction,\n-246 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo)\n-247 : amg(fineOperator, criterion, smootherArgs, pinfo),\n-248 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)\n-249 {}\n-250\n-251\n-252 template\n-_\b2_\b5_\b3 void _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b)\n-254 {\n-255 amg.pre(x,b);\n-256 scalarproducts.reserve(amg.levels());\n-257 ksolvers.reserve(amg.levels());\n-258\n-259 typename OperatorHierarchy::ParallelMatrixHierarchy::Iterator\n-260 matrix = amg.matrices_->matrices().coarsest();\n-261 typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-262 pinfo = amg.matrices_->parallelInformation().coarsest();\n-263 bool hasCoarsest=(amg.levels()==amg.maxlevels());\n-264\n-265 if(hasCoarsest) {\n-266 if(matrix==amg.matrices_->matrices().finest())\n-267 return;\n-268 --matrix;\n-269 --pinfo;\n-270 ksolvers.push_back(std::shared_ptr<_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b> >(new _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b>\n-(amg, amg.solver_)));\n-271 }else\n-272 ksolvers.push_back(std::shared_ptr<_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b> >(new _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b>\n-(amg, std::shared_ptr<_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bR_\ba_\bn_\bg_\be_\b> >())));\n-273\n-274 std::ostringstream s;\n-275\n-276 if(matrix!=amg.matrices_->matrices().finest())\n-277 while(true) {\n-278 scalarproducts.push_back(createScalarProduct(*pinfo,category()));\n-279 std::shared_ptr > ks =\n-280 std::shared_ptr >(new _\bK_\br_\by_\bl_\bo_\bv_\bS_\bo_\bl_\bv_\be_\br(*matrix, *\n-(scalarproducts.back()),\n-281 *(ksolvers.back()), levelDefectReduction,\n-282 maxLevelKrylovSteps, 0));\n-283 ksolvers.push_back(std::shared_ptr<_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b> >(new _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b>\n-(amg, ks)));\n-284 --matrix;\n-285 --pinfo;\n-286 if(matrix==amg.matrices_->matrices().finest())\n-287 break;\n-288 }\n-289 }\n-290\n-291\n-292 template\n-_\b2_\b9_\b3 void _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\bp_\bo_\bs_\bt(_\bD_\bo_\bm_\ba_\bi_\bn& x)\n-294 {\n-295 amg.post(x);\n-296\n-297 }\n+232 };\n+233\n+234\n+243 template\n+_\b2_\b4_\b4 struct _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n+245 {\n+_\b2_\b4_\b6 typedef typename M::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+247\n+_\b2_\b5_\b4 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(const M& m_, const Dune::GlobalLookupIndexSet&\n+idxset_, const I& aggidxset_)\n+255 : _\bm_\ba_\bt_\br_\bi_\bx(m_), _\bi_\bd_\bx_\bs_\be_\bt(idxset_), _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt(aggidxset_), _\br_\bo_\bw_\bs_\bi_\bz_\be()\n+256 {}\n+257\n+_\b2_\b6_\b5 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(const M& m_, const Dune::GlobalLookupIndexSet&\n+idxset_, const I& aggidxset_,\n+266 const std::vector& rowsize_)\n+267 : _\bm_\ba_\bt_\br_\bi_\bx(m_), _\bi_\bd_\bx_\bs_\be_\bt(idxset_), _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt(aggidxset_), _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by\n+(aggidxset_.size()), _\br_\bo_\bw_\bs_\bi_\bz_\be(&rowsize_)\n+268 {}\n+269\n+_\b2_\b7_\b6 void _\bs_\bt_\bo_\br_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(M& m)\n+277 {\n+278 // insert diagonal to overlap rows\n+279 typedef typename Dune::GlobalLookupIndexSet::const_iterator IIter;\n+280 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bn_\bt_\b>_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n+OwnerSet;\n+281 std::size_t nnz=0;\n+282#ifdef DEBUG_REPART\n+283 int rank;\n+284\n+285 MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n+286#endif\n+287 for(IIter i= _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.begin(), end=_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.end(); i!=end; ++i) {\n+288 if(!OwnerSet::contains(i->local().attribute())) {\n+289#ifdef DEBUG_REPART\n+290 std::cout<local()<local()].insert(i->local());\n+293 }\n+294\n+295 nnz+=_\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[i->local()].size();\n+296 }\n+297 assert( _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.size()==_\bs_\bp_\ba_\br_\bs_\bi_\bt_\by.size());\n 298\n-299 template\n-_\b3_\b0_\b0 void _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n-301 {\n-302 if(ksolvers.size()==0)\n-303 {\n-304 _\bR_\ba_\bn_\bg_\be td=d;\n-305 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt res;\n-306 amg.solver_->apply(v,td,res);\n-307 }else\n-308 {\n-309 typedef typename Amg::LevelContext LevelContext;\n-310 std::shared_ptr levelContext(new LevelContext);\n-311 amg.initIteratorsWithFineLevel(*levelContext);\n-312 typedef typename std::vector > >::iterator\n-Iter;\n-313 for(Iter solver=ksolvers.begin(); solver!=ksolvers.end(); ++solver)\n-314 (*solver)->setLevelContext(levelContext);\n-315 ksolvers.back()->apply(v,d);\n-316 }\n-317 }\n-318\n-319 template\n-_\b3_\b2_\b0 std::size_t _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs()\n-321 {\n-322 return amg.maxlevels();\n-323 }\n-324\n-326 } // Amg\n-327} // Dune\n-328\n+299 if(nnz>0) {\n+300 m.setSize(_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.size(), _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.size(), nnz);\n+301 m.setBuildMode(M::row_wise);\n+302 typename M::CreateIterator citer=m.createbegin();\n+303#ifdef DEBUG_REPART\n+304 std::size_t idx=0;\n+305 bool correct=true;\n+306 Dune::GlobalLookupIndexSet global(_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt);\n+307#endif\n+308 typedef typename std::vector >::const_iterator Iter;\n+309 for(Iter i=_\bs_\bp_\ba_\br_\bs_\bi_\bt_\by.begin(), end=_\bs_\bp_\ba_\br_\bs_\bi_\bt_\by.end(); i!=end; ++i, ++citer)\n+310 {\n+311 typedef typename std::set::const_iterator SIter;\n+312 for(SIter si=i->begin(), send=i->end(); si!=send; ++si)\n+313 citer.insert(*si);\n+314#ifdef DEBUG_REPART\n+315 if(i->find(idx)==i->end()) {\n+316 const typename I::IndexPair* gi=global.pair(idx);\n+317 assert(gi);\n+318 std::cout<global()<<\" attr=\"<local().attribute()<<\" \"<<\n+319 OwnerSet::contains(gi->local().attribute())<<\n+320 \" row size=\"<size()<::Arguments SmootherArgs\n-The argument type for the construction of the smoother.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-M Operator\n-The matrix operator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bp_\bo_\bs_\bt\n-void post(Domain &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be\n-X Range\n-The range type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:89\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh\n-void presmooth(LevelContext &levelContext, size_t steps)\n-Apply pre smoothing on the current level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:406\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh\n-void postsmooth(LevelContext &levelContext, size_t steps)\n-Apply post smoothing on the current level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:428\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bp_\br_\be\n-void pre(Domain &x, Range &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:253\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:194\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-PI ParallelInformation\n-The type of the parallel information. Either OwnerOverlapCommunication or\n-another type describing the...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:80\n+330 }\n+331 }\n+332\n+_\b3_\b4_\b0 void _\bc_\bo_\bm_\bp_\bl_\be_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(std::vector >\n+add_sparsity)\n+341 {\n+342 for (unsigned int i = 0; i != _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by.size(); ++i) {\n+343 if (add_sparsity[i].size() != 0) {\n+344 typedef std::set Set;\n+345 Set tmp_set;\n+346 std::insert_iterator tmp_insert (tmp_set, tmp_set.begin());\n+347 std::set_union(add_sparsity[i].begin(), add_sparsity[i].end(),\n+348 _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[i].begin(), _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[i].end(), tmp_insert);\n+349 _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[i].swap(tmp_set);\n+350 }\n+351 }\n+352 }\n+353\n+_\b3_\b5_\b4 const M& _\bm_\ba_\bt_\br_\bi_\bx;\n+_\b3_\b5_\b5 typedef Dune::GlobalLookupIndexSet _\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+_\b3_\b5_\b6 const Dune::GlobalLookupIndexSet& _\bi_\bd_\bx_\bs_\be_\bt;\n+_\b3_\b5_\b7 const I& _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt;\n+_\b3_\b5_\b8 std::vector > _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by;\n+_\b3_\b5_\b9 const std::vector* _\br_\bo_\bw_\bs_\bi_\bz_\be;\n+360 };\n+361\n+362 template\n+_\b3_\b6_\b3 struct CommPolicy<_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn >\n+364 {\n+_\b3_\b6_\b5 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\b> _\bT_\by_\bp_\be;\n+366\n+_\b3_\b7_\b1 typedef typename I::GlobalIndex _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be;\n+372\n+_\b3_\b7_\b4 typedef VariableSize _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg;\n+375\n+_\b3_\b7_\b6 static typename M::size_type _\bg_\be_\bt_\bS_\bi_\bz_\be(const _\bT_\by_\bp_\be& t, std::size_t i)\n+377 {\n+378 if(!t._\br_\bo_\bw_\bs_\bi_\bz_\be)\n+379 return t._\bm_\ba_\bt_\br_\bi_\bx[i].size();\n+380 else\n+381 {\n+382 assert((*t._\br_\bo_\bw_\bs_\bi_\bz_\be)[i]>0);\n+383 return (*t._\br_\bo_\bw_\bs_\bi_\bz_\be)[i];\n+384 }\n+385 }\n+386 };\n+387\n+394 template\n+_\b3_\b9_\b5 struct _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw\n+396 {\n+_\b4_\b0_\b5 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw(M& m_, const Dune::GlobalLookupIndexSet& idxset_, const I&\n+aggidxset_)\n+406 : _\bm_\ba_\bt_\br_\bi_\bx(m_), _\bi_\bd_\bx_\bs_\be_\bt(idxset_), _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt(aggidxset_), _\br_\bo_\bw_\bs_\bi_\bz_\be()\n+407 {}\n+408\n+_\b4_\b1_\b2 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw(M& m_, const Dune::GlobalLookupIndexSet& idxset_, const I&\n+aggidxset_,\n+413 std::vector& rowsize_)\n+414 : _\bm_\ba_\bt_\br_\bi_\bx(m_), _\bi_\bd_\bx_\bs_\be_\bt(idxset_), _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt(aggidxset_), _\br_\bo_\bw_\bs_\bi_\bz_\be(&rowsize_)\n+415 {}\n+_\b4_\b2_\b1 void _\bs_\be_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bR_\bo_\bw_\bs_\bT_\bo_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt()\n+422 {\n+423 typedef typename Dune::GlobalLookupIndexSet::const_iterator Iter;\n+424 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bn_\bt_\b>_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n+OwnerSet;\n+425\n+426 for(Iter i= _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.begin(), end=_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.end(); i!=end; ++i)\n+427 if(!OwnerSet::contains(i->local().attribute())) {\n+428 // Set to Dirchlet\n+429 typedef typename M::ColIterator CIter;\n+430 for(CIter c=_\bm_\ba_\bt_\br_\bi_\bx[i->local()].begin(), cend= _\bm_\ba_\bt_\br_\bi_\bx[i->local()].end();\n+431 c!= cend; ++c)\n+432 {\n+433 *c=0;\n+434 if(c.index()==i->local()) {\n+435 auto setDiagonal = [](auto&& scalarOrMatrix, const auto& value) {\n+436 auto&& matrixView = Dune::Impl::asMatrix(scalarOrMatrix);\n+437 for (auto rowIt = matrixView.begin(); rowIt != matrixView.end(); ++rowIt)\n+438 (*rowIt)[rowIt.index()] = value;\n+439 };\n+440 setDiagonal(*c, 1);\n+441 }\n+442 }\n+443 }\n+444 }\n+_\b4_\b4_\b6 M& _\bm_\ba_\bt_\br_\bi_\bx;\n+_\b4_\b4_\b8 const Dune::GlobalLookupIndexSet& _\bi_\bd_\bx_\bs_\be_\bt;\n+_\b4_\b5_\b0 const I& _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt;\n+_\b4_\b5_\b2 std::vector* _\br_\bo_\bw_\bs_\bi_\bz_\be; // row sizes differ from sender side in\n+overlap!\n+453 };\n+454\n+455 template\n+_\b4_\b5_\b6 struct CommPolicy<_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw >\n+457 {\n+_\b4_\b5_\b8 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\b> _\bT_\by_\bp_\be;\n+459\n+_\b4_\b6_\b4 typedef std::pair\n+_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be;\n+465\n+_\b4_\b6_\b7 typedef VariableSize _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg;\n+468\n+_\b4_\b6_\b9 static std::size_t _\bg_\be_\bt_\bS_\bi_\bz_\be(const _\bT_\by_\bp_\be& t, std::size_t i)\n+470 {\n+471 if(!t._\br_\bo_\bw_\bs_\bi_\bz_\be)\n+472 return t._\bm_\ba_\bt_\br_\bi_\bx[i].size();\n+473 else\n+474 {\n+475 assert((*t._\br_\bo_\bw_\bs_\bi_\bz_\be)[i]>0);\n+476 return (*t._\br_\bo_\bw_\bs_\bi_\bz_\be)[i];\n+477 }\n+478 }\n+479 };\n+480\n+481 template\n+_\b4_\b8_\b2 struct _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+483 {\n+_\b4_\b8_\b4 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b<_\bM_\b,_\bR_\bI_\b> _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n+485\n+_\b4_\b8_\b6 static const typename M::size_type _\bg_\ba_\bt_\bh_\be_\br(const _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, std::\n+size_t i)\n+487 {\n+488 return cont._\bm_\ba_\bt_\br_\bi_\bx[i].size();\n+489 }\n+_\b4_\b9_\b0 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, const typename M::size_type& rowsize,\n+std::size_t i)\n+491 {\n+492 assert(rowsize);\n+493 cont._\br_\bo_\bw_\bs_\bi_\bz_\be.getRowSize(i)=rowsize;\n+494 }\n+495\n+496 };\n+497\n+498 template\n+_\b4_\b9_\b9 struct _\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+500 {\n+_\b5_\b0_\b1 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b<_\bM_\b,_\bR_\bI_\b> _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n+502\n+_\b5_\b0_\b3 static const typename M::size_type _\bg_\ba_\bt_\bh_\be_\br(const _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, std::\n+size_t i)\n+504 {\n+505 return cont._\bm_\ba_\bt_\br_\bi_\bx[i].size();\n+506 }\n+_\b5_\b0_\b7 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, const typename M::size_type& rowsize,\n+std::size_t i)\n+508 {\n+509 assert(rowsize);\n+510 if (rowsize > cont._\br_\bo_\bw_\bs_\bi_\bz_\be.getCopyRowSize(i))\n+511 cont._\br_\bo_\bw_\bs_\bi_\bz_\be.getCopyRowSize(i)=rowsize;\n+512 }\n+513\n+514 };\n+515\n+516 template\n+_\b5_\b1_\b7 struct _\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+518 {\n+_\b5_\b1_\b9 typedef typename I::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+_\b5_\b2_\b0 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\b> _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n+_\b5_\b2_\b1 typedef typename M::ConstColIterator _\bC_\bo_\bl_\bI_\bt_\be_\br;\n+522\n+_\b5_\b2_\b3 static _\bC_\bo_\bl_\bI_\bt_\be_\br _\bc_\bo_\bl;\n+_\b5_\b2_\b4 static _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n+525\n+_\b5_\b2_\b6 static const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\ba_\bt_\bh_\be_\br(const _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, std::size_t i,\n+std::size_t j)\n+527 {\n+528 if(j==0)\n+529 _\bc_\bo_\bl=cont._\bm_\ba_\bt_\br_\bi_\bx[i].begin();\n+530 else if (_\bc_\bo_\bl!=cont._\bm_\ba_\bt_\br_\bi_\bx[i].end())\n+531 ++_\bc_\bo_\bl;\n+532\n+533 //copy communication: different row sizes for copy rows with the same\n+global index\n+534 //are possible. If all values of current matrix row are sent, send\n+535 //std::numeric_limits::max()\n+536 //and receiver will ignore it.\n+537 if (_\bc_\bo_\bl==cont._\bm_\ba_\bt_\br_\bi_\bx[i].end()) {\n+538 _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs = std::numeric_limits::max();\n+539 return _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n+540 }\n+541 else {\n+542 const typename I::IndexPair* index=cont._\bi_\bd_\bx_\bs_\be_\bt.pair(_\bc_\bo_\bl.index());\n+543 assert(index);\n+544 // Only send index if col is no ghost\n+545 if ( index->local().attribute() != 2)\n+546 return index->global();\n+547 else {\n+548 _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs = std::numeric_limits::max();\n+549 return _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n+550 }\n+551 }\n+552 }\n+_\b5_\b5_\b3 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& gi, std::size_t i,\n+[[maybe_unused]] std::size_t j)\n+554 {\n+555 try{\n+556 if (gi != std::numeric_limits::max()) {\n+557 const typename I::IndexPair& ip=cont._\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.at(gi);\n+558 assert(ip.global()==gi);\n+559 std::size_t column = ip.local();\n+560 cont._\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[i].insert(column);\n+561\n+562 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bn_\bt_\b>_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n+OwnerSet;\n+563 if(!OwnerSet::contains(ip.local().attribute()))\n+564 // preserve symmetry for overlap\n+565 cont._\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[column].insert(i);\n+566 }\n+567 }\n+568 catch(const Dune::RangeError&) {\n+569 // Entry not present in the new index set. Ignore!\n+570#ifdef DEBUG_REPART\n+571 typedef typename _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b:_\b:_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt GlobalLookup;\n+572 typedef typename GlobalLookup::IndexPair IndexPair;\n+573 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bn_\bt_\b>_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n+OwnerSet;\n+574\n+575 GlobalLookup lookup(cont._\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt);\n+576 const IndexPair* pi=lookup.pair(i);\n+577 assert(pi);\n+578 if(OwnerSet::contains(pi->local().attribute())) {\n+579 int rank;\n+580 MPI_Comm_rank(MPI_COMM_WORLD,&rank);\n+581 std::cout<global()<\n+591 typename _\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br\n+_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bc_\bo_\bl;\n+592\n+593 template\n+594 typename _\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n+595\n+596\n+597 template\n+_\b5_\b9_\b8 struct _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+599 {\n+_\b6_\b0_\b0 typedef typename I::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+_\b6_\b0_\b1 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\b> _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n+_\b6_\b0_\b2 typedef typename M::ConstColIterator _\bC_\bo_\bl_\bI_\bt_\be_\br;\n+_\b6_\b0_\b3 typedef typename std::pair _\bD_\ba_\bt_\ba;\n+_\b6_\b0_\b4 static _\bC_\bo_\bl_\bI_\bt_\be_\br _\bc_\bo_\bl;\n+_\b6_\b0_\b5 static _\bD_\ba_\bt_\ba _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be;\n+_\b6_\b0_\b6 static _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n+607\n+_\b6_\b0_\b8 static const _\bD_\ba_\bt_\ba& _\bg_\ba_\bt_\bh_\be_\br(const _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, std::size_t i, std::size_t\n+j)\n+609 {\n+610 if(j==0)\n+611 _\bc_\bo_\bl=cont._\bm_\ba_\bt_\br_\bi_\bx[i].begin();\n+612 else if (_\bc_\bo_\bl!=cont._\bm_\ba_\bt_\br_\bi_\bx[i].end())\n+613 ++_\bc_\bo_\bl;\n+614 // copy communication: different row sizes for copy rows with the same\n+global index\n+615 // are possible. If all values of current matrix row are sent, send\n+616 // std::numeric_limits::max()\n+617 // and receiver will ignore it.\n+618 if (_\bc_\bo_\bl==cont._\bm_\ba_\bt_\br_\bi_\bx[i].end()) {\n+619 _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs = std::numeric_limits::max();\n+620 _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be = _\bD_\ba_\bt_\ba(_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs,*_\bc_\bo_\bl);\n+621 return _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be;\n+622 }\n+623 else {\n+624 // convert local column index to global index\n+625 const typename I::IndexPair* index=cont._\bi_\bd_\bx_\bs_\be_\bt.pair(_\bc_\bo_\bl.index());\n+626 assert(index);\n+627 // Store the data to prevent reference to temporary\n+628 // Only send index if col is no ghost\n+629 if ( index->local().attribute() != 2)\n+630 _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be = _\bD_\ba_\bt_\ba(index->global(),*_\bc_\bo_\bl);\n+631 else {\n+632 _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs = std::numeric_limits::max();\n+633 _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be = _\bD_\ba_\bt_\ba(_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs,*_\bc_\bo_\bl);\n+634 }\n+635 return _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be;\n+636 }\n+637 }\n+_\b6_\b3_\b8 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, const _\bD_\ba_\bt_\ba& data, std::size_t i, [\n+[maybe_unused]] std::size_t j)\n+639 {\n+640 try{\n+641 if (data.first != std::numeric_limits::max()) {\n+642 typename M::size_type column=cont._\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.at(data.first).local();\n+643 cont._\bm_\ba_\bt_\br_\bi_\bx[i][column]=data.second;\n+644 }\n+645 }\n+646 catch(const Dune::RangeError&) {\n+647 // This an overlap row and might therefore lack some entries!\n+648 }\n+649\n+650 }\n+651 };\n+652\n+653 template\n+654 typename _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:\n+_\bc_\bo_\bl;\n+655\n+656 template\n+657 typename _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bD_\ba_\bt_\ba _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:\n+_\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be;\n+658\n+659 template\n+660 typename _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n+661\n+662 template\n+_\b6_\b6_\b3 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(M& origMatrix, M& newMatrix, C& origComm,\n+C& newComm,\n+664 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bC_\b>& ri)\n+665 {\n+666 typename C::CopySet copyflags;\n+667 typename C::OwnerSet ownerflags;\n+668 typedef typename C::ParallelIndexSet IndexSet;\n+669 typedef _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bC_\b> RI;\n+670 std::vector rowsize(newComm.indexSet().size(), 0);\n+671 std::vector copyrowsize(newComm.indexSet().size(),\n+0);\n+672 std::vector backwardscopyrowsize(origComm.indexSet\n+().size(), 0);\n+673\n+674 // get owner rowsizes\n+675 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b<_\bM_\b,_\bR_\bI_\b> commRowSize(origMatrix, ri);\n+676 ri.template redistribute >\n+(commRowSize,commRowSize);\n+677\n+678 origComm.buildGlobalLookup();\n+679\n+680 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {\n+681 rowsize[i] = ri._\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be(i);\n+682 }\n+683 // get sparsity pattern from owner rows\n+684 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b>\n+685 origsp(origMatrix, origComm.globalLookup(), newComm.indexSet());\n+686 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b>\n+687 newsp(origMatrix, origComm.globalLookup(), newComm.indexSet(), rowsize);\n+688\n+689 ri.template redistribute >\n+(origsp,newsp);\n+690\n+691 // build copy to owner interface to get missing matrix values for novlp\n+case\n+692 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(origComm) == _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg) {\n+693 RemoteIndices *ris = new RemoteIndices\n+(origComm.indexSet(),\n+694 newComm.indexSet(),\n+695 origComm.communicator());\n+696 ris->template rebuild();\n+697\n+698 ri.getInterface().free();\n+699 ri.getInterface().build(*ris,copyflags,ownerflags);\n+700\n+701 // get copy rowsizes\n+702 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b<_\bM_\b,_\bR_\bI_\b> commRowSize_copy(origMatrix, ri);\n+703 ri.template redistribute >\n+(commRowSize_copy,\n+704 commRowSize_copy);\n+705\n+706 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {\n+707 copyrowsize[i] = ri._\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(i);\n+708 }\n+709 //get copy rowsizes for sender\n+710 ri._\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd(backwardscopyrowsize,copyrowsize);\n+711 for (std::size_t i=0; i < origComm.indexSet().size(); i++) {\n+712 ri._\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(i) = backwardscopyrowsize[i];\n+713 }\n+714\n+715 // get sparsity pattern from copy rows\n+716 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> origsp_copy(origMatrix,\n+717 origComm.globalLookup(),\n+718 newComm.indexSet(),\n+719 backwardscopyrowsize);\n+720 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> newsp_copy(origMatrix,\n+origComm.globalLookup(),\n+721 newComm.indexSet(), copyrowsize);\n+722 ri.template redistribute >\n+(origsp_copy,\n+723 newsp_copy);\n+724\n+725 newsp._\bc_\bo_\bm_\bp_\bl_\be_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(newsp_copy._\bs_\bp_\ba_\br_\bs_\bi_\bt_\by);\n+726 newsp._\bs_\bt_\bo_\br_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(newMatrix);\n+727 }\n+728 else\n+729 newsp._\bs_\bt_\bo_\br_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(newMatrix);\n+730\n+731#ifdef DUNE_ISTL_WITH_CHECKING\n+732 // Check for symmetry\n+733 int ret=0;\n+734 typedef typename M::ConstRowIterator RIter;\n+735 for(RIter row=newMatrix.begin(), rend=newMatrix.end(); row != rend; ++row)\n+{\n+736 typedef typename M::ConstColIterator CIter;\n+737 for(CIter _\bc_\bo_\bl=row->begin(), cend=row->end(); _\bc_\bo_\bl!=cend; ++_\bc_\bo_\bl)\n+738 {\n+739 try{\n+740 newMatrix[_\bc_\bo_\bl.index()][row.index()];\n+741 }catch(const _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br&) {\n+742 std::cerr<\n+_\b7_\b5_\b7 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs(M& origMatrix, M& newMatrix, C& origComm, C&\n+newComm,\n+758 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bC_\b>& ri)\n+759 {\n+760 typedef typename C::ParallelIndexSet IndexSet;\n+761 typename C::OwnerSet ownerflags;\n+762 std::vector rowsize(newComm.indexSet().size(), 0);\n+763 std::vector copyrowsize(newComm.indexSet().size(),\n+0);\n+764 std::vector backwardscopyrowsize(origComm.indexSet\n+().size(), 0);\n+765\n+766 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {\n+767 rowsize[i] = ri._\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be(i);\n+768 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(origComm) == _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg) {\n+769 copyrowsize[i] = ri._\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(i);\n+770 }\n+771 }\n+772\n+773 for (std::size_t i=0; i < origComm.indexSet().size(); i++)\n+774 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(origComm) == _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg)\n+775 backwardscopyrowsize[i] = ri._\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(i);\n+776\n+777\n+778 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(origComm) == _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg) {\n+779 // fill sparsity pattern from copy rows\n+780 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> origrow_copy(origMatrix, origComm.globalLookup(),\n+781 newComm.indexSet(), backwardscopyrowsize);\n+782 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> newrow_copy(newMatrix, origComm.globalLookup(),\n+783 newComm.indexSet(),copyrowsize);\n+784 ri.template redistribute >(origrow_copy,\n+785 newrow_copy);\n+786 ri.getInterface().free();\n+787 RemoteIndices *ris = new RemoteIndices\n+(origComm.indexSet(),\n+788 newComm.indexSet(),\n+789 origComm.communicator());\n+790 ris->template rebuild();\n+791 ri.getInterface().build(*ris,ownerflags,ownerflags);\n+792 }\n+793\n+794 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b>\n+795 origrow(origMatrix, origComm.globalLookup(), newComm.indexSet());\n+796 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b>\n+797 newrow(newMatrix, origComm.globalLookup(), newComm.indexSet(),rowsize);\n+798 ri.template redistribute >\n+(origrow,newrow);\n+799 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(origComm) != static_cast(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:\n+_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg))\n+800 newrow._\bs_\be_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bR_\bo_\bw_\bs_\bT_\bo_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt();\n+801 }\n+802\n+819 template\n+_\b8_\b2_\b0 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(M& origMatrix, M& newMatrix, C& origComm, C&\n+newComm,\n+821 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bC_\b>& ri)\n+822 {\n+823 ri._\bs_\be_\bt_\bN_\bo_\bR_\bo_\bw_\bs(newComm.indexSet().size());\n+824 ri._\bs_\be_\bt_\bN_\bo_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs(newComm.indexSet().size());\n+825 ri._\bs_\be_\bt_\bN_\bo_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs(origComm.indexSet().size());\n+826 _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(origMatrix, newMatrix, origComm, newComm, ri);\n+827 _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs(origMatrix, newMatrix, origComm, newComm, ri);\n+828 }\n+829#endif\n+830\n+831template\n+_\b8_\b3_\b2 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs(M& origMatrix, M& newMatrix,\n+833 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& origComm,\n+834 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& newComm,\n+835 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>& ri)\n+836 {\n+837 DUNE_THROW(InvalidStateException, \"Trying to redistribute in sequential\n+program!\");\n+838 }\n+839 template\n+_\b8_\b4_\b0 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(M& origMatrix, M& newMatrix,\n+841 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& origComm,\n+842 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& newComm,\n+843 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>& ri)\n+844 {\n+845 DUNE_THROW(InvalidStateException, \"Trying to redistribute in sequential\n+program!\");\n+846 }\n+847}\n+848#endif\n+_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n+Classes providing communication interfaces for overlapping Schwarz methods.\n+_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+Functionality for redistributing a parallel index set using graph partitioning.\n+_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG\n-an algebraic multigrid method using a Krylov-cycle.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:140\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n-Amg::Domain Domain\n-the type of the domain.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:157\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-Amg::SmootherArgs SmootherArgs\n-The type of the arguments for construction of the smoothers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-Amg::ParallelInformation ParallelInformation\n-the type of the parallelinformation to use.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br\n-Amg::CoarseSolver CoarseSolver\n-The type of the coarse solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:149\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-Amg::OperatorHierarchy OperatorHierarchy\n-The type of the hierarchy of operators.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:147\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be\n-Amg::Range Range\n-The type of the range.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:159\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-Amg::ScalarProduct ScalarProduct\n-The type of the scalar product.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:163\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bA_\bm_\bg\n-AMG< M, X, S, PI, A > Amg\n-The type of the underlying AMG.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:143\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Amg::Operator Operator\n-the type of the lineatr operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-Amg::ParallelInformationHierarchy ParallelInformationHierarchy\n-The type of the hierarchy of parallel information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:161\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:166\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bK_\br_\by_\bl_\bo_\bv_\bS_\bo_\bl_\bv_\be_\br\n-K KrylovSolver\n-The type of the Krylov solver for the cycle.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:145\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd\n-Two grid operator for AMG with Krylov cycle.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bp_\br_\be\n-void pre(typename AMG::Domain &x, typename AMG::Range &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:58\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd\n-KAmgTwoGrid(AMG &amg, std::shared_ptr< InverseOperator< Domain, Range > >\n-coarseSolver)\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs\n+void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C\n+&newComm, RedistributeInformation< C > &ri)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:757\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n+void redistributeSparsityPattern(M &origMatrix, M &newMatrix, C &origComm, C\n+&newComm, RedistributeInformation< C > &ri)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:663\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx\n+void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm,\n+RedistributeInformation< C > &ri)\n+Redistribute a matrix according to given domain decompositions.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:820\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+derive error class from the base class in common\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bN_\bo_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs\n+void setNoBackwardsCopyRows(std::size_t size)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be\n+void redistribute(const D &from, D &to) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\be_\bt_\bS_\be_\bt_\bu_\bp\n+void resetSetup()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bN_\bo_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs\n+void setNoCopyRows(std::size_t size)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bs_\bS_\be_\bt_\bu_\bp\n+bool isSetup() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bN_\bo_\bR_\bo_\bw_\bs\n+void setNoRows(std::size_t size)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd\n+void redistributeBackward(D &from, const D &to) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t getBackwardsCopyRowSize(std::size_t index) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t getRowSize(std::size_t index) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:47\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t getCopyRowSize(std::size_t index) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t getRowSize(std::size_t index) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t & getBackwardsCopyRowSize(std::size_t index)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:173\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+RedistributeInterface & getInterface()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be\n+void redistribute(const D &from, D &to) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bs_\be_\bt_\bN_\bo_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs\n+void setNoBackwardsCopyRows(std::size_t rows)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:193\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t & getCopyRowSize(std::size_t index)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:163\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+RedistributeInformation()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t getCopyRowSize(std::size_t index) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:168\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bs_\be_\bt_\bN_\bo_\bR_\bo_\bw_\bs\n+void setNoRows(std::size_t rows)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:183\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\br_\be_\bs_\be_\br_\bv_\be\n+void reserve(std::size_t size)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:_\bC_\bo_\bm_\bm\n+OwnerOverlapCopyCommunication< T, T1 > Comm\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bs_\be_\bt_\bN_\bo_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs\n+void setNoCopyRows(std::size_t rows)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd\n+void redistributeBackward(D &from, const D &to) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:141\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bs_\be_\bt_\bS_\be_\bt_\bu_\bp\n+void setSetup()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:106\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t getBackwardsCopyRowSize(std::size_t index) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:178\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be\n+void redistribute(const D &from, D &to) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:118\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\br_\be_\bs_\be_\bt_\bS_\be_\bt_\bu_\bp\n+void resetSetup()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:112\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd\n+void redistributeBackward(D &from, const D &to) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bc_\bh_\be_\bc_\bk_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+void checkInterface(const IS &source, const IS &target, MPI_Comm comm)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bi_\bs_\bS_\be_\bt_\bu_\bp\n+bool isSetup() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:145\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n+_\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t & getRowSize(std::size_t index)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+Utility class to communicate and set the row sizes of a redistributed matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+M::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n+M::size_type value_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:218\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b:_\b:_\br_\bo_\bw_\bs_\bi_\bz_\be\n+RI & rowsize\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n+const M & matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:229\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+CommMatrixRowSize(const M &m_, RI &rowsize_)\n Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\b~_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd\n-~KAmgTwoGrid()\n-Destructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bp_\bo_\bs_\bt\n-void post(typename AMG::Domain &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:62\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bs_\be_\bt_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt\n-void setLevelContext(std::shared_ptr< typename AMG::LevelContext > p)\n-Set the level context pointer.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:104\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br\n-InverseOperator< Domain, Range > * coarseSolver()\n-Get a pointer to the coarse grid solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(typename AMG::Domain &v, const typename AMG::Range &d)\n-Apply one step of the preconditioner to the system A(v)=d.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG\n-Parallel algebraic multigrid based on agglomeration.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation\n-> Iterator\n-Type of the mutable iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-The hierarchies build by the coarsening process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-All parameters for AMG.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Base class for matrix free definition of preconditioners.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-Base class for scalar product and norm computation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-Statistics about the application of an inverse operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Abstract base class for all solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n-Generalized preconditioned conjugate gradient solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1307\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:226\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n+Utility class to communicate and build the sparsity pattern of a redistributed\n+matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:245\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+M::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:246\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bi_\bd_\bx_\bs_\be_\bt\n+const Dune::GlobalLookupIndexSet< I > & idxset\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:356\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bs_\bt_\bo_\br_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n+void storeSparsityPattern(M &m)\n+Creates and stores the sparsity pattern of the redistributed matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:276\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt\n+const I & aggidxset\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:357\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\br_\bo_\bw_\bs_\bi_\bz_\be\n+const std::vector< size_type > * rowsize\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:359\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n+void completeSparsityPattern(std::vector< std::set< size_type > > add_sparsity)\n+Completes the sparsity pattern of the redistributed matrix with data from copy\n+rows for the novlp cas...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:340\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n+CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I >\n+&idxset_, const I &aggidxset_)\n+Constructor for the original side.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:254\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n+const M & matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:354\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n+CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I >\n+&idxset_, const I &aggidxset_, const std::vector< typename M::size_type >\n+&rowsize_)\n+Constructor for the redistruted side.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:265\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bs_\bp_\ba_\br_\bs_\bi_\bt_\by\n+std::vector< std::set< size_type > > sparsity\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:358\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+Dune::GlobalLookupIndexSet< I > LookupIndexSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:355\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bS_\bi_\bz_\be\n+static M::size_type getSize(const Type &t, std::size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:376\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n+CommMatrixSparsityPattern< M, I > Type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:365\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be\n+I::GlobalIndex IndexedType\n+The indexed type we send. This is the global index indentitfying the column.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:371\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg\n+VariableSize IndexedTypeFlag\n+Each row varies in size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:374\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw\n+Utility class for comunicating the matrix entries.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:396\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\br_\bo_\bw_\bs_\bi_\bz_\be\n+std::vector< size_t > * rowsize\n+row size information for the receiving side.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:452\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n+M & matrix\n+The matrix to communicate the values of.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:446\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw\n+CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I\n+&aggidxset_, std::vector< size_t > &rowsize_)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:412\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\bi_\bd_\bx_\bs_\be_\bt\n+const Dune::GlobalLookupIndexSet< I > & idxset\n+Index set for the original matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:448\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\bs_\be_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bR_\bo_\bw_\bs_\bT_\bo_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt\n+void setOverlapRowsToDirichlet()\n+Sets the non-owner rows correctly as Dirichlet boundaries.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:421\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt\n+const I & aggidxset\n+Index set for the redistributed matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:450\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw\n+CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I\n+&aggidxset_)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:405\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be\n+std::pair< typename I::GlobalIndex, typename M::block_type > IndexedType\n+The indexed type we send. This is the pair of global index indentitfying the\n+column and the value its...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:464\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n+CommMatrixRow< M, I > Type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:458\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bS_\bi_\bz_\be\n+static std::size_t getSize(const Type &t, std::size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:469\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg\n+VariableSize IndexedTypeFlag\n+Each row varies in size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:467\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:483\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n+static void scatter(Container &cont, const typename M::size_type &rowsize,\n+std::size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:490\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n+static const M::size_type gather(const Container &cont, std::size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:486\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+CommMatrixRowSize< M, RI > Container\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:484\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:500\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n+static const M::size_type gather(const Container &cont, std::size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:503\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n+static void scatter(Container &cont, const typename M::size_type &rowsize,\n+std::size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:507\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+CommMatrixRowSize< M, RI > Container\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:501\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:518\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br\n+M::ConstColIterator ColIter\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:521\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n+static void scatter(Container &cont, const GlobalIndex &gi, std::size_t i,\n+std::size_t j)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:553\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+CommMatrixSparsityPattern< M, I > Container\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:520\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs\n+static GlobalIndex numlimits\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:524\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bc_\bo_\bl\n+static ColIter col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:523\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+I::GlobalIndex GlobalIndex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:519\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n+static const GlobalIndex & gather(const Container &cont, std::size_t i, std::\n+size_t j)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:526\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:599\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+I::GlobalIndex GlobalIndex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:600\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be\n+static Data datastore\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:605\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs\n+static GlobalIndex numlimits\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:606\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br\n+M::ConstColIterator ColIter\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:602\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n+static const Data & gather(const Container &cont, std::size_t i, std::size_t j)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:608\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bD_\ba_\bt_\ba\n+std::pair< GlobalIndex, typename M::block_type > Data\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:603\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n+static void scatter(Container &cont, const Data &data, std::size_t i, std::\n+size_t j)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:638\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bc_\bo_\bl\n+static ColIter col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:604\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+CommMatrixRow< M, I > Container\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:601\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+A class setting up standard communication for a two-valued attribute set with\n+owner/overlap/copy sema...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n+EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:260\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n+@ nonoverlapping\n+Category for non-overlapping solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+static Category category(const OP &op, decltype(op.category()) *=nullptr)\n+Helperfunction to extract the solver category either from an enum, or from the\n+newly introduced virtu...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00143.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00143.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: dependency.hh File Reference\n+dune-istl: bdmatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -65,69 +65,51 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n \n+
    bdmatrix.hh File Reference
    \n \n
    \n \n-

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

    Implementation of the BDMatrix class. \n More...

    \n-
    #include <bitset>
    \n-#include <ostream>
    \n-#include "graph.hh"
    \n-#include "properties.hh"
    \n-#include <dune/common/propertymap.hh>
    \n+
    #include <memory>
    \n+#include <dune/common/rangeutilities.hh>
    \n+#include <dune/common/scalarmatrixview.hh>
    \n+#include <dune/istl/bcrsmatrix.hh>
    \n+#include <dune/istl/blocklevel.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n-\n-\n-\n-\n-\n+\n \n

    \n Classes

    class  Dune::Amg::EdgeProperties
     Class representing the properties of an edge in the matrix graph. More...
    class  Dune::BDMatrix< B, A >
     A block-diagonal matrix. More...
     
    class  Dune::Amg::VertexProperties
     Class representing a node in the matrix graph. More...
     
    class  Dune::Amg::PropertyGraphVertexPropertyMap< G, i >
     
    struct  Dune::PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >
    struct  Dune::FieldTraits< BDMatrix< B, A > >
     
    \n \n \n \n-\n-\n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n

    \n-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)
     
    \n

    Detailed Description

    \n-

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

    \n-
    Author
    Markus Blatt
    \n+

    Implementation of the BDMatrix class.

    \n+
    Author
    Oliver Sander
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,56 +1,30 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-dependency.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-Provides classes for initializing the link attributes of a matrix graph.\n-_\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n-#include \"_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b._\bh_\bh\"\n-#include \n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+bdmatrix.hh File Reference\n+Implementation of the BDMatrix class. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-\u00a0 Class representing the properties of an edge in the matrix graph.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n+\u00a0 A block-diagonal matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-\u00a0 Class representing a node in the matrix graph. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b<_\b _\bG_\b,_\b _\bi_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\by_\bp_\be_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg_\b,_\b _\bA_\bm_\bg_\b:_\b:\n- _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b,_\b _\bE_\bP_\b,_\b _\bV_\bM_\b,_\b _\bE_\bM_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- PropertyMapTypeSelector< _\bA_\bm_\bg_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg, _\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh< _\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt (const _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n- G, _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs, EP, VM, EM > &tag, _\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh< G, _\bA_\bm_\bg_\b:_\b:\n- >::Type\u00a0 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs, EP, VM, EM > &graph)\n-\u00a0\n- std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream\n- &os, const _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs &props)\n-\u00a0\n- std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream\n- &os, const _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs &props)\n-\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides classes for initializing the link attributes of a matrix graph.\n+Implementation of the BDMatrix class.\n Author\n- Markus Blatt\n+ Oliver Sander\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00143_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00143_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: dependency.hh Source File\n+dune-istl: bdmatrix.hh Source File\n \n \n \n \n \n \n \n@@ -70,490 +70,189 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    dependency.hh
    \n+
    bdmatrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_DEPENDENCY_HH
    \n-
    6#define DUNE_AMG_DEPENDENCY_HH
    \n+
    5#ifndef DUNE_ISTL_BDMATRIX_HH
    \n+
    6#define DUNE_ISTL_BDMATRIX_HH
    \n
    7
    \n-
    8
    \n-
    9#include <bitset>
    \n-
    10#include <ostream>
    \n-
    11
    \n-
    12#include "graph.hh"
    \n-
    13#include "properties.hh"
    \n-
    14#include <dune/common/propertymap.hh>
    \n+
    8#include <memory>
    \n+
    9
    \n+
    10#include <dune/common/rangeutilities.hh>
    \n+
    11#include <dune/common/scalarmatrixview.hh>
    \n+
    12
    \n+\n+\n
    15
    \n-
    16
    \n-
    17namespace Dune
    \n-
    18{
    \n-
    19 namespace Amg
    \n-
    20 {
    \n-
    \n-\n-
    39 {
    \n-
    40 friend std::ostream& operator<<(std::ostream& os, const EdgeProperties& props);
    \n-
    41 public:
    \n-\n-
    44
    \n-
    45 private:
    \n+
    21namespace Dune {
    \n+
    31 template <class B, class A=std::allocator<B> >
    \n+
    \n+
    32 class BDMatrix : public BCRSMatrix<B,A>
    \n+
    33 {
    \n+
    34 public:
    \n+
    35
    \n+
    36 //===== type definitions and constants
    \n+
    37
    \n+
    39 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n+
    40
    \n+
    42 typedef B block_type;
    \n+
    43
    \n+
    45 typedef A allocator_type;
    \n
    46
    \n-
    47 std::bitset<SIZE> flags_;
    \n-
    48 public:
    \n-\n-
    51
    \n-
    53 std::bitset<SIZE>::reference operator[](std::size_t v);
    \n-
    54
    \n-
    56 bool operator[](std::size_t v) const;
    \n-
    57
    \n-
    63 bool depends() const;
    \n-
    64
    \n-
    69 void setDepends();
    \n+
    48 //typedef BCRSMatrix<B,A>::row_type row_type;
    \n+
    49
    \n+
    51 typedef typename A::size_type size_type;
    \n+
    52
    \n+
    54 BDMatrix() : BCRSMatrix<B,A>() {}
    \n+
    55
    \n+
    \n+
    56 explicit BDMatrix(int size)
    \n+
    57 : BCRSMatrix<B,A>(size, size, BCRSMatrix<B,A>::random) {
    \n+
    58
    \n+
    59 for (int i=0; i<size; i++)
    \n+\n+
    61
    \n+\n+
    63
    \n+
    64 for (int i=0; i<size; i++)
    \n+
    65 this->BCRSMatrix<B,A>::addindex(i, i);
    \n+
    66
    \n+\n+
    68
    \n+
    69 }
    \n+
    \n
    70
    \n-
    74 void resetDepends();
    \n-
    75
    \n-
    80 bool influences() const;
    \n-
    81
    \n-
    85 void setInfluences();
    \n+
    \n+
    72 BDMatrix (std::initializer_list<B> const &list)
    \n+
    73 : BDMatrix(list.size())
    \n+
    74 {
    \n+
    75 size_t i=0;
    \n+
    76 for (auto it = list.begin(); it != list.end(); ++it, ++i)
    \n+
    77 (*this)[i][i] = *it;
    \n+
    78 }
    \n+
    \n+
    79
    \n+
    \n+
    81 void setSize(size_type size)
    \n+
    82 {
    \n+
    83 this->BCRSMatrix<B,A>::setSize(size, // rows
    \n+
    84 size, // columns
    \n+
    85 size); // nonzeros
    \n
    86
    \n-
    90 void resetInfluences();
    \n+
    87 for (auto i : range(size))
    \n+\n+
    89
    \n+\n
    91
    \n-
    96 bool isOneWay() const;
    \n+
    92 for (auto i : range(size))
    \n+
    93 this->BCRSMatrix<B,A>::addindex(i, i);
    \n+
    94
    \n+\n+
    96 }
    \n+
    \n
    97
    \n-
    102 bool isTwoWay() const;
    \n+
    \n+
    99 BDMatrix& operator= (const BDMatrix& other) {
    \n+
    100 this->BCRSMatrix<B,A>::operator=(other);
    \n+
    101 return *this;
    \n+
    102 }
    \n+
    \n
    103
    \n-
    108 bool isStrong() const;
    \n+
    \n+\n+\n+
    107 return *this;
    \n+
    108 }
    \n+
    \n
    109
    \n-
    113 void reset();
    \n-
    114
    \n-
    118 void printFlags() const;
    \n-
    119 };
    \n-
    \n-
    120
    \n-
    \n-\n-
    127 friend std::ostream& operator<<(std::ostream& os, const VertexProperties& props);
    \n-
    128 public:
    \n-\n-
    130 private:
    \n-
    131
    \n-
    133 std::bitset<SIZE> flags_;
    \n-
    134
    \n-
    135 public:
    \n-\n-
    138
    \n-
    140 std::bitset<SIZE>::reference operator[](std::size_t v);
    \n-
    141
    \n-
    143 bool operator[](std::size_t v) const;
    \n-
    144
    \n-
    151 void setIsolated();
    \n-
    152
    \n-
    156 bool isolated() const;
    \n-
    157
    \n-
    161 void resetIsolated();
    \n-
    162
    \n-
    166 void setVisited();
    \n-
    167
    \n-
    171 bool visited() const;
    \n-
    172
    \n-
    176 void resetVisited();
    \n-
    177
    \n-
    181 void setFront();
    \n-
    182
    \n-
    186 bool front() const;
    \n-
    187
    \n-
    191 void resetFront();
    \n-
    192
    \n-
    196 void setExcludedBorder();
    \n-
    197
    \n-
    202 bool excludedBorder() const;
    \n-
    203
    \n-
    207 void resetExcludedBorder();
    \n-
    208
    \n-
    212 void reset();
    \n-
    213
    \n-
    214 };
    \n-
    \n-
    215
    \n-
    216 template<typename G, std::size_t i>
    \n-
    \n-\n-
    218 : public RAPropertyMapHelper<typename std::bitset<VertexProperties::SIZE>::reference,
    \n-
    219 PropertyGraphVertexPropertyMap<G,i> >
    \n-
    220 {
    \n-
    221 public:
    \n-
    222
    \n-
    223 typedef ReadWritePropertyMapTag Category;
    \n-
    224
    \n-
    225 enum {
    \n-
    227 index = i
    \n-
    228 };
    \n-
    229
    \n-
    233 typedef G Graph;
    \n-
    234
    \n-
    238 typedef std::bitset<VertexProperties::SIZE> BitSet;
    \n-
    239
    \n-
    243 typedef typename BitSet::reference Reference;
    \n-
    244
    \n-
    248 typedef bool ValueType;
    \n-
    249
    \n-
    253 typedef typename G::VertexDescriptor Vertex;
    \n-
    254
    \n-
    \n-\n-
    260 : graph_(&g)
    \n-
    261 {}
    \n-
    \n-
    262
    \n-
    \n-\n-
    267 : graph_(0)
    \n-
    268 {}
    \n-
    \n-
    269
    \n-
    270
    \n-
    \n-
    275 Reference operator[](const Vertex& vertex) const
    \n-
    276 {
    \n-
    277 return graph_->getVertexProperties(vertex)[index];
    \n-
    278 }
    \n-
    \n-
    279 private:
    \n-
    280 Graph* graph_;
    \n-
    281 };
    \n-
    \n-
    282
    \n-
    283 } // end namespace Amg
    \n-
    284
    \n-
    285 template<typename G, typename EP, typename VM, typename EM>
    \n-
    \n-
    286 struct PropertyMapTypeSelector<Amg::VertexVisitedTag,Amg::PropertiesGraph<G,Amg::VertexProperties,EP,VM,EM> >
    \n-
    287 {
    \n-\n-
    289 };
    \n-
    \n-
    290
    \n-
    291 template<typename G, typename EP, typename VM, typename EM>
    \n-
    292 typename PropertyMapTypeSelector<Amg::VertexVisitedTag,Amg::PropertiesGraph<G,Amg::VertexProperties,EP,VM,EM> >::Type
    \n-\n-
    297
    \n-
    298 namespace Amg
    \n-
    299 {
    \n-
    \n-
    300 inline std::ostream& operator<<(std::ostream& os, const EdgeProperties& props)
    \n-
    301 {
    \n-
    302 return os << props.flags_;
    \n-
    303 }
    \n-
    \n-
    304
    \n-
    \n-\n-
    306 : flags_()
    \n-
    307 {}
    \n-
    \n-
    308
    \n-
    309 inline std::bitset<EdgeProperties::SIZE>::reference
    \n-
    \n-\n-
    311 {
    \n-
    312 return flags_[v];
    \n-
    313 }
    \n-
    \n-
    314
    \n-
    \n-
    315 inline bool EdgeProperties::operator[](std::size_t i) const
    \n-
    316 {
    \n-
    317 return flags_[i];
    \n-
    318 }
    \n-
    \n-
    319
    \n-
    \n-\n-
    321 {
    \n-
    322 flags_.reset();
    \n-
    323 }
    \n-
    \n-
    324
    \n-
    \n-\n-
    326 {
    \n-
    327 // Set the INFLUENCE bit
    \n-
    328 //flags_ |= (1<<INFLUENCE);
    \n-
    329 flags_.set(INFLUENCE);
    \n-
    330 }
    \n-
    \n-
    331
    \n-
    \n-
    332 inline bool EdgeProperties::influences() const
    \n-
    333 {
    \n-
    334 // Test the INFLUENCE bit
    \n-
    335 return flags_.test(INFLUENCE);
    \n-
    336 }
    \n-
    \n-
    337
    \n-
    \n-\n-
    339 {
    \n-
    340 // Set the first bit.
    \n-
    341 //flags_ |= (1<<DEPEND);
    \n-
    342 flags_.set(DEPEND);
    \n-
    343 }
    \n-
    \n-
    344
    \n-
    \n-\n-
    346 {
    \n-
    347 // reset the first bit.
    \n-
    348 //flags_ &= ~(1<<DEPEND);
    \n-
    349 flags_.reset(DEPEND);
    \n-
    350 }
    \n-
    \n-
    351
    \n-
    \n-
    352 inline bool EdgeProperties::depends() const
    \n-
    353 {
    \n-
    354 // Return the first bit.
    \n-
    355 return flags_.test(DEPEND);
    \n-
    356 }
    \n-
    \n-
    357
    \n-
    \n-\n-
    359 {
    \n-
    360 // reset the second bit.
    \n-
    361 flags_ &= ~(1<<INFLUENCE);
    \n-
    362 }
    \n-
    \n-
    363
    \n-
    \n-
    364 inline bool EdgeProperties::isOneWay() const
    \n-
    365 {
    \n-
    366 // Test whether only the first bit is set
    \n-
    367 //return isStrong() && !isTwoWay();
    \n-
    368 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND)))==(1<<DEPEND);
    \n-
    369 }
    \n-
    \n-
    370
    \n-
    \n-
    371 inline bool EdgeProperties::isTwoWay() const
    \n-
    372 {
    \n-
    373 // Test whether the first and second bit is set
    \n-
    374 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND)))==((1<<INFLUENCE)|(1<<DEPEND));
    \n-
    375 }
    \n-
    \n-
    376
    \n-
    \n-
    377 inline bool EdgeProperties::isStrong() const
    \n-
    378 {
    \n-
    379 // Test whether the first or second bit is set
    \n-
    380 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND))).to_ulong();
    \n-
    381 }
    \n-
    \n-
    382
    \n-
    383
    \n-
    \n-
    384 inline std::ostream& operator<<(std::ostream& os, const VertexProperties& props)
    \n-
    385 {
    \n-
    386 return os << props.flags_;
    \n-
    387 }
    \n-
    \n-
    388
    \n-
    \n-\n-
    390 : flags_()
    \n-
    391 {}
    \n-
    \n-
    392
    \n-
    393
    \n-
    394 inline std::bitset<VertexProperties::SIZE>::reference
    \n-
    \n-\n-
    396 {
    \n-
    397 return flags_[v];
    \n-
    398 }
    \n-
    \n-
    399
    \n-
    \n-
    400 inline bool VertexProperties::operator[](std::size_t v) const
    \n-
    401 {
    \n-
    402 return flags_[v];
    \n-
    403 }
    \n-
    \n-
    404
    \n-
    \n-\n-
    406 {
    \n-
    407 flags_.set(ISOLATED);
    \n-
    408 }
    \n-
    \n-
    409
    \n-
    \n-
    410 inline bool VertexProperties::isolated() const
    \n-
    411 {
    \n-
    412 return flags_.test(ISOLATED);
    \n-
    413 }
    \n-
    \n-
    414
    \n-
    \n-\n-
    416 {
    \n-
    417 flags_.reset(ISOLATED);
    \n-
    418 }
    \n-
    \n-
    419
    \n-
    \n-\n-
    421 {
    \n-
    422 flags_.set(VISITED);
    \n-
    423 }
    \n-
    \n-
    424
    \n-
    \n-
    425 inline bool VertexProperties::visited() const
    \n-
    426 {
    \n-
    427 return flags_.test(VISITED);
    \n-
    428 }
    \n-
    \n-
    429
    \n-
    \n-\n-
    431 {
    \n-
    432 flags_.reset(VISITED);
    \n-
    433 }
    \n-
    \n-
    434
    \n-
    \n-\n-
    436 {
    \n-
    437 flags_.set(FRONT);
    \n-
    438 }
    \n-
    \n-
    439
    \n-
    \n-
    440 inline bool VertexProperties::front() const
    \n-
    441 {
    \n-
    442 return flags_.test(FRONT);
    \n-
    443 }
    \n-
    \n-
    444
    \n-
    \n-\n-
    446 {
    \n-
    447 flags_.reset(FRONT);
    \n-
    448 }
    \n-
    \n-
    449
    \n-
    \n-\n-
    451 {
    \n-
    452 flags_.set(BORDER);
    \n-
    453 }
    \n-
    \n-
    454
    \n-
    \n-\n-
    456 {
    \n-
    457 return flags_.test(BORDER);
    \n-
    458 }
    \n-
    \n-
    459
    \n-
    \n-\n-
    461 {
    \n-
    462 flags_.reset(BORDER);
    \n-
    463 }
    \n-
    \n-
    464
    \n-
    \n-\n-
    466 {
    \n-
    467 flags_.reset();
    \n-
    468 }
    \n-
    \n-
    469
    \n-
    471 }
    \n-
    472}
    \n-
    473#endif
    \n-
    Provides classes for building the matrix graph.
    \n-
    Provides classes for handling internal properties in a graph.
    \n-
    bool depends() const
    Checks whether the vertex the edge points to depends on the vertex the edge starts.
    Definition dependency.hh:352
    \n-
    void resetFront()
    Resets the front node flag.
    Definition dependency.hh:445
    \n-
    std::bitset< VertexProperties::SIZE > BitSet
    The type of the bitset.
    Definition dependency.hh:238
    \n-
    bool isolated() const
    Checks whether the node is isolated.
    Definition dependency.hh:410
    \n-
    bool ValueType
    The value type.
    Definition dependency.hh:248
    \n-
    friend std::ostream & operator<<(std::ostream &os, const VertexProperties &props)
    Definition dependency.hh:384
    \n-
    BitSet::reference Reference
    The reference type.
    Definition dependency.hh:243
    \n-
    bool isTwoWay() const
    Checks whether the edge is two way. I.e. both the influence flag and the depends flag are that.
    Definition dependency.hh:371
    \n-
    void setInfluences()
    Marks the edge as one of which the start vertex by the end vertex.
    Definition dependency.hh:325
    \n-
    VertexProperties()
    Constructor.
    Definition dependency.hh:389
    \n-
    void setDepends()
    Marks the edge as one of which the end point depends on the starting point.
    Definition dependency.hh:338
    \n-
    PropertyGraphVertexPropertyMap()
    Default constructor.
    Definition dependency.hh:266
    \n-
    PropertyGraphVertexPropertyMap(G &g)
    Constructor.
    Definition dependency.hh:259
    \n-
    G::VertexDescriptor Vertex
    The vertex descriptor.
    Definition dependency.hh:253
    \n-
    void resetExcludedBorder()
    Marks the vertex as included in the aggregation.
    Definition dependency.hh:460
    \n-
    void setFront()
    Marks the node as belonging to the current clusters front.
    Definition dependency.hh:435
    \n-
    void reset()
    Reset all flags.
    Definition dependency.hh:465
    \n-
    void setVisited()
    Mark the node as already visited.
    Definition dependency.hh:420
    \n-
    EdgeProperties()
    Constructor.
    Definition dependency.hh:305
    \n-
    void resetInfluences()
    Resets the influence flag.
    Definition dependency.hh:358
    \n-
    G Graph
    The type of the graph with internal properties.
    Definition dependency.hh:233
    \n-
    std::bitset< SIZE >::reference operator[](std::size_t v)
    Access the bits directly.
    Definition dependency.hh:395
    \n-
    void printFlags() const
    Prints the attributes of the edge for debugging.
    \n-
    friend std::ostream & operator<<(std::ostream &os, const EdgeProperties &props)
    Definition dependency.hh:300
    \n-
    Amg::PropertyGraphVertexPropertyMap< Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM >, Amg::VertexProperties::VISITED > Type
    Definition dependency.hh:288
    \n-
    bool influences() const
    Checks whether the start vertex is influenced by the end vertex.
    Definition dependency.hh:332
    \n-
    void setIsolated()
    Marks that node as being isolated.
    Definition dependency.hh:405
    \n-
    bool excludedBorder() const
    Tests whether the vertex is excluded from the aggregation.
    Definition dependency.hh:455
    \n-
    void resetVisited()
    Resets the visited flag.
    Definition dependency.hh:430
    \n-
    bool visited() const
    Checks whether the node is marked as visited.
    Definition dependency.hh:425
    \n-
    Reference operator[](const Vertex &vertex) const
    Get the properties associated to a vertex.
    Definition dependency.hh:275
    \n-
    void reset()
    Reset all flags.
    Definition dependency.hh:320
    \n-
    void resetDepends()
    Resets the depends flag.
    Definition dependency.hh:345
    \n-
    ReadWritePropertyMapTag Category
    Definition dependency.hh:223
    \n-
    void resetIsolated()
    Resets the isolated flag.
    Definition dependency.hh:415
    \n-
    std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T > &criterion)
    Definition aggregates.hh:113
    \n-
    bool isStrong() const
    Checks whether the edge is strong. I.e. the influence or depends flag is set.
    Definition dependency.hh:377
    \n-
    bool front() const
    Checks whether the node is marked as a front node.
    Definition dependency.hh:440
    \n-
    std::bitset< SIZE >::reference operator[](std::size_t v)
    Access the bits directly.
    Definition dependency.hh:310
    \n-
    void setExcludedBorder()
    Marks the vertex as excluded from the aggregation.
    Definition dependency.hh:450
    \n-
    bool isOneWay() const
    Checks whether the edge is one way. I.e. either the influence or the depends flag but is set.
    Definition dependency.hh:364
    \n-
    @ index
    the index to access in the bitset.
    Definition dependency.hh:227
    \n-
    @ VISITED
    Definition dependency.hh:129
    \n-
    @ ISOLATED
    Definition dependency.hh:129
    \n-
    @ SIZE
    Definition dependency.hh:129
    \n-
    @ BORDER
    Definition dependency.hh:129
    \n-
    @ FRONT
    Definition dependency.hh:129
    \n-
    @ DEPEND
    Definition dependency.hh:43
    \n-
    @ SIZE
    Definition dependency.hh:43
    \n-
    @ INFLUENCE
    Definition dependency.hh:43
    \n+
    115 template <class V>
    \n+
    \n+
    116 void solve (V& x, const V& rhs) const {
    \n+
    117 for (size_type i=0; i<this->N(); i++)
    \n+
    118 {
    \n+
    119 auto&& xv = Impl::asVector(x[i]);
    \n+
    120 auto&& rhsv = Impl::asVector(rhs[i]);
    \n+
    121 Impl::asMatrix((*this)[i][i]).solve(xv,rhsv);
    \n+
    122 }
    \n+
    123 }
    \n+
    \n+
    124
    \n+
    \n+
    126 void invert() {
    \n+
    127 for (size_type i=0; i<this->N(); i++)
    \n+
    128 Impl::asMatrix((*this)[i][i]).invert();
    \n+
    129 }
    \n+
    \n+
    130
    \n+
    131 private:
    \n+
    132
    \n+
    133 // ////////////////////////////////////////////////////////////////////////////
    \n+
    134 // The following methods from the base class should now actually be called
    \n+
    135 // ////////////////////////////////////////////////////////////////////////////
    \n+
    136
    \n+
    137 // createbegin and createend should be in there, too, but I can't get it to compile
    \n+
    138 // BCRSMatrix<B,A>::CreateIterator createbegin () {}
    \n+
    139 // BCRSMatrix<B,A>::CreateIterator createend () {}
    \n+
    140 void setrowsize (size_type i, size_type s) {}
    \n+
    141 void incrementrowsize (size_type i) {}
    \n+
    142 void endrowsizes () {}
    \n+
    143 void addindex (size_type row, size_type col) {}
    \n+
    144 void endindices () {}
    \n+
    145 };
    \n+
    \n+
    146
    \n+
    147 template<typename B, typename A>
    \n+
    \n+
    148 struct FieldTraits< BDMatrix<B, A> >
    \n+
    149 {
    \n+\n+
    151 using real_type = typename FieldTraits<field_type>::real_type;
    \n+
    152 };
    \n+
    \n+
    155} // end namespace Dune
    \n+
    156
    \n+
    157#endif
    \n+
    Implementation of the BCRSMatrix class.
    \n+
    Helper functions for determining the vector/matrix block level.
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n
    Definition allocator.hh:11
    \n-
    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
    \n-
    Class representing the properties of an edge in the matrix graph.
    Definition dependency.hh:39
    \n-
    Class representing a node in the matrix graph.
    Definition dependency.hh:126
    \n-
    Definition dependency.hh:220
    \n-
    Attaches properties to the edges and vertices of a graph.
    Definition graph.hh:978
    \n-
    Tag idnetifying the visited property of a vertex.
    Definition properties.hh:29
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    void endrowsizes()
    indicate that size of all rows is defined
    Definition bcrsmatrix.hh:1146
    \n+
    @ random
    Build entries randomly.
    Definition bcrsmatrix.hh:526
    \n+
    void endindices()
    indicate that all indices are defined, check consistency
    Definition bcrsmatrix.hh:1269
    \n+
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n+
    void setSize(size_type rows, size_type columns, size_type nnz=0)
    Set the size of the matrix.
    Definition bcrsmatrix.hh:858
    \n+
    BCRSMatrix & operator=(const BCRSMatrix &Mat)
    assignment
    Definition bcrsmatrix.hh:908
    \n+
    A block-diagonal matrix.
    Definition bdmatrix.hh:33
    \n+
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bdmatrix.hh:39
    \n+
    A::size_type size_type
    implement row_type with compressed vector
    Definition bdmatrix.hh:51
    \n+
    BDMatrix()
    Default constructor.
    Definition bdmatrix.hh:54
    \n+
    BDMatrix(std::initializer_list< B > const &list)
    Construct from a std::initializer_list.
    Definition bdmatrix.hh:72
    \n+
    B block_type
    export the type representing the components
    Definition bdmatrix.hh:42
    \n+
    void solve(V &x, const V &rhs) const
    Solve the system Ax=b in O(n) time.
    Definition bdmatrix.hh:116
    \n+
    A allocator_type
    export the allocator type
    Definition bdmatrix.hh:45
    \n+
    BDMatrix(int size)
    Definition bdmatrix.hh:56
    \n+
    BDMatrix & operator=(const BDMatrix &other)
    assignment
    Definition bdmatrix.hh:99
    \n+
    void setSize(size_type size)
    Resize the matrix. Invalidates the content!
    Definition bdmatrix.hh:81
    \n+
    void invert()
    Inverts the matrix.
    Definition bdmatrix.hh:126
    \n+
    typename BDMatrix< B, A >::field_type field_type
    Definition bdmatrix.hh:150
    \n+
    typename FieldTraits< field_type >::real_type real_type
    Definition bdmatrix.hh:151
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,575 +1,227 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-dependency.hh\n+bdmatrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_DEPENDENCY_HH\n-6#define DUNE_AMG_DEPENDENCY_HH\n+5#ifndef DUNE_ISTL_BDMATRIX_HH\n+6#define DUNE_ISTL_BDMATRIX_HH\n 7\n-8\n-9#include \n-10#include \n-11\n-12#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n-13#include \"_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b._\bh_\bh\"\n-14#include \n+8#include \n+9\n+10#include \n+11#include \n+12\n+13#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n 15\n-16\n-17namespace _\bD_\bu_\bn_\be\n-18{\n-19 namespace Amg\n-20 {\n-_\b3_\b8 class _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-39 {\n-40 friend std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs&\n-props);\n-41 public:\n-_\b4_\b3 enum {_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE, _\bD_\bE_\bP_\bE_\bN_\bD, _\bS_\bI_\bZ_\bE};\n-44\n-45 private:\n+21namespace _\bD_\bu_\bn_\be {\n+31 template >\n+_\b3_\b2 class _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx : public _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+33 {\n+34 public:\n+35\n+36 //===== type definitions and constants\n+37\n+_\b3_\b9 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n+40\n+_\b4_\b2 typedef B _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+43\n+_\b4_\b5 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n 46\n-47 std::bitset flags_;\n-48 public:\n-50 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs();\n-51\n-53 std::bitset::reference _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v);\n-54\n-56 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v) const;\n-57\n-63 bool _\bd_\be_\bp_\be_\bn_\bd_\bs() const;\n-64\n-69 void _\bs_\be_\bt_\bD_\be_\bp_\be_\bn_\bd_\bs();\n+48 //typedef BCRSMatrix::row_type row_type;\n+49\n+_\b5_\b1 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+52\n+_\b5_\b4 _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx() : _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx() {}\n+55\n+_\b5_\b6 explicit _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx(int size)\n+57 : _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx(size, size, _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx::_\br_\ba_\bn_\bd_\bo_\bm) {\n+58\n+59 for (int i=0; i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be(i, 1);\n+61\n+62 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs();\n+63\n+64 for (int i=0; i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i);\n+66\n+67 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs();\n+68\n+69 }\n 70\n-74 void _\br_\be_\bs_\be_\bt_\bD_\be_\bp_\be_\bn_\bd_\bs();\n-75\n-80 bool _\bi_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs() const;\n-81\n-85 void _\bs_\be_\bt_\bI_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs();\n+_\b7_\b2 _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx (std::initializer_list const &list)\n+73 : _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx(list.size())\n+74 {\n+75 size_t i=0;\n+76 for (auto it = list.begin(); it != list.end(); ++it, ++i)\n+77 (*this)[i][i] = *it;\n+78 }\n+79\n+_\b8_\b1 void _\bs_\be_\bt_\bS_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size)\n+82 {\n+83 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be(size, // rows\n+84 size, // columns\n+85 size); // nonzeros\n 86\n-90 void _\br_\be_\bs_\be_\bt_\bI_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs();\n+87 for (auto i : range(size))\n+88 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be(i, 1);\n+89\n+90 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs();\n 91\n-96 bool _\bi_\bs_\bO_\bn_\be_\bW_\ba_\by() const;\n+92 for (auto i : range(size))\n+93 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i);\n+94\n+95 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs();\n+96 }\n 97\n-102 bool _\bi_\bs_\bT_\bw_\bo_\bW_\ba_\by() const;\n+_\b9_\b9 _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx& other) {\n+100 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(other);\n+101 return *this;\n+102 }\n 103\n-108 bool _\bi_\bs_\bS_\bt_\br_\bo_\bn_\bg() const;\n+_\b1_\b0_\b5 _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k) {\n+106 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(k);\n+107 return *this;\n+108 }\n 109\n-113 void _\br_\be_\bs_\be_\bt();\n-114\n-_\b1_\b1_\b8 void _\bp_\br_\bi_\bn_\bt_\bF_\bl_\ba_\bg_\bs() const;\n-119 };\n-120\n-_\b1_\b2_\b6 class _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs {\n-127 friend std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs&\n-props);\n-128 public:\n-_\b1_\b2_\b9 enum { _\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD, _\bV_\bI_\bS_\bI_\bT_\bE_\bD, _\bF_\bR_\bO_\bN_\bT, _\bB_\bO_\bR_\bD_\bE_\bR, _\bS_\bI_\bZ_\bE };\n-130 private:\n-131\n-133 std::bitset flags_;\n-134\n-135 public:\n-137 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs();\n-138\n-140 std::bitset::reference _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v);\n-141\n-143 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v) const;\n-144\n-151 void _\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd();\n-152\n-156 bool _\bi_\bs_\bo_\bl_\ba_\bt_\be_\bd() const;\n-157\n-161 void _\br_\be_\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd();\n-162\n-166 void _\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd();\n-167\n-171 bool _\bv_\bi_\bs_\bi_\bt_\be_\bd() const;\n-172\n-176 void _\br_\be_\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd();\n-177\n-181 void _\bs_\be_\bt_\bF_\br_\bo_\bn_\bt();\n-182\n-186 bool _\bf_\br_\bo_\bn_\bt() const;\n-187\n-191 void _\br_\be_\bs_\be_\bt_\bF_\br_\bo_\bn_\bt();\n-192\n-196 void _\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br();\n-197\n-202 bool _\be_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br() const;\n-203\n-207 void _\br_\be_\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br();\n-208\n-212 void _\br_\be_\bs_\be_\bt();\n-213\n-214 };\n-215\n-216 template\n-_\b2_\b1_\b7 class _\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n-218 : public RAPropertyMapHelper::\n-reference,\n-219 PropertyGraphVertexPropertyMap >\n-220 {\n-221 public:\n-222\n-_\b2_\b2_\b3 typedef ReadWritePropertyMapTag _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n-224\n-225 enum {\n-227 _\bi_\bn_\bd_\be_\bx = i\n-_\b2_\b2_\b8 };\n-229\n-_\b2_\b3_\b3 typedef G _\bG_\br_\ba_\bp_\bh;\n-234\n-_\b2_\b3_\b8 typedef std::bitset _\bB_\bi_\bt_\bS_\be_\bt;\n-239\n-_\b2_\b4_\b3 typedef typename BitSet::reference _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-244\n-_\b2_\b4_\b8 typedef bool _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be;\n-249\n-_\b2_\b5_\b3 typedef typename G::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n-254\n-_\b2_\b5_\b9 _\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp(G& g)\n-260 : graph_(&g)\n-261 {}\n-262\n-_\b2_\b6_\b6 _\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp()\n-267 : graph_(0)\n-268 {}\n-269\n-270\n-_\b2_\b7_\b5 _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bV_\be_\br_\bt_\be_\bx& vertex) const\n-276 {\n-277 return graph_->getVertexProperties(vertex)[_\bi_\bn_\bd_\be_\bx];\n-278 }\n-279 private:\n-280 _\bG_\br_\ba_\bp_\bh* graph_;\n-281 };\n-282\n-283 } // end namespace Amg\n-284\n-285 template\n-_\b2_\b8_\b6 struct PropertyMapTypeSelector >\n-287 {\n-_\b2_\b8_\b8 typedef _\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b<_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\bG_\b,_\bA_\bm_\bg_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b,_\bE_\bP_\b,_\bV_\bM_\b,_\bE_\bM_\b>, Amg::VertexProperties::VISITED> _\bT_\by_\bp_\be;\n-289 };\n-290\n-291 template\n-292 typename PropertyMapTypeSelector >::Type\n-_\b2_\b9_\b3 _\bg_\be_\bt([[maybe_unused]] const _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg& tag, _\bA_\bm_\bg_\b:_\b:\n-_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\bG_\b,_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b,_\bE_\bP_\b,_\bV_\bM_\b,_\bE_\bM_\b>& graph)\n-294 {\n-295 return _\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b<_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\bG_\b,_\bA_\bm_\bg_\b:_\b:\n-_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b,_\bE_\bP_\b,_\bV_\bM_\b,_\bE_\bM_\b>, _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bV_\bI_\bS_\bI_\bT_\bE_\bD>(graph);\n-296 }\n-297\n-298 namespace Amg\n-299 {\n-_\b3_\b0_\b0 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs&\n-props)\n-301 {\n-302 return os << props.flags_;\n-303 }\n-304\n-_\b3_\b0_\b5 inline _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs()\n-306 : flags_()\n-307 {}\n-308\n-309 inline std::bitset::reference\n-_\b3_\b1_\b0 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v)\n-311 {\n-312 return flags_[v];\n-313 }\n-314\n-_\b3_\b1_\b5 inline bool _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t i) const\n-316 {\n-317 return flags_[i];\n-318 }\n-319\n-_\b3_\b2_\b0 inline void _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt()\n-321 {\n-322 flags_.reset();\n-323 }\n-324\n-_\b3_\b2_\b5 inline void _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs()\n-326 {\n-327 // Set the INFLUENCE bit\n-328 //flags_ |= (1<((1<<_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE)|(1<<_\bD_\bE_\bP_\bE_\bN_\bD)))==\n-(1<<_\bD_\bE_\bP_\bE_\bN_\bD);\n-369 }\n-370\n-_\b3_\b7_\b1 inline bool _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bT_\bw_\bo_\bW_\ba_\by() const\n-372 {\n-373 // Test whether the first and second bit is set\n-374 return ((flags_) & std::bitset((1<<_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE)|(1<<_\bD_\bE_\bP_\bE_\bN_\bD)))==(\n-(1<<_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE)|(1<<_\bD_\bE_\bP_\bE_\bN_\bD));\n-375 }\n-376\n-_\b3_\b7_\b7 inline bool _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bS_\bt_\br_\bo_\bn_\bg() const\n-378 {\n-379 // Test whether the first or second bit is set\n-380 return ((flags_) & std::bitset((1<<_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE)|(1<<_\bD_\bE_\bP_\bE_\bN_\bD))).to_ulong\n-();\n-381 }\n-382\n-383\n-_\b3_\b8_\b4 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs&\n-props)\n-385 {\n-386 return os << props.flags_;\n-387 }\n-388\n-_\b3_\b8_\b9 inline _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs()\n-390 : flags_()\n-391 {}\n-392\n-393\n-394 inline std::bitset::reference\n-_\b3_\b9_\b5 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v)\n-396 {\n-397 return flags_[v];\n-398 }\n-399\n-_\b4_\b0_\b0 inline bool _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v) const\n-401 {\n-402 return flags_[v];\n-403 }\n-404\n-_\b4_\b0_\b5 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd()\n-406 {\n-407 flags_.set(_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n-408 }\n-409\n-_\b4_\b1_\b0 inline bool _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bo_\bl_\ba_\bt_\be_\bd() const\n-411 {\n-412 return flags_.test(_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n-413 }\n-414\n-_\b4_\b1_\b5 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd()\n-416 {\n-417 flags_.reset(_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n-418 }\n-419\n-_\b4_\b2_\b0 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd()\n-421 {\n-422 flags_.set(_\bV_\bI_\bS_\bI_\bT_\bE_\bD);\n-423 }\n-424\n-_\b4_\b2_\b5 inline bool _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\be_\bd() const\n-426 {\n-427 return flags_.test(_\bV_\bI_\bS_\bI_\bT_\bE_\bD);\n-428 }\n-429\n-_\b4_\b3_\b0 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd()\n-431 {\n-432 flags_.reset(_\bV_\bI_\bS_\bI_\bT_\bE_\bD);\n-433 }\n-434\n-_\b4_\b3_\b5 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bF_\br_\bo_\bn_\bt()\n-436 {\n-437 flags_.set(_\bF_\bR_\bO_\bN_\bT);\n-438 }\n-439\n-_\b4_\b4_\b0 inline bool _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bf_\br_\bo_\bn_\bt() const\n-441 {\n-442 return flags_.test(_\bF_\bR_\bO_\bN_\bT);\n-443 }\n-444\n-_\b4_\b4_\b5 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bF_\br_\bo_\bn_\bt()\n-446 {\n-447 flags_.reset(_\bF_\bR_\bO_\bN_\bT);\n-448 }\n-449\n-_\b4_\b5_\b0 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br()\n-451 {\n-452 flags_.set(_\bB_\bO_\bR_\bD_\bE_\bR);\n-453 }\n-454\n-_\b4_\b5_\b5 inline bool _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\be_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br() const\n-456 {\n-457 return flags_.test(_\bB_\bO_\bR_\bD_\bE_\bR);\n-458 }\n-459\n-_\b4_\b6_\b0 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br()\n-461 {\n-462 flags_.reset(_\bB_\bO_\bR_\bD_\bE_\bR);\n-463 }\n-464\n-_\b4_\b6_\b5 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt()\n-466 {\n-467 flags_.reset();\n-468 }\n-469\n-471 }\n-472}\n-473#endif\n-_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\n-Provides classes for building the matrix graph.\n-_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b._\bh_\bh\n-Provides classes for handling internal properties in a graph.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bd_\be_\bp_\be_\bn_\bd_\bs\n-bool depends() const\n-Checks whether the vertex the edge points to depends on the vertex the edge\n-starts.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:352\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bF_\br_\bo_\bn_\bt\n-void resetFront()\n-Resets the front node flag.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:445\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt\n-std::bitset< VertexProperties::SIZE > BitSet\n-The type of the bitset.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:238\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bo_\bl_\ba_\bt_\be_\bd\n-bool isolated() const\n-Checks whether the node is isolated.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:410\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n-bool ValueType\n-The value type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:248\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-friend std::ostream & operator<<(std::ostream &os, const VertexProperties\n-&props)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:384\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-BitSet::reference Reference\n-The reference type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:243\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bT_\bw_\bo_\bW_\ba_\by\n-bool isTwoWay() const\n-Checks whether the edge is two way. I.e. both the influence flag and the\n-depends flag are that.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:371\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs\n-void setInfluences()\n-Marks the edge as one of which the start vertex by the end vertex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:325\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-VertexProperties()\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:389\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bD_\be_\bp_\be_\bn_\bd_\bs\n-void setDepends()\n-Marks the edge as one of which the end point depends on the starting point.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:338\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n-PropertyGraphVertexPropertyMap()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:266\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n-PropertyGraphVertexPropertyMap(G &g)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:259\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n-G::VertexDescriptor Vertex\n-The vertex descriptor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:253\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br\n-void resetExcludedBorder()\n-Marks the vertex as included in the aggregation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:460\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bF_\br_\bo_\bn_\bt\n-void setFront()\n-Marks the node as belonging to the current clusters front.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:435\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt\n-void reset()\n-Reset all flags.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:465\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd\n-void setVisited()\n-Mark the node as already visited.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:420\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-EdgeProperties()\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:305\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bI_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs\n-void resetInfluences()\n-Resets the influence flag.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:358\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bG_\br_\ba_\bp_\bh\n-G Graph\n-The type of the graph with internal properties.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:233\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-std::bitset< SIZE >::reference operator[](std::size_t v)\n-Access the bits directly.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:395\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bF_\bl_\ba_\bg_\bs\n-void printFlags() const\n-Prints the attributes of the edge for debugging.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-friend std::ostream & operator<<(std::ostream &os, const EdgeProperties &props)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:300\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\by_\bp_\be_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg_\b,_\b _\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,\n-_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b,_\b _\bE_\bP_\b,_\b _\bV_\bM_\b,_\b _\bE_\bM_\b _\b>_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n-Amg::PropertyGraphVertexPropertyMap< Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM >, Amg::VertexProperties::VISITED > Type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:288\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs\n-bool influences() const\n-Checks whether the start vertex is influenced by the end vertex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:332\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n-void setIsolated()\n-Marks that node as being isolated.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:405\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\be_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br\n-bool excludedBorder() const\n-Tests whether the vertex is excluded from the aggregation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:455\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd\n-void resetVisited()\n-Resets the visited flag.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:430\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\be_\bd\n-bool visited() const\n-Checks whether the node is marked as visited.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:425\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-Reference operator[](const Vertex &vertex) const\n-Get the properties associated to a vertex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:275\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt\n-void reset()\n-Reset all flags.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:320\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bD_\be_\bp_\be_\bn_\bd_\bs\n-void resetDepends()\n-Resets the depends flag.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:345\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-ReadWritePropertyMapTag Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:223\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n-void resetIsolated()\n-Resets the isolated flag.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:415\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T >\n-&criterion)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bS_\bt_\br_\bo_\bn_\bg\n-bool isStrong() const\n-Checks whether the edge is strong. I.e. the influence or depends flag is set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:377\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bf_\br_\bo_\bn_\bt\n-bool front() const\n-Checks whether the node is marked as a front node.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:440\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-std::bitset< SIZE >::reference operator[](std::size_t v)\n-Access the bits directly.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:310\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br\n-void setExcludedBorder()\n-Marks the vertex as excluded from the aggregation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:450\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bO_\bn_\be_\bW_\ba_\by\n-bool isOneWay() const\n-Checks whether the edge is one way. I.e. either the influence or the depends\n-flag but is set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:364\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bi_\bn_\bd_\be_\bx\n-@ index\n-the index to access in the bitset.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:227\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bV_\bI_\bS_\bI_\bT_\bE_\bD\n-@ VISITED\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:129\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD\n-@ ISOLATED\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:129\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bS_\bI_\bZ_\bE\n-@ SIZE\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:129\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bB_\bO_\bR_\bD_\bE_\bR\n-@ BORDER\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:129\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bF_\bR_\bO_\bN_\bT\n-@ FRONT\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:129\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bD_\bE_\bP_\bE_\bN_\bD\n-@ DEPEND\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bS_\bI_\bZ_\bE\n-@ SIZE\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE\n-@ INFLUENCE\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:43\n+115 template \n+_\b1_\b1_\b6 void _\bs_\bo_\bl_\bv_\be (V& x, const V& rhs) const {\n+117 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i_\bN(); i++)\n+118 {\n+119 auto&& xv = Impl::asVector(x[i]);\n+120 auto&& rhsv = Impl::asVector(rhs[i]);\n+121 Impl::asMatrix((*this)[i][i]).solve(xv,rhsv);\n+122 }\n+123 }\n+124\n+_\b1_\b2_\b6 void _\bi_\bn_\bv_\be_\br_\bt() {\n+127 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i_\bN(); i++)\n+128 Impl::asMatrix((*this)[i][i])._\bi_\bn_\bv_\be_\br_\bt();\n+129 }\n+130\n+131 private:\n+132\n+133 // ////////////////////////////////////////////////////////////////////////\n+////\n+134 // The following methods from the base class should now actually be called\n+135 // ////////////////////////////////////////////////////////////////////////\n+////\n+136\n+137 // createbegin and createend should be in there, too, but I can't get it to\n+compile\n+138 // BCRSMatrix::CreateIterator createbegin () {}\n+139 // BCRSMatrix::CreateIterator createend () {}\n+140 void setrowsize (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s) {}\n+141 void incrementrowsize (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) {}\n+142 void endrowsizes () {}\n+143 void addindex (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl) {}\n+144 void endindices () {}\n+145 };\n+146\n+147 template\n+_\b1_\b4_\b8 struct FieldTraits< _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx >\n+149 {\n+_\b1_\b5_\b0 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\b _\bA_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b1_\b5_\b1 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename FieldTraits::real_type;\n+152 };\n+155} // end namespace Dune\n+156\n+157#endif\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n+_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n+Helper functions for determining the vector/matrix block level.\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-Class representing the properties of an edge in the matrix graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n-Class representing a node in the matrix graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:220\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n-Attaches properties to the edges and vertices of a graph.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:978\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n-Tag idnetifying the visited property of a vertex.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs\n+void endrowsizes()\n+indicate that size of all rows is defined\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1146\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\ba_\bn_\bd_\bo_\bm\n+@ random\n+Build entries randomly.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:526\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs\n+void endindices()\n+indicate that all indices are defined, check consistency\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1269\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+size_type N() const\n+number of rows (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n+void setSize(size_type rows, size_type columns, size_type nnz=0)\n+Set the size of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:858\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+BCRSMatrix & operator=(const BCRSMatrix &Mat)\n+assignment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:908\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx\n+A block-diagonal matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< B >::field_type field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+implement row_type with compressed vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx\n+BDMatrix()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx\n+BDMatrix(std::initializer_list< B > const &list)\n+Construct from a std::initializer_list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+B block_type\n+export the type representing the components\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:42\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bo_\bl_\bv_\be\n+void solve(V &x, const V &rhs) const\n+Solve the system Ax=b in O(n) time.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n+A allocator_type\n+export the allocator type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx\n+BDMatrix(int size)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+BDMatrix & operator=(const BDMatrix &other)\n+assignment\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:99\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n+void setSize(size_type size)\n+Resize the matrix. Invalidates the content!\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt\n+void invert()\n+Inverts the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename BDMatrix< B, A >::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+typename FieldTraits< field_type >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:151\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00146.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00146.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: amg.hh File Reference\n+dune-istl: ldl.hh File Reference\n \n \n \n \n \n \n \n@@ -65,79 +65,71 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n \n
    \n \n-

    The AMG preconditioner. \n+

    Class for using LDL with ISTL matrices. \n More...

    \n-
    #include <memory>
    \n-#include <sstream>
    \n+
    #include <iostream>
    \n+#include <memory>
    \n+#include <type_traits>
    \n #include <dune/common/exceptions.hh>
    \n-#include <dune/istl/paamg/smoother.hh>
    \n-#include <dune/istl/paamg/transfer.hh>
    \n-#include <dune/istl/paamg/matrixhierarchy.hh>
    \n-#include <dune/istl/solvers.hh>
    \n-#include <dune/istl/scalarproducts.hh>
    \n-#include <dune/istl/superlu.hh>
    \n-#include <dune/istl/umfpack.hh>
    \n-#include <dune/istl/solvertype.hh>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/scalarvectorview.hh>
    \n-#include <dune/common/scalarmatrixview.hh>
    \n-#include <dune/common/parametertree.hh>
    \n+#include <dune/istl/bccsmatrixinitializer.hh>
    \n+#include <dune/istl/solvers.hh>
    \n+#include <dune/istl/solvertype.hh>
    \n+#include <dune/istl/solverfactory.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n+\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n

    \n Classes

    class  Dune::Amg::AMG< M, X, S, PI, A >
     Parallel algebraic multigrid based on agglomeration. More...
    class  Dune::LDL< Matrix >
     Use the LDL package to directly solve linear systems – empty default class. More...
     
    struct  Dune::Amg::DirectSolverSelector< Matrix, Vector >
    class  Dune::LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > >
     The LDL direct sparse solver for matrices of type BCRSMatrix. More...
     
    struct  Dune::Amg::DirectSolverSelector< Matrix, Vector >::Solver< M, SolverType >
    struct  Dune::IsDirectSolver< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > >
     
    struct  Dune::Amg::DirectSolverSelector< Matrix, Vector >::Solver< M, superlu >
    struct  Dune::StoresColumnCompressed< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > >
     
    struct  Dune::AMGCreator
    struct  Dune::LDLCreator
     
    struct  Dune::AMGCreator::isValidBlockType< class >
    struct  Dune::LDLCreator::isValidBlock< F >
     
    struct  Dune::AMGCreator::isValidBlockType< FieldMatrix< T, n, m > >
    struct  Dune::LDLCreator::isValidBlock< FieldVector< double, k > >
     
    \n \n \n \n-\n-\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n \n-\n-\n+\n+\n

    \n Functions

     Dune::DUNE_REGISTER_PRECONDITIONER ("amg", AMGCreator())
     
     Dune::DUNE_REGISTER_DIRECT_SOLVER ("ldl", Dune::LDLCreator())
     
    \n

    Detailed Description

    \n-

    The AMG preconditioner.

    \n-
    Author
    Markus Blatt
    \n+

    Class for using LDL with ISTL matrices.

    \n+
    Author
    Marco Agnese, Andrea Sacconi
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,60 +1,50 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-amg.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n-The AMG preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n+ldl.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b)\n+Class for using LDL with ISTL matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n #include \n-#include \n+#include \n #include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-#include \n-#include \n-#include \n-#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bS_\b,_\b _\bP_\bI_\b,_\b _\bA_\b _\b>\n-\u00a0 Parallel algebraic multigrid based on agglomeration. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\b>\n+\u00a0 Use the LDL package to directly solve linear systems \u2013 empty default\n+ class. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0 The LDL direct sparse solver for matrices of type _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\b>_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,\n- _\bS_\bo_\bl_\bv_\be_\br_\bT_\by_\bp_\be_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\b>_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bs_\bu_\bp_\be_\br_\bl_\bu\n- _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\b _\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,\n+ _\bA_\b _\b>_\b _\b>_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be_\b<_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b,_\b _\bk_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n-\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR (\"amg\", _\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br())\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"ldl\", _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br())\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-The AMG preconditioner.\n+Class for using LDL with ISTL matrices.\n Author\n- Markus Blatt\n+ Marco Agnese, Andrea Sacconi\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00146_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00146_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: amg.hh Source File\n+dune-istl: ldl.hh Source File\n \n \n \n \n \n \n \n@@ -70,1279 +70,435 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • \n
    \n \n
    \n-
    amg.hh
    \n+
    ldl.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_AMG_AMG_HH
    \n-
    6#define DUNE_AMG_AMG_HH
    \n+
    5#ifndef DUNE_ISTL_LDL_HH
    \n+
    6#define DUNE_ISTL_LDL_HH
    \n
    7
    \n-
    8#include <memory>
    \n-
    9#include <sstream>
    \n-
    10#include <dune/common/exceptions.hh>
    \n-\n-\n-\n-
    14#include <dune/istl/solvers.hh>
    \n-\n-
    16#include <dune/istl/superlu.hh>
    \n-
    17#include <dune/istl/umfpack.hh>
    \n-\n-
    19#include <dune/common/typetraits.hh>
    \n-
    20#include <dune/common/exceptions.hh>
    \n-
    21#include <dune/common/scalarvectorview.hh>
    \n-
    22#include <dune/common/scalarmatrixview.hh>
    \n-
    23#include <dune/common/parametertree.hh>
    \n-
    24
    \n-
    25namespace Dune
    \n-
    26{
    \n-
    27 namespace Amg
    \n-
    28 {
    \n-
    46 template<class M, class X, class S, class P, class K, class A>
    \n-
    47 class KAMG;
    \n-
    48
    \n-
    49 template<class T>
    \n-
    50 class KAmgTwoGrid;
    \n-
    51
    \n-
    62 template<class M, class X, class S, class PI=SequentialInformation,
    \n-
    63 class A=std::allocator<X> >
    \n-
    \n-
    64 class AMG : public Preconditioner<X,X>
    \n-
    65 {
    \n-
    66 template<class M1, class X1, class S1, class P1, class K1, class A1>
    \n-
    67 friend class KAMG;
    \n-
    68
    \n-
    69 friend class KAmgTwoGrid<AMG>;
    \n-
    70
    \n-
    71 public:
    \n-
    73 typedef M Operator;
    \n-\n-\n-\n-
    85
    \n-
    87 typedef X Domain;
    \n-
    89 typedef X Range;
    \n-\n-
    97 typedef S Smoother;
    \n-
    98
    \n-\n-
    101
    \n-
    \n-
    111 AMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
    \n-
    112 const SmootherArgs& smootherArgs, const Parameters& parms);
    \n-
    113
    \n-
    125 template<class C>
    \n-
    \n-
    126 AMG(const Operator& fineOperator, const C& criterion,
    \n-
    127 const SmootherArgs& smootherArgs=SmootherArgs(),
    \n-\n-
    129
    \n-
    \n-
    180 AMG(std::shared_ptr<const Operator> fineOperator, const ParameterTree& configuration, const ParallelInformation& pinfo=ParallelInformation());
    \n-
    181
    \n-
    \n-
    185 AMG(const AMG& amg);
    \n-
    186
    \n-
    \n-
    188 void pre(Domain& x, Range& b);
    \n-
    189
    \n-
    \n-
    191 void apply(Domain& v, const Range& d);
    \n-
    192
    \n-
    \n-\n-
    195 {
    \n-
    196 return category_;
    \n-
    197 }
    \n-
    \n-
    198
    \n-
    \n-
    200 void post(Domain& x);
    \n-
    201
    \n-
    206 template<class A1>
    \n+
    8#if HAVE_SUITESPARSE_LDL || defined DOXYGEN
    \n+
    9
    \n+
    10#include <iostream>
    \n+
    11#include <memory>
    \n+
    12#include <type_traits>
    \n+
    13
    \n+
    14#ifdef __cplusplus
    \n+
    15extern "C"
    \n+
    16{
    \n+
    17#include <ldl.h>
    \n+
    18#include <amd.h>
    \n+
    19}
    \n+
    20#endif
    \n+
    21
    \n+
    22#include <dune/common/exceptions.hh>
    \n+
    23
    \n+\n+
    25#include <dune/istl/solvers.hh>
    \n+\n+\n+
    28
    \n+
    29namespace Dune {
    \n+
    41 // forward declarations
    \n+
    42 template<class M, class T, class TM, class TD, class TA>
    \n+
    43 class SeqOverlappingSchwarz;
    \n+
    44
    \n+
    45 template<class T, bool tag>
    \n+
    46 struct SeqOverlappingSchwarzAssemblerHelper;
    \n+
    47
    \n+
    54 template<class Matrix>
    \n+
    \n+
    55 class LDL
    \n+
    56 {};
    \n+
    \n+
    57
    \n+
    71 template<typename T, typename A, int n, int m>
    \n+
    \n+
    72 class LDL<BCRSMatrix<FieldMatrix<T,n,m>,A > >
    \n+
    73 : public InverseOperator<BlockVector<FieldVector<T,m>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > >,
    \n+
    74 BlockVector<FieldVector<T,n>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > > >
    \n+
    75 {
    \n+
    76 public:
    \n+\n+\n+
    81 typedef Dune::ISTL::Impl::BCCSMatrix<T,int> LDLMatrix;
    \n+
    83 typedef ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<FieldMatrix<T,n,m>,A>, int> MatrixInitializer;
    \n+
    85 typedef Dune::BlockVector<FieldVector<T,m>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > > domain_type;
    \n+
    87 typedef Dune::BlockVector<FieldVector<T,n>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > > range_type;
    \n+
    88
    \n+
    \n+\n+
    91 {
    \n+\n+
    93 }
    \n+
    \n+
    94
    \n+
    \n+
    104 LDL(const Matrix& matrix, int verbose=0) : matrixIsLoaded_(false), verbose_(verbose)
    \n+
    105 {
    \n+
    106 //check whether T is a supported type
    \n+
    107 static_assert(std::is_same<T,double>::value,"Unsupported Type in LDL (only double supported)");
    \n+
    108 setMatrix(matrix);
    \n+
    109 }
    \n+
    \n+
    110
    \n+
    \n+
    120 LDL(const Matrix& matrix, int verbose, bool) : matrixIsLoaded_(false), verbose_(verbose)
    \n+
    121 {
    \n+
    122 //check whether T is a supported type
    \n+
    123 static_assert(std::is_same<T,double>::value,"Unsupported Type in LDL (only double supported)");
    \n+
    124 setMatrix(matrix);
    \n+
    125 }
    \n+
    \n+
    126
    \n+
    \n+
    136 LDL(const Matrix& matrix, const ParameterTree& config)
    \n+
    137 : LDL(matrix, config.get<int>("verbose", 0))
    \n+
    138 {}
    \n+
    \n+
    139
    \n+
    \n+
    141 LDL() : matrixIsLoaded_(false), verbose_(0)
    \n+
    142 {}
    \n+
    \n+
    143
    \n+
    \n+
    145 virtual ~LDL()
    \n+
    146 {
    \n+
    147 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)
    \n+
    148 free();
    \n+
    149 }
    \n+
    \n+
    150
    \n+
    \n+\n+
    153 {
    \n+
    154 const int dimMat(ldlMatrix_.N());
    \n+
    155 ldl_perm(dimMat, Y_, reinterpret_cast<double*>(&b[0]), P_);
    \n+
    156 ldl_lsolve(dimMat, Y_, Lp_, Li_, Lx_);
    \n+
    157 ldl_dsolve(dimMat, Y_, D_);
    \n+
    158 ldl_ltsolve(dimMat, Y_, Lp_, Li_, Lx_);
    \n+
    159 ldl_permt(dimMat, reinterpret_cast<double*>(&x[0]), Y_, P_);
    \n+
    160 // this is a direct solver
    \n+
    161 res.iterations = 1;
    \n+
    162 res.converged = true;
    \n+
    163 }
    \n+
    \n+
    164
    \n+
    \n+
    166 virtual void apply(domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
    \n+
    167 {
    \n+
    168 apply(x,b,res);
    \n+
    169 }
    \n+
    \n+
    170
    \n+
    \n+
    176 void apply(T* x, T* b)
    \n+
    177 {
    \n+
    178 const int dimMat(ldlMatrix_.N());
    \n+
    179 ldl_perm(dimMat, Y_, b, P_);
    \n+
    180 ldl_lsolve(dimMat, Y_, Lp_, Li_, Lx_);
    \n+
    181 ldl_dsolve(dimMat, Y_, D_);
    \n+
    182 ldl_ltsolve(dimMat, Y_, Lp_, Li_, Lx_);
    \n+
    183 ldl_permt(dimMat, x, Y_, P_);
    \n+
    184 }
    \n+
    \n+
    185
    \n+
    \n+
    186 void setOption([[maybe_unused]] unsigned int option, [[maybe_unused]] double value)
    \n+
    187 {}
    \n+
    \n+
    188
    \n+
    \n+
    190 void setMatrix(const Matrix& matrix)
    \n+
    191 {
    \n+
    192 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)
    \n+
    193 free();
    \n+
    194
    \n+
    195 if (ldlMatrix_.N() + ldlMatrix_.M() + ldlMatrix_.nonzeroes() != 0)
    \n+
    196 ldlMatrix_.free();
    \n+
    197 ldlMatrix_.setSize(MatrixDimension<Matrix>::rowdim(matrix),
    \n+\n+
    199 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(ldlMatrix_);
    \n+
    200
    \n+
    201 copyToBCCSMatrix(initializer, matrix);
    \n+
    202
    \n+
    203 decompose();
    \n+
    204 }
    \n+
    \n+
    205
    \n+
    206 template<class S>
    \n
    \n-
    207 void getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont);
    \n-
    208
    \n-
    \n-
    209 std::size_t levels();
    \n-
    210
    \n-
    \n-
    211 std::size_t maxlevels();
    \n-
    212
    \n-
    \n-\n-
    222 {
    \n-
    223 matrices_->recalculateGalerkin(NegateSet<typename PI::OwnerSet>());
    \n-
    224 }
    \n-
    \n-
    225
    \n-
    \n-\n-
    231
    \n-
    232 private:
    \n-
    233 /*
    \n-
    234 * @brief Helper function to create hierarchies with parameter tree.
    \n-
    235 *
    \n-
    236 * Will create the coarsen criterion with the norm and create the
    \n-
    237 * Hierarchies
    \n-
    238 * \\tparam Norm Type of the norm to use.
    \n-
    239 */
    \n-
    240 template<class Norm>
    \n-
    241 void createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr,
    \n-
    242 const PI& pinfo, const Norm&,
    \n-
    243 const ParameterTree& configuration,
    \n-
    244 std::true_type compiles = std::true_type());
    \n-
    245 template<class Norm>
    \n-
    246 void createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr,
    \n-
    247 const PI& pinfo, const Norm&,
    \n-
    248 const ParameterTree& configuration,
    \n-
    249 std::false_type);
    \n-
    254 template<class C>
    \n-
    255 void createHierarchies(C& criterion, std::shared_ptr<const Operator> matrixptr,
    \n-
    256 const PI& pinfo, const ParameterTree& configuration);
    \n-
    263 template<class C>
    \n-
    264 void createHierarchies(C& criterion,
    \n-
    265 const std::shared_ptr<const Operator>& matrixptr,
    \n-
    266 const PI& pinfo);
    \n-
    273 struct LevelContext
    \n-
    274 {
    \n-\n-\n-
    283 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix;
    \n-\n-
    291 typename OperatorHierarchy::RedistributeInfoList::const_iterator redist;
    \n-
    295 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates;
    \n-\n-\n-\n-
    311 std::size_t level;
    \n-
    312 };
    \n-
    313
    \n-
    314
    \n-
    319 void mgc(LevelContext& levelContext);
    \n-
    320
    \n-
    321 void additiveMgc();
    \n-
    322
    \n-
    329 void moveToFineLevel(LevelContext& levelContext,bool processedFineLevel);
    \n-
    330
    \n-
    335 bool moveToCoarseLevel(LevelContext& levelContext);
    \n-
    336
    \n-
    341 void initIteratorsWithFineLevel(LevelContext& levelContext);
    \n-
    342
    \n-
    344 std::shared_ptr<OperatorHierarchy> matrices_;
    \n-
    346 SmootherArgs smootherArgs_;
    \n-
    348 std::shared_ptr<Hierarchy<Smoother,A> > smoothers_;
    \n-
    350 std::shared_ptr<CoarseSolver> solver_;
    \n-
    352 std::shared_ptr<Hierarchy<Range,A>> rhs_;
    \n-
    354 std::shared_ptr<Hierarchy<Domain,A>> lhs_;
    \n-
    356 std::shared_ptr<Hierarchy<Domain,A>> update_;
    \n-\n-
    360 std::shared_ptr<ScalarProduct> scalarProduct_;
    \n-
    362 std::size_t gamma_;
    \n-
    364 std::size_t preSteps_;
    \n-
    366 std::size_t postSteps_;
    \n-
    367 bool buildHierarchy_;
    \n-
    368 bool additive;
    \n-
    369 bool coarsesolverconverged;
    \n-
    370 std::shared_ptr<Smoother> coarseSmoother_;
    \n-
    372 SolverCategory::Category category_;
    \n-
    374 std::size_t verbosity_;
    \n-
    375
    \n-
    376 struct ToLower
    \n-
    377 {
    \n-
    \n-
    378 std::string operator()(const std::string& str)
    \n-
    379 {
    \n-
    380 std::stringstream retval;
    \n-
    381 std::ostream_iterator<char> out(retval);
    \n-
    382 std::transform(str.begin(), str.end(), out,
    \n-
    383 [](char c){
    \n-
    384 return std::tolower(c, std::locale::classic());
    \n-
    385 });
    \n-
    386 return retval.str();
    \n-
    387 }
    \n-
    \n-
    388 };
    \n-
    389 };
    \n-
    390
    \n-
    391 template<class M, class X, class S, class PI, class A>
    \n+
    207 void setSubMatrix(const Matrix& matrix, const S& rowIndexSet)
    \n+
    208 {
    \n+
    209 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)
    \n+
    210 free();
    \n+
    211
    \n+
    212 if (ldlMatrix_.N() + ldlMatrix_.M() + ldlMatrix_.nonzeroes() != 0)
    \n+
    213 ldlMatrix_.free();
    \n+
    214
    \n+
    215 ldlMatrix_.setSize(rowIndexSet.size()*MatrixDimension<Matrix>::rowdim(matrix) / matrix.N(),
    \n+
    216 rowIndexSet.size()*MatrixDimension<Matrix>::coldim(matrix) / matrix.M());
    \n+
    217 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(ldlMatrix_);
    \n+
    218
    \n+
    219 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(matrix,rowIndexSet));
    \n+
    220
    \n+
    221 decompose();
    \n+
    222 }
    \n+
    \n+
    223
    \n+
    \n+
    228 inline void setVerbosity(int v)
    \n+
    229 {
    \n+
    230 verbose_=v;
    \n+
    231 }
    \n+
    \n+
    232
    \n+
    \n+\n+
    238 {
    \n+
    239 return ldlMatrix_;
    \n+
    240 }
    \n+
    \n+
    241
    \n+
    \n+
    246 void free()
    \n+
    247 {
    \n+
    248 delete [] D_;
    \n+
    249 delete [] Y_;
    \n+
    250 delete [] Lp_;
    \n+
    251 delete [] Lx_;
    \n+
    252 delete [] Li_;
    \n+
    253 delete [] P_;
    \n+
    254 delete [] Pinv_;
    \n+
    255 ldlMatrix_.free();
    \n+
    256 matrixIsLoaded_ = false;
    \n+
    257 }
    \n+
    \n+
    258
    \n+
    \n+
    260 inline const char* name()
    \n+
    261 {
    \n+
    262 return "LDL";
    \n+
    263 }
    \n+
    \n+
    264
    \n+
    \n+
    269 inline double* getD()
    \n+
    270 {
    \n+
    271 return D_;
    \n+
    272 }
    \n+
    \n+
    273
    \n+
    \n+
    278 inline int* getLp()
    \n+
    279 {
    \n+
    280 return Lp_;
    \n+
    281 }
    \n+
    \n+
    282
    \n+
    \n+
    287 inline int* getLi()
    \n+
    288 {
    \n+
    289 return Li_;
    \n+
    290 }
    \n+
    \n+
    291
    \n+
    \n+
    296 inline double* getLx()
    \n+
    297 {
    \n+
    298 return Lx_;
    \n+
    299 }
    \n+
    \n+
    300
    \n+
    301 private:
    \n+
    302 template<class M,class X, class TM, class TD, class T1>
    \n+\n+
    304
    \n+\n+
    306
    \n+
    308 void decompose()
    \n+
    309 {
    \n+
    310 // allocate vectors
    \n+
    311 const int dimMat(ldlMatrix_.N());
    \n+
    312 D_ = new double [dimMat];
    \n+
    313 Y_ = new double [dimMat];
    \n+
    314 Lp_ = new int [dimMat + 1];
    \n+
    315 Parent_ = new int [dimMat];
    \n+
    316 Lnz_ = new int [dimMat];
    \n+
    317 Flag_ = new int [dimMat];
    \n+
    318 Pattern_ = new int [dimMat];
    \n+
    319 P_ = new int [dimMat];
    \n+
    320 Pinv_ = new int [dimMat];
    \n+
    321
    \n+
    322 double Info [AMD_INFO];
    \n+
    323 if(amd_order (dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(), P_, (double *) NULL, Info) < AMD_OK)
    \n+
    324 DUNE_THROW(InvalidStateException,"Error: AMD failed!");
    \n+
    325 if(verbose_ > 0)
    \n+
    326 amd_info (Info);
    \n+
    327 // compute the symbolic factorisation
    \n+
    328 ldl_symbolic(dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(), Lp_, Parent_, Lnz_, Flag_, P_, Pinv_);
    \n+
    329 // initialise those entries of additionalVectors_ whose dimension is known only now
    \n+
    330 Lx_ = new double [Lp_[dimMat]];
    \n+
    331 Li_ = new int [Lp_[dimMat]];
    \n+
    332 // compute the numeric factorisation
    \n+
    333 const int rank(ldl_numeric(dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(), ldlMatrix_.getValues(),
    \n+
    334 Lp_, Parent_, Lnz_, Li_, Lx_, D_, Y_, Pattern_, Flag_, P_, Pinv_));
    \n+
    335 // free temporary vectors
    \n+
    336 delete [] Flag_;
    \n+
    337 delete [] Pattern_;
    \n+
    338 delete [] Parent_;
    \n+
    339 delete [] Lnz_;
    \n+
    340
    \n+
    341 if(rank!=dimMat)
    \n+
    342 DUNE_THROW(InvalidStateException,"Error: LDL factorisation failed!");
    \n+
    343 }
    \n+
    344
    \n+
    345 LDLMatrix ldlMatrix_;
    \n+
    346 bool matrixIsLoaded_;
    \n+
    347 int verbose_;
    \n+
    348 int* Lp_;
    \n+
    349 int* Parent_;
    \n+
    350 int* Lnz_;
    \n+
    351 int* Flag_;
    \n+
    352 int* Pattern_;
    \n+
    353 int* P_;
    \n+
    354 int* Pinv_;
    \n+
    355 double* D_;
    \n+
    356 double* Y_;
    \n+
    357 double* Lx_;
    \n+
    358 int* Li_;
    \n+
    359 };
    \n+
    \n+
    360
    \n+
    361 template<typename T, typename A, int n, int m>
    \n+
    \n+\n+
    363 {
    \n+
    364 enum {value = true};
    \n+
    365 };
    \n+
    \n+
    366
    \n+
    367 template<typename T, typename A, int n, int m>
    \n+
    \n+\n+
    369 {
    \n+
    370 enum {value = true};
    \n+
    371 };
    \n+
    \n+
    372
    \n+
    \n+
    373 struct LDLCreator {
    \n+
    374 template<class F> struct isValidBlock : std::false_type{};
    \n+
    375 template<int k> struct isValidBlock<FieldVector<double,k>> : std::true_type{};
    \n+
    376
    \n+
    377 template<typename TL, typename M>
    \n+
    378 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n+
    379 typename Dune::TypeListElement<2, TL>::type>>
    \n+
    \n+
    380 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
    \n+
    381 std::enable_if_t<
    \n+
    382 isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n+
    383 {
    \n+
    384 int verbose = config.get("verbose", 0);
    \n+
    385 return std::make_shared<Dune::LDL<M>>(mat,verbose);
    \n+
    386 }
    \n+
    \n+
    387
    \n+
    388 // second version with SFINAE to validate the template parameters of LDL
    \n+
    389 template<typename TL, typename M>
    \n+
    390 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n+
    391 typename Dune::TypeListElement<2, TL>::type>>
    \n
    \n-
    392 inline AMG<M,X,S,PI,A>::AMG(const AMG& amg)
    \n-
    393 : matrices_(amg.matrices_), smootherArgs_(amg.smootherArgs_),
    \n-
    394 smoothers_(amg.smoothers_), solver_(amg.solver_),
    \n-
    395 rhs_(), lhs_(), update_(),
    \n-
    396 scalarProduct_(amg.scalarProduct_), gamma_(amg.gamma_),
    \n-
    397 preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),
    \n-
    398 buildHierarchy_(amg.buildHierarchy_),
    \n-
    399 additive(amg.additive), coarsesolverconverged(amg.coarsesolverconverged),
    \n-
    400 coarseSmoother_(amg.coarseSmoother_),
    \n-
    401 category_(amg.category_),
    \n-
    402 verbosity_(amg.verbosity_)
    \n-
    403 {}
    \n-
    \n+
    392 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
    \n+
    393 std::enable_if_t<
    \n+
    394 !isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n+
    395 {
    \n+
    396 DUNE_THROW(UnsupportedType,
    \n+
    397 "Unsupported Type in LDL (only double and std::complex<double> supported)");
    \n+
    398 }
    \n+
    \n+
    399 };
    \n+
    \n+\n+
    401
    \n+
    402} // end namespace Dune
    \n+
    403
    \n
    404
    \n-
    405 template<class M, class X, class S, class PI, class A>
    \n-
    \n-\n-
    407 const SmootherArgs& smootherArgs,
    \n-
    408 const Parameters& parms)
    \n-
    409 : matrices_(stackobject_to_shared_ptr(matrices)), smootherArgs_(smootherArgs),
    \n-
    410 smoothers_(new Hierarchy<Smoother,A>), solver_(&coarseSolver),
    \n-
    411 rhs_(), lhs_(), update_(), scalarProduct_(0),
    \n-
    412 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),
    \n-
    413 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),
    \n-
    414 additive(parms.getAdditive()), coarsesolverconverged(true),
    \n-
    415 coarseSmoother_(),
    \n-
    416// #warning should category be retrieved from matrices?
    \n-
    417 category_(SolverCategory::category(*smoothers_->coarsest())),
    \n-
    418 verbosity_(parms.debugLevel())
    \n-
    419 {
    \n-
    420 assert(matrices_->isBuilt());
    \n-
    421
    \n-
    422 // build the necessary smoother hierarchies
    \n-
    423 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);
    \n-
    424 }
    \n-
    \n-
    425
    \n-
    426 template<class M, class X, class S, class PI, class A>
    \n-
    427 template<class C>
    \n-
    \n-\n-
    429 const C& criterion,
    \n-
    430 const SmootherArgs& smootherArgs,
    \n-
    431 const PI& pinfo)
    \n-
    432 : smootherArgs_(smootherArgs),
    \n-
    433 smoothers_(new Hierarchy<Smoother,A>), solver_(),
    \n-
    434 rhs_(), lhs_(), update_(), scalarProduct_(),
    \n-
    435 gamma_(criterion.getGamma()), preSteps_(criterion.getNoPreSmoothSteps()),
    \n-
    436 postSteps_(criterion.getNoPostSmoothSteps()), buildHierarchy_(true),
    \n-
    437 additive(criterion.getAdditive()), coarsesolverconverged(true),
    \n-
    438 coarseSmoother_(),
    \n-
    439 category_(SolverCategory::category(pinfo)),
    \n-
    440 verbosity_(criterion.debugLevel())
    \n-
    441 {
    \n-\n-
    443 DUNE_THROW(InvalidSolverCategory, "Matrix and Communication must have the same SolverCategory!");
    \n-
    444 // TODO: reestablish compile time checks.
    \n-
    445 //static_assert(static_cast<int>(PI::category)==static_cast<int>(S::category),
    \n-
    446 // "Matrix and Solver must match in terms of category!");
    \n-
    447 auto matrixptr = stackobject_to_shared_ptr(matrix);
    \n-
    448 createHierarchies(criterion, matrixptr, pinfo);
    \n-
    449 }
    \n-
    \n-
    450
    \n-
    451 template<class M, class X, class S, class PI, class A>
    \n-
    \n-
    452 AMG<M,X,S,PI,A>::AMG(std::shared_ptr<const Operator> matrixptr,
    \n-
    453 const ParameterTree& configuration,
    \n-
    454 const ParallelInformation& pinfo) :
    \n-
    455 smoothers_(new Hierarchy<Smoother,A>),
    \n-
    456 solver_(), rhs_(), lhs_(), update_(), scalarProduct_(), buildHierarchy_(true),
    \n-
    457 coarsesolverconverged(true), coarseSmoother_(),
    \n-
    458 category_(SolverCategory::category(pinfo))
    \n-
    459 {
    \n-
    460
    \n-
    461 if (configuration.hasKey ("smootherIterations"))
    \n-
    462 smootherArgs_.iterations = configuration.get<int>("smootherIterations");
    \n-
    463
    \n-
    464 if (configuration.hasKey ("smootherRelaxation"))
    \n-
    465 smootherArgs_.relaxationFactor = configuration.get<typename SmootherArgs::RelaxationFactor>("smootherRelaxation");
    \n-
    466
    \n-
    467 auto normName = ToLower()(configuration.get("strengthMeasure", "diagonal"));
    \n-
    468 auto index = configuration.get<int>("diagonalRowIndex", 0);
    \n-
    469
    \n-
    470 if ( normName == "diagonal")
    \n-
    471 {
    \n-
    472 using field_type = typename M::field_type;
    \n-
    473 using real_type = typename FieldTraits<field_type>::real_type;
    \n-
    474 std::is_convertible<field_type, real_type> compiles;
    \n-
    475
    \n-
    476 switch (index)
    \n-
    477 {
    \n-
    478 case 0:
    \n-
    479 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<0>(), configuration, compiles);
    \n-
    480 break;
    \n-
    481 case 1:
    \n-
    482 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<1>(), configuration, compiles);
    \n-
    483 break;
    \n-
    484 case 2:
    \n-
    485 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<2>(), configuration, compiles);
    \n-
    486 break;
    \n-
    487 case 3:
    \n-
    488 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<3>(), configuration, compiles);
    \n-
    489 break;
    \n-
    490 case 4:
    \n-
    491 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<4>(), configuration, compiles);
    \n-
    492 break;
    \n-
    493 default:
    \n-
    494 DUNE_THROW(InvalidStateException, "Currently strengthIndex>4 is not supported.");
    \n-
    495 }
    \n-
    496 }
    \n-
    497 else if (normName == "rowsum")
    \n-
    498 createCriterionAndHierarchies(matrixptr, pinfo, RowSum(), configuration);
    \n-
    499 else if (normName == "frobenius")
    \n-
    500 createCriterionAndHierarchies(matrixptr, pinfo, FrobeniusNorm(), configuration);
    \n-
    501 else if (normName == "one")
    \n-
    502 createCriterionAndHierarchies(matrixptr, pinfo, AlwaysOneNorm(), configuration);
    \n-
    503 else
    \n-
    504 DUNE_THROW(Dune::NotImplemented, "Wrong config file: strengthMeasure "<<normName<<" is not supported by AMG");
    \n-
    505 }
    \n-
    \n-
    506
    \n-
    507 template<class M, class X, class S, class PI, class A>
    \n-
    508 template<class Norm>
    \n-
    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)
    \n-
    510 {
    \n-
    511 DUNE_THROW(InvalidStateException, "Strength of connection measure does not support this type ("
    \n-
    512 << className<typename M::field_type>() << ") as it is lacking a conversion to"
    \n-
    513 << className<typename FieldTraits<typename M::field_type>::real_type>() << ".");
    \n-
    514 }
    \n-
    515
    \n-
    516 template<class M, class X, class S, class PI, class A>
    \n-
    517 template<class Norm>
    \n-
    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)
    \n-
    519 {
    \n-
    520 if (configuration.get<bool>("criterionSymmetric", true))
    \n-
    521 {
    \n-
    522 using Criterion = Dune::Amg::CoarsenCriterion<
    \n-\n-
    524 Criterion criterion;
    \n-
    525 createHierarchies(criterion, matrixptr, pinfo, configuration);
    \n-
    526 }
    \n-
    527 else
    \n-
    528 {
    \n-
    529 using Criterion = Dune::Amg::CoarsenCriterion<
    \n-\n-
    531 Criterion criterion;
    \n-
    532 createHierarchies(criterion, matrixptr, pinfo, configuration);
    \n-
    533 }
    \n-
    534 }
    \n-
    535
    \n-
    536 template<class M, class X, class S, class PI, class A>
    \n-
    537 template<class C>
    \n-
    538 void AMG<M,X,S,PI,A>::createHierarchies(C& criterion, std::shared_ptr<const Operator> matrixptr, const PI& pinfo, const ParameterTree& configuration)
    \n-
    539 {
    \n-
    540 if (configuration.hasKey ("maxLevel"))
    \n-
    541 criterion.setMaxLevel(configuration.get<int>("maxLevel"));
    \n-
    542
    \n-
    543 if (configuration.hasKey ("minCoarseningRate"))
    \n-
    544 criterion.setMinCoarsenRate(configuration.get<int>("minCoarseningRate"));
    \n-
    545
    \n-
    546 if (configuration.hasKey ("coarsenTarget"))
    \n-
    547 criterion.setCoarsenTarget (configuration.get<int>("coarsenTarget"));
    \n-
    548
    \n-
    549 if (configuration.hasKey ("accumulationMode"))
    \n-
    550 {
    \n-
    551 std::string mode = ToLower()(configuration.get<std::string>("accumulationMode"));
    \n-
    552 if ( mode == "none")
    \n-
    553 criterion.setAccumulate(AccumulationMode::noAccu);
    \n-
    554 else if ( mode == "atonce" )
    \n-
    555 criterion.setAccumulate(AccumulationMode::atOnceAccu);
    \n-
    556 else if ( mode == "successive")
    \n-
    557 criterion.setCoarsenTarget (AccumulationMode::successiveAccu);
    \n-
    558 else
    \n-
    559 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode does not allow value "
    \n-
    560 << mode <<".");
    \n-
    561 }
    \n-
    562
    \n-
    563 if (configuration.hasKey ("prolongationDampingFactor"))
    \n-
    564 criterion.setProlongationDampingFactor (configuration.get<double>("prolongationDampingFactor"));
    \n-
    565
    \n-
    566 if (configuration.hasKey("defaultAggregationSizeMode"))
    \n-
    567 {
    \n-
    568 auto mode = ToLower()(configuration.get<std::string>("defaultAggregationSizeMode"));
    \n-
    569 auto dim = configuration.get<std::size_t>("defaultAggregationDimension");
    \n-
    570 std::size_t maxDistance = 2;
    \n-
    571 if (configuration.hasKey("MaxAggregateDistance"))
    \n-
    572 maxDistance = configuration.get<std::size_t>("maxAggregateDistance");
    \n-
    573 if (mode == "isotropic")
    \n-
    574 criterion.setDefaultValuesIsotropic(dim, maxDistance);
    \n-
    575 else if(mode == "anisotropic")
    \n-
    576 criterion.setDefaultValuesAnisotropic(dim, maxDistance);
    \n-
    577 else
    \n-
    578 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode does not allow value "
    \n-
    579 << mode <<".");
    \n-
    580 }
    \n-
    581
    \n-
    582 if (configuration.hasKey("maxAggregateDistance"))
    \n-
    583 criterion.setMaxDistance(configuration.get<std::size_t>("maxAggregateDistance"));
    \n-
    584
    \n-
    585 if (configuration.hasKey("minAggregateSize"))
    \n-
    586 criterion.setMinAggregateSize(configuration.get<std::size_t>("minAggregateSize"));
    \n-
    587
    \n-
    588 if (configuration.hasKey("maxAggregateSize"))
    \n-
    589 criterion.setMaxAggregateSize(configuration.get<std::size_t>("maxAggregateSize"));
    \n-
    590
    \n-
    591 if (configuration.hasKey("maxAggregateConnectivity"))
    \n-
    592 criterion.setMaxConnectivity(configuration.get<std::size_t>("maxAggregateConnectivity"));
    \n-
    593
    \n-
    594 if (configuration.hasKey ("alpha"))
    \n-
    595 criterion.setAlpha (configuration.get<double> ("alpha"));
    \n-
    596
    \n-
    597 if (configuration.hasKey ("beta"))
    \n-
    598 criterion.setBeta (configuration.get<double> ("beta"));
    \n-
    599
    \n-
    600 if (configuration.hasKey ("gamma"))
    \n-
    601 criterion.setGamma (configuration.get<std::size_t> ("gamma"));
    \n-
    602 gamma_ = criterion.getGamma();
    \n-
    603
    \n-
    604 if (configuration.hasKey ("additive"))
    \n-
    605 criterion.setAdditive (configuration.get<bool>("additive"));
    \n-
    606 additive = criterion.getAdditive();
    \n-
    607
    \n-
    608 if (configuration.hasKey ("preSteps"))
    \n-
    609 criterion.setNoPreSmoothSteps (configuration.get<std::size_t> ("preSteps"));
    \n-
    610 preSteps_ = criterion.getNoPreSmoothSteps ();
    \n-
    611
    \n-
    612 if (configuration.hasKey ("postSteps"))
    \n-
    613 criterion.setNoPostSmoothSteps (configuration.get<std::size_t> ("postSteps"));
    \n-
    614 postSteps_ = criterion.getNoPostSmoothSteps ();
    \n-
    615
    \n-
    616 verbosity_ = configuration.get("verbosity", 0);
    \n-
    617 criterion.setDebugLevel (verbosity_);
    \n-
    618
    \n-
    619 createHierarchies(criterion, matrixptr, pinfo);
    \n-
    620 }
    \n-
    621
    \n-
    622 template <class Matrix,
    \n-
    623 class Vector>
    \n-
    \n-\n-
    625 {
    \n-
    626 typedef typename Matrix :: field_type field_type;
    \n-\n-
    628
    \n-
    629 static constexpr SolverType solver =
    \n-
    630#if DISABLE_AMG_DIRECTSOLVER
    \n-
    631 none;
    \n-
    632#elif HAVE_SUITESPARSE_UMFPACK
    \n-\n-
    634#elif HAVE_SUPERLU
    \n-
    635 superlu ;
    \n-
    636#else
    \n-
    637 none;
    \n-
    638#endif
    \n-
    639
    \n-
    640 template <class M, SolverType>
    \n-
    \n-
    641 struct Solver
    \n-
    642 {
    \n-\n-
    \n-
    644 static type* create(const M& mat, bool verbose, bool reusevector )
    \n-
    645 {
    \n-
    646 DUNE_THROW(NotImplemented,"DirectSolver not selected");
    \n-
    647 return nullptr;
    \n-
    648 }
    \n-
    \n-
    649 static std::string name () { return "None"; }
    \n-
    650 };
    \n-
    \n-
    651#if HAVE_SUITESPARSE_UMFPACK
    \n-
    652 template <class M>
    \n-
    653 struct Solver< M, umfpack >
    \n-
    654 {
    \n-
    655 typedef UMFPack< M > type;
    \n-
    656 static type* create(const M& mat, bool verbose, bool reusevector )
    \n-
    657 {
    \n-
    658 return new type(mat, verbose, reusevector );
    \n-
    659 }
    \n-
    660 static std::string name () { return "UMFPack"; }
    \n-
    661 };
    \n-
    662#endif
    \n-
    663#if HAVE_SUPERLU
    \n-
    664 template <class M>
    \n-
    \n-
    665 struct Solver< M, superlu >
    \n-
    666 {
    \n-\n-
    \n-
    668 static type* create(const M& mat, bool verbose, bool reusevector )
    \n-
    669 {
    \n-
    670 return new type(mat, verbose, reusevector );
    \n-
    671 }
    \n-
    \n-
    672 static std::string name () { return "SuperLU"; }
    \n-
    673 };
    \n-
    \n-
    674#endif
    \n-
    675
    \n-
    676 // define direct solver type to be used
    \n-\n-
    678 typedef typename SelectedSolver :: type DirectSolver;
    \n-
    679 static constexpr bool isDirectSolver = solver != none;
    \n-
    680 static std::string name() { return SelectedSolver :: name (); }
    \n-
    \n-
    681 static DirectSolver* create(const Matrix& mat, bool verbose, bool reusevector )
    \n-
    682 {
    \n-
    683 return SelectedSolver :: create( mat, verbose, reusevector );
    \n-
    684 }
    \n-
    \n-
    685 };
    \n-
    \n-
    686
    \n-
    687 template<class M, class X, class S, class PI, class A>
    \n-
    688 template<class C>
    \n-
    689 void AMG<M,X,S,PI,A>::createHierarchies(C& criterion,
    \n-
    690 const std::shared_ptr<const Operator>& matrixptr,
    \n-
    691 const PI& pinfo)
    \n-
    692 {
    \n-
    693 Timer watch;
    \n-
    694 matrices_ = std::make_shared<OperatorHierarchy>(
    \n-
    695 std::const_pointer_cast<Operator>(matrixptr),
    \n-
    696 stackobject_to_shared_ptr(const_cast<PI&>(pinfo)));
    \n-
    697
    \n-
    698 matrices_->template build<NegateSet<typename PI::OwnerSet> >(criterion);
    \n-
    699
    \n-
    700 // build the necessary smoother hierarchies
    \n-
    701 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);
    \n-
    702
    \n-
    703 // test whether we should solve on the coarse level. That is the case if we
    \n-
    704 // have that level and if there was a redistribution on this level then our
    \n-
    705 // communicator has to be valid (size()>0) as the smoother might try to communicate
    \n-
    706 // in the constructor.
    \n-
    707 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels()
    \n-
    708 && ( ! matrices_->redistributeInformation().back().isSetup() ||
    \n-
    709 matrices_->parallelInformation().coarsest().getRedistributed().communicator().size() ) )
    \n-
    710 {
    \n-
    711 // We have the carsest level. Create the coarse Solver
    \n-
    712 SmootherArgs sargs(smootherArgs_);
    \n-
    713 sargs.iterations = 1;
    \n-
    714
    \n-\n-
    716 cargs.setArgs(sargs);
    \n-
    717 if(matrices_->redistributeInformation().back().isSetup()) {
    \n-
    718 // Solve on the redistributed partitioning
    \n-
    719 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat());
    \n-
    720 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed());
    \n-
    721 }else{
    \n-
    722 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());
    \n-
    723 cargs.setComm(*matrices_->parallelInformation().coarsest());
    \n-
    724 }
    \n-
    725
    \n-
    726 coarseSmoother_ = ConstructionTraits<Smoother>::construct(cargs);
    \n-
    727 scalarProduct_ = createScalarProduct<X>(cargs.getComm(),category());
    \n-
    728
    \n-
    729 typedef DirectSolverSelector< typename M::matrix_type, X > SolverSelector;
    \n-
    730
    \n-
    731 // Use superlu if we are purely sequential or with only one processor on the coarsest level.
    \n-
    732 if( SolverSelector::isDirectSolver &&
    \n-
    733 (std::is_same<ParallelInformation,SequentialInformation>::value // sequential mode
    \n-
    734 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //parallel mode and only one processor
    \n-
    735 || (matrices_->parallelInformation().coarsest().isRedistributed()
    \n-
    736 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()==1
    \n-
    737 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()>0) )
    \n-
    738 )
    \n-
    739 { // redistribute and 1 proc
    \n-
    740 if(matrices_->parallelInformation().coarsest().isRedistributed())
    \n-
    741 {
    \n-
    742 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
    \n-
    743 {
    \n-
    744 // We are still participating on this level
    \n-
    745 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest().getRedistributed().getmat(), false, false));
    \n-
    746 }
    \n-
    747 else
    \n-
    748 solver_.reset();
    \n-
    749 }
    \n-
    750 else
    \n-
    751 {
    \n-
    752 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest()->getmat(), false, false));
    \n-
    753 }
    \n-
    754 if(verbosity_>0 && matrices_->parallelInformation().coarsest()->communicator().rank()==0)
    \n-
    755 std::cout<< "Using a direct coarse solver (" << SolverSelector::name() << ")" << std::endl;
    \n-
    756 }
    \n-
    757 else
    \n-
    758 {
    \n-
    759 if(matrices_->parallelInformation().coarsest().isRedistributed())
    \n-
    760 {
    \n-
    761 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
    \n-
    762 // We are still participating on this level
    \n-
    763
    \n-
    764 // we have to allocate these types using the rebound allocator
    \n-
    765 // in order to ensure that we fulfill the alignment requirements
    \n-
    766 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(matrices_->matrices().coarsest().getRedistributed()),
    \n-
    767 *scalarProduct_,
    \n-
    768 *coarseSmoother_, 1E-2, 1000, 0));
    \n-
    769 else
    \n-
    770 solver_.reset();
    \n-
    771 }else
    \n-
    772 {
    \n-
    773 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(*matrices_->matrices().coarsest()),
    \n-
    774 *scalarProduct_,
    \n-
    775 *coarseSmoother_, 1E-2, 1000, 0));
    \n-
    776 // // we have to allocate these types using the rebound allocator
    \n-
    777 // // in order to ensure that we fulfill the alignment requirements
    \n-
    778 // using Alloc = typename std::allocator_traits<A>::template rebind_alloc<BiCGSTABSolver<X>>;
    \n-
    779 // Alloc alloc;
    \n-
    780 // auto p = alloc.allocate(1);
    \n-
    781 // std::allocator_traits<Alloc>::construct(alloc, p,
    \n-
    782 // const_cast<M&>(*matrices_->matrices().coarsest()),
    \n-
    783 // *scalarProduct_,
    \n-
    784 // *coarseSmoother_, 1E-2, 1000, 0);
    \n-
    785 // solver_.reset(p,[](BiCGSTABSolver<X>* p){
    \n-
    786 // Alloc alloc;
    \n-
    787 // std::allocator_traits<Alloc>::destroy(alloc, p);
    \n-
    788 // alloc.deallocate(p,1);
    \n-
    789 // });
    \n-
    790 }
    \n-
    791 }
    \n-
    792 }
    \n-
    793
    \n-
    794 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
    \n-
    795 std::cout<<"Building hierarchy of "<<matrices_->maxlevels()<<" levels "
    \n-
    796 <<"(including coarse solver) took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n-
    797 }
    \n-
    798
    \n-
    799
    \n-
    800 template<class M, class X, class S, class PI, class A>
    \n-
    \n-\n-
    802 {
    \n-
    803 // Detect Matrix rows where all offdiagonal entries are
    \n-
    804 // zero and set x such that A_dd*x_d=b_d
    \n-
    805 // Thus users can be more careless when setting up their linear
    \n-
    806 // systems.
    \n-
    807 typedef typename M::matrix_type Matrix;
    \n-
    808 typedef typename Matrix::ConstRowIterator RowIter;
    \n-
    809 typedef typename Matrix::ConstColIterator ColIter;
    \n-
    810 typedef typename Matrix::block_type Block;
    \n-
    811 Block zero;
    \n-
    812 zero=typename Matrix::field_type();
    \n-
    813
    \n-
    814 const Matrix& mat=matrices_->matrices().finest()->getmat();
    \n-
    815 for(RowIter row=mat.begin(); row!=mat.end(); ++row) {
    \n-
    816 bool isDirichlet = true;
    \n-
    817 bool hasDiagonal = false;
    \n-
    818 Block diagonal{};
    \n-
    819 for(ColIter col=row->begin(); col!=row->end(); ++col) {
    \n-
    820 if(row.index()==col.index()) {
    \n-
    821 diagonal = *col;
    \n-
    822 hasDiagonal = true;
    \n-
    823 }else{
    \n-
    824 if(*col!=zero)
    \n-
    825 isDirichlet = false;
    \n-
    826 }
    \n-
    827 }
    \n-
    828 if(isDirichlet && hasDiagonal)
    \n-
    829 {
    \n-
    830 auto&& xEntry = Impl::asVector(x[row.index()]);
    \n-
    831 auto&& bEntry = Impl::asVector(b[row.index()]);
    \n-
    832 Impl::asMatrix(diagonal).solve(xEntry, bEntry);
    \n-
    833 }
    \n-
    834 }
    \n-
    835
    \n-
    836 if(smoothers_->levels()>0)
    \n-
    837 smoothers_->finest()->pre(x,b);
    \n-
    838 else
    \n-
    839 // No smoother to make x consistent! Do it by hand
    \n-
    840 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x);
    \n-
    841 rhs_ = std::make_shared<Hierarchy<Range,A>>(std::make_shared<Range>(b));
    \n-
    842 lhs_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
    \n-
    843 update_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
    \n-
    844 matrices_->coarsenVector(*rhs_);
    \n-
    845 matrices_->coarsenVector(*lhs_);
    \n-
    846 matrices_->coarsenVector(*update_);
    \n-
    847
    \n-
    848 // Preprocess all smoothers
    \n-
    849 typedef typename Hierarchy<Smoother,A>::Iterator Iterator;
    \n-
    850 typedef typename Hierarchy<Range,A>::Iterator RIterator;
    \n-
    851 typedef typename Hierarchy<Domain,A>::Iterator DIterator;
    \n-
    852 Iterator coarsest = smoothers_->coarsest();
    \n-
    853 Iterator smoother = smoothers_->finest();
    \n-
    854 RIterator rhs = rhs_->finest();
    \n-
    855 DIterator lhs = lhs_->finest();
    \n-
    856 if(smoothers_->levels()>1) {
    \n-
    857
    \n-
    858 assert(lhs_->levels()==rhs_->levels());
    \n-
    859 assert(smoothers_->levels()==lhs_->levels() || matrices_->levels()==matrices_->maxlevels());
    \n-
    860 assert(smoothers_->levels()+1==lhs_->levels() || matrices_->levels()<matrices_->maxlevels());
    \n-
    861
    \n-
    862 if(smoother!=coarsest)
    \n-
    863 for(++smoother, ++lhs, ++rhs; smoother != coarsest; ++smoother, ++lhs, ++rhs)
    \n-
    864 smoother->pre(*lhs,*rhs);
    \n-
    865 smoother->pre(*lhs,*rhs);
    \n-
    866 }
    \n-
    867
    \n-
    868
    \n-
    869 // The preconditioner might change x and b. So we have to
    \n-
    870 // copy the changes to the original vectors.
    \n-
    871 x = *lhs_->finest();
    \n-
    872 b = *rhs_->finest();
    \n-
    873
    \n-
    874 }
    \n-
    \n-
    875 template<class M, class X, class S, class PI, class A>
    \n-
    \n-\n-
    877 {
    \n-
    878 return matrices_->levels();
    \n-
    879 }
    \n-
    \n-
    880 template<class M, class X, class S, class PI, class A>
    \n-
    \n-\n-
    882 {
    \n-
    883 return matrices_->maxlevels();
    \n-
    884 }
    \n-
    \n-
    885
    \n-
    887 template<class M, class X, class S, class PI, class A>
    \n-
    \n-\n-
    889 {
    \n-
    890 LevelContext levelContext;
    \n-
    891
    \n-
    892 if(additive) {
    \n-
    893 *(rhs_->finest())=d;
    \n-
    894 additiveMgc();
    \n-
    895 v=*lhs_->finest();
    \n-
    896 }else{
    \n-
    897 // Init all iterators for the current level
    \n-
    898 initIteratorsWithFineLevel(levelContext);
    \n-
    899
    \n-
    900
    \n-
    901 *levelContext.lhs = v;
    \n-
    902 *levelContext.rhs = d;
    \n-
    903 *levelContext.update=0;
    \n-
    904 levelContext.level=0;
    \n-
    905
    \n-
    906 mgc(levelContext);
    \n-
    907
    \n-
    908 if(postSteps_==0||matrices_->maxlevels()==1)
    \n-
    909 levelContext.pinfo->copyOwnerToAll(*levelContext.update, *levelContext.update);
    \n-
    910
    \n-
    911 v=*levelContext.update;
    \n-
    912 }
    \n-
    913
    \n-
    914 }
    \n-
    \n-
    915
    \n-
    916 template<class M, class X, class S, class PI, class A>
    \n-
    917 void AMG<M,X,S,PI,A>::initIteratorsWithFineLevel(LevelContext& levelContext)
    \n-
    918 {
    \n-
    919 levelContext.smoother = smoothers_->finest();
    \n-
    920 levelContext.matrix = matrices_->matrices().finest();
    \n-
    921 levelContext.pinfo = matrices_->parallelInformation().finest();
    \n-
    922 levelContext.redist =
    \n-
    923 matrices_->redistributeInformation().begin();
    \n-
    924 levelContext.aggregates = matrices_->aggregatesMaps().begin();
    \n-
    925 levelContext.lhs = lhs_->finest();
    \n-
    926 levelContext.update = update_->finest();
    \n-
    927 levelContext.rhs = rhs_->finest();
    \n-
    928 }
    \n-
    929
    \n-
    930 template<class M, class X, class S, class PI, class A>
    \n-
    931 bool AMG<M,X,S,PI,A>
    \n-
    932 ::moveToCoarseLevel(LevelContext& levelContext)
    \n-
    933 {
    \n-
    934
    \n-
    935 bool processNextLevel=true;
    \n-
    936
    \n-
    937 if(levelContext.redist->isSetup()) {
    \n-
    938 levelContext.redist->redistribute(static_cast<const Range&>(*levelContext.rhs),
    \n-
    939 levelContext.rhs.getRedistributed());
    \n-
    940 processNextLevel = levelContext.rhs.getRedistributed().size()>0;
    \n-
    941 if(processNextLevel) {
    \n-
    942 //restrict defect to coarse level right hand side.
    \n-
    943 typename Hierarchy<Range,A>::Iterator fineRhs = levelContext.rhs++;
    \n-
    944 ++levelContext.pinfo;
    \n-
    945 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n-
    946 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
    \n-
    947 static_cast<const Range&>(fineRhs.getRedistributed()),
    \n-
    948 *levelContext.pinfo);
    \n-
    949 }
    \n-
    950 }else{
    \n-
    951 //restrict defect to coarse level right hand side.
    \n-
    952 typename Hierarchy<Range,A>::Iterator fineRhs = levelContext.rhs++;
    \n-
    953 ++levelContext.pinfo;
    \n-
    954 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n-
    955 ::restrictVector(*(*levelContext.aggregates),
    \n-
    956 *levelContext.rhs, static_cast<const Range&>(*fineRhs),
    \n-
    957 *levelContext.pinfo);
    \n-
    958 }
    \n-
    959
    \n-
    960 if(processNextLevel) {
    \n-
    961 // prepare coarse system
    \n-
    962 ++levelContext.lhs;
    \n-
    963 ++levelContext.update;
    \n-
    964 ++levelContext.matrix;
    \n-
    965 ++levelContext.level;
    \n-
    966 ++levelContext.redist;
    \n-
    967
    \n-
    968 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
    \n-
    969 // next level is not the globally coarsest one
    \n-
    970 ++levelContext.smoother;
    \n-
    971 ++levelContext.aggregates;
    \n-
    972 }
    \n-
    973 // prepare the update on the next level
    \n-
    974 *levelContext.update=0;
    \n-
    975 }
    \n-
    976 return processNextLevel;
    \n-
    977 }
    \n-
    978
    \n-
    979 template<class M, class X, class S, class PI, class A>
    \n-
    980 void AMG<M,X,S,PI,A>
    \n-
    981 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel)
    \n-
    982 {
    \n-
    983 if(processNextLevel) {
    \n-
    984 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
    \n-
    985 // previous level is not the globally coarsest one
    \n-
    986 --levelContext.smoother;
    \n-
    987 --levelContext.aggregates;
    \n-
    988 }
    \n-
    989 --levelContext.redist;
    \n-
    990 --levelContext.level;
    \n-
    991 //prolongate and add the correction (update is in coarse left hand side)
    \n-
    992 --levelContext.matrix;
    \n-
    993
    \n-
    994 //typename Hierarchy<Domain,A>::Iterator coarseLhs = lhs--;
    \n-
    995 --levelContext.lhs;
    \n-
    996 --levelContext.pinfo;
    \n-
    997 }
    \n-
    998 if(levelContext.redist->isSetup()) {
    \n-
    999 // Need to redistribute during prolongateVector
    \n-
    1000 levelContext.lhs.getRedistributed()=0;
    \n-
    1001 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n-
    1002 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, *levelContext.lhs,
    \n-
    1003 levelContext.lhs.getRedistributed(),
    \n-
    1004 matrices_->getProlongationDampingFactor(),
    \n-
    1005 *levelContext.pinfo, *levelContext.redist);
    \n-
    1006 }else{
    \n-
    1007 *levelContext.lhs=0;
    \n-
    1008 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n-
    1009 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, *levelContext.lhs,
    \n-
    1010 matrices_->getProlongationDampingFactor(),
    \n-
    1011 *levelContext.pinfo);
    \n-
    1012 }
    \n-
    1013
    \n-
    1014
    \n-
    1015 if(processNextLevel) {
    \n-
    1016 --levelContext.update;
    \n-
    1017 --levelContext.rhs;
    \n-
    1018 }
    \n-
    1019
    \n-
    1020 *levelContext.update += *levelContext.lhs;
    \n-
    1021 }
    \n-
    1022
    \n-
    1023 template<class M, class X, class S, class PI, class A>
    \n-
    \n-\n-
    1025 {
    \n-\n-
    1027 }
    \n-
    \n-
    \n-
    1028
    \n-
    1029 template<class M, class X, class S, class PI, class A>
    \n-
    1030 void AMG<M,X,S,PI,A>::mgc(LevelContext& levelContext){
    \n-
    1031 if(levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels()) {
    \n-
    1032 // Solve directly
    \n-\n-
    1034 res.converged=true; // If we do not compute this flag will not get updated
    \n-
    1035 if(levelContext.redist->isSetup()) {
    \n-
    1036 levelContext.redist->redistribute(*levelContext.rhs, levelContext.rhs.getRedistributed());
    \n-
    1037 if(levelContext.rhs.getRedistributed().size()>0) {
    \n-
    1038 // We are still participating in the computation
    \n-
    1039 levelContext.pinfo.getRedistributed().copyOwnerToAll(levelContext.rhs.getRedistributed(),
    \n-
    1040 levelContext.rhs.getRedistributed());
    \n-
    1041 solver_->apply(levelContext.update.getRedistributed(),
    \n-
    1042 levelContext.rhs.getRedistributed(), res);
    \n-
    1043 }
    \n-
    1044 levelContext.redist->redistributeBackward(*levelContext.update, levelContext.update.getRedistributed());
    \n-
    1045 levelContext.pinfo->copyOwnerToAll(*levelContext.update, *levelContext.update);
    \n-
    1046 }else{
    \n-
    1047 levelContext.pinfo->copyOwnerToAll(*levelContext.rhs, *levelContext.rhs);
    \n-
    1048 solver_->apply(*levelContext.update, *levelContext.rhs, res);
    \n-
    1049 }
    \n-
    1050
    \n-
    1051 if (!res.converged)
    \n-
    1052 coarsesolverconverged = false;
    \n-
    1053 }else{
    \n-
    1054 // presmoothing
    \n-
    1055 presmooth(levelContext, preSteps_);
    \n-
    1056
    \n-
    1057#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
    \n-
    1058 bool processNextLevel = moveToCoarseLevel(levelContext);
    \n-
    1059
    \n-
    1060 if(processNextLevel) {
    \n-
    1061 // next level
    \n-
    1062 for(std::size_t i=0; i<gamma_; i++){
    \n-
    1063 mgc(levelContext);
    \n-
    1064 if (levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels())
    \n-
    1065 break;
    \n-
    1066 if(i+1 < gamma_){
    \n-
    1067 levelContext.matrix->applyscaleadd(-1., *levelContext.lhs, *levelContext.rhs);
    \n-
    1068 }
    \n-
    1069 }
    \n-
    1070 }
    \n-
    1071
    \n-
    1072 moveToFineLevel(levelContext, processNextLevel);
    \n-
    1073#else
    \n-
    1074 *lhs=0;
    \n-
    1075#endif
    \n-
    1076
    \n-
    1077 if(levelContext.matrix == matrices_->matrices().finest()) {
    \n-
    1078 coarsesolverconverged = matrices_->parallelInformation().finest()->communicator().prod(coarsesolverconverged);
    \n-
    1079 if(!coarsesolverconverged)
    \n-
    1080 DUNE_THROW(MathError, "Coarse solver did not converge");
    \n-
    1081 }
    \n-
    1082 // postsmoothing
    \n-
    1083 postsmooth(levelContext, postSteps_);
    \n-
    1084
    \n-
    1085 }
    \n-
    1086 }
    \n-
    1087
    \n-
    1088 template<class M, class X, class S, class PI, class A>
    \n-
    1089 void AMG<M,X,S,PI,A>::additiveMgc(){
    \n-
    1090
    \n-
    1091 // restrict residual to all levels
    \n-
    1092 typename ParallelInformationHierarchy::Iterator pinfo=matrices_->parallelInformation().finest();
    \n-
    1093 typename Hierarchy<Range,A>::Iterator rhs=rhs_->finest();
    \n-
    1094 typename Hierarchy<Domain,A>::Iterator lhs = lhs_->finest();
    \n-
    1095 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates=matrices_->aggregatesMaps().begin();
    \n-
    1096
    \n-
    1097 for(typename Hierarchy<Range,A>::Iterator fineRhs=rhs++; fineRhs != rhs_->coarsest(); fineRhs=rhs++, ++aggregates) {
    \n-
    1098 ++pinfo;
    \n-
    1099 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n-
    1100 ::restrictVector(*(*aggregates), *rhs, static_cast<const Range&>(*fineRhs), *pinfo);
    \n-
    1101 }
    \n-
    1102
    \n-
    1103 // pinfo is invalid, set to coarsest level
    \n-
    1104 //pinfo = matrices_->parallelInformation().coarsest
    \n-
    1105 // calculate correction for all levels
    \n-
    1106 lhs = lhs_->finest();
    \n-
    1107 typename Hierarchy<Smoother,A>::Iterator smoother = smoothers_->finest();
    \n-
    1108
    \n-
    1109 for(rhs=rhs_->finest(); rhs != rhs_->coarsest(); ++lhs, ++rhs, ++smoother) {
    \n-
    1110 // presmoothing
    \n-
    1111 *lhs=0;
    \n-
    1112 smoother->apply(*lhs, *rhs);
    \n-
    1113 }
    \n-
    1114
    \n-
    1115 // Coarse level solve
    \n-
    1116#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
    \n-
    1117 InverseOperatorResult res;
    \n-
    1118 pinfo->copyOwnerToAll(*rhs, *rhs);
    \n-
    1119 solver_->apply(*lhs, *rhs, res);
    \n-
    1120
    \n-
    1121 if(!res.converged)
    \n-
    1122 DUNE_THROW(MathError, "Coarse solver did not converge");
    \n-
    1123#else
    \n-
    1124 *lhs=0;
    \n-
    1125#endif
    \n-
    1126 // Prologate and add up corrections from all levels
    \n-
    1127 --pinfo;
    \n-
    1128 --aggregates;
    \n-
    1129
    \n-
    1130 for(typename Hierarchy<Domain,A>::Iterator coarseLhs = lhs--; coarseLhs != lhs_->finest(); coarseLhs = lhs--, --aggregates, --pinfo) {
    \n-
    1131 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n-
    1132 ::prolongateVector(*(*aggregates), *coarseLhs, *lhs, 1.0, *pinfo);
    \n-
    1133 }
    \n-
    1134 }
    \n-
    1135
    \n-
    1136
    \n-
    1138 template<class M, class X, class S, class PI, class A>
    \n-
    \n-
    1139 void AMG<M,X,S,PI,A>::post([[maybe_unused]] Domain& x)
    \n-
    1140 {
    \n-
    1141 // Postprocess all smoothers
    \n-
    1142 typedef typename Hierarchy<Smoother,A>::Iterator Iterator;
    \n-
    1143 typedef typename Hierarchy<Domain,A>::Iterator DIterator;
    \n-
    1144 Iterator coarsest = smoothers_->coarsest();
    \n-
    1145 Iterator smoother = smoothers_->finest();
    \n-
    1146 DIterator lhs = lhs_->finest();
    \n-
    1147 if(smoothers_->levels()>0) {
    \n-
    1148 if(smoother != coarsest || matrices_->levels()<matrices_->maxlevels())
    \n-
    1149 smoother->post(*lhs);
    \n-
    1150 if(smoother!=coarsest)
    \n-
    1151 for(++smoother, ++lhs; smoother != coarsest; ++smoother, ++lhs)
    \n-
    1152 smoother->post(*lhs);
    \n-
    1153 smoother->post(*lhs);
    \n-
    1154 }
    \n-
    1155 lhs_ = nullptr;
    \n-
    1156 update_ = nullptr;
    \n-
    1157 rhs_ = nullptr;
    \n-
    1158 }
    \n-
    \n-
    1159
    \n-
    1160 template<class M, class X, class S, class PI, class A>
    \n-
    1161 template<class A1>
    \n-
    \n-
    1162 void AMG<M,X,S,PI,A>::getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont)
    \n-
    1163 {
    \n-
    1164 matrices_->getCoarsestAggregatesOnFinest(cont);
    \n-
    1165 }
    \n-
    \n-
    1166
    \n-
    1167 } // end namespace Amg
    \n-
    1168
    \n-
    \n-\n-
    1170 template<class> struct isValidBlockType : std::false_type{};
    \n-
    1171 template<class T, int n, int m> struct isValidBlockType<FieldMatrix<T,n,m>> : std::true_type{};
    \n-
    1172
    \n-
    1173 template<class OP>
    \n-
    1174 std::shared_ptr<Dune::Preconditioner<typename OP::element_type::domain_type, typename OP::element_type::range_type> >
    \n-
    \n-
    1175 makeAMG(const OP& op, const std::string& smoother, const Dune::ParameterTree& config) const
    \n-
    1176 {
    \n-
    1177 DUNE_THROW(Dune::Exception, "Operator type not supported by AMG");
    \n-
    1178 }
    \n-
    \n-
    1179
    \n-
    1180 template<class M, class X, class Y>
    \n-
    1181 std::shared_ptr<Dune::Preconditioner<X,Y> >
    \n-
    \n-
    1182 makeAMG(const std::shared_ptr<MatrixAdapter<M,X,Y>>& op, const std::string& smoother,
    \n-
    1183 const Dune::ParameterTree& config) const
    \n-
    1184 {
    \n-
    1185 using OP = MatrixAdapter<M,X,Y>;
    \n-
    1186
    \n-
    1187 if(smoother == "ssor")
    \n-
    1188 return std::make_shared<Amg::AMG<OP, X, SeqSSOR<M,X,Y>>>(op, config);
    \n-
    1189 if(smoother == "sor")
    \n-
    1190 return std::make_shared<Amg::AMG<OP, X, SeqSOR<M,X,Y>>>(op, config);
    \n-
    1191 if(smoother == "jac")
    \n-
    1192 return std::make_shared<Amg::AMG<OP, X, SeqJac<M,X,Y>>>(op, config);
    \n-
    1193 if(smoother == "gs")
    \n-
    1194 return std::make_shared<Amg::AMG<OP, X, SeqGS<M,X,Y>>>(op, config);
    \n-
    1195 if(smoother == "ilu")
    \n-
    1196 return std::make_shared<Amg::AMG<OP, X, SeqILU<M,X,Y>>>(op, config);
    \n-
    1197 else
    \n-
    1198 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
    \n-
    1199 }
    \n-
    \n-
    1200
    \n-
    1201 template<class M, class X, class Y, class C>
    \n-
    1202 std::shared_ptr<Dune::Preconditioner<X,Y> >
    \n-
    \n-
    1203 makeAMG(const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C>>& op, const std::string& smoother,
    \n-
    1204 const Dune::ParameterTree& config) const
    \n-
    1205 {
    \n-\n-
    1207
    \n-
    1208 auto cop = std::static_pointer_cast<const OP>(op);
    \n-
    1209
    \n-
    1210 if(smoother == "ssor")
    \n-
    1211 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqSSOR<M,X,Y>>,C>>(cop, config, op->getCommunication());
    \n-
    1212 if(smoother == "sor")
    \n-
    1213 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqSOR<M,X,Y>>,C>>(cop, config, op->getCommunication());
    \n-
    1214 if(smoother == "jac")
    \n-
    1215 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqJac<M,X,Y>>,C>>(cop, config, op->getCommunication());
    \n-
    1216 if(smoother == "gs")
    \n-
    1217 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqGS<M,X,Y>>,C>>(cop, config, op->getCommunication());
    \n-
    1218 if(smoother == "ilu")
    \n-
    1219 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqILU<M,X,Y>>,C>>(cop, config, op->getCommunication());
    \n-
    1220 else
    \n-
    1221 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
    \n-
    1222 }
    \n-
    \n-
    1223
    \n-
    1224 template<class M, class X, class Y, class C>
    \n-
    1225 std::shared_ptr<Dune::Preconditioner<X,Y> >
    \n-
    \n-
    1226 makeAMG(const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C>>& op, const std::string& smoother,
    \n-
    1227 const Dune::ParameterTree& config) const
    \n-
    1228 {
    \n-\n-
    1230
    \n-
    1231 if(smoother == "ssor")
    \n-
    1232 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqSSOR<M,X,Y>>,C>>(op, config, op->getCommunication());
    \n-
    1233 if(smoother == "sor")
    \n-
    1234 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqSOR<M,X,Y>>,C>>(op, config, op->getCommunication());
    \n-
    1235 if(smoother == "jac")
    \n-
    1236 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqJac<M,X,Y>>,C>>(op, config, op->getCommunication());
    \n-
    1237 if(smoother == "gs")
    \n-
    1238 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqGS<M,X,Y>>,C>>(op, config, op->getCommunication());
    \n-
    1239 if(smoother == "ilu")
    \n-
    1240 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqILU<M,X,Y>>,C>>(op, config, op->getCommunication());
    \n-
    1241 else
    \n-
    1242 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
    \n-
    1243 }
    \n-
    \n-
    1244
    \n-
    1245 template<typename TL, typename OP>
    \n-
    1246 std::shared_ptr<Dune::Preconditioner<typename Dune::TypeListElement<1, TL>::type,
    \n-
    1247 typename Dune::TypeListElement<2, TL>::type>>
    \n-
    \n-
    1248 operator() (TL tl, const std::shared_ptr<OP>& op, const Dune::ParameterTree& config,
    \n-\n-
    1250 {
    \n-
    1251 using field_type = typename OP::matrix_type::field_type;
    \n-
    1252 using real_type = typename FieldTraits<field_type>::real_type;
    \n-
    1253 if (!std::is_convertible<field_type, real_type>())
    \n-
    1254 DUNE_THROW(UnsupportedType, "AMG needs field_type(" <<
    \n-
    1255 className<field_type>() <<
    \n-
    1256 ") to be convertible to its real_type (" <<
    \n-
    1257 className<real_type>() <<
    \n-
    1258 ").");
    \n-
    1259 std::string smoother = config.get("smoother", "ssor");
    \n-
    1260 return makeAMG(op, smoother, config);
    \n-
    1261 }
    \n-
    \n-
    1262
    \n-
    1263 template<typename TL, typename OP>
    \n-
    1264 std::shared_ptr<Dune::Preconditioner<typename Dune::TypeListElement<1, TL>::type,
    \n-
    1265 typename Dune::TypeListElement<2, TL>::type>>
    \n-
    \n-
    1266 operator() (TL /*tl*/, const std::shared_ptr<OP>& /*mat*/, const Dune::ParameterTree& /*config*/,
    \n-\n-
    1268 {
    \n-
    1269 DUNE_THROW(UnsupportedType, "AMG needs a FieldMatrix as Matrix block_type");
    \n-
    1270 }
    \n-
    \n-
    1271 };
    \n-
    \n-
    1272
    \n-\n-
    1274} // end namespace Dune
    \n-
    1275
    \n-
    1276#endif
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    \n-
    Classes for using SuperLU with ISTL matrices.
    \n-
    #define DUNE_REGISTER_PRECONDITIONER(name,...)
    Definition solverregistry.hh:16
    \n-
    Define base class for scalar product and norm.
    \n-
    Classes for using UMFPack with ISTL matrices.
    \n-
    Implementations of the inverse operator interface.
    \n-
    Prolongation and restriction for amg.
    \n-
    Provides a classes representing the hierarchies in AMG.
    \n-
    Classes for the generic construction and application of the smoothers.
    \n-
    Templates characterizing the type of a solver.
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n+
    405#endif //HAVE_SUITESPARSE_LDL
    \n+
    406#endif //DUNE_ISTL_LDL_HH
    \n+\n+
    Implementations of the inverse operator interface.
    \n+\n+
    Templates characterizing the type of a solver.
    \n+
    #define DUNE_REGISTER_DIRECT_SOLVER(name,...)
    Definition solverregistry.hh:13
    \n+
    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.
    Definition ldl.hh:85
    \n+
    Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    The matrix type.
    Definition ldl.hh:78
    \n+
    int * getLp()
    Get factorization Lp.
    Definition ldl.hh:278
    \n+
    LDLMatrix & getInternalMatrix()
    Return the column compress matrix.
    Definition ldl.hh:237
    \n+
    Dune::ISTL::Impl::BCCSMatrix< T, int > LDLMatrix
    The corresponding SuperLU Matrix type.
    Definition ldl.hh:81
    \n+
    double * getLx()
    Get factorization Lx.
    Definition ldl.hh:296
    \n+
    void setVerbosity(int v)
    Sets the verbosity level for the solver.
    Definition ldl.hh:228
    \n+
    void apply(T *x, T *b)
    Additional apply method with c-arrays in analogy to superlu.
    Definition ldl.hh:176
    \n+
    virtual void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
    apply inverse operator, with given convergence criteria.
    Definition ldl.hh:166
    \n+
    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.
    Definition ldl.hh:87
    \n+
    virtual ~LDL()
    Default constructor.
    Definition ldl.hh:145
    \n+
    void free()
    Free allocated space.
    Definition ldl.hh:246
    \n+
    virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
    Apply inverse operator,.
    Definition ldl.hh:152
    \n+
    int * getLi()
    Get factorization Li.
    Definition ldl.hh:287
    \n+
    Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > matrix_type
    Definition ldl.hh:79
    \n+
    void setMatrix(const Matrix &matrix)
    Initialize data from given matrix.
    Definition ldl.hh:190
    \n+
    void setOption(unsigned int option, double value)
    Definition ldl.hh:186
    \n+
    LDL(const Matrix &matrix, int verbose, bool)
    Constructor for compatibility with SuperLU standard constructor.
    Definition ldl.hh:120
    \n+
    double * getD()
    Get factorization diagonal matrix D.
    Definition ldl.hh:269
    \n+
    LDL(const Matrix &matrix, const ParameterTree &config)
    Constructs the LDL solver.
    Definition ldl.hh:136
    \n+
    virtual SolverCategory::Category category() const
    Category of the solver (see SolverCategory::Category)
    Definition ldl.hh:90
    \n+
    ISTL::Impl::BCCSMatrixInitializer< BCRSMatrix< FieldMatrix< T, n, m >, A >, int > MatrixInitializer
    Type of an associated initializer class.
    Definition ldl.hh:83
    \n+
    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 ldl.hh:380
    \n+
    const char * name()
    Get method name.
    Definition ldl.hh:260
    \n+
    void setSubMatrix(const Matrix &matrix, const S &rowIndexSet)
    Definition ldl.hh:207
    \n+
    LDL()
    Default constructor.
    Definition ldl.hh:141
    \n+
    LDL(const Matrix &matrix, int verbose=0)
    Construct a solver object from a BCRSMatrix.
    Definition ldl.hh:104
    \n
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n-
    AMG(const AMG &amg)
    Copy constructor.
    Definition amg.hh:392
    \n-
    void pre(Domain &x, Range &b)
    Prepare the preconditioner.
    Definition amg.hh:801
    \n-
    static DirectSolver * create(const Matrix &mat, bool verbose, bool reusevector)
    Definition amg.hh:681
    \n-
    static std::string name()
    Definition amg.hh:680
    \n-
    Hierarchy< Domain, A >::Iterator update
    The iterator over the updates.
    Definition amg.hh:303
    \n-
    Hierarchy< Range, A >::Iterator rhs
    The iterator over the right hand sided.
    Definition amg.hh:307
    \n-
    static std::string name()
    Definition amg.hh:672
    \n-
    bool usesDirectCoarseLevelSolver() const
    Check whether the coarse solver used is a direct solver.
    Definition amg.hh:1024
    \n-
    X Domain
    The domain type.
    Definition amg.hh:87
    \n-
    static type * create(const M &mat, bool verbose, bool reusevector)
    Definition amg.hh:644
    \n-
    AMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const SmootherArgs &smootherArgs, const Parameters &parms)
    Construct a new amg with a specific coarse solver.
    Definition amg.hh:406
    \n-
    AMG(std::shared_ptr< const Operator > fineOperator, const ParameterTree &configuration, const ParallelInformation &pinfo=ParallelInformation())
    Constructor an AMG via ParameterTree.
    Definition amg.hh:452
    \n-
    ParallelInformationHierarchy::Iterator pinfo
    The iterator over the parallel information.
    Definition amg.hh:287
    \n-
    SolverType
    Definition amg.hh:627
    \n-
    OperatorHierarchy::AggregatesMapList::const_iterator aggregates
    The iterator over the aggregates maps.
    Definition amg.hh:295
    \n-
    SmootherTraits< Smoother >::Arguments SmootherArgs
    The argument type for the construction of the smoother.
    Definition amg.hh:100
    \n-
    Solver< Matrix, solver > SelectedSolver
    Definition amg.hh:677
    \n-
    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
    \n-
    std::string operator()(const std::string &str)
    Definition amg.hh:378
    \n-
    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
    \n-
    S Smoother
    The type of the smoother.
    Definition amg.hh:97
    \n-
    static std::string name()
    Definition amg.hh:649
    \n-
    Hierarchy< Smoother, A >::Iterator smoother
    The iterator over the smoothers.
    Definition amg.hh:279
    \n-
    M Operator
    The matrix operator type.
    Definition amg.hh:73
    \n-
    OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix
    The iterator over the matrices.
    Definition amg.hh:283
    \n-\n-
    static type * create(const M &mat, bool verbose, bool reusevector)
    Definition amg.hh:668
    \n-
    OperatorHierarchy::RedistributeInfoList::const_iterator redist
    The iterator over the redistribution information.
    Definition amg.hh:291
    \n-
    X Range
    The range type.
    Definition amg.hh:89
    \n-
    void presmooth(LevelContext &levelContext, size_t steps)
    Apply pre smoothing on the current level.
    Definition smoother.hh:406
    \n-
    void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)
    Get the aggregate number of each unknown on the coarsest level.
    Definition amg.hh:1162
    \n-
    std::size_t levels()
    Definition amg.hh:876
    \n-
    InverseOperator< Vector, Vector > type
    Definition amg.hh:643
    \n-
    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
    \n-
    Hierarchy< Domain, A >::Iterator lhs
    The iterator over the left hand side.
    Definition amg.hh:299
    \n-
    const void * Arguments
    A type holding all the arguments needed to call the constructor.
    Definition construction.hh:44
    \n-
    static constexpr SolverType solver
    Definition amg.hh:629
    \n-
    static std::shared_ptr< T > construct(Arguments &args)
    Construct an object with the specified arguments.
    Definition construction.hh:52
    \n-
    static constexpr bool isDirectSolver
    Definition amg.hh:679
    \n-
    void recalculateHierarchy()
    Recalculate the matrix hierarchy.
    Definition amg.hh:221
    \n-
    Matrix::field_type field_type
    Definition amg.hh:626
    \n-
    SelectedSolver::type DirectSolver
    Definition amg.hh:678
    \n-
    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
    \n-
    OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy
    The parallal data distribution hierarchy type.
    Definition amg.hh:84
    \n-
    InverseOperator< X, X > CoarseSolver
    the type of the coarse solver.
    Definition amg.hh:91
    \n-
    void post(Domain &x)
    Clean up.
    Definition amg.hh:1139
    \n-
    std::size_t maxlevels()
    Definition amg.hh:881
    \n-
    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
    \n-
    void postsmooth(LevelContext &levelContext, size_t steps)
    Apply post smoothing on the current level.
    Definition smoother.hh:428
    \n-
    std::size_t level
    The level index.
    Definition amg.hh:311
    \n-
    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
    \n-
    void apply(Domain &v, const Range &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition amg.hh:888
    \n-
    Smoother SmootherType
    Definition amg.hh:275
    \n-
    MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy
    The operator hierarchy type.
    Definition amg.hh:82
    \n-
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition amg.hh:194
    \n-
    PI ParallelInformation
    The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
    Definition amg.hh:80
    \n-
    @ none
    Definition amg.hh:627
    \n-
    @ umfpack
    Definition amg.hh:627
    \n-
    @ superlu
    Definition amg.hh:627
    \n-
    @ atOnceAccu
    Accumulate data to one process at once.
    Definition parameters.hh:243
    \n-
    @ noAccu
    No data accumulution.
    Definition parameters.hh:237
    \n-
    @ successiveAccu
    Successively accumulate to fewer processes.
    Definition parameters.hh:247
    \n
    Definition allocator.hh:11
    \n-
    ConstIterator class for sequential access.
    Definition matrix.hh:404
    \n-
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n-
    typename Imp::BlockTraits< T >::field_type field_type
    Export the type representing the underlying field.
    Definition matrix.hh:565
    \n-
    row_type::const_iterator ConstColIterator
    Const iterator for the entries of each row.
    Definition matrix.hh:589
    \n-
    T block_type
    Export the type representing the components.
    Definition matrix.hh:568
    \n+
    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
    \n+
    Definition matrixutils.hh:211
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    size_type M() const
    number of columns (counted in blocks)
    Definition bcrsmatrix.hh:2007
    \n+
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n+
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n+
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n+
    Definition overlappingschwarz.hh:694
    \n+
    Use the LDL package to directly solve linear systems \u2013 empty default class.
    Definition ldl.hh:56
    \n+
    Definition ldl.hh:373
    \n+
    Definition ldl.hh:374
    \n
    Definition matrixutils.hh:27
    \n-
    A nonoverlapping operator with communication object.
    Definition novlpschwarz.hh:61
    \n-
    Adapter to turn a matrix into a linear operator.
    Definition operators.hh:136
    \n-
    Norm that uses only the [N][N] entry of the block to determine couplings.
    Definition aggregates.hh:379
    \n-
    Functor using the row sum (infinity) norm to determine strong couplings.
    Definition aggregates.hh:463
    \n-
    Definition aggregates.hh:480
    \n-
    Definition aggregates.hh:496
    \n-
    Criterion taking advantage of symmetric matrices.
    Definition aggregates.hh:519
    \n-
    Criterion suitable for unsymmetric matrices.
    Definition aggregates.hh:539
    \n-
    an algebraic multigrid method using a Krylov-cycle.
    Definition kamg.hh:140
    \n-
    Two grid operator for AMG with Krylov cycle.
    Definition kamg.hh:33
    \n-
    Parallel algebraic multigrid based on agglomeration.
    Definition amg.hh:65
    \n-
    Definition amg.hh:625
    \n-\n-
    Definition amg.hh:1169
    \n-\n-
    An overlapping Schwarz operator.
    Definition schwarz.hh:75
    \n-\n-
    LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
    Type of the mutable iterator.
    Definition hierarchy.hh:216
    \n-
    Iterator over the levels in the hierarchy.
    Definition hierarchy.hh:120
    \n-
    The hierarchies build by the coarsening process.
    Definition matrixhierarchy.hh:61
    \n-
    The criterion describing the stop criteria for the coarsening process.
    Definition matrixhierarchy.hh:283
    \n-
    All parameters for AMG.
    Definition parameters.hh:416
    \n-
    Definition pinfo.hh:28
    \n-
    The default class for the smoother arguments.
    Definition smoother.hh:38
    \n-
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n-
    X::field_type field_type
    The field type of the preconditioner.
    Definition preconditioner.hh:40
    \n-
    Base class for scalar product and norm computation.
    Definition scalarproducts.hh:52
    \n
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    int iterations
    Number of iterations.
    Definition solver.hh:69
    \n
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n-
    Categories for the solvers.
    Definition solvercategory.hh:22
    \n
    Category
    Definition solvercategory.hh:23
    \n-
    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
    \n-
    Definition solvercategory.hh:54
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n
    Definition solverregistry.hh:77
    \n
    Definition solvertype.hh:16
    \n-
    SuperLu Solver.
    Definition superlu.hh:271
    \n-
    Definition umfpack.hh:52
    \n-
    The UMFPack direct sparse solver.
    Definition umfpack.hh:258
    \n+
    @ value
    Whether this is a direct solver.
    Definition solvertype.hh:24
    \n+
    Definition solvertype.hh:30
    \n+
    @ value
    whether the solver internally uses column compressed storage
    Definition solvertype.hh:36
    \n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1593 +1,535 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bp_\ba_\ba_\bm_\bg\n-amg.hh\n+ldl.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_AMG_AMG_HH\n-6#define DUNE_AMG_AMG_HH\n+5#ifndef DUNE_ISTL_LDL_HH\n+6#define DUNE_ISTL_LDL_HH\n 7\n-8#include \n-9#include \n-10#include \n-11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n-13#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n-15#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh>\n-16#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh>\n-17#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-19#include \n-20#include \n-21#include \n-22#include \n-23#include \n-24\n-25namespace _\bD_\bu_\bn_\be\n-26{\n-27 namespace Amg\n-28 {\n-46 template\n-47 class KAMG;\n-48\n-49 template\n-50 class KAmgTwoGrid;\n-51\n-62 template >\n-_\b6_\b4 class _\bA_\bM_\bG : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-65 {\n-66 template\n-_\b6_\b7 friend class _\bK_\bA_\bM_\bG;\n-68\n-69 friend class _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd<_\bA_\bM_\bG>;\n-70\n-71 public:\n-_\b7_\b3 typedef M _\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n-_\b8_\b0 typedef PI _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n-_\b8_\b2 typedef _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\b> _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n-_\b8_\b4 typedef typename _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n-85\n-_\b8_\b7 typedef X _\bD_\bo_\bm_\ba_\bi_\bn;\n-_\b8_\b9 typedef X _\bR_\ba_\bn_\bg_\be;\n-_\b9_\b1 typedef _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bX_\b> _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br;\n-_\b9_\b7 typedef S _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n-98\n-_\b1_\b0_\b0 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n-101\n-_\b1_\b1_\b1 _\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br& coarseSolver,\n-112 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs, const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms);\n-113\n-125 template\n-_\b1_\b2_\b6 _\bA_\bM_\bG(const _\bO_\bp_\be_\br_\ba_\bt_\bo_\br& fineOperator, const C& criterion,\n-127 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs=_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs(),\n-128 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo=_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n-129\n-_\b1_\b8_\b0 _\bA_\bM_\bG(std::shared_ptr fineOperator, const ParameterTree&\n-configuration, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo=_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n-181\n-_\b1_\b8_\b5 _\bA_\bM_\bG(const _\bA_\bM_\bG& amg);\n-186\n-_\b1_\b8_\b8 void _\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b);\n-189\n-_\b1_\b9_\b1 void _\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d);\n-192\n-_\b1_\b9_\b4 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-195 {\n-196 return category_;\n-197 }\n-198\n-_\b2_\b0_\b0 void _\bp_\bo_\bs_\bt(_\bD_\bo_\bm_\ba_\bi_\bn& x);\n-201\n-206 template\n-_\b2_\b0_\b7 void _\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs(std::vector& cont);\n-208\n-_\b2_\b0_\b9 std::size_t _\bl_\be_\bv_\be_\bl_\bs();\n-210\n-_\b2_\b1_\b1 std::size_t _\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs();\n-212\n-_\b2_\b2_\b1 void _\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by()\n-222 {\n-223 matrices_->recalculateGalerkin(NegateSet());\n-224 }\n-225\n-_\b2_\b3_\b0 bool _\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br() const;\n-231\n-232 private:\n-233 /*\n-234 * @brief Helper function to create hierarchies with parameter tree.\n-235 *\n-236 * Will create the coarsen criterion with the norm and create the\n-237 * Hierarchies\n-238 * \\tparam Norm Type of the norm to use.\n-239 */\n-240 template\n-241 void createCriterionAndHierarchies(std::shared_ptr\n-matrixptr,\n-242 const PI& pinfo, const Norm&,\n-243 const ParameterTree& configuration,\n-244 std::true_type compiles = std::true_type());\n-245 template\n-246 void createCriterionAndHierarchies(std::shared_ptr\n-matrixptr,\n-247 const PI& pinfo, const Norm&,\n-248 const ParameterTree& configuration,\n-249 std::false_type);\n-254 template\n-255 void createHierarchies(C& criterion, std::shared_ptr\n-matrixptr,\n-256 const PI& pinfo, const ParameterTree& configuration);\n-263 template\n-264 void createHierarchies(C& criterion,\n-265 const std::shared_ptr& matrixptr,\n-266 const PI& pinfo);\n-273 struct LevelContext\n-274 {\n-_\b2_\b7_\b5 typedef _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be;\n-_\b2_\b7_\b9 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bs_\bm_\bo_\bo_\bt_\bh_\be_\br;\n-_\b2_\b8_\b3 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator _\bm_\ba_\bt_\br_\bi_\bx;\n-_\b2_\b8_\b7 typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bp_\bi_\bn_\bf_\bo;\n-_\b2_\b9_\b1 typename OperatorHierarchy::RedistributeInfoList::const_iterator _\br_\be_\bd_\bi_\bs_\bt;\n-_\b2_\b9_\b5 typename OperatorHierarchy::AggregatesMapList::const_iterator _\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs;\n-_\b2_\b9_\b9 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bl_\bh_\bs;\n-_\b3_\b0_\b3 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bu_\bp_\bd_\ba_\bt_\be;\n-_\b3_\b0_\b7 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bR_\ba_\bn_\bg_\be_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\bh_\bs;\n-_\b3_\b1_\b1 std::size_t _\bl_\be_\bv_\be_\bl;\n-312 };\n-313\n-314\n-319 void mgc(LevelContext& levelContext);\n-320\n-321 void additiveMgc();\n-322\n-329 void moveToFineLevel(LevelContext& levelContext,bool processedFineLevel);\n-330\n-335 bool moveToCoarseLevel(LevelContext& levelContext);\n-336\n-341 void initIteratorsWithFineLevel(LevelContext& levelContext);\n-342\n-344 std::shared_ptr matrices_;\n-346 _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs smootherArgs_;\n-348 std::shared_ptr > smoothers_;\n-350 std::shared_ptr solver_;\n-352 std::shared_ptr> rhs_;\n-354 std::shared_ptr> lhs_;\n-356 std::shared_ptr> update_;\n-358 using _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt = _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bX_\b>;\n-360 std::shared_ptr scalarProduct_;\n-362 std::size_t gamma_;\n-364 std::size_t preSteps_;\n-366 std::size_t postSteps_;\n-367 bool buildHierarchy_;\n-368 bool additive;\n-369 bool coarsesolverconverged;\n-370 std::shared_ptr coarseSmoother_;\n-372 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category_;\n-374 std::size_t verbosity_;\n-375\n-376 struct ToLower\n-377 {\n-_\b3_\b7_\b8 std::string _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const std::string& str)\n-379 {\n-380 std::stringstream retval;\n-381 std::ostream_iterator out(retval);\n-382 std::transform(str.begin(), str.end(), out,\n-383 [](char c){\n-384 return std::tolower(c, std::locale::classic());\n-385 });\n-386 return retval.str();\n-387 }\n-388 };\n-389 };\n-390\n-391 template\n-_\b3_\b9_\b2 inline _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bA_\bM_\bG(const _\bA_\bM_\bG& amg)\n-393 : matrices_(amg.matrices_), smootherArgs_(amg.smootherArgs_),\n-394 smoothers_(amg.smoothers_), solver_(amg.solver_),\n-395 rhs_(), lhs_(), update_(),\n-396 scalarProduct_(amg.scalarProduct_), gamma_(amg.gamma_),\n-397 preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),\n-398 buildHierarchy_(amg.buildHierarchy_),\n-399 additive(amg.additive), coarsesolverconverged(amg.coarsesolverconverged),\n-400 coarseSmoother_(amg.coarseSmoother_),\n-401 category_(amg.category_),\n-402 verbosity_(amg.verbosity_)\n-403 {}\n-404\n-405 template\n-_\b4_\b0_\b6 _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br&\n-coarseSolver,\n-407 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs,\n-408 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n-409 : matrices_(stackobject_to_shared_ptr(matrices)), smootherArgs_\n-(smootherArgs),\n-410 smoothers_(new _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br,A>), solver_(&coarseSolver),\n-411 rhs_(), lhs_(), update_(), scalarProduct_(0),\n-412 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),\n-413 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),\n-414 additive(parms.getAdditive()), coarsesolverconverged(true),\n-415 coarseSmoother_(),\n-416// #warning should category be retrieved from matrices?\n-417 category_(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::category(*smoothers_->coarsest())),\n-418 verbosity_(parms.debugLevel())\n-419 {\n-420 assert(matrices_->isBuilt());\n-421\n-422 // build the necessary smoother hierarchies\n-423 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);\n-424 }\n-425\n-426 template\n-427 template\n-_\b4_\b2_\b8 _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bA_\bM_\bG(const _\bO_\bp_\be_\br_\ba_\bt_\bo_\br& matrix,\n-429 const C& criterion,\n-430 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs,\n-431 const PI& pinfo)\n-432 : smootherArgs_(smootherArgs),\n-433 smoothers_(new _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br,A>), solver_(),\n-434 rhs_(), lhs_(), update_(), scalarProduct_(),\n-435 gamma_(criterion.getGamma()), preSteps_(criterion.getNoPreSmoothSteps()),\n-436 postSteps_(criterion.getNoPostSmoothSteps()), buildHierarchy_(true),\n-437 additive(criterion.getAdditive()), coarsesolverconverged(true),\n-438 coarseSmoother_(),\n-439 category_(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::category(pinfo)),\n-440 verbosity_(criterion.debugLevel())\n-441 {\n-442 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(matrix) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(pinfo))\n-443 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"Matrix and Communication must have the\n-same SolverCategory!\");\n-444 // TODO: reestablish compile time checks.\n-445 //static_assert(static_cast(PI::category)==static_cast(S::\n-category),\n-446 // \"Matrix and Solver must match in terms of category!\");\n-447 auto matrixptr = stackobject_to_shared_ptr(matrix);\n-448 createHierarchies(criterion, matrixptr, pinfo);\n-449 }\n-450\n-451 template\n-_\b4_\b5_\b2 _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bA_\bM_\bG(std::shared_ptr matrixptr,\n-453 const ParameterTree& configuration,\n-454 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo) :\n-455 smoothers_(new _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br,A>),\n-456 solver_(), rhs_(), lhs_(), update_(), scalarProduct_(), buildHierarchy_\n-(true),\n-457 coarsesolverconverged(true), coarseSmoother_(),\n-458 category_(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::category(pinfo))\n-459 {\n-460\n-461 if (configuration.hasKey (\"smootherIterations\"))\n-462 smootherArgs_.iterations = configuration.get(\"smootherIterations\");\n-463\n-464 if (configuration.hasKey (\"smootherRelaxation\"))\n-465 smootherArgs_.relaxationFactor = configuration.get(\"smootherRelaxation\");\n-466\n-467 auto normName = ToLower()(configuration.get(\"strengthMeasure\",\n-\"diagonal\"));\n-468 auto index = configuration.get(\"diagonalRowIndex\", 0);\n-469\n-470 if ( normName == \"diagonal\")\n-471 {\n-472 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename M::field_type;\n-473 using real_type = typename FieldTraits::real_type;\n-474 std::is_convertible compiles;\n-475\n-476 switch (index)\n-477 {\n-478 case 0:\n-479 createCriterionAndHierarchies(matrixptr, pinfo, _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b0_\b>(),\n-configuration, compiles);\n-480 break;\n-481 case 1:\n-482 createCriterionAndHierarchies(matrixptr, pinfo, _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b1_\b>(),\n-configuration, compiles);\n-483 break;\n-484 case 2:\n-485 createCriterionAndHierarchies(matrixptr, pinfo, _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b2_\b>(),\n-configuration, compiles);\n-486 break;\n-487 case 3:\n-488 createCriterionAndHierarchies(matrixptr, pinfo, _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b3_\b>(),\n-configuration, compiles);\n-489 break;\n-490 case 4:\n-491 createCriterionAndHierarchies(matrixptr, pinfo, _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b4_\b>(),\n-configuration, compiles);\n-492 break;\n-493 default:\n-494 DUNE_THROW(InvalidStateException, \"Currently strengthIndex>4 is not\n-supported.\");\n-495 }\n-496 }\n-497 else if (normName == \"rowsum\")\n-498 createCriterionAndHierarchies(matrixptr, pinfo, _\bR_\bo_\bw_\bS_\bu_\bm(), configuration);\n-499 else if (normName == \"frobenius\")\n-500 createCriterionAndHierarchies(matrixptr, pinfo, _\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm(),\n-configuration);\n-501 else if (normName == \"one\")\n-502 createCriterionAndHierarchies(matrixptr, pinfo, _\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm(),\n-configuration);\n-503 else\n-504 DUNE_THROW(Dune::NotImplemented, \"Wrong config file: strengthMeasure\n-\"<\n-508 template\n-509 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\bA_\bn_\bd_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\bi_\be_\bs(std::shared_ptr matrixptr, const PI& pinfo, const Norm&, const ParameterTree&\n-configuration, std::false_type)\n-510 {\n-511 DUNE_THROW(InvalidStateException, \"Strength of connection measure does not\n-support this type (\"\n-512 << className() << \") as it is lacking a conversion\n-to\"\n-513 << className::real_type>() <<\n-\".\");\n-514 }\n-515\n-516 template\n-517 template\n-518 void AMG::createCriterionAndHierarchies(std::shared_ptr matrixptr, const PI& pinfo, const Norm&, const ParameterTree&\n-configuration, std::true_type)\n-519 {\n-520 if (configuration.get(\"criterionSymmetric\", true))\n-521 {\n-522 using Criterion = _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn<\n-523 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b,_\bN_\bo_\br_\bm_\b> >;\n-524 Criterion criterion;\n-525 createHierarchies(criterion, matrixptr, pinfo, configuration);\n-526 }\n-527 else\n-528 {\n-529 using Criterion = _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn<\n-530 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b,_\bN_\bo_\br_\bm_\b> >;\n-531 Criterion criterion;\n-532 createHierarchies(criterion, matrixptr, pinfo, configuration);\n-533 }\n-534 }\n-535\n-536 template\n-537 template\n-538 void AMG::createHierarchies(C& criterion, std::shared_ptr matrixptr, const PI& pinfo, const ParameterTree& configuration)\n-539 {\n-540 if (configuration.hasKey (\"maxLevel\"))\n-541 criterion.setMaxLevel(configuration.get(\"maxLevel\"));\n-542\n-543 if (configuration.hasKey (\"minCoarseningRate\"))\n-544 criterion.setMinCoarsenRate(configuration.get(\"minCoarseningRate\"));\n-545\n-546 if (configuration.hasKey (\"coarsenTarget\"))\n-547 criterion.setCoarsenTarget (configuration.get(\"coarsenTarget\"));\n-548\n-549 if (configuration.hasKey (\"accumulationMode\"))\n-550 {\n-551 std::string mode = ToLower()(configuration.get\n-(\"accumulationMode\"));\n-552 if ( mode == \"none\")\n-553 criterion.setAccumulate(_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be_\b:_\b:_\bn_\bo_\bA_\bc_\bc_\bu);\n-554 else if ( mode == \"atonce\" )\n-555 criterion.setAccumulate(_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be_\b:_\b:_\ba_\bt_\bO_\bn_\bc_\be_\bA_\bc_\bc_\bu);\n-556 else if ( mode == \"successive\")\n-557 criterion.setCoarsenTarget (_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be_\b:_\b:_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu);\n-558 else\n-559 DUNE_THROW(InvalidSolverFactoryConfiguration, \"Parameter accumulationMode\n-does not allow value \"\n-560 << mode <<\".\");\n-561 }\n-562\n-563 if (configuration.hasKey (\"prolongationDampingFactor\"))\n-564 criterion.setProlongationDampingFactor (configuration.get\n-(\"prolongationDampingFactor\"));\n-565\n-566 if (configuration.hasKey(\"defaultAggregationSizeMode\"))\n-567 {\n-568 auto mode = ToLower()(configuration.get\n-(\"defaultAggregationSizeMode\"));\n-569 auto dim = configuration.get(\"defaultAggregationDimension\");\n-570 std::size_t maxDistance = 2;\n-571 if (configuration.hasKey(\"MaxAggregateDistance\"))\n-572 maxDistance = configuration.get(\"maxAggregateDistance\");\n-573 if (mode == \"isotropic\")\n-574 criterion.setDefaultValuesIsotropic(dim, maxDistance);\n-575 else if(mode == \"anisotropic\")\n-576 criterion.setDefaultValuesAnisotropic(dim, maxDistance);\n-577 else\n-578 DUNE_THROW(InvalidSolverFactoryConfiguration, \"Parameter accumulationMode\n-does not allow value \"\n-579 << mode <<\".\");\n-580 }\n-581\n-582 if (configuration.hasKey(\"maxAggregateDistance\"))\n-583 criterion.setMaxDistance(configuration.get\n-(\"maxAggregateDistance\"));\n-584\n-585 if (configuration.hasKey(\"minAggregateSize\"))\n-586 criterion.setMinAggregateSize(configuration.get\n-(\"minAggregateSize\"));\n-587\n-588 if (configuration.hasKey(\"maxAggregateSize\"))\n-589 criterion.setMaxAggregateSize(configuration.get\n-(\"maxAggregateSize\"));\n-590\n-591 if (configuration.hasKey(\"maxAggregateConnectivity\"))\n-592 criterion.setMaxConnectivity(configuration.get\n-(\"maxAggregateConnectivity\"));\n-593\n-594 if (configuration.hasKey (\"alpha\"))\n-595 criterion.setAlpha (configuration.get (\"alpha\"));\n-596\n-597 if (configuration.hasKey (\"beta\"))\n-598 criterion.setBeta (configuration.get (\"beta\"));\n-599\n-600 if (configuration.hasKey (\"gamma\"))\n-601 criterion.setGamma (configuration.get (\"gamma\"));\n-602 gamma_ = criterion.getGamma();\n-603\n-604 if (configuration.hasKey (\"additive\"))\n-605 criterion.setAdditive (configuration.get(\"additive\"));\n-606 additive = criterion.getAdditive();\n-607\n-608 if (configuration.hasKey (\"preSteps\"))\n-609 criterion.setNoPreSmoothSteps (configuration.get\n-(\"preSteps\"));\n-610 preSteps_ = criterion.getNoPreSmoothSteps ();\n-611\n-612 if (configuration.hasKey (\"postSteps\"))\n-613 criterion.setNoPostSmoothSteps (configuration.get\n-(\"postSteps\"));\n-614 postSteps_ = criterion.getNoPostSmoothSteps ();\n-615\n-616 verbosity_ = configuration.get(\"verbosity\", 0);\n-617 criterion.setDebugLevel (verbosity_);\n-618\n-619 createHierarchies(criterion, matrixptr, pinfo);\n-620 }\n-621\n-622 template \n-_\b6_\b2_\b4 struct _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-625 {\n-_\b6_\b2_\b6 typedef typename Matrix :: field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b6_\b2_\b7 enum _\bS_\bo_\bl_\bv_\be_\br_\bT_\by_\bp_\be { _\bu_\bm_\bf_\bp_\ba_\bc_\bk, _\bs_\bu_\bp_\be_\br_\bl_\bu, _\bn_\bo_\bn_\be };\n-628\n-_\b6_\b2_\b9 static constexpr _\bS_\bo_\bl_\bv_\be_\br_\bT_\by_\bp_\be _\bs_\bo_\bl_\bv_\be_\br =\n-630#if DISABLE_AMG_DIRECTSOLVER\n-631 _\bn_\bo_\bn_\be;\n-632#elif HAVE_SUITESPARSE_UMFPACK\n-633 _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b _\b> :: valid ? _\bu_\bm_\bf_\bp_\ba_\bc_\bk : _\bn_\bo_\bn_\be ;\n-634#elif HAVE_SUPERLU\n-635 _\bs_\bu_\bp_\be_\br_\bl_\bu ;\n-636#else\n-637 _\bn_\bo_\bn_\be;\n-638#endif\n-639\n-640 template \n-_\b6_\b4_\b1 struct _\bS_\bo_\bl_\bv_\be_\br\n-642 {\n-_\b6_\b4_\b3 typedef _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bV_\be_\bc_\bt_\bo_\br_\b,_\bV_\be_\bc_\bt_\bo_\br_\b> _\bt_\by_\bp_\be;\n-_\b6_\b4_\b4 static _\bt_\by_\bp_\be* _\bc_\br_\be_\ba_\bt_\be(const M& _\bm_\ba_\bt, bool verbose, bool reusevector )\n-645 {\n-646 DUNE_THROW(NotImplemented,\"DirectSolver not selected\");\n-647 return nullptr;\n-648 }\n-_\b6_\b4_\b9 static std::string _\bn_\ba_\bm_\be () { return \"None\"; }\n-650 };\n-651#if HAVE_SUITESPARSE_UMFPACK\n-652 template \n-653 struct Solver< M, _\bu_\bm_\bf_\bp_\ba_\bc_\bk >\n-654 {\n-655 typedef _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b<_\b _\bM_\b _\b> _\bt_\by_\bp_\be;\n-656 static _\bt_\by_\bp_\be* _\bc_\br_\be_\ba_\bt_\be(const M& _\bm_\ba_\bt, bool verbose, bool reusevector )\n-657 {\n-658 return new _\bt_\by_\bp_\be(_\bm_\ba_\bt, verbose, reusevector );\n-659 }\n-660 static std::string _\bn_\ba_\bm_\be () { return \"UMFPack\"; }\n-661 };\n-662#endif\n-663#if HAVE_SUPERLU\n-664 template \n-_\b6_\b6_\b5 struct _\bS_\bo_\bl_\bv_\be_\br< M, _\bs_\bu_\bp_\be_\br_\bl_\bu >\n-666 {\n-_\b6_\b6_\b7 typedef _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\b _\bM_\b _\b> _\bt_\by_\bp_\be;\n-_\b6_\b6_\b8 static _\bt_\by_\bp_\be* _\bc_\br_\be_\ba_\bt_\be(const M& _\bm_\ba_\bt, bool verbose, bool reusevector )\n-669 {\n-670 return new _\bt_\by_\bp_\be(_\bm_\ba_\bt, verbose, reusevector );\n-671 }\n-_\b6_\b7_\b2 static std::string _\bn_\ba_\bm_\be () { return \"SuperLU\"; }\n-673 };\n-674#endif\n-675\n-676 // define direct solver type to be used\n-_\b6_\b7_\b7 typedef _\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bs_\bo_\bl_\bv_\be_\br_\b _\b> _\bS_\be_\bl_\be_\bc_\bt_\be_\bd_\bS_\bo_\bl_\bv_\be_\br ;\n-_\b6_\b7_\b8 typedef typename SelectedSolver :: type _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br;\n-_\b6_\b7_\b9 static constexpr bool _\bi_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br = _\bs_\bo_\bl_\bv_\be_\br != _\bn_\bo_\bn_\be;\n-_\b6_\b8_\b0 static std::string _\bn_\ba_\bm_\be() { return SelectedSolver :: name (); }\n-_\b6_\b8_\b1 static _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br* _\bc_\br_\be_\ba_\bt_\be(const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt, bool verbose, bool\n-reusevector )\n-682 {\n-683 return SelectedSolver :: create( _\bm_\ba_\bt, verbose, reusevector );\n-684 }\n-685 };\n-686\n-687 template\n-688 template\n-689 void AMG::createHierarchies(C& criterion,\n-690 const std::shared_ptr& matrixptr,\n-691 const PI& pinfo)\n-692 {\n-693 Timer watch;\n-694 matrices_ = std::make_shared(\n-695 std::const_pointer_cast(matrixptr),\n-696 stackobject_to_shared_ptr(const_cast(pinfo)));\n-697\n-698 matrices_->template build >(criterion);\n-699\n-700 // build the necessary smoother hierarchies\n-701 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);\n-702\n-703 // test whether we should solve on the coarse level. That is the case if we\n-704 // have that level and if there was a redistribution on this level then our\n-705 // communicator has to be valid (size()>0) as the smoother might try to\n-communicate\n-706 // in the constructor.\n-707 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels()\n-708 && ( ! matrices_->redistributeInformation().back().isSetup() ||\n-709 matrices_->parallelInformation().coarsest().getRedistributed().communicator\n-().size() ) )\n-710 {\n-711 // We have the carsest level. Create the coarse Solver\n-712 SmootherArgs sargs(smootherArgs_);\n-713 sargs.iterations = 1;\n-714\n-715 typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs cargs;\n-716 cargs.setArgs(sargs);\n-717 if(matrices_->redistributeInformation().back().isSetup()) {\n-718 // Solve on the redistributed partitioning\n-719 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat\n-());\n-720 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed\n-());\n-721 }else{\n-722 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());\n-723 cargs.setComm(*matrices_->parallelInformation().coarsest());\n-724 }\n-725\n-726 coarseSmoother_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(cargs);\n-727 scalarProduct_ = createScalarProduct(cargs.getComm(),category());\n-728\n-729 typedef DirectSolverSelector< typename M::matrix_type, X > SolverSelector;\n-730\n-731 // Use superlu if we are purely sequential or with only one processor on\n-the coarsest level.\n-732 if( SolverSelector::isDirectSolver &&\n-733 (std::is_same::value /\n-/ sequential mode\n-734 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //\n-parallel mode and only one processor\n-735 || (matrices_->parallelInformation().coarsest().isRedistributed()\n-736 && matrices_->parallelInformation().coarsest().getRedistributed\n-().communicator().size()==1\n-737 && matrices_->parallelInformation().coarsest().getRedistributed\n-().communicator().size()>0) )\n-738 )\n-739 { // redistribute and 1 proc\n-740 if(matrices_->parallelInformation().coarsest().isRedistributed())\n-741 {\n-742 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)\n-743 {\n-744 // We are still participating on this level\n-745 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest\n-().getRedistributed().getmat(), false, false));\n-746 }\n-747 else\n-748 solver_.reset();\n-749 }\n-750 else\n-751 {\n-752 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest()-\n->getmat(), false, false));\n-753 }\n-754 if(verbosity_>0 && matrices_->parallelInformation().coarsest()-\n->communicator().rank()==0)\n-755 std::cout<< \"Using a direct coarse solver (\" << SolverSelector::name() <<\n-\")\" << std::endl;\n-756 }\n-757 else\n-758 {\n-759 if(matrices_->parallelInformation().coarsest().isRedistributed())\n-760 {\n-761 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)\n-762 // We are still participating on this level\n-763\n-764 // we have to allocate these types using the rebound allocator\n-765 // in order to ensure that we fulfill the alignment requirements\n-766 solver_.reset(new BiCGSTABSolver(const_cast(matrices_->matrices\n-().coarsest().getRedistributed()),\n-767 *scalarProduct_,\n-768 *coarseSmoother_, 1E-2, 1000, 0));\n-769 else\n-770 solver_.reset();\n-771 }else\n-772 {\n-773 solver_.reset(new BiCGSTABSolver(const_cast(*matrices_->matrices\n-().coarsest()),\n-774 *scalarProduct_,\n-775 *coarseSmoother_, 1E-2, 1000, 0));\n-776 // // we have to allocate these types using the rebound allocator\n-777 // // in order to ensure that we fulfill the alignment requirements\n-778 // using Alloc = typename std::allocator_traits::template\n-rebind_alloc>;\n-779 // Alloc alloc;\n-780 // auto p = alloc.allocate(1);\n-781 // std::allocator_traits::construct(alloc, p,\n-782 // const_cast(*matrices_->matrices().coarsest()),\n-783 // *scalarProduct_,\n-784 // *coarseSmoother_, 1E-2, 1000, 0);\n-785 // solver_.reset(p,[](BiCGSTABSolver* p){\n-786 // Alloc alloc;\n-787 // std::allocator_traits::destroy(alloc, p);\n-788 // alloc.deallocate(p,1);\n-789 // });\n-790 }\n-791 }\n-792 }\n-793\n-794 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator\n-().rank()==0)\n-795 std::cout<<\"Building hierarchy of \"<maxlevels()<<\" levels \"\n-796 <<\"(including coarse solver) took \"<\n-_\b8_\b0_\b1 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b)\n-802 {\n-803 // Detect Matrix rows where all offdiagonal entries are\n-804 // zero and set x such that A_dd*x_d=b_d\n-805 // Thus users can be more careless when setting up their linear\n-806 // systems.\n-807 typedef typename M::matrix_type _\bM_\ba_\bt_\br_\bi_\bx;\n-808 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br RowIter;\n-809 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ColIter;\n-810 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be Block;\n-811 Block zero;\n-812 zero=typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be();\n-813\n-814 const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt=matrices_->matrices().finest()->getmat();\n-815 for(RowIter row=_\bm_\ba_\bt.begin(); row!=_\bm_\ba_\bt.end(); ++row) {\n-816 bool isDirichlet = true;\n-817 bool hasDiagonal = false;\n-818 Block diagonal{};\n-819 for(ColIter _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl!=row->end(); ++_\bc_\bo_\bl) {\n-820 if(row.index()==_\bc_\bo_\bl.index()) {\n-821 diagonal = *_\bc_\bo_\bl;\n-822 hasDiagonal = true;\n-823 }else{\n-824 if(*_\bc_\bo_\bl!=zero)\n-825 isDirichlet = false;\n-826 }\n-827 }\n-828 if(isDirichlet && hasDiagonal)\n-829 {\n-830 auto&& xEntry = Impl::asVector(x[row.index()]);\n-831 auto&& bEntry = Impl::asVector(b[row.index()]);\n-832 Impl::asMatrix(diagonal).solve(xEntry, bEntry);\n-833 }\n-834 }\n-835\n-836 if(smoothers_->levels()>0)\n-837 smoothers_->finest()->pre(x,b);\n-838 else\n-839 // No smoother to make x consistent! Do it by hand\n-840 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x);\n-841 rhs_ = std::make_shared>(std::make_shared(b));\n-842 lhs_ = std::make_shared>(std::make_shared(x));\n-843 update_ = std::make_shared>(std::make_shared\n-(x));\n-844 matrices_->coarsenVector(*rhs_);\n-845 matrices_->coarsenVector(*lhs_);\n-846 matrices_->coarsenVector(*update_);\n-847\n-848 // Preprocess all smoothers\n-849 typedef typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n-850 typedef typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bR_\ba_\bn_\bg_\be_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br RIterator;\n-851 typedef typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br DIterator;\n-852 Iterator coarsest = smoothers_->coarsest();\n-853 Iterator smoother = smoothers_->finest();\n-854 RIterator rhs = rhs_->finest();\n-855 DIterator lhs = lhs_->finest();\n-856 if(smoothers_->levels()>1) {\n-857\n-858 assert(lhs_->levels()==rhs_->levels());\n-859 assert(smoothers_->levels()==lhs_->levels() || matrices_->levels\n-()==matrices_->maxlevels());\n-860 assert(smoothers_->levels()+1==lhs_->levels() || matrices_->levels\n-()maxlevels());\n-861\n-862 if(smoother!=coarsest)\n-863 for(++smoother, ++lhs, ++rhs; smoother != coarsest; ++smoother, ++lhs,\n-++rhs)\n-864 smoother->pre(*lhs,*rhs);\n-865 smoother->pre(*lhs,*rhs);\n-866 }\n-867\n-868\n-869 // The preconditioner might change x and b. So we have to\n-870 // copy the changes to the original vectors.\n-871 x = *lhs_->finest();\n-872 b = *rhs_->finest();\n-873\n-874 }\n-875 template\n-_\b8_\b7_\b6 std::size_t _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs()\n-877 {\n-878 return matrices_->levels();\n-879 }\n-880 template\n-_\b8_\b8_\b1 std::size_t _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs()\n-882 {\n-883 return matrices_->maxlevels();\n-884 }\n-885\n-887 template\n-_\b8_\b8_\b8 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n-889 {\n-890 LevelContext levelContext;\n-891\n-892 if(additive) {\n-893 *(rhs_->finest())=d;\n-894 additiveMgc();\n-895 v=*lhs_->finest();\n-896 }else{\n-897 // Init all iterators for the current level\n-898 initIteratorsWithFineLevel(levelContext);\n-899\n-900\n-901 *levelContext.lhs = v;\n-902 *levelContext.rhs = d;\n-903 *levelContext.update=0;\n-904 levelContext.level=0;\n-905\n-906 mgc(levelContext);\n-907\n-908 if(postSteps_==0||matrices_->maxlevels()==1)\n-909 levelContext.pinfo->copyOwnerToAll(*levelContext.update,\n-*levelContext.update);\n-910\n-911 v=*levelContext.update;\n-912 }\n-913\n-914 }\n-915\n-916 template\n-917 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\bW_\bi_\bt_\bh_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl(LevelContext&\n-levelContext)\n-918 {\n-919 levelContext.smoother = smoothers_->finest();\n-920 levelContext.matrix = matrices_->matrices().finest();\n-921 levelContext.pinfo = matrices_->parallelInformation().finest();\n-922 levelContext.redist =\n-923 matrices_->redistributeInformation().begin();\n-924 levelContext.aggregates = matrices_->aggregatesMaps().begin();\n-925 levelContext.lhs = lhs_->finest();\n-926 levelContext.update = update_->finest();\n-927 levelContext.rhs = rhs_->finest();\n-928 }\n-929\n-930 template\n-931 bool AMG\n-932 ::moveToCoarseLevel(LevelContext& levelContext)\n-933 {\n-934\n-935 bool processNextLevel=true;\n-936\n-937 if(levelContext.redist->isSetup()) {\n-938 levelContext.redist->redistribute(static_cast\n-(*levelContext.rhs),\n-939 levelContext.rhs.getRedistributed());\n-940 processNextLevel = levelContext.rhs.getRedistributed().size()>0;\n-941 if(processNextLevel) {\n-942 //restrict defect to coarse level right hand side.\n-943 typename Hierarchy::Iterator fineRhs = levelContext.rhs++;\n-944 ++levelContext.pinfo;\n-945 Transfer\n-946 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,\n-947 static_cast(fineRhs.getRedistributed()),\n-948 *levelContext.pinfo);\n-949 }\n-950 }else{\n-951 //restrict defect to coarse level right hand side.\n-952 typename Hierarchy::Iterator fineRhs = levelContext.rhs++;\n-953 ++levelContext.pinfo;\n-954 Transfer\n-955 ::restrictVector(*(*levelContext.aggregates),\n-956 *levelContext.rhs, static_cast(*fineRhs),\n-957 *levelContext.pinfo);\n-958 }\n-959\n-960 if(processNextLevel) {\n-961 // prepare coarse system\n-962 ++levelContext.lhs;\n-963 ++levelContext.update;\n-964 ++levelContext.matrix;\n-965 ++levelContext.level;\n-966 ++levelContext.redist;\n-967\n-968 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_-\n->levels()maxlevels()) {\n-969 // next level is not the globally coarsest one\n-970 ++levelContext.smoother;\n-971 ++levelContext.aggregates;\n-972 }\n-973 // prepare the update on the next level\n-974 *levelContext.update=0;\n-975 }\n-976 return processNextLevel;\n-977 }\n-978\n-979 template\n-980 void AMG\n-981 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel)\n-982 {\n-983 if(processNextLevel) {\n-984 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_-\n->levels()maxlevels()) {\n-985 // previous level is not the globally coarsest one\n-986 --levelContext.smoother;\n-987 --levelContext.aggregates;\n-988 }\n-989 --levelContext.redist;\n-990 --levelContext.level;\n-991 //prolongate and add the correction (update is in coarse left hand side)\n-992 --levelContext.matrix;\n-993\n-994 //typename Hierarchy::Iterator coarseLhs = lhs--;\n-995 --levelContext.lhs;\n-996 --levelContext.pinfo;\n-997 }\n-998 if(levelContext.redist->isSetup()) {\n-999 // Need to redistribute during prolongateVector\n-1000 levelContext.lhs.getRedistributed()=0;\n-1001 Transfer\n-1002 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update,\n-*levelContext.lhs,\n-1003 levelContext.lhs.getRedistributed(),\n-1004 matrices_->getProlongationDampingFactor(),\n-1005 *levelContext.pinfo, *levelContext.redist);\n-1006 }else{\n-1007 *levelContext.lhs=0;\n-1008 Transfer\n-1009 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update,\n-*levelContext.lhs,\n-1010 matrices_->getProlongationDampingFactor(),\n-1011 *levelContext.pinfo);\n-1012 }\n-1013\n-1014\n-1015 if(processNextLevel) {\n-1016 --levelContext.update;\n-1017 --levelContext.rhs;\n-1018 }\n-1019\n-1020 *levelContext.update += *levelContext.lhs;\n-1021 }\n-1022\n-1023 template\n-_\b1_\b0_\b2_\b4 bool _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br() const\n-1025 {\n-1026 return _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be;\n-1027 }\n-1028\n-1029 template\n-1030 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bm_\bg_\bc(LevelContext& levelContext){\n-1031 if(levelContext.matrix == matrices_->matrices().coarsest() && levels\n-()==maxlevels()) {\n-1032 // Solve directly\n-1033 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt res;\n-1034 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd=true; // If we do not compute this flag will not get updated\n-1035 if(levelContext.redist->isSetup()) {\n-1036 levelContext.redist->redistribute(*levelContext.rhs,\n-levelContext.rhs.getRedistributed());\n-1037 if(levelContext.rhs.getRedistributed().size()>0) {\n-1038 // We are still participating in the computation\n-1039 levelContext.pinfo.getRedistributed().copyOwnerToAll\n-(levelContext.rhs.getRedistributed(),\n-1040 levelContext.rhs.getRedistributed());\n-1041 solver_->apply(levelContext.update.getRedistributed(),\n-1042 levelContext.rhs.getRedistributed(), res);\n-1043 }\n-1044 levelContext.redist->redistributeBackward(*levelContext.update,\n-levelContext.update.getRedistributed());\n-1045 levelContext.pinfo->copyOwnerToAll(*levelContext.update,\n-*levelContext.update);\n-1046 }else{\n-1047 levelContext.pinfo->copyOwnerToAll(*levelContext.rhs, *levelContext.rhs);\n-1048 solver_->apply(*levelContext.update, *levelContext.rhs, res);\n-1049 }\n-1050\n-1051 if (!res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd)\n-1052 coarsesolverconverged = false;\n-1053 }else{\n-1054 // presmoothing\n-1055 _\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh(levelContext, preSteps_);\n-1056\n-1057#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION\n-1058 bool processNextLevel = moveToCoarseLevel(levelContext);\n-1059\n-1060 if(processNextLevel) {\n-1061 // next level\n-1062 for(std::size_t i=0; imatrices().coarsest() && levels\n-()==maxlevels())\n-1065 break;\n-1066 if(i+1 < gamma_){\n-1067 levelContext.matrix->applyscaleadd(-1., *levelContext.lhs,\n-*levelContext.rhs);\n-1068 }\n-1069 }\n-1070 }\n-1071\n-1072 moveToFineLevel(levelContext, processNextLevel);\n-1073#else\n-1074 *lhs=0;\n-1075#endif\n-1076\n-1077 if(levelContext.matrix == matrices_->matrices().finest()) {\n-1078 coarsesolverconverged = matrices_->parallelInformation().finest()-\n->communicator().prod(coarsesolverconverged);\n-1079 if(!coarsesolverconverged)\n-1080 DUNE_THROW(MathError, \"Coarse solver did not converge\");\n-1081 }\n-1082 // postsmoothing\n-1083 _\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh(levelContext, postSteps_);\n-1084\n-1085 }\n-1086 }\n-1087\n-1088 template\n-1089 void AMG::additiveMgc(){\n-1090\n-1091 // restrict residual to all levels\n-1092 typename ParallelInformationHierarchy::Iterator pinfo=matrices_-\n->parallelInformation().finest();\n-1093 typename Hierarchy::Iterator rhs=rhs_->finest();\n-1094 typename Hierarchy::Iterator lhs = lhs_->finest();\n-1095 typename OperatorHierarchy::AggregatesMapList::const_iterator\n-aggregates=matrices_->aggregatesMaps().begin();\n-1096\n-1097 for(typename Hierarchy::Iterator fineRhs=rhs++; fineRhs != rhs_-\n->coarsest(); fineRhs=rhs++, ++aggregates) {\n-1098 ++pinfo;\n-1099 Transfer\n-1100 ::restrictVector(*(*aggregates), *rhs, static_cast\n-(*fineRhs), *pinfo);\n-1101 }\n-1102\n-1103 // pinfo is invalid, set to coarsest level\n-1104 //pinfo = matrices_->parallelInformation().coarsest\n-1105 // calculate correction for all levels\n-1106 lhs = lhs_->finest();\n-1107 typename Hierarchy::Iterator smoother = smoothers_->finest();\n-1108\n-1109 for(rhs=rhs_->finest(); rhs != rhs_->coarsest(); ++lhs, ++rhs, ++smoother)\n-{\n-1110 // presmoothing\n-1111 *lhs=0;\n-1112 smoother->apply(*lhs, *rhs);\n-1113 }\n-1114\n-1115 // Coarse level solve\n-1116#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION\n-1117 InverseOperatorResult res;\n-1118 pinfo->copyOwnerToAll(*rhs, *rhs);\n-1119 solver_->apply(*lhs, *rhs, res);\n-1120\n-1121 if(!res.converged)\n-1122 DUNE_THROW(MathError, \"Coarse solver did not converge\");\n-1123#else\n-1124 *lhs=0;\n-1125#endif\n-1126 // Prologate and add up corrections from all levels\n-1127 --pinfo;\n-1128 --aggregates;\n-1129\n-1130 for(typename Hierarchy::Iterator coarseLhs = lhs--; coarseLhs !=\n-lhs_->finest(); coarseLhs = lhs--, --aggregates, --pinfo) {\n-1131 Transfer\n-1132 ::prolongateVector(*(*aggregates), *coarseLhs, *lhs, 1.0, *pinfo);\n-1133 }\n-1134 }\n-1135\n-1136\n-1138 template\n-_\b1_\b1_\b3_\b9 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bp_\bo_\bs_\bt([[maybe_unused]] _\bD_\bo_\bm_\ba_\bi_\bn& x)\n-1140 {\n-1141 // Postprocess all smoothers\n-1142 typedef typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n-1143 typedef typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br DIterator;\n-1144 Iterator coarsest = smoothers_->coarsest();\n-1145 Iterator smoother = smoothers_->finest();\n-1146 DIterator lhs = lhs_->finest();\n-1147 if(smoothers_->levels()>0) {\n-1148 if(smoother != coarsest || matrices_->levels()maxlevels())\n-1149 smoother->post(*lhs);\n-1150 if(smoother!=coarsest)\n-1151 for(++smoother, ++lhs; smoother != coarsest; ++smoother, ++lhs)\n-1152 smoother->post(*lhs);\n-1153 smoother->post(*lhs);\n-1154 }\n-1155 lhs_ = nullptr;\n-1156 update_ = nullptr;\n-1157 rhs_ = nullptr;\n-1158 }\n-1159\n-1160 template\n-1161 template\n-_\b1_\b1_\b6_\b2 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs(std::vector& cont)\n-1163 {\n-1164 matrices_->getCoarsestAggregatesOnFinest(cont);\n-1165 }\n-1166\n-1167 } // end namespace Amg\n-1168\n-_\b1_\b1_\b6_\b9 struct _\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br{\n-_\b1_\b1_\b7_\b0 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be : std::false_type{};\n-_\b1_\b1_\b7_\b1 template struct\n-_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx> : std::true_type{};\n-1172\n-1173 template\n-1174 std::shared_ptr >\n-_\b1_\b1_\b7_\b5 _\bm_\ba_\bk_\be_\bA_\bM_\bG(const OP& op, const std::string& smoother, const Dune::\n-ParameterTree& config) const\n-1176 {\n-1177 DUNE_THROW(Dune::Exception, \"Operator type not supported by AMG\");\n-1178 }\n-1179\n-1180 template\n-1181 std::shared_ptr >\n-_\b1_\b1_\b8_\b2 _\bm_\ba_\bk_\be_\bA_\bM_\bG(const std::shared_ptr<_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b>>& op, const std::\n-string& smoother,\n-1183 const Dune::ParameterTree& config) const\n-1184 {\n-1185 using OP = _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b>;\n-1186\n-1187 if(smoother == \"ssor\")\n-1188 return std::make_shared>>(op, config);\n-1189 if(smoother == \"sor\")\n-1190 return std::make_shared>>(op, config);\n-1191 if(smoother == \"jac\")\n-1192 return std::make_shared>>(op, config);\n-1193 if(smoother == \"gs\")\n-1194 return std::make_shared>>(op, config);\n-1195 if(smoother == \"ilu\")\n-1196 return std::make_shared>>(op, config);\n-1197 else\n-1198 DUNE_THROW(Dune::Exception, \"Unknown smoother for AMG\");\n-1199 }\n-1200\n-1201 template\n-1202 std::shared_ptr >\n-_\b1_\b2_\b0_\b3 _\bm_\ba_\bk_\be_\bA_\bM_\bG(const std::shared_ptr<_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b>>& op,\n-const std::string& smoother,\n-1204 const Dune::ParameterTree& config) const\n-1205 {\n-1206 using OP = _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b>;\n-1207\n-1208 auto cop = std::static_pointer_cast(op);\n-1209\n-1210 if(smoother == \"ssor\")\n-1211 return std::make_shared>,C>>(cop, config, op->getCommunication\n-());\n-1212 if(smoother == \"sor\")\n-1213 return std::make_shared>,C>>(cop, config, op->getCommunication\n-());\n-1214 if(smoother == \"jac\")\n-1215 return std::make_shared>,C>>(cop, config, op->getCommunication\n-());\n-1216 if(smoother == \"gs\")\n-1217 return std::make_shared>,C>>(cop, config, op->getCommunication\n-());\n-1218 if(smoother == \"ilu\")\n-1219 return std::make_shared>,C>>(cop, config, op->getCommunication\n-());\n-1220 else\n-1221 DUNE_THROW(Dune::Exception, \"Unknown smoother for AMG\");\n-1222 }\n-1223\n-1224 template\n-1225 std::shared_ptr >\n-_\b1_\b2_\b2_\b6 _\bm_\ba_\bk_\be_\bA_\bM_\bG(const std::shared_ptr<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b>>& op,\n-const std::string& smoother,\n-1227 const Dune::ParameterTree& config) const\n-1228 {\n-1229 using OP = _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b>;\n-1230\n-1231 if(smoother == \"ssor\")\n-1232 return std::make_shared>,C>>(op, config, op-\n->getCommunication());\n-1233 if(smoother == \"sor\")\n-1234 return std::make_shared>,C>>(op, config, op-\n->getCommunication());\n-1235 if(smoother == \"jac\")\n-1236 return std::make_shared>,C>>(op, config, op-\n->getCommunication());\n-1237 if(smoother == \"gs\")\n-1238 return std::make_shared>,C>>(op, config, op-\n->getCommunication());\n-1239 if(smoother == \"ilu\")\n-1240 return std::make_shared>,C>>(op, config, op-\n->getCommunication());\n-1241 else\n-1242 DUNE_THROW(Dune::Exception, \"Unknown smoother for AMG\");\n-1243 }\n-1244\n-1245 template\n-1246 std::shared_ptr\n+11#include \n+12#include \n+13\n+14#ifdef __cplusplus\n+15extern \"C\"\n+16{\n+17#include \n+18#include \n+19}\n+20#endif\n+21\n+22#include \n+23\n+24#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n+25#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n+26#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+27#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n+28\n+29namespace _\bD_\bu_\bn_\be {\n+41 // forward declarations\n+42 template\n+43 class SeqOverlappingSchwarz;\n+44\n+45 template\n+46 struct SeqOverlappingSchwarzAssemblerHelper;\n+47\n+54 template\n+_\b5_\b5 class _\bL_\bD_\bL\n+56 {};\n+57\n+71 template\n+_\b7_\b2 class _\bL_\bD_\bL<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A > >\n+73 : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br, typename std::\n+allocator_traits::template rebind_alloc > >,\n+74 BlockVector, typename std::allocator_traits::template\n+rebind_alloc > > >\n+75 {\n+76 public:\n+_\b7_\b8 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b7_\b9 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n+_\b8_\b1 typedef Dune::ISTL::Impl::BCCSMatrix _\bL_\bD_\bL_\bM_\ba_\bt_\br_\bi_\bx;\n+_\b8_\b3 typedef ISTL::Impl::BCCSMatrixInitializer,A>,\n+int> _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n+_\b8_\b5 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bm_\b>, typename std::\n+allocator_traits::template rebind_alloc > > _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+_\b8_\b7 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bn_\b>, typename std::\n+allocator_traits::template rebind_alloc > > _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+88\n+_\b9_\b0 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+91 {\n+92 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+93 }\n+94\n+_\b1_\b0_\b4 _\bL_\bD_\bL(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose=0) : matrixIsLoaded_(false), verbose_\n+(verbose)\n+105 {\n+106 //check whether T is a supported type\n+107 static_assert(std::is_same::value,\"Unsupported Type in LDL (only\n+double supported)\");\n+108 setMatrix(matrix);\n+109 }\n+110\n+_\b1_\b2_\b0 _\bL_\bD_\bL(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose, bool) : matrixIsLoaded_(false),\n+verbose_(verbose)\n+121 {\n+122 //check whether T is a supported type\n+123 static_assert(std::is_same::value,\"Unsupported Type in LDL (only\n+double supported)\");\n+124 setMatrix(matrix);\n+125 }\n+126\n+_\b1_\b3_\b6 _\bL_\bD_\bL(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const ParameterTree& config)\n+137 : _\bL_\bD_\bL(matrix, config._\bg_\be_\bt(\"verbose\", 0))\n+138 {}\n+139\n+_\b1_\b4_\b1 _\bL_\bD_\bL() : matrixIsLoaded_(false), verbose_(0)\n+142 {}\n+143\n+_\b1_\b4_\b5 virtual _\b~_\bL_\bD_\bL()\n+146 {\n+147 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)\n+148 free();\n+149 }\n+150\n+_\b1_\b5_\b2 virtual void _\ba_\bp_\bp_\bl_\by(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt&\n+res)\n+153 {\n+154 const int dimMat(ldlMatrix_.N());\n+155 ldl_perm(dimMat, Y_, reinterpret_cast(&b[0]), P_);\n+156 ldl_lsolve(dimMat, Y_, Lp_, Li_, Lx_);\n+157 ldl_dsolve(dimMat, Y_, D_);\n+158 ldl_ltsolve(dimMat, Y_, Lp_, Li_, Lx_);\n+159 ldl_permt(dimMat, reinterpret_cast(&x[0]), Y_, P_);\n+160 // this is a direct solver\n+161 res._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 1;\n+162 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = true;\n+163 }\n+164\n+_\b1_\b6_\b6 virtual void _\ba_\bp_\bp_\bl_\by(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, [[maybe_unused]] double\n+reduction, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+167 {\n+168 apply(x,b,res);\n+169 }\n+170\n+_\b1_\b7_\b6 void _\ba_\bp_\bp_\bl_\by(T* x, T* b)\n+177 {\n+178 const int dimMat(ldlMatrix_.N());\n+179 ldl_perm(dimMat, Y_, b, P_);\n+180 ldl_lsolve(dimMat, Y_, Lp_, Li_, Lx_);\n+181 ldl_dsolve(dimMat, Y_, D_);\n+182 ldl_ltsolve(dimMat, Y_, Lp_, Li_, Lx_);\n+183 ldl_permt(dimMat, x, Y_, P_);\n+184 }\n+185\n+_\b1_\b8_\b6 void _\bs_\be_\bt_\bO_\bp_\bt_\bi_\bo_\bn([[maybe_unused]] unsigned int option, [[maybe_unused]]\n+double value)\n+187 {}\n+188\n+_\b1_\b9_\b0 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix)\n+191 {\n+192 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)\n+193 free();\n+194\n+195 if (ldlMatrix_.N() + ldlMatrix_.M() + ldlMatrix_.nonzeroes() != 0)\n+196 ldlMatrix_.free();\n+197 ldlMatrix_.setSize(_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(matrix),\n+198 _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(matrix));\n+199 ISTL::Impl::BCCSMatrixInitializer initializer(ldlMatrix_);\n+200\n+201 copyToBCCSMatrix(initializer, matrix);\n+202\n+203 decompose();\n+204 }\n+205\n+206 template\n+_\b2_\b0_\b7 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const S& rowIndexSet)\n+208 {\n+209 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)\n+210 free();\n+211\n+212 if (ldlMatrix_.N() + ldlMatrix_.M() + ldlMatrix_.nonzeroes() != 0)\n+213 ldlMatrix_.free();\n+214\n+215 ldlMatrix_.setSize(rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+(matrix) / matrix._\bN(),\n+216 rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(matrix) / matrix._\bM());\n+217 ISTL::Impl::BCCSMatrixInitializer initializer(ldlMatrix_);\n+218\n+219 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_\bM_\ba_\bt_\br_\bi_\bx,std::\n+set >(matrix,rowIndexSet));\n+220\n+221 decompose();\n+222 }\n+223\n+_\b2_\b2_\b8 inline void _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(int v)\n+229 {\n+230 verbose_=v;\n+231 }\n+232\n+_\b2_\b3_\b7 inline _\bL_\bD_\bL_\bM_\ba_\bt_\br_\bi_\bx& _\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx()\n+238 {\n+239 return ldlMatrix_;\n+240 }\n+241\n+_\b2_\b4_\b6 void _\bf_\br_\be_\be()\n+247 {\n+248 delete [] D_;\n+249 delete [] Y_;\n+250 delete [] Lp_;\n+251 delete [] Lx_;\n+252 delete [] Li_;\n+253 delete [] P_;\n+254 delete [] Pinv_;\n+255 ldlMatrix_.free();\n+256 matrixIsLoaded_ = false;\n+257 }\n+258\n+_\b2_\b6_\b0 inline const char* _\bn_\ba_\bm_\be()\n+261 {\n+262 return \"LDL\";\n+263 }\n+264\n+_\b2_\b6_\b9 inline double* _\bg_\be_\bt_\bD()\n+270 {\n+271 return D_;\n+272 }\n+273\n+_\b2_\b7_\b8 inline int* _\bg_\be_\bt_\bL_\bp()\n+279 {\n+280 return Lp_;\n+281 }\n+282\n+_\b2_\b8_\b7 inline int* _\bg_\be_\bt_\bL_\bi()\n+288 {\n+289 return Li_;\n+290 }\n+291\n+_\b2_\b9_\b6 inline double* _\bg_\be_\bt_\bL_\bx()\n+297 {\n+298 return Lx_;\n+299 }\n+300\n+301 private:\n+302 template\n+_\b3_\b0_\b3 friend class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n+304\n+305 friend struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bL_\bD_\bL<_\bM_\ba_\bt_\br_\bi_\bx>,true>;\n+306\n+308 void decompose()\n+309 {\n+310 // allocate vectors\n+311 const int dimMat(ldlMatrix_.N());\n+312 D_ = new double [dimMat];\n+313 Y_ = new double [dimMat];\n+314 Lp_ = new int [dimMat + 1];\n+315 Parent_ = new int [dimMat];\n+316 Lnz_ = new int [dimMat];\n+317 Flag_ = new int [dimMat];\n+318 Pattern_ = new int [dimMat];\n+319 P_ = new int [dimMat];\n+320 Pinv_ = new int [dimMat];\n+321\n+322 double Info [AMD_INFO];\n+323 if(amd_order (dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(),\n+P_, (double *) NULL, Info) < AMD_OK)\n+324 DUNE_THROW(InvalidStateException,\"Error: AMD failed!\");\n+325 if(verbose_ > 0)\n+326 amd_info (Info);\n+327 // compute the symbolic factorisation\n+328 ldl_symbolic(dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(),\n+Lp_, Parent_, Lnz_, Flag_, P_, Pinv_);\n+329 // initialise those entries of additionalVectors_ whose dimension is known\n+only now\n+330 Lx_ = new double [Lp_[dimMat]];\n+331 Li_ = new int [Lp_[dimMat]];\n+332 // compute the numeric factorisation\n+333 const int rank(ldl_numeric(dimMat, ldlMatrix_.getColStart(),\n+ldlMatrix_.getRowIndex(), ldlMatrix_.getValues(),\n+334 Lp_, Parent_, Lnz_, Li_, Lx_, D_, Y_, Pattern_, Flag_, P_, Pinv_));\n+335 // free temporary vectors\n+336 delete [] Flag_;\n+337 delete [] Pattern_;\n+338 delete [] Parent_;\n+339 delete [] Lnz_;\n+340\n+341 if(rank!=dimMat)\n+342 DUNE_THROW(InvalidStateException,\"Error: LDL factorisation failed!\");\n+343 }\n+344\n+345 LDLMatrix ldlMatrix_;\n+346 bool matrixIsLoaded_;\n+347 int verbose_;\n+348 int* Lp_;\n+349 int* Parent_;\n+350 int* Lnz_;\n+351 int* Flag_;\n+352 int* Pattern_;\n+353 int* P_;\n+354 int* Pinv_;\n+355 double* D_;\n+356 double* Y_;\n+357 double* Lx_;\n+358 int* Li_;\n+359 };\n+360\n+361 template\n+_\b3_\b6_\b2 struct _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br<_\bL_\bD_\bL<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A> > >\n+363 {\n+_\b3_\b6_\b4 enum {_\bv_\ba_\bl_\bu_\be = true};\n+365 };\n+366\n+367 template\n+_\b3_\b6_\b8 struct _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd<_\bL_\bD_\bL<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A> > >\n+369 {\n+_\b3_\b7_\b0 enum {_\bv_\ba_\bl_\bu_\be = true};\n+371 };\n+372\n+_\b3_\b7_\b3 struct _\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br {\n+_\b3_\b7_\b4 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::false_type{};\n+_\b3_\b7_\b5 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk> : std::true_type\n+{};\n+376\n+377 template\n+378 std::shared_ptr::type,\n-1247 typename Dune::TypeListElement<2, TL>::type>>\n-_\b1_\b2_\b4_\b8 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL tl, const std::shared_ptr& op, const Dune::\n-ParameterTree& config,\n-1249 std::enable_if_t<_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\bP_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be,int> = 0) const\n-1250 {\n-1251 using field_type = typename OP::matrix_type::field_type;\n-1252 using real_type = typename FieldTraits::real_type;\n-1253 if (!std::is_convertible())\n-1254 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be, \"AMG needs field_type(\" <<\n-1255 className() <<\n-1256 \") to be convertible to its real_type (\" <<\n-1257 className() <<\n-1258 \").\");\n-1259 std::string smoother = config.get(\"smoother\", \"ssor\");\n-1260 return _\bm_\ba_\bk_\be_\bA_\bM_\bG(op, smoother, config);\n-1261 }\n-1262\n-1263 template\n-1264 std::shared_ptr::type>>\n+_\b3_\b8_\b0 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& _\bm_\ba_\bt, const Dune::ParameterTree& config,\n+381 std::enable_if_t<\n+382 _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk::type::block_type>::\n+value,int> = 0) const\n+383 {\n+384 int verbose = config.get(\"verbose\", 0);\n+385 return std::make_shared>(_\bm_\ba_\bt,verbose);\n+386 }\n+387\n+388 // second version with SFINAE to validate the template parameters of LDL\n+389 template\n+390 std::shared_ptr::type,\n-1265 typename Dune::TypeListElement<2, TL>::type>>\n-_\b1_\b2_\b6_\b6 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const std::shared_ptr& /*mat*/, const Dune::\n-ParameterTree& /*config*/,\n-1267 std::enable_if_t_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be,int> = 0) const\n-1268 {\n-1269 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be, \"AMG needs a FieldMatrix as Matrix\n-block_type\");\n-1270 }\n-1271 };\n-1272\n-_\b1_\b2_\b7_\b3 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(\"amg\", _\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br());\n-1274} // end namespace Dune\n-1275\n-1276#endif\n-_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh\n-Classes for using SuperLU with ISTL matrices.\n-_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR\n-#define DUNE_REGISTER_PRECONDITIONER(name,...)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:16\n-_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\n-Define base class for scalar product and norm.\n-_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh\n-Classes for using UMFPack with ISTL matrices.\n+391 typename Dune::TypeListElement<2, TL>::type>>\n+_\b3_\b9_\b2 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /\n+*config*/,\n+393 std::enable_if_t<\n+394 !_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk::type::block_type>::\n+value,int> = 0) const\n+395 {\n+396 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be,\n+397 \"Unsupported Type in LDL (only double and std::complex\n+supported)\");\n+398 }\n+399 };\n+_\b4_\b0_\b0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"ldl\", _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br());\n+401\n+402} // end namespace Dune\n+403\n+404\n+405#endif //HAVE_SUITESPARSE_LDL\n+406#endif //DUNE_ISTL_LDL_HH\n+_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh\n _\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n Implementations of the inverse operator interface.\n-_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh\n-Prolongation and restriction for amg.\n-_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh\n-Provides a classes representing the hierarchies in AMG.\n-_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\n-Classes for the generic construction and application of the smoothers.\n+_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh\n _\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n Templates characterizing the type of a solver.\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR\n+#define DUNE_REGISTER_DIRECT_SOLVER(name,...)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:13\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+Dune::BlockVector< FieldVector< T, m >, typename std::allocator_traits< A >::\n+template rebind_alloc< FieldVector< T, m > > > domain_type\n+The type of the domain of the solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n+The matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bL_\bp\n+int * getLp()\n+Get factorization Lp.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n+LDLMatrix & getInternalMatrix()\n+Return the column compress matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:237\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bL_\bD_\bL_\bM_\ba_\bt_\br_\bi_\bx\n+Dune::ISTL::Impl::BCCSMatrix< T, int > LDLMatrix\n+The corresponding SuperLU Matrix type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bL_\bx\n+double * getLx()\n+Get factorization Lx.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:296\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by\n+void setVerbosity(int v)\n+Sets the verbosity level for the solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:228\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(T *x, T *b)\n+Additional apply method with c-arrays in analogy to superlu.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:176\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(domain_type &x, range_type &b, double reduction,\n+InverseOperatorResult &res)\n+apply inverse operator, with given convergence criteria.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:166\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Dune::BlockVector< FieldVector< T, n >, typename std::allocator_traits< A >::\n+template rebind_alloc< FieldVector< T, n > > > range_type\n+The type of the range of the solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\b~_\bL_\bD_\bL\n+virtual ~LDL()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:145\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\br_\be_\be\n+void free()\n+Free allocated space.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:246\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)\n+Apply inverse operator,.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:152\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bL_\bi\n+int * getLi()\n+Get factorization Li.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:287\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n+Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > matrix_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+void setMatrix(const Matrix &matrix)\n+Initialize data from given matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:190\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bO_\bp_\bt_\bi_\bo_\bn\n+void setOption(unsigned int option, double value)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:186\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bL_\bD_\bL\n+LDL(const Matrix &matrix, int verbose, bool)\n+Constructor for compatibility with SuperLU standard constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bD\n+double * getD()\n+Get factorization diagonal matrix D.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:269\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bL_\bD_\bL\n+LDL(const Matrix &matrix, const ParameterTree &config)\n+Constructs the LDL solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the solver (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:90\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+ISTL::Impl::BCCSMatrixInitializer< BCRSMatrix< FieldMatrix< T, n, m >, A >, int\n+> MatrixInitializer\n+Type of an associated initializer class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL\n+>::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const\n+M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock<\n+typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0)\n+const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:380\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bn_\ba_\bm_\be\n+const char * name()\n+Get method name.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:260\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n+void setSubMatrix(const Matrix &matrix, const S &rowIndexSet)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:207\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bL_\bD_\bL\n+LDL()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:141\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bL_\bD_\bL\n+LDL(const Matrix &matrix, int verbose=0)\n+Construct a solver object from a BCRSMatrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:104\n _\bm_\ba_\bt\n Matrix & mat\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bA_\bM_\bG\n-AMG(const AMG &amg)\n-Copy constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bp_\br_\be\n-void pre(Domain &x, Range &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:801\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be\n-static DirectSolver * create(const Matrix &mat, bool verbose, bool reusevector)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:681\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bn_\ba_\bm_\be\n-static std::string name()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:680\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bu_\bp_\bd_\ba_\bt_\be\n-Hierarchy< Domain, A >::Iterator update\n-The iterator over the updates.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:303\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\br_\bh_\bs\n-Hierarchy< Range, A >::Iterator rhs\n-The iterator over the right hand sided.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:307\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bs_\bu_\bp_\be_\br_\bl_\bu_\b _\b>_\b:_\b:_\bn_\ba_\bm_\be\n-static std::string name()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:672\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n-bool usesDirectCoarseLevelSolver() const\n-Check whether the coarse solver used is a direct solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1024\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n-X Domain\n-The domain type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be\n-static type * create(const M &mat, bool verbose, bool reusevector)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:644\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bA_\bM_\bG\n-AMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const SmootherArgs\n-&smootherArgs, const Parameters &parms)\n-Construct a new amg with a specific coarse solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:406\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bA_\bM_\bG\n-AMG(std::shared_ptr< const Operator > fineOperator, const ParameterTree\n-&configuration, const ParallelInformation &pinfo=ParallelInformation())\n-Constructor an AMG via ParameterTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:452\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bp_\bi_\bn_\bf_\bo\n-ParallelInformationHierarchy::Iterator pinfo\n-The iterator over the parallel information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:287\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bT_\by_\bp_\be\n-SolverType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:627\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs\n-OperatorHierarchy::AggregatesMapList::const_iterator aggregates\n-The iterator over the aggregates maps.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:295\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-SmootherTraits< Smoother >::Arguments SmootherArgs\n-The argument type for the construction of the smoother.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\be_\bd_\bS_\bo_\bl_\bv_\be_\br\n-Solver< Matrix, solver > SelectedSolver\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:677\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bk_\be_\bA_\bM_\bG\n-std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr<\n-MatrixAdapter< M, X, Y > > &op, const std::string &smoother, const Dune::\n-ParameterTree &config) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bT_\bo_\bL_\bo_\bw_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-std::string operator()(const std::string &str)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:378\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bk_\be_\bA_\bM_\bG\n-std::shared_ptr< Dune::Preconditioner< typename OP::element_type::domain_type,\n-typename OP::element_type::range_type > > makeAMG(const OP &op, const std::\n-string &smoother, const Dune::ParameterTree &config) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1175\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n-S Smoother\n-The type of the smoother.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:97\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bn_\ba_\bm_\be\n-static std::string name()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:649\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br\n-Hierarchy< Smoother, A >::Iterator smoother\n-The iterator over the smoothers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:279\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-M Operator\n-The matrix operator type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n-OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix\n-The iterator over the matrices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:283\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bs_\bu_\bp_\be_\br_\bl_\bu_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-SuperLU< M > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:667\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bs_\bu_\bp_\be_\br_\bl_\bu_\b _\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be\n-static type * create(const M &mat, bool verbose, bool reusevector)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:668\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt\n-OperatorHierarchy::RedistributeInfoList::const_iterator redist\n-The iterator over the redistribution information.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:291\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be\n-X Range\n-The range type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:89\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh\n-void presmooth(LevelContext &levelContext, size_t steps)\n-Apply pre smoothing on the current level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:406\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs\n-void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)\n-Get the aggregate number of each unknown on the coarsest level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1162\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs\n-std::size_t levels()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:876\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bt_\by_\bp_\be\n-InverseOperator< Vector, Vector > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:643\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bk_\be_\bA_\bM_\bG\n-std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr<\n-OverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother,\n-const Dune::ParameterTree &config) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1203\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bl_\bh_\bs\n-Hierarchy< Domain, A >::Iterator lhs\n-The iterator over the left hand side.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n-const void * Arguments\n-A type holding all the arguments needed to call the constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bo_\bl_\bv_\be_\br\n-static constexpr SolverType solver\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:629\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n-static std::shared_ptr< T > construct(Arguments &args)\n-Construct an object with the specified arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n-static constexpr bool isDirectSolver\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:679\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-void recalculateHierarchy()\n-Recalculate the matrix hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:221\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Matrix::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:626\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n-SelectedSolver::type DirectSolver\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:678\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-std::shared_ptr< Dune::Preconditioner< typename Dune::TypeListElement< 1, TL\n->::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL tl,\n-const std::shared_ptr< OP > &op, const Dune::ParameterTree &config, std::\n-enable_if_t< isValidBlockType< typename OP::matrix_type::block_type >::value,\n-int >=0) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1248\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy\n-The parallal data distribution hierarchy type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br\n-InverseOperator< X, X > CoarseSolver\n-the type of the coarse solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bp_\bo_\bs_\bt\n-void post(Domain &x)\n-Clean up.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1139\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs\n-std::size_t maxlevels()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:881\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bk_\be_\bA_\bM_\bG\n-std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr<\n-NonoverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother,\n-const Dune::ParameterTree &config) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1226\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh\n-void postsmooth(LevelContext &levelContext, size_t steps)\n-Apply post smoothing on the current level.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:428\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bl_\be_\bv_\be_\bl\n-std::size_t level\n-The level index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:311\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bA_\bM_\bG\n-AMG(const Operator &fineOperator, const C &criterion, const SmootherArgs\n-&smootherArgs=SmootherArgs(), const ParallelInformation\n-&pinfo=ParallelInformation())\n-Construct an AMG with an inexact coarse solver based on the smoother.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:428\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(Domain &v, const Range &d)\n-Apply one step of the preconditioner to the system A(v)=d.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:888\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be\n-Smoother SmootherType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:275\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy\n-The operator hierarchy type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:194\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-PI ParallelInformation\n-The type of the parallel information. Either OwnerOverlapCommunication or\n-another type describing the...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bn_\bo_\bn_\be\n-@ none\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:627\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bu_\bm_\bf_\bp_\ba_\bc_\bk\n-@ umfpack\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:627\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bu_\bp_\be_\br_\bl_\bu\n-@ superlu\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:627\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\ba_\bt_\bO_\bn_\bc_\be_\bA_\bc_\bc_\bu\n-@ atOnceAccu\n-Accumulate data to one process at once.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:243\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bn_\bo_\bA_\bc_\bc_\bu\n-@ noAccu\n-No data accumulution.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:237\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu\n-@ successiveAccu\n-Successively accumulate to fewer processes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:247\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:404\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-A generic dynamic dense matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< T >::field_type field_type\n-Export the type representing the underlying field.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:565\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::const_iterator ConstColIterator\n-Const iterator for the entries of each row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:589\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-T block_type\n-Export the type representing the components.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:568\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+size_type M() const\n+number of columns (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2007\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+size_type N() const\n+number of rows (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A vector of blocks with memory management.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n+Sequential overlapping Schwarz preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL\n+Use the LDL package to directly solve linear systems \u00e2\u0080\u0093 empty default class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:373\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:374\n _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-A nonoverlapping operator with communication object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n-Adapter to turn a matrix into a linear operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n-Norm that uses only the [N][N] entry of the block to determine couplings.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:379\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\bo_\bw_\bS_\bu_\bm\n-Functor using the row sum (infinity) norm to determine strong couplings.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:463\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:480\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:496\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-Criterion taking advantage of symmetric matrices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:519\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-Criterion suitable for unsymmetric matrices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:539\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG\n-an algebraic multigrid method using a Krylov-cycle.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:140\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd\n-Two grid operator for AMG with Krylov cycle.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG\n-Parallel algebraic multigrid based on agglomeration.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:625\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:642\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1169\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1170\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-An overlapping Schwarz operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation\n-> Iterator\n-Type of the mutable iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator over the levels in the hierarchy.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n-The hierarchies build by the coarsening process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n-The criterion describing the stop criteria for the coarsening process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:283\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n-All parameters for AMG.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n-The default class for the smoother arguments.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Base class for matrix free definition of preconditioners.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bX_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-Base class for scalar product and norm computation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:52\n _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n Statistics about the application of an inverse operator.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+int iterations\n+Number of iterations.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n bool converged\n True if convergence criterion has been met.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n Abstract base class for all solvers.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Categories for the solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:22\n _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n Category\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-static Category category(const OP &op, decltype(op.category()) *=nullptr)\n-Helperfunction to extract the solver category either from an enum, or from the\n-newly introduced virtu...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU\n-SuperLu Solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:271\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n-The UMFPack direct sparse solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:258\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+@ value\n+Whether this is a direct solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+@ value\n+whether the solver internally uses column compressed storage\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:36\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00149.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00149.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixindexset.hh File Reference\n+dune-istl: superlufunctions.hh File Reference\n \n \n \n \n \n \n \n@@ -70,40 +70,44 @@\n \n \n
    \n \n-
    matrixindexset.hh File Reference
    \n+Macros
    \n+
    superlufunctions.hh File Reference
    \n \n
    \n-
    #include <algorithm>
    \n-#include <cstddef>
    \n-#include <cstdint>
    \n-#include <set>
    \n-#include <variant>
    \n-#include <vector>
    \n-#include <dune/common/overloadset.hh>
    \n+
    #include <dune-istl-config.hh>
    \n+#include <supermatrix.h>
    \n+#include <slu_util.h>
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-

    \n-Classes

    class  Dune::MatrixIndexSet
     Stores the nonzero entries for creating a sparse matrix. More...
     
    \n-\n-\n-\n+\n+\n+\n

    \n-Namespaces

    namespace  Dune
     

    \n+Macros

    #define int_t   SUPERLU_INT_TYPE
     
    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ int_t

    \n+\n+
    \n+
    \n+ \n+ \n+ \n+ \n+
    #define int_t   SUPERLU_INT_TYPE
    \n+
    \n+\n+
    \n+
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,25 +1,20 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-matrixindexset.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+_\bM_\ba_\bc_\br_\bo_\bs\n+superlufunctions.hh File Reference\n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-\u00a0 Stores the nonzero entries for creating a sparse matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n+M\bMa\bac\bcr\bro\bos\bs\n+#define\u00a0 _\bi_\bn_\bt_\b__\bt\u00a0\u00a0\u00a0SUPERLU_INT_TYPE\n \u00a0\n+*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0i\bin\bnt\bt_\b_t\bt *\b**\b**\b**\b**\b*\n+#define int_t\u00a0\u00a0\u00a0SUPERLU_INT_TYPE\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00149_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00149_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixindexset.hh Source File\n+dune-istl: superlufunctions.hh Source File\n \n \n \n \n \n \n \n@@ -74,213 +74,138 @@\n \n
    \n \n
    \n
    \n
    \n-
    matrixindexset.hh
    \n+
    superlufunctions.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_MATRIXINDEXSET_HH
    \n-
    6#define DUNE_ISTL_MATRIXINDEXSET_HH
    \n-
    7
    \n-
    8#include <algorithm>
    \n-
    9#include <cstddef>
    \n-
    10#include <cstdint>
    \n-
    11#include <set>
    \n-
    12#include <variant>
    \n-
    13#include <vector>
    \n-
    14
    \n-
    15#include <dune/common/overloadset.hh>
    \n-
    16
    \n-
    17namespace Dune {
    \n-
    18
    \n-
    19
    \n-
    \n-\n-
    37 {
    \n-
    38 using Index = std::uint_least32_t;
    \n-
    39
    \n-
    40 // A vector that partly mimics a std::set by staying
    \n-
    41 // sorted on insert() and having unique values.
    \n-
    42 class FlatSet : public std::vector<Index>
    \n-
    43 {
    \n-
    44 using Base = std::vector<Index>;
    \n-
    45 public:
    \n-
    46 using Base::Base;
    \n-
    47 using Base::begin;
    \n-
    48 using Base::end;
    \n-
    49 void insert(const Index& value) {
    \n-
    50 auto it = std::lower_bound(begin(), end(), value);
    \n-
    51 if ((it == end() or (*it != value)))
    \n-
    52 Base::insert(it, value);
    \n-
    53 }
    \n-
    54 bool contains(const Index& value) const {
    \n-
    55 return std::binary_search(begin(), end(), value);
    \n-
    56 }
    \n-
    57 };
    \n-
    58
    \n-
    59 using RowIndexSet = std::variant<FlatSet, std::set<Index>>;
    \n-
    60
    \n-
    61 public:
    \n-
    62
    \n-
    63 using size_type = Index;
    \n-
    64
    \n-
    76 static constexpr size_type defaultMaxVectorSize = 2048;
    \n+
    5#ifndef DUNE_ISTL_SUPERLUFUNCTIONS_HH
    \n+
    6#define DUNE_ISTL_SUPERLUFUNCTIONS_HH
    \n+
    7#if HAVE_SUPERLU
    \n+
    8
    \n+
    9#include <dune-istl-config.hh> // SUPERLU_INT_TYPE
    \n+
    10
    \n+
    11#define int_t SUPERLU_INT_TYPE
    \n+
    12#include <supermatrix.h>
    \n+
    13#include <slu_util.h>
    \n+
    14#undef int_t
    \n+
    15
    \n+
    16#if __has_include("slu_sdefs.h")
    \n+
    17extern "C" {
    \n+
    18 extern void
    \n+
    19 sgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
    \n+
    20 char *, float *, float *, SuperMatrix *, SuperMatrix *,
    \n+
    21 void *, int, SuperMatrix *, SuperMatrix *,
    \n+
    22 float *, float *, float *, float *,
    \n+
    23 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
    \n+
    24
    \n+
    25 extern void
    \n+
    26 sCreate_Dense_Matrix(SuperMatrix *, int, int, float *, int,
    \n+
    27 Stype_t, Dtype_t, Mtype_t);
    \n+
    28 extern void
    \n+
    29 sCreate_CompCol_Matrix(SuperMatrix *, int, int, int, float *,
    \n+
    30 int *, int *, Stype_t, Dtype_t, Mtype_t);
    \n+
    31 extern int sQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
    \n+
    32
    \n+
    33 extern void sPrint_CompCol_Matrix(char *, SuperMatrix *);
    \n+
    34}
    \n+
    35#endif
    \n+
    36
    \n+
    37#if __has_include("slu_ddefs.h")
    \n+
    38extern "C" {
    \n+
    39 extern void
    \n+
    40 dgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
    \n+
    41 char *, double *, double *, SuperMatrix *, SuperMatrix *,
    \n+
    42 void *, int, SuperMatrix *, SuperMatrix *,
    \n+
    43 double *, double *, double *, double *,
    \n+
    44 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
    \n+
    45
    \n+
    46 extern void
    \n+
    47 dCreate_CompCol_Matrix(SuperMatrix *, int, int, int, double *,
    \n+
    48 int *, int *, Stype_t, Dtype_t, Mtype_t);
    \n+
    49
    \n+
    50 extern void
    \n+
    51 dCreate_Dense_Matrix(SuperMatrix *, int, int, double *, int,
    \n+
    52 Stype_t, Dtype_t, Mtype_t);
    \n+
    53
    \n+
    54 extern int dQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
    \n+
    55
    \n+
    56 extern void dPrint_CompCol_Matrix(char *, SuperMatrix *);
    \n+
    57}
    \n+
    58#endif
    \n+
    59
    \n+
    60#if __has_include("slu_cdefs.h")
    \n+
    61#ifndef SUPERLU_TYPEDEF_COMPLEX
    \n+
    62// Per default SuperLU >= 7.0.0. does not provide
    \n+
    63// a type complex anymore. By setting SUPERLU_TYPEDEF_COMPLEX
    \n+
    64// we tell SuperLU to define complex to be the same as the
    \n+
    65// new type singlecomplex
    \n+
    66#define SUPERLU_TYPEDEF_COMPLEX
    \n+
    67#endif
    \n+
    68#include "slu_scomplex.h"
    \n+
    69
    \n+
    70extern "C" {
    \n+
    71 extern void
    \n+
    72 cgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
    \n+
    73 char *, float *, float *, SuperMatrix *, SuperMatrix *,
    \n+
    74 void *, int, SuperMatrix *, SuperMatrix *,
    \n+
    75 float *, float *, float *, float *,
    \n+
    76 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
    \n
    77
    \n-
    \n-
    83 MatrixIndexSet(size_type maxVectorSize=defaultMaxVectorSize) noexcept : rows_(0), cols_(0), maxVectorSize_(maxVectorSize)
    \n-
    84 {}
    \n-
    \n-
    85
    \n-
    \n-
    93 MatrixIndexSet(size_type rows, size_type cols, size_type maxVectorSize=defaultMaxVectorSize) : rows_(rows), cols_(cols), maxVectorSize_(maxVectorSize)
    \n-
    94 {
    \n-
    95 indices_.resize(rows_, FlatSet());
    \n-
    96 }
    \n-
    \n-
    97
    \n-
    \n-\n-
    100 rows_ = rows;
    \n-
    101 cols_ = cols;
    \n-
    102 indices_.resize(rows_, FlatSet());
    \n-
    103 }
    \n-
    \n+
    78
    \n+
    79 extern void
    \n+
    80 cCreate_Dense_Matrix(SuperMatrix *, int, int, ::complex *, int,
    \n+
    81 Stype_t, Dtype_t, Mtype_t);
    \n+
    82
    \n+
    83
    \n+
    84 extern void
    \n+
    85 cCreate_CompCol_Matrix(SuperMatrix *, int, int, int, ::complex *,
    \n+
    86 int *, int *, Stype_t, Dtype_t, Mtype_t);
    \n+
    87
    \n+
    88 extern int cQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
    \n+
    89
    \n+
    90 extern void cPrint_CompCol_Matrix(char *, SuperMatrix *);
    \n+
    91}
    \n+
    92#endif
    \n+
    93
    \n+
    94#if __has_include("slu_zdefs.h")
    \n+
    95#include "slu_dcomplex.h"
    \n+
    96extern "C" {
    \n+
    97 extern void
    \n+
    98 zgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
    \n+
    99 char *, double *, double *, SuperMatrix *, SuperMatrix *,
    \n+
    100 void *, int, SuperMatrix *, SuperMatrix *,
    \n+
    101 double *, double *, double *, double *,
    \n+
    102 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
    \n+
    103
    \n
    104
    \n-
    \n-\n-
    113 return std::visit(Dune::overload(
    \n-
    114 // If row is stored as set, call insert directly
    \n-
    115 [&](std::set<size_type>& set) {
    \n-
    116 set.insert(col);
    \n-
    117 },
    \n-
    118 // If row is stored as vector only insert directly
    \n-
    119 // if maxVectorSize_ is not reached. Otherwise switch
    \n-
    120 // to set storage first.
    \n-
    121 [&](FlatSet& sortedVector) {
    \n-
    122 if (sortedVector.size() < maxVectorSize_)
    \n-
    123 sortedVector.insert(col);
    \n-
    124 else if (not sortedVector.contains(col))
    \n-
    125 {
    \n-
    126 std::set<size_type> set(sortedVector.begin(), sortedVector.end());
    \n-
    127 set.insert(col);
    \n-
    128 indices_[row] = std::move(set);
    \n-
    129 }
    \n-
    130 }
    \n-
    131 ), indices_[row]);
    \n-
    132 }
    \n-
    \n-
    133
    \n-
    \n-
    135 size_type size() const {
    \n-
    136 size_type entries = 0;
    \n-
    137 for (size_type i=0; i<rows_; i++)
    \n-
    138 entries += rowsize(i);
    \n-
    139 return entries;
    \n-
    140 }
    \n-
    \n-
    141
    \n-
    143 size_type rows() const {return rows_;}
    \n-
    144
    \n-
    146 size_type cols() const {return cols_;}
    \n-
    147
    \n-
    \n-
    157 const auto& columnIndices(size_type row) const {
    \n-
    158 return indices_[row];
    \n-
    159 }
    \n-
    \n-
    160
    \n-
    \n-\n-
    163 return std::visit([&](const auto& rowIndices) {
    \n-
    164 return rowIndices.size();
    \n-
    165 }, indices_[row]);
    \n-
    166 }
    \n-
    \n-
    167
    \n-
    174 template <class MatrixType>
    \n-
    \n-
    175 void import(const MatrixType& m, size_type rowOffset=0, size_type colOffset=0) {
    \n-
    176
    \n-
    177 typedef typename MatrixType::row_type RowType;
    \n-
    178 typedef typename RowType::ConstIterator ColumnIterator;
    \n-
    179
    \n-
    180 for (size_type rowIdx=0; rowIdx<m.N(); rowIdx++) {
    \n-
    181
    \n-
    182 const RowType& row = m[rowIdx];
    \n-
    183
    \n-
    184 ColumnIterator cIt = row.begin();
    \n-
    185 ColumnIterator cEndIt = row.end();
    \n-
    186
    \n-
    187 for(; cIt!=cEndIt; ++cIt)
    \n-
    188 add(rowIdx+rowOffset, cIt.index()+colOffset);
    \n-
    189
    \n-
    190 }
    \n-
    191
    \n-
    192 }
    \n-
    \n-
    193
    \n-
    199 template <class MatrixType>
    \n-
    \n-
    200 void exportIdx(MatrixType& matrix) const {
    \n-
    201
    \n-
    202 matrix.setSize(rows_, cols_);
    \n-
    203 matrix.setBuildMode(MatrixType::random);
    \n-
    204
    \n-
    205 for (size_type row=0; row<rows_; row++)
    \n-
    206 matrix.setrowsize(row, rowsize(row));
    \n-
    207
    \n-
    208 matrix.endrowsizes();
    \n-
    209
    \n-
    210 for (size_type row=0; row<rows_; row++) {
    \n-
    211 std::visit([&](const auto& rowIndices) {
    \n-
    212 matrix.setIndicesNoSort(row, rowIndices.begin(), rowIndices.end());
    \n-
    213 }, indices_[row]);
    \n-
    214 }
    \n-
    215
    \n-
    216 matrix.endindices();
    \n-
    217
    \n-
    218 }
    \n-
    \n-
    219
    \n-
    220 private:
    \n-
    221
    \n-
    222 std::vector<RowIndexSet> indices_;
    \n-
    223
    \n-
    224 size_type rows_, cols_;
    \n-
    225 size_type maxVectorSize_;
    \n-
    226
    \n-
    227 };
    \n-
    \n-
    228
    \n-
    229
    \n-
    230} // end namespace Dune
    \n-
    231
    \n-
    232#endif
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n-
    Definition allocator.hh:11
    \n-
    Stores the nonzero entries for creating a sparse matrix.
    Definition matrixindexset.hh:37
    \n-
    void resize(size_type rows, size_type cols)
    Reset the size of an index set.
    Definition matrixindexset.hh:99
    \n-
    static constexpr size_type defaultMaxVectorSize
    Default value for maxVectorSize.
    Definition matrixindexset.hh:76
    \n-
    Index size_type
    Definition matrixindexset.hh:63
    \n-
    size_type rows() const
    Return the number of rows.
    Definition matrixindexset.hh:143
    \n-
    void exportIdx(MatrixType &matrix) const
    Initializes a BCRSMatrix with the indices contained in this MatrixIndexSet.
    Definition matrixindexset.hh:200
    \n-
    void add(size_type row, size_type col)
    Add an index to the index set.
    Definition matrixindexset.hh:112
    \n-
    MatrixIndexSet(size_type rows, size_type cols, size_type maxVectorSize=defaultMaxVectorSize)
    Constructor setting the matrix size.
    Definition matrixindexset.hh:93
    \n-
    MatrixIndexSet(size_type maxVectorSize=defaultMaxVectorSize) noexcept
    Constructor with custom maxVectorSize.
    Definition matrixindexset.hh:83
    \n-
    const auto & columnIndices(size_type row) const
    Return column indices of entries in given row.
    Definition matrixindexset.hh:157
    \n-
    size_type rowsize(size_type row) const
    Return the number of entries in a given row.
    Definition matrixindexset.hh:162
    \n-
    size_type size() const
    Return the number of entries.
    Definition matrixindexset.hh:135
    \n-
    size_type cols() const
    Return the number of columns.
    Definition matrixindexset.hh:146
    \n+
    105 extern void
    \n+
    106 zCreate_CompCol_Matrix(SuperMatrix *, int, int, int, doublecomplex *,
    \n+
    107 int *, int *, Stype_t, Dtype_t, Mtype_t);
    \n+
    108
    \n+
    109 extern void
    \n+
    110 zCreate_Dense_Matrix(SuperMatrix *, int, int, doublecomplex *, int,
    \n+
    111 Stype_t, Dtype_t, Mtype_t);
    \n+
    112
    \n+
    113 extern int zQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
    \n+
    114
    \n+
    115 extern void zPrint_CompCol_Matrix(char *, SuperMatrix *);
    \n+
    116}
    \n+
    117#endif
    \n+
    118
    \n+
    119
    \n+
    120#endif
    \n+
    121#endif
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,232 +1,132 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-matrixindexset.hh\n+superlufunctions.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_MATRIXINDEXSET_HH\n-6#define DUNE_ISTL_MATRIXINDEXSET_HH\n-7\n-8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14\n-15#include \n-16\n-17namespace _\bD_\bu_\bn_\be {\n-18\n-19\n-_\b3_\b6 class _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-37 {\n-38 using Index = std::uint_least32_t;\n-39\n-40 // A vector that partly mimics a std::set by staying\n-41 // sorted on insert() and having unique values.\n-42 class FlatSet : public std::vector\n-43 {\n-44 using Base = std::vector;\n-45 public:\n-46 using Base::Base;\n-47 using Base::begin;\n-48 using Base::end;\n-49 void insert(const Index& value) {\n-50 auto it = std::lower_bound(begin(), end(), value);\n-51 if ((it == end() or (*it != value)))\n-52 Base::insert(it, value);\n-53 }\n-54 bool contains(const Index& value) const {\n-55 return std::binary_search(begin(), end(), value);\n-56 }\n-57 };\n-58\n-59 using RowIndexSet = std::variant>;\n-60\n-61 public:\n-62\n-_\b6_\b3 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = Index;\n-64\n-_\b7_\b6 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bd_\be_\bf_\ba_\bu_\bl_\bt_\bM_\ba_\bx_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be = 2048;\n+5#ifndef DUNE_ISTL_SUPERLUFUNCTIONS_HH\n+6#define DUNE_ISTL_SUPERLUFUNCTIONS_HH\n+7#if HAVE_SUPERLU\n+8\n+9#include // SUPERLU_INT_TYPE\n+10\n+_\b1_\b1#define int_t SUPERLU_INT_TYPE\n+12#include \n+13#include \n+14#undef int_t\n+15\n+16#if __has_include(\"slu_sdefs.h\")\n+17extern \"C\" {\n+18 extern void\n+19 sgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,\n+20 char *, float *, float *, SuperMatrix *, SuperMatrix *,\n+21 void *, int, SuperMatrix *, SuperMatrix *,\n+22 float *, float *, float *, float *,\n+23 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);\n+24\n+25 extern void\n+26 sCreate_Dense_Matrix(SuperMatrix *, int, int, float *, int,\n+27 Stype_t, Dtype_t, Mtype_t);\n+28 extern void\n+29 sCreate_CompCol_Matrix(SuperMatrix *, int, int, int, float *,\n+30 int *, int *, Stype_t, Dtype_t, Mtype_t);\n+31 extern int sQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);\n+32\n+33 extern void sPrint_CompCol_Matrix(char *, SuperMatrix *);\n+34}\n+35#endif\n+36\n+37#if __has_include(\"slu_ddefs.h\")\n+38extern \"C\" {\n+39 extern void\n+40 dgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,\n+41 char *, double *, double *, SuperMatrix *, SuperMatrix *,\n+42 void *, int, SuperMatrix *, SuperMatrix *,\n+43 double *, double *, double *, double *,\n+44 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);\n+45\n+46 extern void\n+47 dCreate_CompCol_Matrix(SuperMatrix *, int, int, int, double *,\n+48 int *, int *, Stype_t, Dtype_t, Mtype_t);\n+49\n+50 extern void\n+51 dCreate_Dense_Matrix(SuperMatrix *, int, int, double *, int,\n+52 Stype_t, Dtype_t, Mtype_t);\n+53\n+54 extern int dQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);\n+55\n+56 extern void dPrint_CompCol_Matrix(char *, SuperMatrix *);\n+57}\n+58#endif\n+59\n+60#if __has_include(\"slu_cdefs.h\")\n+61#ifndef SUPERLU_TYPEDEF_COMPLEX\n+62// Per default SuperLU >= 7.0.0. does not provide\n+63// a type complex anymore. By setting SUPERLU_TYPEDEF_COMPLEX\n+64// we tell SuperLU to define complex to be the same as the\n+65// new type singlecomplex\n+66#define SUPERLU_TYPEDEF_COMPLEX\n+67#endif\n+68#include \"slu_scomplex.h\"\n+69\n+70extern \"C\" {\n+71 extern void\n+72 cgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,\n+73 char *, float *, float *, SuperMatrix *, SuperMatrix *,\n+74 void *, int, SuperMatrix *, SuperMatrix *,\n+75 float *, float *, float *, float *,\n+76 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);\n 77\n-_\b8_\b3 _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be maxVectorSize=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bM_\ba_\bx_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be) noexcept :\n-rows_(0), cols_(0), maxVectorSize_(maxVectorSize)\n-84 {}\n-85\n-_\b9_\b3 _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bs, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bs, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-maxVectorSize=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bM_\ba_\bx_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be) : rows_(_\br_\bo_\bw_\bs), cols_(_\bc_\bo_\bl_\bs), maxVectorSize_\n-(maxVectorSize)\n-94 {\n-95 indices_.resize(rows_, FlatSet());\n-96 }\n-97\n-_\b9_\b9 void _\br_\be_\bs_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bs, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bs) {\n-100 rows_ = _\br_\bo_\bw_\bs;\n-101 cols_ = _\bc_\bo_\bl_\bs;\n-102 indices_.resize(rows_, FlatSet());\n-103 }\n+78\n+79 extern void\n+80 cCreate_Dense_Matrix(SuperMatrix *, int, int, ::complex *, int,\n+81 Stype_t, Dtype_t, Mtype_t);\n+82\n+83\n+84 extern void\n+85 cCreate_CompCol_Matrix(SuperMatrix *, int, int, int, ::complex *,\n+86 int *, int *, Stype_t, Dtype_t, Mtype_t);\n+87\n+88 extern int cQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);\n+89\n+90 extern void cPrint_CompCol_Matrix(char *, SuperMatrix *);\n+91}\n+92#endif\n+93\n+94#if __has_include(\"slu_zdefs.h\")\n+95#include \"slu_dcomplex.h\"\n+96extern \"C\" {\n+97 extern void\n+98 zgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,\n+99 char *, double *, double *, SuperMatrix *, SuperMatrix *,\n+100 void *, int, SuperMatrix *, SuperMatrix *,\n+101 double *, double *, double *, double *,\n+102 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);\n+103\n 104\n-_\b1_\b1_\b2 void _\ba_\bd_\bd(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl) {\n-113 return std::visit(Dune::overload(\n-114 // If row is stored as set, call insert directly\n-115 [&](std::set& set) {\n-116 set.insert(_\bc_\bo_\bl);\n-117 },\n-118 // If row is stored as vector only insert directly\n-119 // if maxVectorSize_ is not reached. Otherwise switch\n-120 // to set storage first.\n-121 [&](FlatSet& sortedVector) {\n-122 if (sortedVector.size() < maxVectorSize_)\n-123 sortedVector.insert(_\bc_\bo_\bl);\n-124 else if (not sortedVector.contains(_\bc_\bo_\bl))\n-125 {\n-126 std::set set(sortedVector.begin(), sortedVector.end());\n-127 set.insert(_\bc_\bo_\bl);\n-128 indices_[row] = std::move(set);\n-129 }\n-130 }\n-131 ), indices_[row]);\n-132 }\n-133\n-_\b1_\b3_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be() const {\n-136 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be entries = 0;\n-137 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b1_\b7_\b5 void import(const MatrixType& m, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rowOffset=0, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-colOffset=0) {\n-176\n-177 typedef typename MatrixType::row_type RowType;\n-178 typedef typename RowType::ConstIterator ColumnIterator;\n-179\n-180 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rowIdx=0; rowIdx\n-_\b2_\b0_\b0 void _\be_\bx_\bp_\bo_\br_\bt_\bI_\bd_\bx(MatrixType& matrix) const {\n-201\n-202 matrix.setSize(rows_, cols_);\n-203 matrix.setBuildMode(MatrixType::random);\n-204\n-205 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row=0; row indices_;\n-223\n-224 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rows_, cols_;\n-225 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be maxVectorSize_;\n-226\n-227 };\n-228\n-229\n-230} // end namespace Dune\n-231\n-232#endif\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n-_\bD_\bu_\bn_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Stores the nonzero entries for creating a sparse matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-void resize(size_type rows, size_type cols)\n-Reset the size of an index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:99\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bM_\ba_\bx_\bV_\be_\bc_\bt_\bo_\br_\bS_\bi_\bz_\be\n-static constexpr size_type defaultMaxVectorSize\n-Default value for maxVectorSize.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-Index size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\br_\bo_\bw_\bs\n-size_type rows() const\n-Return the number of rows.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:143\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\be_\bx_\bp_\bo_\br_\bt_\bI_\bd_\bx\n-void exportIdx(MatrixType &matrix) const\n-Initializes a BCRSMatrix with the indices contained in this MatrixIndexSet.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:200\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\ba_\bd_\bd\n-void add(size_type row, size_type col)\n-Add an index to the index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-MatrixIndexSet(size_type rows, size_type cols, size_type\n-maxVectorSize=defaultMaxVectorSize)\n-Constructor setting the matrix size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:93\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-MatrixIndexSet(size_type maxVectorSize=defaultMaxVectorSize) noexcept\n-Constructor with custom maxVectorSize.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bl_\bu_\bm_\bn_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-const auto & columnIndices(size_type row) const\n-Return column indices of entries in given row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:157\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\br_\bo_\bw_\bs_\bi_\bz_\be\n-size_type rowsize(size_type row) const\n-Return the number of entries in a given row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:162\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bs_\bi_\bz_\be\n-size_type size() const\n-Return the number of entries.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:135\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bl_\bs\n-size_type cols() const\n-Return the number of columns.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixindexset.hh:146\n+105 extern void\n+106 zCreate_CompCol_Matrix(SuperMatrix *, int, int, int, doublecomplex *,\n+107 int *, int *, Stype_t, Dtype_t, Mtype_t);\n+108\n+109 extern void\n+110 zCreate_Dense_Matrix(SuperMatrix *, int, int, doublecomplex *, int,\n+111 Stype_t, Dtype_t, Mtype_t);\n+112\n+113 extern int zQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);\n+114\n+115 extern void zPrint_CompCol_Matrix(char *, SuperMatrix *);\n+116}\n+117#endif\n+118\n+119\n+120#endif\n+121#endif\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00152.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00152.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: multitypeblockmatrix.hh File Reference\n+dune-istl: supermatrix.hh File Reference\n \n \n \n \n \n \n \n@@ -71,66 +71,62 @@\n \n \n \n
    \n \n-
    multitypeblockmatrix.hh File Reference
    \n+Namespaces
    \n+
    supermatrix.hh File Reference
    \n \n
    \n-
    #include <cmath>
    \n-#include <iostream>
    \n-#include <tuple>
    \n-#include <dune/common/hybridutilities.hh>
    \n-#include "istlexception.hh"
    \n-#include "gsetc.hh"
    \n+
    #include "bcrsmatrix.hh"
    \n+#include "bvector.hh"
    \n+#include <dune/common/fmatrix.hh>
    \n+#include <dune/common/fvector.hh>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <limits>
    \n+#include <dune/istl/bccsmatrixinitializer.hh>
    \n+#include "superlufunctions.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n+\n \n-\n-\n+\n \n-\n+\n \n-\n-\n+\n \n-\n+\n \n-\n-\n+\n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::MultiTypeBlockMatrix< FirstRow, Args >
     A Matrix class to support different block types. More...
    struct  Dune::SuperMatrixCreateSparseChooser< T >
     
    struct  Dune::FieldTraits< MultiTypeBlockMatrix< Rows... > >
    struct  Dune::SuperMatrixPrinter< T >
     
    class  Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, remain_col >
     part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types More...
    struct  Dune::BaseGetSuperLUType< T >
     
    class  Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, 0 >
    struct  Dune::GetSuperLUType< T >
     
    class  Dune::MultiTypeBlockMatrix_Solver< I, crow, remain_row >
     solver for MultiTypeBlockVector & MultiTypeBlockMatrix types More...
    struct  Dune::GetSuperLUType< double >
     
    class  Dune::MultiTypeBlockMatrix_Solver< I, crow, 0 >
    struct  Dune::GetSuperLUType< float >
     
    struct  std::tuple_element< i, Dune::MultiTypeBlockMatrix< Args... > >
     Make std::tuple_element work for MultiTypeBlockMatrix. More...
    struct  Dune::GetSuperLUType< std::complex< double > >
     
    struct  std::tuple_size< Dune::MultiTypeBlockMatrix< Args... > >
     Make std::tuple_size work for MultiTypeBlockMatrix. More...
    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 > >
     
    \n \n \n \n-\n-\n-\n-

    \n Namespaces

    namespace  Dune
     
    namespace  std
     STL namespace.
     
    \n-\n-\n-\n-\n-\n

    \n-Functions

    template<typename T1 , typename... Args>
    std::ostream & Dune::operator<< (std::ostream &s, const MultiTypeBlockMatrix< T1, Args... > &m)
     << operator for a MultiTypeBlockMatrix
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,52 +1,50 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-multitypeblockmatrix.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+supermatrix.hh File Reference\n+#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n+#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\br_\bs_\bt_\bR_\bo_\bw_\b,_\b _\bA_\br_\bg_\bs_\b _\b>\n-\u00a0 A _\bM_\ba_\bt_\br_\bi_\bx class to support different block types. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bT_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bR_\bo_\bw_\bs_\b._\b._\b._\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bT_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\bc_\bc_\bo_\bl_\b,_\b _\br_\be_\bm_\ba_\bi_\bn_\b__\bc_\bo_\bl_\b _\b>\n-\u00a0 part of solvers for _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br & _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx types\n- _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bT_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\bc_\bc_\bo_\bl_\b,_\b _\b0_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bT_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b _\b>\n-\u00a0 solver for _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br & _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx types _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\b0_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>\n \u00a0\n-struct \u00a0 _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n-\u00a0 Make std::tuple_element work for MultiTypeBlockMatrix. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>\n \u00a0\n-struct \u00a0 _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\bs_\bi_\bz_\be_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n-\u00a0 Make std::tuple_size work for MultiTypeBlockMatrix. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b _\b>\n \u00a0\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bM_\b _\b>\n+\u00a0 Utility class for converting an _\bI_\bS_\bT_\bL _\bM_\ba_\bt_\br_\bi_\bx into a _\bS_\bu_\bp_\be_\br_\bL_\bU _\bM_\ba_\bt_\br_\bi_\bx.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-namespace \u00a0 _\bs_\bt_\bd\n-\u00a0 STL namespace.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bM_\b _\b>\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &s, const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx<\n- T1, Args... > &m)\n-\u00a0 << operator for a _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n+\u00a0 Converter for _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx to _\bS_\bu_\bp_\be_\br_\bL_\bU _\bM_\ba_\bt_\br_\bi_\bx. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00152_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00152_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: multitypeblockmatrix.hh Source File\n+dune-istl: supermatrix.hh Source File\n \n \n \n \n \n \n \n@@ -74,683 +74,427 @@\n \n
    \n \n
    \n
    \n
    \n-
    multitypeblockmatrix.hh
    \n+
    supermatrix.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH
    \n-
    6#define DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH
    \n+
    5#ifndef DUNE_ISTL_SUPERMATRIX_HH
    \n+
    6#define DUNE_ISTL_SUPERMATRIX_HH
    \n
    7
    \n-
    8#include <cmath>
    \n-
    9#include <iostream>
    \n-
    10#include <tuple>
    \n-
    11
    \n-
    12#include <dune/common/hybridutilities.hh>
    \n-
    13
    \n-
    14#include "istlexception.hh"
    \n-
    15
    \n-
    16// forward declaration
    \n-
    17namespace Dune
    \n-
    18{
    \n-
    19 template<typename FirstRow, typename... Args>
    \n-
    20 class MultiTypeBlockMatrix;
    \n-
    21
    \n-
    22 template<int I, int crow, int remain_row>
    \n-
    23 class MultiTypeBlockMatrix_Solver;
    \n-
    24}
    \n-
    25
    \n-
    26#include "gsetc.hh"
    \n+
    8#if HAVE_SUPERLU
    \n+
    9
    \n+
    10#include "bcrsmatrix.hh"
    \n+
    11#include "bvector.hh"
    \n+
    12#include <dune/common/fmatrix.hh>
    \n+
    13#include <dune/common/fvector.hh>
    \n+
    14#include <dune/common/typetraits.hh>
    \n+
    15#include <limits>
    \n+
    16
    \n+\n+
    18
    \n+
    19#include "superlufunctions.hh"
    \n+
    20
    \n+
    21namespace Dune
    \n+
    22{
    \n+
    23
    \n+
    24 template<class T>
    \n+
    \n+\n+
    26 {};
    \n+
    \n
    27
    \n-
    28namespace Dune {
    \n-
    29
    \n-
    43 template<typename FirstRow, typename... Args>
    \n-
    \n-\n-
    45 : public std::tuple<FirstRow, Args...>
    \n-
    46 {
    \n-
    47 using ParentType = std::tuple<FirstRow, Args...>;
    \n-
    48 public:
    \n-
    49
    \n-
    51 using ParentType::ParentType;
    \n-
    52
    \n-
    56 typedef MultiTypeBlockMatrix<FirstRow, Args...> type;
    \n-
    57
    \n-
    59 using size_type = std::size_t;
    \n-
    60
    \n-
    66 using field_type = Std::detected_t<std::common_type_t,
    \n-
    67 typename FieldTraits<FirstRow>::field_type, typename FieldTraits<Args>::field_type...>;
    \n-
    68
    \n-
    74 using real_type = Std::detected_t<std::common_type_t,
    \n-
    75 typename FieldTraits<FirstRow>::real_type, typename FieldTraits<Args>::real_type...>;
    \n-
    76
    \n-
    77 // make sure that we have an std::common_type: using an assertion produces a more readable error message
    \n-
    78 // than a compiler template instantiation error
    \n-
    79 static_assert ( sizeof...(Args) == 0 or
    \n-
    80 not (std::is_same_v<field_type, Std::nonesuch> or std::is_same_v<real_type, Std::nonesuch>),
    \n-
    81 "No std::common_type implemented for the given field_type/real_type of the Args. Please provide an implementation and check that a FieldTraits class is present for your type.");
    \n-
    82
    \n-
    \n-
    84 static constexpr size_type N()
    \n+
    28 template<class T>
    \n+
    \n+\n+
    30 {};
    \n+
    \n+
    31
    \n+
    32#if __has_include("slu_sdefs.h")
    \n+
    33 template<>
    \n+\n+
    35 {
    \n+
    36 static void create(SuperMatrix *mat, int n, int m, int offset,
    \n+
    37 float *values, int *rowindex, int* colindex,
    \n+
    38 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n+
    39 {
    \n+
    40 sCreate_CompCol_Matrix(mat, n, m, offset, values, rowindex, colindex,
    \n+
    41 stype, dtype, mtype);
    \n+
    42 }
    \n+
    43 };
    \n+
    44
    \n+
    45 template<>
    \n+
    46 struct SuperMatrixPrinter<float>
    \n+
    47 {
    \n+
    48 static void print(char* name, SuperMatrix* mat)
    \n+
    49 {
    \n+
    50 sPrint_CompCol_Matrix(name, mat);
    \n+
    51 }
    \n+
    52 };
    \n+
    53#endif
    \n+
    54
    \n+
    55#if __has_include("slu_ddefs.h")
    \n+
    56 template<>
    \n+
    57 struct SuperMatrixCreateSparseChooser<double>
    \n+
    58 {
    \n+
    59 static void create(SuperMatrix *mat, int n, int m, int offset,
    \n+
    60 double *values, int *rowindex, int* colindex,
    \n+
    61 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n+
    62 {
    \n+
    63 dCreate_CompCol_Matrix(mat, n, m, offset, values, rowindex, colindex,
    \n+
    64 stype, dtype, mtype);
    \n+
    65 }
    \n+
    66 };
    \n+
    67
    \n+
    68 template<>
    \n+
    69 struct SuperMatrixPrinter<double>
    \n+
    70 {
    \n+
    71 static void print(char* name, SuperMatrix* mat)
    \n+
    72 {
    \n+
    73 dPrint_CompCol_Matrix(name, mat);
    \n+
    74 }
    \n+
    75 };
    \n+
    76#endif
    \n+
    77
    \n+
    78#if __has_include("slu_cdefs.h")
    \n+
    79 template<>
    \n+
    80 struct SuperMatrixCreateSparseChooser<std::complex<float> >
    \n+
    81 {
    \n+
    82 static void create(SuperMatrix *mat, int n, int m, int offset,
    \n+
    83 std::complex<float> *values, int *rowindex, int* colindex,
    \n+
    84 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n
    85 {
    \n-
    86 return 1+sizeof...(Args);
    \n-
    87 }
    \n-
    \n-
    88
    \n-
    \n-
    90 static constexpr size_type M()
    \n-
    91 {
    \n-
    92 return FirstRow::size();
    \n-
    93 }
    \n-
    \n-
    94
    \n-
    111 template< size_type index >
    \n-
    112 auto
    \n-
    \n-
    113 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable)
    \n-
    114 -> decltype(std::get<index>(*this))
    \n-
    115 {
    \n-
    116 return std::get<index>(*this);
    \n-
    117 }
    \n-
    \n-
    118
    \n-
    124 template< size_type index >
    \n-
    125 auto
    \n-
    \n-
    126 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable) const
    \n-
    127 -> decltype(std::get<index>(*this))
    \n-
    128 {
    \n-
    129 return std::get<index>(*this);
    \n-
    130 }
    \n-
    \n-
    131
    \n-
    135 template<typename T>
    \n-
    \n-
    136 void operator= (const T& newval) {
    \n-
    137 using namespace Dune::Hybrid;
    \n-
    138 auto size = index_constant<1+sizeof...(Args)>();
    \n-
    139 // Since Dune::Hybrid::size(MultiTypeBlockMatrix) is not implemented,
    \n-
    140 // we cannot use a plain forEach(*this, ...). This could be achieved,
    \n-
    141 // e.g., by implementing a static size() method.
    \n-
    142 forEach(integralRange(size), [&](auto&& i) {
    \n-
    143 (*this)[i] = newval;
    \n-
    144 });
    \n-
    145 }
    \n+
    86 cCreate_CompCol_Matrix(mat, n, m, offset, reinterpret_cast< ::complex*>(values),
    \n+
    87 rowindex, colindex, stype, dtype, mtype);
    \n+
    88 }
    \n+
    89 };
    \n+
    90
    \n+
    91 template<>
    \n+
    92 struct SuperMatrixPrinter<std::complex<float> >
    \n+
    93 {
    \n+
    94 static void print(char* name, SuperMatrix* mat)
    \n+
    95 {
    \n+
    96 cPrint_CompCol_Matrix(name, mat);
    \n+
    97 }
    \n+
    98 };
    \n+
    99#endif
    \n+
    100
    \n+
    101#if __has_include("slu_zdefs.h")
    \n+
    102 template<>
    \n+
    103 struct SuperMatrixCreateSparseChooser<std::complex<double> >
    \n+
    104 {
    \n+
    105 static void create(SuperMatrix *mat, int n, int m, int offset,
    \n+
    106 std::complex<double> *values, int *rowindex, int* colindex,
    \n+
    107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)
    \n+
    108 {
    \n+
    109 zCreate_CompCol_Matrix(mat, n, m, offset, reinterpret_cast<doublecomplex*>(values),
    \n+
    110 rowindex, colindex, stype, dtype, mtype);
    \n+
    111 }
    \n+
    112 };
    \n+
    113
    \n+
    114 template<>
    \n+
    115 struct SuperMatrixPrinter<std::complex<double> >
    \n+
    116 {
    \n+
    117 static void print(char* name, SuperMatrix* mat)
    \n+
    118 {
    \n+
    119 zPrint_CompCol_Matrix(name, mat);
    \n+
    120 }
    \n+
    121 };
    \n+
    122#endif
    \n+
    123
    \n+
    124 template<class T>
    \n+
    \n+\n+
    126 {
    \n+
    127 static const Dtype_t type;
    \n+
    128 };
    \n+
    \n+
    129
    \n+
    130 template<class T>
    \n+
    \n+\n+
    132 {};
    \n+
    \n+
    133
    \n+
    134 template<class T>
    \n+
    135 const Dtype_t BaseGetSuperLUType<T>::type =
    \n+
    136 std::is_same<T,float>::value ? SLU_S :
    \n+
    137 ( std::is_same<T,std::complex<double> >::value ? SLU_Z :
    \n+
    138 ( std::is_same<T,std::complex<float> >::value ? SLU_C : SLU_D ));
    \n+
    139
    \n+
    140 template<>
    \n+
    \n+
    141 struct GetSuperLUType<double>
    \n+
    142 : public BaseGetSuperLUType<double>
    \n+
    143 {
    \n+
    144 typedef double float_type;
    \n+
    145 };
    \n
    \n
    146
    \n-
    147 //===== vector space arithmetic
    \n-
    148
    \n-
    \n-\n-
    151 {
    \n-
    152 auto size = index_constant<N()>();
    \n-
    153 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
    \n-
    154 (*this)[i] *= k;
    \n-
    155 });
    \n-
    156
    \n-
    157 return *this;
    \n-
    158 }
    \n-
    \n-
    159
    \n-
    \n-\n-
    162 {
    \n-
    163 auto size = index_constant<N()>();
    \n-
    164 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
    \n-
    165 (*this)[i] /= k;
    \n-
    166 });
    \n-
    167
    \n-
    168 return *this;
    \n-
    169 }
    \n-
    \n-
    170
    \n-
    171
    \n-
    \n-\n-
    178 {
    \n-
    179 auto size = index_constant<N()>();
    \n-
    180 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
    \n-
    181 (*this)[i] += b[i];
    \n-
    182 });
    \n+
    147 template<>
    \n+
    \n+
    148 struct GetSuperLUType<float>
    \n+
    149 : public BaseGetSuperLUType<float>
    \n+
    150 {
    \n+
    151 typedef float float_type;
    \n+
    152 };
    \n+
    \n+
    153
    \n+
    154 template<>
    \n+
    \n+
    155 struct GetSuperLUType<std::complex<double> >
    \n+
    156 : public BaseGetSuperLUType<std::complex<double> >
    \n+
    157 {
    \n+
    158 typedef double float_type;
    \n+
    159 };
    \n+
    \n+
    160
    \n+
    161 template<>
    \n+
    \n+
    162 struct GetSuperLUType<std::complex<float> >
    \n+
    163 : public BaseGetSuperLUType<std::complex<float> >
    \n+
    164 {
    \n+
    165 typedef float float_type;
    \n+
    166
    \n+
    167 };
    \n+
    \n+
    168
    \n+
    173 template<class M>
    \n+
    \n+\n+
    175 {};
    \n+
    \n+
    176
    \n+
    177 template<class M>
    \n+
    \n+\n+
    179 {};
    \n+
    \n+
    180
    \n+
    181 template<class T>
    \n+
    182 class SuperLU;
    \n
    183
    \n-
    184 return *this;
    \n-
    185 }
    \n-
    \n+
    184 template<class M, class X, class TM, class TD, class T1>
    \n+\n
    186
    \n-
    \n-\n-
    193 {
    \n-
    194 auto size = index_constant<N()>();
    \n-
    195 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {
    \n-
    196 (*this)[i] -= b[i];
    \n-
    197 });
    \n-
    198
    \n-
    199 return *this;
    \n-
    200 }
    \n-
    \n-
    201
    \n-
    204 template<typename X, typename Y>
    \n-
    \n-
    205 void mv (const X& x, Y& y) const {
    \n-
    206 static_assert(X::size() == M(), "length of x does not match row length");
    \n-
    207 static_assert(Y::size() == N(), "length of y does not match row count");
    \n-
    208 y = 0; //reset y (for mv uses umv)
    \n-
    209 umv(x,y);
    \n-
    210 }
    \n+
    187 template<class T, bool flag>
    \n+\n+
    189
    \n+
    193 template<class B, class TA>
    \n+
    \n+\n+
    195 : public ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>
    \n+
    196 {
    \n+
    197 template<class M, class X, class TM, class TD, class T1>
    \n+\n+
    199 friend struct SuperMatrixInitializer<BCRSMatrix<B,TA> >;
    \n+
    200 public:
    \n+\n+
    203
    \n+\n+
    205
    \n+
    206 typedef typename Matrix::size_type size_type;
    \n+
    207
    \n+
    \n+
    212 explicit SuperLUMatrix(const Matrix& mat) : ISTL::Impl::BCCSMatrix<BCRSMatrix<B,TA>, int>(mat)
    \n+
    213 {}
    \n
    \n-
    211
    \n-
    214 template<typename X, typename Y>
    \n+
    214
    \n
    \n-
    215 void umv (const X& x, Y& y) const {
    \n-
    216 static_assert(X::size() == M(), "length of x does not match row length");
    \n-
    217 static_assert(Y::size() == N(), "length of y does not match row count");
    \n-
    218 using namespace Dune::Hybrid;
    \n-
    219 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n-
    220 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    221 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n-
    222 (*this)[i][j].umv(x[j], y[i]);
    \n-
    223 });
    \n-
    224 });
    \n-
    225 }
    \n-
    \n-
    226
    \n-
    229 template<typename X, typename Y>
    \n-
    \n-
    230 void mmv (const X& x, Y& y) const {
    \n-
    231 static_assert(X::size() == M(), "length of x does not match row length");
    \n-
    232 static_assert(Y::size() == N(), "length of y does not match row count");
    \n-
    233 using namespace Dune::Hybrid;
    \n-
    234 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n-
    235 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    236 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n-
    237 (*this)[i][j].mmv(x[j], y[i]);
    \n-
    238 });
    \n-
    239 });
    \n-
    240 }
    \n+
    215 SuperLUMatrix() : ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>()
    \n+
    216 {}
    \n
    \n+
    217
    \n+
    \n+\n+
    220 {
    \n+
    221 if (this->N_+this->M_*this->Nnz_ != 0)
    \n+
    222 free();
    \n+
    223 }
    \n+
    \n+
    224
    \n+
    \n+
    226 operator SuperMatrix&()
    \n+
    227 {
    \n+
    228 return A;
    \n+
    229 }
    \n+
    \n+
    230
    \n+
    \n+
    232 operator const SuperMatrix&() const
    \n+
    233 {
    \n+
    234 return A;
    \n+
    235 }
    \n+
    \n+
    236
    \n+
    \n+\n+
    238 {
    \n+
    239 if (this->N_ + this->M_ + this->Nnz_!=0)
    \n+
    240 free();
    \n
    241
    \n-
    244 template<typename AlphaType, typename X, typename Y>
    \n-
    \n-
    245 void usmv (const AlphaType& alpha, const X& x, Y& y) const {
    \n-
    246 static_assert(X::size() == M(), "length of x does not match row length");
    \n-
    247 static_assert(Y::size() == N(), "length of y does not match row count");
    \n-
    248 using namespace Dune::Hybrid;
    \n-
    249 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n-
    250 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    251 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n-
    252 (*this)[i][j].usmv(alpha, x[j], y[i]);
    \n-
    253 });
    \n-
    254 });
    \n-
    255 }
    \n-
    \n-
    256
    \n-
    259 template<typename X, typename Y>
    \n-
    \n-
    260 void mtv (const X& x, Y& y) const {
    \n-
    261 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n-
    262 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n-
    263 y = 0;
    \n-
    264 umtv(x,y);
    \n-
    265 }
    \n-
    \n-
    266
    \n-
    269 template<typename X, typename Y>
    \n-
    \n-
    270 void umtv (const X& x, Y& y) const {
    \n-
    271 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n-
    272 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n-
    273 using namespace Dune::Hybrid;
    \n-
    274 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n-
    275 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    276 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n-
    277 (*this)[j][i].umtv(x[j], y[i]);
    \n-
    278 });
    \n-
    279 });
    \n-
    280 }
    \n-
    \n-
    281
    \n-
    284 template<typename X, typename Y>
    \n-
    \n-
    285 void mmtv (const X& x, Y& y) const {
    \n-
    286 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n-
    287 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n-
    288 using namespace Dune::Hybrid;
    \n-
    289 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n-
    290 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    291 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n-
    292 (*this)[j][i].mmtv(x[j], y[i]);
    \n-
    293 });
    \n-
    294 });
    \n-
    295 }
    \n-
    \n-
    296
    \n-
    299 template<typename X, typename Y>
    \n-
    \n-
    300 void usmtv (const field_type& alpha, const X& x, Y& y) const {
    \n-
    301 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n-
    302 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n-
    303 using namespace Dune::Hybrid;
    \n-
    304 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n-
    305 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    306 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n-
    307 (*this)[j][i].usmtv(alpha, x[j], y[i]);
    \n-
    308 });
    \n-
    309 });
    \n-
    310 }
    \n+
    242 using Matrix = BCRSMatrix<B,TA>;
    \n+\n+\n+
    245 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(*this);
    \n+
    246
    \n+
    247 copyToBCCSMatrix(initializer, mat);
    \n+
    248
    \n+\n+
    250 ::create(&A, this->N_, this->M_, this->colstart[this->N_],
    \n+
    251 this->values,this->rowindex, this->colstart, SLU_NC,
    \n+
    252 static_cast<Dtype_t>(GetSuperLUType<typename Matrix::field_type>::type), SLU_GE);
    \n+
    253 return *this;
    \n+
    254 }
    \n+
    \n+
    255
    \n+
    \n+\n+
    257 {
    \n+
    258 if (this->N_ + this->M_ + this->Nnz_!=0)
    \n+
    259 free();
    \n+
    260
    \n+
    261 using Matrix = BCRSMatrix<B,TA>;
    \n+\n+\n+
    264 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(*this);
    \n+
    265
    \n+
    266 copyToBCCSMatrix(initializer, mat);
    \n+
    267
    \n+\n+
    269 ::create(&A, this->N_, this->M_, this->colstart[this->N_],
    \n+
    270 this->values,this->rowindex, this->colstart, SLU_NC,
    \n+
    271 static_cast<Dtype_t>(GetSuperLUType<B>::type), SLU_GE);
    \n+
    272 return *this;
    \n+
    273 }
    \n+
    \n+
    274
    \n+
    \n+
    281 virtual void setMatrix(const Matrix& mat, const std::set<std::size_t>& mrs)
    \n+
    282 {
    \n+
    283 if(this->N_+this->M_+this->Nnz_!=0)
    \n+
    284 free();
    \n+
    285 this->N_=mrs.size()*MatrixDimension<typename Matrix::block_type>::rowdim(*(mat[0].begin()));
    \n+
    286 this->M_=mrs.size()*MatrixDimension<typename Matrix::block_type>::coldim(*(mat[0].begin()));
    \n+
    287 SuperMatrixInitializer<Matrix> initializer(*this);
    \n+
    288
    \n+
    289 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(mat,mrs));
    \n+
    290 }
    \n+
    \n+
    291
    \n+
    \n+
    293 virtual void setMatrix(const Matrix& mat)
    \n+
    294 {
    \n+\n+\n+
    297 SuperMatrixInitializer<Matrix> initializer(*this);
    \n+
    298
    \n+
    299 copyToBCCSMatrix(initializer, mat);
    \n+
    300 }
    \n+
    \n+
    301
    \n+
    \n+
    303 virtual void free()
    \n+
    304 {
    \n+
    305 ISTL::Impl::BCCSMatrix<typename BCRSMatrix<B,TA>::field_type, int>::free();
    \n+
    306 SUPERLU_FREE(A.Store);
    \n+
    307 }
    \n+
    \n+
    308 private:
    \n+
    309 SuperMatrix A;
    \n+
    310 };
    \n
    \n
    311
    \n-
    314 template<typename X, typename Y>
    \n-
    \n-
    315 void umhv (const X& x, Y& y) const {
    \n-
    316 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n-
    317 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n-
    318 using namespace Dune::Hybrid;
    \n-
    319 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n-
    320 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    321 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n-
    322 (*this)[j][i].umhv(x[j], y[i]);
    \n-
    323 });
    \n-
    324 });
    \n-
    325 }
    \n-
    \n-
    326
    \n-
    329 template<typename X, typename Y>
    \n-
    \n-
    330 void mmhv (const X& x, Y& y) const {
    \n-
    331 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n-
    332 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n-
    333 using namespace Dune::Hybrid;
    \n-
    334 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n-
    335 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    336 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n-
    337 (*this)[j][i].mmhv(x[j], y[i]);
    \n-
    338 });
    \n-
    339 });
    \n-
    340 }
    \n-
    \n-
    341
    \n-
    344 template<typename X, typename Y>
    \n-
    \n-
    345 void usmhv (const field_type& alpha, const X& x, Y& y) const {
    \n-
    346 static_assert(X::size() == N(), "length of x does not match number of rows");
    \n-
    347 static_assert(Y::size() == M(), "length of y does not match number of columns");
    \n-
    348 using namespace Dune::Hybrid;
    \n-
    349 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {
    \n-
    350 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    351 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {
    \n-
    352 (*this)[j][i].usmhv(alpha, x[j], y[i]);
    \n-
    353 });
    \n-
    354 });
    \n-
    355 }
    \n-
    \n-
    356
    \n-
    357
    \n-
    358 //===== norms
    \n-
    359
    \n-
    \n-\n-
    362 {
    \n-
    363 real_type sum=0;
    \n-
    364
    \n-
    365 auto rows = index_constant<N()>();
    \n-
    366 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
    \n-
    367 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
    \n-
    368 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
    \n-
    369 sum += (*this)[i][j].frobenius_norm2();
    \n-
    370 });
    \n-
    371 });
    \n-
    372
    \n-
    373 return sum;
    \n-
    374 }
    \n-
    \n-
    375
    \n-
    \n-\n-
    378 {
    \n-
    379 return sqrt(frobenius_norm2());
    \n-
    380 }
    \n-
    \n-
    381
    \n-
    \n-\n-
    384 {
    \n-
    385 using std::max;
    \n-
    386 real_type norm=0;
    \n-
    387
    \n-
    388 auto rows = index_constant<N()>();
    \n-
    389 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
    \n-
    390 real_type sum=0;
    \n-
    391 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
    \n-
    392 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
    \n-
    393 sum += (*this)[i][j].infinity_norm();
    \n-
    394 });
    \n-
    395 norm = max(sum, norm);
    \n-
    396 });
    \n-
    397
    \n-
    398 return norm;
    \n-
    399 }
    \n-
    \n-
    400
    \n-
    \n-\n-
    403 {
    \n-
    404 using std::max;
    \n-
    405 real_type norm=0;
    \n-
    406
    \n-
    407 auto rows = index_constant<N()>();
    \n-
    408 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {
    \n-
    409 real_type sum=0;
    \n-
    410 auto cols = index_constant<MultiTypeBlockMatrix<FirstRow, Args...>::M()>();
    \n-
    411 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {
    \n-
    412 sum += (*this)[i][j].infinity_norm_real();
    \n-
    413 });
    \n-
    414 norm = max(sum, norm);
    \n-
    415 });
    \n-
    416
    \n-
    417 return norm;
    \n-
    418 }
    \n-
    \n-
    419
    \n-
    420 };
    \n-
    \n-
    421
    \n-
    422
    \n-
    426 template <typename... Rows>
    \n-
    \n-
    427 struct FieldTraits< MultiTypeBlockMatrix<Rows...> >
    \n-
    428 {
    \n-
    429 using field_type = typename MultiTypeBlockMatrix<Rows...>::field_type;
    \n-
    430 using real_type = typename MultiTypeBlockMatrix<Rows...>::real_type;
    \n-
    431 };
    \n-
    \n-
    432
    \n-
    433
    \n-
    439 template<typename T1, typename... Args>
    \n-
    \n-
    440 std::ostream& operator<< (std::ostream& s, const MultiTypeBlockMatrix<T1,Args...>& m) {
    \n-
    441 auto N = index_constant<MultiTypeBlockMatrix<T1,Args...>::N()>();
    \n-
    442 auto M = index_constant<MultiTypeBlockMatrix<T1,Args...>::M()>();
    \n-
    443 using namespace Dune::Hybrid;
    \n-
    444 forEach(integralRange(N), [&](auto&& i) {
    \n-
    445 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    446 forEach(integralRange(M), [&](auto&& j) {
    \n-
    447 s << "\\t(" << i << ", " << j << "): \\n" << m[i][j];
    \n-
    448 });
    \n-
    449 });
    \n-
    450 s << std::endl;
    \n-
    451 return s;
    \n-
    452 }
    \n-
    \n-
    453
    \n-
    454 //make algmeta_itsteps known
    \n-
    455 template<int I, typename M>
    \n-
    456 struct algmeta_itsteps;
    \n-
    457
    \n-
    464 template<int I, int crow, int ccol, int remain_col> //MultiTypeBlockMatrix_Solver_Col: iterating over one row
    \n-
    \n-
    465 class MultiTypeBlockMatrix_Solver_Col { //calculating b- A[i][j]*x[j]
    \n-
    466 public:
    \n-
    470 template <typename Trhs, typename TVector, typename TMatrix, typename K>
    \n-
    \n-
    471 static void calc_rhs(const TMatrix& A, TVector& x, TVector& v, Trhs& b, const K& w) {
    \n-
    472 std::get<ccol>( std::get<crow>(A) ).mmv( std::get<ccol>(x), b );
    \n-\n-
    474 }
    \n-
    \n-
    475
    \n-
    476 };
    \n-
    \n-
    477 template<int I, int crow, int ccol> //MultiTypeBlockMatrix_Solver_Col recursion end
    \n-
    \n-
    478 class MultiTypeBlockMatrix_Solver_Col<I,crow,ccol,0> {
    \n-
    479 public:
    \n-
    480 template <typename Trhs, typename TVector, typename TMatrix, typename K>
    \n-
    481 static void calc_rhs(const TMatrix&, TVector&, TVector&, Trhs&, const K&) {}
    \n-
    482 };
    \n-
    \n-
    483
    \n-
    484
    \n-
    485
    \n-
    492 template<int I, int crow, int remain_row>
    \n-
    \n-\n-
    494 public:
    \n-
    495
    \n-
    499 template <typename TVector, typename TMatrix, typename K>
    \n-
    \n-
    500 static void dbgs(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
    \n-
    501 TVector xold(x);
    \n-
    502 xold=x; //store old x values
    \n-\n-
    504 x *= w;
    \n-
    505 x.axpy(1-w,xold); //improve x
    \n-
    506 }
    \n-
    \n-
    507 template <typename TVector, typename TMatrix, typename K>
    \n-
    \n-
    508 static void dbgs(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
    \n-
    509 auto rhs = std::get<crow> (b);
    \n-
    510
    \n-
    511 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
    \n-
    512 //solve on blocklevel I-1
    \n-
    513 using M =
    \n-
    514 typename std::remove_cv<
    \n-
    515 typename std::remove_reference<
    \n-
    516 decltype(std::get<crow>( std::get<crow>(A)))
    \n-
    517 >::type
    \n-
    518 >::type;
    \n-
    519 algmeta_itsteps<I-1,M>::dbgs(std::get<crow>( std::get<crow>(A)), std::get<crow>(x),rhs,w);
    \n-\n-
    521 }
    \n-
    \n-
    522
    \n-
    523
    \n-
    524
    \n-
    528 template <typename TVector, typename TMatrix, typename K>
    \n-
    \n-
    529 static void bsorf(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
    \n-
    530 TVector v;
    \n-
    531 v=x; //use latest x values in right side calculation
    \n-\n-
    533
    \n-
    534 }
    \n-
    \n-
    535 template <typename TVector, typename TMatrix, typename K> //recursion over all matrix rows (A)
    \n-
    \n-
    536 static void bsorf(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
    \n-
    537 auto rhs = std::get<crow> (b);
    \n-
    538
    \n-
    539 MultiTypeBlockMatrix_Solver_Col<I,crow,0,TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
    \n-
    540 //solve on blocklevel I-1
    \n-
    541 using M =
    \n-
    542 typename std::remove_cv<
    \n-
    543 typename std::remove_reference<
    \n-
    544 decltype(std::get<crow>( std::get<crow>(A)))
    \n-
    545 >::type
    \n-
    546 >::type;
    \n-
    547 algmeta_itsteps<I-1,M>::bsorf(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
    \n-
    548 std::get<crow>(x).axpy(w,std::get<crow>(v));
    \n-\n-
    550 }
    \n-
    \n-
    551
    \n-
    555 template <typename TVector, typename TMatrix, typename K>
    \n-
    \n-
    556 static void bsorb(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
    \n-
    557 TVector v;
    \n-
    558 v=x; //use latest x values in right side calculation
    \n-\n-
    560
    \n-
    561 }
    \n-
    \n-
    562 template <typename TVector, typename TMatrix, typename K> //recursion over all matrix rows (A)
    \n-
    \n-
    563 static void bsorb(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
    \n-
    564 auto rhs = std::get<crow> (b);
    \n-
    565
    \n-
    566 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
    \n-
    567 //solve on blocklevel I-1
    \n-
    568 using M =
    \n-
    569 typename std::remove_cv<
    \n-
    570 typename std::remove_reference<
    \n-
    571 decltype(std::get<crow>( std::get<crow>(A)))
    \n-
    572 >::type
    \n-
    573 >::type;
    \n-
    574 algmeta_itsteps<I-1,M>::bsorb(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
    \n-
    575 std::get<crow>(x).axpy(w,std::get<crow>(v));
    \n-\n-
    577 }
    \n-
    \n-
    578
    \n-
    579
    \n-
    583 template <typename TVector, typename TMatrix, typename K>
    \n-
    \n-
    584 static void dbjac(const TMatrix& A, TVector& x, const TVector& b, const K& w) {
    \n-
    585 TVector v(x);
    \n-
    586 v=0; //calc new x in v
    \n-\n-
    588 x.axpy(w,v); //improve x
    \n-
    589 }
    \n-
    \n-
    590 template <typename TVector, typename TMatrix, typename K>
    \n-
    \n-
    591 static void dbjac(const TMatrix& A, TVector& x, TVector& v, const TVector& b, const K& w) {
    \n-
    592 auto rhs = std::get<crow> (b);
    \n-
    593
    \n-
    594 MultiTypeBlockMatrix_Solver_Col<I,crow,0, TMatrix::M()>::calc_rhs(A,x,v,rhs,w); // calculate right side of equation
    \n-
    595 //solve on blocklevel I-1
    \n-
    596 using M =
    \n-
    597 typename std::remove_cv<
    \n-
    598 typename std::remove_reference<
    \n-
    599 decltype(std::get<crow>( std::get<crow>(A)))
    \n-
    600 >::type
    \n-
    601 >::type;
    \n-
    602 algmeta_itsteps<I-1,M>::dbjac(std::get<crow>( std::get<crow>(A)), std::get<crow>(v),rhs,w);
    \n-\n-
    604 }
    \n-
    \n-
    605
    \n-
    606
    \n-
    607
    \n-
    608
    \n-
    609 };
    \n-
    \n-
    610 template<int I, int crow> //recursion end for remain_row = 0
    \n-
    \n-\n-
    612 public:
    \n-
    613 template <typename TVector, typename TMatrix, typename K>
    \n-
    \n-
    614 static void dbgs(const TMatrix&, TVector&, TVector&,
    \n-
    615 const TVector&, const K&) {}
    \n-
    \n-
    616
    \n-
    617 template <typename TVector, typename TMatrix, typename K>
    \n-
    \n-
    618 static void bsorf(const TMatrix&, TVector&, TVector&,
    \n-
    619 const TVector&, const K&) {}
    \n-
    \n-
    620
    \n-
    621 template <typename TVector, typename TMatrix, typename K>
    \n-
    \n-
    622 static void bsorb(const TMatrix&, TVector&, TVector&,
    \n-
    623 const TVector&, const K&) {}
    \n-
    \n-
    624
    \n-
    625 template <typename TVector, typename TMatrix, typename K>
    \n-
    \n-
    626 static void dbjac(const TMatrix&, TVector&, TVector&,
    \n-
    627 const TVector&, const K&) {}
    \n-
    \n-
    628 };
    \n-
    \n-
    629
    \n-
    630} // end namespace Dune
    \n-
    631
    \n-
    632namespace std
    \n-
    633{
    \n-
    638 template <size_t i, typename... Args>
    \n-
    \n-
    639 struct tuple_element<i,Dune::MultiTypeBlockMatrix<Args...> >
    \n-
    640 {
    \n-
    641 using type = typename std::tuple_element<i, std::tuple<Args...> >::type;
    \n-
    642 };
    \n-
    \n-
    643
    \n-
    648 template <typename... Args>
    \n-
    \n-
    649 struct tuple_size<Dune::MultiTypeBlockMatrix<Args...> >
    \n-
    650 : std::integral_constant<std::size_t, sizeof...(Args)>
    \n-
    651 {};
    \n-
    \n-
    652}
    \n-
    653#endif
    \n-
    Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
    \n-\n-
    typename MultiTypeBlockMatrix< Rows... >::field_type field_type
    Definition multitypeblockmatrix.hh:429
    \n-
    MultiTypeBlockMatrix< FirstRow, Args... > type
    Definition multitypeblockmatrix.hh:56
    \n-
    static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:584
    \n-
    real_type infinity_norm_real() const
    Bastardized version of the infinity-norm / row-sum norm.
    Definition multitypeblockmatrix.hh:402
    \n-
    MultiTypeBlockMatrix & operator+=(const MultiTypeBlockMatrix &b)
    Add the entries of another matrix to this one.
    Definition multitypeblockmatrix.hh:177
    \n-
    void mv(const X &x, Y &y) const
    y = A x
    Definition multitypeblockmatrix.hh:205
    \n-
    void mmtv(const X &x, Y &y) const
    y -= A^T x
    Definition multitypeblockmatrix.hh:285
    \n-
    void mmhv(const X &x, Y &y) const
    y -= A^H x
    Definition multitypeblockmatrix.hh:330
    \n-
    Std::detected_t< std::common_type_t, typename FieldTraits< FirstRow >::real_type, typename FieldTraits< Args >::real_type... > real_type
    The type used for real values.
    Definition multitypeblockmatrix.hh:75
    \n-
    static void dbgs(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
    Definition multitypeblockmatrix.hh:614
    \n-
    static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:500
    \n-
    static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:556
    \n-
    void usmhv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^H x
    Definition multitypeblockmatrix.hh:345
    \n-
    void usmv(const AlphaType &alpha, const X &x, Y &y) const
    y += alpha A x
    Definition multitypeblockmatrix.hh:245
    \n-
    MultiTypeBlockMatrix & operator/=(const field_type &k)
    vector space division by scalar
    Definition multitypeblockmatrix.hh:161
    \n-
    real_type infinity_norm() const
    Bastardized version of the infinity-norm / row-sum norm.
    Definition multitypeblockmatrix.hh:383
    \n-
    typename std::tuple_element< i, std::tuple< Args... > >::type type
    Definition multitypeblockmatrix.hh:641
    \n-
    static void dbgs(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:508
    \n-
    static void bsorf(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:536
    \n-
    void umhv(const X &x, Y &y) const
    y += A^H x
    Definition multitypeblockmatrix.hh:315
    \n-
    static constexpr size_type N()
    Return the number of matrix rows.
    Definition multitypeblockmatrix.hh:84
    \n-
    void usmtv(const field_type &alpha, const X &x, Y &y) const
    y += alpha A^T x
    Definition multitypeblockmatrix.hh:300
    \n-
    void operator=(const T &newval)
    Definition multitypeblockmatrix.hh:136
    \n-
    static void calc_rhs(const TMatrix &, TVector &, TVector &, Trhs &, const K &)
    Definition multitypeblockmatrix.hh:481
    \n-
    void umv(const X &x, Y &y) const
    y += A x
    Definition multitypeblockmatrix.hh:215
    \n-
    static void calc_rhs(const TMatrix &A, TVector &x, TVector &v, Trhs &b, const K &w)
    Definition multitypeblockmatrix.hh:471
    \n-
    static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:529
    \n-
    static void dbjac(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
    Definition multitypeblockmatrix.hh:626
    \n-
    std::size_t size_type
    Type used for sizes.
    Definition multitypeblockmatrix.hh:59
    \n-
    real_type frobenius_norm2() const
    square of frobenius norm, need for block recursion
    Definition multitypeblockmatrix.hh:361
    \n-
    real_type frobenius_norm() const
    frobenius norm: sqrt(sum over squared values of entries)
    Definition multitypeblockmatrix.hh:377
    \n-
    static void bsorb(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
    Definition multitypeblockmatrix.hh:622
    \n-
    MultiTypeBlockMatrix & operator-=(const MultiTypeBlockMatrix &b)
    Subtract the entries of another matrix from this one.
    Definition multitypeblockmatrix.hh:192
    \n-
    typename MultiTypeBlockMatrix< Rows... >::real_type real_type
    Definition multitypeblockmatrix.hh:430
    \n-
    auto operator[](const std::integral_constant< size_type, index > indexVariable) -> decltype(std::get< index >(*this))
    Random-access operator.
    Definition multitypeblockmatrix.hh:113
    \n-
    static void dbjac(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:591
    \n-
    static void bsorf(const TMatrix &, TVector &, TVector &, const TVector &, const K &)
    Definition multitypeblockmatrix.hh:618
    \n-
    void mtv(const X &x, Y &y) const
    y = A^T x
    Definition multitypeblockmatrix.hh:260
    \n-
    static constexpr size_type M()
    Return the number of matrix columns.
    Definition multitypeblockmatrix.hh:90
    \n-
    void mmv(const X &x, Y &y) const
    y -= A x
    Definition multitypeblockmatrix.hh:230
    \n-
    Std::detected_t< std::common_type_t, typename FieldTraits< FirstRow >::field_type, typename FieldTraits< Args >::field_type... > field_type
    The type used for scalars.
    Definition multitypeblockmatrix.hh:67
    \n-
    void umtv(const X &x, Y &y) const
    y += A^T x
    Definition multitypeblockmatrix.hh:270
    \n-
    static void bsorb(const TMatrix &A, TVector &x, TVector &v, const TVector &b, const K &w)
    Definition multitypeblockmatrix.hh:563
    \n-
    MultiTypeBlockMatrix & operator*=(const field_type &k)
    vector space multiplication with scalar
    Definition multitypeblockmatrix.hh:150
    \n+
    312 template<class B, class A>
    \n+
    \n+\n+
    314 : public ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>
    \n+
    315 {
    \n+
    316 template<class I, class S, class D>
    \n+\n+
    318 public:
    \n+\n+\n+
    321
    \n+
    \n+
    322 SuperMatrixInitializer(SuperLUMatrix& lum) : ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>(lum)
    \n+
    323 ,slumat(&lum)
    \n+
    324 {}
    \n+
    \n+
    325
    \n+
    \n+
    326 SuperMatrixInitializer() : ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>()
    \n+
    327 {}
    \n+
    \n+
    328
    \n+
    \n+
    329 virtual void createMatrix() const
    \n+
    330 {
    \n+
    331 ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<B,A>, int>::createMatrix();
    \n+\n+
    333 ::create(&slumat->A, slumat->N_, slumat->M_, slumat->colstart[this->cols],
    \n+
    334 slumat->values,slumat->rowindex, slumat->colstart, SLU_NC,
    \n+
    335 static_cast<Dtype_t>(GetSuperLUType<typename Matrix::field_type>::type), SLU_GE);
    \n+
    336 }
    \n+
    \n+
    337 private:
    \n+
    338 SuperLUMatrix* slumat;
    \n+
    339 };
    \n+
    \n+
    340}
    \n+
    341#endif // HAVE_SUPERLU
    \n+
    342#endif
    \n+
    Implementation of the BCRSMatrix class.
    \n+\n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+\n+
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n
    STL namespace.
    \n
    Definition allocator.hh:11
    \n-
    std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
    Send BlockVector to an output stream.
    Definition bvector.hh:583
    \n-
    A Matrix class to support different block types.
    Definition multitypeblockmatrix.hh:46
    \n-
    static void bsorb(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:461
    \n-
    static void bsorf(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:418
    \n-
    static void dbjac(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:504
    \n-
    static void dbgs(const M &A, X &x, const Y &b, const K &w)
    Definition gsetc.hh:378
    \n-
    solver for MultiTypeBlockVector & MultiTypeBlockMatrix types
    Definition multitypeblockmatrix.hh:493
    \n-
    part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types
    Definition multitypeblockmatrix.hh:465
    \n+
    Initializer for SuperLU Matrices representing the subdomains.
    Definition overlappingschwarz.hh:47
    \n+
    static auto coldim(const M &A)
    Definition matrixutils.hh:219
    \n+
    static auto rowdim(const M &A)
    Definition matrixutils.hh:214
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n+
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n+
    Definition overlappingschwarz.hh:694
    \n+
    SuperLu Solver.
    Definition superlu.hh:271
    \n+
    Definition supermatrix.hh:26
    \n+
    Definition supermatrix.hh:30
    \n+
    Definition supermatrix.hh:126
    \n+
    static const Dtype_t type
    Definition supermatrix.hh:127
    \n+
    Definition supermatrix.hh:132
    \n+
    double float_type
    Definition supermatrix.hh:144
    \n+
    float float_type
    Definition supermatrix.hh:151
    \n+
    double float_type
    Definition supermatrix.hh:158
    \n+
    float float_type
    Definition supermatrix.hh:165
    \n+
    Utility class for converting an ISTL Matrix into a SuperLU Matrix.
    Definition supermatrix.hh:175
    \n+
    Definition supermatrix.hh:179
    \n+
    virtual void free()
    free allocated space.
    Definition supermatrix.hh:303
    \n+
    SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const SuperLUMatrix< BCRSMatrix< B, TA > > &mat)
    Definition supermatrix.hh:256
    \n+
    SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const BCRSMatrix< B, TA > &mat)
    Definition supermatrix.hh:237
    \n+
    SuperLUMatrix(const Matrix &mat)
    Constructor that initializes the data.
    Definition supermatrix.hh:212
    \n+
    virtual void setMatrix(const Matrix &mat)
    Initialize data from given matrix.
    Definition supermatrix.hh:293
    \n+
    SuperLUMatrix()
    Definition supermatrix.hh:215
    \n+
    Matrix::size_type size_type
    Definition supermatrix.hh:206
    \n+
    BCRSMatrix< B, TA > Matrix
    The type of the matrix to convert.
    Definition supermatrix.hh:202
    \n+
    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
    \n+
    virtual ~SuperLUMatrix()
    Destructor.
    Definition supermatrix.hh:219
    \n+
    Dune::SuperLUMatrix< Matrix > SuperLUMatrix
    Definition supermatrix.hh:320
    \n+
    BCRSMatrix< B, A > Matrix
    Definition supermatrix.hh:319
    \n+
    SuperMatrixInitializer()
    Definition supermatrix.hh:326
    \n+
    virtual void createMatrix() const
    Definition supermatrix.hh:329
    \n+
    SuperMatrixInitializer(SuperLUMatrix &lum)
    Definition supermatrix.hh:322
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,781 +1,461 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-multitypeblockmatrix.hh\n+supermatrix.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH\n-6#define DUNE_ISTL_MULTITYPEBLOCKMATRIX_HH\n+5#ifndef DUNE_ISTL_SUPERMATRIX_HH\n+6#define DUNE_ISTL_SUPERMATRIX_HH\n 7\n-8#include \n-9#include \n-10#include \n-11\n-12#include \n-13\n-14#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-15\n-16// forward declaration\n-17namespace _\bD_\bu_\bn_\be\n-18{\n-19 template\n-20 class MultiTypeBlockMatrix;\n-21\n-22 template\n-23 class MultiTypeBlockMatrix_Solver;\n-24}\n-25\n-26#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n+8#if HAVE_SUPERLU\n+9\n+10#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n+11#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+12#include \n+13#include \n+14#include \n+15#include \n+16\n+17#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n+18\n+19#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\"\n+20\n+21namespace _\bD_\bu_\bn_\be\n+22{\n+23\n+24 template\n+_\b2_\b5 struct _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n+26 {};\n 27\n-28namespace _\bD_\bu_\bn_\be {\n-29\n-43 template\n-_\b4_\b4 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx\n-45 : public std::tuple\n-46 {\n-47 using ParentType = std::tuple;\n-48 public:\n-49\n-51 using ParentType::ParentType;\n-52\n-_\b5_\b6 typedef _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx _\bt_\by_\bp_\be;\n-57\n-_\b5_\b9 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = std::size_t;\n-60\n-_\b6_\b6 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = Std::detected_t::field_type, typename FieldTraits::\n-field_type...>;\n-68\n-_\b7_\b4 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = Std::detected_t::real_type, typename FieldTraits::\n-real_type...>;\n-76\n-77 // make sure that we have an std::common_type: using an assertion produces a\n-more readable error message\n-78 // than a compiler template instantiation error\n-79 static_assert ( sizeof...(Args) == 0 or\n-80 not (std::is_same_v or std::is_same_v),\n-81 \"No std::common_type implemented for the given field_type/real_type of the\n-Args. Please provide an implementation and check that a FieldTraits class is\n-present for your type.\");\n-82\n-_\b8_\b4 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN()\n+28 template\n+_\b2_\b9 struct _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\bi_\bn_\bt_\be_\br\n+30 {};\n+31\n+32#if __has_include(\"slu_sdefs.h\")\n+33 template<>\n+34 struct _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n+35 {\n+36 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, int offset,\n+37 float *values, int *rowindex, int* colindex,\n+38 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n+39 {\n+40 sCreate_CompCol_Matrix(_\bm_\ba_\bt, n, m, offset, values, rowindex, colindex,\n+41 stype, dtype, mtype);\n+42 }\n+43 };\n+44\n+45 template<>\n+46 struct SuperMatrixPrinter\n+47 {\n+48 static void print(char* name, SuperMatrix* _\bm_\ba_\bt)\n+49 {\n+50 sPrint_CompCol_Matrix(name, _\bm_\ba_\bt);\n+51 }\n+52 };\n+53#endif\n+54\n+55#if __has_include(\"slu_ddefs.h\")\n+56 template<>\n+57 struct SuperMatrixCreateSparseChooser\n+58 {\n+59 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, int offset,\n+60 double *values, int *rowindex, int* colindex,\n+61 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n+62 {\n+63 dCreate_CompCol_Matrix(_\bm_\ba_\bt, n, m, offset, values, rowindex, colindex,\n+64 stype, dtype, mtype);\n+65 }\n+66 };\n+67\n+68 template<>\n+69 struct SuperMatrixPrinter\n+70 {\n+71 static void print(char* name, SuperMatrix* _\bm_\ba_\bt)\n+72 {\n+73 dPrint_CompCol_Matrix(name, _\bm_\ba_\bt);\n+74 }\n+75 };\n+76#endif\n+77\n+78#if __has_include(\"slu_cdefs.h\")\n+79 template<>\n+80 struct SuperMatrixCreateSparseChooser<_\bs_\bt_\bd::complex >\n+81 {\n+82 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, int offset,\n+83 std::complex *values, int *rowindex, int* colindex,\n+84 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n 85 {\n-86 return 1+sizeof...(Args);\n-87 }\n-88\n-_\b9_\b0 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bM()\n-91 {\n-92 return FirstRow::size();\n-93 }\n-94\n-111 template< size_type index >\n-112 auto\n-_\b1_\b1_\b3 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ([[maybe_unused]] const std::integral_constant< size_type, index\n-> indexVariable)\n-114 -> decltype(std::get(*this))\n-115 {\n-116 return std::get(*this);\n-117 }\n-118\n-124 template< size_type index >\n-125 auto\n-_\b1_\b2_\b6 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ([[maybe_unused]] const std::integral_constant< size_type, index\n-> indexVariable) const\n-127 -> decltype(std::get(*this))\n-128 {\n-129 return std::get(*this);\n-130 }\n-131\n-135 template\n-_\b1_\b3_\b6 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const T& newval) {\n-137 using namespace Dune::Hybrid;\n-138 auto size = index_constant<1+sizeof...(Args)>();\n-139 // Since Dune::Hybrid::size(MultiTypeBlockMatrix) is not implemented,\n-140 // we cannot use a plain forEach(*this, ...). This could be achieved,\n-141 // e.g., by implementing a static size() method.\n-142 forEach(integralRange(size), [&](auto&& i) {\n-143 (*this)[i] = newval;\n-144 });\n-145 }\n+86 cCreate_CompCol_Matrix(_\bm_\ba_\bt, n, m, offset, reinterpret_cast< ::complex*>\n+(values),\n+87 rowindex, colindex, stype, dtype, mtype);\n+88 }\n+89 };\n+90\n+91 template<>\n+92 struct SuperMatrixPrinter<_\bs_\bt_\bd::complex >\n+93 {\n+94 static void print(char* name, SuperMatrix* _\bm_\ba_\bt)\n+95 {\n+96 cPrint_CompCol_Matrix(name, _\bm_\ba_\bt);\n+97 }\n+98 };\n+99#endif\n+100\n+101#if __has_include(\"slu_zdefs.h\")\n+102 template<>\n+103 struct SuperMatrixCreateSparseChooser<_\bs_\bt_\bd::complex >\n+104 {\n+105 static void create(SuperMatrix *_\bm_\ba_\bt, int n, int m, int offset,\n+106 std::complex *values, int *rowindex, int* colindex,\n+107 Stype_t stype, Dtype_t dtype, Mtype_t mtype)\n+108 {\n+109 zCreate_CompCol_Matrix(_\bm_\ba_\bt, n, m, offset, reinterpret_cast\n+(values),\n+110 rowindex, colindex, stype, dtype, mtype);\n+111 }\n+112 };\n+113\n+114 template<>\n+115 struct SuperMatrixPrinter<_\bs_\bt_\bd::complex >\n+116 {\n+117 static void print(char* name, SuperMatrix* _\bm_\ba_\bt)\n+118 {\n+119 zPrint_CompCol_Matrix(name, _\bm_\ba_\bt);\n+120 }\n+121 };\n+122#endif\n+123\n+124 template\n+_\b1_\b2_\b5 struct _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n+126 {\n+_\b1_\b2_\b7 static const Dtype_t _\bt_\by_\bp_\be;\n+128 };\n+129\n+130 template\n+_\b1_\b3_\b1 struct _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n+132 {};\n+133\n+134 template\n+135 const Dtype_t _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bT_\b>_\b:_\b:_\bt_\by_\bp_\be =\n+136 std::is_same::value ? SLU_S :\n+137 ( std::is_same >::value ? SLU_Z :\n+138 ( std::is_same >::value ? SLU_C : SLU_D ));\n+139\n+140 template<>\n+_\b1_\b4_\b1 struct _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n+142 : public _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n+143 {\n+_\b1_\b4_\b4 typedef double _\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be;\n+145 };\n 146\n-147 //===== vector space arithmetic\n-148\n-_\b1_\b5_\b0 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n-151 {\n-152 auto size = index_constant();\n-153 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {\n-154 (*this)[i] *= k;\n-155 });\n-156\n-157 return *this;\n-158 }\n-159\n-_\b1_\b6_\b1 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n-162 {\n-163 auto size = index_constant();\n-164 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {\n-165 (*this)[i] /= k;\n-166 });\n-167\n-168 return *this;\n-169 }\n-170\n-171\n-_\b1_\b7_\b7 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& b)\n-178 {\n-179 auto size = index_constant();\n-180 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {\n-181 (*this)[i] += b[i];\n-182 });\n+147 template<>\n+_\b1_\b4_\b8 struct _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n+149 : public _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n+150 {\n+_\b1_\b5_\b1 typedef float _\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be;\n+152 };\n+153\n+154 template<>\n+_\b1_\b5_\b5 struct _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be<_\bs_\bt_\bd::complex >\n+156 : public _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be >\n+157 {\n+_\b1_\b5_\b8 typedef double _\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be;\n+159 };\n+160\n+161 template<>\n+_\b1_\b6_\b2 struct _\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be<_\bs_\bt_\bd::complex >\n+163 : public _\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be >\n+164 {\n+_\b1_\b6_\b5 typedef float _\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be;\n+166\n+167 };\n+168\n+173 template\n+_\b1_\b7_\b4 struct _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n+175 {};\n+176\n+177 template\n+_\b1_\b7_\b8 struct _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+179 {};\n+180\n+181 template\n+182 class _\bS_\bu_\bp_\be_\br_\bL_\bU;\n 183\n-184 return *this;\n-185 }\n+184 template\n+185 class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n 186\n-_\b1_\b9_\b2 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx& b)\n-193 {\n-194 auto size = index_constant();\n-195 Hybrid::forEach(Hybrid::integralRange(size), [&](auto&& i) {\n-196 (*this)[i] -= b[i];\n-197 });\n-198\n-199 return *this;\n-200 }\n-201\n-204 template\n-_\b2_\b0_\b5 void _\bm_\bv (const X& x, Y& y) const {\n-206 static_assert(X::size() == _\bM(), \"length of x does not match row length\");\n-207 static_assert(Y::size() == _\bN(), \"length of y does not match row count\");\n-208 y = 0; //reset y (for mv uses umv)\n-209 _\bu_\bm_\bv(x,y);\n-210 }\n-211\n-214 template\n-_\b2_\b1_\b5 void _\bu_\bm_\bv (const X& x, Y& y) const {\n-216 static_assert(X::size() == _\bM(), \"length of x does not match row length\");\n-217 static_assert(Y::size() == _\bN(), \"length of y does not match row count\");\n-218 using namespace Dune::Hybrid;\n-219 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n-220 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-221 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n-222 (*this)[i][j].umv(x[j], y[i]);\n-223 });\n-224 });\n-225 }\n-226\n-229 template\n-_\b2_\b3_\b0 void _\bm_\bm_\bv (const X& x, Y& y) const {\n-231 static_assert(X::size() == _\bM(), \"length of x does not match row length\");\n-232 static_assert(Y::size() == _\bN(), \"length of y does not match row count\");\n-233 using namespace Dune::Hybrid;\n-234 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n-235 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-236 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n-237 (*this)[i][j].mmv(x[j], y[i]);\n-238 });\n-239 });\n-240 }\n+187 template\n+188 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br;\n+189\n+193 template\n+_\b1_\b9_\b4 class _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n+195 : public ISTL::Impl::BCCSMatrix::field_type, int>\n+196 {\n+197 template\n+_\b1_\b9_\b8 friend class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n+199 friend struct _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >;\n+200 public:\n+_\b2_\b0_\b2 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n+203\n+204 friend struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bS_\bu_\bp_\be_\br_\bL_\bU<_\bM_\ba_\bt_\br_\bi_\bx>, true>;\n+205\n+_\b2_\b0_\b6 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+207\n+_\b2_\b1_\b2 explicit _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt) : ISTL::Impl::\n+BCCSMatrix<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx, int>(_\bm_\ba_\bt)\n+213 {}\n+214\n+_\b2_\b1_\b5 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx() : ISTL::Impl::BCCSMatrix::\n+field_type, int>()\n+216 {}\n+217\n+_\b2_\b1_\b9 virtual _\b~_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx()\n+220 {\n+221 if (this->N_+this->M_*this->Nnz_ != 0)\n+222 free();\n+223 }\n+224\n+_\b2_\b2_\b6 operator SuperMatrix&()\n+227 {\n+228 return A;\n+229 }\n+230\n+_\b2_\b3_\b2 operator const SuperMatrix&() const\n+233 {\n+234 return A;\n+235 }\n+236\n+_\b2_\b3_\b7 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b> >& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>& _\bm_\ba_\bt)\n+238 {\n+239 if (this->N_ + this->M_ + this->Nnz_!=0)\n+240 free();\n 241\n-244 template\n-_\b2_\b4_\b5 void _\bu_\bs_\bm_\bv (const AlphaType& alpha, const X& x, Y& y) const {\n-246 static_assert(X::size() == _\bM(), \"length of x does not match row length\");\n-247 static_assert(Y::size() == _\bN(), \"length of y does not match row count\");\n-248 using namespace Dune::Hybrid;\n-249 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n-250 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-251 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n-252 (*this)[i][j].usmv(alpha, x[j], y[i]);\n-253 });\n-254 });\n-255 }\n-256\n-259 template\n-_\b2_\b6_\b0 void _\bm_\bt_\bv (const X& x, Y& y) const {\n-261 static_assert(X::size() == _\bN(), \"length of x does not match number of\n-rows\");\n-262 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n-columns\");\n-263 y = 0;\n-264 _\bu_\bm_\bt_\bv(x,y);\n-265 }\n-266\n-269 template\n-_\b2_\b7_\b0 void _\bu_\bm_\bt_\bv (const X& x, Y& y) const {\n-271 static_assert(X::size() == _\bN(), \"length of x does not match number of\n-rows\");\n-272 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n-columns\");\n-273 using namespace Dune::Hybrid;\n-274 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n-275 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-276 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n-277 (*this)[j][i].umtv(x[j], y[i]);\n-278 });\n-279 });\n-280 }\n-281\n-284 template\n-_\b2_\b8_\b5 void _\bm_\bm_\bt_\bv (const X& x, Y& y) const {\n-286 static_assert(X::size() == _\bN(), \"length of x does not match number of\n-rows\");\n-287 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n-columns\");\n-288 using namespace Dune::Hybrid;\n-289 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n-290 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-291 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n-292 (*this)[j][i].mmtv(x[j], y[i]);\n-293 });\n-294 });\n-295 }\n-296\n-299 template\n-_\b3_\b0_\b0 void _\bu_\bs_\bm_\bt_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const {\n-301 static_assert(X::size() == _\bN(), \"length of x does not match number of\n-rows\");\n-302 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n-columns\");\n-303 using namespace Dune::Hybrid;\n-304 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n-305 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-306 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n-307 (*this)[j][i].usmtv(alpha, x[j], y[i]);\n-308 });\n-309 });\n-310 }\n+242 using _\bM_\ba_\bt_\br_\bi_\bx = _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>;\n+243 this->N_ = _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(_\bm_\ba_\bt);\n+244 this->M_ = _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(_\bm_\ba_\bt);\n+245 ISTL::Impl::BCCSMatrixInitializer initializer(*this);\n+246\n+247 copyToBCCSMatrix(initializer, _\bm_\ba_\bt);\n+248\n+249 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>\n+250_\b _\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&A, this->N_, this->M_, this->colstart[this->N_],\n+251 this->values,this->rowindex, this->colstart, SLU_NC,\n+252 static_cast(_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bt_\by_\bp_\be),\n+SLU_GE);\n+253 return *this;\n+254 }\n+255\n+_\b2_\b5_\b6 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b> >& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n+<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b> >& _\bm_\ba_\bt)\n+257 {\n+258 if (this->N_ + this->M_ + this->Nnz_!=0)\n+259 free();\n+260\n+261 using _\bM_\ba_\bt_\br_\bi_\bx = _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>;\n+262 this->N_ = _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(_\bm_\ba_\bt);\n+263 this->M_ = _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(_\bm_\ba_\bt);\n+264 ISTL::Impl::BCCSMatrixInitializer initializer(*this);\n+265\n+266 copyToBCCSMatrix(initializer, _\bm_\ba_\bt);\n+267\n+268 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bB_\b>\n+269_\b _\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&A, this->N_, this->M_, this->colstart[this->N_],\n+270 this->values,this->rowindex, this->colstart, SLU_NC,\n+271 static_cast(_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bB_\b>_\b:_\b:_\bt_\by_\bp_\be), SLU_GE);\n+272 return *this;\n+273 }\n+274\n+_\b2_\b8_\b1 virtual void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt, const std::set& mrs)\n+282 {\n+283 if(this->N_+this->M_+this->Nnz_!=0)\n+284 free();\n+285 this->N_=mrs.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(*\n+(_\bm_\ba_\bt[0].begin()));\n+286 this->M_=mrs.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(*\n+(_\bm_\ba_\bt[0].begin()));\n+287 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> initializer(*this);\n+288\n+289 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_\bM_\ba_\bt_\br_\bi_\bx,std::\n+set >(_\bm_\ba_\bt,mrs));\n+290 }\n+291\n+_\b2_\b9_\b3 virtual void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt)\n+294 {\n+295 this->N_=_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(_\bm_\ba_\bt);\n+296 this->M_=_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(_\bm_\ba_\bt);\n+297 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> initializer(*this);\n+298\n+299 copyToBCCSMatrix(initializer, _\bm_\ba_\bt);\n+300 }\n+301\n+_\b3_\b0_\b3 virtual void _\bf_\br_\be_\be()\n+304 {\n+305 ISTL::Impl::BCCSMatrix::field_type, int>::free();\n+306 SUPERLU_FREE(A.Store);\n+307 }\n+308 private:\n+309 SuperMatrix A;\n+310 };\n 311\n-314 template\n-_\b3_\b1_\b5 void _\bu_\bm_\bh_\bv (const X& x, Y& y) const {\n-316 static_assert(X::size() == _\bN(), \"length of x does not match number of\n-rows\");\n-317 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n-columns\");\n-318 using namespace Dune::Hybrid;\n-319 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n-320 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-321 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n-322 (*this)[j][i].umhv(x[j], y[i]);\n-323 });\n-324 });\n-325 }\n-326\n-329 template\n-_\b3_\b3_\b0 void _\bm_\bm_\bh_\bv (const X& x, Y& y) const {\n-331 static_assert(X::size() == _\bN(), \"length of x does not match number of\n-rows\");\n-332 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n-columns\");\n-333 using namespace Dune::Hybrid;\n-334 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n-335 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-336 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n-337 (*this)[j][i].mmhv(x[j], y[i]);\n-338 });\n-339 });\n-340 }\n-341\n-344 template\n-_\b3_\b4_\b5 void _\bu_\bs_\bm_\bh_\bv (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& alpha, const X& x, Y& y) const {\n-346 static_assert(X::size() == _\bN(), \"length of x does not match number of\n-rows\");\n-347 static_assert(Y::size() == _\bM(), \"length of y does not match number of\n-columns\");\n-348 using namespace Dune::Hybrid;\n-349 forEach(integralRange(Hybrid::size(y)), [&](auto&& i) {\n-350 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-351 forEach(integralRange(Hybrid::size(x)), [&](auto&& j) {\n-352 (*this)[j][i].usmhv(alpha, x[j], y[i]);\n-353 });\n-354 });\n-355 }\n-356\n-357\n-358 //===== norms\n-359\n-_\b3_\b6_\b1 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2 () const\n-362 {\n-363 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be sum=0;\n-364\n-365 auto rows = index_constant();\n-366 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {\n-367 auto cols = index_constant::M()>();\n-368 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {\n-369 sum += (*this)[i][j].frobenius_norm2();\n-370 });\n-371 });\n-372\n-373 return sum;\n-374 }\n-375\n-_\b3_\b7_\b7 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm () const\n-378 {\n-379 return sqrt(_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2());\n-380 }\n-381\n-_\b3_\b8_\b3 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm () const\n-384 {\n-385 using std::max;\n-386 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm=0;\n-387\n-388 auto rows = index_constant();\n-389 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {\n-390 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be sum=0;\n-391 auto cols = index_constant::M()>();\n-392 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {\n-393 sum += (*this)[i][j].infinity_norm();\n-394 });\n-395 norm = max(sum, norm);\n-396 });\n-397\n-398 return norm;\n-399 }\n-400\n-_\b4_\b0_\b2 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl () const\n-403 {\n-404 using std::max;\n-405 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be norm=0;\n-406\n-407 auto rows = index_constant();\n-408 Hybrid::forEach(Hybrid::integralRange(rows), [&](auto&& i) {\n-409 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be sum=0;\n-410 auto cols = index_constant::M()>();\n-411 Hybrid::forEach(Hybrid::integralRange(cols), [&](auto&& j) {\n-412 sum += (*this)[i][j].infinity_norm_real();\n-413 });\n-414 norm = max(sum, norm);\n-415 });\n-416\n-417 return norm;\n-418 }\n-419\n-420 };\n-421\n-422\n-426 template \n-_\b4_\b2_\b7 struct FieldTraits< _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx >\n-428 {\n-_\b4_\b2_\b9 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx::field_type;\n-_\b4_\b3_\b0 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx::real_type;\n-431 };\n-432\n-433\n-439 template\n-_\b4_\b4_\b0 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const\n-_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b1_\b,_\bA_\br_\bg_\bs_\b._\b._\b._\b>& m) {\n-441 auto N = index_constant::N()>();\n-442 auto M = index_constant::M()>();\n-443 using namespace Dune::Hybrid;\n-444 forEach(integralRange(N), [&](auto&& i) {\n-445 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-446 forEach(integralRange(M), [&](auto&& j) {\n-447 s << \"\\t(\" << i << \", \" << j << \"): \\n\" << m[i][j];\n-448 });\n-449 });\n-450 s << std::endl;\n-451 return s;\n-452 }\n-453\n-454 //make algmeta_itsteps known\n-455 template\n-456 struct algmeta_itsteps;\n-457\n-464 template //\n-MultiTypeBlockMatrix_Solver_Col: iterating over one row\n-_\b4_\b6_\b5 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl { //calculating b- A[i][j]*x[j]\n-466 public:\n-470 template \n-_\b4_\b7_\b1 static void _\bc_\ba_\bl_\bc_\b__\br_\bh_\bs(const TMatrix& A, TVector& x, TVector& v, Trhs& b,\n-const K& w) {\n-472 std::get( std::get(A) ).mmv( std::get(x), b );\n-473 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl_\b<_\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\bc_\bc_\bo_\bl_\b+_\b1_\b,_\b _\br_\be_\bm_\ba_\bi_\bn_\b__\bc_\bo_\bl_\b-_\b1_\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b__\br_\bh_\bs\n-(A,x,v,b,w); //next column element\n-474 }\n-475\n-476 };\n-477 template //MultiTypeBlockMatrix_Solver_Col\n-recursion end\n-_\b4_\b7_\b8 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl {\n-479 public:\n-480 template \n-_\b4_\b8_\b1 static void _\bc_\ba_\bl_\bc_\b__\br_\bh_\bs(const TMatrix&, TVector&, TVector&, Trhs&, const K&)\n-{}\n-482 };\n-483\n-484\n-485\n-492 template\n-_\b4_\b9_\b3 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br {\n-494 public:\n-495\n-499 template \n-_\b5_\b0_\b0 static void _\bd_\bb_\bg_\bs(const TMatrix& A, TVector& x, const TVector& b, const K&\n-w) {\n-501 TVector xold(x);\n-502 xold=x; //store old x values\n-503 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b>_\b:_\b:_\bd_\bb_\bg_\bs(A,x,x,b,w);\n-504 x *= w;\n-505 x.axpy(1-w,xold); //improve x\n-506 }\n-507 template \n-_\b5_\b0_\b8 static void _\bd_\bb_\bg_\bs(const TMatrix& A, TVector& x, TVector& v, const TVector&\n-b, const K& w) {\n-509 auto rhs = std::get (b);\n-510\n-511 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl::calc_rhs\n-(A,x,v,rhs,w); // calculate right side of equation\n-512 //solve on blocklevel I-1\n-513 using M =\n-514 typename std::remove_cv<\n-515 typename std::remove_reference<\n-516 decltype(std::get( std::get(A)))\n-517 >::type\n-518 >::type;\n-519 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bg_\bs(std::get( std::get(A)), std::\n-get(x),rhs,w);\n-520 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b+_\b1_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b-_\b1_\b>_\b:_\b:_\bd_\bb_\bg_\bs(A,x,v,b,w); //next\n-row\n-521 }\n-522\n-523\n-524\n-528 template \n-_\b5_\b2_\b9 static void _\bb_\bs_\bo_\br_\bf(const TMatrix& A, TVector& x, const TVector& b, const K&\n-w) {\n-530 TVector v;\n-531 v=x; //use latest x values in right side calculation\n-532 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(A,x,v,b,w);\n-533\n-534 }\n-535 template //recursion over\n-all matrix rows (A)\n-_\b5_\b3_\b6 static void _\bb_\bs_\bo_\br_\bf(const TMatrix& A, TVector& x, TVector& v, const TVector&\n-b, const K& w) {\n-537 auto rhs = std::get (b);\n-538\n-539 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl::calc_rhs\n-(A,x,v,rhs,w); // calculate right side of equation\n-540 //solve on blocklevel I-1\n-541 using M =\n-542 typename std::remove_cv<\n-543 typename std::remove_reference<\n-544 decltype(std::get( std::get(A)))\n-545 >::type\n-546 >::type;\n-547 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bM_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(std::get( std::get(A)), std::\n-get(v),rhs,w);\n-548 std::get(x).axpy(w,std::get(v));\n-549 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b+_\b1_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b-_\b1_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf(A,x,v,b,w); //\n-next row\n-550 }\n-551\n-555 template \n-_\b5_\b5_\b6 static void _\bb_\bs_\bo_\br_\bb(const TMatrix& A, TVector& x, const TVector& b, const K&\n-w) {\n-557 TVector v;\n-558 v=x; //use latest x values in right side calculation\n-559 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(A,x,v,b,w);\n-560\n-561 }\n-562 template //recursion over\n-all matrix rows (A)\n-_\b5_\b6_\b3 static void _\bb_\bs_\bo_\br_\bb(const TMatrix& A, TVector& x, TVector& v, const TVector&\n-b, const K& w) {\n-564 auto rhs = std::get (b);\n-565\n-566 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl::calc_rhs\n-(A,x,v,rhs,w); // calculate right side of equation\n-567 //solve on blocklevel I-1\n-568 using M =\n-569 typename std::remove_cv<\n-570 typename std::remove_reference<\n-571 decltype(std::get( std::get(A)))\n-572 >::type\n-573 >::type;\n-574 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bM_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(std::get( std::get(A)), std::\n-get(v),rhs,w);\n-575 std::get(x).axpy(w,std::get(v));\n-576 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b-_\b1_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b-_\b1_\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb(A,x,v,b,w); //\n-next row\n-577 }\n-578\n-579\n-583 template \n-_\b5_\b8_\b4 static void _\bd_\bb_\bj_\ba_\bc(const TMatrix& A, TVector& x, const TVector& b, const K&\n-w) {\n-585 TVector v(x);\n-586 v=0; //calc new x in v\n-587 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(A,x,v,b,w);\n-588 x.axpy(w,v); //improve x\n-589 }\n-590 template \n-_\b5_\b9_\b1 static void _\bd_\bb_\bj_\ba_\bc(const TMatrix& A, TVector& x, TVector& v, const TVector&\n-b, const K& w) {\n-592 auto rhs = std::get (b);\n-593\n-594 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl::calc_rhs\n-(A,x,v,rhs,w); // calculate right side of equation\n-595 //solve on blocklevel I-1\n-596 using M =\n-597 typename std::remove_cv<\n-598 typename std::remove_reference<\n-599 decltype(std::get( std::get(A)))\n-600 >::type\n-601 >::type;\n-602 _\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b<_\bI_\b-_\b1_\b,_\bM_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(std::get( std::get(A)), std::\n-get(v),rhs,w);\n-603 _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\b,_\bc_\br_\bo_\bw_\b+_\b1_\b,_\br_\be_\bm_\ba_\bi_\bn_\b__\br_\bo_\bw_\b-_\b1_\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc(A,x,v,b,w); //\n-next row\n-604 }\n-605\n-606\n-607\n-608\n-609 };\n-610 template //recursion end for remain_row = 0\n-_\b6_\b1_\b1 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br {\n-612 public:\n-613 template \n-_\b6_\b1_\b4 static void _\bd_\bb_\bg_\bs(const TMatrix&, TVector&, TVector&,\n-615 const TVector&, const K&) {}\n-616\n-617 template \n-_\b6_\b1_\b8 static void _\bb_\bs_\bo_\br_\bf(const TMatrix&, TVector&, TVector&,\n-619 const TVector&, const K&) {}\n-620\n-621 template \n-_\b6_\b2_\b2 static void _\bb_\bs_\bo_\br_\bb(const TMatrix&, TVector&, TVector&,\n-623 const TVector&, const K&) {}\n-624\n-625 template \n-_\b6_\b2_\b6 static void _\bd_\bb_\bj_\ba_\bc(const TMatrix&, TVector&, TVector&,\n-627 const TVector&, const K&) {}\n-628 };\n-629\n-630} // end namespace Dune\n-631\n-632namespace _\bs_\bt_\bd\n-633{\n-638 template \n-_\b6_\b3_\b9 struct tuple_element >\n-640 {\n-_\b6_\b4_\b1 using _\bt_\by_\bp_\be = typename std::tuple_element >::type;\n-642 };\n-643\n-648 template \n-_\b6_\b4_\b9 struct tuple_size<_\bD_\bu_\bn_\be::MultiTypeBlockMatrix >\n-650 : std::integral_constant\n-651 {};\n-652}\n-653#endif\n-_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\n-Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n-generic way.\n-_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bR_\bo_\bw_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename MultiTypeBlockMatrix< Rows... >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:429\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bt_\by_\bp_\be\n-MultiTypeBlockMatrix< FirstRow, Args... > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n-static void dbjac(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:584\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n-real_type infinity_norm_real() const\n-Bastardized version of the infinity-norm / row-sum norm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:402\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n-MultiTypeBlockMatrix & operator+=(const MultiTypeBlockMatrix &b)\n-Add the entries of another matrix to this one.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:177\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n-void mv(const X &x, Y &y) const\n-y = A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:205\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bt_\bv\n-void mmtv(const X &x, Y &y) const\n-y -= A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:285\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bh_\bv\n-void mmhv(const X &x, Y &y) const\n-y -= A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:330\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-Std::detected_t< std::common_type_t, typename FieldTraits< FirstRow >::\n-real_type, typename FieldTraits< Args >::real_type... > real_type\n-The type used for real values.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\b0_\b _\b>_\b:_\b:_\bd_\bb_\bg_\bs\n-static void dbgs(const TMatrix &, TVector &, TVector &, const TVector &, const\n-K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:614\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bb_\bg_\bs\n-static void dbgs(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:500\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bb_\bs_\bo_\br_\bb\n-static void bsorb(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:556\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bh_\bv\n-void usmhv(const field_type &alpha, const X &x, Y &y) const\n-y += alpha A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:345\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bv\n-void usmv(const AlphaType &alpha, const X &x, Y &y) const\n-y += alpha A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:245\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n-MultiTypeBlockMatrix & operator/=(const field_type &k)\n-vector space division by scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:161\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n-real_type infinity_norm() const\n-Bastardized version of the infinity-norm / row-sum norm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:383\n-_\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-typename std::tuple_element< i, std::tuple< Args... > >::type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:641\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bb_\bg_\bs\n-static void dbgs(const TMatrix &A, TVector &x, TVector &v, const TVector &b,\n-const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:508\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bb_\bs_\bo_\br_\bf\n-static void bsorf(const TMatrix &A, TVector &x, TVector &v, const TVector &b,\n-const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:536\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bh_\bv\n-void umhv(const X &x, Y &y) const\n-y += A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:315\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-static constexpr size_type N()\n-Return the number of matrix rows.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bt_\bv\n-void usmtv(const field_type &alpha, const X &x, Y &y) const\n-y += alpha A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:300\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-void operator=(const T &newval)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\bc_\bc_\bo_\bl_\b,_\b _\b0_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b__\br_\bh_\bs\n-static void calc_rhs(const TMatrix &, TVector &, TVector &, Trhs &, const K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:481\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bv\n-void umv(const X &x, Y &y) const\n-y += A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:215\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl_\b:_\b:_\bc_\ba_\bl_\bc_\b__\br_\bh_\bs\n-static void calc_rhs(const TMatrix &A, TVector &x, TVector &v, Trhs &b, const K\n-&w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:471\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bb_\bs_\bo_\br_\bf\n-static void bsorf(const TMatrix &A, TVector &x, const TVector &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:529\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\b0_\b _\b>_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n-static void dbjac(const TMatrix &, TVector &, TVector &, const TVector &, const\n-K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:626\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-std::size_t size_type\n-Type used for sizes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:59\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2\n-real_type frobenius_norm2() const\n-square of frobenius norm, need for block recursion\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:361\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm\n-real_type frobenius_norm() const\n-frobenius norm: sqrt(sum over squared values of entries)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:377\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\b0_\b _\b>_\b:_\b:_\bb_\bs_\bo_\br_\bb\n-static void bsorb(const TMatrix &, TVector &, TVector &, const TVector &, const\n-K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:622\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n-MultiTypeBlockMatrix & operator-=(const MultiTypeBlockMatrix &b)\n-Subtract the entries of another matrix from this one.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:192\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bR_\bo_\bw_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-typename MultiTypeBlockMatrix< Rows... >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:430\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-auto operator[](const std::integral_constant< size_type, index > indexVariable)\n--> decltype(std::get< index >(*this))\n-Random-access operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n-static void dbjac(const TMatrix &A, TVector &x, TVector &v, const TVector &b,\n-const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:591\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bI_\b,_\b _\bc_\br_\bo_\bw_\b,_\b _\b0_\b _\b>_\b:_\b:_\bb_\bs_\bo_\br_\bf\n-static void bsorf(const TMatrix &, TVector &, TVector &, const TVector &, const\n-K &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:618\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bt_\bv\n-void mtv(const X &x, Y &y) const\n-y = A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:260\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n-static constexpr size_type M()\n-Return the number of matrix columns.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:90\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bv\n-void mmv(const X &x, Y &y) const\n-y -= A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Std::detected_t< std::common_type_t, typename FieldTraits< FirstRow >::\n-field_type, typename FieldTraits< Args >::field_type... > field_type\n-The type used for scalars.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:67\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bt_\bv\n-void umtv(const X &x, Y &y) const\n-y += A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:270\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bb_\bs_\bo_\br_\bb\n-static void bsorb(const TMatrix &A, TVector &x, TVector &v, const TVector &b,\n-const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:563\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n-MultiTypeBlockMatrix & operator*=(const field_type &k)\n-vector space multiplication with scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:150\n+312 template\n+_\b3_\b1_\b3 class _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n+314 : public ISTL::Impl::BCCSMatrixInitializer, int>\n+315 {\n+316 template\n+_\b3_\b1_\b7 friend class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n+318 public:\n+_\b3_\b1_\b9 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b3_\b2_\b0 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx;\n+321\n+_\b3_\b2_\b2 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br(_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx& lum) : ISTL::Impl::\n+BCCSMatrixInitializer<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx, int>(lum)\n+323 ,slumat(&lum)\n+324 {}\n+325\n+_\b3_\b2_\b6 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br() : ISTL::Impl::\n+BCCSMatrixInitializer<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx, int>()\n+327 {}\n+328\n+_\b3_\b2_\b9 virtual void _\bc_\br_\be_\ba_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx() const\n+330 {\n+331 ISTL::Impl::BCCSMatrixInitializer, int>::createMatrix();\n+332 _\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>\n+333_\b _\b:_\b:_\bc_\br_\be_\ba_\bt_\be(&slumat->A, slumat->N_, slumat->M_, slumat->colstart[this->cols],\n+334 slumat->values,slumat->rowindex, slumat->colstart, SLU_NC,\n+335 static_cast(_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bt_\by_\bp_\be),\n+SLU_GE);\n+336 }\n+337 private:\n+338 _\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx* slumat;\n+339 };\n+340}\n+341#endif // HAVE_SUPERLU\n+342#endif\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n+_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh\n+_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+This file implements a vector space as a tensor product of a given vector\n+space. The number of compon...\n+_\bs_\bu_\bp_\be_\br_\bl_\bu_\bf_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs_\b._\bh_\bh\n+_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n _\bs_\bt_\bd\n STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)\n-Send BlockVector to an output stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:583\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx\n-A Matrix class to support different block types.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bb_\bs_\bo_\br_\bb\n-static void bsorb(const M &A, X &x, const Y &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:461\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bb_\bs_\bo_\br_\bf\n-static void bsorf(const M &A, X &x, const Y &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:418\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bd_\bb_\bj_\ba_\bc\n-static void dbjac(const M &A, X &x, const Y &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:504\n-_\bD_\bu_\bn_\be_\b:_\b:_\ba_\bl_\bg_\bm_\be_\bt_\ba_\b__\bi_\bt_\bs_\bt_\be_\bp_\bs_\b:_\b:_\bd_\bb_\bg_\bs\n-static void dbgs(const M &A, X &x, const Y &b, const K &w)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn gsetc.hh:378\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br\n-solver for MultiTypeBlockVector & MultiTypeBlockMatrix types\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:493\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b__\bS_\bo_\bl_\bv_\be_\br_\b__\bC_\bo_\bl\n-part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:465\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+Initializer for SuperLU Matrices representing the subdomains.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:47\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static auto coldim(const M &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static auto rowdim(const M &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:214\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+The type for the index access and the size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n+Sequential overlapping Schwarz preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU\n+SuperLu Solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:271\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bC_\br_\be_\ba_\bt_\be_\bS_\bp_\ba_\br_\bs_\be_\bC_\bh_\bo_\bo_\bs_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:26\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bP_\br_\bi_\bn_\bt_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\ba_\bs_\be_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b:_\b:_\bt_\by_\bp_\be\n+static const Dtype_t type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:127\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be\n+double float_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:144\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be\n+float float_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be\n+double float_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bt_\bS_\bu_\bp_\be_\br_\bL_\bU_\bT_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b _\b>_\b:_\b:_\bf_\bl_\bo_\ba_\bt_\b__\bt_\by_\bp_\be\n+float float_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n+Utility class for converting an ISTL Matrix into a SuperLU Matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:175\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:179\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\br_\be_\be\n+virtual void free()\n+free allocated space.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:303\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const SuperLUMatrix<\n+BCRSMatrix< B, TA > > &mat)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:256\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+SuperLUMatrix< BCRSMatrix< B, TA > > & operator=(const BCRSMatrix< B, TA >\n+&mat)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:237\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n+SuperLUMatrix(const Matrix &mat)\n+Constructor that initializes the data.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:212\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+virtual void setMatrix(const Matrix &mat)\n+Initialize data from given matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n+SuperLUMatrix()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:215\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:206\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix< B, TA > Matrix\n+The type of the matrix to convert.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:202\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+virtual void setMatrix(const Matrix &mat, const std::set< std::size_t > &mrs)\n+Initialize data from a given set of matrix rows and columns.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:281\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\b~_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n+virtual ~SuperLUMatrix()\n+Destructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU_\bM_\ba_\bt_\br_\bi_\bx\n+Dune::SuperLUMatrix< Matrix > SuperLUMatrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:320\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix< B, A > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:319\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+SuperMatrixInitializer()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:326\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx\n+virtual void createMatrix() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:329\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bu_\bp_\be_\br_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n+SuperMatrixInitializer(SuperLUMatrix &lum)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn supermatrix.hh:322\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00155.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00155.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: superlufunctions.hh File Reference\n+dune-istl: graph.hh File Reference\n \n \n \n \n \n \n \n@@ -65,49 +65,100 @@\n
    \n
    \n
    \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n
    \n-Macros
    \n-
    superlufunctions.hh File Reference
    \n+Classes |\n+Namespaces |\n+Functions
    \n+ \n \n
    \n-
    #include <dune-istl-config.hh>
    \n-#include <supermatrix.h>
    \n-#include <slu_util.h>
    \n+\n+

    Provides classes for building the matrix graph. \n+More...

    \n+
    #include <cstddef>
    \n+#include <algorithm>
    \n+#include <vector>
    \n+#include <cassert>
    \n+#include <limits>
    \n+#include <dune/common/typetraits.hh>
    \n+#include <dune/common/iteratorfacades.hh>
    \n+#include <dune/istl/istlexception.hh>
    \n+#include <dune/common/propertymap.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n-Macros

    #define int_t   SUPERLU_INT_TYPE
     

    \n+Classes

    class  Dune::Amg::MatrixGraph< M >
     The (undirected) graph of a matrix. More...
     
    class  Dune::Amg::MatrixGraph< M >::EdgeIteratorT< C >
     Iterator over all edges starting from a vertex. More...
     
    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...
     
    \n+\n+\n+\n+\n+\n+

    \n+Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n+\n+\n+\n+\n+\n

    \n+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.
     
    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ int_t

    \n-\n-
    \n-
    \n- \n- \n- \n- \n-
    #define int_t   SUPERLU_INT_TYPE
    \n-
    \n-\n-
    \n-
    \n-
    \n+

    Detailed Description

    \n+

    Provides classes for building the matrix graph.

    \n+
    Author
    Markus Blatt
    \n+

    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.

    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,20 +1,85 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bM_\ba_\bc_\br_\bo_\bs\n-superlufunctions.hh File Reference\n-#include \n-#include \n-#include \n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+graph.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Provides classes for building the matrix graph. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bi_\bn_\bt_\b__\bt\u00a0\u00a0\u00a0SUPERLU_INT_TYPE\n+C\bCl\bla\bas\bss\bse\bes\bs\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\b _\bM_\b _\b>\n+\u00a0 The (undirected) graph of a matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0i\bin\bnt\bt_\b_t\bt *\b**\b**\b**\b**\b*\n-#define int_t\u00a0\u00a0\u00a0SUPERLU_INT_TYPE\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\b _\bM_\b _\b>_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\b _\bC_\b _\b>\n+\u00a0 Iterator over all edges starting from a vertex. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\b _\bM_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\b _\bC_\b _\b>\n+\u00a0 The vertex iterator type of the graph. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bT_\b _\b>\n+\u00a0 A subgraph of a graph. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bT_\b _\b>_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+\u00a0 An index map for mapping the edges to indices. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bT_\b _\b>_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+\u00a0 The edge iterator of the graph. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bT_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+\u00a0 The vertex iterator of the graph. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bV_\bP_\b,_\b _\bV_\bM_\b _\b>\n+\u00a0 Attaches properties to the vertices of a graph. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bV_\bP_\b,_\b _\bV_\bM_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\b _\bC_\b _\b>\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bV_\bP_\b,_\b _\bE_\bP_\b,_\b _\bV_\bM_\b,_\b _\bE_\bM_\b _\b>\n+\u00a0 Attaches properties to the edges and vertices of a graph. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bV_\bP_\b,_\b _\bE_\bP_\b,_\b _\bV_\bM_\b,_\b _\bE_\bM_\b _\b>_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\b _\bC_\b _\b>\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bV_\bP_\b,_\b _\bE_\bP_\b,_\b _\bV_\bM_\b,_\b _\bE_\bM_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\b _\bC_\b _\b>\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bG_\b _\b>\n+\u00a0 Wrapper to access the internal edge properties of a graph via _\bo_\bp_\be_\br_\ba_\bt_\bo_\br\n+ _\b[_\b]_\b(_\b) _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bG_\b _\b>\n+\u00a0 Wrapper to access the internal vertex properties of a graph via\n+ _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b(_\b) _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n+\u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+int\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs (const G &graph, const typename G::\n+ VertexDescriptor &vertex, V &visitor)\n+\u00a0 Visit all neighbour vertices of a vertex in a graph.\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Provides classes for building the matrix graph.\n+ Author\n+ Markus Blatt\n+During the coarsening process in AMG the matrix graph together with the\n+dependencies, what connections in the graph are considered strong or weak, what\n+vertices are isolated, etc., have to build. This information will be contained\n+in the MatrixGraph class.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00155_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00155_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: superlufunctions.hh Source File\n+dune-istl: graph.hh Source File\n \n \n \n \n \n \n \n@@ -70,142 +70,1825 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    superlufunctions.hh
    \n+
    graph.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_SUPERLUFUNCTIONS_HH
    \n-
    6#define DUNE_ISTL_SUPERLUFUNCTIONS_HH
    \n-
    7#if HAVE_SUPERLU
    \n-
    8
    \n-
    9#include <dune-istl-config.hh> // SUPERLU_INT_TYPE
    \n-
    10
    \n-
    11#define int_t SUPERLU_INT_TYPE
    \n-
    12#include <supermatrix.h>
    \n-
    13#include <slu_util.h>
    \n-
    14#undef int_t
    \n-
    15
    \n-
    16#if __has_include("slu_sdefs.h")
    \n-
    17extern "C" {
    \n-
    18 extern void
    \n-
    19 sgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
    \n-
    20 char *, float *, float *, SuperMatrix *, SuperMatrix *,
    \n-
    21 void *, int, SuperMatrix *, SuperMatrix *,
    \n-
    22 float *, float *, float *, float *,
    \n-
    23 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
    \n-
    24
    \n-
    25 extern void
    \n-
    26 sCreate_Dense_Matrix(SuperMatrix *, int, int, float *, int,
    \n-
    27 Stype_t, Dtype_t, Mtype_t);
    \n-
    28 extern void
    \n-
    29 sCreate_CompCol_Matrix(SuperMatrix *, int, int, int, float *,
    \n-
    30 int *, int *, Stype_t, Dtype_t, Mtype_t);
    \n-
    31 extern int sQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
    \n-
    32
    \n-
    33 extern void sPrint_CompCol_Matrix(char *, SuperMatrix *);
    \n-
    34}
    \n-
    35#endif
    \n-
    36
    \n-
    37#if __has_include("slu_ddefs.h")
    \n-
    38extern "C" {
    \n-
    39 extern void
    \n-
    40 dgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
    \n-
    41 char *, double *, double *, SuperMatrix *, SuperMatrix *,
    \n-
    42 void *, int, SuperMatrix *, SuperMatrix *,
    \n-
    43 double *, double *, double *, double *,
    \n-
    44 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
    \n-
    45
    \n-
    46 extern void
    \n-
    47 dCreate_CompCol_Matrix(SuperMatrix *, int, int, int, double *,
    \n-
    48 int *, int *, Stype_t, Dtype_t, Mtype_t);
    \n-
    49
    \n-
    50 extern void
    \n-
    51 dCreate_Dense_Matrix(SuperMatrix *, int, int, double *, int,
    \n-
    52 Stype_t, Dtype_t, Mtype_t);
    \n-
    53
    \n-
    54 extern int dQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
    \n-
    55
    \n-
    56 extern void dPrint_CompCol_Matrix(char *, SuperMatrix *);
    \n-
    57}
    \n-
    58#endif
    \n-
    59
    \n-
    60#if __has_include("slu_cdefs.h")
    \n-
    61#ifndef SUPERLU_TYPEDEF_COMPLEX
    \n-
    62// Per default SuperLU >= 7.0.0. does not provide
    \n-
    63// a type complex anymore. By setting SUPERLU_TYPEDEF_COMPLEX
    \n-
    64// we tell SuperLU to define complex to be the same as the
    \n-
    65// new type singlecomplex
    \n-
    66#define SUPERLU_TYPEDEF_COMPLEX
    \n-
    67#endif
    \n-
    68#include "slu_scomplex.h"
    \n-
    69
    \n-
    70extern "C" {
    \n-
    71 extern void
    \n-
    72 cgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
    \n-
    73 char *, float *, float *, SuperMatrix *, SuperMatrix *,
    \n-
    74 void *, int, SuperMatrix *, SuperMatrix *,
    \n-
    75 float *, float *, float *, float *,
    \n-
    76 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
    \n-
    77
    \n-
    78
    \n-
    79 extern void
    \n-
    80 cCreate_Dense_Matrix(SuperMatrix *, int, int, ::complex *, int,
    \n-
    81 Stype_t, Dtype_t, Mtype_t);
    \n-
    82
    \n-
    83
    \n-
    84 extern void
    \n-
    85 cCreate_CompCol_Matrix(SuperMatrix *, int, int, int, ::complex *,
    \n-
    86 int *, int *, Stype_t, Dtype_t, Mtype_t);
    \n-
    87
    \n-
    88 extern int cQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
    \n+
    5#ifndef DUNE_AMG_GRAPH_HH
    \n+
    6#define DUNE_AMG_GRAPH_HH
    \n+
    7
    \n+
    8#include <cstddef>
    \n+
    9#include <algorithm>
    \n+
    10#include <vector>
    \n+
    11#include <cassert>
    \n+
    12#include <limits>
    \n+
    13#include <dune/common/typetraits.hh>
    \n+
    14#include <dune/common/iteratorfacades.hh>
    \n+\n+
    16#include <dune/common/propertymap.hh>
    \n+
    17
    \n+
    18namespace Dune
    \n+
    19{
    \n+
    20 namespace Amg
    \n+
    21 {
    \n+
    49 template<class M>
    \n+
    \n+\n+
    51 {
    \n+
    52 public:
    \n+
    56 typedef M Matrix;
    \n+
    57
    \n+
    61 typedef typename std::remove_const<M>::type MutableMatrix;
    \n+
    62
    \n+
    66 typedef typename M::block_type Weight;
    \n+
    67
    \n+
    73 typedef typename M::size_type VertexDescriptor;
    \n+
    74
    \n+
    80 typedef std::ptrdiff_t EdgeDescriptor;
    \n+
    81
    \n+
    82 enum {
    \n+
    83 /*
    \n+
    84 * @brief Whether Matrix is mutable.
    \n+
    85 */
    \n+
    86 mutableMatrix = std::is_same<M, typename std::remove_const<M>::type>::value
    \n+
    87 };
    \n+
    88
    \n
    89
    \n-
    90 extern void cPrint_CompCol_Matrix(char *, SuperMatrix *);
    \n-
    91}
    \n-
    92#endif
    \n-
    93
    \n-
    94#if __has_include("slu_zdefs.h")
    \n-
    95#include "slu_dcomplex.h"
    \n-
    96extern "C" {
    \n-
    97 extern void
    \n-
    98 zgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,
    \n-
    99 char *, double *, double *, SuperMatrix *, SuperMatrix *,
    \n-
    100 void *, int, SuperMatrix *, SuperMatrix *,
    \n-
    101 double *, double *, double *, double *,
    \n-
    102 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);
    \n-
    103
    \n-
    104
    \n-
    105 extern void
    \n-
    106 zCreate_CompCol_Matrix(SuperMatrix *, int, int, int, doublecomplex *,
    \n-
    107 int *, int *, Stype_t, Dtype_t, Mtype_t);
    \n-
    108
    \n-
    109 extern void
    \n-
    110 zCreate_Dense_Matrix(SuperMatrix *, int, int, doublecomplex *, int,
    \n-
    111 Stype_t, Dtype_t, Mtype_t);
    \n-
    112
    \n-
    113 extern int zQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);
    \n+
    93 template<class C>
    \n+
    \n+\n+
    95 {
    \n+
    96
    \n+
    97 public:
    \n+
    101 typedef typename std::remove_const<C>::type MutableContainer;
    \n+
    105 typedef const typename std::remove_const<C>::type ConstContainer;
    \n+
    106
    \n+
    107 friend class EdgeIteratorT<MutableContainer>;
    \n+
    108 friend class EdgeIteratorT<ConstContainer>;
    \n+
    109
    \n+
    110 enum {
    \n+
    112 isMutable = std::is_same<C, MutableContainer>::value
    \n+
    113 };
    \n
    114
    \n-
    115 extern void zPrint_CompCol_Matrix(char *, SuperMatrix *);
    \n-
    116}
    \n-
    117#endif
    \n-
    118
    \n-
    119
    \n-
    120#endif
    \n-
    121#endif
    \n+
    118 typedef typename std::conditional<isMutable && C::mutableMatrix,typename Matrix::row_type::Iterator,
    \n+
    119 typename Matrix::row_type::ConstIterator>::type
    \n+\n+
    121
    \n+
    125 typedef typename std::conditional<isMutable && C::mutableMatrix,typename M::block_type,
    \n+
    126 const typename M::block_type>::type
    \n+\n+
    128
    \n+\n+
    137 const ColIterator& end, const EdgeDescriptor& edge);
    \n+
    138
    \n+\n+
    146
    \n+
    151 template<class C1>
    \n+\n+
    153
    \n+
    154 typedef typename std::conditional<std::is_same<C, typename std::remove_const<C>::type>::value && C::mutableMatrix,
    \n+
    155 typename M::block_type, const typename M::block_type>::type
    \n+\n+
    157
    \n+\n+
    162
    \n+\n+
    165
    \n+
    167 bool operator!=(const EdgeIteratorT<typename std::remove_const<C>::type>& other) const;
    \n+
    168
    \n+
    170 bool operator!=(const EdgeIteratorT<const typename std::remove_const<C>::type>& other) const;
    \n+
    171
    \n+
    173 bool operator==(const EdgeIteratorT<typename std::remove_const<C>::type>& other) const;
    \n+
    174
    \n+
    176 bool operator==(const EdgeIteratorT<const typename std::remove_const<C>::type>& other) const;
    \n+
    177
    \n+\n+
    180
    \n+\n+
    183
    \n+
    185 const EdgeDescriptor& operator*() const;
    \n+
    186
    \n+\n+
    189
    \n+
    190 private:
    \n+
    192 VertexDescriptor source_;
    \n+
    194 ColIterator block_;
    \n+
    195 /***
    \n+
    196 * @brief The column iterator positioned at the end of the row
    \n+
    197 * of vertex source_
    \n+
    198 */
    \n+
    199 ColIterator blockEnd_;
    \n+
    201 EdgeDescriptor edge_;
    \n+
    202 };
    \n+
    \n+
    203
    \n+
    207 template<class C>
    \n+
    \n+\n+
    209 {
    \n+
    210 public:
    \n+
    214 typedef typename std::remove_const<C>::type MutableContainer;
    \n+
    218 typedef const typename std::remove_const<C>::type ConstContainer;
    \n+
    219
    \n+
    220 friend class VertexIteratorT<MutableContainer>;
    \n+
    221 friend class VertexIteratorT<ConstContainer>;
    \n+
    222
    \n+
    223 enum {
    \n+
    225 isMutable = std::is_same<C, MutableContainer>::value
    \n+
    226 };
    \n+
    227
    \n+
    233 explicit VertexIteratorT(C* graph, const VertexDescriptor& current);
    \n+
    234
    \n+
    242 explicit VertexIteratorT(const VertexDescriptor& current);
    \n+
    243
    \n+\n+
    245
    \n+\n+
    251
    \n+\n+
    254
    \n+\n+
    257
    \n+\n+
    260
    \n+\n+
    263
    \n+
    264 typedef typename std::conditional<std::is_same<C, typename std::remove_const<C>::type>::value && C::mutableMatrix,
    \n+
    265 typename M::block_type, const typename M::block_type>::type
    \n+\n+\n+
    269
    \n+\n+
    275
    \n+\n+
    282
    \n+\n+
    289
    \n+
    290 private:
    \n+
    291 C* graph_;
    \n+
    292 VertexDescriptor current_;
    \n+
    293 };
    \n+
    \n+
    294
    \n+\n+
    299
    \n+\n+
    304
    \n+\n+
    309
    \n+\n+
    314
    \n+\n+
    320
    \n+\n+
    325
    \n+\n+
    331
    \n+\n+
    337
    \n+\n+
    343
    \n+\n+
    349
    \n+\n+
    357
    \n+\n+
    365
    \n+
    366
    \n+\n+
    374
    \n+\n+
    382
    \n+\n+
    388
    \n+
    393 const Matrix& matrix() const;
    \n+
    394
    \n+
    398 std::size_t noVertices() const;
    \n+
    399
    \n+\n+
    407
    \n+
    411 std::size_t noEdges() const;
    \n+
    412
    \n+\n+
    420 const VertexDescriptor& target) const;
    \n+
    421
    \n+
    422 private:
    \n+
    424 Matrix& matrix_;
    \n+
    426 EdgeDescriptor* start_;
    \n+
    428 MatrixGraph(const MatrixGraph&);
    \n+
    429
    \n+
    430 };
    \n+
    \n+
    431
    \n+
    441 template<class G, class T>
    \n+
    \n+\n+
    443 {
    \n+
    444 public:
    \n+
    448 typedef G Graph;
    \n+
    449
    \n+
    454 typedef T Excluded;
    \n+
    455
    \n+
    459 typedef typename Graph::VertexDescriptor VertexDescriptor;
    \n+
    460
    \n+\n+
    462
    \n+
    \n+\n+
    470 {
    \n+
    471 public:
    \n+
    472 typedef ReadablePropertyMapTag Category;
    \n+
    473
    \n+
    \n+
    474 EdgeIndexMap(const EdgeDescriptor& firstEdge)
    \n+
    475 : firstEdge_(firstEdge)
    \n+
    476 {}
    \n+
    \n+
    477
    \n+
    \n+\n+
    480 : firstEdge_(emap.firstEdge_)
    \n+
    481 {}
    \n+
    \n+
    482
    \n+
    \n+
    483 std::size_t operator[](const EdgeDescriptor& edge) const
    \n+
    484 {
    \n+
    485 return edge-firstEdge_;
    \n+
    486 }
    \n+
    \n+
    487 private:
    \n+
    489 EdgeDescriptor firstEdge_;
    \n+\n+
    492 {}
    \n+
    493 };
    \n+
    \n+
    494
    \n+\n+
    500
    \n+
    \n+
    504 class EdgeIterator : public RandomAccessIteratorFacade<EdgeIterator,const EdgeDescriptor>
    \n+
    505 {
    \n+
    506 public:
    \n+
    512 explicit EdgeIterator(const VertexDescriptor& source, const EdgeDescriptor& edge);
    \n+
    513
    \n+
    521 explicit EdgeIterator(const EdgeDescriptor& edge);
    \n+
    522
    \n+
    524 bool equals(const EdgeIterator& other) const;
    \n+
    525
    \n+\n+
    528
    \n+\n+
    531
    \n+
    532 EdgeIterator& advance(std::ptrdiff_t n);
    \n+
    533
    \n+\n+
    536
    \n+
    538 const VertexDescriptor& target() const;
    \n+
    539
    \n+
    541 const VertexDescriptor& source() const;
    \n+
    542
    \n+
    543 std::ptrdiff_t distanceTo(const EdgeIterator& other) const;
    \n+
    544
    \n+
    545 private:
    \n+
    547 VertexDescriptor source_;
    \n+
    552 EdgeDescriptor edge_;
    \n+
    553 };
    \n+
    \n+
    554
    \n+
    \n+\n+
    559 : public ForwardIteratorFacade<VertexIterator,const VertexDescriptor>
    \n+
    560 {
    \n+
    561 public:
    \n+
    568 explicit VertexIterator(const SubGraph<G,T>* graph, const VertexDescriptor& current,
    \n+
    569 const VertexDescriptor& end);
    \n+
    570
    \n+
    571
    \n+
    578 explicit VertexIterator(const VertexDescriptor& current);
    \n+
    579
    \n+\n+
    582
    \n+
    584 bool equals(const VertexIterator& other) const;
    \n+
    585
    \n+\n+
    591
    \n+\n+
    598
    \n+\n+
    605
    \n+
    606 private:
    \n+
    608 const SubGraph<Graph,T>* graph_;
    \n+
    610 VertexDescriptor current_;
    \n+
    612 VertexDescriptor end_;
    \n+
    613 };
    \n+
    \n+
    614
    \n+\n+
    619
    \n+\n+
    624
    \n+\n+
    630
    \n+\n+
    636
    \n+\n+
    644
    \n+\n+
    652
    \n+
    656 std::size_t noVertices() const;
    \n+
    657
    \n+\n+
    665
    \n+
    669 std::size_t noEdges() const;
    \n+\n+
    677 const VertexDescriptor& target) const;
    \n+
    685 SubGraph(const Graph& graph, const T& excluded);
    \n+
    686
    \n+\n+
    691
    \n+
    692 private:
    \n+
    694 const T& excluded_;
    \n+
    696 std::size_t noVertices_;
    \n+
    698 VertexDescriptor endVertex_;
    \n+
    700 int noEdges_;
    \n+
    705 VertexDescriptor maxVertex_;
    \n+
    707 VertexDescriptor* edges_;
    \n+
    709 std::ptrdiff_t* start_;
    \n+
    711 std::ptrdiff_t* end_;
    \n+
    713 SubGraph(const SubGraph&)
    \n+
    714 {}
    \n+
    715 };
    \n+
    \n+
    716
    \n+
    717
    \n+
    721 template<class G, class VP, class VM=IdentityMap>
    \n+
    \n+\n+
    723 {
    \n+
    724 public:
    \n+
    728 typedef G Graph;
    \n+
    729
    \n+
    733 typedef typename Graph::VertexDescriptor VertexDescriptor;
    \n+
    734
    \n+
    738 typedef typename Graph::EdgeDescriptor EdgeDescriptor;
    \n+
    739
    \n+\n+
    744
    \n+
    756 typedef VM VertexMap;
    \n+
    757
    \n+
    761 typedef typename Graph::EdgeIterator EdgeIterator;
    \n+
    762
    \n+
    766 typedef typename Graph::ConstEdgeIterator ConstEdgeIterator;
    \n+
    767
    \n+\n+
    774
    \n+\n+
    781
    \n+\n+
    788
    \n+\n+
    795
    \n+
    796
    \n+
    797 template<class C>
    \n+
    \n+\n+
    799 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n+
    800 C>::value,
    \n+
    801 typename Graph::VertexIterator,
    \n+
    802 typename Graph::ConstVertexIterator>::type
    \n+
    803 {
    \n+
    804 friend class VertexIteratorT<const typename std::remove_const<C>::type>;
    \n+
    805 friend class VertexIteratorT<typename std::remove_const<C>::type>;
    \n+
    806 public:
    \n+
    810 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n+
    811 C>::value,
    \n+
    812 typename Graph::VertexIterator,
    \n+
    813 typename Graph::ConstVertexIterator>::type
    \n+\n+
    815
    \n+
    819 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n+
    820 C>::value,
    \n+
    821 typename Graph::EdgeIterator,
    \n+
    822 typename Graph::ConstEdgeIterator>::type
    \n+\n+
    824
    \n+
    830 explicit VertexIteratorT(const Father& iter,
    \n+
    831 C* graph);
    \n+
    832
    \n+
    833
    \n+
    841 explicit VertexIteratorT(const Father& iter);
    \n+
    842
    \n+
    847 template<class C1>
    \n+
    848 VertexIteratorT(const VertexIteratorT<C1>& other);
    \n+
    849
    \n+
    853 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
    \n+
    854 VertexProperties&,
    \n+
    855 const VertexProperties&>::type
    \n+
    856 properties() const;
    \n+
    857
    \n+\n+
    864
    \n+\n+
    871
    \n+
    872 private:
    \n+
    876 C* graph_;
    \n+
    877 };
    \n+
    \n+
    878
    \n+
    882 typedef VertexIteratorT<VertexPropertiesGraph<Graph,
    \n+
    883 VertexProperties,VM> > VertexIterator;
    \n+
    884
    \n+
    888 typedef VertexIteratorT<const VertexPropertiesGraph<Graph,
    \n+
    889 VertexProperties,VM> > ConstVertexIterator;
    \n+
    890
    \n+\n+
    896
    \n+\n+
    902
    \n+\n+
    908
    \n+\n+
    914
    \n+
    920 VertexProperties& getVertexProperties(const VertexDescriptor& vertex);
    \n+
    921
    \n+
    927 const VertexProperties& getVertexProperties(const VertexDescriptor& vertex) const;
    \n+
    928
    \n+
    933 const Graph& graph() const;
    \n+
    934
    \n+
    938 std::size_t noVertices() const;
    \n+
    939
    \n+
    943 std::size_t noEdges() const;
    \n+
    944
    \n+\n+
    952
    \n+
    958 VertexPropertiesGraph(Graph& graph, const VertexMap vmap=VertexMap());
    \n+
    959
    \n+
    960 private:
    \n+
    961 VertexPropertiesGraph(const VertexPropertiesGraph&)
    \n+
    962 {}
    \n+
    963
    \n+
    965 Graph& graph_;
    \n+
    967 VertexMap vmap_;
    \n+
    969 std::vector<VertexProperties> vertexProperties_;
    \n+
    970
    \n+
    971 };
    \n+
    \n+
    972
    \n+
    976 template<class G, class VP, class EP, class VM=IdentityMap, class EM=IdentityMap>
    \n+
    \n+\n+
    978 {
    \n+
    979 public:
    \n+
    983 typedef G Graph;
    \n+
    984
    \n+
    988 typedef typename Graph::VertexDescriptor VertexDescriptor;
    \n+
    989
    \n+
    993 typedef typename Graph::EdgeDescriptor EdgeDescriptor;
    \n+
    994
    \n+\n+
    999
    \n+
    1011 typedef VM VertexMap;
    \n+
    1012
    \n+
    1016 typedef EP EdgeProperties;
    \n+
    1017
    \n+
    1018
    \n+
    1030 typedef EM EdgeMap;
    \n+
    1031
    \n+
    1032 template<class C>
    \n+
    \n+\n+
    1034 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n+
    1035 C>::value,
    \n+
    1036 typename Graph::EdgeIterator,
    \n+
    1037 typename Graph::ConstEdgeIterator>::type
    \n+
    1038 {
    \n+
    1039
    \n+
    1040 friend class EdgeIteratorT<const typename std::remove_const<C>::type>;
    \n+
    1041 friend class EdgeIteratorT<typename std::remove_const<C>::type>;
    \n+
    1042 public:
    \n+
    1046 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n+
    1047 C>::value,
    \n+
    1048 typename Graph::EdgeIterator,
    \n+
    1049 typename Graph::ConstEdgeIterator>::type
    \n+\n+
    1051
    \n+
    1057 explicit EdgeIteratorT(const Father& iter,
    \n+
    1058 C* graph);
    \n+
    1059
    \n+
    1067 explicit EdgeIteratorT(const Father& iter);
    \n+
    1068
    \n+
    1073 template<class C1>
    \n+
    1074 EdgeIteratorT(const EdgeIteratorT<C1>& other);
    \n+
    1075
    \n+
    1079 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
    \n+
    1080 EdgeProperties&,
    \n+
    1081 const EdgeProperties&>::type
    \n+
    1082 properties() const;
    \n+
    1083
    \n+
    1084 private:
    \n+
    1088 C* graph_;
    \n+
    1089 };
    \n+
    \n+
    1090
    \n+
    1094 typedef EdgeIteratorT<PropertiesGraph<Graph,
    \n+
    1095 VertexProperties,
    \n+
    1096 EdgeProperties,VM,EM> > EdgeIterator;
    \n+
    1097
    \n+
    1101 typedef EdgeIteratorT<const PropertiesGraph<Graph,
    \n+
    1102 VertexProperties,
    \n+
    1103 EdgeProperties,VM,EM> > ConstEdgeIterator;
    \n+
    1104
    \n+
    1110 EdgeIterator beginEdges(const VertexDescriptor& source);
    \n+
    1111
    \n+
    1117 EdgeIterator endEdges(const VertexDescriptor& source);
    \n+
    1118
    \n+
    1124 ConstEdgeIterator beginEdges(const VertexDescriptor& source) const;
    \n+
    1125
    \n+
    1131 ConstEdgeIterator endEdges(const VertexDescriptor& source) const;
    \n+
    1132
    \n+
    1133
    \n+
    1134 template<class C>
    \n+
    \n+\n+
    1136 : public std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n+
    1137 C>::value,
    \n+
    1138 typename Graph::VertexIterator,
    \n+
    1139 typename Graph::ConstVertexIterator>::type
    \n+
    1140 {
    \n+
    1141 friend class VertexIteratorT<const typename std::remove_const<C>::type>;
    \n+
    1142 friend class VertexIteratorT<typename std::remove_const<C>::type>;
    \n+
    1143 public:
    \n+
    1147 typedef typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n+
    1148 C>::value,
    \n+
    1149 typename Graph::VertexIterator,
    \n+
    1150 typename Graph::ConstVertexIterator>::type
    \n+\n+
    1152
    \n+
    1158 explicit VertexIteratorT(const Father& iter,
    \n+
    1159 C* graph);
    \n+
    1160
    \n+
    1161
    \n+
    1169 explicit VertexIteratorT(const Father& iter);
    \n+
    1170
    \n+
    1175 template<class C1>
    \n+
    1176 VertexIteratorT(const VertexIteratorT<C1>& other);
    \n+
    1177
    \n+
    1181 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
    \n+
    1182 VertexProperties&,
    \n+
    1183 const VertexProperties&>::type
    \n+
    1184 properties() const;
    \n+
    1185
    \n+
    1191 EdgeIteratorT<C> begin() const;
    \n+
    1192
    \n+
    1198 EdgeIteratorT<C> end() const;
    \n+
    1199
    \n+
    1200 private:
    \n+
    1204 C* graph_;
    \n+
    1205 };
    \n+
    \n+
    1206
    \n+
    1210 typedef VertexIteratorT<PropertiesGraph<Graph,
    \n+
    1211 VertexProperties,
    \n+
    1212 EdgeProperties,VM,EM> > VertexIterator;
    \n+
    1213
    \n+
    1217 typedef VertexIteratorT<const PropertiesGraph<Graph,
    \n+
    1218 VertexProperties,
    \n+
    1219 EdgeProperties,VM,EM> > ConstVertexIterator;
    \n+
    1220
    \n+\n+
    1226
    \n+\n+
    1232
    \n+
    1237 ConstVertexIterator begin() const;
    \n+
    1238
    \n+\n+
    1244
    \n+
    1250 VertexProperties& getVertexProperties(const VertexDescriptor& vertex);
    \n+
    1251
    \n+
    1257 const VertexProperties& getVertexProperties(const VertexDescriptor& vertex) const;
    \n+
    1258
    \n+
    \n+
    1265 EdgeDescriptor findEdge(const VertexDescriptor& source,
    \n+
    1266 const VertexDescriptor& target)
    \n+
    1267 {
    \n+
    1268 return graph_.findEdge(source,target);
    \n+
    1269 }
    \n+
    \n+
    1270
    \n+\n+
    1277
    \n+
    1278
    \n+\n+
    1285
    \n+\n+
    1293 const VertexDescriptor& target);
    \n+
    1294
    \n+\n+
    1302 const VertexDescriptor& target) const;
    \n+
    1303
    \n+
    1308 const Graph& graph() const;
    \n+
    1309
    \n+
    1313 std::size_t noVertices() const;
    \n+
    1314
    \n+
    1318 std::size_t noEdges() const;
    \n+
    1319
    \n+\n+
    1327
    \n+\n+
    1335 const EdgeMap& emap=EdgeMap());
    \n+
    1336
    \n+
    1337 private:
    \n+\n+
    1339 {}
    \n+
    1340
    \n+
    1342 Graph& graph_;
    \n+
    1345 VertexMap vmap_;
    \n+
    1346 std::vector<VertexProperties> vertexProperties_;
    \n+
    1348 EdgeMap emap_;
    \n+
    1350 std::vector<EdgeProperties> edgeProperties_;
    \n+
    1351
    \n+
    1352 };
    \n+
    \n+
    1353
    \n+
    1354
    \n+
    1359 template<typename G>
    \n+
    \n+\n+
    1361 {
    \n+
    1362 public:
    \n+
    1366 typedef G Graph;
    \n+
    1370 typedef typename G::VertexProperties VertexProperties;
    \n+
    1374 typedef typename G::VertexDescriptor Vertex;
    \n+
    1375
    \n+
    \n+\n+
    1381 : graph_(g)
    \n+
    1382 {}
    \n+
    \n+
    \n+\n+
    1387 : graph_(0)
    \n+
    1388 {}
    \n+
    \n+
    1389
    \n+
    1390
    \n+
    \n+
    1395 VertexProperties& operator[](const Vertex& vertex) const
    \n+
    1396 {
    \n+
    1397 return graph_->getVertexProperties(vertex);
    \n+
    1398 }
    \n+
    \n+
    1399 private:
    \n+
    1400 Graph* graph_;
    \n+
    1401 };
    \n+
    \n+
    1402
    \n+
    1407 template<typename G>
    \n+
    \n+\n+
    1409 {
    \n+
    1410 public:
    \n+
    1414 typedef G Graph;
    \n+
    1418 typedef typename G::EdgeProperties EdgeProperties;
    \n+
    1422 typedef typename G::EdgeDescriptor Edge;
    \n+
    1423
    \n+
    \n+\n+
    1429 : graph_(g)
    \n+
    1430 {}
    \n+
    \n+
    \n+\n+
    1435 : graph_(0)
    \n+
    1436 {}
    \n+
    \n+
    1437
    \n+
    \n+
    1442 EdgeProperties& operator[](const Edge& edge) const
    \n+
    1443 {
    \n+
    1444 return graph_->getEdgeProperties(edge);
    \n+
    1445 }
    \n+
    \n+
    1446 private:
    \n+
    1447 Graph* graph_;
    \n+
    1448 };
    \n+
    \n+
    1449
    \n+
    1450
    \n+
    1461 template<class G, class V>
    \n+
    1462 int visitNeighbours(const G& graph, const typename G::VertexDescriptor& vertex,
    \n+
    1463 V& visitor);
    \n+
    1464
    \n+
    1465#ifndef DOXYGEN
    \n+
    1466
    \n+
    1467 template<class M>
    \n+\n+
    1469 : matrix_(matrix)
    \n+
    1470 {
    \n+
    1471 if(matrix_.N()!=matrix_.M())
    \n+
    1472 DUNE_THROW(ISTLError, "Matrix has to have as many columns as rows!");
    \n+
    1473
    \n+
    1474 start_ = new EdgeDescriptor[matrix_.N()+1];
    \n+
    1475
    \n+
    1476 typedef typename M::ConstIterator Iterator;
    \n+
    1477 start_[matrix_.begin().index()] = 0;
    \n+
    1478
    \n+
    1479 for(Iterator row=matrix_.begin(); row != matrix_.end(); ++row)
    \n+
    1480 start_[row.index()+1] = start_[row.index()] + row->size();
    \n+
    1481 }
    \n+
    1482
    \n+
    1483 template<class M>
    \n+
    1484 MatrixGraph<M>::~MatrixGraph()
    \n+
    1485 {
    \n+
    1486 delete[] start_;
    \n+
    1487 }
    \n+
    1488
    \n+
    1489 template<class M>
    \n+
    1490 inline std::size_t MatrixGraph<M>::noEdges() const
    \n+
    1491 {
    \n+
    1492 return start_[matrix_.N()];
    \n+
    1493 }
    \n+
    1494
    \n+
    1495 template<class M>
    \n+
    1496 inline std::size_t MatrixGraph<M>::noVertices() const
    \n+
    1497 {
    \n+
    1498 return matrix_.N();
    \n+
    1499 }
    \n+
    1500
    \n+
    1501 template<class M>
    \n+
    1502 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::maxVertex() const
    \n+
    1503 {
    \n+
    1504 return matrix_.N()-1;
    \n+
    1505 }
    \n+
    1506
    \n+
    1507 template<class M>
    \n+
    1508 typename MatrixGraph<M>::EdgeDescriptor
    \n+
    1509 MatrixGraph<M>::findEdge(const VertexDescriptor& source,
    \n+
    1510 const VertexDescriptor& target) const
    \n+
    1511 {
    \n+
    1512 typename M::ConstColIterator found =matrix_[source].find(target);
    \n+
    1513 if(found == matrix_[source].end())
    \n+
    1514 return std::numeric_limits<EdgeDescriptor>::max();
    \n+
    1515 std::size_t offset = found.offset();
    \n+
    1516 if(target>source)
    \n+
    1517 offset--;
    \n+
    1518
    \n+
    1519 assert(offset<noEdges());
    \n+
    1520
    \n+
    1521 return start_[source]+offset;
    \n+
    1522 }
    \n+
    1523
    \n+
    1524
    \n+
    1525 template<class M>
    \n+
    1526 inline M& MatrixGraph<M>::matrix()
    \n+
    1527 {
    \n+
    1528 return matrix_;
    \n+
    1529 }
    \n+
    1530
    \n+
    1531 template<class M>
    \n+
    1532 inline const M& MatrixGraph<M>::matrix() const
    \n+
    1533 {
    \n+
    1534 return matrix_;
    \n+
    1535 }
    \n+
    1536
    \n+
    1537 template<class M>
    \n+
    1538 template<class C>
    \n+
    1539 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const VertexDescriptor& source, const ColIterator& block,
    \n+
    1540 const ColIterator& end, const EdgeDescriptor& edge)
    \n+
    1541 : source_(source), block_(block), blockEnd_(end), edge_(edge)
    \n+
    1542 {
    \n+
    1543 if(block_!=blockEnd_ && block_.index() == source_) {
    \n+
    1544 // This is the edge from the diagonal to the diagonal. Skip it.
    \n+
    1545 ++block_;
    \n+
    1546 }
    \n+
    1547 }
    \n+
    1548
    \n+
    1549 template<class M>
    \n+
    1550 template<class C>
    \n+
    1551 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const ColIterator& block)
    \n+
    1552 : block_(block)
    \n+
    1553 {}
    \n+
    1554
    \n+
    1555 template<class M>
    \n+
    1556 template<class C>
    \n+
    1557 template<class C1>
    \n+
    1558 MatrixGraph<M>::EdgeIteratorT<C>::EdgeIteratorT(const EdgeIteratorT<C1>& other)
    \n+
    1559 : source_(other.source_), block_(other.block_), blockEnd_(other.blockEnd_), edge_(other.edge_)
    \n+
    1560 {}
    \n+
    1561
    \n+
    1562
    \n+
    1563 template<class M>
    \n+
    1564 template<class C>
    \n+
    1565 inline typename MatrixGraph<M>::template EdgeIteratorT<C>::WeightType&
    \n+
    1566 MatrixGraph<M>::EdgeIteratorT<C>::weight() const
    \n+
    1567 {
    \n+
    1568 return *block_;
    \n+
    1569 }
    \n+
    1570
    \n+
    1571 template<class M>
    \n+
    1572 template<class C>
    \n+
    1573 inline typename MatrixGraph<M>::template EdgeIteratorT<C>& MatrixGraph<M>::EdgeIteratorT<C>::operator++()
    \n+
    1574 {
    \n+
    1575 ++block_;
    \n+
    1576 ++edge_;
    \n+
    1577
    \n+
    1578 if(block_!=blockEnd_ && block_.index() == source_) {
    \n+
    1579 // This is the edge from the diagonal to the diagonal. Skip it.
    \n+
    1580 ++block_;
    \n+
    1581 }
    \n+
    1582
    \n+
    1583 return *this;
    \n+
    1584 }
    \n+
    1585
    \n+
    1586 template<class M>
    \n+
    1587 template<class C>
    \n+
    1588 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator!=(const typename MatrixGraph<M>::template EdgeIteratorT<typename std::remove_const<C>::type>& other) const
    \n+
    1589 {
    \n+
    1590 return block_!=other.block_;
    \n+
    1591 }
    \n+
    1592
    \n+
    1593 template<class M>
    \n+
    1594 template<class C>
    \n+
    1595 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator!=(const typename MatrixGraph<M>::template EdgeIteratorT<const typename std::remove_const<C>::type>& other) const
    \n+
    1596 {
    \n+
    1597 return block_!=other.block_;
    \n+
    1598 }
    \n+
    1599
    \n+
    1600 template<class M>
    \n+
    1601 template<class C>
    \n+
    1602 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator==(const typename MatrixGraph<M>::template EdgeIteratorT<typename std::remove_const<C>::type>& other) const
    \n+
    1603 {
    \n+
    1604 return block_==other.block_;
    \n+
    1605 }
    \n+
    1606
    \n+
    1607 template<class M>
    \n+
    1608 template<class C>
    \n+
    1609 inline bool MatrixGraph<M>::EdgeIteratorT<C>::operator==(const typename MatrixGraph<M>::template EdgeIteratorT<const typename std::remove_const<C>::type>& other) const
    \n+
    1610 {
    \n+
    1611 return block_==other.block_;
    \n+
    1612 }
    \n+
    1613
    \n+
    1614 template<class M>
    \n+
    1615 template<class C>
    \n+
    1616 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::EdgeIteratorT<C>::target() const
    \n+
    1617 {
    \n+
    1618 return block_.index();
    \n+
    1619 }
    \n+
    1620
    \n+
    1621 template<class M>
    \n+
    1622 template<class C>
    \n+
    1623 inline typename MatrixGraph<M>::VertexDescriptor MatrixGraph<M>::EdgeIteratorT<C>::source() const
    \n+
    1624 {
    \n+
    1625 return source_;
    \n+
    1626 }
    \n+
    1627
    \n+
    1628 template<class M>
    \n+
    1629 template<class C>
    \n+
    1630 inline const typename MatrixGraph<M>::EdgeDescriptor& MatrixGraph<M>::EdgeIteratorT<C>::operator*() const
    \n+
    1631 {
    \n+
    1632 return edge_;
    \n+
    1633 }
    \n+
    1634
    \n+
    1635 template<class M>
    \n+
    1636 template<class C>
    \n+
    1637 inline const typename MatrixGraph<M>::EdgeDescriptor* MatrixGraph<M>::EdgeIteratorT<C>::operator->() const
    \n+
    1638 {
    \n+
    1639 return &edge_;
    \n+
    1640 }
    \n+
    1641
    \n+
    1642 template<class M>
    \n+
    1643 template<class C>
    \n+
    1644 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(C* graph,
    \n+
    1645 const VertexDescriptor& current)
    \n+
    1646 : graph_(graph), current_(current)
    \n+
    1647 {}
    \n+
    1648
    \n+
    1649
    \n+
    1650 template<class M>
    \n+
    1651 template<class C>
    \n+
    1652 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(const VertexDescriptor& current)
    \n+
    1653 : current_(current)
    \n+
    1654 {}
    \n+
    1655
    \n+
    1656 template<class M>
    \n+
    1657 template<class C>
    \n+
    1658 MatrixGraph<M>::VertexIteratorT<C>::VertexIteratorT(const VertexIteratorT<MutableContainer>& other)
    \n+
    1659 : graph_(other.graph_), current_(other.current_)
    \n+
    1660 {}
    \n+
    1661
    \n+
    1662 template<class M>
    \n+
    1663 template<class C>
    \n+
    1664 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator!=(const VertexIteratorT<MutableContainer>& other) const
    \n+
    1665 {
    \n+
    1666 return current_ != other.current_;
    \n+
    1667 }
    \n+
    1668
    \n+
    1669 template<class M>
    \n+
    1670 template<class C>
    \n+
    1671 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator!=(const VertexIteratorT<ConstContainer>& other) const
    \n+
    1672 {
    \n+
    1673 return current_ != other.current_;
    \n+
    1674 }
    \n+
    1675
    \n+
    1676
    \n+
    1677 template<class M>
    \n+
    1678 template<class C>
    \n+
    1679 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator==(const VertexIteratorT<MutableContainer>& other) const
    \n+
    1680 {
    \n+
    1681 return current_ == other.current_;
    \n+
    1682 }
    \n+
    1683
    \n+
    1684 template<class M>
    \n+
    1685 template<class C>
    \n+
    1686 inline bool MatrixGraph<M>::VertexIteratorT<C>::operator==(const VertexIteratorT<ConstContainer>& other) const
    \n+
    1687 {
    \n+
    1688 return current_ == other.current_;
    \n+
    1689 }
    \n+
    1690
    \n+
    1691 template<class M>
    \n+
    1692 template<class C>
    \n+
    1693 inline typename MatrixGraph<M>::template VertexIteratorT<C>& MatrixGraph<M>::VertexIteratorT<C>::operator++()
    \n+
    1694 {
    \n+
    1695 ++current_;
    \n+
    1696 return *this;
    \n+
    1697 }
    \n+
    1698
    \n+
    1699 template<class M>
    \n+
    1700 template<class C>
    \n+
    1701 inline typename MatrixGraph<M>::template VertexIteratorT<C>::WeightType&
    \n+
    1702 MatrixGraph<M>::VertexIteratorT<C>::weight() const
    \n+
    1703 {
    \n+
    1704 return graph_->matrix()[current_][current_];
    \n+
    1705 }
    \n+
    1706
    \n+
    1707 template<class M>
    \n+
    1708 template<class C>
    \n+
    1709 inline const typename MatrixGraph<M>::VertexDescriptor&
    \n+
    1710 MatrixGraph<M>::VertexIteratorT<C>::operator*() const
    \n+
    1711 {
    \n+
    1712 return current_;
    \n+
    1713 }
    \n+
    1714
    \n+
    1715 template<class M>
    \n+
    1716 template<class C>
    \n+
    1717 inline typename MatrixGraph<M>::template EdgeIteratorT<C>
    \n+
    1718 MatrixGraph<M>::VertexIteratorT<C>::begin() const
    \n+
    1719 {
    \n+
    1720 return graph_->beginEdges(current_);
    \n+
    1721 }
    \n+
    1722
    \n+
    1723 template<class M>
    \n+
    1724 template<class C>
    \n+
    1725 inline typename MatrixGraph<M>::template EdgeIteratorT<C>
    \n+
    1726 MatrixGraph<M>::VertexIteratorT<C>::end() const
    \n+
    1727 {
    \n+
    1728 return graph_->endEdges(current_);
    \n+
    1729 }
    \n+
    1730
    \n+
    1731 template<class M>
    \n+
    1732 inline typename MatrixGraph<M>::template VertexIteratorT<MatrixGraph<M> >
    \n+
    1733 MatrixGraph<M>::begin()
    \n+
    1734 {
    \n+
    1735 return VertexIterator(this,0);
    \n+
    1736 }
    \n+
    1737
    \n+
    1738 template<class M>
    \n+
    1739 inline typename MatrixGraph<M>::template VertexIteratorT<MatrixGraph<M> >
    \n+
    1740 MatrixGraph<M>::end()
    \n+
    1741 {
    \n+
    1742 return VertexIterator(matrix_.N());
    \n+
    1743 }
    \n+
    1744
    \n+
    1745
    \n+
    1746 template<class M>
    \n+
    1747 inline typename MatrixGraph<M>::template VertexIteratorT<const MatrixGraph<M> >
    \n+
    1748 MatrixGraph<M>::begin() const
    \n+
    1749 {
    \n+
    1750 return ConstVertexIterator(this, 0);
    \n+
    1751 }
    \n+
    1752
    \n+
    1753 template<class M>
    \n+
    1754 inline typename MatrixGraph<M>::template VertexIteratorT<const MatrixGraph<M> >
    \n+
    1755 MatrixGraph<M>::end() const
    \n+
    1756 {
    \n+
    1757 return ConstVertexIterator(matrix_.N());
    \n+
    1758 }
    \n+
    1759
    \n+
    1760 template<class M>
    \n+
    1761 inline typename MatrixGraph<M>::template EdgeIteratorT<MatrixGraph<M> >
    \n+
    1762 MatrixGraph<M>::beginEdges(const VertexDescriptor& source)
    \n+
    1763 {
    \n+
    1764 return EdgeIterator(source, matrix_.operator[](source).begin(),
    \n+
    1765 matrix_.operator[](source).end(), start_[source]);
    \n+
    1766 }
    \n+
    1767
    \n+
    1768 template<class M>
    \n+
    1769 inline typename MatrixGraph<M>::template EdgeIteratorT<MatrixGraph<M> >
    \n+
    1770 MatrixGraph<M>::endEdges(const VertexDescriptor& source)
    \n+
    1771 {
    \n+
    1772 return EdgeIterator(matrix_.operator[](source).end());
    \n+
    1773 }
    \n+
    1774
    \n+
    1775
    \n+
    1776 template<class M>
    \n+
    1777 inline typename MatrixGraph<M>::template EdgeIteratorT<const MatrixGraph<M> >
    \n+
    1778 MatrixGraph<M>::beginEdges(const VertexDescriptor& source) const
    \n+
    1779 {
    \n+
    1780 return ConstEdgeIterator(source, matrix_.operator[](source).begin(),
    \n+
    1781 matrix_.operator[](source).end(), start_[source]);
    \n+
    1782 }
    \n+
    1783
    \n+
    1784 template<class M>
    \n+
    1785 inline typename MatrixGraph<M>::template EdgeIteratorT<const MatrixGraph<M> >
    \n+
    1786 MatrixGraph<M>::endEdges(const VertexDescriptor& source) const
    \n+
    1787 {
    \n+
    1788 return ConstEdgeIterator(matrix_.operator[](source).end());
    \n+
    1789 }
    \n+
    1790
    \n+
    1791
    \n+
    1792 template<class G, class T>
    \n+
    1793 SubGraph<G,T>::EdgeIterator::EdgeIterator(const VertexDescriptor& source,
    \n+
    1794 const EdgeDescriptor& edge)
    \n+
    1795 : source_(source), edge_(edge)
    \n+
    1796 {}
    \n+
    1797
    \n+
    1798
    \n+
    1799 template<class G, class T>
    \n+
    1800 SubGraph<G,T>::EdgeIterator::EdgeIterator(const EdgeDescriptor& edge)
    \n+
    1801 : edge_(edge)
    \n+
    1802 {}
    \n+
    1803
    \n+
    1804 template<class G, class T>
    \n+
    1805 typename SubGraph<G,T>::EdgeIndexMap SubGraph<G,T>::getEdgeIndexMap()
    \n+
    1806 {
    \n+
    1807 return EdgeIndexMap(edges_);
    \n+
    1808 }
    \n+
    1809
    \n+
    1810 template<class G, class T>
    \n+
    1811 inline bool SubGraph<G,T>::EdgeIterator::equals(const EdgeIterator & other) const
    \n+
    1812 {
    \n+
    1813 return other.edge_==edge_;
    \n+
    1814 }
    \n+
    1815
    \n+
    1816 template<class G, class T>
    \n+
    1817 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::increment()
    \n+
    1818 {
    \n+
    1819 ++edge_;
    \n+
    1820 return *this;
    \n+
    1821 }
    \n+
    1822
    \n+
    1823 template<class G, class T>
    \n+
    1824 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::decrement()
    \n+
    1825 {
    \n+
    1826 --edge_;
    \n+
    1827 return *this;
    \n+
    1828 }
    \n+
    1829
    \n+
    1830 template<class G, class T>
    \n+
    1831 inline typename SubGraph<G,T>::EdgeIterator& SubGraph<G,T>::EdgeIterator::advance(std::ptrdiff_t n)
    \n+
    1832 {
    \n+
    1833 edge_+=n;
    \n+
    1834 return *this;
    \n+
    1835 }
    \n+
    1836 template<class G, class T>
    \n+
    1837 inline const typename G::VertexDescriptor& SubGraph<G,T>::EdgeIterator::source() const
    \n+
    1838 {
    \n+
    1839 return source_;
    \n+
    1840 }
    \n+
    1841
    \n+
    1842 template<class G, class T>
    \n+
    1843 inline const typename G::VertexDescriptor& SubGraph<G,T>::EdgeIterator::target() const
    \n+
    1844 {
    \n+
    1845 return *edge_;
    \n+
    1846 }
    \n+
    1847
    \n+
    1848
    \n+
    1849 template<class G, class T>
    \n+
    1850 inline const typename SubGraph<G,T>::EdgeDescriptor& SubGraph<G,T>::EdgeIterator::dereference() const
    \n+
    1851 {
    \n+
    1852 return edge_;
    \n+
    1853 }
    \n+
    1854
    \n+
    1855 template<class G, class T>
    \n+
    1856 inline std::ptrdiff_t SubGraph<G,T>::EdgeIterator::distanceTo(const EdgeIterator & other) const
    \n+
    1857 {
    \n+
    1858 return other.edge_-edge_;
    \n+
    1859 }
    \n+
    1860
    \n+
    1861 template<class G, class T>
    \n+
    1862 SubGraph<G,T>::VertexIterator::VertexIterator(const SubGraph<G,T>* graph,
    \n+
    1863 const VertexDescriptor& current,
    \n+
    1864 const VertexDescriptor& end)
    \n+
    1865 : graph_(graph), current_(current), end_(end)
    \n+
    1866 {
    \n+
    1867 // Skip excluded vertices
    \n+
    1868 typedef typename T::const_iterator Iterator;
    \n+
    1869
    \n+
    1870 for(Iterator vertex = graph_->excluded_.begin();
    \n+
    1871 current_ != end_ && *vertex;
    \n+
    1872 ++vertex)
    \n+
    1873 ++current_;
    \n+
    1874 assert(current_ == end_ || !graph_->excluded_[current_]);
    \n+
    1875 }
    \n+
    1876
    \n+
    1877 template<class G, class T>
    \n+
    1878 SubGraph<G,T>::VertexIterator::VertexIterator(const VertexDescriptor& current)
    \n+
    1879 : current_(current)
    \n+
    1880 {}
    \n+
    1881
    \n+
    1882 template<class G, class T>
    \n+
    1883 inline typename SubGraph<G,T>::VertexIterator& SubGraph<G,T>::VertexIterator::increment()
    \n+
    1884 {
    \n+
    1885 ++current_;
    \n+
    1886 //Skip excluded vertices
    \n+
    1887 while(current_ != end_ && graph_->excluded_[current_])
    \n+
    1888 ++current_;
    \n+
    1889
    \n+
    1890 assert(current_ == end_ || !graph_->excluded_[current_]);
    \n+
    1891 return *this;
    \n+
    1892 }
    \n+
    1893
    \n+
    1894 template<class G, class T>
    \n+
    1895 inline bool SubGraph<G,T>::VertexIterator::equals(const VertexIterator & other) const
    \n+
    1896 {
    \n+
    1897 return current_==other.current_;
    \n+
    1898 }
    \n+
    1899
    \n+
    1900 template<class G, class T>
    \n+
    1901 inline const typename G::VertexDescriptor& SubGraph<G,T>::VertexIterator::dereference() const
    \n+
    1902 {
    \n+
    1903 return current_;
    \n+
    1904 }
    \n+
    1905
    \n+
    1906 template<class G, class T>
    \n+
    1907 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::VertexIterator::begin() const
    \n+
    1908 {
    \n+
    1909 return graph_->beginEdges(current_);
    \n+
    1910 }
    \n+
    1911
    \n+
    1912 template<class G, class T>
    \n+
    1913 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::VertexIterator::end() const
    \n+
    1914 {
    \n+
    1915 return graph_->endEdges(current_);
    \n+
    1916 }
    \n+
    1917
    \n+
    1918 template<class G, class T>
    \n+
    1919 inline typename SubGraph<G,T>::VertexIterator SubGraph<G,T>::begin() const
    \n+
    1920 {
    \n+
    1921 return VertexIterator(this, 0, endVertex_);
    \n+
    1922 }
    \n+
    1923
    \n+
    1924
    \n+
    1925 template<class G, class T>
    \n+
    1926 inline typename SubGraph<G,T>::VertexIterator SubGraph<G,T>::end() const
    \n+
    1927 {
    \n+
    1928 return VertexIterator(endVertex_);
    \n+
    1929 }
    \n+
    1930
    \n+
    1931
    \n+
    1932 template<class G, class T>
    \n+
    1933 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::beginEdges(const VertexDescriptor& source) const
    \n+
    1934 {
    \n+
    1935 return EdgeIterator(source, edges_+start_[source]);
    \n+
    1936 }
    \n+
    1937
    \n+
    1938 template<class G, class T>
    \n+
    1939 inline typename SubGraph<G,T>::EdgeIterator SubGraph<G,T>::endEdges(const VertexDescriptor& source) const
    \n+
    1940 {
    \n+
    1941 return EdgeIterator(edges_+end_[source]);
    \n+
    1942 }
    \n+
    1943
    \n+
    1944 template<class G, class T>
    \n+
    1945 std::size_t SubGraph<G,T>::noVertices() const
    \n+
    1946 {
    \n+
    1947 return noVertices_;
    \n+
    1948 }
    \n+
    1949
    \n+
    1950 template<class G, class T>
    \n+
    1951 inline typename SubGraph<G,T>::VertexDescriptor SubGraph<G,T>::maxVertex() const
    \n+
    1952 {
    \n+
    1953 return maxVertex_;
    \n+
    1954 }
    \n+
    1955
    \n+
    1956 template<class G, class T>
    \n+
    1957 inline std::size_t SubGraph<G,T>::noEdges() const
    \n+
    1958 {
    \n+
    1959 return noEdges_;
    \n+
    1960 }
    \n+
    1961
    \n+
    1962 template<class G, class T>
    \n+
    1963 inline typename SubGraph<G,T>::EdgeDescriptor SubGraph<G,T>::findEdge(const VertexDescriptor& source,
    \n+
    1964 const VertexDescriptor& target) const
    \n+
    1965 {
    \n+
    1966 const EdgeDescriptor edge = std::lower_bound(edges_+start_[source], edges_+end_[source], target);
    \n+
    1967 if(edge==edges_+end_[source] || *edge!=target)
    \n+
    1968 return std::numeric_limits<EdgeDescriptor>::max();
    \n+
    1969
    \n+
    1970 return edge;
    \n+
    1971 }
    \n+
    1972
    \n+
    1973 template<class G, class T>
    \n+
    1974 SubGraph<G,T>::~SubGraph()
    \n+
    1975 {
    \n+
    1976 delete[] edges_;
    \n+
    1977 delete[] end_;
    \n+
    1978 delete[] start_;
    \n+
    1979 }
    \n+
    1980
    \n+
    1981 template<class G, class T>
    \n+
    1982 SubGraph<G,T>::SubGraph(const G& graph, const T& excluded)
    \n+
    1983 : excluded_(excluded), noVertices_(0), endVertex_(0), maxVertex_(graph.maxVertex())
    \n+
    1984 {
    \n+
    1985 start_ = new std::ptrdiff_t[graph.noVertices()];
    \n+
    1986 end_ = new std::ptrdiff_t[graph.noVertices()];
    \n+
    1987 edges_ = new VertexDescriptor[graph.noEdges()];
    \n+
    1988
    \n+
    1989 VertexDescriptor* edge=edges_;
    \n+
    1990
    \n+
    1991 // Cater for the case that there are no vertices.
    \n+
    1992 // Otherwise endVertex_ will get 1 below.
    \n+
    1993 if ( graph.noVertices() == 0)
    \n+
    1994 return;
    \n+
    1995
    \n+
    1996 typedef typename Graph::ConstVertexIterator Iterator;
    \n+
    1997 Iterator endVertex=graph.end();
    \n+
    1998
    \n+
    1999 for(Iterator vertex = graph.begin(); vertex != endVertex; ++vertex)
    \n+
    2000 if(excluded_[*vertex])
    \n+
    2001 start_[*vertex]=end_[*vertex]=-1;
    \n+
    2002 else{
    \n+
    2003 ++noVertices_;
    \n+
    2004 endVertex_ = std::max(*vertex, endVertex_);
    \n+
    2005
    \n+
    2006 start_[*vertex] = edge-edges_;
    \n+
    2007
    \n+
    2008 auto endEdge = vertex.end();
    \n+
    2009
    \n+
    2010 for(auto iter=vertex.begin(); iter!= endEdge; ++iter)
    \n+
    2011 if(!excluded[iter.target()]) {
    \n+
    2012 *edge = iter.target();
    \n+
    2013 ++edge;
    \n+
    2014 }
    \n+
    2015
    \n+
    2016 end_[*vertex] = edge - edges_;
    \n+
    2017
    \n+
    2018 // Sort the edges
    \n+
    2019 std::sort(edges_+start_[*vertex], edge);
    \n+
    2020 }
    \n+
    2021 noEdges_ = edge-edges_;
    \n+
    2022 ++endVertex_;
    \n+
    2023 }
    \n+
    2024
    \n+
    2025 template<class G, class V, class VM>
    \n+
    2026 inline std::size_t VertexPropertiesGraph<G,V,VM>::noEdges() const
    \n+
    2027 {
    \n+
    2028 return graph_.noEdges();
    \n+
    2029 }
    \n+
    2030
    \n+
    2031 template<class G, class V, class VM>
    \n+
    2032 inline typename VertexPropertiesGraph<G,V,VM>::EdgeIterator
    \n+
    2033 VertexPropertiesGraph<G,V,VM>::beginEdges(const VertexDescriptor& source)
    \n+
    2034 {
    \n+
    2035 return graph_.beginEdges(source);
    \n+
    2036 }
    \n+
    2037
    \n+
    2038 template<class G, class V, class VM>
    \n+
    2039 inline typename VertexPropertiesGraph<G,V,VM>::EdgeIterator
    \n+
    2040 VertexPropertiesGraph<G,V,VM>::endEdges(const VertexDescriptor& source)
    \n+
    2041 {
    \n+
    2042 return graph_.endEdges(source);
    \n+
    2043 }
    \n+
    2044
    \n+
    2045 template<class G, class V, class VM>
    \n+
    2046 typename VertexPropertiesGraph<G,V,VM>::ConstEdgeIterator
    \n+
    2047 inline VertexPropertiesGraph<G,V,VM>::beginEdges(const VertexDescriptor& source) const
    \n+
    2048 {
    \n+
    2049 return graph_.beginEdges(source);
    \n+
    2050 }
    \n+
    2051
    \n+
    2052 template<class G, class V, class VM>
    \n+
    2053 typename VertexPropertiesGraph<G,V,VM>::ConstEdgeIterator
    \n+
    2054 VertexPropertiesGraph<G,V,VM>::endEdges(const VertexDescriptor& source) const
    \n+
    2055 {
    \n+
    2056 return graph_.endEdges(source);
    \n+
    2057 }
    \n+
    2058
    \n+
    2059 template<class G, class V, class VM>
    \n+
    2060 template<class C>
    \n+
    2061 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
    \n+
    2062 ::VertexIteratorT(const Father& iter,
    \n+
    2063 C* graph)
    \n+
    2064 : Father(iter), graph_(graph)
    \n+
    2065 {}
    \n+
    2066
    \n+
    2067 template<class G, class V, class VM>
    \n+
    2068 template<class C>
    \n+
    2069 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
    \n+
    2070 ::VertexIteratorT(const Father& iter)
    \n+
    2071 : Father(iter)
    \n+
    2072 {}
    \n+
    2073
    \n+
    2074 template<class G, class V, class VM>
    \n+
    2075 template<class C>
    \n+
    2076 template<class C1>
    \n+
    2077 VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>
    \n+
    2078 ::VertexIteratorT(const VertexIteratorT<C1>& other)
    \n+
    2079 : Father(other), graph_(other.graph_)
    \n+
    2080 {}
    \n+
    2081
    \n+
    2082 template<class G, class V, class VM>
    \n+
    2083 template<class C>
    \n+
    2084 typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
    \n+
    2085 V&, const V&>::type
    \n+
    2086 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::properties() const
    \n+
    2087 {
    \n+
    2088 return graph_->getVertexProperties(Father::operator*());
    \n+
    2089 }
    \n+
    2090
    \n+
    2091 template<class G, class V, class VM>
    \n+
    2092 template<class C>
    \n+
    2093 typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n+
    2094 C>::value,
    \n+
    2095 typename G::EdgeIterator,
    \n+
    2096 typename G::ConstEdgeIterator>::type
    \n+
    2097 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::begin() const
    \n+
    2098 {
    \n+
    2099 return graph_->beginEdges(Father::operator*());
    \n+
    2100 }
    \n+
    2101
    \n+
    2102 template<class G, class V, class VM>
    \n+
    2103 template<class C>
    \n+
    2104 typename std::conditional<std::is_same<typename std::remove_const<C>::type,
    \n+
    2105 C>::value,
    \n+
    2106 typename G::EdgeIterator,
    \n+
    2107 typename G::ConstEdgeIterator>::type
    \n+
    2108 inline VertexPropertiesGraph<G,V,VM>::VertexIteratorT<C>::end() const
    \n+
    2109 {
    \n+
    2110 return graph_->endEdges(Father::operator*());
    \n+
    2111 }
    \n+
    2112
    \n+
    2113 template<class G, class V, class VM>
    \n+
    2114 inline typename VertexPropertiesGraph<G,V,VM>::VertexIterator VertexPropertiesGraph<G,V,VM>::begin()
    \n+
    2115 {
    \n+
    2116 return VertexIterator(graph_.begin(), this);
    \n+
    2117 }
    \n+
    2118
    \n+
    2119 template<class G, class V, class VM>
    \n+
    2120 inline typename VertexPropertiesGraph<G,V,VM>::VertexIterator VertexPropertiesGraph<G,V,VM>::end()
    \n+
    2121 {
    \n+
    2122 return VertexIterator(graph_.end());
    \n+
    2123 }
    \n+
    2124
    \n+
    2125
    \n+
    2126 template<class G, class V, class VM>
    \n+
    2127 inline typename VertexPropertiesGraph<G,V,VM>::ConstVertexIterator VertexPropertiesGraph<G,V,VM>::begin() const
    \n+
    2128 {
    \n+
    2129 return ConstVertexIterator(graph_.begin(), this);
    \n+
    2130 }
    \n+
    2131
    \n+
    2132 template<class G, class V, class VM>
    \n+
    2133 inline typename VertexPropertiesGraph<G,V,VM>::ConstVertexIterator VertexPropertiesGraph<G,V,VM>::end() const
    \n+
    2134 {
    \n+
    2135 return ConstVertexIterator(graph_.end());
    \n+
    2136 }
    \n+
    2137
    \n+
    2138 template<class G, class V, class VM>
    \n+
    2139 inline V& VertexPropertiesGraph<G,V,VM>::getVertexProperties(const VertexDescriptor& vertex)
    \n+
    2140 {
    \n+
    2141 return vertexProperties_[vmap_[vertex]];
    \n+
    2142 }
    \n+
    2143
    \n+
    2144 template<class G, class V, class VM>
    \n+
    2145 inline const V& VertexPropertiesGraph<G,V,VM>::getVertexProperties(const VertexDescriptor& vertex) const
    \n+
    2146 {
    \n+
    2147 return vertexProperties_[vmap_[vertex]];
    \n+
    2148 }
    \n+
    2149
    \n+
    2150 template<class G, class V, class VM>
    \n+
    2151 inline const G& VertexPropertiesGraph<G,V,VM>::graph() const
    \n+
    2152 {
    \n+
    2153 return graph_;
    \n+
    2154 }
    \n+
    2155
    \n+
    2156 template<class G, class V, class VM>
    \n+
    2157 inline std::size_t VertexPropertiesGraph<G,V,VM>::noVertices() const
    \n+
    2158 {
    \n+
    2159 return graph_.noVertices();
    \n+
    2160 }
    \n+
    2161
    \n+
    2162
    \n+
    2163 template<class G, class V, class VM>
    \n+
    2164 inline typename VertexPropertiesGraph<G,V,VM>::VertexDescriptor VertexPropertiesGraph<G,V,VM>::maxVertex() const
    \n+
    2165 {
    \n+
    2166 return graph_.maxVertex();
    \n+
    2167 }
    \n+
    2168
    \n+
    2169 template<class G, class V, class VM>
    \n+
    2170 VertexPropertiesGraph<G,V,VM>::VertexPropertiesGraph(Graph& graph, const VM vmap)
    \n+
    2171 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex()+1], V())
    \n+
    2172 {}
    \n+
    2173
    \n+
    2174 template<class G, class V, class E, class VM, class EM>
    \n+
    2175 template<class C>
    \n+
    2176 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const Father& iter,
    \n+
    2177 C* graph)
    \n+
    2178 : Father(iter), graph_(graph)
    \n+
    2179 {}
    \n+
    2180
    \n+
    2181 template<class G, class V, class E, class VM, class EM>
    \n+
    2182 template<class C>
    \n+
    2183 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const Father& iter)
    \n+
    2184 : Father(iter)
    \n+
    2185 {}
    \n+
    2186
    \n+
    2187 template<class G, class V, class E, class VM, class EM>
    \n+
    2188 template<class C>
    \n+
    2189 template<class C1>
    \n+
    2190 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::EdgeIteratorT(const EdgeIteratorT<C1>& other)
    \n+
    2191 : Father(other), graph_(other.graph_)
    \n+
    2192 {}
    \n+
    2193
    \n+
    2194
    \n+
    2195 template<class G, class V, class E, class VM, class EM>
    \n+
    2196 inline std::size_t PropertiesGraph<G,V,E,VM,EM>::noEdges() const
    \n+
    2197 {
    \n+
    2198 return graph_.noEdges();
    \n+
    2199 }
    \n+
    2200
    \n+
    2201 template<class G, class V, class E, class VM, class EM>
    \n+
    2202 template<class C>
    \n+
    2203 inline typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,E&,const E&>::type
    \n+
    2204 PropertiesGraph<G,V,E,VM,EM>::EdgeIteratorT<C>::properties() const
    \n+
    2205 {
    \n+
    2206 return graph_->getEdgeProperties(Father::operator*());
    \n+
    2207 }
    \n+
    2208
    \n+
    2209 template<class G, class V, class E, class VM, class EM>
    \n+
    2210 inline typename PropertiesGraph<G,V,E,VM,EM>::EdgeIterator
    \n+
    2211 PropertiesGraph<G,V,E,VM,EM>::beginEdges(const VertexDescriptor& source)
    \n+
    2212 {
    \n+
    2213 return EdgeIterator(graph_.beginEdges(source), this);
    \n+
    2214 }
    \n+
    2215
    \n+
    2216 template<class G, class V, class E, class VM, class EM>
    \n+
    2217 inline typename PropertiesGraph<G,V,E,VM,EM>::EdgeIterator
    \n+
    2218 PropertiesGraph<G,V,E,VM,EM>::endEdges(const VertexDescriptor& source)
    \n+
    2219 {
    \n+
    2220 return EdgeIterator(graph_.endEdges(source));
    \n+
    2221 }
    \n+
    2222
    \n+
    2223 template<class G, class V, class E, class VM, class EM>
    \n+
    2224 typename PropertiesGraph<G,V,E,VM,EM>::ConstEdgeIterator
    \n+
    2225 inline PropertiesGraph<G,V,E,VM,EM>::beginEdges(const VertexDescriptor& source) const
    \n+
    2226 {
    \n+
    2227 return ConstEdgeIterator(graph_.beginEdges(source), this);
    \n+
    2228 }
    \n+
    2229
    \n+
    2230 template<class G, class V, class E, class VM, class EM>
    \n+
    2231 typename PropertiesGraph<G,V,E,VM,EM>::ConstEdgeIterator
    \n+
    2232 PropertiesGraph<G,V,E,VM,EM>::endEdges(const VertexDescriptor& source) const
    \n+
    2233 {
    \n+
    2234 return ConstEdgeIterator(graph_.endEdges(source));
    \n+
    2235 }
    \n+
    2236
    \n+
    2237 template<class G, class V, class E, class VM, class EM>
    \n+
    2238 template<class C>
    \n+
    2239 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
    \n+
    2240 ::VertexIteratorT(const Father& iter,
    \n+
    2241 C* graph)
    \n+
    2242 : Father(iter), graph_(graph)
    \n+
    2243 {}
    \n+
    2244
    \n+
    2245 template<class G, class V, class E, class VM, class EM>
    \n+
    2246 template<class C>
    \n+
    2247 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
    \n+
    2248 ::VertexIteratorT(const Father& iter)
    \n+
    2249 : Father(iter)
    \n+
    2250 {}
    \n+
    2251
    \n+
    2252 template<class G, class V, class E, class VM, class EM>
    \n+
    2253 template<class C>
    \n+
    2254 template<class C1>
    \n+
    2255 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>
    \n+
    2256 ::VertexIteratorT(const VertexIteratorT<C1>& other)
    \n+
    2257 : Father(other), graph_(other.graph_)
    \n+
    2258 {}
    \n+
    2259
    \n+
    2260 template<class G, class V, class E, class VM, class EM>
    \n+
    2261 template<class C>
    \n+
    2262 inline typename std::conditional<std::is_same<C,typename std::remove_const<C>::type>::value,
    \n+
    2263 V&, const V&>::type
    \n+
    2264 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::properties() const
    \n+
    2265 {
    \n+
    2266 return graph_->getVertexProperties(Father::operator*());
    \n+
    2267 }
    \n+
    2268
    \n+
    2269 template<class G, class V, class E, class VM, class EM>
    \n+
    2270 template<class C>
    \n+
    2271 inline typename PropertiesGraph<G,V,E,VM,EM>::template EdgeIteratorT<C>
    \n+
    2272 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::begin() const
    \n+
    2273 {
    \n+
    2274 return graph_->beginEdges(Father::operator*());
    \n+
    2275 }
    \n+
    2276
    \n+
    2277 template<class G, class V, class E, class VM, class EM>
    \n+
    2278 template<class C>
    \n+
    2279 inline typename PropertiesGraph<G,V,E,VM,EM>::template EdgeIteratorT<C>
    \n+
    2280 PropertiesGraph<G,V,E,VM,EM>::VertexIteratorT<C>::end() const
    \n+
    2281 {
    \n+
    2282 return graph_->endEdges(Father::operator*());
    \n+
    2283 }
    \n+
    2284
    \n+
    2285 template<class G, class V, class E, class VM, class EM>
    \n+
    2286 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexIterator PropertiesGraph<G,V,E,VM,EM>::begin()
    \n+
    2287 {
    \n+
    2288 return VertexIterator(graph_.begin(), this);
    \n+
    2289 }
    \n+
    2290
    \n+
    2291 template<class G, class V, class E, class VM, class EM>
    \n+
    2292 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexIterator PropertiesGraph<G,V,E,VM,EM>::end()
    \n+
    2293 {
    \n+
    2294 return VertexIterator(graph_.end());
    \n+
    2295 }
    \n+
    2296
    \n+
    2297
    \n+
    2298 template<class G, class V, class E, class VM, class EM>
    \n+
    2299 inline typename PropertiesGraph<G,V,E,VM,EM>::ConstVertexIterator PropertiesGraph<G,V,E,VM,EM>::begin() const
    \n+
    2300 {
    \n+
    2301 return ConstVertexIterator(graph_.begin(), this);
    \n+
    2302 }
    \n+
    2303
    \n+
    2304 template<class G, class V, class E, class VM, class EM>
    \n+
    2305 inline typename PropertiesGraph<G,V,E,VM,EM>::ConstVertexIterator PropertiesGraph<G,V,E,VM,EM>::end() const
    \n+
    2306 {
    \n+
    2307 return ConstVertexIterator(graph_.end());
    \n+
    2308 }
    \n+
    2309
    \n+
    2310 template<class G, class V, class E, class VM, class EM>
    \n+
    2311 inline V& PropertiesGraph<G,V,E,VM,EM>::getVertexProperties(const VertexDescriptor& vertex)
    \n+
    2312 {
    \n+
    2313 return vertexProperties_[vmap_[vertex]];
    \n+
    2314 }
    \n+
    2315
    \n+
    2316 template<class G, class V, class E, class VM, class EM>
    \n+
    2317 inline const V& PropertiesGraph<G,V,E,VM,EM>::getVertexProperties(const VertexDescriptor& vertex) const
    \n+
    2318 {
    \n+
    2319 return vertexProperties_[vmap_[vertex]];
    \n+
    2320 }
    \n+
    2321
    \n+
    2322 template<class G, class V, class E, class VM, class EM>
    \n+
    2323 inline E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const EdgeDescriptor& edge)
    \n+
    2324 {
    \n+
    2325 return edgeProperties_[emap_[edge]];
    \n+
    2326 }
    \n+
    2327
    \n+
    2328 template<class G, class V, class E, class VM, class EM>
    \n+
    2329 inline const E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const EdgeDescriptor& edge) const
    \n+
    2330 {
    \n+
    2331 return edgeProperties_[emap_[edge]];
    \n+
    2332 }
    \n+
    2333
    \n+
    2334 template<class G, class V, class E, class VM, class EM>
    \n+
    2335 inline E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const VertexDescriptor& source,
    \n+
    2336 const VertexDescriptor& target)
    \n+
    2337 {
    \n+
    2338 return getEdgeProperties(graph_.findEdge(source,target));
    \n+
    2339 }
    \n+
    2340
    \n+
    2341 template<class G, class V, class E, class VM, class EM>
    \n+
    2342 inline const E& PropertiesGraph<G,V,E,VM,EM>::getEdgeProperties(const VertexDescriptor& source,
    \n+
    2343 const VertexDescriptor& target) const
    \n+
    2344 {
    \n+
    2345 return getEdgeProperties(graph_.findEdge(source,target));
    \n+
    2346 }
    \n+
    2347
    \n+
    2348 template<class G, class V, class E, class VM, class EM>
    \n+
    2349 inline const G& PropertiesGraph<G,V,E,VM,EM>::graph() const
    \n+
    2350 {
    \n+
    2351 return graph_;
    \n+
    2352 }
    \n+
    2353
    \n+
    2354 template<class G, class V, class E, class VM, class EM>
    \n+
    2355 inline std::size_t PropertiesGraph<G,V,E,VM,EM>::noVertices() const
    \n+
    2356 {
    \n+
    2357 return graph_.noVertices();
    \n+
    2358 }
    \n+
    2359
    \n+
    2360
    \n+
    2361 template<class G, class V, class E, class VM, class EM>
    \n+
    2362 inline typename PropertiesGraph<G,V,E,VM,EM>::VertexDescriptor PropertiesGraph<G,V,E,VM,EM>::maxVertex() const
    \n+
    2363 {
    \n+
    2364 return graph_.maxVertex();
    \n+
    2365 }
    \n+
    2366
    \n+
    2367 template<class G, class V, class E, class VM, class EM>
    \n+
    2368 PropertiesGraph<G,V,E,VM,EM>::PropertiesGraph(Graph& graph, const VM& vmap, const EM& emap)
    \n+
    2369 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex()+1], V()),
    \n+
    2370 emap_(emap), edgeProperties_(graph_.noEdges(), E())
    \n+
    2371 {}
    \n+
    2372
    \n+
    2373 template<class G, class V>
    \n+
    2374 inline int visitNeighbours(const G& graph, const typename G::VertexDescriptor& vertex,
    \n+
    2375 V& visitor)
    \n+
    2376 {
    \n+
    2377 typedef typename G::ConstEdgeIterator iterator;
    \n+
    2378 const iterator end = graph.endEdges(vertex);
    \n+
    2379 int noNeighbours=0;
    \n+
    2380 for(iterator edge = graph.beginEdges(vertex); edge != end; ++edge, ++noNeighbours)
    \n+
    2381 visitor(edge);
    \n+
    2382 return noNeighbours;
    \n+
    2383 }
    \n+
    2384
    \n+
    2385#endif // DOXYGEN
    \n+
    2386
    \n+
    2388 }
    \n+
    2389}
    \n+
    2390#endif
    \n+\n+
    int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
    Visit all neighbour vertices of a vertex in a graph.
    \n+
    STL namespace.
    \n+
    Definition allocator.hh:11
    \n+
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    The (undirected) graph of a matrix.
    Definition graph.hh:51
    \n+
    MatrixGraph(Matrix &matrix)
    Constructor.
    \n+
    VertexIterator end()
    Get an iterator over the vertices.
    \n+
    VertexDescriptor maxVertex() const
    Get the maximal vertex descriptor.
    \n+
    M Matrix
    The type of the matrix we are a graph for.
    Definition graph.hh:56
    \n+
    ConstVertexIterator begin() const
    Get an iterator over the vertices.
    \n+
    VertexIteratorT< const MatrixGraph< Matrix > > ConstVertexIterator
    The constant vertex iterator type.
    Definition graph.hh:308
    \n+
    ~MatrixGraph()
    Destructor.
    \n+
    std::ptrdiff_t EdgeDescriptor
    The edge descriptor.
    Definition graph.hh:80
    \n+
    ConstEdgeIterator endEdges(const VertexDescriptor &source) const
    Get an iterator over the edges starting at a vertex.
    \n+
    M::size_type VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:73
    \n+
    const Matrix & matrix() const
    Get the underlying matrix.
    \n+
    @ mutableMatrix
    Definition graph.hh:86
    \n+
    ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
    Get an iterator over the edges starting at a vertex.
    \n+
    ConstVertexIterator end() const
    Get an iterator over the vertices.
    \n+
    EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator
    The constant edge iterator type.
    Definition graph.hh:298
    \n+
    EdgeIterator beginEdges(const VertexDescriptor &source)
    Get an iterator over the edges starting at a vertex.
    \n+
    std::size_t noVertices() const
    Get the number of vertices in the graph.
    \n+
    EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor &target) const
    Find the descriptor of an edge.
    \n+
    M::block_type Weight
    The type of the weights.
    Definition graph.hh:66
    \n+
    std::remove_const< M >::type MutableMatrix
    The mutable type of the matrix we are a graph for.
    Definition graph.hh:61
    \n+
    EdgeIteratorT< MatrixGraph< Matrix > > EdgeIterator
    The mutable edge iterator type.
    Definition graph.hh:303
    \n+
    VertexIteratorT< MatrixGraph< Matrix > > VertexIterator
    The mutable vertex iterator type.
    Definition graph.hh:313
    \n+
    EdgeIterator endEdges(const VertexDescriptor &source)
    Get an iterator over the edges starting at a vertex.
    \n+
    std::size_t noEdges() const
    Get the number of edges in the graph.
    \n+
    Matrix & matrix()
    Get the underlying matrix.
    \n+
    VertexIterator begin()
    Get an iterator over the vertices.
    \n+
    Iterator over all edges starting from a vertex.
    Definition graph.hh:95
    \n+
    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
    \n+
    EdgeIteratorT(const VertexDescriptor &source, const ColIterator &block, const ColIterator &end, const EdgeDescriptor &edge)
    Constructor.
    \n+
    @ isMutable
    whether C is mutable.
    Definition graph.hh:112
    \n+
    VertexDescriptor target() const
    The index of the target vertex of the current edge.
    \n+
    EdgeIteratorT< C > & operator++()
    preincrement operator.
    \n+
    bool operator!=(const EdgeIteratorT< const typename std::remove_const< C >::type > &other) const
    Inequality operator.
    \n+
    bool operator==(const EdgeIteratorT< const typename std::remove_const< C >::type > &other) const
    Equality operator.
    \n+
    EdgeIteratorT(const EdgeIteratorT< C1 > &other)
    Copy Constructor.
    \n+
    bool operator!=(const EdgeIteratorT< typename std::remove_const< C >::type > &other) const
    Inequality operator.
    \n+
    WeightType & weight() const
    Access the edge weight.
    \n+
    VertexDescriptor source() const
    The index of the source vertex of the current edge.
    \n+
    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
    \n+
    const std::remove_const< C >::type ConstContainer
    The constant type of the container type.
    Definition graph.hh:105
    \n+
    bool operator==(const EdgeIteratorT< typename std::remove_const< C >::type > &other) const
    Equality operator.
    \n+
    EdgeIteratorT(const ColIterator &block)
    Constructor for the end iterator.
    \n+
    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
    \n+
    const EdgeDescriptor & operator*() const
    Get the edge descriptor.
    \n+
    const EdgeDescriptor * operator->() const
    Get the edge descriptor.
    \n+
    std::remove_const< C >::type MutableContainer
    The mutable type of the container type.
    Definition graph.hh:101
    \n+
    The vertex iterator type of the graph.
    Definition graph.hh:209
    \n+
    EdgeIteratorT< C > begin() const
    Get an iterator over all edges starting at the current vertex.
    \n+
    const VertexDescriptor & operator*() const
    Get the descriptor of the current vertex.
    \n+
    WeightType & weight() const
    Access the weight of the vertex.
    \n+
    VertexIteratorT(C *graph, const VertexDescriptor &current)
    Constructor.
    \n+
    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
    \n+
    VertexIteratorT(const VertexIteratorT< MutableContainer > &other)
    \n+
    std::remove_const< C >::type MutableContainer
    The mutable type of the container type.
    Definition graph.hh:214
    \n+
    bool operator!=(const VertexIteratorT< MutableContainer > &other) const
    Inequality operator.
    \n+
    @ isMutable
    whether C is mutable.
    Definition graph.hh:225
    \n+
    bool operator==(const VertexIteratorT< MutableContainer > &other) const
    Equality operator.
    \n+
    const std::remove_const< C >::type ConstContainer
    The constant type of the container type.
    Definition graph.hh:218
    \n+
    VertexIteratorT< C > & operator++()
    Move to the next vertex.
    \n+
    EdgeIteratorT< C > end() const
    Get an iterator over all edges starting at the current vertex.
    \n+
    bool operator==(const VertexIteratorT< ConstContainer > &other) const
    Equality operator.
    \n+
    bool operator!=(const VertexIteratorT< ConstContainer > &other) const
    Inequality operator.
    \n+
    VertexIteratorT(const VertexDescriptor &current)
    Constructor for the end iterator.
    \n+
    A subgraph of a graph.
    Definition graph.hh:443
    \n+
    EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor &target) const
    Find the descriptor of an edge.
    \n+
    VertexDescriptor maxVertex() const
    Get the maximal vertex descriptor.
    \n+
    EdgeIndexMap getEdgeIndexMap()
    Get an edge index map for the graph.
    \n+
    std::size_t noEdges() const
    Get the number of edges in the graph.
    \n+
    ConstEdgeIterator endEdges(const VertexDescriptor &source) const
    Get an iterator over the edges starting at a vertex.
    \n+
    ConstVertexIterator end() const
    Get an iterator over the vertices.
    \n+
    ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
    Get an iterator over the edges starting at a vertex.
    \n+
    std::size_t noVertices() const
    Get the number of vertices in the graph.
    \n+
    T Excluded
    Random access container providing information about which vertices are excluded.
    Definition graph.hh:454
    \n+
    ~SubGraph()
    Destructor.
    \n+
    EdgeIterator ConstEdgeIterator
    The constant edge iterator type.
    Definition graph.hh:618
    \n+
    G Graph
    The type of the graph we are a sub graph for.
    Definition graph.hh:448
    \n+
    VertexIterator ConstVertexIterator
    The constant vertex iterator type.
    Definition graph.hh:623
    \n+
    SubGraph(const Graph &graph, const T &excluded)
    Constructor.
    \n+
    ConstVertexIterator begin() const
    Get an iterator over the vertices.
    \n+
    Graph::VertexDescriptor VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:459
    \n+
    VertexDescriptor * EdgeDescriptor
    Definition graph.hh:461
    \n+
    An index map for mapping the edges to indices.
    Definition graph.hh:470
    \n+
    EdgeIndexMap(const EdgeIndexMap &emap)
    Protect copy construction.
    Definition graph.hh:479
    \n+
    ReadablePropertyMapTag Category
    Definition graph.hh:472
    \n+
    EdgeIndexMap(const EdgeDescriptor &firstEdge)
    Definition graph.hh:474
    \n+
    std::size_t operator[](const EdgeDescriptor &edge) const
    Definition graph.hh:483
    \n+
    The edge iterator of the graph.
    Definition graph.hh:505
    \n+
    const EdgeDescriptor & dereference() const
    The descriptor of the current edge.
    \n+
    EdgeIterator(const EdgeDescriptor &edge)
    Constructor for the end iterator.
    \n+
    bool equals(const EdgeIterator &other) const
    Equality operator.
    \n+
    EdgeIterator & advance(std::ptrdiff_t n)
    \n+
    EdgeIterator & increment()
    Preincrement operator.
    \n+
    const VertexDescriptor & target() const
    The index of the target vertex of the current edge.
    \n+
    const VertexDescriptor & source() const
    The index of the source vertex of the current edge.
    \n+
    EdgeIterator & decrement()
    Preincrement operator.
    \n+
    std::ptrdiff_t distanceTo(const EdgeIterator &other) const
    \n+
    EdgeIterator(const VertexDescriptor &source, const EdgeDescriptor &edge)
    Constructor.
    \n+
    The vertex iterator of the graph.
    Definition graph.hh:560
    \n+
    VertexIterator(const VertexDescriptor &current)
    Constructor for end iterator.
    \n+
    VertexIterator & increment()
    Preincrement operator.
    \n+
    EdgeIterator begin() const
    Get an iterator over all edges starting at the current vertex.
    \n+
    bool equals(const VertexIterator &other) const
    Equality iterator.
    \n+
    VertexIterator(const SubGraph< G, T > *graph, const VertexDescriptor &current, const VertexDescriptor &end)
    Constructor.
    \n+
    EdgeIterator end() const
    Get an iterator over all edges starting at the current vertex.
    \n+
    const VertexDescriptor & dereference() const
    Get the descriptor of the current vertex.
    \n+
    Attaches properties to the vertices of a graph.
    Definition graph.hh:723
    \n+
    const Graph & graph() const
    Get the graph the properties are attached to.
    \n+
    Graph::ConstEdgeIterator ConstEdgeIterator
    The type of the constant edge iterator.
    Definition graph.hh:766
    \n+
    VertexProperties & getVertexProperties(const VertexDescriptor &vertex)
    Get the properties associated with a vertex.
    \n+
    std::size_t noEdges() const
    Get the number of edges in the graph.
    \n+
    Graph::EdgeDescriptor EdgeDescriptor
    The edge descritor.
    Definition graph.hh:738
    \n+
    ConstEdgeIterator endEdges(const VertexDescriptor &source) const
    Get the mutable edge iterator over edges starting at a vertex.
    \n+
    Graph::VertexDescriptor VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:733
    \n+
    G Graph
    The graph we attach properties to.
    Definition graph.hh:728
    \n+
    VM VertexMap
    The type of the map for converting the VertexDescriptor to std::size_t.
    Definition graph.hh:756
    \n+
    EdgeIterator endEdges(const VertexDescriptor &source)
    Get the mutable edge iterator over edges starting at a vertex.
    \n+
    EdgeIterator beginEdges(const VertexDescriptor &source)
    Get the mutable edge iterator over edges starting at a vertex.
    \n+
    VP VertexProperties
    The type of the properties of the vertices.
    Definition graph.hh:743
    \n+
    std::size_t noVertices() const
    Get the number of vertices in the graph.
    \n+
    ConstEdgeIterator beginEdges(const VertexDescriptor &source) const
    Get the mutable edge iterator over edges starting at a vertex.
    \n+
    VertexDescriptor maxVertex() const
    Get the maximal vertex descriptor.
    \n+
    Graph::EdgeIterator EdgeIterator
    The type of the mutable edge iterator.
    Definition graph.hh:761
    \n+\n+
    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
    \n+
    std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::value, VertexProperties &, constVertexProperties & >::type properties() const
    Get the properties of the current Vertex.
    \n+
    EdgeIterator end() const
    Get an iterator over the edges starting from the current vertex.
    \n+
    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
    \n+
    EdgeIterator begin() const
    Get an iterator over the edges starting from the current vertex.
    \n+
    Attaches properties to the edges and vertices of a graph.
    Definition graph.hh:978
    \n+
    std::size_t noVertices() const
    Get the number of vertices in the graph.
    \n+
    Graph::EdgeDescriptor EdgeDescriptor
    The edge descritor.
    Definition graph.hh:993
    \n+
    const EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const VertexDescriptor &target) const
    Get the properties associated with a edge.
    \n+
    const EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge) const
    Get the properties associated with a edge.
    \n+
    const Graph & graph() const
    Get the graph the properties are attached to.
    \n+
    VertexDescriptor maxVertex() const
    Get the maximal vertex descriptor.
    \n+
    G Graph
    The graph we attach properties to.
    Definition graph.hh:983
    \n+
    EM EdgeMap
    The type of the map for converting the EdgeDescriptor to std::size_t.
    Definition graph.hh:1030
    \n+
    VM VertexMap
    The type of the map for converting the VertexDescriptor to std::size_t.
    Definition graph.hh:1011
    \n+
    VP VertexProperties
    The type of the properties of the vertices.
    Definition graph.hh:998
    \n+
    std::size_t noEdges() const
    Get the number of edges in the graph.
    \n+
    EP EdgeProperties
    The type of the properties of the edges;.
    Definition graph.hh:1016
    \n+
    EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const VertexDescriptor &target)
    Get the properties associated with a edge.
    \n+
    EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge)
    Get the properties associated with a edge.
    \n+
    Graph::VertexDescriptor VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:988
    \n+
    PropertiesGraph(Graph &graph, const VertexMap &vmap=VertexMap(), const EdgeMap &emap=EdgeMap())
    Constructor.
    \n+\n+
    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
    \n+\n+
    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
    \n+
    Wrapper to access the internal edge properties of a graph via operator[]()
    Definition graph.hh:1361
    \n+
    GraphVertexPropertiesSelector(G &g)
    Constructor.
    Definition graph.hh:1380
    \n+
    VertexProperties & operator[](const Vertex &vertex) const
    Get the properties associated to a vertex.
    Definition graph.hh:1395
    \n+
    G Graph
    The type of the graph with internal properties.
    Definition graph.hh:1366
    \n+
    G::VertexProperties VertexProperties
    The type of the vertex properties.
    Definition graph.hh:1370
    \n+
    GraphVertexPropertiesSelector()
    Default constructor.
    Definition graph.hh:1386
    \n+
    G::VertexDescriptor Vertex
    The vertex descriptor.
    Definition graph.hh:1374
    \n+
    Wrapper to access the internal vertex properties of a graph via operator[]()
    Definition graph.hh:1409
    \n+
    EdgeProperties & operator[](const Edge &edge) const
    Get the properties associated to a vertex.
    Definition graph.hh:1442
    \n+
    G::EdgeProperties EdgeProperties
    The type of the vertex properties.
    Definition graph.hh:1418
    \n+
    G::EdgeDescriptor Edge
    The edge descriptor.
    Definition graph.hh:1422
    \n+
    GraphEdgePropertiesSelector()
    Default constructor.
    Definition graph.hh:1434
    \n+
    G Graph
    The type of the graph with internal properties.
    Definition graph.hh:1414
    \n+
    GraphEdgePropertiesSelector(G &g)
    Constructor.
    Definition graph.hh:1428
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,132 +1,2286 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-superlufunctions.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+graph.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_SUPERLUFUNCTIONS_HH\n-6#define DUNE_ISTL_SUPERLUFUNCTIONS_HH\n-7#if HAVE_SUPERLU\n-8\n-9#include // SUPERLU_INT_TYPE\n-10\n-_\b1_\b1#define int_t SUPERLU_INT_TYPE\n-12#include \n-13#include \n-14#undef int_t\n-15\n-16#if __has_include(\"slu_sdefs.h\")\n-17extern \"C\" {\n-18 extern void\n-19 sgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,\n-20 char *, float *, float *, SuperMatrix *, SuperMatrix *,\n-21 void *, int, SuperMatrix *, SuperMatrix *,\n-22 float *, float *, float *, float *,\n-23 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);\n-24\n-25 extern void\n-26 sCreate_Dense_Matrix(SuperMatrix *, int, int, float *, int,\n-27 Stype_t, Dtype_t, Mtype_t);\n-28 extern void\n-29 sCreate_CompCol_Matrix(SuperMatrix *, int, int, int, float *,\n-30 int *, int *, Stype_t, Dtype_t, Mtype_t);\n-31 extern int sQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);\n-32\n-33 extern void sPrint_CompCol_Matrix(char *, SuperMatrix *);\n-34}\n-35#endif\n-36\n-37#if __has_include(\"slu_ddefs.h\")\n-38extern \"C\" {\n-39 extern void\n-40 dgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,\n-41 char *, double *, double *, SuperMatrix *, SuperMatrix *,\n-42 void *, int, SuperMatrix *, SuperMatrix *,\n-43 double *, double *, double *, double *,\n-44 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);\n-45\n-46 extern void\n-47 dCreate_CompCol_Matrix(SuperMatrix *, int, int, int, double *,\n-48 int *, int *, Stype_t, Dtype_t, Mtype_t);\n-49\n-50 extern void\n-51 dCreate_Dense_Matrix(SuperMatrix *, int, int, double *, int,\n-52 Stype_t, Dtype_t, Mtype_t);\n-53\n-54 extern int dQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);\n-55\n-56 extern void dPrint_CompCol_Matrix(char *, SuperMatrix *);\n-57}\n-58#endif\n-59\n-60#if __has_include(\"slu_cdefs.h\")\n-61#ifndef SUPERLU_TYPEDEF_COMPLEX\n-62// Per default SuperLU >= 7.0.0. does not provide\n-63// a type complex anymore. By setting SUPERLU_TYPEDEF_COMPLEX\n-64// we tell SuperLU to define complex to be the same as the\n-65// new type singlecomplex\n-66#define SUPERLU_TYPEDEF_COMPLEX\n-67#endif\n-68#include \"slu_scomplex.h\"\n-69\n-70extern \"C\" {\n-71 extern void\n-72 cgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,\n-73 char *, float *, float *, SuperMatrix *, SuperMatrix *,\n-74 void *, int, SuperMatrix *, SuperMatrix *,\n-75 float *, float *, float *, float *,\n-76 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);\n-77\n-78\n-79 extern void\n-80 cCreate_Dense_Matrix(SuperMatrix *, int, int, ::complex *, int,\n-81 Stype_t, Dtype_t, Mtype_t);\n-82\n-83\n-84 extern void\n-85 cCreate_CompCol_Matrix(SuperMatrix *, int, int, int, ::complex *,\n-86 int *, int *, Stype_t, Dtype_t, Mtype_t);\n-87\n-88 extern int cQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);\n+5#ifndef DUNE_AMG_GRAPH_HH\n+6#define DUNE_AMG_GRAPH_HH\n+7\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+16#include \n+17\n+18namespace _\bD_\bu_\bn_\be\n+19{\n+20 namespace Amg\n+21 {\n+49 template\n+_\b5_\b0 class _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+51 {\n+52 public:\n+_\b5_\b6 typedef M _\bM_\ba_\bt_\br_\bi_\bx;\n+57\n+_\b6_\b1 typedef typename std::remove_const::type _\bM_\bu_\bt_\ba_\bb_\bl_\be_\bM_\ba_\bt_\br_\bi_\bx;\n+62\n+_\b6_\b6 typedef typename M::block_type _\bW_\be_\bi_\bg_\bh_\bt;\n+67\n+_\b7_\b3 typedef typename M::size_type _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+74\n+_\b8_\b0 typedef std::ptrdiff_t _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+81\n+82 enum {\n+83 /*\n+84 * @brief Whether Matrix is mutable.\n+85 */\n+86 _\bm_\bu_\bt_\ba_\bb_\bl_\be_\bM_\ba_\bt_\br_\bi_\bx = std::is_same::type>::value\n+_\b8_\b7 };\n+88\n 89\n-90 extern void cPrint_CompCol_Matrix(char *, SuperMatrix *);\n-91}\n-92#endif\n-93\n-94#if __has_include(\"slu_zdefs.h\")\n-95#include \"slu_dcomplex.h\"\n-96extern \"C\" {\n-97 extern void\n-98 zgssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,\n-99 char *, double *, double *, SuperMatrix *, SuperMatrix *,\n-100 void *, int, SuperMatrix *, SuperMatrix *,\n-101 double *, double *, double *, double *,\n-102 GlobalLU_t*, mem_usage_t *, SuperLUStat_t *, int *);\n-103\n-104\n-105 extern void\n-106 zCreate_CompCol_Matrix(SuperMatrix *, int, int, int, doublecomplex *,\n-107 int *, int *, Stype_t, Dtype_t, Mtype_t);\n-108\n-109 extern void\n-110 zCreate_Dense_Matrix(SuperMatrix *, int, int, doublecomplex *, int,\n-111 Stype_t, Dtype_t, Mtype_t);\n-112\n-113 extern int zQuerySpace (SuperMatrix *, SuperMatrix *, mem_usage_t *);\n+93 template\n+_\b9_\b4 class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+95 {\n+96\n+97 public:\n+_\b1_\b0_\b1 typedef typename std::remove_const::type _\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n+_\b1_\b0_\b5 typedef const typename std::remove_const::type _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n+106\n+107 friend class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT<_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br>;\n+108 friend class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT<_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br>;\n+109\n+110 enum {\n+112 _\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be = std::is_same::value\n+_\b1_\b1_\b3 };\n 114\n-115 extern void zPrint_CompCol_Matrix(char *, SuperMatrix *);\n-116}\n-117#endif\n-118\n-119\n-120#endif\n-121#endif\n+118 typedef typename std::conditional<_\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be && C::mutableMatrix,typename\n+Matrix::row_type::Iterator,\n+119 typename Matrix::row_type::ConstIterator>::type\n+_\b1_\b2_\b0 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+121\n+125 typedef typename std::conditional<_\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be && C::mutableMatrix,typename\n+M::block_type,\n+126 const typename M::block_type>::type\n+_\b1_\b2_\b7 _\bW_\be_\bi_\bg_\bh_\bt;\n+128\n+_\b1_\b3_\b6 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bs_\bo_\bu_\br_\bc_\be, const _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& block,\n+137 const _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\be_\bn_\bd, const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& edge);\n+138\n+_\b1_\b4_\b5 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& block);\n+146\n+151 template\n+_\b1_\b5_\b2 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\b1_\b>& other);\n+153\n+154 typedef typename std::conditional::type>::value && C::mutableMatrix,\n+155 typename M::block_type, const typename M::block_type>::type\n+_\b1_\b5_\b6 _\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be;\n+157\n+_\b1_\b6_\b1 _\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be& _\bw_\be_\bi_\bg_\bh_\bt() const;\n+162\n+_\b1_\b6_\b4 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n+165\n+_\b1_\b6_\b7 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>&\n+other) const;\n+168\n+_\b1_\b7_\b0 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::\n+type>& other) const;\n+171\n+_\b1_\b7_\b3 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>&\n+other) const;\n+174\n+_\b1_\b7_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::\n+type>& other) const;\n+177\n+_\b1_\b7_\b9 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bt_\ba_\br_\bg_\be_\bt() const;\n+180\n+_\b1_\b8_\b2 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bs_\bo_\bu_\br_\bc_\be() const;\n+183\n+_\b1_\b8_\b5 const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const;\n+186\n+_\b1_\b8_\b8 const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>() const;\n+189\n+190 private:\n+192 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br source_;\n+194 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br block_;\n+195 /***\n+196 * @brief The column iterator positioned at the end of the row\n+197 * of vertex source_\n+198 */\n+199 _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br blockEnd_;\n+201 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br edge_;\n+202 };\n+203\n+207 template\n+_\b2_\b0_\b8 class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+209 {\n+210 public:\n+_\b2_\b1_\b4 typedef typename std::remove_const::type _\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n+_\b2_\b1_\b8 typedef const typename std::remove_const::type _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n+219\n+220 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT<_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br>;\n+221 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT<_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br>;\n+222\n+223 enum {\n+225 _\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be = std::is_same::value\n+_\b2_\b2_\b6 };\n+227\n+_\b2_\b3_\b3 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(C* graph, const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& current);\n+234\n+_\b2_\b4_\b2 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& current);\n+243\n+_\b2_\b4_\b4 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>& other);\n+245\n+_\b2_\b5_\b0 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\b>& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n+251\n+_\b2_\b5_\b3 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>& other) const;\n+254\n+_\b2_\b5_\b6 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>& other) const;\n+257\n+_\b2_\b5_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>& other) const;\n+260\n+_\b2_\b6_\b2 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b>& other) const;\n+263\n+264 typedef typename std::conditional::type>::value && C::mutableMatrix,\n+265 typename M::block_type, const typename M::block_type>::type\n+_\b2_\b6_\b6 _\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be;\n+_\b2_\b6_\b8 _\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be& _\bw_\be_\bi_\bg_\bh_\bt() const;\n+269\n+_\b2_\b7_\b4 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*() const;\n+275\n+_\b2_\b8_\b1 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\b> _\bb_\be_\bg_\bi_\bn() const;\n+282\n+_\b2_\b8_\b8 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bC_\b> _\be_\bn_\bd() const;\n+289\n+290 private:\n+291 C* graph_;\n+292 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br current_;\n+293 };\n+294\n+_\b2_\b9_\b8 typedef _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> > _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+299\n+_\b3_\b0_\b3 typedef _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> > _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+304\n+_\b3_\b0_\b8 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> > _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+309\n+_\b3_\b1_\b3 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b> > _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+314\n+_\b3_\b1_\b9 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh(_\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt_\br_\bi_\bx);\n+320\n+_\b3_\b2_\b4 _\b~_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh();\n+325\n+_\b3_\b3_\b0 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn();\n+331\n+_\b3_\b3_\b6 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd();\n+337\n+_\b3_\b4_\b2 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+343\n+_\b3_\b4_\b8 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+349\n+_\b3_\b5_\b6 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source);\n+357\n+_\b3_\b6_\b4 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source);\n+365\n+366\n+_\b3_\b7_\b3 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n+374\n+_\b3_\b8_\b1 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n+382\n+_\b3_\b8_\b7 _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt_\br_\bi_\bx();\n+388\n+_\b3_\b9_\b3 const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt_\br_\bi_\bx() const;\n+394\n+_\b3_\b9_\b8 std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const;\n+399\n+_\b4_\b0_\b6 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx() const;\n+407\n+_\b4_\b1_\b1 std::size_t _\bn_\bo_\bE_\bd_\bg_\be_\bs() const;\n+412\n+_\b4_\b1_\b9 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bf_\bi_\bn_\bd_\bE_\bd_\bg_\be(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source,\n+420 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& target) const;\n+421\n+422 private:\n+424 _\bM_\ba_\bt_\br_\bi_\bx& matrix_;\n+426 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* start_;\n+428 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh(const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh&);\n+429\n+430 };\n+431\n+441 template\n+_\b4_\b4_\b2 class _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n+443 {\n+444 public:\n+_\b4_\b4_\b8 typedef G _\bG_\br_\ba_\bp_\bh;\n+449\n+_\b4_\b5_\b4 typedef T _\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd;\n+455\n+_\b4_\b5_\b9 typedef typename Graph::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+460\n+_\b4_\b6_\b1 typedef _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+462\n+_\b4_\b6_\b9 class _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+470 {\n+471 public:\n+_\b4_\b7_\b2 typedef ReadablePropertyMapTag _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n+473\n+_\b4_\b7_\b4 _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp(const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& firstEdge)\n+475 : firstEdge_(firstEdge)\n+476 {}\n+477\n+_\b4_\b7_\b9 _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp(const _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp& emap)\n+480 : firstEdge_(emap.firstEdge_)\n+481 {}\n+482\n+_\b4_\b8_\b3 std::size_t _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& edge) const\n+484 {\n+485 return edge-firstEdge_;\n+486 }\n+487 private:\n+489 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br firstEdge_;\n+491 _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp()\n+492 {}\n+493 };\n+494\n+_\b4_\b9_\b9 _\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp _\bg_\be_\bt_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp();\n+500\n+_\b5_\b0_\b4 class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br : public RandomAccessIteratorFacade\n+505 {\n+506 public:\n+_\b5_\b1_\b2 explicit _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bs_\bo_\bu_\br_\bc_\be, const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n+edge);\n+513\n+_\b5_\b2_\b1 explicit _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& edge);\n+522\n+_\b5_\b2_\b4 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) const;\n+525\n+_\b5_\b2_\b7 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+528\n+_\b5_\b3_\b0 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt();\n+531\n+_\b5_\b3_\b2 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\ba_\bd_\bv_\ba_\bn_\bc_\be(std::ptrdiff_t n);\n+533\n+_\b5_\b3_\b5 const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const;\n+536\n+_\b5_\b3_\b8 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bt_\ba_\br_\bg_\be_\bt() const;\n+539\n+_\b5_\b4_\b1 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bs_\bo_\bu_\br_\bc_\be() const;\n+542\n+_\b5_\b4_\b3 std::ptrdiff_t _\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo(const _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) const;\n+544\n+545 private:\n+547 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br source_;\n+552 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br edge_;\n+553 };\n+554\n+_\b5_\b5_\b8 class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+559 : public ForwardIteratorFacade\n+560 {\n+561 public:\n+_\b5_\b6_\b8 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\bG_\b,_\bT_\b>* graph, const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n+current,\n+569 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\be_\bn_\bd);\n+570\n+571\n+_\b5_\b7_\b8 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& current);\n+579\n+_\b5_\b8_\b1 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+582\n+_\b5_\b8_\b4 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& other) const;\n+585\n+_\b5_\b9_\b0 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const;\n+591\n+_\b5_\b9_\b7 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+598\n+_\b6_\b0_\b4 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+605\n+606 private:\n+608 const _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b<_\bG_\br_\ba_\bp_\bh_\b,_\bT_\b>* graph_;\n+610 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br current_;\n+612 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br end_;\n+613 };\n+614\n+_\b6_\b1_\b8 typedef _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+619\n+_\b6_\b2_\b3 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+624\n+_\b6_\b2_\b9 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+630\n+_\b6_\b3_\b5 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+636\n+_\b6_\b4_\b3 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n+644\n+_\b6_\b5_\b1 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n+652\n+_\b6_\b5_\b6 std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const;\n+657\n+_\b6_\b6_\b4 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx() const;\n+665\n+_\b6_\b6_\b9 std::size_t _\bn_\bo_\bE_\bd_\bg_\be_\bs() const;\n+_\b6_\b7_\b6 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bf_\bi_\bn_\bd_\bE_\bd_\bg_\be(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source,\n+677 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& target) const;\n+_\b6_\b8_\b5 _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh(const _\bG_\br_\ba_\bp_\bh& graph, const T& excluded);\n+686\n+_\b6_\b9_\b0 _\b~_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh();\n+691\n+692 private:\n+694 const T& excluded_;\n+696 std::size_t noVertices_;\n+698 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br endVertex_;\n+700 int noEdges_;\n+705 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br maxVertex_;\n+707 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* edges_;\n+709 std::ptrdiff_t* start_;\n+711 std::ptrdiff_t* end_;\n+713 _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh(const _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh&)\n+714 {}\n+715 };\n+716\n+717\n+721 template\n+_\b7_\b2_\b2 class _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n+723 {\n+724 public:\n+_\b7_\b2_\b8 typedef G _\bG_\br_\ba_\bp_\bh;\n+729\n+_\b7_\b3_\b3 typedef typename Graph::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+734\n+_\b7_\b3_\b8 typedef typename Graph::EdgeDescriptor _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+739\n+_\b7_\b4_\b3 typedef VP _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs;\n+744\n+_\b7_\b5_\b6 typedef VM _\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp;\n+757\n+_\b7_\b6_\b1 typedef typename Graph::EdgeIterator _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+762\n+_\b7_\b6_\b6 typedef typename Graph::ConstEdgeIterator _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+767\n+_\b7_\b7_\b3 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source);\n+774\n+_\b7_\b8_\b0 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source);\n+781\n+_\b7_\b8_\b7 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n+788\n+_\b7_\b9_\b4 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd_\bE_\bd_\bg_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source) const;\n+795\n+796\n+797 template\n+_\b7_\b9_\b8 class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+799 : public std::conditional::type,\n+800 C>::value,\n+801 typename Graph::VertexIterator,\n+802 typename Graph::ConstVertexIterator>::type\n+803 {\n+804 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n+805 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n+806 public:\n+810 typedef typename std::conditional::type,\n+811 C>::value,\n+812 typename Graph::VertexIterator,\n+813 typename Graph::ConstVertexIterator>::type\n+_\b8_\b1_\b4 _\bF_\ba_\bt_\bh_\be_\br;\n+815\n+819 typedef typename std::conditional::type,\n+820 C>::value,\n+821 typename Graph::EdgeIterator,\n+822 typename Graph::ConstEdgeIterator>::type\n+_\b8_\b2_\b3 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+824\n+_\b8_\b3_\b0 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter,\n+831 C* graph);\n+832\n+833\n+_\b8_\b4_\b1 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter);\n+842\n+847 template\n+_\b8_\b4_\b8 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const VertexIteratorT& other);\n+849\n+853 typename std::conditional::\n+type>::value,\n+854 VertexProperties&,\n+855 const VertexProperties&>::type\n+_\b8_\b5_\b6 _\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs() const;\n+857\n+_\b8_\b6_\b3 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+864\n+_\b8_\b7_\b0 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+871\n+872 private:\n+876 C* graph_;\n+877 };\n+878\n+882 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+884\n+888 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+890\n+_\b8_\b9_\b5 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn();\n+896\n+_\b9_\b0_\b1 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd();\n+902\n+_\b9_\b0_\b7 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+908\n+_\b9_\b1_\b3 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+914\n+_\b9_\b2_\b0 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const VertexDescriptor& vertex);\n+921\n+_\b9_\b2_\b7 const _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const VertexDescriptor& vertex)\n+const;\n+928\n+_\b9_\b3_\b3 const _\bG_\br_\ba_\bp_\bh& _\bg_\br_\ba_\bp_\bh() const;\n+934\n+_\b9_\b3_\b8 std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const;\n+939\n+_\b9_\b4_\b3 std::size_t _\bn_\bo_\bE_\bd_\bg_\be_\bs() const;\n+944\n+_\b9_\b5_\b1 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx() const;\n+952\n+_\b9_\b5_\b8 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(Graph& graph, const VertexMap vmap=VertexMap());\n+959\n+960 private:\n+961 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(const VertexPropertiesGraph&)\n+962 {}\n+963\n+965 _\bG_\br_\ba_\bp_\bh& graph_;\n+967 _\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp vmap_;\n+_\b9_\b6_\b9 std::vector vertexProperties_;\n+970\n+971 };\n+972\n+976 template\n+_\b9_\b7_\b7 class _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n+978 {\n+979 public:\n+_\b9_\b8_\b3 typedef G _\bG_\br_\ba_\bp_\bh;\n+984\n+_\b9_\b8_\b8 typedef typename Graph::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+989\n+_\b9_\b9_\b3 typedef typename Graph::EdgeDescriptor _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+994\n+_\b9_\b9_\b8 typedef VP _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs;\n+999\n+_\b1_\b0_\b1_\b1 typedef VM _\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp;\n+1012\n+_\b1_\b0_\b1_\b6 typedef EP _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs;\n+1017\n+1018\n+_\b1_\b0_\b3_\b0 typedef EM _\bE_\bd_\bg_\be_\bM_\ba_\bp;\n+1031\n+1032 template\n+_\b1_\b0_\b3_\b3 class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+1034 : public std::conditional::\n+type,\n+1035 C>::value,\n+1036 typename Graph::EdgeIterator,\n+1037 typename Graph::ConstEdgeIterator>::type\n+1038 {\n+1039\n+1040 friend class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n+1041 friend class _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n+1042 public:\n+1046 typedef typename std::conditional::type,\n+1047 C>::value,\n+1048 typename Graph::EdgeIterator,\n+1049 typename Graph::ConstEdgeIterator>::type\n+_\b1_\b0_\b5_\b0 _\bF_\ba_\bt_\bh_\be_\br;\n+1051\n+_\b1_\b0_\b5_\b7 explicit _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter,\n+1058 C* graph);\n+1059\n+_\b1_\b0_\b6_\b7 explicit _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter);\n+1068\n+1073 template\n+_\b1_\b0_\b7_\b4 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const EdgeIteratorT& other);\n+1075\n+1079 typename std::conditional::\n+type>::value,\n+1080 EdgeProperties&,\n+1081 const EdgeProperties&>::type\n+_\b1_\b0_\b8_\b2 properties() const;\n+1083\n+1084 private:\n+_\b1_\b0_\b8_\b8 C* graph_;\n+1089 };\n+1090\n+1094 typedef _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+1097\n+1101 typedef _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+1104\n+_\b1_\b1_\b1_\b0 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br beginEdges(const VertexDescriptor& source);\n+1111\n+_\b1_\b1_\b1_\b7 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endEdges(const VertexDescriptor& source);\n+1118\n+_\b1_\b1_\b2_\b4 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br beginEdges(const VertexDescriptor& source) const;\n+1125\n+_\b1_\b1_\b3_\b1 _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br endEdges(const VertexDescriptor& source) const;\n+1132\n+1133\n+1134 template\n+_\b1_\b1_\b3_\b5 class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+1136 : public std::conditional::\n+type,\n+1137 C>::value,\n+1138 typename Graph::VertexIterator,\n+1139 typename Graph::ConstVertexIterator>::type\n+1140 {\n+1141 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n+1142 friend class _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT::type>;\n+1143 public:\n+1147 typedef typename std::conditional::type,\n+1148 C>::value,\n+1149 typename Graph::VertexIterator,\n+1150 typename Graph::ConstVertexIterator>::type\n+_\b1_\b1_\b5_\b1 _\bF_\ba_\bt_\bh_\be_\br;\n+1152\n+_\b1_\b1_\b5_\b8 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter,\n+1159 C* graph);\n+1160\n+1161\n+_\b1_\b1_\b6_\b9 explicit _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const Father& iter);\n+1170\n+1175 template\n+_\b1_\b1_\b7_\b6 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT(const VertexIteratorT& other);\n+1177\n+1181 typename std::conditional::\n+type>::value,\n+1182 VertexProperties&,\n+1183 const VertexProperties&>::type\n+_\b1_\b1_\b8_\b4 properties() const;\n+1185\n+_\b1_\b1_\b9_\b1 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT begin() const;\n+1192\n+_\b1_\b1_\b9_\b8 _\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT end() const;\n+1199\n+1200 private:\n+1204 C* graph_;\n+1205 };\n+1206\n+1210 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+1213\n+1217 typedef _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT > _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+1220\n+_\b1_\b2_\b2_\b5 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br begin();\n+1226\n+_\b1_\b2_\b3_\b1 _\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end();\n+1232\n+_\b1_\b2_\b3_\b7 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br begin() const;\n+1238\n+_\b1_\b2_\b4_\b3 _\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end() const;\n+1244\n+_\b1_\b2_\b5_\b0 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& getVertexProperties(const VertexDescriptor& vertex);\n+1251\n+_\b1_\b2_\b5_\b7 const _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& getVertexProperties(const VertexDescriptor&\n+vertex) const;\n+1258\n+_\b1_\b2_\b6_\b5 _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br findEdge(const VertexDescriptor& source,\n+1266 const VertexDescriptor& target)\n+1267 {\n+1268 return graph_.findEdge(source,target);\n+1269 }\n+1270\n+_\b1_\b2_\b7_\b6 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& edge);\n+1277\n+1278\n+_\b1_\b2_\b8_\b4 const _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const _\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& edge) const;\n+1285\n+_\b1_\b2_\b9_\b2 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source,\n+1293 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& target);\n+1294\n+_\b1_\b3_\b0_\b1 const _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& source,\n+1302 const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& target) const;\n+1303\n+_\b1_\b3_\b0_\b8 const _\bG_\br_\ba_\bp_\bh& _\bg_\br_\ba_\bp_\bh() const;\n+1309\n+_\b1_\b3_\b1_\b3 std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const;\n+1314\n+_\b1_\b3_\b1_\b8 std::size_t _\bn_\bo_\bE_\bd_\bg_\be_\bs() const;\n+1319\n+_\b1_\b3_\b2_\b6 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx() const;\n+1327\n+_\b1_\b3_\b3_\b4 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(_\bG_\br_\ba_\bp_\bh& graph, const _\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp& vmap=_\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp(),\n+1335 const _\bE_\bd_\bg_\be_\bM_\ba_\bp& emap=_\bE_\bd_\bg_\be_\bM_\ba_\bp());\n+1336\n+1337 private:\n+1338 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(const _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh&)\n+1339 {}\n+1340\n+1342 Graph& graph_;\n+1345 VertexMap vmap_;\n+1346 std::vector vertexProperties_;\n+1348 EdgeMap emap_;\n+_\b1_\b3_\b5_\b0 std::vector edgeProperties_;\n+1351\n+1352 };\n+1353\n+1354\n+1359 template\n+_\b1_\b3_\b6_\b0 class _\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+1361 {\n+1362 public:\n+_\b1_\b3_\b6_\b6 typedef G _\bG_\br_\ba_\bp_\bh;\n+_\b1_\b3_\b7_\b0 typedef typename G::VertexProperties _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs;\n+_\b1_\b3_\b7_\b4 typedef typename G::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n+1375\n+_\b1_\b3_\b8_\b0 _\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br(G& g)\n+1381 : graph_(g)\n+1382 {}\n+_\b1_\b3_\b8_\b6 _\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br()\n+1387 : graph_(0)\n+1388 {}\n+1389\n+1390\n+_\b1_\b3_\b9_\b5 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bV_\be_\br_\bt_\be_\bx& vertex) const\n+1396 {\n+1397 return graph_->getVertexProperties(vertex);\n+1398 }\n+1399 private:\n+1400 Graph* graph_;\n+1401 };\n+1402\n+1407 template\n+_\b1_\b4_\b0_\b8 class _\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+1409 {\n+1410 public:\n+_\b1_\b4_\b1_\b4 typedef G _\bG_\br_\ba_\bp_\bh;\n+_\b1_\b4_\b1_\b8 typedef typename G::EdgeProperties _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs;\n+_\b1_\b4_\b2_\b2 typedef typename G::EdgeDescriptor _\bE_\bd_\bg_\be;\n+1423\n+_\b1_\b4_\b2_\b8 _\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br(G& g)\n+1429 : graph_(g)\n+1430 {}\n+_\b1_\b4_\b3_\b4 _\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br()\n+1435 : graph_(0)\n+1436 {}\n+1437\n+_\b1_\b4_\b4_\b2 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bE_\bd_\bg_\be& edge) const\n+1443 {\n+1444 return graph_->getEdgeProperties(edge);\n+1445 }\n+1446 private:\n+1447 Graph* graph_;\n+1448 };\n+1449\n+1450\n+1461 template\n+_\b1_\b4_\b6_\b2 int _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(const G& graph, const typename G::VertexDescriptor&\n+vertex,\n+1463 V& visitor);\n+1464\n+1465#ifndef DOXYGEN\n+1466\n+1467 template\n+1468 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh(M& matrix)\n+1469 : matrix_(matrix)\n+1470 {\n+1471 if(matrix_.N()!=matrix_.M())\n+1472 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Matrix has to have as many columns as rows!\");\n+1473\n+1474 start_ = new EdgeDescriptor[matrix_.N()+1];\n+1475\n+1476 typedef typename M::ConstIterator Iterator;\n+1477 start_[matrix_.begin().index()] = 0;\n+1478\n+1479 for(Iterator row=matrix_.begin(); row != matrix_.end(); ++row)\n+1480 start_[row.index()+1] = start_[row.index()] + row->size();\n+1481 }\n+1482\n+1483 template\n+1484 MatrixGraph::~MatrixGraph()\n+1485 {\n+1486 delete[] start_;\n+1487 }\n+1488\n+1489 template\n+1490 inline std::size_t MatrixGraph::noEdges() const\n+1491 {\n+1492 return start_[matrix_.N()];\n+1493 }\n+1494\n+1495 template\n+1496 inline std::size_t MatrixGraph::noVertices() const\n+1497 {\n+1498 return matrix_.N();\n+1499 }\n+1500\n+1501 template\n+1502 inline typename MatrixGraph::VertexDescriptor MatrixGraph::maxVertex\n+() const\n+1503 {\n+1504 return matrix_.N()-1;\n+1505 }\n+1506\n+1507 template\n+1508 typename MatrixGraph::EdgeDescriptor\n+1509 MatrixGraph::findEdge(const VertexDescriptor& source,\n+1510 const VertexDescriptor& target) const\n+1511 {\n+1512 typename M::ConstColIterator found =matrix_[source].find(target);\n+1513 if(found == matrix_[source].end())\n+1514 return std::numeric_limits::max();\n+1515 std::size_t offset = found.offset();\n+1516 if(target>source)\n+1517 offset--;\n+1518\n+1519 assert(offset\n+1526 inline M& MatrixGraph::matrix()\n+1527 {\n+1528 return matrix_;\n+1529 }\n+1530\n+1531 template\n+1532 inline const M& MatrixGraph::matrix() const\n+1533 {\n+1534 return matrix_;\n+1535 }\n+1536\n+1537 template\n+1538 template\n+1539 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const VertexDescriptor&\n+source, const ColIterator& block,\n+1540 const ColIterator& end, const EdgeDescriptor& edge)\n+1541 : source_(source), block_(block), blockEnd_(end), edge_(edge)\n+1542 {\n+1543 if(block_!=blockEnd_ && block_.index() == source_) {\n+1544 // This is the edge from the diagonal to the diagonal. Skip it.\n+1545 ++block_;\n+1546 }\n+1547 }\n+1548\n+1549 template\n+1550 template\n+1551 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const ColIterator& block)\n+1552 : block_(block)\n+1553 {}\n+1554\n+1555 template\n+1556 template\n+1557 template\n+1558 MatrixGraph::EdgeIteratorT::EdgeIteratorT(const EdgeIteratorT&\n+other)\n+1559 : source_(other.source_), block_(other.block_), blockEnd_\n+(other.blockEnd_), edge_(other.edge_)\n+1560 {}\n+1561\n+1562\n+1563 template\n+1564 template\n+1565 inline typename MatrixGraph::template EdgeIteratorT::WeightType&\n+1566 MatrixGraph::EdgeIteratorT::weight() const\n+1567 {\n+1568 return *block_;\n+1569 }\n+1570\n+1571 template\n+1572 template\n+1573 inline typename MatrixGraph::template EdgeIteratorT&\n+MatrixGraph::EdgeIteratorT::operator++()\n+1574 {\n+1575 ++block_;\n+1576 ++edge_;\n+1577\n+1578 if(block_!=blockEnd_ && block_.index() == source_) {\n+1579 // This is the edge from the diagonal to the diagonal. Skip it.\n+1580 ++block_;\n+1581 }\n+1582\n+1583 return *this;\n+1584 }\n+1585\n+1586 template\n+1587 template\n+1588 inline bool MatrixGraph::EdgeIteratorT::operator!=(const typename\n+MatrixGraph::template EdgeIteratorT::type>&\n+other) const\n+1589 {\n+1590 return block_!=other.block_;\n+1591 }\n+1592\n+1593 template\n+1594 template\n+1595 inline bool MatrixGraph::EdgeIteratorT::operator!=(const typename\n+MatrixGraph::template EdgeIteratorT::\n+type>& other) const\n+1596 {\n+1597 return block_!=other.block_;\n+1598 }\n+1599\n+1600 template\n+1601 template\n+1602 inline bool MatrixGraph::EdgeIteratorT::operator==(const typename\n+MatrixGraph::template EdgeIteratorT::type>&\n+other) const\n+1603 {\n+1604 return block_==other.block_;\n+1605 }\n+1606\n+1607 template\n+1608 template\n+1609 inline bool MatrixGraph::EdgeIteratorT::operator==(const typename\n+MatrixGraph::template EdgeIteratorT::\n+type>& other) const\n+1610 {\n+1611 return block_==other.block_;\n+1612 }\n+1613\n+1614 template\n+1615 template\n+1616 inline typename MatrixGraph::VertexDescriptor MatrixGraph::\n+EdgeIteratorT::target() const\n+1617 {\n+1618 return block_.index();\n+1619 }\n+1620\n+1621 template\n+1622 template\n+1623 inline typename MatrixGraph::VertexDescriptor MatrixGraph::\n+EdgeIteratorT::source() const\n+1624 {\n+1625 return source_;\n+1626 }\n+1627\n+1628 template\n+1629 template\n+1630 inline const typename MatrixGraph::EdgeDescriptor& MatrixGraph::\n+EdgeIteratorT::operator*() const\n+1631 {\n+1632 return edge_;\n+1633 }\n+1634\n+1635 template\n+1636 template\n+1637 inline const typename MatrixGraph::EdgeDescriptor* MatrixGraph::\n+EdgeIteratorT::operator->() const\n+1638 {\n+1639 return &edge_;\n+1640 }\n+1641\n+1642 template\n+1643 template\n+1644 MatrixGraph::VertexIteratorT::VertexIteratorT(C* graph,\n+1645 const VertexDescriptor& current)\n+1646 : graph_(graph), current_(current)\n+1647 {}\n+1648\n+1649\n+1650 template\n+1651 template\n+1652 MatrixGraph::VertexIteratorT::VertexIteratorT(const\n+VertexDescriptor& current)\n+1653 : current_(current)\n+1654 {}\n+1655\n+1656 template\n+1657 template\n+1658 MatrixGraph::VertexIteratorT::VertexIteratorT(const\n+VertexIteratorT& other)\n+1659 : graph_(other.graph_), current_(other.current_)\n+1660 {}\n+1661\n+1662 template\n+1663 template\n+1664 inline bool MatrixGraph::VertexIteratorT::operator!=(const\n+VertexIteratorT& other) const\n+1665 {\n+1666 return current_ != other.current_;\n+1667 }\n+1668\n+1669 template\n+1670 template\n+1671 inline bool MatrixGraph::VertexIteratorT::operator!=(const\n+VertexIteratorT& other) const\n+1672 {\n+1673 return current_ != other.current_;\n+1674 }\n+1675\n+1676\n+1677 template\n+1678 template\n+1679 inline bool MatrixGraph::VertexIteratorT::operator==(const\n+VertexIteratorT& other) const\n+1680 {\n+1681 return current_ == other.current_;\n+1682 }\n+1683\n+1684 template\n+1685 template\n+1686 inline bool MatrixGraph::VertexIteratorT::operator==(const\n+VertexIteratorT& other) const\n+1687 {\n+1688 return current_ == other.current_;\n+1689 }\n+1690\n+1691 template\n+1692 template\n+1693 inline typename MatrixGraph::template VertexIteratorT&\n+MatrixGraph::VertexIteratorT::operator++()\n+1694 {\n+1695 ++current_;\n+1696 return *this;\n+1697 }\n+1698\n+1699 template\n+1700 template\n+1701 inline typename MatrixGraph::template VertexIteratorT::WeightType&\n+1702 MatrixGraph::VertexIteratorT::weight() const\n+1703 {\n+1704 return graph_->matrix()[current_][current_];\n+1705 }\n+1706\n+1707 template\n+1708 template\n+1709 inline const typename MatrixGraph::VertexDescriptor&\n+1710 MatrixGraph::VertexIteratorT::operator*() const\n+1711 {\n+1712 return current_;\n+1713 }\n+1714\n+1715 template\n+1716 template\n+1717 inline typename MatrixGraph::template EdgeIteratorT\n+1718 MatrixGraph::VertexIteratorT::begin() const\n+1719 {\n+1720 return graph_->beginEdges(current_);\n+1721 }\n+1722\n+1723 template\n+1724 template\n+1725 inline typename MatrixGraph::template EdgeIteratorT\n+1726 MatrixGraph::VertexIteratorT::end() const\n+1727 {\n+1728 return graph_->endEdges(current_);\n+1729 }\n+1730\n+1731 template\n+1732 inline typename MatrixGraph::template VertexIteratorT >\n+1733 MatrixGraph::begin()\n+1734 {\n+1735 return VertexIterator(this,0);\n+1736 }\n+1737\n+1738 template\n+1739 inline typename MatrixGraph::template VertexIteratorT >\n+1740 MatrixGraph::end()\n+1741 {\n+1742 return VertexIterator(matrix_.N());\n+1743 }\n+1744\n+1745\n+1746 template\n+1747 inline typename MatrixGraph::template VertexIteratorT >\n+1748 MatrixGraph::begin() const\n+1749 {\n+1750 return ConstVertexIterator(this, 0);\n+1751 }\n+1752\n+1753 template\n+1754 inline typename MatrixGraph::template VertexIteratorT >\n+1755 MatrixGraph::end() const\n+1756 {\n+1757 return ConstVertexIterator(matrix_.N());\n+1758 }\n+1759\n+1760 template\n+1761 inline typename MatrixGraph::template EdgeIteratorT >\n+1762 MatrixGraph::beginEdges(const VertexDescriptor& source)\n+1763 {\n+1764 return EdgeIterator(source, matrix_.operator[](source).begin(),\n+1765 matrix_.operator[](source).end(), start_[source]);\n+1766 }\n+1767\n+1768 template\n+1769 inline typename MatrixGraph::template EdgeIteratorT >\n+1770 MatrixGraph::endEdges(const VertexDescriptor& source)\n+1771 {\n+1772 return EdgeIterator(matrix_.operator[](source).end());\n+1773 }\n+1774\n+1775\n+1776 template\n+1777 inline typename MatrixGraph::template EdgeIteratorT >\n+1778 MatrixGraph::beginEdges(const VertexDescriptor& source) const\n+1779 {\n+1780 return ConstEdgeIterator(source, matrix_.operator[](source).begin(),\n+1781 matrix_.operator[](source).end(), start_[source]);\n+1782 }\n+1783\n+1784 template\n+1785 inline typename MatrixGraph::template EdgeIteratorT >\n+1786 MatrixGraph::endEdges(const VertexDescriptor& source) const\n+1787 {\n+1788 return ConstEdgeIterator(matrix_.operator[](source).end());\n+1789 }\n+1790\n+1791\n+1792 template\n+1793 SubGraph::EdgeIterator::EdgeIterator(const VertexDescriptor& source,\n+1794 const EdgeDescriptor& edge)\n+1795 : source_(source), edge_(edge)\n+1796 {}\n+1797\n+1798\n+1799 template\n+1800 SubGraph::EdgeIterator::EdgeIterator(const EdgeDescriptor& edge)\n+1801 : edge_(edge)\n+1802 {}\n+1803\n+1804 template\n+1805 typename SubGraph::EdgeIndexMap SubGraph::getEdgeIndexMap()\n+1806 {\n+1807 return EdgeIndexMap(edges_);\n+1808 }\n+1809\n+1810 template\n+1811 inline bool SubGraph::EdgeIterator::equals(const EdgeIterator &\n+other) const\n+1812 {\n+1813 return other.edge_==edge_;\n+1814 }\n+1815\n+1816 template\n+1817 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator::\n+increment()\n+1818 {\n+1819 ++edge_;\n+1820 return *this;\n+1821 }\n+1822\n+1823 template\n+1824 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator::\n+decrement()\n+1825 {\n+1826 --edge_;\n+1827 return *this;\n+1828 }\n+1829\n+1830 template\n+1831 inline typename SubGraph::EdgeIterator& SubGraph::EdgeIterator::\n+advance(std::ptrdiff_t n)\n+1832 {\n+1833 edge_+=n;\n+1834 return *this;\n+1835 }\n+1836 template\n+1837 inline const typename G::VertexDescriptor& SubGraph::EdgeIterator::\n+source() const\n+1838 {\n+1839 return source_;\n+1840 }\n+1841\n+1842 template\n+1843 inline const typename G::VertexDescriptor& SubGraph::EdgeIterator::\n+target() const\n+1844 {\n+1845 return *edge_;\n+1846 }\n+1847\n+1848\n+1849 template\n+1850 inline const typename SubGraph::EdgeDescriptor& SubGraph::\n+EdgeIterator::dereference() const\n+1851 {\n+1852 return edge_;\n+1853 }\n+1854\n+1855 template\n+1856 inline std::ptrdiff_t SubGraph::EdgeIterator::distanceTo(const\n+EdgeIterator & other) const\n+1857 {\n+1858 return other.edge_-edge_;\n+1859 }\n+1860\n+1861 template\n+1862 SubGraph::VertexIterator::VertexIterator(const SubGraph* graph,\n+1863 const VertexDescriptor& current,\n+1864 const VertexDescriptor& end)\n+1865 : graph_(graph), current_(current), end_(end)\n+1866 {\n+1867 // Skip excluded vertices\n+1868 typedef typename T::const_iterator Iterator;\n+1869\n+1870 for(Iterator vertex = graph_->excluded_.begin();\n+1871 current_ != end_ && *vertex;\n+1872 ++vertex)\n+1873 ++current_;\n+1874 assert(current_ == end_ || !graph_->excluded_[current_]);\n+1875 }\n+1876\n+1877 template\n+1878 SubGraph::VertexIterator::VertexIterator(const VertexDescriptor&\n+current)\n+1879 : current_(current)\n+1880 {}\n+1881\n+1882 template\n+1883 inline typename SubGraph::VertexIterator& SubGraph::\n+VertexIterator::increment()\n+1884 {\n+1885 ++current_;\n+1886 //Skip excluded vertices\n+1887 while(current_ != end_ && graph_->excluded_[current_])\n+1888 ++current_;\n+1889\n+1890 assert(current_ == end_ || !graph_->excluded_[current_]);\n+1891 return *this;\n+1892 }\n+1893\n+1894 template\n+1895 inline bool SubGraph::VertexIterator::equals(const VertexIterator &\n+other) const\n+1896 {\n+1897 return current_==other.current_;\n+1898 }\n+1899\n+1900 template\n+1901 inline const typename G::VertexDescriptor& SubGraph::VertexIterator::\n+dereference() const\n+1902 {\n+1903 return current_;\n+1904 }\n+1905\n+1906 template\n+1907 inline typename SubGraph::EdgeIterator SubGraph::\n+VertexIterator::begin() const\n+1908 {\n+1909 return graph_->beginEdges(current_);\n+1910 }\n+1911\n+1912 template\n+1913 inline typename SubGraph::EdgeIterator SubGraph::\n+VertexIterator::end() const\n+1914 {\n+1915 return graph_->endEdges(current_);\n+1916 }\n+1917\n+1918 template\n+1919 inline typename SubGraph::VertexIterator SubGraph::begin() const\n+1920 {\n+1921 return VertexIterator(this, 0, endVertex_);\n+1922 }\n+1923\n+1924\n+1925 template\n+1926 inline typename SubGraph::VertexIterator SubGraph::end() const\n+1927 {\n+1928 return VertexIterator(endVertex_);\n+1929 }\n+1930\n+1931\n+1932 template\n+1933 inline typename SubGraph::EdgeIterator SubGraph::beginEdges\n+(const VertexDescriptor& source) const\n+1934 {\n+1935 return EdgeIterator(source, edges_+start_[source]);\n+1936 }\n+1937\n+1938 template\n+1939 inline typename SubGraph::EdgeIterator SubGraph::endEdges(const\n+VertexDescriptor& source) const\n+1940 {\n+1941 return EdgeIterator(edges_+end_[source]);\n+1942 }\n+1943\n+1944 template\n+1945 std::size_t SubGraph::noVertices() const\n+1946 {\n+1947 return noVertices_;\n+1948 }\n+1949\n+1950 template\n+1951 inline typename SubGraph::VertexDescriptor SubGraph::maxVertex()\n+const\n+1952 {\n+1953 return maxVertex_;\n+1954 }\n+1955\n+1956 template\n+1957 inline std::size_t SubGraph::noEdges() const\n+1958 {\n+1959 return noEdges_;\n+1960 }\n+1961\n+1962 template\n+1963 inline typename SubGraph::EdgeDescriptor SubGraph::findEdge\n+(const VertexDescriptor& source,\n+1964 const VertexDescriptor& target) const\n+1965 {\n+1966 const EdgeDescriptor edge = std::lower_bound(edges_+start_[source],\n+edges_+end_[source], target);\n+1967 if(edge==edges_+end_[source] || *edge!=target)\n+1968 return std::numeric_limits::max();\n+1969\n+1970 return edge;\n+1971 }\n+1972\n+1973 template\n+1974 SubGraph::~SubGraph()\n+1975 {\n+1976 delete[] edges_;\n+1977 delete[] end_;\n+1978 delete[] start_;\n+1979 }\n+1980\n+1981 template\n+1982 SubGraph::SubGraph(const G& graph, const T& excluded)\n+1983 : excluded_(excluded), noVertices_(0), endVertex_(0), maxVertex_\n+(graph.maxVertex())\n+1984 {\n+1985 start_ = new std::ptrdiff_t[graph.noVertices()];\n+1986 end_ = new std::ptrdiff_t[graph.noVertices()];\n+1987 edges_ = new VertexDescriptor[graph.noEdges()];\n+1988\n+1989 VertexDescriptor* edge=edges_;\n+1990\n+1991 // Cater for the case that there are no vertices.\n+1992 // Otherwise endVertex_ will get 1 below.\n+1993 if ( graph.noVertices() == 0)\n+1994 return;\n+1995\n+1996 typedef typename Graph::ConstVertexIterator Iterator;\n+1997 Iterator endVertex=graph.end();\n+1998\n+1999 for(Iterator vertex = graph.begin(); vertex != endVertex; ++vertex)\n+2000 if(excluded_[*vertex])\n+2001 start_[*vertex]=end_[*vertex]=-1;\n+2002 else{\n+2003 ++noVertices_;\n+2004 endVertex_ = std::max(*vertex, endVertex_);\n+2005\n+2006 start_[*vertex] = edge-edges_;\n+2007\n+2008 auto endEdge = vertex.end();\n+2009\n+2010 for(auto iter=vertex.begin(); iter!= endEdge; ++iter)\n+2011 if(!excluded[iter.target()]) {\n+2012 *edge = iter.target();\n+2013 ++edge;\n+2014 }\n+2015\n+2016 end_[*vertex] = edge - edges_;\n+2017\n+2018 // Sort the edges\n+2019 std::sort(edges_+start_[*vertex], edge);\n+2020 }\n+2021 noEdges_ = edge-edges_;\n+2022 ++endVertex_;\n+2023 }\n+2024\n+2025 template\n+2026 inline std::size_t VertexPropertiesGraph::noEdges() const\n+2027 {\n+2028 return graph_.noEdges();\n+2029 }\n+2030\n+2031 template\n+2032 inline typename VertexPropertiesGraph::EdgeIterator\n+2033 VertexPropertiesGraph::beginEdges(const VertexDescriptor& source)\n+2034 {\n+2035 return graph_.beginEdges(source);\n+2036 }\n+2037\n+2038 template\n+2039 inline typename VertexPropertiesGraph::EdgeIterator\n+2040 VertexPropertiesGraph::endEdges(const VertexDescriptor& source)\n+2041 {\n+2042 return graph_.endEdges(source);\n+2043 }\n+2044\n+2045 template\n+2046 typename VertexPropertiesGraph::ConstEdgeIterator\n+2047 inline VertexPropertiesGraph::beginEdges(const VertexDescriptor&\n+source) const\n+2048 {\n+2049 return graph_.beginEdges(source);\n+2050 }\n+2051\n+2052 template\n+2053 typename VertexPropertiesGraph::ConstEdgeIterator\n+2054 VertexPropertiesGraph::endEdges(const VertexDescriptor& source)\n+const\n+2055 {\n+2056 return graph_.endEdges(source);\n+2057 }\n+2058\n+2059 template\n+2060 template\n+2061 VertexPropertiesGraph::VertexIteratorT\n+2062 ::VertexIteratorT(const Father& iter,\n+2063 C* graph)\n+2064 : Father(iter), graph_(graph)\n+2065 {}\n+2066\n+2067 template\n+2068 template\n+2069 VertexPropertiesGraph::VertexIteratorT\n+2070 ::VertexIteratorT(const Father& iter)\n+2071 : Father(iter)\n+2072 {}\n+2073\n+2074 template\n+2075 template\n+2076 template\n+2077 VertexPropertiesGraph::VertexIteratorT\n+2078 ::VertexIteratorT(const VertexIteratorT& other)\n+2079 : Father(other), graph_(other.graph_)\n+2080 {}\n+2081\n+2082 template\n+2083 template\n+2084 typename std::conditional::\n+type>::value,\n+2085 V&, const V&>::type\n+2086 inline VertexPropertiesGraph::VertexIteratorT::properties()\n+const\n+2087 {\n+2088 return graph_->getVertexProperties(Father::operator*());\n+2089 }\n+2090\n+2091 template\n+2092 template\n+2093 typename std::conditional::\n+type,\n+2094 C>::value,\n+2095 typename G::EdgeIterator,\n+2096 typename G::ConstEdgeIterator>::type\n+2097 inline VertexPropertiesGraph::VertexIteratorT::begin() const\n+2098 {\n+2099 return graph_->beginEdges(Father::operator*());\n+2100 }\n+2101\n+2102 template\n+2103 template\n+2104 typename std::conditional::\n+type,\n+2105 C>::value,\n+2106 typename G::EdgeIterator,\n+2107 typename G::ConstEdgeIterator>::type\n+2108 inline VertexPropertiesGraph::VertexIteratorT::end() const\n+2109 {\n+2110 return graph_->endEdges(Father::operator*());\n+2111 }\n+2112\n+2113 template\n+2114 inline typename VertexPropertiesGraph::VertexIterator\n+VertexPropertiesGraph::begin()\n+2115 {\n+2116 return VertexIterator(graph_.begin(), this);\n+2117 }\n+2118\n+2119 template\n+2120 inline typename VertexPropertiesGraph::VertexIterator\n+VertexPropertiesGraph::end()\n+2121 {\n+2122 return VertexIterator(graph_.end());\n+2123 }\n+2124\n+2125\n+2126 template\n+2127 inline typename VertexPropertiesGraph::ConstVertexIterator\n+VertexPropertiesGraph::begin() const\n+2128 {\n+2129 return ConstVertexIterator(graph_.begin(), this);\n+2130 }\n+2131\n+2132 template\n+2133 inline typename VertexPropertiesGraph::ConstVertexIterator\n+VertexPropertiesGraph::end() const\n+2134 {\n+2135 return ConstVertexIterator(graph_.end());\n+2136 }\n+2137\n+2138 template\n+2139 inline V& VertexPropertiesGraph::getVertexProperties(const\n+VertexDescriptor& vertex)\n+2140 {\n+2141 return vertexProperties_[vmap_[vertex]];\n+2142 }\n+2143\n+2144 template\n+2145 inline const V& VertexPropertiesGraph::getVertexProperties(const\n+VertexDescriptor& vertex) const\n+2146 {\n+2147 return vertexProperties_[vmap_[vertex]];\n+2148 }\n+2149\n+2150 template\n+2151 inline const G& VertexPropertiesGraph::graph() const\n+2152 {\n+2153 return graph_;\n+2154 }\n+2155\n+2156 template\n+2157 inline std::size_t VertexPropertiesGraph::noVertices() const\n+2158 {\n+2159 return graph_.noVertices();\n+2160 }\n+2161\n+2162\n+2163 template\n+2164 inline typename VertexPropertiesGraph::VertexDescriptor\n+VertexPropertiesGraph::maxVertex() const\n+2165 {\n+2166 return graph_.maxVertex();\n+2167 }\n+2168\n+2169 template\n+2170 VertexPropertiesGraph::VertexPropertiesGraph(Graph& graph, const\n+VM vmap)\n+2171 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex\n+()+1], V())\n+2172 {}\n+2173\n+2174 template\n+2175 template\n+2176 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const\n+Father& iter,\n+2177 C* graph)\n+2178 : Father(iter), graph_(graph)\n+2179 {}\n+2180\n+2181 template\n+2182 template\n+2183 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const\n+Father& iter)\n+2184 : Father(iter)\n+2185 {}\n+2186\n+2187 template\n+2188 template\n+2189 template\n+2190 PropertiesGraph::EdgeIteratorT::EdgeIteratorT(const\n+EdgeIteratorT& other)\n+2191 : Father(other), graph_(other.graph_)\n+2192 {}\n+2193\n+2194\n+2195 template\n+2196 inline std::size_t PropertiesGraph::noEdges() const\n+2197 {\n+2198 return graph_.noEdges();\n+2199 }\n+2200\n+2201 template\n+2202 template\n+2203 inline typename std::conditional::type>::value,E&,const E&>::type\n+2204 PropertiesGraph::EdgeIteratorT::properties() const\n+2205 {\n+2206 return graph_->getEdgeProperties(Father::operator*());\n+2207 }\n+2208\n+2209 template\n+2210 inline typename PropertiesGraph::EdgeIterator\n+2211 PropertiesGraph::beginEdges(const VertexDescriptor& source)\n+2212 {\n+2213 return EdgeIterator(graph_.beginEdges(source), this);\n+2214 }\n+2215\n+2216 template\n+2217 inline typename PropertiesGraph::EdgeIterator\n+2218 PropertiesGraph::endEdges(const VertexDescriptor& source)\n+2219 {\n+2220 return EdgeIterator(graph_.endEdges(source));\n+2221 }\n+2222\n+2223 template\n+2224 typename PropertiesGraph::ConstEdgeIterator\n+2225 inline PropertiesGraph::beginEdges(const VertexDescriptor&\n+source) const\n+2226 {\n+2227 return ConstEdgeIterator(graph_.beginEdges(source), this);\n+2228 }\n+2229\n+2230 template\n+2231 typename PropertiesGraph::ConstEdgeIterator\n+2232 PropertiesGraph::endEdges(const VertexDescriptor& source)\n+const\n+2233 {\n+2234 return ConstEdgeIterator(graph_.endEdges(source));\n+2235 }\n+2236\n+2237 template\n+2238 template\n+2239 PropertiesGraph::VertexIteratorT\n+2240 ::VertexIteratorT(const Father& iter,\n+2241 C* graph)\n+2242 : Father(iter), graph_(graph)\n+2243 {}\n+2244\n+2245 template\n+2246 template\n+2247 PropertiesGraph::VertexIteratorT\n+2248 ::VertexIteratorT(const Father& iter)\n+2249 : Father(iter)\n+2250 {}\n+2251\n+2252 template\n+2253 template\n+2254 template\n+2255 PropertiesGraph::VertexIteratorT\n+2256 ::VertexIteratorT(const VertexIteratorT& other)\n+2257 : Father(other), graph_(other.graph_)\n+2258 {}\n+2259\n+2260 template\n+2261 template\n+2262 inline typename std::conditional::type>::value,\n+2263 V&, const V&>::type\n+2264 PropertiesGraph::VertexIteratorT::properties() const\n+2265 {\n+2266 return graph_->getVertexProperties(Father::operator*());\n+2267 }\n+2268\n+2269 template\n+2270 template\n+2271 inline typename PropertiesGraph::template EdgeIteratorT\n+2272 PropertiesGraph::VertexIteratorT::begin() const\n+2273 {\n+2274 return graph_->beginEdges(Father::operator*());\n+2275 }\n+2276\n+2277 template\n+2278 template\n+2279 inline typename PropertiesGraph::template EdgeIteratorT\n+2280 PropertiesGraph::VertexIteratorT::end() const\n+2281 {\n+2282 return graph_->endEdges(Father::operator*());\n+2283 }\n+2284\n+2285 template\n+2286 inline typename PropertiesGraph::VertexIterator\n+PropertiesGraph::begin()\n+2287 {\n+2288 return VertexIterator(graph_.begin(), this);\n+2289 }\n+2290\n+2291 template\n+2292 inline typename PropertiesGraph::VertexIterator\n+PropertiesGraph::end()\n+2293 {\n+2294 return VertexIterator(graph_.end());\n+2295 }\n+2296\n+2297\n+2298 template\n+2299 inline typename PropertiesGraph::ConstVertexIterator\n+PropertiesGraph::begin() const\n+2300 {\n+2301 return ConstVertexIterator(graph_.begin(), this);\n+2302 }\n+2303\n+2304 template\n+2305 inline typename PropertiesGraph::ConstVertexIterator\n+PropertiesGraph::end() const\n+2306 {\n+2307 return ConstVertexIterator(graph_.end());\n+2308 }\n+2309\n+2310 template\n+2311 inline V& PropertiesGraph::getVertexProperties(const\n+VertexDescriptor& vertex)\n+2312 {\n+2313 return vertexProperties_[vmap_[vertex]];\n+2314 }\n+2315\n+2316 template\n+2317 inline const V& PropertiesGraph::getVertexProperties(const\n+VertexDescriptor& vertex) const\n+2318 {\n+2319 return vertexProperties_[vmap_[vertex]];\n+2320 }\n+2321\n+2322 template\n+2323 inline E& PropertiesGraph::getEdgeProperties(const\n+EdgeDescriptor& edge)\n+2324 {\n+2325 return edgeProperties_[emap_[edge]];\n+2326 }\n+2327\n+2328 template\n+2329 inline const E& PropertiesGraph::getEdgeProperties(const\n+EdgeDescriptor& edge) const\n+2330 {\n+2331 return edgeProperties_[emap_[edge]];\n+2332 }\n+2333\n+2334 template\n+2335 inline E& PropertiesGraph::getEdgeProperties(const\n+VertexDescriptor& source,\n+2336 const VertexDescriptor& target)\n+2337 {\n+2338 return getEdgeProperties(graph_.findEdge(source,target));\n+2339 }\n+2340\n+2341 template\n+2342 inline const E& PropertiesGraph::getEdgeProperties(const\n+VertexDescriptor& source,\n+2343 const VertexDescriptor& target) const\n+2344 {\n+2345 return getEdgeProperties(graph_.findEdge(source,target));\n+2346 }\n+2347\n+2348 template\n+2349 inline const G& PropertiesGraph::graph() const\n+2350 {\n+2351 return graph_;\n+2352 }\n+2353\n+2354 template\n+2355 inline std::size_t PropertiesGraph::noVertices() const\n+2356 {\n+2357 return graph_.noVertices();\n+2358 }\n+2359\n+2360\n+2361 template\n+2362 inline typename PropertiesGraph::VertexDescriptor\n+PropertiesGraph::maxVertex() const\n+2363 {\n+2364 return graph_.maxVertex();\n+2365 }\n+2366\n+2367 template\n+2368 PropertiesGraph::PropertiesGraph(Graph& graph, const VM&\n+vmap, const EM& emap)\n+2369 : graph_(graph), vmap_(vmap), vertexProperties_(vmap_[graph_.maxVertex\n+()+1], V()),\n+2370 emap_(emap), edgeProperties_(graph_.noEdges(), E())\n+2371 {}\n+2372\n+2373 template\n+2374 inline int _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(const G& graph, const typename G::\n+VertexDescriptor& vertex,\n+2375 V& visitor)\n+2376 {\n+2377 typedef typename G::ConstEdgeIterator iterator;\n+2378 const iterator end = graph.endEdges(vertex);\n+2379 int noNeighbours=0;\n+2380 for(iterator edge = graph.beginEdges(vertex); edge != end; ++edge,\n+++noNeighbours)\n+2381 visitor(edge);\n+2382 return noNeighbours;\n+2383 }\n+2384\n+2385#endif // DOXYGEN\n+2386\n+2388 }\n+2389}\n+2390#endif\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n+int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex,\n+V &visitor)\n+Visit all neighbour vertices of a vertex in a graph.\n+_\bs_\bt_\bd\n+STL namespace.\n+_\bD_\bu_\bn_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+derive error class from the base class in common\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+The (undirected) graph of a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+MatrixGraph(Matrix &matrix)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd\n+VertexIterator end()\n+Get an iterator over the vertices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx\n+VertexDescriptor maxVertex() const\n+Get the maximal vertex descriptor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+M Matrix\n+The type of the matrix we are a graph for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+ConstVertexIterator begin() const\n+Get an iterator over the vertices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+VertexIteratorT< const MatrixGraph< Matrix > > ConstVertexIterator\n+The constant vertex iterator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:308\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\b~_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+~MatrixGraph()\n+Destructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+std::ptrdiff_t EdgeDescriptor\n+The edge descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd_\bE_\bd_\bg_\be_\bs\n+ConstEdgeIterator endEdges(const VertexDescriptor &source) const\n+Get an iterator over the edges starting at a vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+M::size_type VertexDescriptor\n+The vertex descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n+const Matrix & matrix() const\n+Get the underlying matrix.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\bu_\bt_\ba_\bb_\bl_\be_\bM_\ba_\bt_\br_\bi_\bx\n+@ mutableMatrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:86\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs\n+ConstEdgeIterator beginEdges(const VertexDescriptor &source) const\n+Get an iterator over the edges starting at a vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd\n+ConstVertexIterator end() const\n+Get an iterator over the vertices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator\n+The constant edge iterator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:298\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs\n+EdgeIterator beginEdges(const VertexDescriptor &source)\n+Get an iterator over the edges starting at a vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n+std::size_t noVertices() const\n+Get the number of vertices in the graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bf_\bi_\bn_\bd_\bE_\bd_\bg_\be\n+EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor\n+&target) const\n+Find the descriptor of an edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bW_\be_\bi_\bg_\bh_\bt\n+M::block_type Weight\n+The type of the weights.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bM_\ba_\bt_\br_\bi_\bx\n+std::remove_const< M >::type MutableMatrix\n+The mutable type of the matrix we are a graph for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+EdgeIteratorT< MatrixGraph< Matrix > > EdgeIterator\n+The mutable edge iterator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:303\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+VertexIteratorT< MatrixGraph< Matrix > > VertexIterator\n+The mutable vertex iterator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:313\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd_\bE_\bd_\bg_\be_\bs\n+EdgeIterator endEdges(const VertexDescriptor &source)\n+Get an iterator over the edges starting at a vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bE_\bd_\bg_\be_\bs\n+std::size_t noEdges() const\n+Get the number of edges in the graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n+Matrix & matrix()\n+Get the underlying matrix.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+VertexIterator begin()\n+Get an iterator over the vertices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+Iterator over all edges starting from a vertex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be\n+std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::\n+value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >::\n+type WeightType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:156\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+EdgeIteratorT(const VertexDescriptor &source, const ColIterator &block, const\n+ColIterator &end, const EdgeDescriptor &edge)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be\n+@ isMutable\n+whether C is mutable.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:112\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bt_\ba_\br_\bg_\be_\bt\n+VertexDescriptor target() const\n+The index of the target vertex of the current edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+EdgeIteratorT< C > & operator++()\n+preincrement operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const EdgeIteratorT< const typename std::remove_const< C >::\n+type > &other) const\n+Inequality operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const EdgeIteratorT< const typename std::remove_const< C >::\n+type > &other) const\n+Equality operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+EdgeIteratorT(const EdgeIteratorT< C1 > &other)\n+Copy Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const EdgeIteratorT< typename std::remove_const< C >::type >\n+&other) const\n+Inequality operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bw_\be_\bi_\bg_\bh_\bt\n+WeightType & weight() const\n+Access the edge weight.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bs_\bo_\bu_\br_\bc_\be\n+VertexDescriptor source() const\n+The index of the source vertex of the current edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+std::conditional< isMutable &&C::mutableMatrix, typenameMatrix::row_type::\n+Iterator, typenameMatrix::row_type::ConstIterator >::type ColIterator\n+The column iterator of the matrix we use.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+const std::remove_const< C >::type ConstContainer\n+The constant type of the container type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:105\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const EdgeIteratorT< typename std::remove_const< C >::type >\n+&other) const\n+Equality operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+EdgeIteratorT(const ColIterator &block)\n+Constructor for the end iterator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bW_\be_\bi_\bg_\bh_\bt\n+std::conditional< isMutable &&C::mutableMatrix, typenameM::block_type,\n+consttypenameM::block_type >::type Weight\n+The matrix block type we use as weights.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:127\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+const EdgeDescriptor & operator*() const\n+Get the edge descriptor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b>\n+const EdgeDescriptor * operator->() const\n+Get the edge descriptor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+std::remove_const< C >::type MutableContainer\n+The mutable type of the container type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+The vertex iterator type of the graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:209\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+EdgeIteratorT< C > begin() const\n+Get an iterator over all edges starting at the current vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n+const VertexDescriptor & operator*() const\n+Get the descriptor of the current vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bw_\be_\bi_\bg_\bh_\bt\n+WeightType & weight() const\n+Access the weight of the vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+VertexIteratorT(C *graph, const VertexDescriptor ¤t)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bW_\be_\bi_\bg_\bh_\bt_\bT_\by_\bp_\be\n+std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::\n+value &&C::mutableMatrix, typenameM::block_type, consttypenameM::block_type >::\n+type WeightType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:266\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+VertexIteratorT(const VertexIteratorT< MutableContainer > &other)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bM_\bu_\bt_\ba_\bb_\bl_\be_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+std::remove_const< C >::type MutableContainer\n+The mutable type of the container type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:214\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const VertexIteratorT< MutableContainer > &other) const\n+Inequality operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bi_\bs_\bM_\bu_\bt_\ba_\bb_\bl_\be\n+@ isMutable\n+whether C is mutable.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:225\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const VertexIteratorT< MutableContainer > &other) const\n+Equality operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+const std::remove_const< C >::type ConstContainer\n+The constant type of the container type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:218\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+VertexIteratorT< C > & operator++()\n+Move to the next vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\be_\bn_\bd\n+EdgeIteratorT< C > end() const\n+Get an iterator over all edges starting at the current vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n+bool operator==(const VertexIteratorT< ConstContainer > &other) const\n+Equality operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n+bool operator!=(const VertexIteratorT< ConstContainer > &other) const\n+Inequality operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+VertexIteratorT(const VertexDescriptor ¤t)\n+Constructor for the end iterator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n+A subgraph of a graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:443\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bf_\bi_\bn_\bd_\bE_\bd_\bg_\be\n+EdgeDescriptor findEdge(const VertexDescriptor &source, const VertexDescriptor\n+&target) const\n+Find the descriptor of an edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx\n+VertexDescriptor maxVertex() const\n+Get the maximal vertex descriptor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+EdgeIndexMap getEdgeIndexMap()\n+Get an edge index map for the graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bE_\bd_\bg_\be_\bs\n+std::size_t noEdges() const\n+Get the number of edges in the graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd_\bE_\bd_\bg_\be_\bs\n+ConstEdgeIterator endEdges(const VertexDescriptor &source) const\n+Get an iterator over the edges starting at a vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd\n+ConstVertexIterator end() const\n+Get an iterator over the vertices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs\n+ConstEdgeIterator beginEdges(const VertexDescriptor &source) const\n+Get an iterator over the edges starting at a vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n+std::size_t noVertices() const\n+Get the number of vertices in the graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd\n+T Excluded\n+Random access container providing information about which vertices are\n+excluded.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:454\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\b~_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n+~SubGraph()\n+Destructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+EdgeIterator ConstEdgeIterator\n+The constant edge iterator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:618\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bG_\br_\ba_\bp_\bh\n+G Graph\n+The type of the graph we are a sub graph for.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:448\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+VertexIterator ConstVertexIterator\n+The constant vertex iterator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:623\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n+SubGraph(const Graph &graph, const T &excluded)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+ConstVertexIterator begin() const\n+Get an iterator over the vertices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+Graph::VertexDescriptor VertexDescriptor\n+The vertex descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:459\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+VertexDescriptor * EdgeDescriptor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:461\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+An index map for mapping the edges to indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:470\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+EdgeIndexMap(const EdgeIndexMap &emap)\n+Protect copy construction.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:479\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+ReadablePropertyMapTag Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:472\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+EdgeIndexMap(const EdgeDescriptor &firstEdge)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:474\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+std::size_t operator[](const EdgeDescriptor &edge) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:483\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+The edge iterator of the graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:505\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const EdgeDescriptor & dereference() const\n+The descriptor of the current edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+EdgeIterator(const EdgeDescriptor &edge)\n+Constructor for the end iterator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n+bool equals(const EdgeIterator &other) const\n+Equality operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bv_\ba_\bn_\bc_\be\n+EdgeIterator & advance(std::ptrdiff_t n)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n+EdgeIterator & increment()\n+Preincrement operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bt_\ba_\br_\bg_\be_\bt\n+const VertexDescriptor & target() const\n+The index of the target vertex of the current edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bo_\bu_\br_\bc_\be\n+const VertexDescriptor & source() const\n+The index of the source vertex of the current edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n+EdgeIterator & decrement()\n+Preincrement operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bs_\bt_\ba_\bn_\bc_\be_\bT_\bo\n+std::ptrdiff_t distanceTo(const EdgeIterator &other) const\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+EdgeIterator(const VertexDescriptor &source, const EdgeDescriptor &edge)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+The vertex iterator of the graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+VertexIterator(const VertexDescriptor ¤t)\n+Constructor for end iterator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n+VertexIterator & increment()\n+Preincrement operator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+EdgeIterator begin() const\n+Get an iterator over all edges starting at the current vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n+bool equals(const VertexIterator &other) const\n+Equality iterator.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+VertexIterator(const SubGraph< G, T > *graph, const VertexDescriptor ¤t,\n+const VertexDescriptor &end)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n+EdgeIterator end() const\n+Get an iterator over all edges starting at the current vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+const VertexDescriptor & dereference() const\n+Get the descriptor of the current vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n+Attaches properties to the vertices of a graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:723\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\br_\ba_\bp_\bh\n+const Graph & graph() const\n+Get the graph the properties are attached to.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Graph::ConstEdgeIterator ConstEdgeIterator\n+The type of the constant edge iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:766\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+VertexProperties & getVertexProperties(const VertexDescriptor &vertex)\n+Get the properties associated with a vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bE_\bd_\bg_\be_\bs\n+std::size_t noEdges() const\n+Get the number of edges in the graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+Graph::EdgeDescriptor EdgeDescriptor\n+The edge descritor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:738\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd_\bE_\bd_\bg_\be_\bs\n+ConstEdgeIterator endEdges(const VertexDescriptor &source) const\n+Get the mutable edge iterator over edges starting at a vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+Graph::VertexDescriptor VertexDescriptor\n+The vertex descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:733\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bG_\br_\ba_\bp_\bh\n+G Graph\n+The graph we attach properties to.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:728\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp\n+VM VertexMap\n+The type of the map for converting the VertexDescriptor to std::size_t.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:756\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd_\bE_\bd_\bg_\be_\bs\n+EdgeIterator endEdges(const VertexDescriptor &source)\n+Get the mutable edge iterator over edges starting at a vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs\n+EdgeIterator beginEdges(const VertexDescriptor &source)\n+Get the mutable edge iterator over edges starting at a vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+VP VertexProperties\n+The type of the properties of the vertices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:743\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n+std::size_t noVertices() const\n+Get the number of vertices in the graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn_\bE_\bd_\bg_\be_\bs\n+ConstEdgeIterator beginEdges(const VertexDescriptor &source) const\n+Get the mutable edge iterator over edges starting at a vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx\n+VertexDescriptor maxVertex() const\n+Get the maximal vertex descriptor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Graph::EdgeIterator EdgeIterator\n+The type of the mutable edge iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:761\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:803\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::\n+value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type\n+EdgeIterator\n+The class of the edge iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:823\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+std::conditional< std::is_same< C, typenamestd::remove_const< C >::type >::\n+value, VertexProperties &, constVertexProperties & >::type properties() const\n+Get the properties of the current Vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\be_\bn_\bd\n+EdgeIterator end() const\n+Get an iterator over the edges starting from the current vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bF_\ba_\bt_\bh_\be_\br\n+std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::\n+value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >::\n+type Father\n+The father class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:814\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+EdgeIterator begin() const\n+Get an iterator over the edges starting from the current vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n+Attaches properties to the edges and vertices of a graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:978\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n+std::size_t noVertices() const\n+Get the number of vertices in the graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+Graph::EdgeDescriptor EdgeDescriptor\n+The edge descritor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:993\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+const EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const\n+VertexDescriptor &target) const\n+Get the properties associated with a edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+const EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge) const\n+Get the properties associated with a edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\br_\ba_\bp_\bh\n+const Graph & graph() const\n+Get the graph the properties are attached to.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx\n+VertexDescriptor maxVertex() const\n+Get the maximal vertex descriptor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bG_\br_\ba_\bp_\bh\n+G Graph\n+The graph we attach properties to.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:983\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bM_\ba_\bp\n+EM EdgeMap\n+The type of the map for converting the EdgeDescriptor to std::size_t.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1030\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bM_\ba_\bp\n+VM VertexMap\n+The type of the map for converting the VertexDescriptor to std::size_t.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1011\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+VP VertexProperties\n+The type of the properties of the vertices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:998\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bn_\bo_\bE_\bd_\bg_\be_\bs\n+std::size_t noEdges() const\n+Get the number of edges in the graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+EP EdgeProperties\n+The type of the properties of the edges;.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1016\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+EdgeProperties & getEdgeProperties(const VertexDescriptor &source, const\n+VertexDescriptor &target)\n+Get the properties associated with a edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+EdgeProperties & getEdgeProperties(const EdgeDescriptor &edge)\n+Get the properties associated with a edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+Graph::VertexDescriptor VertexDescriptor\n+The vertex descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:988\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n+PropertiesGraph(Graph &graph, const VertexMap &vmap=VertexMap(), const EdgeMap\n+&emap=EdgeMap())\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1038\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bF_\ba_\bt_\bh_\be_\br\n+std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::\n+value, typenameGraph::EdgeIterator, typenameGraph::ConstEdgeIterator >::type\n+Father\n+The father class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1050\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1140\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT_\b:_\b:_\bF_\ba_\bt_\bh_\be_\br\n+std::conditional< std::is_same< typenamestd::remove_const< C >::type, C >::\n+value, typenameGraph::VertexIterator, typenameGraph::ConstVertexIterator >::\n+type Father\n+The father class.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+Wrapper to access the internal edge properties of a graph via operator[]()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1361\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+GraphVertexPropertiesSelector(G &g)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1380\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+VertexProperties & operator[](const Vertex &vertex) const\n+Get the properties associated to a vertex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1395\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh\n+G Graph\n+The type of the graph with internal properties.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1366\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+G::VertexProperties VertexProperties\n+The type of the vertex properties.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1370\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+GraphVertexPropertiesSelector()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1386\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+G::VertexDescriptor Vertex\n+The vertex descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1374\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+Wrapper to access the internal vertex properties of a graph via operator[]()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1409\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+EdgeProperties & operator[](const Edge &edge) const\n+Get the properties associated to a vertex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1442\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+G::EdgeProperties EdgeProperties\n+The type of the vertex properties.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1418\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bE_\bd_\bg_\be\n+G::EdgeDescriptor Edge\n+The edge descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1422\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+GraphEdgePropertiesSelector()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1434\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh\n+G Graph\n+The type of the graph with internal properties.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1414\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+GraphEdgePropertiesSelector(G &g)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:1428\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00158.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00158.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: overlappingschwarz.hh File Reference\n+dune-istl: matrixhierarchy.hh File Reference\n \n \n \n \n \n \n \n@@ -65,138 +65,85 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n \n+ \n \n
    \n \n-

    Contains one level overlapping Schwarz preconditioners. \n+

    Provides a classes representing the hierarchies in AMG. \n More...

    \n-
    #include <cassert>
    \n-#include <algorithm>
    \n-#include <functional>
    \n-#include <memory>
    \n-#include <vector>
    \n-#include <set>
    \n-#include <dune/common/dynmatrix.hh>
    \n-#include <dune/common/sllist.hh>
    \n-#include <dune/istl/bccsmatrixinitializer.hh>
    \n-#include "preconditioners.hh"
    \n-#include "superlu.hh"
    \n-#include "umfpack.hh"
    \n-#include "bvector.hh"
    \n-#include "bcrsmatrix.hh"
    \n-#include "ilusubdomainsolver.hh"
    \n-#include <dune/istl/solvertype.hh>
    \n+
    #include <algorithm>
    \n+#include <tuple>
    \n+#include "aggregates.hh"
    \n+#include "graph.hh"
    \n+#include "galerkin.hh"
    \n+#include "renumberer.hh"
    \n+#include "graphcreator.hh"
    \n+#include "hierarchy.hh"
    \n+#include <dune/istl/bvector.hh>
    \n+#include <dune/common/parallel/indexset.hh>
    \n+#include <dune/istl/matrixutils.hh>
    \n+#include <dune/istl/matrixredistribute.hh>
    \n+#include <dune/istl/paamg/dependency.hh>
    \n+#include <dune/istl/paamg/indicescoarsener.hh>
    \n+#include <dune/istl/paamg/globalaggregates.hh>
    \n+#include <dune/istl/paamg/construction.hh>
    \n+#include <dune/istl/paamg/smoother.hh>
    \n+#include <dune/istl/paamg/transfer.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n-\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::OverlappingSchwarzInitializer< I, S, D >
     Initializer for SuperLU Matrices representing the subdomains. More...
    class  Dune::Amg::MatrixHierarchy< M, PI, A >
     The hierarchies build by the coarsening process. More...
     
    struct  Dune::AdditiveSchwarzMode
     Tag that the tells the Schwarz method to be additive. More...
    struct  Dune::Amg::MatrixHierarchy< M, PI, A >::MatrixStats< Matrix, true >::calc
     
    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::Amg::CoarsenCriterion< T >
     The criterion describing the stop criteria for the coarsening process. More...
     
    \n \n \n \n+\n+\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n+\n+\n+\n

    \n+Enumerations

    enum  { Dune::Amg::MAX_PROCESSES = 72000\n+ }
     
    \n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n

    \n-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 >
     

    \n+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)
     
    \n

    Detailed Description

    \n-

    Contains one level overlapping Schwarz preconditioners.

    \n+

    Provides a classes representing the hierarchies in AMG.

    \n
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,130 +1,68 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs\n-overlappingschwarz.hh File Reference\n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+matrixhierarchy.hh File Reference\n _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n-Contains one level overlapping Schwarz preconditioners. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Provides a classes representing the hierarchies in AMG. _\bM_\bo_\br_\be_\b._\b._\b.\n #include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n-#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n-#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh\"\n-#include \"_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh\"\n-#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-#include \"_\bi_\bl_\bu_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\"\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+#include \n+#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n+#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n+#include \"_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\"\n+#include \"_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\"\n+#include \"_\bg_\br_\ba_\bp_\bh_\bc_\br_\be_\ba_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \"_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh\"\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\bc_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bg_\bl_\bo_\bb_\ba_\bl_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\b _\bI_\b,_\b _\bS_\b,_\b _\bD_\b _\b>\n-\u00a0 Initializer for _\bS_\bu_\bp_\be_\br_\bL_\bU Matrices representing the subdomains. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bM_\b,_\b _\bP_\bI_\b,_\b _\bA_\b _\b>\n+\u00a0 The hierarchies build by the coarsening process. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n-\u00a0 Tag that the tells the Schwarz method to be additive. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bM_\b,_\b _\bP_\bI_\b,_\b _\bA_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:\n+ _\bc_\ba_\bl_\bc\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n-\u00a0 Tag that tells the Schwarz method to be multiplicative. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n-\u00a0 Tag that tells the Schwarz method to be multiplicative and symmetric.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\b _\bT_\b _\b>\n+\u00a0 The criterion describing the stop criteria for the coarsening process.\n _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bT_\b,_\b _\bt_\ba_\bg_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<\n- _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be\n- _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be\n- _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bX_\b,_\b _\bS_\b _\b>\n-\u00a0 template meta program for choosing how to add the correction. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\bo_\br_\bw_\ba_\br_\bd_\b _\b>\n-\u00a0 Helper template meta program for application of overlapping Schwarz.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0 Helper template meta program for application of overlapping Schwarz.\n- _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n- _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bT_\bD_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bT_\b,_\b _\bt_\ba_\bg_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<\n- _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,\n- _\bt_\br_\bu_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,\n- _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,\n- _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bD_\b,_\b _\bT_\bA_\b _\b>\n-\u00a0 Sequential overlapping Schwarz preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be_\b<_\b _\bM_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br = _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br< T, _\bD_\bu_\bn_\be_\b:_\b:\n- _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd< T >::value >\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br =\n- _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br< T, _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd< T\n- >::value >\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+\u00a0\n+E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n+enum \u00a0 { _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\bA_\bX_\b__\bP_\bR_\bO_\bC_\bE_\bS_\bS_\bE_\bS = 72000 }\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx (const M &origMatrix, std::\n+ shared_ptr< M > newMatrix, _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn &origComm, std::\n+ shared_ptr< _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn > &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn<\n+ _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn > &ri, int nparts, C1 &criterion)\n+\u00a0\n+template\n+bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx (const M &origMatrix, std::\n+ shared_ptr< M > newMatrix, C &origComm, std::shared_ptr< C > &newComm,\n+ _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< C > &ri, int nparts, C1 &criterion)\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Contains one level overlapping Schwarz preconditioners.\n+Provides a classes representing the hierarchies in AMG.\n Author\n Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00158_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00158_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: overlappingschwarz.hh Source File\n+dune-istl: matrixhierarchy.hh Source File\n \n \n \n \n \n \n \n@@ -70,1670 +70,1009 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    overlappingschwarz.hh
    \n+
    matrixhierarchy.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_OVERLAPPINGSCHWARZ_HH
    \n-
    6#define DUNE_ISTL_OVERLAPPINGSCHWARZ_HH
    \n-
    7#include <cassert>
    \n+
    5#ifndef DUNE_AMG_MATRIXHIERARCHY_HH
    \n+
    6#define DUNE_AMG_MATRIXHIERARCHY_HH
    \n+
    7
    \n
    8#include <algorithm>
    \n-
    9#include <functional>
    \n-
    10#include <memory>
    \n-
    11#include <vector>
    \n-
    12#include <set>
    \n-
    13#include <dune/common/dynmatrix.hh>
    \n-
    14#include <dune/common/sllist.hh>
    \n-
    15
    \n-\n-
    17#include "preconditioners.hh"
    \n-
    18#include "superlu.hh"
    \n-
    19#include "umfpack.hh"
    \n-
    20#include "bvector.hh"
    \n-
    21#include "bcrsmatrix.hh"
    \n-
    22#include "ilusubdomainsolver.hh"
    \n-\n-
    24
    \n-
    25namespace Dune
    \n-
    26{
    \n+
    9#include <tuple>
    \n+
    10#include "aggregates.hh"
    \n+
    11#include "graph.hh"
    \n+
    12#include "galerkin.hh"
    \n+
    13#include "renumberer.hh"
    \n+
    14#include "graphcreator.hh"
    \n+
    15#include "hierarchy.hh"
    \n+
    16#include <dune/istl/bvector.hh>
    \n+
    17#include <dune/common/parallel/indexset.hh>
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n
    27
    \n-
    39 template<class M, class X, class TM, class TD, class TA>
    \n-
    40 class SeqOverlappingSchwarz;
    \n-
    41
    \n-
    45 template<class I, class S, class D>
    \n-
    \n-\n-
    47 {
    \n-
    48 public:
    \n-\n-
    51
    \n-
    52 typedef I InitializerList;
    \n-
    53 typedef typename InitializerList::value_type AtomInitializer;
    \n-
    54 typedef typename AtomInitializer::Matrix Matrix;
    \n-
    55 typedef typename Matrix::const_iterator Iter;
    \n-
    56 typedef typename Matrix::row_type::const_iterator CIter;
    \n-
    57
    \n-
    58 typedef S IndexSet;
    \n-
    59 typedef typename IndexSet::size_type size_type;
    \n-
    60
    \n-\n-
    62 const IndexSet& indices,
    \n-
    63 const subdomain_vector& domains);
    \n-
    64
    \n+
    28namespace Dune
    \n+
    29{
    \n+
    30 namespace Amg
    \n+
    31 {
    \n+
    42 enum {
    \n+
    50 MAX_PROCESSES = 72000
    \n+
    51 };
    \n+
    52
    \n+
    59 template<class M, class PI, class A=std::allocator<M> >
    \n+
    \n+\n+
    61 {
    \n+
    62 public:
    \n+
    64 typedef M MatrixOperator;
    \n
    65
    \n-
    66 void addRowNnz(const Iter& row);
    \n-
    67
    \n-
    68 void allocate();
    \n-
    69
    \n-
    70 void countEntries(const Iter& row, const CIter& col) const;
    \n+
    67 typedef typename MatrixOperator::matrix_type Matrix;
    \n+
    68
    \n+\n
    71
    \n-
    72 void calcColstart() const;
    \n-
    73
    \n-
    74 void copyValue(const Iter& row, const CIter& col) const;
    \n-
    75
    \n-
    76 void createMatrix() const;
    \n-
    77 private:
    \n-
    78 class IndexMap
    \n-
    79 {
    \n-
    80 public:
    \n-
    81 typedef typename S::size_type size_type;
    \n-
    82 typedef std::map<size_type,size_type> Map;
    \n-
    83 typedef typename Map::iterator iterator;
    \n-
    84 typedef typename Map::const_iterator const_iterator;
    \n-
    85
    \n-
    86 IndexMap();
    \n-
    87
    \n-
    88 void insert(size_type grow);
    \n+
    73 typedef A Allocator;
    \n+
    74
    \n+\n+
    77
    \n+\n+
    80
    \n+\n+
    83
    \n+
    85 using AAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<AggregatesMap*>;
    \n+
    86
    \n+
    88 typedef std::list<AggregatesMap*,AAllocator> AggregatesMapList;
    \n
    89
    \n-
    90 const_iterator find(size_type grow) const;
    \n-
    91
    \n-
    92 iterator find(size_type grow);
    \n-
    93
    \n-
    94 iterator begin();
    \n+\n+
    92
    \n+
    94 using RILAllocator = typename std::allocator_traits<Allocator>::template rebind_alloc<RedistributeInfoType>;
    \n
    95
    \n-
    96 const_iterator begin() const;
    \n-
    97
    \n-
    98 iterator end();
    \n-
    99
    \n-
    100 const_iterator end() const;
    \n-
    101
    \n-
    102 private:
    \n-
    103 std::map<size_type,size_type> map_;
    \n-
    104 size_type row;
    \n-
    105 };
    \n+
    97 typedef std::list<RedistributeInfoType,RILAllocator> RedistributeInfoList;
    \n+
    98
    \n+
    104 MatrixHierarchy(std::shared_ptr<MatrixOperator> fineMatrix,
    \n+
    105 std::shared_ptr<ParallelInformation> pinfo = std::make_shared<ParallelInformation>());
    \n
    106
    \n-
    107
    \n-
    108 typedef typename InitializerList::iterator InitIterator;
    \n-
    109 typedef typename IndexSet::const_iterator IndexIteratur;
    \n-
    110 InitializerList* initializers;
    \n-
    111 const IndexSet *indices;
    \n-
    112 mutable std::vector<IndexMap> indexMaps;
    \n-
    113 const subdomain_vector& domains;
    \n-
    114 };
    \n-
    \n-
    115
    \n-
    \n-\n-
    120 {};
    \n-
    \n-
    121
    \n-
    \n-\n-
    126 {};
    \n-
    \n-
    127
    \n-\n-
    134
    \n-
    139 template<class M, class X, class Y>
    \n-\n-
    141
    \n-
    142 // Specialization for BCRSMatrix
    \n-
    143 template<class K, class Al, class X, class Y>
    \n-
    \n-\n-
    145 {
    \n-
    146 typedef BCRSMatrix< K, Al> M;
    \n-
    147 public:
    \n-
    149 typedef typename std::remove_const<M>::type matrix_type;
    \n-
    150 typedef typename X::field_type field_type;
    \n-
    151 typedef typename std::remove_const<M>::type rilu_type;
    \n-
    153 typedef X domain_type;
    \n-
    155 typedef Y range_type;
    \n-
    156 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
    \n-
    157
    \n-
    \n-
    162 void apply (DynamicVector<field_type>& v, DynamicVector<field_type>& d)
    \n-
    163 {
    \n-
    164 assert(v.size() > 0);
    \n-
    165 assert(v.size() == d.size());
    \n-
    166 assert(A.rows() <= v.size());
    \n-
    167 assert(A.cols() <= v.size());
    \n-
    168 size_t sz = A.rows();
    \n-
    169 v.resize(sz);
    \n-
    170 d.resize(sz);
    \n-
    171 A.solve(v,d);
    \n-
    172 v.resize(v.capacity());
    \n-
    173 d.resize(d.capacity());
    \n-
    174 }
    \n-
    \n-
    175
    \n-
    183 template<class S>
    \n-
    \n-
    184 void setSubMatrix(const M& BCRS, S& rowset)
    \n-
    185 {
    \n-
    186 size_t sz = rowset.size();
    \n-
    187 A.resize(sz*n,sz*n);
    \n-
    188 typedef typename S::const_iterator SIter;
    \n-
    189 size_t r = 0;
    \n-
    190 for(SIter rowIdx = rowset.begin(), rowEnd=rowset.end();
    \n-
    191 rowIdx!= rowEnd; ++rowIdx, r++)
    \n-
    192 {
    \n-
    193 size_t c = 0;
    \n-
    194 for(SIter colIdx = rowset.begin(), colEnd=rowset.end();
    \n-
    195 colIdx!= colEnd; ++colIdx, c++)
    \n-
    196 {
    \n-
    197 if (BCRS[*rowIdx].find(*colIdx) == BCRS[*rowIdx].end())
    \n-
    198 continue;
    \n-
    199 for (size_t i=0; i<n; i++)
    \n-
    200 {
    \n-
    201 for (size_t j=0; j<n; j++)
    \n-
    202 {
    \n-
    203 A[r*n+i][c*n+j] = Impl::asMatrix(BCRS[*rowIdx][*colIdx])[i][j];
    \n-
    204 }
    \n-
    205 }
    \n-
    206 }
    \n-
    207 }
    \n-
    208 }
    \n-
    \n-
    209 private:
    \n-
    210 DynamicMatrix<K> A;
    \n-
    211 };
    \n-
    \n-
    212
    \n-
    213 template<typename T, bool tag>
    \n-
    \n-\n-
    215 {};
    \n-
    \n+\n+
    108
    \n+
    114 template<typename O, typename T>
    \n+
    115 void build(const T& criterion);
    \n+
    116
    \n+
    124 template<class F>
    \n+
    125 void recalculateGalerkin(const F& copyFlags);
    \n+
    126
    \n+
    131 template<class V, class BA, class TA>
    \n+
    132 void coarsenVector(Hierarchy<BlockVector<V,BA>, TA>& hierarchy) const;
    \n+
    133
    \n+
    139 template<class S, class TA>
    \n+
    140 void coarsenSmoother(Hierarchy<S,TA>& smoothers,
    \n+
    141 const typename SmootherTraits<S>::Arguments& args) const;
    \n+
    142
    \n+
    147 std::size_t levels() const;
    \n+
    148
    \n+
    153 std::size_t maxlevels() const;
    \n+
    154
    \n+
    155 bool hasCoarsest() const;
    \n+
    156
    \n+
    161 bool isBuilt() const;
    \n+
    162
    \n+
    167 const ParallelMatrixHierarchy& matrices() const;
    \n+
    168
    \n+\n+
    174
    \n+
    179 const AggregatesMapList& aggregatesMaps() const;
    \n+
    180
    \n+\n+
    187
    \n+
    \n+\n+
    189 {
    \n+
    190 return prolongDamp_;
    \n+
    191 }
    \n+
    \n+
    192
    \n+
    203 void getCoarsestAggregatesOnFinest(std::vector<std::size_t>& data) const;
    \n+
    204
    \n+
    205 private:
    \n+
    206 typedef typename ConstructionTraits<MatrixOperator>::Arguments MatrixArgs;
    \n+
    207 typedef typename ConstructionTraits<ParallelInformation>::Arguments CommunicationArgs;
    \n+
    209 AggregatesMapList aggregatesMaps_;
    \n+
    211 RedistributeInfoList redistributes_;
    \n+
    213 ParallelMatrixHierarchy matrices_;
    \n+
    215 ParallelInformationHierarchy parallelInformation_;
    \n
    216
    \n-
    217 template<typename T>
    \n-\n+
    218 bool built_;
    \n
    219
    \n-
    220 // specialization for DynamicMatrix
    \n-
    221 template<class K, class Al, class X, class Y>
    \n-
    \n-\n-
    223 {
    \n-
    224 public:
    \n-\n-
    226 typedef typename X::field_type field_type;
    \n-
    227 typedef Y range_type;
    \n-
    228 typedef typename range_type::block_type block_type;
    \n-\n-
    230 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
    \n-
    238 OverlappingAssignerHelper(std::size_t maxlength, const BCRSMatrix<K, Al>& mat_, const X& b_, Y& x_);
    \n-
    239
    \n-
    243 inline
    \n-
    244 void deallocate();
    \n-
    245
    \n-
    249 inline
    \n-
    250 void resetIndexForNextDomain();
    \n-
    251
    \n-
    256 inline
    \n-
    257 DynamicVector<field_type> & lhs();
    \n-
    258
    \n-
    263 inline
    \n-
    264 DynamicVector<field_type> & rhs();
    \n-
    265
    \n-
    270 inline
    \n-
    271 void relaxResult(field_type relax);
    \n-
    272
    \n-
    277 void operator()(const size_type& domainIndex);
    \n-
    278
    \n-
    286 inline
    \n-
    287 void assignResult(block_type& res);
    \n-
    288
    \n-
    289 private:
    \n-
    293 const matrix_type* mat;
    \n-
    295 // we need a pointer, because we have to avoid deep copies
    \n-
    296 DynamicVector<field_type> * rhs_;
    \n-
    298 // we need a pointer, because we have to avoid deep copies
    \n-
    299 DynamicVector<field_type> * lhs_;
    \n-
    301 const range_type* b;
    \n-
    303 range_type* x;
    \n-
    305 std::size_t i;
    \n-
    307 std::size_t maxlength_;
    \n-
    308 };
    \n-
    \n-
    309
    \n-
    310#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n-
    311 template<template<class> class S, typename T, typename A>
    \n-
    \n-\n-
    313 {
    \n-\n-
    315 typedef typename S<BCRSMatrix<T, A>>::range_type range_type;
    \n-
    316 typedef typename range_type::field_type field_type;
    \n-
    317 typedef typename range_type::block_type block_type;
    \n-
    318
    \n-\n-
    320
    \n-
    321 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
    \n-
    322 static constexpr size_t m = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::cols;
    \n-
    330 OverlappingAssignerHelper(std::size_t maxlength, const matrix_type& mat,
    \n-
    331 const range_type& b, range_type& x);
    \n-
    337 void deallocate();
    \n-
    338
    \n-
    339 /*
    \n-
    340 * @brief Resets the local index to zero.
    \n-
    341 */
    \n-
    342 void resetIndexForNextDomain();
    \n-
    343
    \n-
    348 field_type* lhs();
    \n-
    349
    \n-
    354 field_type* rhs();
    \n-
    355
    \n-
    360 void relaxResult(field_type relax);
    \n-
    361
    \n-
    366 void operator()(const size_type& domain);
    \n+
    221 int maxlevels_;
    \n+
    222
    \n+
    223 double prolongDamp_;
    \n+
    224
    \n+
    228 template<class Matrix, bool print>
    \n+
    229 struct MatrixStats
    \n+
    230 {
    \n+
    231
    \n+
    235 static void stats([[maybe_unused]] const Matrix& matrix)
    \n+
    236 {}
    \n+
    237 };
    \n+
    238
    \n+
    239 template<class Matrix>
    \n+
    240 struct MatrixStats<Matrix,true>
    \n+
    241 {
    \n+
    \n+
    242 struct calc
    \n+
    243 {
    \n+
    244 typedef typename Matrix::size_type size_type;
    \n+
    245 typedef typename Matrix::row_type matrix_row;
    \n+
    246
    \n+
    \n+\n+
    248 {
    \n+
    249 min=std::numeric_limits<size_type>::max();
    \n+
    250 max=0;
    \n+
    251 sum=0;
    \n+
    252 }
    \n+
    \n+
    253
    \n+
    \n+
    254 void operator()(const matrix_row& row)
    \n+
    255 {
    \n+
    256 min=std::min(min, row.size());
    \n+
    257 max=std::max(max, row.size());
    \n+
    258 sum += row.size();
    \n+
    259 }
    \n+
    \n+
    260
    \n+\n+\n+\n+
    264 };
    \n+
    \n+
    268 static void stats(const Matrix& matrix)
    \n+
    269 {
    \n+
    270 calc c= for_each(matrix.begin(), matrix.end(), calc());
    \n+
    271 dinfo<<"Matrix row: min="<<c.min<<" max="<<c.max
    \n+
    272 <<" average="<<static_cast<double>(c.sum)/matrix.N()
    \n+
    273 <<std::endl;
    \n+
    274 }
    \n+
    275 };
    \n+
    276 };
    \n+
    \n+
    277
    \n+
    281 template<class T>
    \n+
    \n+
    282 class CoarsenCriterion : public T
    \n+
    283 {
    \n+
    284 public:
    \n+\n+
    290
    \n+
    \n+
    304 CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2,
    \n+
    305 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu, bool useFixedOrder = false)
    \n+
    306 : AggregationCriterion(Dune::Amg::Parameters(maxLevel, coarsenTarget, minCoarsenRate, prolongDamp, accumulate, useFixedOrder))
    \n+
    307 {}
    \n+
    \n+
    308
    \n+
    \n+\n+
    310 : AggregationCriterion(parms)
    \n+
    311 {}
    \n+
    \n+
    312
    \n+
    313 };
    \n+
    \n+
    314
    \n+
    315 template<typename M, typename C1>
    \n+
    \n+
    316 bool repartitionAndDistributeMatrix([[maybe_unused]] const M& origMatrix,
    \n+
    317 [[maybe_unused]] std::shared_ptr<M> newMatrix,
    \n+
    318 [[maybe_unused]] SequentialInformation& origComm,
    \n+
    319 [[maybe_unused]] std::shared_ptr<SequentialInformation>& newComm,
    \n+\n+
    321 [[maybe_unused]] int nparts,
    \n+
    322 [[maybe_unused]] C1& criterion)
    \n+
    323 {
    \n+
    324 DUNE_THROW(NotImplemented, "Redistribution does not make sense in sequential code!");
    \n+
    325 }
    \n+
    \n+
    326
    \n+
    327
    \n+
    328 template<typename M, typename C, typename C1>
    \n+
    \n+
    329 bool repartitionAndDistributeMatrix(const M& origMatrix,
    \n+
    330 std::shared_ptr<M> newMatrix,
    \n+
    331 C& origComm,
    \n+
    332 std::shared_ptr<C>& newComm,
    \n+\n+
    334 int nparts, C1& criterion)
    \n+
    335 {
    \n+
    336 Timer time;
    \n+
    337#ifdef AMG_REPART_ON_COMM_GRAPH
    \n+
    338 // Done not repartition the matrix graph, but a graph of the communication scheme.
    \n+
    339 bool existentOnRedist=Dune::commGraphRepartition(origMatrix, origComm, nparts, newComm,
    \n+
    340 ri.getInterface(),
    \n+
    341 criterion.debugLevel()>1);
    \n+
    342
    \n+
    343#else
    \n+\n+\n+\n+\n+
    348 IdentityMap,
    \n+
    349 IdentityMap> PropertiesGraph;
    \n+
    350 MatrixGraph graph(origMatrix);
    \n+
    351 PropertiesGraph pgraph(graph);
    \n+
    352 buildDependency(pgraph, origMatrix, criterion, false);
    \n+
    353
    \n+
    354#ifdef DEBUG_REPART
    \n+
    355 if(origComm.communicator().rank()==0)
    \n+
    356 std::cout<<"Original matrix"<<std::endl;
    \n+
    357 origComm.communicator().barrier();
    \n+
    358 printGlobalSparseMatrix(origMatrix, origComm, std::cout);
    \n+
    359#endif
    \n+
    360 bool existentOnRedist=Dune::graphRepartition(pgraph, origComm, nparts,
    \n+
    361 newComm, ri.getInterface(),
    \n+
    362 criterion.debugLevel()>1);
    \n+
    363#endif // if else AMG_REPART
    \n+
    364
    \n+
    365 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)
    \n+
    366 std::cout<<"Repartitioning took "<<time.elapsed()<<" seconds."<<std::endl;
    \n
    367
    \n-
    375 void assignResult(block_type& res);
    \n-
    376
    \n-
    377 private:
    \n-
    381 const matrix_type* mat;
    \n-
    383 field_type* rhs_;
    \n-
    385 field_type* lhs_;
    \n-
    387 const range_type* b;
    \n-
    389 range_type* x;
    \n-
    391 std::size_t i;
    \n-
    393 std::size_t maxlength_;
    \n-
    394 };
    \n-
    \n-
    395
    \n-
    396#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n-
    397
    \n-
    398 template<class M, class X, class Y>
    \n-
    \n-\n-
    400 {
    \n-
    401 public:
    \n-
    402 typedef M matrix_type;
    \n-
    403
    \n-
    404 typedef typename Y::field_type field_type;
    \n-
    405
    \n-
    406 typedef typename Y::block_type block_type;
    \n-
    407
    \n-
    408 typedef typename matrix_type::size_type size_type;
    \n-
    416 OverlappingAssignerILUBase(std::size_t maxlength, const M& mat,
    \n-
    417 const Y& b, X& x);
    \n-
    423 void deallocate();
    \n-
    424
    \n-\n-
    429
    \n-
    434 X& lhs();
    \n-
    435
    \n-
    440 Y& rhs();
    \n-
    441
    \n-
    446 void relaxResult(field_type relax);
    \n-
    447
    \n-
    452 void operator()(const size_type& domain);
    \n-
    453
    \n-
    461 void assignResult(block_type& res);
    \n+
    368 ri.setSetup();
    \n+
    369
    \n+
    370#ifdef DEBUG_REPART
    \n+
    371 ri.checkInterface(origComm.indexSet(), newComm->indexSet(), origComm.communicator());
    \n+
    372#endif
    \n+
    373
    \n+
    374 redistributeMatrix(const_cast<M&>(origMatrix), *newMatrix, origComm, *newComm, ri);
    \n+
    375
    \n+
    376#ifdef DEBUG_REPART
    \n+
    377 if(origComm.communicator().rank()==0)
    \n+
    378 std::cout<<"Original matrix"<<std::endl;
    \n+
    379 origComm.communicator().barrier();
    \n+
    380 if(newComm->communicator().size()>0)
    \n+
    381 printGlobalSparseMatrix(*newMatrix, *newComm, std::cout);
    \n+
    382 origComm.communicator().barrier();
    \n+
    383#endif
    \n+
    384
    \n+
    385 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)
    \n+
    386 std::cout<<"Redistributing matrix took "<<time.elapsed()<<" seconds."<<std::endl;
    \n+
    387 return existentOnRedist;
    \n+
    388
    \n+
    389 }
    \n+
    \n+
    390
    \n+
    391 template<class M, class IS, class A>
    \n+
    \n+
    392 MatrixHierarchy<M,IS,A>::MatrixHierarchy(std::shared_ptr<MatrixOperator> fineMatrix,
    \n+
    393 std::shared_ptr<ParallelInformation> pinfo)
    \n+
    394 : matrices_(fineMatrix),
    \n+
    395 parallelInformation_(pinfo)
    \n+
    396 {
    \n+
    397 if (SolverCategory::category(*fineMatrix) != SolverCategory::category(*pinfo))
    \n+
    398 DUNE_THROW(ISTLError, "MatrixOperator and ParallelInformation must belong to the same category!");
    \n+
    399 }
    \n+
    \n+
    400
    \n+
    401 template<class M, class IS, class A>
    \n+
    402 template<typename O, typename T>
    \n+
    \n+
    403 void MatrixHierarchy<M,IS,A>::build(const T& criterion)
    \n+
    404 {
    \n+
    405 prolongDamp_ = criterion.getProlongationDampingFactor();
    \n+
    406 typedef O OverlapFlags;
    \n+
    407 typedef typename ParallelMatrixHierarchy::Iterator MatIterator;
    \n+
    408 typedef typename ParallelInformationHierarchy::Iterator PInfoIterator;
    \n+
    409
    \n+
    410 static const int noints=(Dune::Amg::MAX_PROCESSES/4096>0) ? (Dune::Amg::MAX_PROCESSES/4096) : 1;
    \n+
    411
    \n+
    412 typedef bigunsignedint<sizeof(int)*8*noints> BIGINT;
    \n+\n+
    414 MatIterator mlevel = matrices_.finest();
    \n+
    415 MatrixStats<typename M::matrix_type,MINIMAL_DEBUG_LEVEL<=INFO_DEBUG_LEVEL>::stats(mlevel->getmat());
    \n+
    416
    \n+
    417 PInfoIterator infoLevel = parallelInformation_.finest();
    \n+
    418 BIGINT finenonzeros=countNonZeros(mlevel->getmat());
    \n+
    419 finenonzeros = infoLevel->communicator().sum(finenonzeros);
    \n+
    420 BIGINT allnonzeros = finenonzeros;
    \n+
    421
    \n+
    422
    \n+
    423 int level = 0;
    \n+
    424 int rank = 0;
    \n+
    425
    \n+
    426 BIGINT unknowns = mlevel->getmat().N();
    \n+
    427
    \n+
    428 unknowns = infoLevel->communicator().sum(unknowns);
    \n+
    429 double dunknowns=unknowns.todouble();
    \n+
    430 infoLevel->buildGlobalLookup(mlevel->getmat().N());
    \n+
    431 redistributes_.push_back(RedistributeInfoType());
    \n+
    432
    \n+
    433 for(; level < criterion.maxLevel(); ++level, ++mlevel) {
    \n+
    434 assert(matrices_.levels()==redistributes_.size());
    \n+
    435 rank = infoLevel->communicator().rank();
    \n+
    436 if(rank==0 && criterion.debugLevel()>1)
    \n+
    437 std::cout<<"Level "<<level<<" has "<<dunknowns<<" unknowns, "<<dunknowns/infoLevel->communicator().size()
    \n+
    438 <<" unknowns per proc (procs="<<infoLevel->communicator().size()<<")"<<std::endl;
    \n+
    439
    \n+
    440 MatrixOperator* matrix=&(*mlevel);
    \n+
    441 ParallelInformation* info =&(*infoLevel);
    \n+
    442
    \n+
    443 if((
    \n+
    444#if HAVE_PARMETIS
    \n+
    445 criterion.accumulate()==successiveAccu
    \n+
    446#else
    \n+
    447 false
    \n+
    448#endif
    \n+
    449 || (criterion.accumulate()==atOnceAccu
    \n+
    450 && dunknowns < 30*infoLevel->communicator().size()))
    \n+
    451 && infoLevel->communicator().size()>1 &&
    \n+
    452 dunknowns/infoLevel->communicator().size() <= criterion.coarsenTarget())
    \n+
    453 {
    \n+
    454 // accumulate to fewer processors
    \n+
    455 std::shared_ptr<Matrix> redistMat = std::make_shared<Matrix>();
    \n+
    456 std::shared_ptr<ParallelInformation> redistComm;
    \n+
    457 std::size_t nodomains = (std::size_t)std::ceil(dunknowns/(criterion.minAggregateSize()
    \n+
    458 *criterion.coarsenTarget()));
    \n+
    459 if( nodomains<=criterion.minAggregateSize()/2 ||
    \n+
    460 dunknowns <= criterion.coarsenTarget() )
    \n+
    461 nodomains=1;
    \n
    462
    \n-
    463 private:
    \n-
    467 const M* mat;
    \n-
    469 X* lhs_;
    \n-
    471 Y* rhs_;
    \n-
    473 const Y* b;
    \n-
    475 X* x;
    \n-
    477 size_type i;
    \n-
    478 };
    \n-
    \n-
    479
    \n-
    480 // specialization for ILU0
    \n-
    481 template<class M, class X, class Y>
    \n-
    \n-\n-
    483 : public OverlappingAssignerILUBase<M,X,Y>
    \n-
    484 {
    \n-
    485 public:
    \n-
    \n-
    493 OverlappingAssignerHelper(std::size_t maxlength, const M& mat,
    \n-
    494 const Y& b, X& x)
    \n-
    495 : OverlappingAssignerILUBase<M,X,Y>(maxlength, mat,b,x)
    \n-
    496 {}
    \n-
    \n-
    497 };
    \n-
    \n-
    498
    \n-
    499 // specialization for ILUN
    \n-
    500 template<class M, class X, class Y>
    \n-
    \n-\n-
    502 : public OverlappingAssignerILUBase<M,X,Y>
    \n-
    503 {
    \n-
    504 public:
    \n-
    \n-
    512 OverlappingAssignerHelper(std::size_t maxlength, const M& mat,
    \n-
    513 const Y& b, X& x)
    \n-
    514 : OverlappingAssignerILUBase<M,X,Y>(maxlength, mat,b,x)
    \n-
    515 {}
    \n-
    \n-
    516 };
    \n-
    \n-
    517
    \n-
    518 template<typename S, typename T>
    \n-
    \n-\n-
    520 {};
    \n-
    \n-
    521
    \n-
    522 template<typename S, typename T, typename A>
    \n-
    \n-
    523 struct AdditiveAdder<S, BlockVector<T,A> >
    \n-
    524 {
    \n-
    525 typedef typename A::size_type size_type;
    \n-
    526 typedef typename std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::field_type field_type;
    \n-\n-
    528 OverlappingAssigner<S>& assigner, const field_type& relax_);
    \n-
    529 void operator()(const size_type& domain);
    \n-
    530 void axpy();
    \n-
    531 static constexpr size_t n = std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::dimension;
    \n-
    532
    \n-
    533 private:
    \n-\n-\n-
    536 OverlappingAssigner<S>* assigner;
    \n-
    537 field_type relax;
    \n-
    538 };
    \n-
    \n+
    463 bool existentOnNextLevel =
    \n+
    464 repartitionAndDistributeMatrix(mlevel->getmat(), redistMat, *infoLevel,
    \n+
    465 redistComm, redistributes_.back(), nodomains,
    \n+
    466 criterion);
    \n+
    467 BIGINT unknownsRedist = redistMat->N();
    \n+
    468 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);
    \n+
    469 dunknowns= unknownsRedist.todouble();
    \n+
    470 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1)
    \n+
    471 std::cout<<"Level "<<level<<" (redistributed) has "<<dunknowns<<" unknowns, "<<dunknowns/redistComm->communicator().size()
    \n+
    472 <<" unknowns per proc (procs="<<redistComm->communicator().size()<<")"<<std::endl;
    \n+
    473 MatrixArgs args(redistMat, *redistComm);
    \n+
    474 mlevel.addRedistributed(ConstructionTraits<MatrixOperator>::construct(args));
    \n+
    475 assert(mlevel.isRedistributed());
    \n+
    476 infoLevel.addRedistributed(redistComm);
    \n+
    477 infoLevel->freeGlobalLookup();
    \n+
    478
    \n+
    479 if(!existentOnNextLevel)
    \n+
    480 // We do not hold any data on the redistributed partitioning
    \n+
    481 break;
    \n+
    482
    \n+
    483 // Work on the redistributed Matrix from now on
    \n+
    484 matrix = &(mlevel.getRedistributed());
    \n+
    485 info = &(infoLevel.getRedistributed());
    \n+
    486 info->buildGlobalLookup(matrix->getmat().N());
    \n+
    487 }
    \n+
    488
    \n+
    489 rank = info->communicator().rank();
    \n+
    490 if(dunknowns <= criterion.coarsenTarget())
    \n+
    491 // No further coarsening needed
    \n+
    492 break;
    \n+
    493
    \n+\n+
    495 typedef typename GraphCreator::PropertiesGraph PropertiesGraph;
    \n+
    496 typedef typename GraphCreator::GraphTuple GraphTuple;
    \n+
    497
    \n+
    498 typedef typename PropertiesGraph::VertexDescriptor Vertex;
    \n+
    499
    \n+
    500 std::vector<bool> excluded(matrix->getmat().N(), false);
    \n+
    501
    \n+
    502 GraphTuple graphs = GraphCreator::create(*matrix, excluded, *info, OverlapFlags());
    \n+
    503
    \n+
    504 AggregatesMap* aggregatesMap=new AggregatesMap(std::get<1>(graphs)->maxVertex()+1);
    \n+
    505
    \n+
    506 aggregatesMaps_.push_back(aggregatesMap);
    \n+
    507
    \n+
    508 Timer watch;
    \n+
    509 watch.reset();
    \n+
    510 auto [noAggregates, isoAggregates, oneAggregates, skippedAggregates] =
    \n+
    511 aggregatesMap->buildAggregates(matrix->getmat(), *(std::get<1>(graphs)), criterion, level==0);
    \n+
    512
    \n+
    513 if(rank==0 && criterion.debugLevel()>2)
    \n+
    514 std::cout<<" Have built "<<noAggregates<<" aggregates totally ("<<isoAggregates<<" isolated aggregates, "<<
    \n+
    515 oneAggregates<<" aggregates of one vertex, and skipped "<<
    \n+
    516 skippedAggregates<<" aggregates)."<<std::endl;
    \n+
    517#ifdef TEST_AGGLO
    \n+
    518 {
    \n+
    519 // calculate size of local matrix in the distributed direction
    \n+
    520 int start, end, overlapStart, overlapEnd;
    \n+
    521 int procs=info->communicator().rank();
    \n+
    522 int n = UNKNOWNS/procs; // number of unknowns per process
    \n+
    523 int bigger = UNKNOWNS%procs; // number of process with n+1 unknowns
    \n+
    524
    \n+
    525 // Compute owner region
    \n+
    526 if(rank<bigger) {
    \n+
    527 start = rank*(n+1);
    \n+
    528 end = (rank+1)*(n+1);
    \n+
    529 }else{
    \n+
    530 start = bigger + rank * n;
    \n+
    531 end = bigger + (rank + 1) * n;
    \n+
    532 }
    \n+
    533
    \n+
    534 // Compute overlap region
    \n+
    535 if(start>0)
    \n+
    536 overlapStart = start - 1;
    \n+
    537 else
    \n+
    538 overlapStart = start;
    \n
    539
    \n-
    540 template<typename S,typename T>
    \n-
    \n-\n-
    542 {};
    \n-
    \n-
    543
    \n-
    544 template<typename S, typename T, typename A>
    \n-
    \n-\n-
    546 {
    \n-
    547 typedef typename A::size_type size_type;
    \n-
    548 typedef typename std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::field_type field_type;
    \n-\n-
    550 OverlappingAssigner<S>& assigner_, const field_type& relax_);
    \n-
    551 void operator()(const size_type& domain);
    \n-
    552 void axpy();
    \n-
    553 static constexpr size_t n = std::decay_t<decltype(Impl::asVector(std::declval<T>()))>::dimension;
    \n-
    554
    \n-
    555 private:
    \n-\n-
    557 OverlappingAssigner<S>* assigner;
    \n-
    558 field_type relax;
    \n-
    559 };
    \n-
    \n-
    560
    \n-
    570 template<typename T, class X, class S>
    \n-
    \n-\n-
    572 {};
    \n-
    \n-
    573
    \n-
    574 template<class X, class S>
    \n-
    \n-\n-
    576 {
    \n-\n-
    578 };
    \n-
    \n-
    579
    \n-
    580 template<class X, class S>
    \n-
    \n-\n-
    582 {
    \n-\n-
    584 };
    \n-
    \n-
    585
    \n-
    586 template<class X, class S>
    \n-\n-
    591
    \n-
    603 template<typename T1, typename T2, bool forward>
    \n-
    \n-\n-
    605 {
    \n-
    606 typedef T1 solver_vector;
    \n-
    607 typedef typename solver_vector::iterator solver_iterator;
    \n-\n-
    609 typedef typename subdomain_vector::const_iterator domain_iterator;
    \n-
    610
    \n-
    \n-\n-
    612 {
    \n-
    613 return sv.begin();
    \n-
    614 }
    \n-
    \n-
    615
    \n-
    \n-\n-
    617 {
    \n-
    618 return sv.end();
    \n-
    619 }
    \n-
    \n-
    \n-\n-
    621 {
    \n-
    622 return sv.begin();
    \n-
    623 }
    \n-
    \n+
    540 if(end<UNKNOWNS)
    \n+
    541 overlapEnd = end + 1;
    \n+
    542 else
    \n+
    543 overlapEnd = end;
    \n+
    544
    \n+
    545 assert((UNKNOWNS)*(overlapEnd-overlapStart)==aggregatesMap->noVertices());
    \n+
    546 for(int j=0; j< UNKNOWNS; ++j)
    \n+
    547 for(int i=0; i < UNKNOWNS; ++i)
    \n+
    548 {
    \n+
    549 if(i>=overlapStart && i<overlapEnd)
    \n+
    550 {
    \n+
    551 int no = (j/2)*((UNKNOWNS)/2)+i/2;
    \n+
    552 (*aggregatesMap)[j*(overlapEnd-overlapStart)+i-overlapStart]=no;
    \n+
    553 }
    \n+
    554 }
    \n+
    555 }
    \n+
    556#endif
    \n+
    557 if(criterion.debugLevel()>1 && info->communicator().rank()==0)
    \n+
    558 std::cout<<"aggregating finished."<<std::endl;
    \n+
    559
    \n+
    560 BIGINT gnoAggregates=noAggregates;
    \n+
    561 gnoAggregates = info->communicator().sum(gnoAggregates);
    \n+
    562 double dgnoAggregates = gnoAggregates.todouble();
    \n+
    563#ifdef TEST_AGGLO
    \n+
    564 BIGINT gnoAggregates=((UNKNOWNS)/2)*((UNKNOWNS)/2);
    \n+
    565#endif
    \n+
    566
    \n+
    567 if(criterion.debugLevel()>2 && rank==0)
    \n+
    568 std::cout << "Building "<<dgnoAggregates<<" aggregates took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n+
    569
    \n+
    570 if(dgnoAggregates==0 || dunknowns/dgnoAggregates<criterion.minCoarsenRate())
    \n+
    571 {
    \n+
    572 if(rank==0)
    \n+
    573 {
    \n+
    574 if(dgnoAggregates>0)
    \n+
    575 std::cerr << "Stopped coarsening because of rate breakdown "<<dunknowns<<"/"<<dgnoAggregates
    \n+
    576 <<"="<<dunknowns/dgnoAggregates<<"<"
    \n+
    577 <<criterion.minCoarsenRate()<<std::endl;
    \n+
    578 else
    \n+
    579 std::cerr<< "Could not build any aggregates. Probably no connected nodes."<<std::endl;
    \n+
    580 }
    \n+
    581 aggregatesMap->free();
    \n+
    582 delete aggregatesMap;
    \n+
    583 aggregatesMaps_.pop_back();
    \n+
    584
    \n+
    585 if(criterion.accumulate() && mlevel.isRedistributed() && info->communicator().size()>1) {
    \n+
    586 // coarse level matrix was already redistributed, but to more than 1 process
    \n+
    587 // Therefore need to delete the redistribution. Further down it will
    \n+
    588 // then be redistributed to 1 process
    \n+
    589 delete &(mlevel.getRedistributed().getmat());
    \n+
    590 mlevel.deleteRedistributed();
    \n+
    591 delete &(infoLevel.getRedistributed());
    \n+
    592 infoLevel.deleteRedistributed();
    \n+
    593 redistributes_.back().resetSetup();
    \n+
    594 }
    \n+
    595
    \n+
    596 break;
    \n+
    597 }
    \n+
    598 unknowns = noAggregates;
    \n+
    599 dunknowns = dgnoAggregates;
    \n+
    600
    \n+
    601 CommunicationArgs commargs(info->communicator(),info->category());
    \n+
    602 parallelInformation_.addCoarser(commargs);
    \n+
    603
    \n+
    604 ++infoLevel; // parallel information on coarse level
    \n+
    605
    \n+
    606 typename PropertyMapTypeSelector<VertexVisitedTag,PropertiesGraph>::Type visitedMap =
    \n+
    607 get(VertexVisitedTag(), *(std::get<1>(graphs)));
    \n+
    608
    \n+
    609 watch.reset();
    \n+\n+
    611 ::coarsen(*info,
    \n+
    612 *(std::get<1>(graphs)),
    \n+
    613 visitedMap,
    \n+
    614 *aggregatesMap,
    \n+
    615 *infoLevel,
    \n+
    616 noAggregates,
    \n+
    617 criterion.useFixedOrder());
    \n+
    618 GraphCreator::free(graphs);
    \n+
    619
    \n+
    620 if(criterion.debugLevel()>2) {
    \n+
    621 if(rank==0)
    \n+
    622 std::cout<<"Coarsening of index sets took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n+
    623 }
    \n
    624
    \n-
    \n-\n-
    626 {
    \n-
    627 return sv.end();
    \n-
    628 }
    \n-
    \n-
    629 };
    \n-
    \n-
    630
    \n-
    631 template<typename T1, typename T2>
    \n-
    \n-
    632 struct IteratorDirectionSelector<T1,T2,false>
    \n-
    633 {
    \n-
    634 typedef T1 solver_vector;
    \n-
    635 typedef typename solver_vector::reverse_iterator solver_iterator;
    \n-\n-
    637 typedef typename subdomain_vector::const_reverse_iterator domain_iterator;
    \n-
    638
    \n-
    \n-\n-
    640 {
    \n-
    641 return sv.rbegin();
    \n-
    642 }
    \n-
    \n-
    643
    \n-
    \n-\n-
    645 {
    \n-
    646 return sv.rend();
    \n-
    647 }
    \n-
    \n-
    \n-\n-
    649 {
    \n-
    650 return sv.rbegin();
    \n-
    651 }
    \n-
    \n-
    652
    \n-
    \n-\n-
    654 {
    \n-
    655 return sv.rend();
    \n-
    656 }
    \n-
    \n-
    657 };
    \n-
    \n+
    625 watch.reset();
    \n+
    626
    \n+
    627 infoLevel->buildGlobalLookup(aggregates);
    \n+\n+
    629 *info,
    \n+
    630 infoLevel->globalLookup());
    \n+
    631
    \n+
    632
    \n+
    633 if(criterion.debugLevel()>2) {
    \n+
    634 if(rank==0)
    \n+
    635 std::cout<<"Communicating global aggregate numbers took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n+
    636 }
    \n+
    637
    \n+
    638 watch.reset();
    \n+
    639 std::vector<bool>& visited=excluded;
    \n+
    640
    \n+
    641 typedef std::vector<bool>::iterator Iterator;
    \n+
    642 typedef IteratorPropertyMap<Iterator, IdentityMap> VisitedMap2;
    \n+
    643 Iterator end = visited.end();
    \n+
    644 for(Iterator iter= visited.begin(); iter != end; ++iter)
    \n+
    645 *iter=false;
    \n+
    646
    \n+
    647 VisitedMap2 visitedMap2(visited.begin(), Dune::IdentityMap());
    \n+
    648
    \n+
    649 std::shared_ptr<typename MatrixOperator::matrix_type>
    \n+
    650 coarseMatrix(productBuilder.build(*(std::get<0>(graphs)), visitedMap2,
    \n+
    651 *info,
    \n+
    652 *aggregatesMap,
    \n+
    653 aggregates,
    \n+
    654 OverlapFlags()));
    \n+
    655 dverb<<"Building of sparsity pattern took "<<watch.elapsed()<<std::endl;
    \n+
    656 watch.reset();
    \n+
    657 info->freeGlobalLookup();
    \n
    658
    \n-
    667 template<class T>
    \n-
    \n-\n-
    669 {
    \n-
    670 typedef T smoother;
    \n-
    671 typedef typename smoother::range_type range_type;
    \n-
    672
    \n-
    \n-
    673 static void apply(smoother& sm, range_type& v, const range_type& b)
    \n-
    674 {
    \n-
    675 sm.template apply<true>(v, b);
    \n-
    676 }
    \n-
    \n-
    677 };
    \n-
    \n-
    678
    \n-
    679 template<class M, class X, class TD, class TA>
    \n-
    \n-\n-
    681 {
    \n-\n-\n-
    684
    \n-
    \n-
    685 static void apply(smoother& sm, range_type& v, const range_type& b)
    \n-
    686 {
    \n-
    687 sm.template apply<true>(v, b);
    \n-
    688 sm.template apply<false>(v, b);
    \n-
    689 }
    \n-
    \n-
    690 };
    \n-
    \n-
    691
    \n-
    692 template<class T, bool tag>
    \n-\n-
    695
    \n-
    696 template<class T>
    \n-\n-
    698
    \n-
    699 template<class K, class Al, class X, class Y>
    \n-
    \n-\n-
    701 {
    \n-\n-
    703 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<K>()))>::rows;
    \n-
    704 template<class RowToDomain, class Solvers, class SubDomains>
    \n-
    705 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
    \n-
    706 Solvers& solvers, const SubDomains& domains,
    \n-
    707 bool onTheFly);
    \n-
    708 };
    \n-
    \n-
    709
    \n-
    710 template<template<class> class S, typename T, typename A>
    \n-
    \n-\n-
    712 {
    \n-\n-
    714 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
    \n-
    715 template<class RowToDomain, class Solvers, class SubDomains>
    \n-
    716 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
    \n-
    717 Solvers& solvers, const SubDomains& domains,
    \n-
    718 bool onTheFly);
    \n-
    719 };
    \n-
    \n-
    720
    \n-
    721 template<class M,class X, class Y>
    \n-
    \n-\n-
    723 {
    \n-
    724 typedef M matrix_type;
    \n-
    725 template<class RowToDomain, class Solvers, class SubDomains>
    \n-
    726 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain, const matrix_type& mat,
    \n-
    727 Solvers& solvers, const SubDomains& domains,
    \n-
    728 bool onTheFly);
    \n-
    729 };
    \n-
    \n-
    730
    \n-
    731 template<class M,class X, class Y>
    \n-
    \n-\n-\n-
    734 {};
    \n-
    \n-
    735
    \n-
    736 template<class M,class X, class Y>
    \n-
    \n-\n-\n-
    739 {};
    \n-
    \n-
    740
    \n-
    751 template<class M, class X, class TM=AdditiveSchwarzMode,
    \n-
    752 class TD=ILU0SubdomainSolver<M,X,X>, class TA=std::allocator<X> >
    \n-
    \n-\n-
    754 : public Preconditioner<X,X>
    \n-
    755 {
    \n-
    756 public:
    \n-
    760 typedef M matrix_type;
    \n-
    761
    \n-
    765 typedef X domain_type;
    \n-
    766
    \n-
    770 typedef X range_type;
    \n-
    771
    \n-
    778 typedef TM Mode;
    \n-
    779
    \n-
    783 typedef typename X::field_type field_type;
    \n-
    784
    \n-
    786 typedef typename matrix_type::size_type size_type;
    \n-
    787
    \n-
    789 typedef TA allocator;
    \n-
    790
    \n-
    792 typedef std::set<size_type, std::less<size_type>,
    \n-
    793 typename std::allocator_traits<TA>::template rebind_alloc<size_type> >
    \n-\n-
    795
    \n-
    797 typedef std::vector<subdomain_type, typename std::allocator_traits<TA>::template rebind_alloc<subdomain_type> > subdomain_vector;
    \n-
    798
    \n-\n+
    659 delete std::get<0>(graphs);
    \n+
    660 productBuilder.calculate(matrix->getmat(), *aggregatesMap, *coarseMatrix, *infoLevel, OverlapFlags());
    \n+
    661
    \n+
    662 if(criterion.debugLevel()>2) {
    \n+
    663 if(rank==0)
    \n+
    664 std::cout<<"Calculation entries of Galerkin product took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n+
    665 }
    \n+
    666
    \n+
    667 BIGINT nonzeros = countNonZeros(*coarseMatrix);
    \n+
    668 allnonzeros = allnonzeros + infoLevel->communicator().sum(nonzeros);
    \n+
    669 MatrixArgs args(coarseMatrix, *infoLevel);
    \n+
    670
    \n+
    671 matrices_.addCoarser(args);
    \n+
    672 redistributes_.push_back(RedistributeInfoType());
    \n+
    673 } // end level loop
    \n+
    674
    \n+
    675
    \n+
    676 infoLevel->freeGlobalLookup();
    \n+
    677
    \n+
    678 built_=true;
    \n+
    679 AggregatesMap* aggregatesMap=new AggregatesMap(0);
    \n+
    680 aggregatesMaps_.push_back(aggregatesMap);
    \n+
    681
    \n+
    682 if(criterion.debugLevel()>0) {
    \n+
    683 if(level==criterion.maxLevel()) {
    \n+
    684 BIGINT unknownsLevel = mlevel->getmat().N();
    \n+
    685 unknownsLevel = infoLevel->communicator().sum(unknownsLevel);
    \n+
    686 if(rank==0 && criterion.debugLevel()>1) {
    \n+
    687 double dunknownsLevel = unknownsLevel.todouble();
    \n+
    688 std::cout<<"Level "<<level<<" has "<<dunknownsLevel<<" unknowns, "<<dunknownsLevel/infoLevel->communicator().size()
    \n+
    689 <<" unknowns per proc (procs="<<infoLevel->communicator().size()<<")"<<std::endl;
    \n+
    690 }
    \n+
    691 }
    \n+
    692 }
    \n+
    693
    \n+
    694 if(criterion.accumulate() && !redistributes_.back().isSetup() &&
    \n+
    695 infoLevel->communicator().size()>1) {
    \n+
    696#if HAVE_MPI && !HAVE_PARMETIS
    \n+
    697 if(criterion.accumulate()==successiveAccu &&
    \n+
    698 infoLevel->communicator().rank()==0)
    \n+
    699 std::cerr<<"Successive accumulation of data on coarse levels only works with ParMETIS installed."
    \n+
    700 <<" Fell back to accumulation to one domain on coarsest level"<<std::endl;
    \n+
    701#endif
    \n+
    702
    \n+
    703 // accumulate to fewer processors
    \n+
    704 std::shared_ptr<Matrix> redistMat = std::make_shared<Matrix>();
    \n+
    705 std::shared_ptr<ParallelInformation> redistComm;
    \n+
    706 int nodomains = 1;
    \n+
    707
    \n+
    708 repartitionAndDistributeMatrix(mlevel->getmat(), redistMat, *infoLevel,
    \n+
    709 redistComm, redistributes_.back(), nodomains,criterion);
    \n+
    710 MatrixArgs args(redistMat, *redistComm);
    \n+
    711 BIGINT unknownsRedist = redistMat->N();
    \n+
    712 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);
    \n+
    713
    \n+
    714 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1) {
    \n+
    715 double dunknownsRedist = unknownsRedist.todouble();
    \n+
    716 std::cout<<"Level "<<level<<" redistributed has "<<dunknownsRedist<<" unknowns, "<<dunknownsRedist/redistComm->communicator().size()
    \n+
    717 <<" unknowns per proc (procs="<<redistComm->communicator().size()<<")"<<std::endl;
    \n+
    718 }
    \n+
    719 mlevel.addRedistributed(ConstructionTraits<MatrixOperator>::construct(args));
    \n+
    720 infoLevel.addRedistributed(redistComm);
    \n+
    721 infoLevel->freeGlobalLookup();
    \n+
    722 }
    \n+
    723
    \n+
    724 int levels = matrices_.levels();
    \n+
    725 maxlevels_ = parallelInformation_.finest()->communicator().max(levels);
    \n+
    726 assert(matrices_.levels()==redistributes_.size());
    \n+
    727 if(hasCoarsest() && rank==0 && criterion.debugLevel()>1)
    \n+
    728 std::cout<<"operator complexity: "<<allnonzeros.todouble()/finenonzeros.todouble()<<std::endl;
    \n+
    729
    \n+
    730 }
    \n+
    \n+
    731
    \n+
    732 template<class M, class IS, class A>
    \n+\n+
    \n+\n+
    735 {
    \n+
    736 return matrices_;
    \n+
    737 }
    \n+
    \n+
    738
    \n+
    739 template<class M, class IS, class A>
    \n+\n+
    \n+\n+
    742 {
    \n+
    743 return parallelInformation_;
    \n+
    744 }
    \n+
    \n+
    745
    \n+
    746 template<class M, class IS, class A>
    \n+
    \n+
    747 void MatrixHierarchy<M,IS,A>::getCoarsestAggregatesOnFinest(std::vector<std::size_t>& data) const
    \n+
    748 {
    \n+
    749 int levels=aggregatesMaps().size();
    \n+
    750 int maxlevels=parallelInformation_.finest()->communicator().max(levels);
    \n+
    751 std::size_t size=(*(aggregatesMaps().begin()))->noVertices();
    \n+
    752 // We need an auxiliary vector for the consecutive prolongation.
    \n+
    753 std::vector<std::size_t> tmp;
    \n+
    754 std::vector<std::size_t> *coarse, *fine;
    \n+
    755
    \n+
    756 // make sure the allocated space suffices.
    \n+
    757 tmp.reserve(size);
    \n+
    758 data.reserve(size);
    \n+
    759
    \n+
    760 // Correctly assign coarse and fine for the first prolongation such that
    \n+
    761 // we end up in data in the end.
    \n+
    762 if(levels%2==0) {
    \n+
    763 coarse=&tmp;
    \n+
    764 fine=&data;
    \n+
    765 }else{
    \n+
    766 coarse=&data;
    \n+
    767 fine=&tmp;
    \n+
    768 }
    \n+
    769
    \n+
    770 // Number the unknowns on the coarsest level consecutively for each process.
    \n+
    771 if(levels==maxlevels) {
    \n+
    772 const AggregatesMap& map = *(*(++aggregatesMaps().rbegin()));
    \n+
    773 std::size_t m=0;
    \n+
    774
    \n+
    775 for(typename AggregatesMap::const_iterator iter = map.begin(); iter != map.end(); ++iter)
    \n+
    776 if(*iter< AggregatesMap::ISOLATED)
    \n+
    777 m=std::max(*iter,m);
    \n+
    778
    \n+
    779 coarse->resize(m+1);
    \n+
    780 std::size_t i=0;
    \n+
    781 srand((unsigned)std::clock());
    \n+
    782 std::set<size_t> used;
    \n+
    783 for(typename std::vector<std::size_t>::iterator iter=coarse->begin(); iter != coarse->end();
    \n+
    784 ++iter, ++i)
    \n+
    785 {
    \n+
    786 std::pair<std::set<std::size_t>::iterator,bool> ibpair
    \n+
    787 = used.insert(static_cast<std::size_t>((((double)rand())/(RAND_MAX+1.0)))*coarse->size());
    \n+
    788
    \n+
    789 while(!ibpair.second)
    \n+
    790 ibpair = used.insert(static_cast<std::size_t>((((double)rand())/(RAND_MAX+1.0))*coarse->size()));
    \n+
    791 *iter=*(ibpair.first);
    \n+
    792 }
    \n+
    793 }
    \n+
    794
    \n+
    795 typename ParallelInformationHierarchy::Iterator pinfo = parallelInformation().coarsest();
    \n+
    796 --pinfo;
    \n+
    797
    \n+
    798 // Now consecutively project the numbers to the finest level.
    \n+
    799 for(typename AggregatesMapList::const_reverse_iterator aggregates=++aggregatesMaps().rbegin();
    \n+
    800 aggregates != aggregatesMaps().rend(); ++aggregates,--levels) {
    \n
    801
    \n-
    803 typedef std::vector<subdomain_list, typename std::allocator_traits<TA>::template rebind_alloc<subdomain_list> > rowtodomain_vector;
    \n-
    804
    \n-
    806 typedef TD slu;
    \n-
    807
    \n-
    809 typedef std::vector<slu, typename std::allocator_traits<TA>::template rebind_alloc<slu> > slu_vector;
    \n-
    810
    \n-
    \n-\n-
    825 field_type relaxationFactor=1, bool onTheFly_=true);
    \n-
    826
    \n-
    \n-\n-
    839 field_type relaxationFactor=1, bool onTheFly_=true);
    \n-
    840
    \n-
    \n-
    846 virtual void pre ([[maybe_unused]] X& x, [[maybe_unused]] X& b)
    \n-
    847 {}
    \n-
    \n-
    848
    \n-
    \n-
    854 virtual void apply (X& v, const X& d);
    \n-
    855
    \n-
    \n-
    861 virtual void post ([[maybe_unused]] X& x)
    \n-
    862 {}
    \n-
    \n-
    863
    \n-
    864 template<bool forward>
    \n-
    \n-
    865 void apply(X& v, const X& d);
    \n-
    866
    \n-
    \n-\n-
    869 {
    \n-\n-
    871 }
    \n-
    \n-
    872
    \n-
    873 private:
    \n-
    874 const M& mat;
    \n-
    875 slu_vector solvers;
    \n-
    876 subdomain_vector subDomains;
    \n-
    877 field_type relax;
    \n-
    878
    \n-
    879 typename M::size_type maxlength;
    \n-
    880
    \n-
    881 bool onTheFly;
    \n-
    882 };
    \n-
    883
    \n-
    884
    \n-
    885
    \n-
    886 template<class I, class S, class D>
    \n-
    \n-\n-
    888 const IndexSet& idx,
    \n-
    889 const subdomain_vector& domains_)
    \n-
    890 : initializers(&il), indices(&idx), indexMaps(il.size()), domains(domains_)
    \n-
    891 {}
    \n-
    \n-
    892
    \n-
    893
    \n-
    894 template<class I, class S, class D>
    \n-
    \n-\n-
    896 {
    \n-
    897 typedef typename IndexSet::value_type::const_iterator iterator;
    \n-
    898 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)[row.index()].end(); ++domain) {
    \n-
    899 (*initializers)[*domain].addRowNnz(row, domains[*domain]);
    \n-
    900 indexMaps[*domain].insert(row.index());
    \n-
    901 }
    \n-
    902 }
    \n-
    \n-
    903
    \n-
    904 template<class I, class S, class D>
    \n-
    \n-\n-
    906 {
    \n-
    907 for(auto&& i: *initializers)
    \n-
    908 i.allocateMatrixStorage();
    \n-
    909 for(auto&& i: *initializers)
    \n-
    910 i.allocateMarker();
    \n-
    911 }
    \n-
    \n-
    912
    \n-
    913 template<class I, class S, class D>
    \n-
    \n-\n-
    915 {
    \n-
    916 typedef typename IndexSet::value_type::const_iterator iterator;
    \n-
    917 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)[row.index()].end(); ++domain) {
    \n-
    918 typename std::map<size_type,size_type>::const_iterator v = indexMaps[*domain].find(col.index());
    \n-
    919 if(v!= indexMaps[*domain].end()) {
    \n-
    920 (*initializers)[*domain].countEntries(indexMaps[*domain].find(col.index())->second);
    \n-
    921 }
    \n-
    922 }
    \n-
    923 }
    \n-
    \n-
    924
    \n-
    925 template<class I, class S, class D>
    \n-
    \n-\n-
    927 {
    \n-
    928 for(auto&& i : *initializers)
    \n-
    929 i.calcColstart();
    \n-
    930 }
    \n-
    \n-
    931
    \n-
    932 template<class I, class S, class D>
    \n-
    \n-\n-
    934 {
    \n-
    935 typedef typename IndexSet::value_type::const_iterator iterator;
    \n-
    936 for(iterator domain=(*indices)[row.index()].begin(); domain!= (*indices)[row.index()].end(); ++domain) {
    \n-
    937 typename std::map<size_type,size_type>::const_iterator v = indexMaps[*domain].find(col.index());
    \n-
    938 if(v!= indexMaps[*domain].end()) {
    \n-
    939 assert(indexMaps[*domain].end()!=indexMaps[*domain].find(row.index()));
    \n-
    940 (*initializers)[*domain].copyValue(col, indexMaps[*domain].find(row.index())->second,
    \n-
    941 v->second);
    \n-
    942 }
    \n-
    943 }
    \n-
    944 }
    \n-
    \n-
    945
    \n-
    946 template<class I, class S, class D>
    \n-
    \n-\n-
    948 {
    \n-
    949 std::vector<IndexMap>().swap(indexMaps);
    \n-
    950 for(auto&& i: *initializers)
    \n-
    951 i.createMatrix();
    \n-
    952 }
    \n-
    \n-
    953
    \n-
    954 template<class I, class S, class D>
    \n-\n-
    958
    \n-
    959 template<class I, class S, class D>
    \n-
    \n-\n-
    961 {
    \n-
    962 assert(map_.find(grow)==map_.end());
    \n-
    963 map_.insert(std::make_pair(grow, row++));
    \n-
    964 }
    \n+
    802 fine->resize((*aggregates)->noVertices());
    \n+
    803 fine->assign(fine->size(), 0);
    \n+\n+
    805 ::prolongateVector(*(*aggregates), *coarse, *fine, static_cast<std::size_t>(1), *pinfo);
    \n+
    806 --pinfo;
    \n+
    807 std::swap(coarse, fine);
    \n+
    808 }
    \n+
    809
    \n+
    810 // Assertion to check that we really projected to data on the last step.
    \n+
    811 assert(coarse==&data);
    \n+
    812 }
    \n+
    \n+
    813
    \n+
    814 template<class M, class IS, class A>
    \n+\n+
    \n+\n+
    817 {
    \n+
    818 return aggregatesMaps_;
    \n+
    819 }
    \n+
    \n+
    820 template<class M, class IS, class A>
    \n+\n+
    \n+\n+
    823 {
    \n+
    824 return redistributes_;
    \n+
    825 }
    \n
    \n+
    826
    \n+
    827 template<class M, class IS, class A>
    \n+
    \n+\n+
    829 {
    \n+
    830 typedef typename AggregatesMapList::reverse_iterator AggregatesMapIterator;
    \n+
    831 typedef typename ParallelMatrixHierarchy::Iterator Iterator;
    \n+
    832 typedef typename ParallelInformationHierarchy::Iterator InfoIterator;
    \n+
    833
    \n+
    834 AggregatesMapIterator amap = aggregatesMaps_.rbegin();
    \n+
    835 InfoIterator info = parallelInformation_.coarsest();
    \n+
    836 for(Iterator level=matrices_.coarsest(), finest=matrices_.finest(); level != finest; --level, --info, ++amap) {
    \n+
    837 (*amap)->free();
    \n+
    838 delete *amap;
    \n+
    839 }
    \n+
    840 delete *amap;
    \n+
    841 }
    \n+
    \n+
    842
    \n+
    843 template<class M, class IS, class A>
    \n+
    844 template<class V, class BA, class TA>
    \n+
    \n+\n+
    846 {
    \n+
    847 assert(hierarchy.levels()==1);
    \n+
    848 typedef typename ParallelMatrixHierarchy::ConstIterator Iterator;
    \n+
    849 typedef typename RedistributeInfoList::const_iterator RIter;
    \n+
    850 RIter redist = redistributes_.begin();
    \n+
    851
    \n+
    852 Iterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();
    \n+
    853 int level=0;
    \n+
    854 if(redist->isSetup())
    \n+
    855 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N());
    \n+
    856 Dune::dvverb<<"Level "<<level<<" has "<<matrices_.finest()->getmat().N()<<" unknowns!"<<std::endl;
    \n+
    857
    \n+
    858 while(matrix != coarsest) {
    \n+
    859 ++matrix; ++level; ++redist;
    \n+
    860 Dune::dvverb<<"Level "<<level<<" has "<<matrix->getmat().N()<<" unknowns!"<<std::endl;
    \n+
    861
    \n+
    862 hierarchy.addCoarser(matrix->getmat().N());
    \n+
    863 if(redist->isSetup())
    \n+
    864 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N());
    \n+
    865
    \n+
    866 }
    \n+
    867
    \n+
    868 }
    \n+
    \n+
    869
    \n+
    870 template<class M, class IS, class A>
    \n+
    871 template<class S, class TA>
    \n+
    \n+\n+
    873 const typename SmootherTraits<S>::Arguments& sargs) const
    \n+
    874 {
    \n+
    875 assert(smoothers.levels()==0);
    \n+
    876 typedef typename ParallelMatrixHierarchy::ConstIterator MatrixIterator;
    \n+
    877 typedef typename ParallelInformationHierarchy::ConstIterator PinfoIterator;
    \n+
    878 typedef typename AggregatesMapList::const_iterator AggregatesIterator;
    \n+
    879
    \n+\n+
    881 cargs.setArgs(sargs);
    \n+
    882 PinfoIterator pinfo = parallelInformation_.finest();
    \n+
    883 AggregatesIterator aggregates = aggregatesMaps_.begin();
    \n+
    884 int level=0;
    \n+
    885 for(MatrixIterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();
    \n+
    886 matrix != coarsest; ++matrix, ++pinfo, ++aggregates, ++level) {
    \n+
    887 cargs.setMatrix(matrix->getmat(), **aggregates);
    \n+
    888 cargs.setComm(*pinfo);
    \n+
    889 smoothers.addCoarser(cargs);
    \n+
    890 }
    \n+
    891 if(maxlevels()>levels()) {
    \n+
    892 // This is not the globally coarsest level and therefore smoothing is needed
    \n+
    893 cargs.setMatrix(matrices_.coarsest()->getmat(), **aggregates);
    \n+
    894 cargs.setComm(*pinfo);
    \n+
    895 smoothers.addCoarser(cargs);
    \n+
    896 ++level;
    \n+
    897 }
    \n+
    898 }
    \n+
    \n+
    899
    \n+
    900 template<class M, class IS, class A>
    \n+
    901 template<class F>
    \n+
    \n+\n+
    903 {
    \n+
    904 typedef typename AggregatesMapList::iterator AggregatesMapIterator;
    \n+
    905 typedef typename ParallelMatrixHierarchy::Iterator Iterator;
    \n+
    906 typedef typename ParallelInformationHierarchy::Iterator InfoIterator;
    \n+
    907
    \n+
    908 AggregatesMapIterator amap = aggregatesMaps_.begin();
    \n+
    909 BaseGalerkinProduct productBuilder;
    \n+
    910 InfoIterator info = parallelInformation_.finest();
    \n+
    911 typename RedistributeInfoList::iterator riIter = redistributes_.begin();
    \n+
    912 Iterator level = matrices_.finest(), coarsest=matrices_.coarsest();
    \n+
    913 if(level.isRedistributed()) {
    \n+
    914 info->buildGlobalLookup(level->getmat().N());
    \n+
    915 redistributeMatrixEntries(const_cast<Matrix&>(level->getmat()),
    \n+
    916 const_cast<Matrix&>(level.getRedistributed().getmat()),
    \n+
    917 *info,info.getRedistributed(), *riIter);
    \n+
    918 info->freeGlobalLookup();
    \n+
    919 }
    \n+
    920
    \n+
    921 for(; level!=coarsest; ++amap) {
    \n+
    922 const Matrix& fine = (level.isRedistributed() ? level.getRedistributed() : *level).getmat();
    \n+
    923 ++level;
    \n+
    924 ++info;
    \n+
    925 ++riIter;
    \n+
    926 productBuilder.calculate(fine, *(*amap), const_cast<Matrix&>(level->getmat()), *info, copyFlags);
    \n+
    927 if(level.isRedistributed()) {
    \n+
    928 info->buildGlobalLookup(level->getmat().N());
    \n+
    929 redistributeMatrixEntries(const_cast<Matrix&>(level->getmat()),
    \n+
    930 const_cast<Matrix&>(level.getRedistributed().getmat()), *info,
    \n+
    931 info.getRedistributed(), *riIter);
    \n+
    932 info->freeGlobalLookup();
    \n+
    933 }
    \n+
    934 }
    \n+
    935 }
    \n+
    \n+
    936
    \n+
    937 template<class M, class IS, class A>
    \n+
    \n+\n+
    939 {
    \n+
    940 return matrices_.levels();
    \n+
    941 }
    \n+
    \n+
    942
    \n+
    943 template<class M, class IS, class A>
    \n+
    \n+\n+
    945 {
    \n+
    946 return maxlevels_;
    \n+
    947 }
    \n+
    \n+
    948
    \n+
    949 template<class M, class IS, class A>
    \n+
    \n+\n+
    951 {
    \n+
    952 return levels()==maxlevels() &&
    \n+
    953 (!matrices_.coarsest().isRedistributed() ||matrices_.coarsest()->getmat().N()>0);
    \n+
    954 }
    \n+
    \n+
    955
    \n+
    956 template<class M, class IS, class A>
    \n+
    \n+\n+
    958 {
    \n+
    959 return built_;
    \n+
    960 }
    \n+
    \n+
    961
    \n+
    963 } // namespace Amg
    \n+
    964} // namespace Dune
    \n
    965
    \n-
    966 template<class I, class S, class D>
    \n-
    967 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
    \n-
    \n-\n-
    969 {
    \n-
    970 return map_.find(grow);
    \n-
    971 }
    \n-
    \n-
    972
    \n-
    973 template<class I, class S, class D>
    \n-
    974 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
    \n-
    \n-\n-
    976 {
    \n-
    977 return map_.find(grow);
    \n-
    978 }
    \n-
    \n-
    979
    \n-
    980 template<class I, class S, class D>
    \n-
    981 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
    \n-
    \n-\n-
    983 {
    \n-
    984 return map_.end();
    \n-
    985 }
    \n-
    \n-
    986
    \n-
    987 template<class I, class S, class D>
    \n-
    988 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
    \n-
    \n-\n-
    990 {
    \n-
    991 return map_.end();
    \n-
    992 }
    \n-
    \n-
    993
    \n-
    994 template<class I, class S, class D>
    \n-
    995 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::const_iterator
    \n-
    \n-\n-
    997 {
    \n-
    998 return map_.begin();
    \n-
    999 }
    \n-
    \n-
    1000
    \n-
    1001 template<class I, class S, class D>
    \n-
    1002 typename OverlappingSchwarzInitializer<I,S,D>::IndexMap::iterator
    \n-
    \n-\n-
    1004 {
    \n-
    1005 return map_.begin();
    \n-
    1006 }
    \n-
    \n-
    1007
    \n-
    1008 template<class M, class X, class TM, class TD, class TA>
    \n-
    \n-\n-
    1010 field_type relaxationFactor, bool fly)
    \n-
    1011 : mat(mat_), relax(relaxationFactor), onTheFly(fly)
    \n-
    1012 {
    \n-
    1013 typedef typename rowtodomain_vector::const_iterator RowDomainIterator;
    \n-
    1014 typedef typename subdomain_list::const_iterator DomainIterator;
    \n-
    1015#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1016 assert(rowToDomain.size()==mat.N());
    \n-
    1017 assert(rowToDomain.size()==mat.M());
    \n-
    1018
    \n-
    1019 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter)
    \n-
    1020 assert(iter->size()>0);
    \n-
    1021
    \n-
    1022#endif
    \n-
    1023 // calculate the number of domains
    \n-
    1024 size_type domains=0;
    \n-
    1025 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter)
    \n-
    1026 for(DomainIterator d=iter->begin(); d != iter->end(); ++d)
    \n-
    1027 domains=std::max(domains, *d);
    \n-
    1028 ++domains;
    \n-
    1029
    \n-
    1030 solvers.resize(domains);
    \n-
    1031 subDomains.resize(domains);
    \n-
    1032
    \n-
    1033 // initialize subdomains to row mapping from row to subdomain mapping
    \n-
    1034 size_type row=0;
    \n-
    1035 for(RowDomainIterator iter=rowToDomain.begin(); iter != rowToDomain.end(); ++iter, ++row)
    \n-
    1036 for(DomainIterator d=iter->begin(); d != iter->end(); ++d)
    \n-
    1037 subDomains[*d].insert(row);
    \n-
    1038
    \n-
    1039#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1040 size_type i=0;
    \n-
    1041 typedef typename subdomain_vector::const_iterator iterator;
    \n-
    1042 for(iterator iter=subDomains.begin(); iter != subDomains.end(); ++iter) {
    \n-
    1043 typedef typename subdomain_type::const_iterator entry_iterator;
    \n-
    1044 Dune::dvverb<<"domain "<<i++<<":";
    \n-
    1045 for(entry_iterator entry = iter->begin(); entry != iter->end(); ++entry) {
    \n-
    1046 Dune::dvverb<<" "<<*entry;
    \n-
    1047 }
    \n-
    1048 Dune::dvverb<<std::endl;
    \n-
    1049 }
    \n-
    1050#endif
    \n-\n-
    1052 ::assembleLocalProblems(rowToDomain, mat, solvers, subDomains, onTheFly);
    \n-
    1053 }
    \n-
    \n-
    1054
    \n-
    1055 template<class M, class X, class TM, class TD, class TA>
    \n-
    \n-\n-
    1057 const subdomain_vector& sd,
    \n-
    1058 field_type relaxationFactor,
    \n-
    1059 bool fly)
    \n-
    1060 : mat(mat_), solvers(sd.size()), subDomains(sd), relax(relaxationFactor),
    \n-
    1061 onTheFly(fly)
    \n-
    1062 {
    \n-
    1063 typedef typename subdomain_vector::const_iterator DomainIterator;
    \n-
    1064
    \n-
    1065#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1066 size_type i=0;
    \n-
    1067
    \n-
    1068 for(DomainIterator d=sd.begin(); d != sd.end(); ++d,++i) {
    \n-
    1069 //std::cout<<i<<": "<<d->size()<<std::endl;
    \n-
    1070 assert(d->size()>0);
    \n-
    1071 typedef typename DomainIterator::value_type::const_iterator entry_iterator;
    \n-
    1072 Dune::dvverb<<"domain "<<i<<":";
    \n-
    1073 for(entry_iterator entry = d->begin(); entry != d->end(); ++entry) {
    \n-
    1074 Dune::dvverb<<" "<<*entry;
    \n-
    1075 }
    \n-
    1076 Dune::dvverb<<std::endl;
    \n-
    1077 }
    \n-
    1078
    \n-
    1079#endif
    \n-
    1080
    \n-
    1081 // Create a row to subdomain mapping
    \n-\n-
    1083
    \n-\n-
    1085
    \n-
    1086 for(DomainIterator domain=sd.begin(); domain != sd.end(); ++domain, ++domainId) {
    \n-
    1087 typedef typename subdomain_type::const_iterator iterator;
    \n-
    1088 for(iterator row=domain->begin(); row != domain->end(); ++row)
    \n-
    1089 rowToDomain[*row].push_back(domainId);
    \n-
    1090 }
    \n-
    1091
    \n-\n-
    1093 ::assembleLocalProblems(rowToDomain, mat, solvers, subDomains, onTheFly);
    \n-
    1094 }
    \n-
    \n-
    1095
    \n-
    1102 template<class M>
    \n-\n-
    1104
    \n-
    1105 template<typename T, typename A>
    \n-
    \n-\n-
    1107 {
    \n-
    1108 static constexpr size_t n = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::rows;
    \n-
    1109 static constexpr size_t m = std::decay_t<decltype(Impl::asMatrix(std::declval<T>()))>::cols;
    \n-
    1110 template<class Domain>
    \n-
    \n-
    1111 static int size(const Domain & d)
    \n-
    1112 {
    \n-
    1113 assert(n==m);
    \n-
    1114 return m*d.size();
    \n-
    1115 }
    \n-
    \n-
    1116 };
    \n-
    \n-
    1117
    \n-
    1118 template<class K, class Al, class X, class Y>
    \n-
    1119 template<class RowToDomain, class Solvers, class SubDomains>
    \n-
    1120 std::size_t
    \n-
    \n-\n-
    1122 assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain,
    \n-
    1123 [[maybe_unused]] const matrix_type& mat,
    \n-
    1124 [[maybe_unused]] Solvers& solvers,
    \n-
    1125 const SubDomains& subDomains,
    \n-
    1126 [[maybe_unused]] bool onTheFly)
    \n-
    1127 {
    \n-
    1128 typedef typename SubDomains::const_iterator DomainIterator;
    \n-
    1129 std::size_t maxlength = 0;
    \n-
    1130
    \n-
    1131 assert(onTheFly);
    \n-
    1132
    \n-
    1133 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
    \n-
    1134 maxlength=std::max(maxlength, domain->size());
    \n-
    1135 maxlength*=n;
    \n-
    1136
    \n-
    1137 return maxlength;
    \n-
    1138 }
    \n-
    \n-
    1139
    \n-
    1140#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n-
    1141 template<template<class> class S, typename T, typename A>
    \n-
    1142 template<class RowToDomain, class Solvers, class SubDomains>
    \n-
    \n-
    1143 std::size_t SeqOverlappingSchwarzAssemblerHelper<S<BCRSMatrix<T,A>>,true>::assembleLocalProblems(const RowToDomain& rowToDomain,
    \n-
    1144 const matrix_type& mat,
    \n-
    1145 Solvers& solvers,
    \n-
    1146 const SubDomains& subDomains,
    \n-
    1147 bool onTheFly)
    \n-
    1148 {
    \n-
    1149 typedef typename S<BCRSMatrix<T,A>>::MatrixInitializer MatrixInitializer;
    \n-
    1150 typedef typename std::vector<MatrixInitializer>::iterator InitializerIterator;
    \n-
    1151 typedef typename SubDomains::const_iterator DomainIterator;
    \n-
    1152 typedef typename Solvers::iterator SolverIterator;
    \n-
    1153 std::size_t maxlength = 0;
    \n-
    1154
    \n-
    1155 if(onTheFly) {
    \n-
    1156 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
    \n-
    1157 maxlength=std::max(maxlength, domain->size());
    \n-
    1158 maxlength*=Impl::asMatrix(*mat[0].begin()).N();
    \n-
    1159 }else{
    \n-
    1160 // initialize the initializers
    \n-
    1161 DomainIterator domain=subDomains.begin();
    \n-
    1162
    \n-
    1163 // Create the initializers list.
    \n-
    1164 std::vector<MatrixInitializer> initializers(subDomains.size());
    \n-
    1165
    \n-
    1166 SolverIterator solver=solvers.begin();
    \n-
    1167 for(InitializerIterator initializer=initializers.begin(); initializer!=initializers.end();
    \n-
    1168 ++initializer, ++solver, ++domain) {
    \n-
    1169 solver->getInternalMatrix().N_=SeqOverlappingSchwarzDomainSize<matrix_type>::size(*domain);
    \n-
    1170 solver->getInternalMatrix().M_=SeqOverlappingSchwarzDomainSize<matrix_type>::size(*domain);
    \n-
    1171 //solver->setVerbosity(true);
    \n-
    1172 *initializer=MatrixInitializer(solver->getInternalMatrix());
    \n-
    1173 }
    \n-
    1174
    \n-
    1175 // Set up the supermatrices according to the subdomains
    \n-\n-
    1177 RowToDomain, SubDomains> Initializer;
    \n-
    1178
    \n-
    1179 Initializer initializer(initializers, rowToDomain, subDomains);
    \n-
    1180 copyToBCCSMatrix(initializer, mat);
    \n-
    1181
    \n-
    1182 // Calculate the LU decompositions
    \n-
    1183 for(auto&& s: solvers)
    \n-
    1184 s.decompose();
    \n-
    1185 for (SolverIterator solverIt = solvers.begin(); solverIt != solvers.end(); ++solverIt)
    \n-
    1186 {
    \n-
    1187 assert(solverIt->getInternalMatrix().N() == solverIt->getInternalMatrix().M());
    \n-
    1188 maxlength = std::max(maxlength, solverIt->getInternalMatrix().N());
    \n-
    1189 }
    \n-
    1190 }
    \n-
    1191 return maxlength;
    \n-
    1192 }
    \n-
    \n-
    1193
    \n-
    1194#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n-
    1195
    \n-
    1196 template<class M,class X,class Y>
    \n-
    1197 template<class RowToDomain, class Solvers, class SubDomains>
    \n-
    \n-
    1198 std::size_t SeqOverlappingSchwarzAssemblerILUBase<M,X,Y>::assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain,
    \n-
    1199 const matrix_type& mat,
    \n-
    1200 Solvers& solvers,
    \n-
    1201 const SubDomains& subDomains,
    \n-
    1202 bool onTheFly)
    \n-
    1203 {
    \n-
    1204 typedef typename SubDomains::const_iterator DomainIterator;
    \n-
    1205 typedef typename Solvers::iterator SolverIterator;
    \n-
    1206 std::size_t maxlength = 0;
    \n-
    1207
    \n-
    1208 if(onTheFly) {
    \n-
    1209 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end(); ++domain)
    \n-
    1210 maxlength=std::max(maxlength, domain->size());
    \n-
    1211 }else{
    \n-
    1212 // initialize the solvers of the local problems.
    \n-
    1213 SolverIterator solver=solvers.begin();
    \n-
    1214 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();
    \n-
    1215 ++domain, ++solver) {
    \n-
    1216 solver->setSubMatrix(mat, *domain);
    \n-
    1217 maxlength=std::max(maxlength, domain->size());
    \n-
    1218 }
    \n-
    1219 }
    \n-
    1220
    \n-
    1221 return maxlength;
    \n-
    1222
    \n-
    1223 }
    \n-
    \n-
    1224
    \n-
    1225
    \n-
    1226 template<class M, class X, class TM, class TD, class TA>
    \n-
    \n-\n-
    1228 {
    \n-\n-
    1230 }
    \n-
    \n-
    1231
    \n-
    1232 template<class M, class X, class TM, class TD, class TA>
    \n-
    1233 template<bool forward>
    \n-
    \n-\n-
    1235 {
    \n-
    1236 typedef slu_vector solver_vector;
    \n-\n-\n-
    1239 domain_iterator;
    \n-
    1240
    \n-
    1241 OverlappingAssigner<TD> assigner(maxlength, mat, b, x);
    \n-
    1242
    \n-\n-\n-
    1245 X v(x); // temporary for the update
    \n-
    1246 v=0;
    \n-
    1247
    \n-
    1248 typedef typename AdderSelector<TM,X,TD >::Adder Adder;
    \n-
    1249 Adder adder(v, x, assigner, relax);
    \n-
    1250
    \n-\n-
    1252 //Copy rhs to C-array for SuperLU
    \n-
    1253 std::for_each(domain->begin(), domain->end(), assigner);
    \n-
    1254 assigner.resetIndexForNextDomain();
    \n-
    1255 if(onTheFly) {
    \n-
    1256 // Create the subdomain solver
    \n-
    1257 slu sdsolver;
    \n-
    1258 sdsolver.setSubMatrix(mat, *domain);
    \n-
    1259 // Apply
    \n-
    1260 sdsolver.apply(assigner.lhs(), assigner.rhs());
    \n-
    1261 }else{
    \n-
    1262 solver->apply(assigner.lhs(), assigner.rhs());
    \n-
    1263 ++solver;
    \n-
    1264 }
    \n-
    1265
    \n-
    1266 //Add relaxed correction to from SuperLU to v
    \n-
    1267 std::for_each(domain->begin(), domain->end(), adder);
    \n-
    1268 assigner.resetIndexForNextDomain();
    \n-
    1269
    \n-
    1270 }
    \n-
    1271
    \n-
    1272 adder.axpy();
    \n-
    1273 assigner.deallocate();
    \n-
    1274 }
    \n-
    \n-
    \n-
    1275
    \n-
    1276 template<class K, class Al, class X, class Y>
    \n-\n-
    \n-
    1278 ::OverlappingAssignerHelper(std::size_t maxlength, const BCRSMatrix<K, Al>& mat_,
    \n-
    1279 const X& b_, Y& x_) :
    \n-
    1280 mat(&mat_),
    \n-
    1281 rhs_( new DynamicVector<field_type>(maxlength, 42) ),
    \n-
    1282 lhs_( new DynamicVector<field_type>(maxlength, -42) ),
    \n-
    1283 b(&b_),
    \n-
    1284 x(&x_),
    \n-
    1285 i(0),
    \n-
    1286 maxlength_(maxlength)
    \n-
    1287 {}
    \n-
    \n-
    1288
    \n-
    1289 template<class K, class Al, class X, class Y>
    \n-
    1290 void
    \n-\n-
    \n-
    1292 ::deallocate()
    \n-
    1293 {
    \n-
    1294 delete rhs_;
    \n-
    1295 delete lhs_;
    \n-
    1296 }
    \n-
    \n-
    1297
    \n-
    1298 template<class K, class Al, class X, class Y>
    \n-
    1299 void
    \n-\n-
    \n-
    1301 ::resetIndexForNextDomain()
    \n-
    1302 {
    \n-
    1303 i=0;
    \n-
    1304 }
    \n-
    \n-
    1305
    \n-
    1306 template<class K, class Al, class X, class Y>
    \n-
    1307 DynamicVector<typename X::field_type> &
    \n-\n-
    \n-
    1309 ::lhs()
    \n-
    1310 {
    \n-
    1311 return *lhs_;
    \n-
    1312 }
    \n-
    \n-
    1313
    \n-
    1314 template<class K, class Al, class X, class Y>
    \n-
    1315 DynamicVector<typename X::field_type> &
    \n-\n-
    \n-
    1317 ::rhs()
    \n-
    1318 {
    \n-
    1319 return *rhs_;
    \n-
    1320 }
    \n-
    \n-
    1321
    \n-
    1322 template<class K, class Al, class X, class Y>
    \n-
    1323 void
    \n-\n-
    \n-
    1325 ::relaxResult(field_type relax)
    \n-
    1326 {
    \n-
    1327 lhs() *= relax;
    \n-
    1328 }
    \n-
    \n-
    1329
    \n-
    1330 template<class K, class Al, class X, class Y>
    \n-
    1331 void
    \n-\n-
    \n-
    1333 ::operator()(const size_type& domainIndex)
    \n-
    1334 {
    \n-
    1335 lhs() = 0.0;
    \n-
    1336#if 0
    \n-
    1337 //assign right hand side of current domainindex block
    \n-
    1338 for(size_type j=0; j<n; ++j, ++i) {
    \n-
    1339 assert(i<maxlength_);
    \n-
    1340 rhs()[i]=(*b)[domainIndex][j];
    \n-
    1341 }
    \n-
    1342
    \n-
    1343 // loop over all Matrix row entries and calculate defect.
    \n-
    1344 typedef typename matrix_type::ConstColIterator col_iterator;
    \n-
    1345
    \n-
    1346 // calculate defect for current row index block
    \n-
    1347 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
    \n-
    1348 block_type tmp(0.0);
    \n-
    1349 (*col).mv((*x)[col.index()], tmp);
    \n-
    1350 i-=n;
    \n-
    1351 for(size_type j=0; j<n; ++j, ++i) {
    \n-
    1352 assert(i<maxlength_);
    \n-
    1353 rhs()[i]-=tmp[j];
    \n-
    1354 }
    \n-
    1355 }
    \n-
    1356#else
    \n-
    1357 //assign right hand side of current domainindex block
    \n-
    1358 for(size_type j=0; j<n; ++j, ++i) {
    \n-
    1359 assert(i<maxlength_);
    \n-
    1360 rhs()[i]=Impl::asVector((*b)[domainIndex])[j];
    \n-
    1361
    \n-
    1362 // loop over all Matrix row entries and calculate defect.
    \n-
    1363 typedef typename matrix_type::ConstColIterator col_iterator;
    \n-
    1364
    \n-
    1365 // calculate defect for current row index block
    \n-
    1366 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
    \n-
    1367 for(size_type k=0; k<n; ++k) {
    \n-
    1368 rhs()[i]-=Impl::asMatrix(*col)[j][k] * Impl::asVector((*x)[col.index()])[k];
    \n-
    1369 }
    \n-
    1370 }
    \n-
    1371 }
    \n-
    1372#endif
    \n-
    1373 }
    \n-
    \n-
    1374
    \n-
    1375 template<class K, class Al, class X, class Y>
    \n-
    1376 void
    \n-\n-
    \n-
    1378 ::assignResult(block_type& res)
    \n-
    1379 {
    \n-
    1380 // assign the result of the local solve to the global vector
    \n-
    1381 for(size_type j=0; j<n; ++j, ++i) {
    \n-
    1382 assert(i<maxlength_);
    \n-
    1383 Impl::asVector(res)[j]+=lhs()[i];
    \n-
    1384 }
    \n-
    1385 }
    \n-
    \n-
    1386
    \n-
    1387#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n-
    1388
    \n-
    1389 template<template<class> class S, typename T, typename A>
    \n-\n-
    \n-
    1391 ::OverlappingAssignerHelper(std::size_t maxlength,
    \n-
    1392 const BCRSMatrix<T,A>& mat_,
    \n-
    1393 const range_type& b_,
    \n-
    1394 range_type& x_)
    \n-
    1395 : mat(&mat_),
    \n-
    1396 b(&b_),
    \n-
    1397 x(&x_), i(0), maxlength_(maxlength)
    \n-
    1398 {
    \n-
    1399 rhs_ = new field_type[maxlength];
    \n-
    1400 lhs_ = new field_type[maxlength];
    \n-
    1401
    \n-
    1402 }
    \n-
    \n-
    1403
    \n-
    1404 template<template<class> class S, typename T, typename A>
    \n-
    \n-\n-
    1406 {
    \n-
    1407 delete[] rhs_;
    \n-
    1408 delete[] lhs_;
    \n-
    1409 }
    \n-
    \n-
    1410
    \n-
    1411 template<template<class> class S, typename T, typename A>
    \n-
    \n-
    1412 void OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::operator()(const size_type& domainIndex)
    \n-
    1413 {
    \n-
    1414 //assign right hand side of current domainindex block
    \n-
    1415 // rhs is an array of doubles!
    \n-
    1416 // rhs[starti] = b[domainindex]
    \n-
    1417 for(size_type j=0; j<n; ++j, ++i) {
    \n-
    1418 assert(i<maxlength_);
    \n-
    1419 rhs_[i]=Impl::asVector((*b)[domainIndex])[j];
    \n-
    1420 }
    \n-
    1421
    \n-
    1422
    \n-
    1423 // loop over all Matrix row entries and calculate defect.
    \n-
    1424 typedef typename matrix_type::ConstColIterator col_iterator;
    \n-
    1425
    \n-
    1426 // calculate defect for current row index block
    \n-
    1427 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
    \n-
    1428 block_type tmp;
    \n-
    1429 Impl::asMatrix(*col).mv((*x)[col.index()], tmp);
    \n-
    1430 i-=n;
    \n-
    1431 for(size_type j=0; j<n; ++j, ++i) {
    \n-
    1432 assert(i<maxlength_);
    \n-
    1433 rhs_[i]-=Impl::asVector(tmp)[j];
    \n-
    1434 }
    \n-
    1435
    \n-
    1436 }
    \n-
    1437
    \n-
    1438 }
    \n-
    \n-
    1439
    \n-
    1440 template<template<class> class S, typename T, typename A>
    \n-
    \n-\n-
    1442 {
    \n-
    1443 for(size_type j=i+n; i<j; ++i) {
    \n-
    1444 assert(i<maxlength_);
    \n-
    1445 lhs_[i]*=relax;
    \n-
    1446 }
    \n-
    1447 i-=n;
    \n-
    1448 }
    \n-
    \n-
    1449
    \n-
    1450 template<template<class> class S, typename T, typename A>
    \n-
    \n-\n-
    1452 {
    \n-
    1453 // assign the result of the local solve to the global vector
    \n-
    1454 for(size_type j=0; j<n; ++j, ++i) {
    \n-
    1455 assert(i<maxlength_);
    \n-
    1456 Impl::asVector(res)[j]+=lhs_[i];
    \n-
    1457 }
    \n-
    1458 }
    \n-
    \n-
    1459
    \n-
    1460 template<template<class> class S, typename T, typename A>
    \n-
    \n-
    1461 void OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::resetIndexForNextDomain()
    \n-
    1462 {
    \n-
    1463 i=0;
    \n-
    1464 }
    \n-
    \n-
    1465
    \n-
    1466 template<template<class> class S, typename T, typename A>
    \n-
    1467 typename OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::field_type*
    \n-
    \n-\n-
    1469 {
    \n-
    1470 return lhs_;
    \n-
    1471 }
    \n-
    \n-
    1472
    \n-
    1473 template<template<class> class S, typename T, typename A>
    \n-
    1474 typename OverlappingAssignerHelper<S<BCRSMatrix<T,A>>,true>::field_type*
    \n-
    \n-\n-
    1476 {
    \n-
    1477 return rhs_;
    \n-
    1478 }
    \n-
    \n-
    1479
    \n-
    1480#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK
    \n-
    1481
    \n-
    1482 template<class M, class X, class Y>
    \n-
    \n-\n-
    1484 const M& mat_,
    \n-
    1485 const Y& b_,
    \n-
    1486 X& x_)
    \n-
    1487 : mat(&mat_),
    \n-
    1488 b(&b_),
    \n-
    1489 x(&x_), i(0)
    \n-
    1490 {
    \n-
    1491 rhs_= new Y(maxlength);
    \n-
    1492 lhs_ = new X(maxlength);
    \n-
    1493 }
    \n-
    \n-
    1494
    \n-
    1495 template<class M, class X, class Y>
    \n-
    \n-\n-
    1497 {
    \n-
    1498 delete rhs_;
    \n-
    1499 delete lhs_;
    \n-
    1500 }
    \n-
    \n-
    1501
    \n-
    1502 template<class M, class X, class Y>
    \n-
    \n-\n-
    1504 {
    \n-
    1505 (*rhs_)[i]=(*b)[domainIndex];
    \n-
    1506
    \n-
    1507 // loop over all Matrix row entries and calculate defect.
    \n-
    1508 typedef typename matrix_type::ConstColIterator col_iterator;
    \n-
    1509
    \n-
    1510 // calculate defect for current row index block
    \n-
    1511 for(col_iterator col=(*mat)[domainIndex].begin(); col!=(*mat)[domainIndex].end(); ++col) {
    \n-
    1512 Impl::asMatrix(*col).mmv((*x)[col.index()], (*rhs_)[i]);
    \n-
    1513 }
    \n-
    1514 // Goto next local index
    \n-
    1515 ++i;
    \n-
    1516 }
    \n-
    \n-
    1517
    \n-
    1518 template<class M, class X, class Y>
    \n-
    \n-\n-
    1520 {
    \n-
    1521 (*lhs_)[i]*=relax;
    \n-
    1522 }
    \n-
    \n-
    1523
    \n-
    1524 template<class M, class X, class Y>
    \n-
    \n-\n-
    1526 {
    \n-
    1527 res+=(*lhs_)[i++];
    \n-
    1528 }
    \n-
    \n-
    1529
    \n-
    1530 template<class M, class X, class Y>
    \n-
    \n-\n-
    1532 {
    \n-
    1533 return *lhs_;
    \n-
    1534 }
    \n-
    \n-
    1535
    \n-
    1536 template<class M, class X, class Y>
    \n-
    \n-\n-
    1538 {
    \n-
    1539 return *rhs_;
    \n-
    1540 }
    \n-
    \n-
    1541
    \n-
    1542 template<class M, class X, class Y>
    \n-
    \n-\n-
    1544 {
    \n-
    1545 i=0;
    \n-
    1546 }
    \n-
    \n-
    1547
    \n-
    1548 template<typename S, typename T, typename A>
    \n-
    \n-\n-
    1550 BlockVector<T,A>& x_,
    \n-
    1551 OverlappingAssigner<S>& assigner_,
    \n-
    1552 const field_type& relax_)
    \n-
    1553 : v(&v_), x(&x_), assigner(&assigner_), relax(relax_)
    \n-
    1554 {}
    \n-
    \n-
    1555
    \n-
    1556 template<typename S, typename T, typename A>
    \n-
    \n-
    1557 void AdditiveAdder<S,BlockVector<T,A> >::operator()(const size_type& domainIndex)
    \n-
    1558 {
    \n-
    1559 // add the result of the local solve to the current update
    \n-
    1560 assigner->assignResult((*v)[domainIndex]);
    \n-
    1561 }
    \n-
    \n-
    1562
    \n-
    1563
    \n-
    1564 template<typename S, typename T, typename A>
    \n-
    \n-\n-
    1566 {
    \n-
    1567 // relax the update and add it to the current guess.
    \n-
    1568 x->axpy(relax,*v);
    \n-
    1569 }
    \n-
    \n-
    1570
    \n-
    1571
    \n-
    1572 template<typename S, typename T, typename A>
    \n-\n-
    \n-
    1574 ::MultiplicativeAdder([[maybe_unused]] BlockVector<T,A>& v_,
    \n-
    1575 BlockVector<T,A>& x_,
    \n-
    1576 OverlappingAssigner<S>& assigner_, const field_type& relax_)
    \n-
    1577 : x(&x_), assigner(&assigner_), relax(relax_)
    \n-
    1578 {}
    \n-
    \n-
    1579
    \n-
    1580
    \n-
    1581 template<typename S,typename T, typename A>
    \n-
    \n-
    1582 void MultiplicativeAdder<S,BlockVector<T,A> >::operator()(const size_type& domainIndex)
    \n-
    1583 {
    \n-
    1584 // add the result of the local solve to the current guess
    \n-
    1585 assigner->relaxResult(relax);
    \n-
    1586 assigner->assignResult((*x)[domainIndex]);
    \n-
    1587 }
    \n-
    \n-
    1588
    \n-
    1589
    \n-
    1590 template<typename S,typename T, typename A>
    \n-
    \n-\n-
    1592 {
    \n-
    1593 // nothing to do, as the corrections already relaxed and added in operator()
    \n-
    1594 }
    \n-
    \n-
    1595
    \n-
    1596
    \n-
    1598}
    \n-
    1599
    \n-
    1600#endif
    \n-
    \n-
    \n-
    \n-
    \n-
    Classes for using SuperLU with ISTL matrices.
    \n-
    Define general preconditioner interface.
    \n-
    Classes for using UMFPack with ISTL matrices.
    \n-
    Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.
    \n-
    Implementation of the BCRSMatrix class.
    \n-\n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n-
    Templates characterizing the type of a solver.
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n-
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n-
    void addRowNnz(const Iter &row)
    Definition overlappingschwarz.hh:895
    \n-
    void apply(X &v, const X &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition overlappingschwarz.hh:1234
    \n-
    X & lhs()
    Get the local left hand side.
    Definition overlappingschwarz.hh:1531
    \n-
    void calcColstart() const
    Definition overlappingschwarz.hh:926
    \n-
    Y & rhs()
    Get the local right hand side.
    Definition overlappingschwarz.hh:1537
    \n-
    iterator end()
    Definition overlappingschwarz.hh:989
    \n-
    void resetIndexForNextDomain()
    Resets the local index to zero.
    Definition overlappingschwarz.hh:1543
    \n-
    void copyValue(const Iter &row, const CIter &col) const
    Definition overlappingschwarz.hh:933
    \n-
    void createMatrix() const
    Definition overlappingschwarz.hh:947
    \n-
    iterator begin()
    Definition overlappingschwarz.hh:1003
    \n-
    OverlappingSchwarzInitializer(InitializerList &il, const IndexSet &indices, const subdomain_vector &domains)
    Definition overlappingschwarz.hh:887
    \n-
    IndexMap()
    Definition overlappingschwarz.hh:955
    \n-
    virtual void apply(X &v, const X &d)
    Apply the preconditioner.
    Definition overlappingschwarz.hh:1227
    \n-
    OverlappingAssignerILUBase(std::size_t maxlength, const M &mat, const Y &b, X &x)
    Constructor.
    Definition overlappingschwarz.hh:1483
    \n-
    const_iterator find(size_type grow) const
    Definition overlappingschwarz.hh:968
    \n-
    void operator()(const size_type &domain)
    calculate one entry of the local defect.
    Definition overlappingschwarz.hh:1503
    \n-
    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
    \n-
    void allocate()
    Definition overlappingschwarz.hh:905
    \n-
    void deallocate()
    Deallocates memory of the local vector.
    Definition overlappingschwarz.hh:1496
    \n-
    void insert(size_type grow)
    Definition overlappingschwarz.hh:960
    \n-
    void countEntries(const Iter &row, const CIter &col) const
    Definition overlappingschwarz.hh:914
    \n-
    static std::size_t assembleLocalProblems(const RowToDomain &rowToDomain, const matrix_type &mat, Solvers &solvers, const SubDomains &domains, bool onTheFly)
    Definition overlappingschwarz.hh:1198
    \n-
    void relaxResult(field_type relax)
    relax the result.
    Definition overlappingschwarz.hh:1519
    \n-
    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
    \n-
    SeqOverlappingSchwarz(const matrix_type &mat, const rowtodomain_vector &rowToDomain, field_type relaxationFactor=1, bool onTheFly_=true)
    Definition overlappingschwarz.hh:1009
    \n+
    966#endif // end DUNE_AMG_MATRIXHIERARCHY_HH
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+
    Functionality for redistributing a sparse matrix.
    \n+
    Provides classes for building the matrix graph.
    \n+
    Provides a classes representing the hierarchies in AMG.
    \n+
    Prolongation and restriction for amg.
    \n+
    Helper classes for the construction of classes without empty constructor.
    \n+
    Provides classes for initializing the link attributes of a matrix graph.
    \n+\n+\n+
    Provides a class for building the galerkin product based on a aggregation scheme.
    \n+
    Provdes class for identifying aggregates globally.
    \n+
    Classes for the generic construction and application of the smoothers.
    \n+
    Provides classes for the Coloring process of AMG.
    \n+
    Provides a class for building the index set and remote indices on the coarse level.
    \n+
    Some handy generic functions for ISTL matrices.
    \n+
    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
    \n+
    const AggregatesMapList & aggregatesMaps() const
    Get the hierarchy of the mappings of the nodes onto aggregates.
    Definition matrixhierarchy.hh:816
    \n+
    bool isBuilt() const
    Whether the hierarchy was built.
    Definition matrixhierarchy.hh:957
    \n+
    bool hasCoarsest() const
    Definition matrixhierarchy.hh:950
    \n+
    std::size_t levels() const
    Get the number of levels in the hierarchy.
    Definition hierarchy.hh:322
    \n+
    std::size_t levels() const
    Get the number of levels in the hierarchy.
    Definition matrixhierarchy.hh:938
    \n+
    void addCoarser(Arguments &args)
    Add an element on a coarser level.
    Definition hierarchy.hh:334
    \n+
    const RedistributeInfoList & redistributeInformation() const
    Get the hierarchy of the information about redistributions,.
    Definition matrixhierarchy.hh:822
    \n+
    const ParallelInformationHierarchy & parallelInformation() const
    Get the hierarchy of the parallel data distribution information.
    Definition matrixhierarchy.hh:741
    \n+
    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:316
    \n+
    const_iterator begin() const
    Definition aggregates.hh:725
    \n+
    const ParallelMatrixHierarchy & matrices() const
    Get the matrix hierarchy.
    Definition matrixhierarchy.hh:734
    \n+
    std::size_t maxlevels() const
    Get the max number of levels in the hierarchy of processors.
    Definition matrixhierarchy.hh:944
    \n+
    const_iterator end() const
    Definition aggregates.hh:730
    \n+
    static const V ISOLATED
    Identifier of isolated vertices.
    Definition aggregates.hh:571
    \n+
    void recalculateGalerkin(const F &copyFlags)
    Recalculate the galerkin products.
    Definition matrixhierarchy.hh:902
    \n+
    const void * Arguments
    A type holding all the arguments needed to call the constructor.
    Definition construction.hh:44
    \n+
    std::size_t noVertices() const
    Get the number of vertices.
    \n+
    static std::shared_ptr< T > construct(Arguments &args)
    Construct an object with the specified arguments.
    Definition construction.hh:52
    \n+
    void coarsenVector(Hierarchy< BlockVector< V, BA >, TA > &hierarchy) const
    Coarsen the vector hierarchy according to the matrix hierarchy.
    Definition matrixhierarchy.hh:845
    \n+
    const AggregateDescriptor * const_iterator
    Definition aggregates.hh:723
    \n+
    MatrixHierarchy(std::shared_ptr< MatrixOperator > fineMatrix, std::shared_ptr< ParallelInformation > pinfo=std::make_shared< ParallelInformation >())
    Constructor.
    Definition matrixhierarchy.hh:392
    \n+
    AccumulationMode
    Identifiers for the different accumulation modes.
    Definition parameters.hh:231
    \n+
    Iterator finest()
    Get an iterator positioned at the finest level.
    Definition hierarchy.hh:377
    \n+
    void build(const T &criterion)
    Build the matrix hierarchy using aggregation.
    Definition matrixhierarchy.hh:403
    \n+
    void free()
    Free the allocated memory.
    \n+
    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:872
    \n+
    void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, bool finestLevel)
    Build the dependency of the matrix graph.
    \n+
    std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, const C &criterion, bool finestLevel)
    Build the aggregates.
    \n+
    void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
    Calculate the galerkin product.
    \n+
    void getCoarsestAggregatesOnFinest(std::vector< std::size_t > &data) const
    Get the mapping of fine level unknowns to coarse level aggregates.
    Definition matrixhierarchy.hh:747
    \n+
    ~MatrixHierarchy()
    Definition matrixhierarchy.hh:828
    \n+
    @ MAX_PROCESSES
    Hard limit for the number of processes allowed.
    Definition matrixhierarchy.hh:50
    \n+
    @ atOnceAccu
    Accumulate data to one process at once.
    Definition parameters.hh:243
    \n+
    @ successiveAccu
    Successively accumulate to fewer processes.
    Definition parameters.hh:247
    \n
    Definition allocator.hh:11
    \n-
    Initializer for SuperLU Matrices representing the subdomains.
    Definition overlappingschwarz.hh:47
    \n-
    Matrix::row_type::const_iterator CIter
    Definition overlappingschwarz.hh:56
    \n-
    S IndexSet
    Definition overlappingschwarz.hh:58
    \n-
    Matrix::const_iterator Iter
    Definition overlappingschwarz.hh:55
    \n-
    IndexSet::size_type size_type
    Definition overlappingschwarz.hh:59
    \n-
    I InitializerList
    Definition overlappingschwarz.hh:52
    \n-
    AtomInitializer::Matrix Matrix
    Definition overlappingschwarz.hh:54
    \n-
    InitializerList::value_type AtomInitializer
    Definition overlappingschwarz.hh:53
    \n-
    D subdomain_vector
    The vector type containing the subdomain to row index mapping.
    Definition overlappingschwarz.hh:50
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    Iterator end()
    Get iterator to one beyond last row.
    Definition bcrsmatrix.hh:677
    \n-
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n-
    row_type::ConstIterator ConstColIterator
    Const iterator to the entries of a row.
    Definition bcrsmatrix.hh:737
    \n+
    void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)
    Definition matrixutils.hh:154
    \n+
    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
    \n+
    void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
    Definition matrixredistribute.hh:757
    \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)
    Definition repartition.hh:822
    \n+
    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
    \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.
    Definition repartition.hh:1228
    \n
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n-
    Exact subdomain solver using ILU(p) with appropriate p.
    Definition ilusubdomainsolver.hh:78
    \n-
    Definition ilusubdomainsolver.hh:111
    \n-
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n-
    X::field_type field_type
    The field type of the preconditioner.
    Definition overlappingschwarz.hh:783
    \n-
    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
    \n-
    std::vector< slu, typename std::allocator_traits< TA >::template rebind_alloc< slu > > slu_vector
    The vector type containing subdomain solvers.
    Definition overlappingschwarz.hh:809
    \n-
    M matrix_type
    The type of the matrix to precondition.
    Definition overlappingschwarz.hh:760
    \n-
    TM Mode
    The mode (additive or multiplicative) of the Schwarz method.
    Definition overlappingschwarz.hh:778
    \n-
    X range_type
    The range type of the preconditioner.
    Definition overlappingschwarz.hh:770
    \n-
    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
    \n-
    X domain_type
    The domain type of the preconditioner.
    Definition overlappingschwarz.hh:765
    \n-
    TD slu
    The type for the subdomain solver in use.
    Definition overlappingschwarz.hh:806
    \n-
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition overlappingschwarz.hh:868
    \n-
    virtual void pre(X &x, X &b)
    Prepare the preconditioner.
    Definition overlappingschwarz.hh:846
    \n-
    virtual void post(X &x)
    Postprocess the preconditioner.
    Definition overlappingschwarz.hh:861
    \n-
    TA allocator
    The allocator to use.
    Definition overlappingschwarz.hh:789
    \n-
    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
    \n-
    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
    \n-
    matrix_type::size_type size_type
    The return type of the size method.
    Definition overlappingschwarz.hh:786
    \n-
    Definition overlappingschwarz.hh:694
    \n-
    Tag that the tells the Schwarz method to be additive.
    Definition overlappingschwarz.hh:120
    \n-
    Tag that tells the Schwarz method to be multiplicative.
    Definition overlappingschwarz.hh:126
    \n-
    Tag that tells the Schwarz method to be multiplicative and symmetric.
    Definition overlappingschwarz.hh:133
    \n-
    Exact subdomain solver using Dune::DynamicMatrix<T>::solve.
    Definition overlappingschwarz.hh:140
    \n-
    std::remove_const< M >::type matrix_type
    The matrix type the preconditioner is for.
    Definition overlappingschwarz.hh:149
    \n-
    X::field_type field_type
    Definition overlappingschwarz.hh:150
    \n-
    X domain_type
    The domain type of the preconditioner.
    Definition overlappingschwarz.hh:153
    \n-
    Y range_type
    The range type of the preconditioner.
    Definition overlappingschwarz.hh:155
    \n-
    void setSubMatrix(const M &BCRS, S &rowset)
    Set the data of the local problem.
    Definition overlappingschwarz.hh:184
    \n-
    void apply(DynamicVector< field_type > &v, DynamicVector< field_type > &d)
    Apply the subdomain solver.
    Definition overlappingschwarz.hh:162
    \n-
    std::remove_const< M >::type rilu_type
    Definition overlappingschwarz.hh:151
    \n-
    Definition overlappingschwarz.hh:215
    \n-\n-\n-\n-\n-\n-
    S< BCRSMatrix< T, A > >::range_type range_type
    Definition overlappingschwarz.hh:315
    \n-
    range_type::block_type block_type
    Definition overlappingschwarz.hh:317
    \n-
    range_type::field_type field_type
    Definition overlappingschwarz.hh:316
    \n-
    matrix_type::size_type size_type
    Definition overlappingschwarz.hh:319
    \n-
    BCRSMatrix< T, A > matrix_type
    Definition overlappingschwarz.hh:314
    \n-
    Definition overlappingschwarz.hh:400
    \n-
    matrix_type::size_type size_type
    Definition overlappingschwarz.hh:408
    \n-
    Y::field_type field_type
    Definition overlappingschwarz.hh:404
    \n-
    Y::block_type block_type
    Definition overlappingschwarz.hh:406
    \n-
    M matrix_type
    Definition overlappingschwarz.hh:402
    \n-
    OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X &x)
    Constructor.
    Definition overlappingschwarz.hh:493
    \n-
    OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X &x)
    Constructor.
    Definition overlappingschwarz.hh:512
    \n-
    Definition overlappingschwarz.hh:520
    \n-
    std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
    Definition overlappingschwarz.hh:526
    \n-
    A::size_type size_type
    Definition overlappingschwarz.hh:525
    \n-
    Definition overlappingschwarz.hh:542
    \n-
    A::size_type size_type
    Definition overlappingschwarz.hh:547
    \n-
    std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
    Definition overlappingschwarz.hh:548
    \n-
    template meta program for choosing how to add the correction.
    Definition overlappingschwarz.hh:572
    \n-
    AdditiveAdder< S, X > Adder
    Definition overlappingschwarz.hh:577
    \n-
    MultiplicativeAdder< S, X > Adder
    Definition overlappingschwarz.hh:583
    \n-
    MultiplicativeAdder< S, X > Adder
    Definition overlappingschwarz.hh:589
    \n-
    Helper template meta program for application of overlapping Schwarz.
    Definition overlappingschwarz.hh:605
    \n-
    static solver_iterator begin(solver_vector &sv)
    Definition overlappingschwarz.hh:611
    \n-
    solver_vector::iterator solver_iterator
    Definition overlappingschwarz.hh:607
    \n-
    static domain_iterator end(const subdomain_vector &sv)
    Definition overlappingschwarz.hh:625
    \n-
    subdomain_vector::const_iterator domain_iterator
    Definition overlappingschwarz.hh:609
    \n-
    T1 solver_vector
    Definition overlappingschwarz.hh:606
    \n-
    static domain_iterator begin(const subdomain_vector &sv)
    Definition overlappingschwarz.hh:620
    \n-
    T2 subdomain_vector
    Definition overlappingschwarz.hh:608
    \n-
    static solver_iterator end(solver_vector &sv)
    Definition overlappingschwarz.hh:616
    \n-
    T2 subdomain_vector
    Definition overlappingschwarz.hh:636
    \n-
    static solver_iterator end(solver_vector &sv)
    Definition overlappingschwarz.hh:644
    \n-
    solver_vector::reverse_iterator solver_iterator
    Definition overlappingschwarz.hh:635
    \n-
    subdomain_vector::const_reverse_iterator domain_iterator
    Definition overlappingschwarz.hh:637
    \n-
    static solver_iterator begin(solver_vector &sv)
    Definition overlappingschwarz.hh:639
    \n-
    T1 solver_vector
    Definition overlappingschwarz.hh:634
    \n-
    static domain_iterator begin(const subdomain_vector &sv)
    Definition overlappingschwarz.hh:648
    \n-
    static domain_iterator end(const subdomain_vector &sv)
    Definition overlappingschwarz.hh:653
    \n-
    Helper template meta program for application of overlapping Schwarz.
    Definition overlappingschwarz.hh:669
    \n-
    smoother::range_type range_type
    Definition overlappingschwarz.hh:671
    \n-
    T smoother
    Definition overlappingschwarz.hh:670
    \n-
    static void apply(smoother &sm, range_type &v, const range_type &b)
    Definition overlappingschwarz.hh:673
    \n-
    static void apply(smoother &sm, range_type &v, const range_type &b)
    Definition overlappingschwarz.hh:685
    \n-
    SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > smoother
    Definition overlappingschwarz.hh:682
    \n-\n-\n-
    BCRSMatrix< T, A > matrix_type
    Definition overlappingschwarz.hh:713
    \n-
    Definition overlappingschwarz.hh:723
    \n-
    M matrix_type
    Definition overlappingschwarz.hh:724
    \n-
    Definition overlappingschwarz.hh:1103
    \n-
    static int size(const Domain &d)
    Definition overlappingschwarz.hh:1111
    \n-
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    A::size_type size_type
    Type for indices and sizes.
    Definition matrix.hh:577
    \n+
    MatrixImp::DenseMatrixBase< T, A >::window_type row_type
    The type implementing a matrix row.
    Definition matrix.hh:574
    \n+
    Definition matrixredistribute.hh:22
    \n+
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n+
    Class representing the properties of an edge in the matrix graph.
    Definition dependency.hh:39
    \n+
    Class representing a node in the matrix graph.
    Definition dependency.hh:126
    \n+
    Definition galerkin.hh:99
    \n+
    Definition galerkin.hh:118
    \n+
    Definition globalaggregates.hh:131
    \n+
    The (undirected) graph of a matrix.
    Definition graph.hh:51
    \n+
    Attaches properties to the edges and vertices of a graph.
    Definition graph.hh:978
    \n+
    Graph::VertexDescriptor VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:988
    \n+
    Definition graphcreator.hh:22
    \n+
    A hierarchy of containers (e.g. matrices or vectors)
    Definition hierarchy.hh:40
    \n+
    LevelIterator< Hierarchy< MatrixOperator, Allocator >, MatrixOperator > Iterator
    Type of the mutable iterator.
    Definition hierarchy.hh:216
    \n+
    LevelIterator< const Hierarchy< MatrixOperator, Allocator >, const MatrixOperator > ConstIterator
    Type of the const iterator.
    Definition hierarchy.hh:219
    \n+
    Definition indicescoarsener.hh:36
    \n+
    The hierarchies build by the coarsening process.
    Definition matrixhierarchy.hh:61
    \n+
    typename std::allocator_traits< Allocator >::template rebind_alloc< AggregatesMap * > AAllocator
    Allocator for pointers.
    Definition matrixhierarchy.hh:85
    \n+
    Dune::Amg::Hierarchy< ParallelInformation, Allocator > ParallelInformationHierarchy
    The type of the parallel informarion hierarchy.
    Definition matrixhierarchy.hh:82
    \n+
    std::list< AggregatesMap *, AAllocator > AggregatesMapList
    The type of the aggregates maps list.
    Definition matrixhierarchy.hh:88
    \n+
    PI ParallelInformation
    The type of the index set.
    Definition matrixhierarchy.hh:70
    \n+
    Dune::Amg::Hierarchy< MatrixOperator, Allocator > ParallelMatrixHierarchy
    The type of the parallel matrix hierarchy.
    Definition matrixhierarchy.hh:79
    \n+
    A Allocator
    The allocator to use.
    Definition matrixhierarchy.hh:73
    \n+
    RedistributeInformation< ParallelInformation > RedistributeInfoType
    The type of the redistribute information.
    Definition matrixhierarchy.hh:91
    \n+
    double getProlongationDampingFactor() const
    Definition matrixhierarchy.hh:188
    \n+
    typename std::allocator_traits< Allocator >::template rebind_alloc< RedistributeInfoType > RILAllocator
    Allocator for RedistributeInfoType.
    Definition matrixhierarchy.hh:94
    \n+
    std::list< RedistributeInfoType, RILAllocator > RedistributeInfoList
    The type of the list of redistribute information.
    Definition matrixhierarchy.hh:97
    \n+
    Dune::Amg::AggregatesMap< typename MatrixGraph< Matrix >::VertexDescriptor > AggregatesMap
    The type of the aggregates map we use.
    Definition matrixhierarchy.hh:76
    \n+
    MatrixOperator::matrix_type Matrix
    The type of the matrix.
    Definition matrixhierarchy.hh:67
    \n+
    M MatrixOperator
    The type of the matrix operator.
    Definition matrixhierarchy.hh:64
    \n+
    void operator()(const matrix_row &row)
    Definition matrixhierarchy.hh:254
    \n+
    Matrix::row_type matrix_row
    Definition matrixhierarchy.hh:245
    \n+
    size_type min
    Definition matrixhierarchy.hh:261
    \n+\n+
    size_type max
    Definition matrixhierarchy.hh:262
    \n+
    size_type sum
    Definition matrixhierarchy.hh:263
    \n+
    Matrix::size_type size_type
    Definition matrixhierarchy.hh:244
    \n+
    The criterion describing the stop criteria for the coarsening process.
    Definition matrixhierarchy.hh:283
    \n+
    CoarsenCriterion(const Dune::Amg::Parameters &parms)
    Definition matrixhierarchy.hh:309
    \n+
    T AggregationCriterion
    The criterion for tagging connections as strong and nodes as isolated. This might be e....
    Definition matrixhierarchy.hh:289
    \n+
    CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu, bool useFixedOrder=false)
    Constructor.
    Definition matrixhierarchy.hh:304
    \n+
    All parameters for AMG.
    Definition parameters.hh:416
    \n+
    Definition pinfo.hh:28
    \n+
    Tag idnetifying the visited property of a vertex.
    Definition properties.hh:29
    \n+
    The default class for the smoother arguments.
    Definition smoother.hh:38
    \n+
    Definition transfer.hh:32
    \n+
    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
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1878 +1,1290 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-overlappingschwarz.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+matrixhierarchy.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_OVERLAPPINGSCHWARZ_HH\n-6#define DUNE_ISTL_OVERLAPPINGSCHWARZ_HH\n-7#include \n+5#ifndef DUNE_AMG_MATRIXHIERARCHY_HH\n+6#define DUNE_AMG_MATRIXHIERARCHY_HH\n+7\n 8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15\n-16#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n-17#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\"\n-18#include \"_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh\"\n-19#include \"_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh\"\n-20#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-21#include \"_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\"\n-22#include \"_\bi_\bl_\bu_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\"\n-23#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-24\n-25namespace _\bD_\bu_\bn_\be\n-26{\n+9#include \n+10#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n+11#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n+12#include \"_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\"\n+13#include \"_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\"\n+14#include \"_\bg_\br_\ba_\bp_\bh_\bc_\br_\be_\ba_\bt_\bo_\br_\b._\bh_\bh\"\n+15#include \"_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh\"\n+16#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+17#include \n+18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh>\n+19#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh>\n+20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh>\n+21#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh>\n+22#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bi_\bn_\bd_\bi_\bc_\be_\bs_\bc_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b._\bh_\bh>\n+23#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bg_\bl_\bo_\bb_\ba_\bl_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n+24#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+25#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n+26#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n 27\n-39 template\n-40 class SeqOverlappingSchwarz;\n-41\n-45 template\n-_\b4_\b6 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-47 {\n-48 public:\n-_\b5_\b0 typedef D _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br;\n-51\n-_\b5_\b2 typedef I _\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\bL_\bi_\bs_\bt;\n-_\b5_\b3 typedef typename InitializerList::value_type _\bA_\bt_\bo_\bm_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n-_\b5_\b4 typedef typename AtomInitializer::Matrix _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b5_\b5 typedef typename Matrix::const_iterator _\bI_\bt_\be_\br;\n-_\b5_\b6 typedef typename Matrix::row_type::const_iterator _\bC_\bI_\bt_\be_\br;\n-57\n-_\b5_\b8 typedef S _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-_\b5_\b9 typedef typename IndexSet::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-60\n-61 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br(_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\bL_\bi_\bs_\bt& il,\n-62 const _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& indices,\n-63 const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& domains);\n-64\n+28namespace _\bD_\bu_\bn_\be\n+29{\n+30 namespace Amg\n+31 {\n+42 enum {\n+50 _\bM_\bA_\bX_\b__\bP_\bR_\bO_\bC_\bE_\bS_\bS_\bE_\bS = 72000\n+_\b5_\b1 };\n+52\n+59 template >\n+_\b6_\b0 class _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+61 {\n+62 public:\n+_\b6_\b4 typedef M _\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n 65\n-66 void _\ba_\bd_\bd_\bR_\bo_\bw_\bN_\bn_\bz(const _\bI_\bt_\be_\br& row);\n-67\n-68 void _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be();\n-69\n-70 void _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(const _\bI_\bt_\be_\br& row, const _\bC_\bI_\bt_\be_\br& _\bc_\bo_\bl) const;\n+_\b6_\b7 typedef typename MatrixOperator::matrix_type _\bM_\ba_\bt_\br_\bi_\bx;\n+68\n+_\b7_\b0 typedef PI _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n 71\n-72 void _\bc_\ba_\bl_\bc_\bC_\bo_\bl_\bs_\bt_\ba_\br_\bt() const;\n-73\n-74 void _\bc_\bo_\bp_\by_\bV_\ba_\bl_\bu_\be(const _\bI_\bt_\be_\br& row, const _\bC_\bI_\bt_\be_\br& _\bc_\bo_\bl) const;\n-75\n-76 void _\bc_\br_\be_\ba_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx() const;\n-77 private:\n-78 class IndexMap\n-79 {\n-80 public:\n-81 typedef typename S::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-82 typedef std::map Map;\n-83 typedef typename Map::iterator iterator;\n-84 typedef typename Map::const_iterator const_iterator;\n-85\n-86 _\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp();\n-87\n-88 void _\bi_\bn_\bs_\be_\br_\bt(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be grow);\n+_\b7_\b3 typedef A _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n+74\n+_\b7_\b6 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br> _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp;\n+77\n+_\b7_\b9 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n+80\n+_\b8_\b2 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b>\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n+83\n+_\b8_\b5 using _\bA_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br = typename std::allocator_traits::template\n+rebind_alloc;\n+86\n+_\b8_\b8 typedef std::list _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bL_\bi_\bs_\bt;\n 89\n-90 const_iterator _\bf_\bi_\bn_\bd(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be grow) const;\n-91\n-92 iterator _\bf_\bi_\bn_\bd(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be grow);\n-93\n-94 iterator _\bb_\be_\bg_\bi_\bn();\n+_\b9_\b1 typedef _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b> _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be;\n+92\n+_\b9_\b4 using _\bR_\bI_\bL_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br = typename std::allocator_traits::template\n+rebind_alloc;\n 95\n-96 const_iterator _\bb_\be_\bg_\bi_\bn() const;\n-97\n-98 iterator _\be_\bn_\bd();\n-99\n-100 const_iterator _\be_\bn_\bd() const;\n-101\n-102 private:\n-103 std::map map_;\n-104 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row;\n-105 };\n+_\b9_\b7 typedef std::list _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bL_\bi_\bs_\bt;\n+98\n+104 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(std::shared_ptr fineMatrix,\n+105 std::shared_ptr pinfo = std::\n+make_shared());\n 106\n-107\n-108 typedef typename InitializerList::iterator InitIterator;\n-109 typedef typename IndexSet::const_iterator IndexIteratur;\n-110 _\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\bL_\bi_\bs_\bt* initializers;\n-111 const _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt *indices;\n-112 mutable std::vector indexMaps;\n-113 const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& domains;\n-114 };\n-115\n-_\b1_\b1_\b9 struct _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n-120 {};\n-121\n-_\b1_\b2_\b5 struct _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n-126 {};\n-127\n-_\b1_\b3_\b2 struct _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n-133 {};\n-134\n-139 template\n-_\b1_\b4_\b0 class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br;\n-141\n-142 // Specialization for BCRSMatrix\n-143 template\n-_\b1_\b4_\b4 class _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br< _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< K, Al>, X, Y >\n-145 {\n-146 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b> _\bM;\n-147 public:\n-_\b1_\b4_\b9 typedef typename std::remove_const::type _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b1_\b5_\b0 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b1_\b5_\b1 typedef typename std::remove_const::type _\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be;\n-_\b1_\b5_\b3 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b1_\b5_\b5 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b1_\b5_\b6 static constexpr size_t n = std::decay_t()))>::rows;\n-157\n-_\b1_\b6_\b2 void _\ba_\bp_\bp_\bl_\by (DynamicVector& v, DynamicVector& d)\n-163 {\n-164 assert(v.size() > 0);\n-165 assert(v.size() == d.size());\n-166 assert(A.rows() <= v.size());\n-167 assert(A.cols() <= v.size());\n-168 size_t sz = A.rows();\n-169 v.resize(sz);\n-170 d.resize(sz);\n-171 A.solve(v,d);\n-172 v.resize(v.capacity());\n-173 d.resize(d.capacity());\n-174 }\n-175\n-183 template\n-_\b1_\b8_\b4 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM& BCRS, S& rowset)\n-185 {\n-186 size_t sz = rowset.size();\n-187 A.resize(sz*n,sz*n);\n-188 typedef typename S::const_iterator SIter;\n-189 size_t r = 0;\n-190 for(SIter rowIdx = rowset.begin(), rowEnd=rowset.end();\n-191 rowIdx!= rowEnd; ++rowIdx, r++)\n-192 {\n-193 size_t c = 0;\n-194 for(SIter colIdx = rowset.begin(), colEnd=rowset.end();\n-195 colIdx!= colEnd; ++colIdx, c++)\n-196 {\n-197 if (BCRS[*rowIdx].find(*colIdx) == BCRS[*rowIdx]._\be_\bn_\bd())\n-198 continue;\n-199 for (size_t i=0; i A;\n-211 };\n-212\n-213 template\n-_\b2_\b1_\b4 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-215 {};\n+107 _\b~_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by();\n+108\n+114 template\n+115 void _\bb_\bu_\bi_\bl_\bd(const T& criterion);\n+116\n+124 template\n+125 void _\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn(const F& copyFlags);\n+126\n+131 template\n+132 void _\bc_\bo_\ba_\br_\bs_\be_\bn_\bV_\be_\bc_\bt_\bo_\br(_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bV_\b,_\bB_\bA_\b>, TA>& hierarchy) const;\n+133\n+139 template\n+140 void _\bc_\bo_\ba_\br_\bs_\be_\bn_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br(_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bS_\b,_\bT_\bA_\b>& smoothers,\n+141 const typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args) const;\n+142\n+147 std::size_t _\bl_\be_\bv_\be_\bl_\bs() const;\n+148\n+153 std::size_t _\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs() const;\n+154\n+155 bool _\bh_\ba_\bs_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt() const;\n+156\n+161 bool _\bi_\bs_\bB_\bu_\bi_\bl_\bt() const;\n+162\n+167 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& _\bm_\ba_\bt_\br_\bi_\bc_\be_\bs() const;\n+168\n+173 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& _\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn() const;\n+174\n+179 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bL_\bi_\bs_\bt& _\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bs() const;\n+180\n+186 const _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bL_\bi_\bs_\bt& _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn() const;\n+187\n+_\b1_\b8_\b8 double _\bg_\be_\bt_\bP_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\bi_\bo_\bn_\bD_\ba_\bm_\bp_\bi_\bn_\bg_\bF_\ba_\bc_\bt_\bo_\br() const\n+189 {\n+190 return prolongDamp_;\n+191 }\n+192\n+203 void _\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bO_\bn_\bF_\bi_\bn_\be_\bs_\bt(std::vector& data) const;\n+204\n+205 private:\n+206 typedef typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs MatrixArgs;\n+207 typedef typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+CommunicationArgs;\n+209 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bL_\bi_\bs_\bt aggregatesMaps_;\n+211 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bL_\bi_\bs_\bt redistributes_;\n+213 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by matrices_;\n+215 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by parallelInformation_;\n 216\n-217 template\n-_\b2_\b1_\b8 using _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br = _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bT_\b,_\b _\bD_\bu_\bn_\be_\b:_\b:\n-_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be>;\n+218 bool built_;\n 219\n-220 // specialization for DynamicMatrix\n-221 template\n-_\b2_\b2_\b2 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br< _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br<\n-_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx, X, Y >,false>\n-223 {\n-224 public:\n-_\b2_\b2_\b5 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b2_\b2_\b6 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b2_\b2_\b7 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b2_\b2_\b8 typedef typename range_type::block_type _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-_\b2_\b2_\b9 typedef typename _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-_\b2_\b3_\b0 static constexpr size_t n = std::decay_t()))>::rows;\n-238 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br(std::size_t maxlength, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bA_\bl_\b>&\n-mat_, const X& b_, Y& x_);\n-239\n-243 inline\n-244 void deallocate();\n-245\n-249 inline\n-250 void resetIndexForNextDomain();\n-251\n-256 inline\n-257 DynamicVector & lhs();\n-258\n-263 inline\n-264 DynamicVector & rhs();\n-265\n-270 inline\n-271 void relaxResult(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax);\n-272\n-277 void operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domainIndex);\n-278\n-286 inline\n-287 void assignResult(_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& res);\n-288\n-289 private:\n-293 const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be* _\bm_\ba_\bt;\n-295 // we need a pointer, because we have to avoid deep copies\n-296 DynamicVector * rhs_;\n-298 // we need a pointer, because we have to avoid deep copies\n-299 DynamicVector * lhs_;\n-301 const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be* b;\n-303 _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be* x;\n-305 std::size_t i;\n-307 std::size_t maxlength_;\n-308 };\n-309\n-310#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK\n-311 template class S, typename T, typename A>\n-_\b3_\b1_\b2 struct _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br>, true>\n-313 {\n-_\b3_\b1_\b4 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\b _\bA_\b> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b3_\b1_\b5 typedef typename S>::range_type _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b3_\b1_\b6 typedef typename range_type::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b3_\b1_\b7 typedef typename range_type::block_type _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-318\n-_\b3_\b1_\b9 typedef typename _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-320\n-_\b3_\b2_\b1 static constexpr size_t n = std::decay_t()))>::rows;\n-_\b3_\b2_\b2 static constexpr size_t m = std::decay_t()))>::cols;\n-330 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br(std::size_t maxlength, const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n-331 const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& x);\n-337 void deallocate();\n-338\n-339 /*\n-340 * @brief Resets the local index to zero.\n-341 */\n-342 void resetIndexForNextDomain();\n-343\n-348 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be* lhs();\n-349\n-354 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be* rhs();\n-355\n-360 void relaxResult(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax);\n-361\n-366 void operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domain);\n+221 int maxlevels_;\n+222\n+223 double prolongDamp_;\n+224\n+228 template\n+229 struct MatrixStats\n+230 {\n+231\n+235 static void stats([[maybe_unused]] const _\bM_\ba_\bt_\br_\bi_\bx& matrix)\n+236 {}\n+237 };\n+238\n+239 template\n+240 struct MatrixStats<_\bM_\ba_\bt_\br_\bi_\bx,true>\n+241 {\n+_\b2_\b4_\b2 struct calc\n+243 {\n+_\b2_\b4_\b4 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+_\b2_\b4_\b5 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bm_\ba_\bt_\br_\bi_\bx_\b__\br_\bo_\bw;\n+246\n+_\b2_\b4_\b7 _\bc_\ba_\bl_\bc()\n+248 {\n+249 min=std::numeric_limits::max();\n+250 max=0;\n+251 sum=0;\n+252 }\n+253\n+_\b2_\b5_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bm_\ba_\bt_\br_\bi_\bx_\b__\br_\bo_\bw& row)\n+255 {\n+256 min=std::min(min, row.size());\n+257 max=std::max(max, row.size());\n+258 sum += row.size();\n+259 }\n+260\n+_\b2_\b6_\b1 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm_\bi_\bn;\n+_\b2_\b6_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bm_\ba_\bx;\n+_\b2_\b6_\b3 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bu_\bm;\n+264 };\n+268 static void stats(const _\bM_\ba_\bt_\br_\bi_\bx& matrix)\n+269 {\n+270 calc c= for_each(matrix.begin(), matrix.end(), calc());\n+271 dinfo<<\"Matrix row: min=\"<(c.sum)/matrix.N()\n+273 <\n+_\b2_\b8_\b2 class _\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn : public T\n+283 {\n+284 public:\n+_\b2_\b8_\b9 typedef T _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn;\n+290\n+_\b3_\b0_\b4 _\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(int maxLevel=100, int coarsenTarget=1000, double\n+minCoarsenRate=1.2,\n+305 double prolongDamp=1.6, _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be accumulate=_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu, bool\n+useFixedOrder = false)\n+306 : _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(_\bD_\bu_\bn_\be::Amg::_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(maxLevel, coarsenTarget,\n+minCoarsenRate, prolongDamp, accumulate, useFixedOrder))\n+307 {}\n+308\n+_\b3_\b0_\b9 _\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(const _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n+310 : _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(parms)\n+311 {}\n+312\n+313 };\n+314\n+315 template\n+_\b3_\b1_\b6 bool _\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx([[maybe_unused]] const M& origMatrix,\n+317 [[maybe_unused]] std::shared_ptr newMatrix,\n+318 [[maybe_unused]] _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& origComm,\n+319 [[maybe_unused]] std::shared_ptr& newComm,\n+320 [[maybe_unused]] _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>& ri,\n+321 [[maybe_unused]] int nparts,\n+322 [[maybe_unused]] C1& criterion)\n+323 {\n+324 DUNE_THROW(NotImplemented, \"Redistribution does not make sense in\n+sequential code!\");\n+325 }\n+326\n+327\n+328 template\n+_\b3_\b2_\b9 bool _\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(const M& origMatrix,\n+330 std::shared_ptr newMatrix,\n+331 C& origComm,\n+332 std::shared_ptr& newComm,\n+333 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bC_\b>& ri,\n+334 int nparts, C1& criterion)\n+335 {\n+336 Timer time;\n+337#ifdef AMG_REPART_ON_COMM_GRAPH\n+338 // Done not repartition the matrix graph, but a graph of the communication\n+scheme.\n+339 bool existentOnRedist=_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bG_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn(origMatrix, origComm,\n+nparts, newComm,\n+340 ri.getInterface(),\n+341 criterion.debugLevel()>1);\n+342\n+343#else\n+344 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b> _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh;\n+345 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh,\n+346 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n+347 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n+348 IdentityMap,\n+349 IdentityMap> _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh;\n+350 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh graph(origMatrix);\n+351 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh pgraph(graph);\n+352 _\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(pgraph, origMatrix, criterion, false);\n+353\n+354#ifdef DEBUG_REPART\n+355 if(origComm.communicator().rank()==0)\n+356 std::cout<<\"Original matrix\"<1);\n+363#endif // if else AMG_REPART\n+364\n+365 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)\n+366 std::cout<<\"Repartitioning took \"<\n-_\b3_\b9_\b9 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n-400 {\n-401 public:\n-_\b4_\b0_\b2 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-403\n-_\b4_\b0_\b4 typedef typename Y::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-405\n-_\b4_\b0_\b6 typedef typename Y::block_type _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-407\n-_\b4_\b0_\b8 typedef typename matrix_type::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-416 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be(std::size_t maxlength, const M& mat,\n-417 const Y& b, X& x);\n-423 void _\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be();\n-424\n-428 void _\br_\be_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bF_\bo_\br_\bN_\be_\bx_\bt_\bD_\bo_\bm_\ba_\bi_\bn();\n-429\n-434 X& _\bl_\bh_\bs();\n-435\n-440 Y& _\br_\bh_\bs();\n-441\n-446 void _\br_\be_\bl_\ba_\bx_\bR_\be_\bs_\bu_\bl_\bt(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax);\n-447\n-452 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domain);\n-453\n-461 void _\ba_\bs_\bs_\bi_\bg_\bn_\bR_\be_\bs_\bu_\bl_\bt(_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& res);\n+368 ri.setSetup();\n+369\n+370#ifdef DEBUG_REPART\n+371 ri.checkInterface(origComm.indexSet(), newComm->indexSet(),\n+origComm.communicator());\n+372#endif\n+373\n+374 _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(const_cast(origMatrix), *newMatrix, origComm,\n+*newComm, ri);\n+375\n+376#ifdef DEBUG_REPART\n+377 if(origComm.communicator().rank()==0)\n+378 std::cout<<\"Original matrix\"<communicator().size()>0)\n+381 _\bp_\br_\bi_\bn_\bt_\bG_\bl_\bo_\bb_\ba_\bl_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx(*newMatrix, *newComm, std::cout);\n+382 origComm.communicator().barrier();\n+383#endif\n+384\n+385 if(origComm.communicator().rank()==0 && criterion.debugLevel()>1)\n+386 std::cout<<\"Redistributing matrix took \"<\n+_\b3_\b9_\b2 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(std::shared_ptr\n+fineMatrix,\n+393 std::shared_ptr pinfo)\n+394 : matrices_(fineMatrix),\n+395 parallelInformation_(pinfo)\n+396 {\n+397 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*fineMatrix) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+(*pinfo))\n+398 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"MatrixOperator and ParallelInformation must belong\n+to the same category!\");\n+399 }\n+400\n+401 template\n+402 template\n+_\b4_\b0_\b3 void _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd(const T& criterion)\n+404 {\n+405 prolongDamp_ = criterion.getProlongationDampingFactor();\n+406 typedef O OverlapFlags;\n+407 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br MatIterator;\n+408 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br PInfoIterator;\n+409\n+410 static const int noints=(_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\bA_\bX_\b__\bP_\bR_\bO_\bC_\bE_\bS_\bS_\bE_\bS/4096>0) ? (_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:\n+_\bM_\bA_\bX_\b__\bP_\bR_\bO_\bC_\bE_\bS_\bS_\bE_\bS/4096) : 1;\n+411\n+412 typedef bigunsignedint BIGINT;\n+413 _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b> productBuilder;\n+414 MatIterator mlevel = matrices_.finest();\n+415 MatrixStats::stats(mlevel->getmat());\n+416\n+417 PInfoIterator infoLevel = parallelInformation_.finest();\n+418 BIGINT finenonzeros=_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs(mlevel->getmat());\n+419 finenonzeros = infoLevel->communicator().sum(finenonzeros);\n+420 BIGINT allnonzeros = finenonzeros;\n+421\n+422\n+423 int level = 0;\n+424 int rank = 0;\n+425\n+426 BIGINT unknowns = mlevel->getmat().N();\n+427\n+428 unknowns = infoLevel->communicator().sum(unknowns);\n+429 double dunknowns=unknowns.todouble();\n+430 infoLevel->buildGlobalLookup(mlevel->getmat().N());\n+431 redistributes_.push_back(_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be());\n+432\n+433 for(; level < criterion.maxLevel(); ++level, ++mlevel) {\n+434 assert(matrices_.levels()==redistributes_.size());\n+435 rank = infoLevel->communicator().rank();\n+436 if(rank==0 && criterion.debugLevel()>1)\n+437 std::cout<<\"Level \"<communicator().size()\n+438 <<\" unknowns per proc (procs=\"<communicator().size\n+()<<\")\"<communicator().size()))\n+451 && infoLevel->communicator().size()>1 &&\n+452 dunknowns/infoLevel->communicator().size() <= criterion.coarsenTarget())\n+453 {\n+454 // accumulate to fewer processors\n+455 std::shared_ptr redistMat = std::make_shared();\n+456 std::shared_ptr redistComm;\n+457 std::size_t nodomains = (std::size_t)std::ceil(dunknowns/\n+(criterion.minAggregateSize()\n+458 *criterion.coarsenTarget()));\n+459 if( nodomains<=criterion.minAggregateSize()/2 ||\n+460 dunknowns <= criterion.coarsenTarget() )\n+461 nodomains=1;\n 462\n-463 private:\n-467 const M* mat;\n-469 X* lhs_;\n-471 Y* rhs_;\n-473 const Y* b;\n-475 X* x;\n-477 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i;\n-478 };\n-479\n-480 // specialization for ILU0\n-481 template\n-_\b4_\b8_\b2 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br, false>\n-483 : public _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n-484 {\n-485 public:\n-_\b4_\b9_\b3 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br(std::size_t maxlength, const M& _\bm_\ba_\bt,\n-494 const Y& b, X& x)\n-495 : _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be(maxlength, _\bm_\ba_\bt,b,x)\n-496 {}\n-497 };\n-498\n-499 // specialization for ILUN\n-500 template\n-_\b5_\b0_\b1 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br,false>\n-502 : public _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n-503 {\n-504 public:\n-_\b5_\b1_\b2 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br(std::size_t maxlength, const M& _\bm_\ba_\bt,\n-513 const Y& b, X& x)\n-514 : _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be(maxlength, _\bm_\ba_\bt,b,x)\n-515 {}\n-516 };\n-517\n-518 template\n-_\b5_\b1_\b9 struct _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br\n-520 {};\n-521\n-522 template\n-_\b5_\b2_\b3 struct _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br >\n-524 {\n-_\b5_\b2_\b5 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-_\b5_\b2_\b6 typedef typename std::decay_t\n-()))>::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-527 _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br(_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& v, _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& x,\n-528 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>& assigner, const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& relax_);\n-529 void operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domain);\n-530 void axpy();\n-_\b5_\b3_\b1 static constexpr size_t n = std::decay_t()))>::dimension;\n-532\n-533 private:\n-534 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>* v;\n-535 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>* x;\n-536 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>* assigner;\n-537 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax;\n-538 };\n+463 bool existentOnNextLevel =\n+464 _\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(mlevel->getmat(), redistMat, *infoLevel,\n+465 redistComm, redistributes_.back(), nodomains,\n+466 criterion);\n+467 BIGINT unknownsRedist = redistMat->N();\n+468 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);\n+469 dunknowns= unknownsRedist.todouble();\n+470 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1)\n+471 std::cout<<\"Level \"<communicator().size()\n+472 <<\" unknowns per proc (procs=\"<communicator().size\n+()<<\")\"<_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+(args));\n+475 assert(mlevel.isRedistributed());\n+476 infoLevel.addRedistributed(redistComm);\n+477 infoLevel->freeGlobalLookup();\n+478\n+479 if(!existentOnNextLevel)\n+480 // We do not hold any data on the redistributed partitioning\n+481 break;\n+482\n+483 // Work on the redistributed Matrix from now on\n+484 matrix = &(mlevel.getRedistributed());\n+485 info = &(infoLevel.getRedistributed());\n+486 info->buildGlobalLookup(matrix->getmat().N());\n+487 }\n+488\n+489 rank = info->communicator().rank();\n+490 if(dunknowns <= criterion.coarsenTarget())\n+491 // No further coarsening needed\n+492 break;\n+493\n+494 typedef _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>\n+GraphCreator;\n+495 typedef typename GraphCreator::PropertiesGraph _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh;\n+496 typedef typename GraphCreator::GraphTuple GraphTuple;\n+497\n+498 typedef typename _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br Vertex;\n+499\n+500 std::vector excluded(matrix->getmat().N(), false);\n+501\n+502 GraphTuple graphs = GraphCreator::create(*matrix, excluded, *info,\n+OverlapFlags());\n+503\n+504 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp* aggregatesMap=new _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(std::get<1>(graphs)-\n+>maxVertex()+1);\n+505\n+506 aggregatesMaps_.push_back(aggregatesMap);\n+507\n+508 Timer watch;\n+509 watch.reset();\n+510 auto [noAggregates, isoAggregates, oneAggregates, skippedAggregates] =\n+511 aggregatesMap->_\bb_\bu_\bi_\bl_\bd_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs(matrix->getmat(), *(std::get<1>(graphs)),\n+criterion, level==0);\n+512\n+513 if(rank==0 && criterion.debugLevel()>2)\n+514 std::cout<<\" Have built \"<communicator().rank();\n+522 int n = UNKNOWNS/procs; // number of unknowns per process\n+523 int bigger = UNKNOWNS%procs; // number of process with n+1 unknowns\n+524\n+525 // Compute owner region\n+526 if(rank0)\n+536 overlapStart = start - 1;\n+537 else\n+538 overlapStart = start;\n 539\n-540 template\n-_\b5_\b4_\b1 struct _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br\n-542 {};\n-543\n-544 template\n-_\b5_\b4_\b5 struct _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br >\n-546 {\n-_\b5_\b4_\b7 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-_\b5_\b4_\b8 typedef typename std::decay_t\n-()))>::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-549 _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br(_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& v, _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& x,\n-550 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>& assigner_, const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& relax_);\n-551 void operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domain);\n-552 void axpy();\n-_\b5_\b5_\b3 static constexpr size_t n = std::decay_t()))>::dimension;\n-554\n-555 private:\n-556 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>* x;\n-557 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>* assigner;\n-558 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax;\n-559 };\n-560\n-570 template\n-_\b5_\b7_\b1 struct _\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-572 {};\n-573\n-574 template\n-_\b5_\b7_\b5 struct _\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br<_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be,X,S>\n-576 {\n-_\b5_\b7_\b7 typedef _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bX_\b> _\bA_\bd_\bd_\be_\br;\n-578 };\n-579\n-580 template\n-_\b5_\b8_\b1 struct _\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br<_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be,X,S>\n-582 {\n-_\b5_\b8_\b3 typedef _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bX_\b> _\bA_\bd_\bd_\be_\br;\n-584 };\n-585\n-586 template\n-_\b5_\b8_\b7 struct _\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br<_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be,X,S>\n-588 {\n-_\b5_\b8_\b9 typedef _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bX_\b> _\bA_\bd_\bd_\be_\br;\n-590 };\n-591\n-603 template\n-_\b6_\b0_\b4 struct _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-605 {\n-_\b6_\b0_\b6 typedef T1 _\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br;\n-_\b6_\b0_\b7 typedef typename solver_vector::iterator _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b6_\b0_\b8 typedef T2 _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br;\n-_\b6_\b0_\b9 typedef typename subdomain_vector::const_iterator _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-610\n-_\b6_\b1_\b1 static _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn(_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n-612 {\n-613 return sv.begin();\n-614 }\n-615\n-_\b6_\b1_\b6 static _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd(_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n-617 {\n-618 return sv.end();\n-619 }\n-_\b6_\b2_\b0 static _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn(const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n-621 {\n-622 return sv.begin();\n+540 if(end_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs());\n+546 for(int j=0; j< UNKNOWNS; ++j)\n+547 for(int i=0; i < UNKNOWNS; ++i)\n+548 {\n+549 if(i>=overlapStart && i1 && info->communicator().rank()==0)\n+558 std::cout<<\"aggregating finished.\"<communicator().sum(gnoAggregates);\n+562 double dgnoAggregates = gnoAggregates.todouble();\n+563#ifdef TEST_AGGLO\n+564 BIGINT gnoAggregates=((UNKNOWNS)/2)*((UNKNOWNS)/2);\n+565#endif\n+566\n+567 if(criterion.debugLevel()>2 && rank==0)\n+568 std::cout << \"Building \"<0)\n+575 std::cerr << \"Stopped coarsening because of rate breakdown \"<_\bf_\br_\be_\be();\n+582 delete aggregatesMap;\n+583 aggregatesMaps_.pop_back();\n+584\n+585 if(criterion.accumulate() && mlevel.isRedistributed() && info->communicator\n+().size()>1) {\n+586 // coarse level matrix was already redistributed, but to more than 1\n+process\n+587 // Therefore need to delete the redistribution. Further down it will\n+588 // then be redistributed to 1 process\n+589 delete &(mlevel.getRedistributed().getmat());\n+590 mlevel.deleteRedistributed();\n+591 delete &(infoLevel.getRedistributed());\n+592 infoLevel.deleteRedistributed();\n+593 redistributes_.back().resetSetup();\n+594 }\n+595\n+596 break;\n+597 }\n+598 unknowns = noAggregates;\n+599 dunknowns = dgnoAggregates;\n+600\n+601 CommunicationArgs commargs(info->communicator(),info->category());\n+602 parallelInformation_.addCoarser(commargs);\n+603\n+604 ++infoLevel; // parallel information on coarse level\n+605\n+606 typename PropertyMapTypeSelector::Type\n+visitedMap =\n+607 _\bg_\be_\bt(_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg(), *(std::get<1>(graphs)));\n+608\n+609 watch.reset();\n+610 int aggregates = _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bO_\bv_\be_\br_\bl_\ba_\bp_\bF_\bl_\ba_\bg_\bs_\b>\n+611_\b _\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn(*info,\n+612 *(std::get<1>(graphs)),\n+613 visitedMap,\n+614 *aggregatesMap,\n+615 *infoLevel,\n+616 noAggregates,\n+617 criterion.useFixedOrder());\n+618 GraphCreator::free(graphs);\n+619\n+620 if(criterion.debugLevel()>2) {\n+621 if(rank==0)\n+622 std::cout<<\"Coarsening of index sets took \"<\n-_\b6_\b3_\b2 struct _\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-633 {\n-_\b6_\b3_\b4 typedef T1 _\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br;\n-_\b6_\b3_\b5 typedef typename solver_vector::reverse_iterator _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b6_\b3_\b6 typedef T2 _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br;\n-_\b6_\b3_\b7 typedef typename subdomain_vector::const_reverse_iterator _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-638\n-_\b6_\b3_\b9 static _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn(_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n-640 {\n-641 return sv.rbegin();\n-642 }\n-643\n-_\b6_\b4_\b4 static _\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd(_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n-645 {\n-646 return sv.rend();\n-647 }\n-_\b6_\b4_\b8 static _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn(const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n-649 {\n-650 return sv.rbegin();\n-651 }\n-652\n-_\b6_\b5_\b3 static _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd(const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& sv)\n-654 {\n-655 return sv.rend();\n-656 }\n-657 };\n+625 watch.reset();\n+626\n+627 infoLevel->buildGlobalLookup(aggregates);\n+628 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\bV_\be_\br_\bt_\be_\bx_\b,_\bO_\bv_\be_\br_\bl_\ba_\bp_\bF_\bl_\ba_\bg_\bs_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bp_\bu_\bb_\bl_\bi_\bs_\bh\n+(*aggregatesMap,\n+629 *info,\n+630 infoLevel->globalLookup());\n+631\n+632\n+633 if(criterion.debugLevel()>2) {\n+634 if(rank==0)\n+635 std::cout<<\"Communicating global aggregate numbers took \"<& visited=excluded;\n+640\n+641 typedef std::vector::iterator Iterator;\n+642 typedef IteratorPropertyMap VisitedMap2;\n+643 Iterator end = visited.end();\n+644 for(Iterator iter= visited.begin(); iter != end; ++iter)\n+645 *iter=false;\n+646\n+647 VisitedMap2 visitedMap2(visited.begin(), Dune::IdentityMap());\n+648\n+649 std::shared_ptr\n+650 coarseMatrix(productBuilder.build(*(std::get<0>(graphs)), visitedMap2,\n+651 *info,\n+652 *aggregatesMap,\n+653 aggregates,\n+654 OverlapFlags()));\n+655 dverb<<\"Building of sparsity pattern took \"<freeGlobalLookup();\n 658\n-667 template\n-_\b6_\b6_\b8 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br\n-669 {\n-_\b6_\b7_\b0 typedef T _\bs_\bm_\bo_\bo_\bt_\bh_\be_\br;\n-_\b6_\b7_\b1 typedef typename smoother::range_type _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-672\n-_\b6_\b7_\b3 static void _\ba_\bp_\bp_\bl_\by(_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br& sm, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& v, const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b)\n-674 {\n-675 sm.template apply(v, b);\n-676 }\n-677 };\n-678\n-679 template\n-_\b6_\b8_\b0 struct\n-_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n->\n-681 {\n-_\b6_\b8_\b2 typedef _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\bT_\bD_\b,_\bT_\bA_\b>\n-_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br;\n-_\b6_\b8_\b3 typedef typename _\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-684\n-_\b6_\b8_\b5 static void _\ba_\bp_\bp_\bl_\by(_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br& sm, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& v, const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b)\n-686 {\n-687 sm.template apply(v, b);\n-688 sm.template apply(v, b);\n-689 }\n-690 };\n-691\n-692 template\n-_\b6_\b9_\b3 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-694 {};\n-695\n-696 template\n-_\b6_\b9_\b7 using _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br =\n-_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bT_\b,_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be>;\n-698\n-699 template\n-_\b7_\b0_\b0 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br< _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br<\n-_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< K, Al>, X, Y >,false>\n-701 {\n-_\b7_\b0_\b2 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b7_\b0_\b3 static constexpr size_t n = std::decay_t()))>::rows;\n-704 template\n-705 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain,\n-const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n-706 Solvers& solvers, const SubDomains& domains,\n-707 bool onTheFly);\n-708 };\n-709\n-710 template class S, typename T, typename A>\n-_\b7_\b1_\b1 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br>,true>\n-712 {\n-_\b7_\b1_\b3 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b7_\b1_\b4 static constexpr size_t n = std::decay_t()))>::rows;\n-715 template\n-716 static std::size_t assembleLocalProblems(const RowToDomain& rowToDomain,\n-const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n-717 Solvers& solvers, const SubDomains& domains,\n-718 bool onTheFly);\n-719 };\n-720\n-721 template\n-_\b7_\b2_\b2 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n-723 {\n-_\b7_\b2_\b4 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-725 template\n-726 static std::size_t _\ba_\bs_\bs_\be_\bm_\bb_\bl_\be_\bL_\bo_\bc_\ba_\bl_\bP_\br_\bo_\bb_\bl_\be_\bm_\bs(const RowToDomain& rowToDomain,\n-const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n-727 Solvers& solvers, const SubDomains& domains,\n-728 bool onTheFly);\n-729 };\n-730\n-731 template\n-_\b7_\b3_\b2 struct\n-_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br,false>\n-733 : public _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n-734 {};\n-735\n-736 template\n-_\b7_\b3_\b7 struct\n-_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br,false>\n-738 : public _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n-739 {};\n-740\n-751 template, class TA=std::allocator >\n-_\b7_\b5_\b3 class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n-754 : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-755 {\n-756 public:\n-_\b7_\b6_\b0 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-761\n-_\b7_\b6_\b5 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-766\n-_\b7_\b7_\b0 typedef X _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-771\n-_\b7_\b7_\b8 typedef _\bT_\bM _\bM_\bo_\bd_\be;\n-779\n-_\b7_\b8_\b3 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-784\n-_\b7_\b8_\b6 typedef typename matrix_type::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-787\n-_\b7_\b8_\b9 typedef _\bT_\bA _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n-790\n-792 typedef std::set,\n-793 typename std::allocator_traits::template _\br_\be_\bb_\bi_\bn_\bd_\b__\ba_\bl_\bl_\bo_\bc_\b<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b> >\n-_\b7_\b9_\b4 _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-795\n-_\b7_\b9_\b7 typedef std::vector::\n-template _\br_\be_\bb_\bi_\bn_\bd_\b__\ba_\bl_\bl_\bo_\bc_\b<_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be_\b> > _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br;\n-798\n-_\b8_\b0_\b0 typedef _\bS_\bL_\bL_\bi_\bs_\bt_\b<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b,_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bs_\bt_\bd_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\br_\ba_\bi_\bt_\bs_\b<_\bT_\bA_\b>_\b:_\b:_\bt_\be_\bm_\bp_\bl_\ba_\bt_\be\n-_\br_\be_\bb_\bi_\bn_\bd_\b__\ba_\bl_\bl_\bo_\bc_\b<_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b> > _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bl_\bi_\bs_\bt;\n+659 delete std::get<0>(graphs);\n+660 productBuilder.calculate(matrix->getmat(), *aggregatesMap, *coarseMatrix,\n+*infoLevel, OverlapFlags());\n+661\n+662 if(criterion.debugLevel()>2) {\n+663 if(rank==0)\n+664 std::cout<<\"Calculation entries of Galerkin product took \"<communicator().sum(nonzeros);\n+669 MatrixArgs args(coarseMatrix, *infoLevel);\n+670\n+671 matrices_.addCoarser(args);\n+672 redistributes_.push_back(_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be());\n+673 } // end level loop\n+674\n+675\n+676 infoLevel->freeGlobalLookup();\n+677\n+678 built_=true;\n+679 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp* aggregatesMap=new _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(0);\n+680 aggregatesMaps_.push_back(aggregatesMap);\n+681\n+682 if(criterion.debugLevel()>0) {\n+683 if(level==criterion.maxLevel()) {\n+684 BIGINT unknownsLevel = mlevel->getmat().N();\n+685 unknownsLevel = infoLevel->communicator().sum(unknownsLevel);\n+686 if(rank==0 && criterion.debugLevel()>1) {\n+687 double dunknownsLevel = unknownsLevel.todouble();\n+688 std::cout<<\"Level \"<communicator().size()\n+689 <<\" unknowns per proc (procs=\"<communicator().size\n+()<<\")\"<communicator().size()>1) {\n+696#if HAVE_MPI && !HAVE_PARMETIS\n+697 if(criterion.accumulate()==_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu &&\n+698 infoLevel->communicator().rank()==0)\n+699 std::cerr<<\"Successive accumulation of data on coarse levels only works\n+with ParMETIS installed.\"\n+700 <<\" Fell back to accumulation to one domain on coarsest level\"< redistMat = std::make_shared();\n+705 std::shared_ptr redistComm;\n+706 int nodomains = 1;\n+707\n+708 _\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(mlevel->getmat(), redistMat, *infoLevel,\n+709 redistComm, redistributes_.back(), nodomains,criterion);\n+710 MatrixArgs args(redistMat, *redistComm);\n+711 BIGINT unknownsRedist = redistMat->N();\n+712 unknownsRedist = infoLevel->communicator().sum(unknownsRedist);\n+713\n+714 if(redistComm->communicator().rank()==0 && criterion.debugLevel()>1) {\n+715 double dunknownsRedist = unknownsRedist.todouble();\n+716 std::cout<<\"Level \"<communicator().size()\n+717 <<\" unknowns per proc (procs=\"<communicator().size\n+()<<\")\"<_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+(args));\n+720 infoLevel.addRedistributed(redistComm);\n+721 infoLevel->freeGlobalLookup();\n+722 }\n+723\n+724 int levels = matrices_.levels();\n+725 maxlevels_ = parallelInformation_.finest()->communicator().max(levels);\n+726 assert(matrices_.levels()==redistributes_.size());\n+727 if(hasCoarsest() && rank==0 && criterion.debugLevel()>1)\n+728 std::cout<<\"operator complexity: \"<\n+733 const typename _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by&\n+_\b7_\b3_\b4 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bc_\be_\bs() const\n+735 {\n+736 return matrices_;\n+737 }\n+738\n+739 template\n+740 const typename _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by&\n+_\b7_\b4_\b1 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn() const\n+742 {\n+743 return parallelInformation_;\n+744 }\n+745\n+746 template\n+_\b7_\b4_\b7 void _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bO_\bn_\bF_\bi_\bn_\be_\bs_\bt(std::\n+vector& data) const\n+748 {\n+749 int levels=aggregatesMaps().size();\n+750 int maxlevels=parallelInformation_._\bf_\bi_\bn_\be_\bs_\bt()->communicator().max(levels);\n+751 std::size_t size=(*(aggregatesMaps().begin()))->noVertices();\n+752 // We need an auxiliary vector for the consecutive prolongation.\n+753 std::vector tmp;\n+754 std::vector *coarse, *fine;\n+755\n+756 // make sure the allocated space suffices.\n+757 tmp.reserve(size);\n+758 data.reserve(size);\n+759\n+760 // Correctly assign coarse and fine for the first prolongation such that\n+761 // we end up in data in the end.\n+762 if(levels%2==0) {\n+763 coarse=&tmp;\n+764 fine=&data;\n+765 }else{\n+766 coarse=&data;\n+767 fine=&tmp;\n+768 }\n+769\n+770 // Number the unknowns on the coarsest level consecutively for each\n+process.\n+771 if(levels==maxlevels) {\n+772 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& map = *(*(++aggregatesMaps().rbegin()));\n+773 std::size_t m=0;\n+774\n+775 for(typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br iter = map._\bb_\be_\bg_\bi_\bn(); iter !=\n+map._\be_\bn_\bd(); ++iter)\n+776 if(*iter< _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n+777 m=std::max(*iter,m);\n+778\n+779 coarse->resize(m+1);\n+780 std::size_t i=0;\n+781 srand((unsigned)std::clock());\n+782 std::set used;\n+783 for(typename std::vector::iterator iter=coarse->begin(); iter\n+!= coarse->end();\n+784 ++iter, ++i)\n+785 {\n+786 std::pair::iterator,bool> ibpair\n+787 = used.insert(static_cast((((double)rand())/\n+(RAND_MAX+1.0)))*coarse->size());\n+788\n+789 while(!ibpair.second)\n+790 ibpair = used.insert(static_cast((((double)rand())/\n+(RAND_MAX+1.0))*coarse->size()));\n+791 *iter=*(ibpair.first);\n+792 }\n+793 }\n+794\n+795 typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br pinfo = parallelInformation\n+().coarsest();\n+796 --pinfo;\n+797\n+798 // Now consecutively project the numbers to the finest level.\n+799 for(typename AggregatesMapList::const_reverse_iterator\n+aggregates=++aggregatesMaps().rbegin();\n+800 aggregates != aggregatesMaps().rend(); ++aggregates,--levels) {\n 801\n-_\b8_\b0_\b3 typedef std::vector::\n-template _\br_\be_\bb_\bi_\bn_\bd_\b__\ba_\bl_\bl_\bo_\bc_\b<_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bl_\bi_\bs_\bt_\b> > _\br_\bo_\bw_\bt_\bo_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br;\n-804\n-_\b8_\b0_\b6 typedef _\bT_\bD _\bs_\bl_\bu;\n-807\n-_\b8_\b0_\b9 typedef std::vector::template\n-_\br_\be_\bb_\bi_\bn_\bd_\b__\ba_\bl_\bl_\bo_\bc_\b<_\bs_\bl_\bu_\b> > _\bs_\bl_\bu_\b__\bv_\be_\bc_\bt_\bo_\br;\n-810\n-_\b8_\b2_\b4 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz(const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& mat, const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br&\n-subDomains,\n-825 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relaxationFactor=1, bool _\bo_\bn_\bT_\bh_\be_\bF_\bl_\by_\b_=true);\n+802 fine->resize((*aggregates)->noVertices());\n+803 fine->assign(fine->size(), 0);\n+804 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b,_\b _\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\bs_\bt_\bd_\b:_\b:\n+_\bs_\bi_\bz_\be_\b__\bt_\b>, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn>\n+805 ::prolongateVector(*(*aggregates), *coarse, *fine, static_cast\n+(1), *pinfo);\n+806 --pinfo;\n+807 std::swap(coarse, fine);\n+808 }\n+809\n+810 // Assertion to check that we really projected to data on the last step.\n+811 assert(coarse==&data);\n+812 }\n+813\n+814 template\n+815 const typename _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bL_\bi_\bs_\bt&\n+_\b8_\b1_\b6 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bs() const\n+817 {\n+818 return aggregatesMaps_;\n+819 }\n+820 template\n+821 const typename _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bL_\bi_\bs_\bt&\n+_\b8_\b2_\b2 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn() const\n+823 {\n+824 return redistributes_;\n+825 }\n 826\n-_\b8_\b3_\b8 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz(const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& mat, const _\br_\bo_\bw_\bt_\bo_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br&\n-_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn,\n-839 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relaxationFactor=1, bool _\bo_\bn_\bT_\bh_\be_\bF_\bl_\by_\b_=true);\n-840\n-_\b8_\b4_\b6 virtual void _\bp_\br_\be ([[_\bm_\ba_\by_\bb_\be_\b__\bu_\bn_\bu_\bs_\be_\bd]] X& x, [[_\bm_\ba_\by_\bb_\be_\b__\bu_\bn_\bu_\bs_\be_\bd]] X& b)\n-847 {}\n-848\n-_\b8_\b5_\b4 virtual void _\ba_\bp_\bp_\bl_\by (X& v, const X& _\bd);\n-855\n-_\b8_\b6_\b1 virtual void _\bp_\bo_\bs_\bt ([[_\bm_\ba_\by_\bb_\be_\b__\bu_\bn_\bu_\bs_\be_\bd]] X& x)\n-862 {}\n-863\n-864 template\n-_\b8_\b6_\b5 void _\ba_\bp_\bp_\bl_\by(X& v, const X& _\bd);\n-866\n-_\b8_\b6_\b8 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-869 {\n-870 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-871 }\n-872\n-873 private:\n-874 const M& mat;\n-875 _\bs_\bl_\bu_\b__\bv_\be_\bc_\bt_\bo_\br solvers;\n-876 _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br subDomains;\n-877 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax;\n-878\n-879 typename M::size_type maxlength;\n-880\n-881 bool onTheFly;\n-882 };\n-883\n-884\n-885\n-886 template\n-_\b8_\b8_\b7 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-(_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\bL_\bi_\bs_\bt& il,\n-888 const _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& idx,\n-889 const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& domains_)\n-890 : initializers(&il), indices(&idx), indexMaps(il.size()), domains(domains_)\n-891 {}\n-892\n-893\n-894 template\n-_\b8_\b9_\b5 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\ba_\bd_\bd_\bR_\bo_\bw_\bN_\bn_\bz(const _\bI_\bt_\be_\br& row)\n-896 {\n-897 typedef typename IndexSet::value_type::const_iterator iterator;\n-898 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)\n-[row.index()].end(); ++domain) {\n-899 (*initializers)[*domain].addRowNnz(row, domains[*domain]);\n-900 indexMaps[*domain].insert(row.index());\n-901 }\n-902 }\n-903\n-904 template\n-_\b9_\b0_\b5 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be()\n-906 {\n-907 for(auto&& i: *initializers)\n-908 i.allocateMatrixStorage();\n-909 for(auto&& i: *initializers)\n-910 i.allocateMarker();\n-911 }\n-912\n-913 template\n-_\b9_\b1_\b4 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(const _\bI_\bt_\be_\br& row,\n-const _\bC_\bI_\bt_\be_\br& _\bc_\bo_\bl) const\n-915 {\n-916 typedef typename IndexSet::value_type::const_iterator iterator;\n-917 for(iterator domain=(*indices)[row.index()].begin(); domain != (*indices)\n-[row.index()].end(); ++domain) {\n-918 typename std::map::const_iterator v = indexMaps\n-[*domain].find(_\bc_\bo_\bl.index());\n-919 if(v!= indexMaps[*domain].end()) {\n-920 (*initializers)[*domain].countEntries(indexMaps[*domain].find(_\bc_\bo_\bl.index())-\n->second);\n-921 }\n-922 }\n-923 }\n-924\n-925 template\n-_\b9_\b2_\b6 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bc_\ba_\bl_\bc_\bC_\bo_\bl_\bs_\bt_\ba_\br_\bt() const\n-927 {\n-928 for(auto&& i : *initializers)\n-929 i.calcColstart();\n-930 }\n-931\n-932 template\n-_\b9_\b3_\b3 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bc_\bo_\bp_\by_\bV_\ba_\bl_\bu_\be(const _\bI_\bt_\be_\br& row, const\n-_\bC_\bI_\bt_\be_\br& _\bc_\bo_\bl) const\n-934 {\n-935 typedef typename IndexSet::value_type::const_iterator iterator;\n-936 for(iterator domain=(*indices)[row.index()].begin(); domain!= (*indices)\n-[row.index()].end(); ++domain) {\n-937 typename std::map::const_iterator v = indexMaps\n-[*domain].find(_\bc_\bo_\bl.index());\n-938 if(v!= indexMaps[*domain].end()) {\n-939 assert(indexMaps[*domain].end()!=indexMaps[*domain].find(row.index()));\n-940 (*initializers)[*domain].copyValue(_\bc_\bo_\bl, indexMaps[*domain].find(row.index\n-())->second,\n-941 v->second);\n-942 }\n-943 }\n-944 }\n-945\n-946 template\n-_\b9_\b4_\b7 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx() const\n-948 {\n-949 std::vector().swap(indexMaps);\n-950 for(auto&& i: *initializers)\n-951 i.createMatrix();\n-952 }\n-953\n-954 template\n-_\b9_\b5_\b5 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp()\n-956 : row(0)\n-957 {}\n-958\n-959 template\n-_\b9_\b6_\b0 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(size_type grow)\n-961 {\n-962 assert(map_.find(grow)==map_.end());\n-963 map_.insert(std::make_pair(grow, row++));\n-964 }\n+827 template\n+_\b8_\b2_\b8 _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\b~_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by()\n+829 {\n+830 typedef typename AggregatesMapList::reverse_iterator AggregatesMapIterator;\n+831 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n+832 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br InfoIterator;\n+833\n+834 AggregatesMapIterator amap = aggregatesMaps_.rbegin();\n+835 InfoIterator info = parallelInformation_.coarsest();\n+836 for(Iterator level=matrices_.coarsest(), finest=matrices_.finest(); level\n+!= finest; --level, --info, ++amap) {\n+837 (*amap)->free();\n+838 delete *amap;\n+839 }\n+840 delete *amap;\n+841 }\n+842\n+843 template\n+844 template\n+_\b8_\b4_\b5 void _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn_\bV_\be_\bc_\bt_\bo_\br(_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bV_\b,_\bB_\bA_\b>,\n+TA>& hierarchy) const\n+846 {\n+847 assert(hierarchy.levels()==1);\n+848 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n+849 typedef typename RedistributeInfoList::const_iterator RIter;\n+850 RIter redist = redistributes_.begin();\n+851\n+852 Iterator matrix = matrices_.finest(), coarsest = matrices_.coarsest();\n+853 int level=0;\n+854 if(redist->isSetup())\n+855 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N\n+());\n+856 Dune::dvverb<<\"Level \"<getmat().N()<<\"\n+unknowns!\"<getmat().N()<<\"\n+unknowns!\"<getmat().N());\n+863 if(redist->isSetup())\n+864 hierarchy.addRedistributedOnCoarsest(matrix.getRedistributed().getmat().N\n+());\n+865\n+866 }\n+867\n+868 }\n+869\n+870 template\n+871 template\n+_\b8_\b7_\b2 void _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br(_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bS_\b,_\bT_\bA_\b>& smoothers,\n+873 const typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& sargs) const\n+874 {\n+875 assert(smoothers._\bl_\be_\bv_\be_\bl_\bs()==0);\n+876 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br MatrixIterator;\n+877 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br PinfoIterator;\n+878 typedef typename AggregatesMapList::const_iterator AggregatesIterator;\n+879\n+880 typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs cargs;\n+881 cargs.setArgs(sargs);\n+882 PinfoIterator pinfo = parallelInformation_.finest();\n+883 AggregatesIterator aggregates = aggregatesMaps_.begin();\n+884 int level=0;\n+885 for(MatrixIterator matrix = matrices_.finest(), coarsest =\n+matrices_.coarsest();\n+886 matrix != coarsest; ++matrix, ++pinfo, ++aggregates, ++level) {\n+887 cargs.setMatrix(matrix->getmat(), **aggregates);\n+888 cargs.setComm(*pinfo);\n+889 smoothers._\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br(cargs);\n+890 }\n+891 if(maxlevels()>levels()) {\n+892 // This is not the globally coarsest level and therefore smoothing is\n+needed\n+893 cargs.setMatrix(matrices_.coarsest()->getmat(), **aggregates);\n+894 cargs.setComm(*pinfo);\n+895 smoothers._\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br(cargs);\n+896 ++level;\n+897 }\n+898 }\n+899\n+900 template\n+901 template\n+_\b9_\b0_\b2 void _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn(const F& copyFlags)\n+903 {\n+904 typedef typename AggregatesMapList::iterator AggregatesMapIterator;\n+905 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n+906 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br InfoIterator;\n+907\n+908 AggregatesMapIterator amap = aggregatesMaps_.begin();\n+909 _\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt productBuilder;\n+910 InfoIterator info = parallelInformation_.finest();\n+911 typename RedistributeInfoList::iterator riIter = redistributes_.begin();\n+912 Iterator level = matrices_.finest(), coarsest=matrices_.coarsest();\n+913 if(level.isRedistributed()) {\n+914 info->buildGlobalLookup(level->getmat().N());\n+915 _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs(const_cast<_\bM_\ba_\bt_\br_\bi_\bx&>(level->getmat()),\n+916 const_cast<_\bM_\ba_\bt_\br_\bi_\bx&>(level.getRedistributed().getmat()),\n+917 *info,info.getRedistributed(), *riIter);\n+918 info->freeGlobalLookup();\n+919 }\n+920\n+921 for(; level!=coarsest; ++amap) {\n+922 const _\bM_\ba_\bt_\br_\bi_\bx& fine = (level.isRedistributed() ? level.getRedistributed() :\n+*level).getmat();\n+923 ++level;\n+924 ++info;\n+925 ++riIter;\n+926 productBuilder._\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be(fine, *(*amap), const_cast<_\bM_\ba_\bt_\br_\bi_\bx&>(level->getmat\n+()), *info, copyFlags);\n+927 if(level.isRedistributed()) {\n+928 info->buildGlobalLookup(level->getmat().N());\n+929 _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs(const_cast<_\bM_\ba_\bt_\br_\bi_\bx&>(level->getmat()),\n+930 const_cast<_\bM_\ba_\bt_\br_\bi_\bx&>(level.getRedistributed().getmat()), *info,\n+931 info.getRedistributed(), *riIter);\n+932 info->freeGlobalLookup();\n+933 }\n+934 }\n+935 }\n+936\n+937 template\n+_\b9_\b3_\b8 std::size_t _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs() const\n+939 {\n+940 return matrices_.levels();\n+941 }\n+942\n+943 template\n+_\b9_\b4_\b4 std::size_t _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs() const\n+945 {\n+946 return maxlevels_;\n+947 }\n+948\n+949 template\n+_\b9_\b5_\b0 bool _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bh_\ba_\bs_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt() const\n+951 {\n+952 return levels()==maxlevels() &&\n+953 (!matrices_.coarsest().isRedistributed() ||matrices_.coarsest()->getmat().N\n+()>0);\n+954 }\n+955\n+956 template\n+_\b9_\b5_\b7 bool _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\bI_\bS_\b,_\bA_\b>_\b:_\b:_\bi_\bs_\bB_\bu_\bi_\bl_\bt() const\n+958 {\n+959 return built_;\n+960 }\n+961\n+963 } // namespace Amg\n+964} // namespace Dune\n 965\n-966 template\n-967 typename OverlappingSchwarzInitializer::IndexMap::const_iterator\n-_\b9_\b6_\b8 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bf_\bi_\bn_\bd(size_type grow) const\n-969 {\n-970 return map_.find(grow);\n-971 }\n-972\n-973 template\n-974 typename OverlappingSchwarzInitializer::IndexMap::iterator\n-_\b9_\b7_\b5 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bf_\bi_\bn_\bd(size_type grow)\n-976 {\n-977 return map_.find(grow);\n-978 }\n-979\n-980 template\n-981 typename OverlappingSchwarzInitializer::IndexMap::const_iterator\n-_\b9_\b8_\b2 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd() const\n-983 {\n-984 return map_.end();\n-985 }\n-986\n-987 template\n-988 typename OverlappingSchwarzInitializer::IndexMap::iterator\n-_\b9_\b8_\b9 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd()\n-990 {\n-991 return map_.end();\n-992 }\n-993\n-994 template\n-995 typename OverlappingSchwarzInitializer::IndexMap::const_iterator\n-_\b9_\b9_\b6 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn() const\n-997 {\n-998 return map_.begin();\n-999 }\n-1000\n-1001 template\n-1002 typename OverlappingSchwarzInitializer::IndexMap::iterator\n-_\b1_\b0_\b0_\b3 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bI_\b,_\bS_\b,_\bD_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn()\n-1004 {\n-1005 return map_.begin();\n-1006 }\n-1007\n-1008 template\n-_\b1_\b0_\b0_\b9 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bD_\b,_\bT_\bA_\b>_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz(const\n-_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt_\b_, const _\br_\bo_\bw_\bt_\bo_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& _\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn,\n-1010 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relaxationFactor, bool _\bf_\bl_\by)\n-1011 : _\bm_\ba_\bt(_\bm_\ba_\bt_\b_), relax(relaxationFactor), onTheFly(_\bf_\bl_\by)\n-1012 {\n-1013 typedef typename rowtodomain_vector::const_iterator _\bR_\bo_\bw_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-1014 typedef typename subdomain_list::const_iterator _\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-1015#ifdef DUNE_ISTL_WITH_CHECKING\n-1016 _\ba_\bs_\bs_\be_\br_\bt(_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.size()==mat.N());\n-1017 _\ba_\bs_\bs_\be_\br_\bt(_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.size()==mat.M());\n-1018\n-1019 for(_\bR_\bo_\bw_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br=_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.begin(); _\bi_\bt_\be_\br != _\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.end();\n-++_\bi_\bt_\be_\br)\n-1020 _\ba_\bs_\bs_\be_\br_\bt(_\bi_\bt_\be_\br->size()>0);\n-1021\n-1022#endif\n-1023 // calculate the number of domains\n-1024 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be domains=0;\n-1025 for(_\bR_\bo_\bw_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br=_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.begin(); _\bi_\bt_\be_\br != _\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.end();\n-++_\bi_\bt_\be_\br)\n-1026 for(_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bd=_\bi_\bt_\be_\br->begin(); _\bd != _\bi_\bt_\be_\br->end(); ++_\bd)\n-1027 domains=std::max(domains, *_\bd);\n-1028 ++domains;\n-1029\n-1030 solvers.resize(domains);\n-1031 subDomains.resize(domains);\n-1032\n-1033 // initialize subdomains to row mapping from row to subdomain mapping\n-1034 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row=0;\n-1035 for(_\bR_\bo_\bw_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br=_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.begin(); _\bi_\bt_\be_\br != _\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn.end();\n-++_\bi_\bt_\be_\br, ++row)\n-1036 for(_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bd=_\bi_\bt_\be_\br->begin(); _\bd != _\bi_\bt_\be_\br->end(); ++_\bd)\n-1037 subDomains[*_\bd].insert(row);\n-1038\n-1039#ifdef DUNE_ISTL_WITH_CHECKING\n-1040 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0;\n-1041 typedef typename subdomain_vector::const_iterator iterator;\n-1042 for(iterator _\bi_\bt_\be_\br=subDomains.begin(); _\bi_\bt_\be_\br != subDomains.end(); ++_\bi_\bt_\be_\br) {\n-1043 typedef typename subdomain_type::const_iterator _\be_\bn_\bt_\br_\by_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-1044 Dune::dvverb<<\"domain \"<begin(); entry != _\bi_\bt_\be_\br->end(); ++entry) {\n-1046 Dune::dvverb<<\" \"<<*entry;\n-1047 }\n-1048 Dune::dvverb<\n-1052_\b _\b:_\b:_\ba_\bs_\bs_\be_\bm_\bb_\bl_\be_\bL_\bo_\bc_\ba_\bl_\bP_\br_\bo_\bb_\bl_\be_\bm_\bs(_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn, mat, solvers, subDomains, onTheFly);\n-1053 }\n-1054\n-1055 template\n-_\b1_\b0_\b5_\b6 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bD_\b,_\bT_\bA_\b>_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz(const\n-_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt_\b_,\n-1057 const _\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br& _\bs_\bd,\n-1058 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relaxationFactor,\n-1059 bool _\bf_\bl_\by)\n-1060 : _\bm_\ba_\bt(_\bm_\ba_\bt_\b_), solvers(_\bs_\bd.size()), subDomains(_\bs_\bd), relax(relaxationFactor),\n-1061 onTheFly(_\bf_\bl_\by)\n-1062 {\n-1063 typedef typename subdomain_vector::const_iterator _\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-1064\n-1065#ifdef DUNE_ISTL_WITH_CHECKING\n-1066 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0;\n-1067\n-1068 for(_\bD_\bo_\bm_\ba_\bi_\bn_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bd=_\bs_\bd.begin(); _\bd != _\bs_\bd.end(); ++_\bd,++i) {\n-1069 //std::cout<size()<size()>0);\n-1071 typedef typename DomainIterator::value_type::const_iterator\n-_\be_\bn_\bt_\br_\by_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-1072 Dune::dvverb<<\"domain \"<begin(); entry != _\bd->end(); ++entry) {\n-1074 Dune::dvverb<<\" \"<<*entry;\n-1075 }\n-1076 Dune::dvverb<begin(); row != _\bd_\bo_\bm_\ba_\bi_\bn->end(); ++row)\n-1089 _\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn[*row].push_back(_\bd_\bo_\bm_\ba_\bi_\bn_\bI_\bd);\n-1090 }\n-1091\n-1092 maxlength = _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\b<_\bs_\bl_\bu_\b>\n-1093_\b _\b:_\b:_\ba_\bs_\bs_\be_\bm_\bb_\bl_\be_\bL_\bo_\bc_\ba_\bl_\bP_\br_\bo_\bb_\bl_\be_\bm_\bs(_\br_\bo_\bw_\bT_\bo_\bD_\bo_\bm_\ba_\bi_\bn, mat, solvers, subDomains, onTheFly);\n-1094 }\n-1095\n-1102 template\n-_\b1_\b1_\b0_\b3 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be {};\n-1104\n-1105 template\n-_\b1_\b1_\b0_\b6 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n-1107 {\n-_\b1_\b1_\b0_\b8 static constexpr size_t n = std::decay_t()))>::rows;\n-_\b1_\b1_\b0_\b9 static constexpr size_t m = std::decay_t()))>::cols;\n-1110 template\n-_\b1_\b1_\b1_\b1 static int _\bs_\bi_\bz_\be(const Domain & d)\n-1112 {\n-1113 assert(n==m);\n-1114 return m*d.size();\n-1115 }\n-1116 };\n-1117\n-1118 template\n-1119 template\n-1120 std::size_t\n-_\b1_\b1_\b2_\b1 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<\n-_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b>, X, Y >,false>::\n-1122 assembleLocalProblems([[maybe_unused]] const RowToDomain& rowToDomain,\n-1123 [[maybe_unused]] const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n-1124 [[maybe_unused]] Solvers& solvers,\n-1125 const SubDomains& subDomains,\n-1126 [[maybe_unused]] bool onTheFly)\n-1127 {\n-1128 typedef typename SubDomains::const_iterator DomainIterator;\n-1129 std::size_t maxlength = 0;\n-1130\n-1131 assert(onTheFly);\n-1132\n-1133 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();\n-++domain)\n-1134 maxlength=std::max(maxlength, domain->size());\n-1135 maxlength*=n;\n-1136\n-1137 return maxlength;\n-1138 }\n-1139\n-1140#if HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK\n-1141 template class S, typename T, typename A>\n-1142 template\n-_\b1_\b1_\b4_\b3 std::size_t\n-_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::\n-assembleLocalProblems(const RowToDomain& rowToDomain,\n-1144 const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n-1145 Solvers& solvers,\n-1146 const SubDomains& subDomains,\n-1147 bool onTheFly)\n-1148 {\n-1149 typedef typename S>::MatrixInitializer MatrixInitializer;\n-1150 typedef typename std::vector::iterator\n-InitializerIterator;\n-1151 typedef typename SubDomains::const_iterator DomainIterator;\n-1152 typedef typename Solvers::iterator SolverIterator;\n-1153 std::size_t maxlength = 0;\n-1154\n-1155 if(onTheFly) {\n-1156 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();\n-++domain)\n-1157 maxlength=std::max(maxlength, domain->size());\n-1158 maxlength*=Impl::asMatrix(*_\bm_\ba_\bt[0].begin()).N();\n-1159 }else{\n-1160 // initialize the initializers\n-1161 DomainIterator domain=subDomains.begin();\n-1162\n-1163 // Create the initializers list.\n-1164 std::vector initializers(subDomains.size());\n-1165\n-1166 SolverIterator solver=solvers.begin();\n-1167 for(InitializerIterator initializer=initializers.begin();\n-initializer!=initializers.end();\n-1168 ++initializer, ++solver, ++domain) {\n-1169 solver->getInternalMatrix\n-().N_=_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be_\b<_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bs_\bi_\bz_\be(*domain);\n-1170 solver->getInternalMatrix\n-().M_=_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be_\b<_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bs_\bi_\bz_\be(*domain);\n-1171 //solver->setVerbosity(true);\n-1172 *initializer=MatrixInitializer(solver->getInternalMatrix());\n-1173 }\n-1174\n-1175 // Set up the supermatrices according to the subdomains\n-1176 typedef _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b<_\bs_\bt_\bd_\b:_\b:_\bv_\be_\bc_\bt_\bo_\br_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b>,\n-1177 RowToDomain, SubDomains> Initializer;\n-1178\n-1179 Initializer initializer(initializers, rowToDomain, subDomains);\n-1180 copyToBCCSMatrix(initializer, _\bm_\ba_\bt);\n-1181\n-1182 // Calculate the LU decompositions\n-1183 for(auto&& s: solvers)\n-1184 s.decompose();\n-1185 for (SolverIterator solverIt = solvers.begin(); solverIt != solvers.end();\n-++solverIt)\n-1186 {\n-1187 assert(solverIt->getInternalMatrix().N() == solverIt->getInternalMatrix\n-().M());\n-1188 maxlength = std::max(maxlength, solverIt->getInternalMatrix().N());\n-1189 }\n-1190 }\n-1191 return maxlength;\n-1192 }\n-1193\n-1194#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK\n-1195\n-1196 template\n-1197 template\n-_\b1_\b1_\b9_\b8 std::size_t _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:\n-_\ba_\bs_\bs_\be_\bm_\bb_\bl_\be_\bL_\bo_\bc_\ba_\bl_\bP_\br_\bo_\bb_\bl_\be_\bm_\bs([[maybe_unused]] const RowToDomain& rowToDomain,\n-1199 const _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be& _\bm_\ba_\bt,\n-1200 Solvers& solvers,\n-1201 const SubDomains& subDomains,\n-1202 bool onTheFly)\n-1203 {\n-1204 typedef typename SubDomains::const_iterator DomainIterator;\n-1205 typedef typename Solvers::iterator SolverIterator;\n-1206 std::size_t maxlength = 0;\n-1207\n-1208 if(onTheFly) {\n-1209 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();\n-++domain)\n-1210 maxlength=std::max(maxlength, domain->size());\n-1211 }else{\n-1212 // initialize the solvers of the local problems.\n-1213 SolverIterator solver=solvers.begin();\n-1214 for(DomainIterator domain=subDomains.begin(); domain!=subDomains.end();\n-1215 ++domain, ++solver) {\n-1216 solver->setSubMatrix(_\bm_\ba_\bt, *domain);\n-1217 maxlength=std::max(maxlength, domain->size());\n-1218 }\n-1219 }\n-1220\n-1221 return maxlength;\n-1222\n-1223 }\n-1224\n-1225\n-1226 template\n-_\b1_\b2_\b2_\b7 void _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bD_\b,_\bT_\bA_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(X& x, const X& b)\n-1228 {\n-1229 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(*this, x, b);\n-1230 }\n-1231\n-1232 template\n-1233 template\n-_\b1_\b2_\b3_\b4 void _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bD_\b,_\bT_\bA_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(X& x, const X& b)\n-1235 {\n-1236 typedef _\bs_\bl_\bu_\b__\bv_\be_\bc_\bt_\bo_\br solver_vector;\n-1237 typedef typename\n-_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bf_\bo_\br_\bw_\ba_\br_\bd_\b>_\b:_\b:\n-_\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br iterator;\n-1238 typedef typename\n-_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bf_\bo_\br_\bw_\ba_\br_\bd_\b>_\b:_\b:\n-_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-1239 domain_iterator;\n-1240\n-1241 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bT_\bD_\b> assigner(maxlength, _\bm_\ba_\bt, b, x);\n-1242\n-1243 domain_iterator\n-_\bd_\bo_\bm_\ba_\bi_\bn=_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bf_\bo_\br_\bw_\ba_\br_\bd_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-(subDomains);\n-1244 iterator solver =\n-_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bf_\bo_\br_\bw_\ba_\br_\bd_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-(solvers);\n-1245 X v(x); // temporary for the update\n-1246 v=0;\n-1247\n-1248 typedef typename _\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bT_\bM_\b,_\bX_\b,_\bT_\bD_\b _\b>_\b:_\b:_\bA_\bd_\bd_\be_\br Adder;\n-1249 Adder adder(v, x, assigner, relax);\n-1250\n-1251 for(; _\bd_\bo_\bm_\ba_\bi_\bn !=\n-_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br_\b,_\bf_\bo_\br_\bw_\ba_\br_\bd_\b>_\b:_\b:_\be_\bn_\bd\n-(subDomains); ++_\bd_\bo_\bm_\ba_\bi_\bn) {\n-1252 //Copy rhs to C-array for SuperLU\n-1253 std::for_each(_\bd_\bo_\bm_\ba_\bi_\bn->begin(), _\bd_\bo_\bm_\ba_\bi_\bn->end(), assigner);\n-1254 assigner.resetIndexForNextDomain();\n-1255 if(onTheFly) {\n-1256 // Create the subdomain solver\n-1257 _\bs_\bl_\bu _\bs_\bd_\bs_\bo_\bl_\bv_\be_\br;\n-1258 _\bs_\bd_\bs_\bo_\bl_\bv_\be_\br.setSubMatrix(_\bm_\ba_\bt, *_\bd_\bo_\bm_\ba_\bi_\bn);\n-1259 // Apply\n-1260 _\bs_\bd_\bs_\bo_\bl_\bv_\be_\br.apply(assigner.lhs(), assigner.rhs());\n-1261 }else{\n-1262 solver->apply(assigner.lhs(), assigner.rhs());\n-1263 ++solver;\n-1264 }\n-1265\n-1266 //Add relaxed correction to from SuperLU to v\n-1267 std::for_each(_\bd_\bo_\bm_\ba_\bi_\bn->begin(), _\bd_\bo_\bm_\ba_\bi_\bn->end(), adder);\n-1268 assigner.resetIndexForNextDomain();\n-1269\n-1270 }\n-1271\n-1272 adder.axpy();\n-1273 assigner.deallocate();\n-1274 }\n-1275\n-1276 template\n-1277 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b>, X, Y >,false>\n-_\b1_\b2_\b7_\b8 ::OverlappingAssignerHelper(std::size_t maxlength, const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,\n-_\bA_\bl_\b>& mat_,\n-1279 const X& b_, Y& x_) :\n-1280 _\bm_\ba_\bt(&mat_),\n-1281 rhs_( new DynamicVector<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>(maxlength, 42) ),\n-1282 lhs_( new DynamicVector<_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be>(maxlength, -42) ),\n-1283 b(&b_),\n-1284 x(&x_),\n-1285 i(0),\n-1286 maxlength_(maxlength)\n-1287 {}\n-1288\n-1289 template\n-1290 void\n-1291 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b>, X, Y >,false>\n-_\b1_\b2_\b9_\b2 ::deallocate()\n-1293 {\n-1294 delete rhs_;\n-1295 delete lhs_;\n-1296 }\n-1297\n-1298 template\n-1299 void\n-1300 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b>, X, Y >,false>\n-_\b1_\b3_\b0_\b1 ::resetIndexForNextDomain()\n-1302 {\n-1303 i=0;\n-1304 }\n-1305\n-1306 template\n-1307 DynamicVector &\n-1308 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b>, X, Y >,false>\n-_\b1_\b3_\b0_\b9 ::lhs()\n-1310 {\n-1311 return *lhs_;\n-1312 }\n-1313\n-1314 template\n-1315 DynamicVector &\n-1316 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b>, X, Y >,false>\n-_\b1_\b3_\b1_\b7 ::rhs()\n-1318 {\n-1319 return *rhs_;\n-1320 }\n-1321\n-1322 template\n-1323 void\n-1324 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b>, X, Y >,false>\n-_\b1_\b3_\b2_\b5 ::relaxResult(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax)\n-1326 {\n-1327 lhs() *= relax;\n-1328 }\n-1329\n-1330 template\n-1331 void\n-1332 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b>, X, Y >,false>\n-_\b1_\b3_\b3_\b3 ::operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domainIndex)\n-1334 {\n-1335 lhs() = 0.0;\n-1336#if 0\n-1337 //assign right hand side of current domainindex block\n-1338 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j\n-1376 void\n-1377 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b>, X, Y >,false>\n-_\b1_\b3_\b7_\b8 ::assignResult(_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& res)\n-1379 {\n-1380 // assign the result of the local solve to the global vector\n-1381 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j class S, typename T, typename A>\n-1390 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>\n-_\b1_\b3_\b9_\b1 ::OverlappingAssignerHelper(std::size_t maxlength,\n-1392 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>& mat_,\n-1393 const _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b_,\n-1394 _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& x_)\n-1395 : _\bm_\ba_\bt(&mat_),\n-1396 b(&b_),\n-1397 x(&x_), i(0), maxlength_(maxlength)\n-1398 {\n-1399 rhs_ = new _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be[maxlength];\n-1400 lhs_ = new _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be[maxlength];\n-1401\n-1402 }\n-1403\n-1404 template class S, typename T, typename A>\n-_\b1_\b4_\b0_\b5 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b> >,true>::deallocate()\n-1406 {\n-1407 delete[] rhs_;\n-1408 delete[] lhs_;\n-1409 }\n-1410\n-1411 template class S, typename T, typename A>\n-_\b1_\b4_\b1_\b2 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::operator()(const\n-_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be& domainIndex)\n-1413 {\n-1414 //assign right hand side of current domainindex block\n-1415 // rhs is an array of doubles!\n-1416 // rhs[starti] = b[domainindex]\n-1417 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j class S, typename T, typename A>\n-_\b1_\b4_\b4_\b1 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::relaxResult\n-(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax)\n-1442 {\n-1443 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=i+n; i class S, typename T, typename A>\n-_\b1_\b4_\b5_\b1 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::assignResult\n-(_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& res)\n-1452 {\n-1453 // assign the result of the local solve to the global vector\n-1454 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=0; j class S, typename T, typename A>\n-_\b1_\b4_\b6_\b1 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::\n-resetIndexForNextDomain()\n-1462 {\n-1463 i=0;\n-1464 }\n-1465\n-1466 template class S, typename T, typename A>\n-1467 typename _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::field_type*\n-_\b1_\b4_\b6_\b8 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::lhs()\n-1469 {\n-1470 return lhs_;\n-1471 }\n-1472\n-1473 template class S, typename T, typename A>\n-1474 typename _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::field_type*\n-_\b1_\b4_\b7_\b5 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bS_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>>,true>::rhs()\n-1476 {\n-1477 return rhs_;\n-1478 }\n-1479\n-1480#endif // HAVE_SUPERLU || HAVE_SUITESPARSE_UMFPACK\n-1481\n-1482 template\n-_\b1_\b4_\b8_\b3 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be(std::size_t\n-maxlength,\n-1484 const M& mat_,\n-1485 const Y& b_,\n-1486 X& x_)\n-1487 : _\bm_\ba_\bt(&mat_),\n-1488 b(&b_),\n-1489 x(&x_), i(0)\n-1490 {\n-1491 rhs_= new Y(maxlength);\n-1492 lhs_ = new X(maxlength);\n-1493 }\n-1494\n-1495 template\n-_\b1_\b4_\b9_\b6 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be()\n-1497 {\n-1498 delete rhs_;\n-1499 delete lhs_;\n-1500 }\n-1501\n-1502 template\n-_\b1_\b5_\b0_\b3 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be&\n-domainIndex)\n-1504 {\n-1505 (*rhs_)[i]=(*b)[domainIndex];\n-1506\n-1507 // loop over all Matrix row entries and calculate defect.\n-1508 typedef typename matrix_type::ConstColIterator col_iterator;\n-1509\n-1510 // calculate defect for current row index block\n-1511 for(col_iterator _\bc_\bo_\bl=(*_\bm_\ba_\bt)[domainIndex].begin(); _\bc_\bo_\bl!=(*mat)\n-[domainIndex].end(); ++_\bc_\bo_\bl) {\n-1512 Impl::asMatrix(*col).mmv((*x)[_\bc_\bo_\bl.index()], (*rhs_)[i]);\n-1513 }\n-1514 // Goto next local index\n-1515 ++i;\n-1516 }\n-1517\n-1518 template\n-_\b1_\b5_\b1_\b9 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\br_\be_\bl_\ba_\bx_\bR_\be_\bs_\bu_\bl_\bt(_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be relax)\n-1520 {\n-1521 (*lhs_)[i]*=relax;\n-1522 }\n-1523\n-1524 template\n-_\b1_\b5_\b2_\b5 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\ba_\bs_\bs_\bi_\bg_\bn_\bR_\be_\bs_\bu_\bl_\bt(_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& res)\n-1526 {\n-1527 res+=(*lhs_)[i++];\n-1528 }\n-1529\n-1530 template\n-_\b1_\b5_\b3_\b1 X& _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bl_\bh_\bs()\n-1532 {\n-1533 return *lhs_;\n-1534 }\n-1535\n-1536 template\n-_\b1_\b5_\b3_\b7 Y& _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\br_\bh_\bs()\n-1538 {\n-1539 return *rhs_;\n-1540 }\n-1541\n-1542 template\n-_\b1_\b5_\b4_\b3 void _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\br_\be_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bF_\bo_\br_\bN_\be_\bx_\bt_\bD_\bo_\bm_\ba_\bi_\bn()\n-1544 {\n-1545 i=0;\n-1546 }\n-1547\n-1548 template\n-_\b1_\b5_\b4_\b9 _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >::AdditiveAdder(_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& v_,\n-1550 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& x_,\n-1551 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>& assigner_,\n-1552 const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& relax_)\n-1553 : v(&v_), x(&x_), assigner(&assigner_), relax(relax_)\n-1554 {}\n-1555\n-1556 template\n-_\b1_\b5_\b5_\b7 void _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >::operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be&\n-domainIndex)\n-1558 {\n-1559 // add the result of the local solve to the current update\n-1560 assigner->assignResult((*v)[domainIndex]);\n-1561 }\n-1562\n-1563\n-1564 template\n-_\b1_\b5_\b6_\b5 void _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >::axpy()\n-1566 {\n-1567 // relax the update and add it to the current guess.\n-1568 x->axpy(relax,*v);\n-1569 }\n-1570\n-1571\n-1572 template\n-1573 _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >\n-_\b1_\b5_\b7_\b4 ::MultiplicativeAdder([[maybe_unused]] _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& v_,\n-1575 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& x_,\n-1576 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\bS_\b>& assigner_, const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& relax_)\n-1577 : x(&x_), assigner(&assigner_), relax(relax_)\n-1578 {}\n-1579\n-1580\n-1581 template\n-_\b1_\b5_\b8_\b2 void _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >::operator()(const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be&\n-domainIndex)\n-1583 {\n-1584 // add the result of the local solve to the current guess\n-1585 assigner->relaxResult(relax);\n-1586 assigner->assignResult((*x)[domainIndex]);\n-1587 }\n-1588\n-1589\n-1590 template\n-_\b1_\b5_\b9_\b1 void _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\bS_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> >::axpy()\n-1592 {\n-1593 // nothing to do, as the corrections already relaxed and added in operator\n-()\n-1594 }\n-1595\n-1596\n-1598}\n-1599\n-1600#endif\n-_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh\n-Classes for using SuperLU with ISTL matrices.\n-_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n-Define general preconditioner interface.\n-_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh\n-Classes for using UMFPack with ISTL matrices.\n-_\bi_\bl_\bu_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n-Various local subdomain solvers based on ILU for SeqOverlappingSchwarz.\n-_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implementation of the BCRSMatrix class.\n-_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh\n+966#endif // end DUNE_AMG_MATRIXHIERARCHY_HH\n _\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n This file implements a vector space as a tensor product of a given vector\n space. The number of compon...\n-_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n-Templates characterizing the type of a solver.\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n-_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\ba_\bd_\bd_\bR_\bo_\bw_\bN_\bn_\bz\n-void addRowNnz(const Iter &row)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:895\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(X &v, const X &d)\n-Apply one step of the preconditioner to the system A(v)=d.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1234\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bl_\bh_\bs\n-X & lhs()\n-Get the local left hand side.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1531\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bc_\ba_\bl_\bc_\bC_\bo_\bl_\bs_\bt_\ba_\br_\bt\n-void calcColstart() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:926\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\br_\bh_\bs\n-Y & rhs()\n-Get the local right hand side.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1537\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n-iterator end()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:989\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\br_\be_\bs_\be_\bt_\bI_\bn_\bd_\be_\bx_\bF_\bo_\br_\bN_\be_\bx_\bt_\bD_\bo_\bm_\ba_\bi_\bn\n-void resetIndexForNextDomain()\n-Resets the local index to zero.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1543\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bc_\bo_\bp_\by_\bV_\ba_\bl_\bu_\be\n-void copyValue(const Iter &row, const CIter &col) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:933\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx\n-void createMatrix() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:947\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-iterator begin()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1003\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-OverlappingSchwarzInitializer(InitializerList &il, const IndexSet &indices,\n-const subdomain_vector &domains)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:887\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n-IndexMap()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:955\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &v, const X &d)\n-Apply the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1227\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n-OverlappingAssignerILUBase(std::size_t maxlength, const M &mat, const Y &b, X\n-&x)\n+_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh\n+Functionality for redistributing a sparse matrix.\n+_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\n+Provides classes for building the matrix graph.\n+_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh\n+Provides a classes representing the hierarchies in AMG.\n+_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh\n+Prolongation and restriction for amg.\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+Helper classes for the construction of classes without empty constructor.\n+_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh\n+Provides classes for initializing the link attributes of a matrix graph.\n+_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\n+_\bg_\br_\ba_\bp_\bh_\bc_\br_\be_\ba_\bt_\bo_\br_\b._\bh_\bh\n+_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\n+Provides a class for building the galerkin product based on a aggregation\n+scheme.\n+_\bg_\bl_\bo_\bb_\ba_\bl_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n+Provdes class for identifying aggregates globally.\n+_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\n+Classes for the generic construction and application of the smoothers.\n+_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n+Provides classes for the Coloring process of AMG.\n+_\bi_\bn_\bd_\bi_\bc_\be_\bs_\bc_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b._\bh_\bh\n+Provides a class for building the index set and remote indices on the coarse\n+level.\n+_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\n+Some handy generic functions for ISTL matrices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs\n+auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::\n+value > *sfinae=nullptr)\n+Get the number of nonzero fields in the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:119\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bs\n+const AggregatesMapList & aggregatesMaps() const\n+Get the hierarchy of the mappings of the nodes onto aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:816\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bi_\bs_\bB_\bu_\bi_\bl_\bt\n+bool isBuilt() const\n+Whether the hierarchy was built.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:957\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bh_\ba_\bs_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt\n+bool hasCoarsest() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:950\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs\n+std::size_t levels() const\n+Get the number of levels in the hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:322\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs\n+std::size_t levels() const\n+Get the number of levels in the hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:938\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br\n+void addCoarser(Arguments &args)\n+Add an element on a coarser level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:334\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+const RedistributeInfoList & redistributeInformation() const\n+Get the hierarchy of the information about redistributions,.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:822\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bp_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+const ParallelInformationHierarchy & parallelInformation() const\n+Get the hierarchy of the parallel data distribution information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:741\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\bA_\bn_\bd_\bD_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx\n+bool repartitionAndDistributeMatrix(const M &origMatrix, std::shared_ptr< M >\n+newMatrix, SequentialInformation &origComm, std::shared_ptr<\n+SequentialInformation > &newComm, RedistributeInformation<\n+SequentialInformation > &ri, int nparts, C1 &criterion)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:316\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+const_iterator begin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:725\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bc_\be_\bs\n+const ParallelMatrixHierarchy & matrices() const\n+Get the matrix hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:734\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs\n+std::size_t maxlevels() const\n+Get the max number of levels in the hierarchy of processors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:944\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n+const_iterator end() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:730\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD\n+static const V ISOLATED\n+Identifier of isolated vertices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:571\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn\n+void recalculateGalerkin(const F ©Flags)\n+Recalculate the galerkin products.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:902\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+const void * Arguments\n+A type holding all the arguments needed to call the constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n+std::size_t noVertices() const\n+Get the number of vertices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< T > construct(Arguments &args)\n+Construct an object with the specified arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn_\bV_\be_\bc_\bt_\bo_\br\n+void coarsenVector(Hierarchy< BlockVector< V, BA >, TA > &hierarchy) const\n+Coarsen the vector hierarchy according to the matrix hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:845\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+const AggregateDescriptor * const_iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:723\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+MatrixHierarchy(std::shared_ptr< MatrixOperator > fineMatrix, std::shared_ptr<\n+ParallelInformation > pinfo=std::make_shared< ParallelInformation >())\n Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1483\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bf_\bi_\bn_\bd\n-const_iterator find(size_type grow) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:968\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const size_type &domain)\n-calculate one entry of the local defect.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1503\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n-SeqOverlappingSchwarz(const matrix_type &mat, const subdomain_vector\n-&subDomains, field_type relaxationFactor=1, bool onTheFly_=true)\n-Construct the overlapping Schwarz method.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1056\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n-void allocate()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:905\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bd_\be_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n-void deallocate()\n-Deallocates memory of the local vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1496\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n-void insert(size_type grow)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:960\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs\n-void countEntries(const Iter &row, const CIter &col) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:914\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\ba_\bs_\bs_\be_\bm_\bb_\bl_\be_\bL_\bo_\bc_\ba_\bl_\bP_\br_\bo_\bb_\bl_\be_\bm_\bs\n-static std::size_t assembleLocalProblems(const RowToDomain &rowToDomain, const\n-matrix_type &mat, Solvers &solvers, const SubDomains &domains, bool onTheFly)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1198\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\br_\be_\bl_\ba_\bx_\bR_\be_\bs_\bu_\bl_\bt\n-void relaxResult(field_type relax)\n-relax the result.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1519\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\ba_\bs_\bs_\bi_\bg_\bn_\bR_\be_\bs_\bu_\bl_\bt\n-void assignResult(block_type &res)\n-Assigns the block to the current local index. At the same time the local defect\n-is calculated for the...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1525\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n-SeqOverlappingSchwarz(const matrix_type &mat, const rowtodomain_vector\n-&rowToDomain, field_type relaxationFactor=1, bool onTheFly_=true)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1009\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be\n+AccumulationMode\n+Identifiers for the different accumulation modes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:231\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bf_\bi_\bn_\be_\bs_\bt\n+Iterator finest()\n+Get an iterator positioned at the finest level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:377\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bb_\bu_\bi_\bl_\bd\n+void build(const T &criterion)\n+Build the matrix hierarchy using aggregation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:403\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bf_\br_\be_\be\n+void free()\n+Free the allocated memory.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n+void coarsenSmoother(Hierarchy< S, TA > &smoothers, const typename\n+SmootherTraits< S >::Arguments &args) const\n+Coarsen the smoother hierarchy according to the matrix hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:872\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n+void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion,\n+bool finestLevel)\n+Build the dependency of the matrix graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs\n+std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph,\n+const C &criterion, bool finestLevel)\n+Build the aggregates.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be\n+void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse,\n+const I &pinfo, const O ©)\n+Calculate the galerkin product.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bO_\bn_\bF_\bi_\bn_\be_\bs_\bt\n+void getCoarsestAggregatesOnFinest(std::vector< std::size_t > &data) const\n+Get the mapping of fine level unknowns to coarse level aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:747\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\b~_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+~MatrixHierarchy()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:828\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\bA_\bX_\b__\bP_\bR_\bO_\bC_\bE_\bS_\bS_\bE_\bS\n+@ MAX_PROCESSES\n+Hard limit for the number of processes allowed.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\ba_\bt_\bO_\bn_\bc_\be_\bA_\bc_\bc_\bu\n+@ atOnceAccu\n+Accumulate data to one process at once.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:243\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu\n+@ successiveAccu\n+Successively accumulate to fewer processes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:247\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-Initializer for SuperLU Matrices representing the subdomains.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bC_\bI_\bt_\be_\br\n-Matrix::row_type::const_iterator CIter\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-S IndexSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:58\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bt_\be_\br\n-Matrix::const_iterator Iter\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:55\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-IndexSet::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:59\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\bL_\bi_\bs_\bt\n-I InitializerList\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-AtomInitializer::Matrix Matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bA_\bt_\bo_\bm_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-InitializerList::value_type AtomInitializer\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n-D subdomain_vector\n-The vector type containing the subdomain to row index mapping.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-Iterator end()\n-Get iterator to one beyond last row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:677\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-The type for the index access and the size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::ConstIterator ConstColIterator\n-Const iterator to the entries of a row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:737\n+_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bG_\bl_\bo_\bb_\ba_\bl_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n+void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:154\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs\n+void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C\n+&newComm, RedistributeInformation< C > &ri)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:757\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bG_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn\n+bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication<\n+T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::\n+OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface\n+&redistInf, bool verbose=false)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:822\n+_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx\n+void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm,\n+RedistributeInformation< C > &ri)\n+Redistribute a matrix according to given domain decompositions.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:820\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn\n+bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1,\n+T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::\n+OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface\n+&redistInf, bool verbose=false)\n+execute a graph repartition for a giving graph and indexset.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:1228\n _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n A vector of blocks with memory management.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n-Exact subdomain solver using ILU(p) with appropriate p.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilusubdomainsolver.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n-Sequential overlapping Schwarz preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:783\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bl_\bi_\bs_\bt\n-SLList< size_type, typename std::allocator_traits< TA >::template rebind_alloc<\n-size_type > > subdomain_list\n-The type for the row to subdomain mapping.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:800\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bl_\bu_\b__\bv_\be_\bc_\bt_\bo_\br\n-std::vector< slu, typename std::allocator_traits< TA >::template rebind_alloc<\n-slu > > slu_vector\n-The vector type containing subdomain solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:809\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-The type of the matrix to precondition.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:760\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bM_\bo_\bd_\be\n-TM Mode\n-The mode (additive or multiplicative) of the Schwarz method.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:778\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-X range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:770\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-std::set< size_type, std::less< size_type >, typename std::allocator_traits< TA\n->::template rebind_alloc< size_type > > subdomain_type\n-The type for the subdomain to row index mapping.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:794\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:765\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bl_\bu\n-TD slu\n-The type for the subdomain solver in use.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:806\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the preconditioner (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:868\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bp_\br_\be\n-virtual void pre(X &x, X &b)\n-Prepare the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:846\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bp_\bo_\bs_\bt\n-virtual void post(X &x)\n-Postprocess the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:861\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n-TA allocator\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+derive error class from the base class in common\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+A generic dynamic dense matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+Type for indices and sizes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:577\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+MatrixImp::DenseMatrixBase< T, A >::window_type row_type\n+The type implementing a matrix row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:574\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+Class providing information about the mapping of the vertices onto aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+Class representing the properties of an edge in the matrix graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+Class representing a node in the matrix graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:99\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:118\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:131\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+The (undirected) graph of a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n+Attaches properties to the edges and vertices of a graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:978\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+Graph::VertexDescriptor VertexDescriptor\n+The vertex descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:988\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+A hierarchy of containers (e.g. matrices or vectors)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+LevelIterator< Hierarchy< MatrixOperator, Allocator >, MatrixOperator >\n+Iterator\n+Type of the mutable iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+LevelIterator< const Hierarchy< MatrixOperator, Allocator >, const\n+MatrixOperator > ConstIterator\n+Type of the const iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+The hierarchies build by the coarsening process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+typename std::allocator_traits< Allocator >::template rebind_alloc<\n+AggregatesMap * > AAllocator\n+Allocator for pointers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:85\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+Dune::Amg::Hierarchy< ParallelInformation, Allocator >\n+ParallelInformationHierarchy\n+The type of the parallel informarion hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\bL_\bi_\bs_\bt\n+std::list< AggregatesMap *, AAllocator > AggregatesMapList\n+The type of the aggregates maps list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:88\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+PI ParallelInformation\n+The type of the index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+Dune::Amg::Hierarchy< MatrixOperator, Allocator > ParallelMatrixHierarchy\n+The type of the parallel matrix hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+A Allocator\n The allocator to use.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:789\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n-std::vector< subdomain_type, typename std::allocator_traits< TA >::template\n-rebind_alloc< subdomain_type > > subdomain_vector\n-The vector type containing the subdomain to row index mapping.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:797\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\br_\bo_\bw_\bt_\bo_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n-std::vector< subdomain_list, typename std::allocator_traits< TA >::template\n-rebind_alloc< subdomain_list > > rowtodomain_vector\n-The vector type containing the row index to subdomain mapping.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:803\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-matrix_type::size_type size_type\n-The return type of the size method.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:786\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n-Tag that the tells the Schwarz method to be additive.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n-Tag that tells the Schwarz method to be multiplicative.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n-Tag that tells the Schwarz method to be multiplicative and symmetric.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:133\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br\n-Exact subdomain solver using Dune::DynamicMatrix::solve.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:140\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-std::remove_const< M >::type matrix_type\n-The matrix type the preconditioner is for.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:149\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The domain type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The range type of the preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n-void setSubMatrix(const M &BCRS, S &rowset)\n-Set the data of the local problem.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:184\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(DynamicVector< field_type > &v, DynamicVector< field_type > &d)\n-Apply the subdomain solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:162\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\br_\bi_\bl_\bu_\b__\bt_\by_\bp_\be\n-std::remove_const< M >::type rilu_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:215\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-matrix_type::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:229\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:226\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-BCRSMatrix< K, Al > matrix_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:225\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:227\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,\n-_\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-range_type::block_type block_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:228\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-S< BCRSMatrix< T, A > >::range_type range_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:315\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-range_type::block_type block_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:317\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-range_type::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:316\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-matrix_type::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:319\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-BCRSMatrix< T, A > matrix_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:314\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:400\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-matrix_type::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:408\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Y::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:404\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-Y::block_type block_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:406\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:402\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\b0_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:\n-_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X\n-&x)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:493\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bL_\bU_\bN_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:\n-_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-OverlappingAssignerHelper(std::size_t maxlength, const M &mat, const Y &b, X\n-&x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bT_\by_\bp_\be\n+RedistributeInformation< ParallelInformation > RedistributeInfoType\n+The type of the redistribute information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bg_\be_\bt_\bP_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\bi_\bo_\bn_\bD_\ba_\bm_\bp_\bi_\bn_\bg_\bF_\ba_\bc_\bt_\bo_\br\n+double getProlongationDampingFactor() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bR_\bI_\bL_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+typename std::allocator_traits< Allocator >::template rebind_alloc<\n+RedistributeInfoType > RILAllocator\n+Allocator for RedistributeInfoType.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:94\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\bL_\bi_\bs_\bt\n+std::list< RedistributeInfoType, RILAllocator > RedistributeInfoList\n+The type of the list of redistribute information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:97\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+Dune::Amg::AggregatesMap< typename MatrixGraph< Matrix >::VertexDescriptor >\n+AggregatesMap\n+The type of the aggregates map we use.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+MatrixOperator::matrix_type Matrix\n+The type of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+M MatrixOperator\n+The type of the matrix operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:64\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const matrix_row &row)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:254\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\br_\bo_\bw\n+Matrix::row_type matrix_row\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:245\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bm_\bi_\bn\n+size_type min\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:261\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bc_\ba_\bl_\bc\n+calc()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:247\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bm_\ba_\bx\n+size_type max\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:262\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bs_\bu_\bm\n+size_type sum\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:263\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bt_\ba_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:_\bc_\ba_\bl_\bc_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:244\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+The criterion describing the stop criteria for the coarsening process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:283\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+CoarsenCriterion(const Dune::Amg::Parameters &parms)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:309\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+T AggregationCriterion\n+The criterion for tagging connections as strong and nodes as isolated. This\n+might be e....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:289\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+CoarsenCriterion(int maxLevel=100, int coarsenTarget=1000, double\n+minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode\n+accumulate=successiveAccu, bool useFixedOrder=false)\n Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:512\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:520\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type\n-field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:526\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:525\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:542\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:547\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bA_\bd_\bd_\be_\br_\b<_\b _\bS_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type\n-field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:548\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-template meta program for choosing how to add the correction.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:572\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\bd_\bd_\bi_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>_\b:_\b:_\bA_\bd_\bd_\be_\br\n-AdditiveAdder< S, X > Adder\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:577\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>_\b:_\b:_\bA_\bd_\bd_\be_\br\n-MultiplicativeAdder< S, X > Adder\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:583\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bd_\bd_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bX_\b,_\b _\bS_\b _\b>_\b:_\b:_\bA_\bd_\bd_\be_\br\n-MultiplicativeAdder< S, X > Adder\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:589\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n-Helper template meta program for application of overlapping Schwarz.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:605\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-static solver_iterator begin(solver_vector &sv)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:611\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-solver_vector::iterator solver_iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:607\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n-static domain_iterator end(const subdomain_vector &sv)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:625\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-subdomain_vector::const_iterator domain_iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:609\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br\n-T1 solver_vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:606\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-static domain_iterator begin(const subdomain_vector &sv)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:620\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n-T2 subdomain_vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:608\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n-static solver_iterator end(solver_vector &sv)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:616\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n-T2 subdomain_vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:636\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\be_\bn_\bd\n-static solver_iterator end(solver_vector &sv)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:644\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be_\br_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-solver_vector::reverse_iterator solver_iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:635\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-subdomain_vector::const_reverse_iterator domain_iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:637\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-static solver_iterator begin(solver_vector &sv)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:639\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bs_\bo_\bl_\bv_\be_\br_\b__\bv_\be_\bc_\bt_\bo_\br\n-T1 solver_vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:634\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-static domain_iterator begin(const subdomain_vector &sv)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:648\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bD_\bi_\br_\be_\bc_\bt_\bi_\bo_\bn_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\be_\bn_\bd\n-static domain_iterator end(const subdomain_vector &sv)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:653\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br\n-Helper template meta program for application of overlapping Schwarz.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:669\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-smoother::range_type range_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:671\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br\n-T smoother\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:670\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-static void apply(smoother &sm, range_type &v, const range_type &b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:673\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bT_\bD_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-static void apply(smoother &sm, range_type &v, const range_type &b)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:685\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bT_\bD_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br\n-SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA >\n-smoother\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:682\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n-_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bT_\bD_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-smoother::range_type range_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:683\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bS_\bo_\bl_\bv_\be_\br_\b<\n-_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bA_\bl_\b _\b>_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b,_\b _\bf_\ba_\bl_\bs_\be_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-BCRSMatrix< K, Al > matrix_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:702\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bS_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b,_\b _\bt_\br_\bu_\be_\b _\b>_\b:_\b:\n-_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-BCRSMatrix< T, A > matrix_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:713\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:723\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bI_\bL_\bU_\bB_\ba_\bs_\be_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:724\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1103\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bD_\bo_\bm_\ba_\bi_\bn_\bS_\bi_\bz_\be_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be\n-static int size(const Domain &d)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:1111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Base class for matrix free definition of preconditioners.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:304\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+All parameters for AMG.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n+Tag idnetifying the visited property of a vertex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+The default class for the smoother arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+static Category category(const OP &op, decltype(op.category()) *=nullptr)\n+Helperfunction to extract the solver category either from an enum, or from the\n+newly introduced virtu...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00161.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00161.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: ildl.hh File Reference\n+dune-istl: hierarchy.hh File Reference\n \n \n \n \n \n \n \n@@ -65,60 +65,56 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n \n-
    ildl.hh File Reference
    \n+Classes |\n+Namespaces
    \n+ \n \n
    \n \n-

    Incomplete LDL decomposition. \n+

    Provides a classes representing the hierarchies in AMG. \n More...

    \n-
    #include <dune/common/scalarvectorview.hh>
    \n-#include <dune/common/scalarmatrixview.hh>
    \n-#include "ilu.hh"
    \n+
    #include <list>
    \n+#include <memory>
    \n+#include <limits>
    \n+#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/timer.hh>
    \n+#include <dune/common/bigunsignedint.hh>
    \n+#include <dune/istl/paamg/construction.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n+\n+\n+\n+\n+\n+\n+\n+

    \n+Classes

    class  Dune::Amg::Hierarchy< T, A >
     A hierarchy of containers (e.g. matrices or vectors) More...
     
    class  Dune::Amg::Hierarchy< T, A >::LevelIterator< C, T1 >
     Iterator over the levels in the hierarchy. More...
     
    \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n

    \n-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)
     
    namespace  Dune::Amg
     
    \n

    Detailed Description

    \n-

    Incomplete LDL decomposition.

    \n-
    Author
    Martin Nolte
    \n+

    Provides a classes representing the hierarchies in AMG.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,44 +1,38 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-ildl.hh File Reference\n-Incomplete LDL decomposition. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+hierarchy.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Provides a classes representing the hierarchies in AMG. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n-namespace \u00a0 _\bD_\bu_\bn_\be\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT (const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, m, n > &B, const\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, m, n > &CT, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, m, n > &A)\n+C\bCl\bla\bas\bss\bse\bes\bs\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n+\u00a0 A hierarchy of containers (e.g. matrices or vectors) _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-template\n-static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT (const K &B, const K &CT, K &A, typename\n- std::enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bC_\b,_\b _\bT_\b1_\b _\b>\n+\u00a0 Iterator over the levels in the hierarchy. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-template\n-static void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT (const _\bM_\ba_\bt_\br_\bi_\bx &B, const _\bM_\ba_\bt_\br_\bi_\bx &CT, _\bM_\ba_\bt_\br_\bi_\bx\n- &A, typename std::enable_if_t::value >\n- *sfinae=nullptr)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bd_\be_\bc_\bo_\bm_\bp_\bo_\bs_\be (_\bM_\ba_\bt_\br_\bi_\bx &A)\n-\u00a0 compute ILDL decomposition of a symmetric matrix A\n+N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n+namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bb_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const _\bM_\ba_\bt_\br_\bi_\bx &A, X &v, const Y &d, bool\n- isLowerTriangular=false)\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Incomplete LDL decomposition.\n+Provides a classes representing the hierarchies in AMG.\n Author\n- Martin Nolte\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00161_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00161_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: ildl.hh Source File\n+dune-istl: hierarchy.hh Source File\n \n \n \n \n \n \n \n@@ -70,250 +70,423 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    ildl.hh
    \n+
    hierarchy.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    3#ifndef DUNE_ISTL_ILDL_HH
    \n-
    4#define DUNE_ISTL_ILDL_HH
    \n-
    5
    \n-
    6#include <dune/common/scalarvectorview.hh>
    \n-
    7#include <dune/common/scalarmatrixview.hh>
    \n-
    8#include "ilu.hh"
    \n-
    9
    \n-
    17namespace Dune
    \n-
    18{
    \n-
    19
    \n-
    20 // bildl_subtractBCT
    \n-
    21 // -----------------
    \n-
    22
    \n-
    23 template< class K, int m, int n >
    \n-
    \n-\n-
    25 {
    \n-
    26 for( int i = 0; i < m; ++i )
    \n-
    27 {
    \n-
    28 for( int j = 0; j < n; ++j )
    \n-
    29 {
    \n-
    30 for( int k = 0; k < n; ++k )
    \n-
    31 A[ i ][ j ] -= B[ i ][ k ] * CT[ j ][ k ];
    \n-
    32 }
    \n-
    33 }
    \n-
    34 }
    \n-
    \n-
    35
    \n-
    36 template< class K >
    \n-
    \n-
    37 inline static void bildl_subtractBCT ( const K &B, const K &CT, K &A,
    \n-
    38 typename std::enable_if_t<Dune::IsNumber<K>::value>* sfinae = nullptr )
    \n-
    39 {
    \n-
    40 A -= B * CT;
    \n-
    41 }
    \n-
    \n-
    42
    \n-
    43 template< class Matrix >
    \n-
    \n-
    44 inline static void bildl_subtractBCT ( const Matrix &B, const Matrix &CT, Matrix &A,
    \n-
    45 typename std::enable_if_t<!Dune::IsNumber<Matrix>::value>* sfinae = nullptr )
    \n-
    46 {
    \n-
    47 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n-
    48 {
    \n-
    49 auto &&A_i = *i;
    \n-
    50 auto &&B_i = B[ i.index() ];
    \n-
    51 const auto ikend = B_i.end();
    \n-
    52 for( auto j = A_i.begin(), jend = A_i.end(); j != jend; ++j )
    \n-
    53 {
    \n-
    54 auto &&A_ij = *j;
    \n-
    55 auto &&CT_j = CT[ j.index() ];
    \n-
    56 const auto jkend = CT_j.end();
    \n-
    57 for( auto ik = B_i.begin(), jk = CT_j.begin(); (ik != ikend) && (jk != jkend); )
    \n-
    58 {
    \n-
    59 if( ik.index() == jk.index() )
    \n-
    60 {
    \n-
    61 bildl_subtractBCT( *ik, *jk, A_ij );
    \n-
    62 ++ik; ++jk;
    \n-
    63 }
    \n-
    64 else if( ik.index() < jk.index() )
    \n-
    65 ++ik;
    \n-
    66 else
    \n-
    67 ++jk;
    \n-
    68 }
    \n-
    69 }
    \n-
    70 }
    \n-
    71 }
    \n-
    \n+
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    4// vi: set et ts=4 sw=2 sts=2:
    \n+
    5#ifndef DUNE_AMGHIERARCHY_HH
    \n+
    6#define DUNE_AMGHIERARCHY_HH
    \n+
    7
    \n+
    8#include <list>
    \n+
    9#include <memory>
    \n+
    10#include <limits>
    \n+
    11#include <dune/common/stdstreams.hh>
    \n+
    12#include <dune/common/timer.hh>
    \n+
    13#include <dune/common/bigunsignedint.hh>
    \n+\n+
    15
    \n+
    16namespace Dune
    \n+
    17{
    \n+
    18 namespace Amg
    \n+
    19 {
    \n+
    38 template<typename T, typename A=std::allocator<T> >
    \n+
    \n+\n+
    40 {
    \n+
    41 public:
    \n+
    45 typedef T MemberType;
    \n+
    46
    \n+
    47 template<typename T1, typename T2>
    \n+
    48 class LevelIterator;
    \n+
    49
    \n+
    50 private:
    \n+
    54 struct Element
    \n+
    55 {
    \n+
    56 friend class LevelIterator<Hierarchy<T,A>, T>;
    \n+
    57 friend class LevelIterator<const Hierarchy<T,A>, const T>;
    \n+
    58
    \n+
    60 std::weak_ptr<Element> coarser_;
    \n+
    61
    \n+
    63 std::shared_ptr<Element> finer_;
    \n+
    64
    \n+
    66 std::shared_ptr<MemberType> element_;
    \n+
    67
    \n+
    69 std::shared_ptr<MemberType> redistributed_;
    \n+
    70 };
    \n+
    71 public:
    \n
    72
    \n-
    73
    \n-
    74
    \n-
    75 // bildl_decompose
    \n-
    76 // ---------------
    \n+
    76 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<Element>;
    \n
    77
    \n-
    87 template< class Matrix >
    \n-
    \n-
    88 inline void bildl_decompose ( Matrix &A )
    \n-
    89 {
    \n-
    90 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n-
    91 {
    \n-
    92 auto &&A_i = *i;
    \n-
    93
    \n-
    94 auto ij = A_i.begin();
    \n-
    95 for( ; ij.index() < i.index(); ++ij )
    \n-
    96 {
    \n-
    97 auto &&A_ij = *ij;
    \n-
    98 auto &&A_j = A[ ij.index() ];
    \n-
    99
    \n-
    100 // store L_ij Dj in A_ij (note: for k < i: A_kj = L_kj)
    \n-
    101 // L_ij Dj = A_ij - \\sum_{k < j} (L_ik D_k) L_jk^T
    \n-
    102 auto ik = A_i.begin();
    \n-
    103 auto jk = A_j.begin();
    \n-
    104 while( (ik != ij) && (jk.index() < ij.index()) )
    \n-
    105 {
    \n-
    106 if( ik.index() == jk.index() )
    \n-
    107 {
    \n-
    108 bildl_subtractBCT(*ik, *jk, A_ij);
    \n-
    109 ++ik; ++jk;
    \n-
    110 }
    \n-
    111 else if( ik.index() < jk.index() )
    \n-
    112 ++ik;
    \n-
    113 else
    \n-
    114 ++jk;
    \n-
    115 }
    \n-
    116 }
    \n-
    117
    \n-
    118 if( ij.index() != i.index() )
    \n-
    119 DUNE_THROW( ISTLError, "diagonal entry missing" );
    \n-
    120
    \n-
    121 // update diagonal and multiply A_ij by D_j^{-1}
    \n-
    122 auto &&A_ii = *ij;
    \n-
    123 for( auto ik = A_i.begin(); ik != ij; ++ik )
    \n-
    124 {
    \n-
    125 auto &&A_ik = *ik;
    \n-
    126 const auto &A_k = A[ ik.index() ];
    \n-
    127
    \n-
    128 auto B = A_ik;
    \n-
    129 Impl::asMatrix(A_ik).rightmultiply( Impl::asMatrix(*A_k.find( ik.index() )) );
    \n-
    130 bildl_subtractBCT( B, A_ik, A_ii );
    \n-
    131 }
    \n-
    132 try
    \n-
    133 {
    \n-
    134 Impl::asMatrix(A_ii).invert();
    \n-
    135 }
    \n-
    136 catch( const Dune::FMatrixError &e )
    \n-
    137 {
    \n-
    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() );
    \n-
    139 }
    \n-
    140 }
    \n-
    141 }
    \n-
    \n-
    142
    \n-
    143
    \n-
    144
    \n-
    145 // bildl_backsolve
    \n-
    146 // ---------------
    \n-
    147
    \n-
    148 template< class Matrix, class X, class Y >
    \n-
    \n-
    149 inline void bildl_backsolve ( const Matrix &A, X &v, const Y &d, bool isLowerTriangular = false )
    \n-
    150 {
    \n-
    151 // solve L v = d, note: Lii = I
    \n-
    152 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n-
    153 {
    \n-
    154 const auto &A_i = *i;
    \n-
    155 v[ i.index() ] = d[ i.index() ];
    \n-
    156 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij )
    \n-
    157 {
    \n-
    158 auto&& vi = Impl::asVector( v[ i.index() ] );
    \n-
    159 Impl::asMatrix(*ij).mmv(Impl::asVector( v[ ij.index() ] ), vi);
    \n-
    160 }
    \n-
    161 }
    \n-
    162
    \n-
    163 // solve D w = v, note: diagonal stores Dii^{-1}
    \n-
    164 if( isLowerTriangular )
    \n-
    165 {
    \n-
    166 // The matrix is lower triangular, so the diagonal entry is the
    \n-
    167 // last one in each row.
    \n-
    168 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n-
    169 {
    \n-
    170 const auto &A_i = *i;
    \n-
    171 const auto ii = A_i.beforeEnd();
    \n-
    172 assert( ii.index() == i.index() );
    \n-
    173 // We need to be careful here: Directly using
    \n-
    174 // auto rhs = Impl::asVector(v[ i.index() ]);
    \n-
    175 // is not OK in case this is a proxy. Hence
    \n-
    176 // we first have to copy the value. Notice that
    \n-
    177 // this is still not OK, if the vector type itself returns
    \n-
    178 // proxy references.
    \n-
    179 auto rhsValue = v[ i.index() ];
    \n-
    180 auto&& rhs = Impl::asVector(rhsValue);
    \n-
    181 auto&& vi = Impl::asVector( v[ i.index() ] );
    \n-
    182 Impl::asMatrix(*ii).mv(rhs, vi);
    \n-
    183 }
    \n-
    184 }
    \n-
    185 else
    \n-
    186 {
    \n-
    187 // Without assumptions on the sparsity pattern we have to search
    \n-
    188 // for the diagonal entry in each row.
    \n-
    189 for( auto i = A.begin(), iend = A.end(); i != iend; ++i )
    \n-
    190 {
    \n-
    191 const auto &A_i = *i;
    \n-
    192 const auto ii = A_i.find( i.index() );
    \n-
    193 assert( ii.index() == i.index() );
    \n-
    194 // We need to be careful here: Directly using
    \n-
    195 // auto rhs = Impl::asVector(v[ i.index() ]);
    \n-
    196 // is not OK in case this is a proxy. Hence
    \n-
    197 // we first have to copy the value. Notice that
    \n-
    198 // this is still not OK, if the vector type itself returns
    \n-
    199 // proxy references.
    \n-
    200 auto rhsValue = v[ i.index() ];
    \n-
    201 auto&& rhs = Impl::asVector(rhsValue);
    \n-
    202 auto&& vi = Impl::asVector( v[ i.index() ] );
    \n-
    203 Impl::asMatrix(*ii).mv(rhs, vi);
    \n-
    204 }
    \n-
    205 }
    \n-
    206
    \n-
    207 // solve L^T v = w, note: only L is stored
    \n-
    208 // note: we perform the operation column-wise from right to left
    \n-
    209 for( auto i = A.beforeEnd(), iend = A.beforeBegin(); i != iend; --i )
    \n-
    210 {
    \n-
    211 const auto &A_i = *i;
    \n-
    212 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij )
    \n-
    213 {
    \n-
    214 auto&& vij = Impl::asVector( v[ ij.index() ] );
    \n-
    215 Impl::asMatrix(*ij).mmtv(Impl::asVector( v[ i.index() ] ), vij);
    \n-
    216 }
    \n-
    217 }
    \n-
    218 }
    \n-
    \n-
    219
    \n-
    220} // namespace Dune
    \n-
    221
    \n-
    222#endif // #ifndef DUNE_ISTL_ILDL_HH
    \n-
    The incomplete LU factorization kernels.
    \n+\n+
    79
    \n+
    \n+
    84 Hierarchy(const std::shared_ptr<MemberType> & first);
    \n+
    85
    \n+
    \n+
    89 Hierarchy() : levels_(0)
    \n+
    90 {}
    \n+
    \n+
    91
    \n+
    \n+
    95 Hierarchy(const Hierarchy& other);
    \n+
    96
    \n+
    \n+\n+
    102
    \n+
    \n+\n+
    104
    \n+
    \n+
    109 void addFiner(Arguments& args);
    \n+
    110
    \n+
    117 template<class C, class T1>
    \n+
    \n+\n+
    119 : public BidirectionalIteratorFacade<LevelIterator<C,T1>,T1,T1&>
    \n+
    120 {
    \n+
    121 friend class LevelIterator<typename std::remove_const<C>::type,
    \n+
    122 typename std::remove_const<T1>::type >;
    \n+
    123 friend class LevelIterator<const typename std::remove_const<C>::type,
    \n+
    124 const typename std::remove_const<T1>::type >;
    \n+
    125
    \n+
    126 public:
    \n+
    \n+\n+
    129 {}
    \n+
    \n+
    130
    \n+
    \n+
    131 LevelIterator(std::shared_ptr<Element> element)
    \n+
    132 : element_(element)
    \n+
    133 {}
    \n+
    \n+
    134
    \n+
    \n+
    136 LevelIterator(const LevelIterator<typename std::remove_const<C>::type,
    \n+
    137 typename std::remove_const<T1>::type>& other)
    \n+
    138 : element_(other.element_)
    \n+
    139 {}
    \n+
    \n+
    140
    \n+
    \n+
    142 LevelIterator(const LevelIterator<const typename std::remove_const<C>::type,
    \n+
    143 const typename std::remove_const<T1>::type>& other)
    \n+
    144 : element_(other.element_)
    \n+
    145 {}
    \n+
    \n+
    146
    \n+
    \n+
    150 bool equals(const LevelIterator<typename std::remove_const<C>::type,
    \n+
    151 typename std::remove_const<T1>::type>& other) const
    \n+
    152 {
    \n+
    153 return element_ == other.element_;
    \n+
    154 }
    \n+
    \n+
    155
    \n+
    \n+
    159 bool equals(const LevelIterator<const typename std::remove_const<C>::type,
    \n+
    160 const typename std::remove_const<T1>::type>& other) const
    \n+
    161 {
    \n+
    162 return element_ == other.element_;
    \n+
    163 }
    \n+
    \n+
    164
    \n+
    \n+
    166 T1& dereference() const
    \n+
    167 {
    \n+
    168 return *(element_->element_);
    \n+
    169 }
    \n+
    \n+
    170
    \n+
    \n+\n+
    173 {
    \n+
    174 element_ = element_->coarser_.lock();
    \n+
    175 }
    \n+
    \n+
    176
    \n+
    \n+\n+
    179 {
    \n+
    180 element_ = element_->finer_;
    \n+
    181 }
    \n+
    \n+
    182
    \n+
    \n+
    187 bool isRedistributed() const
    \n+
    188 {
    \n+
    189 return (bool)element_->redistributed_;
    \n+
    190 }
    \n+
    \n+
    191
    \n+
    \n+\n+
    197 {
    \n+
    198 assert(element_->redistributed_);
    \n+
    199 return *element_->redistributed_;
    \n+
    200 }
    \n+
    \n+
    \n+
    201 void addRedistributed(std::shared_ptr<T1> t)
    \n+
    202 {
    \n+
    203 element_->redistributed_ = t;
    \n+
    204 }
    \n+
    \n+
    205
    \n+
    \n+\n+
    207 {
    \n+
    208 element_->redistributed_ = nullptr;
    \n+
    209 }
    \n+
    \n+
    210
    \n+
    211 private:
    \n+
    212 std::shared_ptr<Element> element_;
    \n+
    213 };
    \n+
    \n+
    214
    \n+\n+
    217
    \n+\n+
    220
    \n+
    \n+\n+
    226
    \n+
    \n+\n+
    232
    \n+
    233
    \n+
    \n+\n+
    239
    \n+
    \n+\n+
    245
    \n+
    \n+
    250 std::size_t levels() const;
    \n+
    251
    \n+
    252 private:
    \n+
    258 std::shared_ptr<MemberType> originalFinest_;
    \n+
    260 std::shared_ptr<Element> finest_;
    \n+
    262 std::shared_ptr<Element> coarsest_;
    \n+
    264 Allocator allocator_;
    \n+
    266 int levels_;
    \n+
    267 };
    \n+
    268
    \n+
    269 template<class T, class A>
    \n+
    \n+
    270 Hierarchy<T,A>::Hierarchy(const std::shared_ptr<MemberType> & first)
    \n+
    271 : originalFinest_(first)
    \n+
    272 {
    \n+
    273 finest_ = std::allocate_shared<Element>(allocator_);
    \n+
    274 finest_->element_ = originalFinest_;
    \n+
    275 coarsest_ = finest_;
    \n+
    276 levels_ = 1;
    \n+
    277 }
    \n+
    \n+
    278
    \n+
    280 //TODO: do we actually want to support this? This might be very expensive?!
    \n+
    281 template<class T, class A>
    \n+
    \n+\n+
    283 : allocator_(other.allocator_),
    \n+
    284 levels_(other.levels_)
    \n+
    285 {
    \n+
    286 if(!other.finest_)
    \n+
    287 {
    \n+
    288 finest_=coarsest_=nullptr;
    \n+
    289 return;
    \n+
    290 }
    \n+
    291 finest_ = std::allocate_shared<Element>(allocator_);
    \n+
    292 std::shared_ptr<Element> finer_;
    \n+
    293 std::shared_ptr<Element> current_ = finest_;
    \n+
    294 std::weak_ptr<Element> otherWeak_ = other.finest_;
    \n+
    295
    \n+
    296 while(! otherWeak_.expired())
    \n+
    297 {
    \n+
    298 // create shared_ptr from weak_ptr, we just checked that this is safe
    \n+
    299 std::shared_ptr<Element> otherCurrent_ = std::shared_ptr<Element>(otherWeak_);
    \n+
    300 // clone current level
    \n+
    301 //TODO: should we use the allocator?
    \n+
    302 current_->element_ =
    \n+
    303 std::make_shared<MemberType>(*(otherCurrent_->element_));
    \n+
    304 current_->finer_=finer_;
    \n+
    305 if(otherCurrent_->redistributed_)
    \n+
    306 current_->redistributed_ =
    \n+
    307 std::make_shared<MemberType>(*(otherCurrent_->redistributed_));
    \n+
    308 finer_=current_;
    \n+
    309 if(not otherCurrent_->coarser_.expired())
    \n+
    310 {
    \n+
    311 auto c = std::allocate_shared<Element>(allocator_);
    \n+
    312 current_->coarser_ = c;
    \n+
    313 current_ = c;
    \n+
    314 }
    \n+
    315 // go to coarser level
    \n+
    316 otherWeak_ = otherCurrent_->coarser_;
    \n+
    317 }
    \n+
    318 coarsest_=current_;
    \n+
    319 }
    \n+
    \n+
    320
    \n+
    321 template<class T, class A>
    \n+
    \n+
    322 std::size_t Hierarchy<T,A>::levels() const
    \n+
    323 {
    \n+
    324 return levels_;
    \n+
    325 }
    \n+
    \n+
    \n+
    326
    \n+
    327 template<class T, class A>
    \n+
    \n+\n+
    329 {
    \n+
    330 coarsest_->redistributed_ = ConstructionTraits<MemberType>::construct(args);
    \n+
    331 }
    \n+
    \n+
    332
    \n+
    333 template<class T, class A>
    \n+
    \n+\n+
    335 {
    \n+
    336 if(!coarsest_) {
    \n+
    337 // we have no levels at all...
    \n+
    338 assert(!finest_);
    \n+
    339 // allocate into the shared_ptr
    \n+
    340 originalFinest_ = ConstructionTraits<MemberType>::construct(args);
    \n+
    341 coarsest_ = std::allocate_shared<Element>(allocator_);
    \n+
    342 coarsest_->element_ = originalFinest_;
    \n+
    343 finest_ = coarsest_;
    \n+
    344 }else{
    \n+
    345 auto old_coarsest = coarsest_;
    \n+
    346 coarsest_ = std::allocate_shared<Element>(allocator_);
    \n+
    347 coarsest_->finer_ = old_coarsest;
    \n+
    348 coarsest_->element_ = ConstructionTraits<MemberType>::construct(args);
    \n+
    349 old_coarsest->coarser_ = coarsest_;
    \n+
    350 }
    \n+
    351 ++levels_;
    \n+
    352 }
    \n+
    \n+
    353
    \n+
    354
    \n+
    355 template<class T, class A>
    \n+
    \n+\n+
    357 {
    \n+
    358 //TODO: wouldn't it be better to do this in the constructor?'
    \n+
    359 if(!finest_) {
    \n+
    360 // we have no levels at all...
    \n+
    361 assert(!coarsest_);
    \n+
    362 // allocate into the shared_ptr
    \n+
    363 originalFinest_ = ConstructionTraits<MemberType>::construct(args);
    \n+
    364 finest_ = std::allocate_shared<Element>(allocator_);
    \n+
    365 finest_->element = originalFinest_;
    \n+
    366 coarsest_ = finest_;
    \n+
    367 }else{
    \n+
    368 finest_->finer_ = std::allocate_shared<Element>(allocator_);
    \n+
    369 finest_->finer_->coarser_ = finest_;
    \n+
    370 finest_ = finest_->finer_;
    \n+
    371 finest_->element = ConstructionTraits<T>::construct(args);
    \n+
    372 }
    \n+
    373 ++levels_;
    \n+
    374 }
    \n+
    \n+
    375
    \n+
    376 template<class T, class A>
    \n+
    \n+\n+
    378 {
    \n+
    379 return Iterator(finest_);
    \n+
    380 }
    \n+
    \n+
    381
    \n+
    382 template<class T, class A>
    \n+
    \n+\n+
    384 {
    \n+
    385 return Iterator(coarsest_);
    \n+
    386 }
    \n+
    \n+
    387
    \n+
    388 template<class T, class A>
    \n+
    \n+\n+
    390 {
    \n+
    391 return ConstIterator(finest_);
    \n+
    392 }
    \n+
    \n+
    393
    \n+
    394 template<class T, class A>
    \n+
    \n+\n+
    396 {
    \n+
    397 return ConstIterator(coarsest_);
    \n+
    398 }
    \n+
    \n+
    \n+
    400 } // namespace Amg
    \n+
    401} // namespace Dune
    \n+
    402
    \n+
    403#endif
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    Helper classes for the construction of classes without empty constructor.
    \n+
    Hierarchy(const Hierarchy &other)
    Copy constructor (deep copy!).
    Definition hierarchy.hh:282
    \n+
    void addRedistributedOnCoarsest(Arguments &args)
    Definition hierarchy.hh:328
    \n+
    std::size_t levels() const
    Get the number of levels in the hierarchy.
    Definition hierarchy.hh:322
    \n+
    ConstIterator coarsest() const
    Get an iterator positioned at the coarsest level.
    Definition hierarchy.hh:395
    \n+
    void addCoarser(Arguments &args)
    Add an element on a coarser level.
    Definition hierarchy.hh:334
    \n+
    void addFiner(Arguments &args)
    Add an element on a finer level.
    Definition hierarchy.hh:356
    \n+
    Hierarchy(const std::shared_ptr< MemberType > &first)
    Construct a new hierarchy.
    Definition hierarchy.hh:270
    \n+
    const void * Arguments
    A type holding all the arguments needed to call the constructor.
    Definition construction.hh:44
    \n+
    static std::shared_ptr< T > construct(Arguments &args)
    Construct an object with the specified arguments.
    Definition construction.hh:52
    \n+
    Iterator coarsest()
    Get an iterator positioned at the coarsest level.
    Definition hierarchy.hh:383
    \n+
    ConstIterator finest() const
    Get an iterator positioned at the finest level.
    Definition hierarchy.hh:389
    \n+
    Iterator finest()
    Get an iterator positioned at the finest level.
    Definition hierarchy.hh:377
    \n+
    STL namespace.
    \n
    Definition allocator.hh:11
    \n-
    void bildl_decompose(Matrix &A)
    compute ILDL decomposition of a symmetric matrix A
    Definition ildl.hh:88
    \n-
    void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool isLowerTriangular=false)
    Definition ildl.hh:149
    \n-
    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
    \n-
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    Error when performing an operation on a matrix block.
    Definition istlexception.hh:52
    \n-
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n-
    RowIterator beforeBegin()
    Definition matrix.hh:630
    \n-
    RowIterator beforeEnd()
    Definition matrix.hh:623
    \n-
    RowIterator end()
    Get iterator to one beyond last row.
    Definition matrix.hh:616
    \n-
    RowIterator begin()
    Get iterator to first row.
    Definition matrix.hh:610
    \n-
    Definition matrixutils.hh:27
    \n+
    A hierarchy of containers (e.g. matrices or vectors)
    Definition hierarchy.hh:40
    \n+
    T MemberType
    The type of the container we store.
    Definition hierarchy.hh:45
    \n+
    LevelIterator< Hierarchy< T, A >, T > Iterator
    Type of the mutable iterator.
    Definition hierarchy.hh:216
    \n+
    LevelIterator< const Hierarchy< T, A >, const T > ConstIterator
    Type of the const iterator.
    Definition hierarchy.hh:219
    \n+
    ConstructionTraits< T >::Arguments Arguments
    Definition hierarchy.hh:78
    \n+
    Hierarchy()
    Construct an empty hierarchy.
    Definition hierarchy.hh:89
    \n+
    typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator
    The allocator to use for the list elements.
    Definition hierarchy.hh:76
    \n+
    Iterator over the levels in the hierarchy.
    Definition hierarchy.hh:120
    \n+
    LevelIterator(const LevelIterator< typename std::remove_const< C >::type, typename std::remove_const< T1 >::type > &other)
    Copy constructor.
    Definition hierarchy.hh:136
    \n+
    void addRedistributed(std::shared_ptr< T1 > t)
    Definition hierarchy.hh:201
    \n+
    T1 & dereference() const
    Dereference the iterator.
    Definition hierarchy.hh:166
    \n+
    bool equals(const LevelIterator< typename std::remove_const< C >::type, typename std::remove_const< T1 >::type > &other) const
    Equality check.
    Definition hierarchy.hh:150
    \n+
    bool isRedistributed() const
    Check whether there was a redistribution at the current level.
    Definition hierarchy.hh:187
    \n+
    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
    \n+
    void increment()
    Move to the next coarser level.
    Definition hierarchy.hh:172
    \n+
    LevelIterator(const LevelIterator< const typename std::remove_const< C >::type, const typename std::remove_const< T1 >::type > &other)
    Copy constructor.
    Definition hierarchy.hh:142
    \n+
    void deleteRedistributed()
    Definition hierarchy.hh:206
    \n+
    void decrement()
    Move to the next fine level.
    Definition hierarchy.hh:178
    \n+
    LevelIterator(std::shared_ptr< Element > element)
    Definition hierarchy.hh:131
    \n+
    T1 & getRedistributed() const
    Get the redistributed container.
    Definition hierarchy.hh:196
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,266 +1,442 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-ildl.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+hierarchy.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3#ifndef DUNE_ISTL_ILDL_HH\n-4#define DUNE_ISTL_ILDL_HH\n-5\n-6#include \n-7#include \n-8#include \"_\bi_\bl_\bu_\b._\bh_\bh\"\n-9\n-17namespace _\bD_\bu_\bn_\be\n-18{\n-19\n-20 // bildl_subtractBCT\n-21 // -----------------\n-22\n-23 template< class K, int m, int n >\n-_\b2_\b4 inline static void _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT ( const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bn_\b _\b> &B,\n-const _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bn_\b _\b> &CT, _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bm_\b,_\b _\bn_\b _\b> &A )\n-25 {\n-26 for( int i = 0; i < m; ++i )\n-27 {\n-28 for( int j = 0; j < n; ++j )\n-29 {\n-30 for( int k = 0; k < n; ++k )\n-31 A[ i ][ j ] -= B[ i ][ k ] * CT[ j ][ k ];\n-32 }\n-33 }\n-34 }\n-35\n-36 template< class K >\n-_\b3_\b7 inline static void _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT ( const K &B, const K &CT, K &A,\n-38 typename std::enable_if_t::value>* sfinae = nullptr )\n-39 {\n-40 A -= B * CT;\n-41 }\n-42\n-43 template< class Matrix >\n-_\b4_\b4 inline static void _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT ( const _\bM_\ba_\bt_\br_\bi_\bx &B, const _\bM_\ba_\bt_\br_\bi_\bx &CT,\n-_\bM_\ba_\bt_\br_\bi_\bx &A,\n-45 typename std::enable_if_t::value>* sfinae = nullptr\n-)\n-46 {\n-47 for( auto i = A._\bb_\be_\bg_\bi_\bn(), iend = A._\be_\bn_\bd(); i != iend; ++i )\n-48 {\n-49 auto &&A_i = *i;\n-50 auto &&B_i = B[ i.index() ];\n-51 const auto ikend = B_i._\be_\bn_\bd();\n-52 for( auto j = A_i.begin(), jend = A_i.end(); j != jend; ++j )\n-53 {\n-54 auto &&A_ij = *j;\n-55 auto &&CT_j = CT[ j.index() ];\n-56 const auto jkend = CT_j._\be_\bn_\bd();\n-57 for( auto ik = B_i.begin(), jk = CT_j.begin(); (ik != ikend) && (jk !=\n-jkend); )\n-58 {\n-59 if( ik.index() == jk.index() )\n-60 {\n-61 _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT( *ik, *jk, A_ij );\n-62 ++ik; ++jk;\n-63 }\n-64 else if( ik.index() < jk.index() )\n-65 ++ik;\n-66 else\n-67 ++jk;\n-68 }\n-69 }\n-70 }\n-71 }\n+3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+4// vi: set et ts=4 sw=2 sts=2:\n+5#ifndef DUNE_AMGHIERARCHY_HH\n+6#define DUNE_AMGHIERARCHY_HH\n+7\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+15\n+16namespace _\bD_\bu_\bn_\be\n+17{\n+18 namespace Amg\n+19 {\n+38 template >\n+_\b3_\b9 class _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+40 {\n+41 public:\n+_\b4_\b5 typedef T _\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be;\n+46\n+47 template\n+48 class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+49\n+50 private:\n+54 struct Element\n+55 {\n+56 friend class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br<_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by, T>;\n+57 friend class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br, const T>;\n+58\n+60 std::weak_ptr coarser_;\n+61\n+63 std::shared_ptr finer_;\n+64\n+66 std::shared_ptr element_;\n+67\n+_\b6_\b9 std::shared_ptr redistributed_;\n+70 };\n+71 public:\n 72\n-73\n-74\n-75 // bildl_decompose\n-76 // ---------------\n+_\b7_\b6 using _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br = typename std::allocator_traits::template\n+rebind_alloc;\n 77\n-87 template< class Matrix >\n-_\b8_\b8 inline void _\bb_\bi_\bl_\bd_\bl_\b__\bd_\be_\bc_\bo_\bm_\bp_\bo_\bs_\be ( _\bM_\ba_\bt_\br_\bi_\bx &A )\n-89 {\n-90 for( auto i = A._\bb_\be_\bg_\bi_\bn(), iend = A._\be_\bn_\bd(); i != iend; ++i )\n-91 {\n-92 auto &&A_i = *i;\n-93\n-94 auto ij = A_i.begin();\n-95 for( ; ij.index() < i.index(); ++ij )\n-96 {\n-97 auto &&A_ij = *ij;\n-98 auto &&A_j = A[ ij.index() ];\n-99\n-100 // store L_ij Dj in A_ij (note: for k < i: A_kj = L_kj)\n-101 // L_ij Dj = A_ij - \\sum_{k < j} (L_ik D_k) L_jk^T\n-102 auto ik = A_i._\bb_\be_\bg_\bi_\bn();\n-103 auto jk = A_j.begin();\n-104 while( (ik != ij) && (jk.index() < ij.index()) )\n-105 {\n-106 if( ik.index() == jk.index() )\n-107 {\n-108 _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT(*ik, *jk, A_ij);\n-109 ++ik; ++jk;\n-110 }\n-111 else if( ik.index() < jk.index() )\n-112 ++ik;\n-113 else\n-114 ++jk;\n-115 }\n-116 }\n-117\n-118 if( ij.index() != i.index() )\n-119 DUNE_THROW( _\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"diagonal entry missing\" );\n-120\n-121 // update diagonal and multiply A_ij by D_j^{-1}\n-122 auto &&A_ii = *ij;\n-123 for( auto ik = A_i.begin(); ik != ij; ++ik )\n-124 {\n-125 auto &&A_ik = *ik;\n-126 const auto &A_k = A[ ik.index() ];\n-127\n-128 auto B = A_ik;\n-129 Impl::asMatrix(A_ik).rightmultiply( Impl::asMatrix(*A_k.find( ik.index() ))\n-);\n-130 _\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT( B, A_ik, A_ii );\n-131 }\n-132 try\n-133 {\n-134 Impl::asMatrix(A_ii).invert();\n-135 }\n-136 catch( const Dune::FMatrixError &e )\n-137 {\n-138 DUNE_THROW( _\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br, \"ILDL failed to invert matrix block A[\" <<\n-i.index() << \"][\" << ij.index() << \"]\" << e.what(); th__ex.r = i.index();\n-th__ex.c = ij.index() );\n-139 }\n-140 }\n-141 }\n-142\n-143\n-144\n-145 // bildl_backsolve\n-146 // ---------------\n-147\n-148 template< class Matrix, class X, class Y >\n-_\b1_\b4_\b9 inline void _\bb_\bi_\bl_\bd_\bl_\b__\bb_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be ( const _\bM_\ba_\bt_\br_\bi_\bx &A, X &v, const Y &d, bool\n-isLowerTriangular = false )\n-150 {\n-151 // solve L v = d, note: Lii = I\n-152 for( auto i = A._\bb_\be_\bg_\bi_\bn(), iend = A._\be_\bn_\bd(); i != iend; ++i )\n-153 {\n-154 const auto &A_i = *i;\n-155 v[ i.index() ] = d[ i.index() ];\n-156 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij )\n-157 {\n-158 auto&& vi = Impl::asVector( v[ i.index() ] );\n-159 Impl::asMatrix(*ij).mmv(Impl::asVector( v[ ij.index() ] ), vi);\n-160 }\n-161 }\n-162\n-163 // solve D w = v, note: diagonal stores Dii^{-1}\n-164 if( isLowerTriangular )\n-165 {\n-166 // The matrix is lower triangular, so the diagonal entry is the\n-167 // last one in each row.\n-168 for( auto i = A._\bb_\be_\bg_\bi_\bn(), iend = A._\be_\bn_\bd(); i != iend; ++i )\n-169 {\n-170 const auto &A_i = *i;\n-171 const auto ii = A_i.beforeEnd();\n-172 assert( ii.index() == i.index() );\n-173 // We need to be careful here: Directly using\n-174 // auto rhs = Impl::asVector(v[ i.index() ]);\n-175 // is not OK in case this is a proxy. Hence\n-176 // we first have to copy the value. Notice that\n-177 // this is still not OK, if the vector type itself returns\n-178 // proxy references.\n-179 auto rhsValue = v[ i.index() ];\n-180 auto&& rhs = Impl::asVector(rhsValue);\n-181 auto&& vi = Impl::asVector( v[ i.index() ] );\n-182 Impl::asMatrix(*ii).mv(rhs, vi);\n-183 }\n-184 }\n-185 else\n-186 {\n-187 // Without assumptions on the sparsity pattern we have to search\n-188 // for the diagonal entry in each row.\n-189 for( auto i = A._\bb_\be_\bg_\bi_\bn(), iend = A._\be_\bn_\bd(); i != iend; ++i )\n-190 {\n-191 const auto &A_i = *i;\n-192 const auto ii = A_i.find( i.index() );\n-193 assert( ii.index() == i.index() );\n-194 // We need to be careful here: Directly using\n-195 // auto rhs = Impl::asVector(v[ i.index() ]);\n-196 // is not OK in case this is a proxy. Hence\n-197 // we first have to copy the value. Notice that\n-198 // this is still not OK, if the vector type itself returns\n-199 // proxy references.\n-200 auto rhsValue = v[ i.index() ];\n-201 auto&& rhs = Impl::asVector(rhsValue);\n-202 auto&& vi = Impl::asVector( v[ i.index() ] );\n-203 Impl::asMatrix(*ii).mv(rhs, vi);\n+_\b7_\b8 typedef typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+79\n+_\b8_\b4 _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(const std::shared_ptr & first);\n+85\n+_\b8_\b9 _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by() : levels_(0)\n+90 {}\n+91\n+_\b9_\b5 _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(const _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& other);\n+96\n+_\b1_\b0_\b1 void _\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args);\n+102\n+_\b1_\b0_\b3 void _\ba_\bd_\bd_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd_\bO_\bn_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args);\n+104\n+_\b1_\b0_\b9 void _\ba_\bd_\bd_\bF_\bi_\bn_\be_\br(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args);\n+110\n+117 template\n+_\b1_\b1_\b8 class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+119 : public BidirectionalIteratorFacade,T1,T1&>\n+120 {\n+121 friend class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n+122 typename std::remove_const::type >;\n+123 friend class _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n+124 const typename std::remove_const::type >;\n+125\n+126 public:\n+_\b1_\b2_\b8 _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br()\n+129 {}\n+130\n+_\b1_\b3_\b1 _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(std::shared_ptr element)\n+132 : element_(element)\n+133 {}\n+134\n+_\b1_\b3_\b6 _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n+137 typename std::remove_const::type>& other)\n+138 : element_(other.element_)\n+139 {}\n+140\n+_\b1_\b4_\b2 _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(const _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::\n+type,\n+143 const typename std::remove_const::type>& other)\n+144 : element_(other.element_)\n+145 {}\n+146\n+_\b1_\b5_\b0 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n+151 typename std::remove_const::type>& other) const\n+152 {\n+153 return element_ == other.element_;\n+154 }\n+155\n+_\b1_\b5_\b9 bool _\be_\bq_\bu_\ba_\bl_\bs(const _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br::type,\n+160 const typename std::remove_const::type>& other) const\n+161 {\n+162 return element_ == other.element_;\n+163 }\n+164\n+_\b1_\b6_\b6 T1& _\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be() const\n+167 {\n+168 return *(element_->element_);\n+169 }\n+170\n+_\b1_\b7_\b2 void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n+173 {\n+174 element_ = element_->coarser_.lock();\n+175 }\n+176\n+_\b1_\b7_\b8 void _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt()\n+179 {\n+180 element_ = element_->finer_;\n+181 }\n+182\n+_\b1_\b8_\b7 bool _\bi_\bs_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd() const\n+188 {\n+189 return (bool)element_->redistributed_;\n+190 }\n+191\n+_\b1_\b9_\b6 T1& _\bg_\be_\bt_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd() const\n+197 {\n+198 assert(element_->redistributed_);\n+199 return *element_->redistributed_;\n+200 }\n+_\b2_\b0_\b1 void _\ba_\bd_\bd_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd(std::shared_ptr t)\n+202 {\n+203 element_->redistributed_ = t;\n 204 }\n-205 }\n-206\n-207 // solve L^T v = w, note: only L is stored\n-208 // note: we perform the operation column-wise from right to left\n-209 for( auto i = A._\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd(), iend = A._\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn(); i != iend; --i )\n-210 {\n-211 const auto &A_i = *i;\n-212 for( auto ij = A_i.begin(); ij.index() < i.index(); ++ij )\n-213 {\n-214 auto&& vij = Impl::asVector( v[ ij.index() ] );\n-215 Impl::asMatrix(*ij).mmtv(Impl::asVector( v[ i.index() ] ), vij);\n-216 }\n-217 }\n-218 }\n-219\n-220} // namespace Dune\n-221\n-222#endif // #ifndef DUNE_ISTL_ILDL_HH\n-_\bi_\bl_\bu_\b._\bh_\bh\n-The incomplete LU factorization kernels.\n+205\n+_\b2_\b0_\b6 void _\bd_\be_\bl_\be_\bt_\be_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd()\n+207 {\n+208 element_->redistributed_ = nullptr;\n+209 }\n+210\n+211 private:\n+212 std::shared_ptr element_;\n+213 };\n+214\n+_\b2_\b1_\b6 typedef _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>,T> _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+217\n+_\b2_\b1_\b9 typedef _\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>, const T> _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+220\n+_\b2_\b2_\b5 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\be_\bs_\bt();\n+226\n+_\b2_\b3_\b1 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\ba_\br_\bs_\be_\bs_\bt();\n+232\n+233\n+_\b2_\b3_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\be_\bs_\bt() const;\n+239\n+_\b2_\b4_\b4 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\ba_\br_\bs_\be_\bs_\bt() const;\n+245\n+_\b2_\b5_\b0 std::size_t _\bl_\be_\bv_\be_\bl_\bs() const;\n+251\n+252 private:\n+258 std::shared_ptr originalFinest_;\n+260 std::shared_ptr finest_;\n+262 std::shared_ptr coarsest_;\n+264 _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br allocator_;\n+266 int levels_;\n+267 };\n+268\n+269 template\n+_\b2_\b7_\b0 _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(const std::shared_ptr & first)\n+271 : originalFinest_(first)\n+272 {\n+273 finest_ = std::allocate_shared(allocator_);\n+274 finest_->element_ = originalFinest_;\n+275 coarsest_ = finest_;\n+276 levels_ = 1;\n+277 }\n+278\n+280 //TODO: do we actually want to support this? This might be very expensive?!\n+281 template\n+_\b2_\b8_\b2 _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by(const _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& other)\n+283 : allocator_(other.allocator_),\n+284 levels_(other.levels_)\n+285 {\n+286 if(!other.finest_)\n+287 {\n+288 finest_=coarsest_=nullptr;\n+289 return;\n+290 }\n+291 finest_ = std::allocate_shared(allocator_);\n+292 std::shared_ptr finer_;\n+293 std::shared_ptr current_ = finest_;\n+294 std::weak_ptr otherWeak_ = other.finest_;\n+295\n+296 while(! otherWeak_.expired())\n+297 {\n+298 // create shared_ptr from weak_ptr, we just checked that this is safe\n+299 std::shared_ptr otherCurrent_ = std::shared_ptr\n+(otherWeak_);\n+300 // clone current level\n+301 //TODO: should we use the allocator?\n+302 current_->element_ =\n+303 std::make_shared(*(otherCurrent_->element_));\n+304 current_->finer_=finer_;\n+305 if(otherCurrent_->redistributed_)\n+306 current_->redistributed_ =\n+307 std::make_shared(*(otherCurrent_->redistributed_));\n+308 finer_=current_;\n+309 if(not otherCurrent_->coarser_.expired())\n+310 {\n+311 auto c = std::allocate_shared(allocator_);\n+312 current_->coarser_ = c;\n+313 current_ = c;\n+314 }\n+315 // go to coarser level\n+316 otherWeak_ = otherCurrent_->coarser_;\n+317 }\n+318 coarsest_=current_;\n+319 }\n+320\n+321 template\n+_\b3_\b2_\b2 std::size_t _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs() const\n+323 {\n+324 return levels_;\n+325 }\n+326\n+327 template\n+_\b3_\b2_\b8 void _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd_\bO_\bn_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+329 {\n+330 coarsest_->redistributed_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+(args);\n+331 }\n+332\n+333 template\n+_\b3_\b3_\b4 void _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+335 {\n+336 if(!coarsest_) {\n+337 // we have no levels at all...\n+338 assert(!finest_);\n+339 // allocate into the shared_ptr\n+340 originalFinest_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(args);\n+341 coarsest_ = std::allocate_shared(allocator_);\n+342 coarsest_->element_ = originalFinest_;\n+343 finest_ = coarsest_;\n+344 }else{\n+345 auto old_coarsest = coarsest_;\n+346 coarsest_ = std::allocate_shared(allocator_);\n+347 coarsest_->finer_ = old_coarsest;\n+348 coarsest_->element_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(args);\n+349 old_coarsest->coarser_ = coarsest_;\n+350 }\n+351 ++levels_;\n+352 }\n+353\n+354\n+355 template\n+_\b3_\b5_\b6 void _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bF_\bi_\bn_\be_\br(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+357 {\n+358 //TODO: wouldn't it be better to do this in the constructor?'\n+359 if(!finest_) {\n+360 // we have no levels at all...\n+361 assert(!coarsest_);\n+362 // allocate into the shared_ptr\n+363 originalFinest_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(args);\n+364 finest_ = std::allocate_shared(allocator_);\n+365 finest_->element = originalFinest_;\n+366 coarsest_ = finest_;\n+367 }else{\n+368 finest_->finer_ = std::allocate_shared(allocator_);\n+369 finest_->finer_->coarser_ = finest_;\n+370 finest_ = finest_->finer_;\n+371 finest_->element = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(args);\n+372 }\n+373 ++levels_;\n+374 }\n+375\n+376 template\n+_\b3_\b7_\b7 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bf_\bi_\bn_\be_\bs_\bt()\n+378 {\n+379 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(finest_);\n+380 }\n+381\n+382 template\n+_\b3_\b8_\b3 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bs_\bt()\n+384 {\n+385 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(coarsest_);\n+386 }\n+387\n+388 template\n+_\b3_\b8_\b9 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bf_\bi_\bn_\be_\bs_\bt() const\n+390 {\n+391 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(finest_);\n+392 }\n+393\n+394 template\n+_\b3_\b9_\b5 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bs_\bt() const\n+396 {\n+397 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(coarsest_);\n+398 }\n+400 } // namespace Amg\n+401} // namespace Dune\n+402\n+403#endif\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+Helper classes for the construction of classes without empty constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+Hierarchy(const Hierarchy &other)\n+Copy constructor (deep copy!).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:282\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\ba_\bd_\bd_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd_\bO_\bn_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt\n+void addRedistributedOnCoarsest(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:328\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs\n+std::size_t levels() const\n+Get the number of levels in the hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:322\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bs_\bt\n+ConstIterator coarsest() const\n+Get an iterator positioned at the coarsest level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:395\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\ba_\bd_\bd_\bC_\bo_\ba_\br_\bs_\be_\br\n+void addCoarser(Arguments &args)\n+Add an element on a coarser level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:334\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\ba_\bd_\bd_\bF_\bi_\bn_\be_\br\n+void addFiner(Arguments &args)\n+Add an element on a finer level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:356\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+Hierarchy(const std::shared_ptr< MemberType > &first)\n+Construct a new hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:270\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+const void * Arguments\n+A type holding all the arguments needed to call the constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< T > construct(Arguments &args)\n+Construct an object with the specified arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bs_\bt\n+Iterator coarsest()\n+Get an iterator positioned at the coarsest level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:383\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bf_\bi_\bn_\be_\bs_\bt\n+ConstIterator finest() const\n+Get an iterator positioned at the finest level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:389\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bf_\bi_\bn_\be_\bs_\bt\n+Iterator finest()\n+Get an iterator positioned at the finest level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:377\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bd_\be_\bc_\bo_\bm_\bp_\bo_\bs_\be\n-void bildl_decompose(Matrix &A)\n-compute ILDL decomposition of a symmetric matrix A\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ildl.hh:88\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bb_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be\n-void bildl_backsolve(const Matrix &A, X &v, const Y &d, bool\n-isLowerTriangular=false)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ildl.hh:149\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bi_\bl_\bd_\bl_\b__\bs_\bu_\bb_\bt_\br_\ba_\bc_\bt_\bB_\bC_\bT\n-static void bildl_subtractBCT(const FieldMatrix< K, m, n > &B, const\n-FieldMatrix< K, m, n > &CT, FieldMatrix< K, m, n > &A)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ildl.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-derive error class from the base class in common\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br\n-Error when performing an operation on a matrix block.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-A generic dynamic dense matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-RowIterator beforeBegin()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:630\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-RowIterator beforeEnd()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:623\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-RowIterator end()\n-Get iterator to one beyond last row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:616\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-RowIterator begin()\n-Get iterator to first row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:610\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+A hierarchy of containers (e.g. matrices or vectors)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bM_\be_\bm_\bb_\be_\br_\bT_\by_\bp_\be\n+T MemberType\n+The type of the container we store.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:45\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+LevelIterator< Hierarchy< T, A >, T > Iterator\n+Type of the mutable iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+LevelIterator< const Hierarchy< T, A >, const T > ConstIterator\n+Type of the const iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+ConstructionTraits< T >::Arguments Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+Hierarchy()\n+Construct an empty hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator\n+The allocator to use for the list elements.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator over the levels in the hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+LevelIterator(const LevelIterator< typename std::remove_const< C >::type,\n+typename std::remove_const< T1 >::type > &other)\n+Copy constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bd_\bd_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd\n+void addRedistributed(std::shared_ptr< T1 > t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:201\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+T1 & dereference() const\n+Dereference the iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:166\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n+bool equals(const LevelIterator< typename std::remove_const< C >::type,\n+typename std::remove_const< T1 >::type > &other) const\n+Equality check.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd\n+bool isRedistributed() const\n+Check whether there was a redistribution at the current level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:187\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\be_\bq_\bu_\ba_\bl_\bs\n+bool equals(const LevelIterator< const typename std::remove_const< C >::type,\n+const typename std::remove_const< T1 >::type > &other) const\n+Equality check.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:159\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n+void increment()\n+Move to the next coarser level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:172\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+LevelIterator(const LevelIterator< const typename std::remove_const< C >::type,\n+const typename std::remove_const< T1 >::type > &other)\n+Copy constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bl_\be_\bt_\be_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd\n+void deleteRedistributed()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:206\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n+void decrement()\n+Move to the next fine level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:178\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+LevelIterator(std::shared_ptr< Element > element)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:131\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd\n+T1 & getRedistributed() const\n+Get the redistributed container.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:196\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00164.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00164.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: bdmatrix.hh File Reference\n+dune-istl: transfer.hh File Reference\n \n \n \n \n \n \n \n@@ -65,51 +65,55 @@\n \n \n \n \n \n \n \n
    \n \n-
    bdmatrix.hh File Reference
    \n+ \n
    \n
    \n \n-

    Implementation of the BDMatrix class. \n+

    Prolongation and restriction for amg. \n More...

    \n-
    #include <memory>
    \n-#include <dune/common/rangeutilities.hh>
    \n-#include <dune/common/scalarmatrixview.hh>
    \n-#include <dune/istl/bcrsmatrix.hh>
    \n-#include <dune/istl/blocklevel.hh>
    \n+
    #include <dune/istl/bvector.hh>
    \n+#include <dune/istl/matrixredistribute.hh>
    \n+#include <dune/istl/paamg/pinfo.hh>
    \n+#include <dune/istl/owneroverlapcopy.hh>
    \n+#include <dune/istl/paamg/aggregates.hh>
    \n+#include <dune/common/exceptions.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n+\n+\n+\n \n

    \n Classes

    class  Dune::BDMatrix< B, A >
     A block-diagonal matrix. More...
    class  Dune::Amg::Transfer< V1, V2, T >
     
    struct  Dune::FieldTraits< BDMatrix< B, A > >
    class  Dune::Amg::Transfer< V, V1, SequentialInformation >
     
    class  Dune::Amg::Transfer< V, V1, OwnerOverlapCopyCommunication< T1, T2 > >
     
    \n \n \n \n+\n+\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n

    Detailed Description

    \n-

    Implementation of the BDMatrix class.

    \n-
    Author
    Oliver Sander
    \n+

    Prolongation and restriction for amg.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,30 +1,37 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n+ * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-bdmatrix.hh File Reference\n-Implementation of the BDMatrix class. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+transfer.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Prolongation and restriction for amg. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n-\u00a0 A block-diagonal matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b1_\b,_\b _\bV_\b2_\b,_\b _\bT_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Implementation of the BDMatrix class.\n+Prolongation and restriction for amg.\n Author\n- Oliver Sander\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00164_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00164_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: bdmatrix.hh Source File\n+dune-istl: transfer.hh Source File\n \n \n \n \n \n \n \n@@ -70,189 +70,250 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    bdmatrix.hh
    \n+
    transfer.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_BDMATRIX_HH
    \n-
    6#define DUNE_ISTL_BDMATRIX_HH
    \n+
    5#ifndef DUNE_AMGTRANSFER_HH
    \n+
    6#define DUNE_AMGTRANSFER_HH
    \n
    7
    \n-
    8#include <memory>
    \n-
    9
    \n-
    10#include <dune/common/rangeutilities.hh>
    \n-
    11#include <dune/common/scalarmatrixview.hh>
    \n-
    12
    \n-\n-\n-
    15
    \n-
    21namespace Dune {
    \n-
    31 template <class B, class A=std::allocator<B> >
    \n-
    \n-
    32 class BDMatrix : public BCRSMatrix<B,A>
    \n-
    33 {
    \n-
    34 public:
    \n-
    35
    \n-
    36 //===== type definitions and constants
    \n+\n+\n+\n+\n+\n+
    13#include <dune/common/exceptions.hh>
    \n+
    14
    \n+
    15namespace Dune
    \n+
    16{
    \n+
    17 namespace Amg
    \n+
    18 {
    \n+
    19
    \n+
    30 template<class V1, class V2, class T>
    \n+
    \n+\n+
    32 {
    \n+
    33
    \n+
    34 public:
    \n+
    35 typedef V1 Vertex;
    \n+
    36 typedef V2 Vector;
    \n
    37
    \n-
    39 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n-
    40
    \n-
    42 typedef B block_type;
    \n-
    43
    \n-
    45 typedef A allocator_type;
    \n-
    46
    \n-
    48 //typedef BCRSMatrix<B,A>::row_type row_type;
    \n+
    38 template<typename T1, typename R>
    \n+
    39 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n+
    40 Vector& fineRedist,T1 damp, R& redistributor=R());
    \n+
    41
    \n+
    42 template<typename T1, typename R>
    \n+
    43 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n+
    44 T1 damp);
    \n+
    45
    \n+
    46 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
    \n+
    47 T& comm);
    \n+
    48 };
    \n+
    \n
    49
    \n-
    51 typedef typename A::size_type size_type;
    \n-
    52
    \n-
    54 BDMatrix() : BCRSMatrix<B,A>() {}
    \n-
    55
    \n-
    \n-
    56 explicit BDMatrix(int size)
    \n-
    57 : BCRSMatrix<B,A>(size, size, BCRSMatrix<B,A>::random) {
    \n-
    58
    \n-
    59 for (int i=0; i<size; i++)
    \n-\n-
    61
    \n-\n-
    63
    \n-
    64 for (int i=0; i<size; i++)
    \n-
    65 this->BCRSMatrix<B,A>::addindex(i, i);
    \n+
    50 template<class V,class V1>
    \n+
    \n+\n+
    52 {
    \n+
    53 public:
    \n+
    54 typedef V Vertex;
    \n+
    55 typedef V1 Vector;
    \n+\n+
    57 template<typename T1>
    \n+
    58 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n+
    59 Vector& fineRedist, T1 damp,
    \n+\n+
    61 const Redist& redist=Redist());
    \n+
    62 template<typename T1>
    \n+
    63 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n+
    64 T1 damp,
    \n+\n
    66
    \n-\n-
    68
    \n-
    69 }
    \n-
    \n-
    70
    \n-
    \n-
    72 BDMatrix (std::initializer_list<B> const &list)
    \n-
    73 : BDMatrix(list.size())
    \n-
    74 {
    \n-
    75 size_t i=0;
    \n-
    76 for (auto it = list.begin(); it != list.end(); ++it, ++i)
    \n-
    77 (*this)[i][i] = *it;
    \n-
    78 }
    \n-
    \n-
    79
    \n-
    \n-
    81 void setSize(size_type size)
    \n-
    82 {
    \n-
    83 this->BCRSMatrix<B,A>::setSize(size, // rows
    \n-
    84 size, // columns
    \n-
    85 size); // nonzeros
    \n-
    86
    \n-
    87 for (auto i : range(size))
    \n-\n-
    89
    \n-\n-
    91
    \n-
    92 for (auto i : range(size))
    \n-
    93 this->BCRSMatrix<B,A>::addindex(i, i);
    \n-
    94
    \n-\n-
    96 }
    \n+
    67
    \n+
    68 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
    \n+
    69 const SequentialInformation& comm);
    \n+
    70 };
    \n+
    \n+
    71
    \n+
    72#if HAVE_MPI
    \n+
    73
    \n+
    74 template<class V,class V1, class T1, class T2>
    \n+
    \n+\n+
    76 {
    \n+
    77 public:
    \n+
    78 typedef V Vertex;
    \n+
    79 typedef V1 Vector;
    \n+\n+
    81 template<typename T3>
    \n+
    82 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n+
    83 Vector& fineRedist, T3 damp, OwnerOverlapCopyCommunication<T1,T2>& comm,
    \n+
    84 const Redist& redist);
    \n+
    85 template<typename T3>
    \n+
    86 static void prolongateVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, Vector& fine,
    \n+\n+
    88
    \n+
    89 static void restrictVector(const AggregatesMap<Vertex>& aggregates, Vector& coarse, const Vector& fine,
    \n+\n+
    91 };
    \n
    \n-
    97
    \n-
    \n-
    99 BDMatrix& operator= (const BDMatrix& other) {
    \n-
    100 this->BCRSMatrix<B,A>::operator=(other);
    \n-
    101 return *this;
    \n-
    102 }
    \n-
    \n-
    103
    \n-
    \n-\n-\n-
    107 return *this;
    \n-
    108 }
    \n-
    \n-
    109
    \n-
    115 template <class V>
    \n-
    \n-
    116 void solve (V& x, const V& rhs) const {
    \n-
    117 for (size_type i=0; i<this->N(); i++)
    \n-
    118 {
    \n-
    119 auto&& xv = Impl::asVector(x[i]);
    \n-
    120 auto&& rhsv = Impl::asVector(rhs[i]);
    \n-
    121 Impl::asMatrix((*this)[i][i]).solve(xv,rhsv);
    \n-
    122 }
    \n-
    123 }
    \n-
    \n-
    124
    \n-
    \n-
    126 void invert() {
    \n-
    127 for (size_type i=0; i<this->N(); i++)
    \n-
    128 Impl::asMatrix((*this)[i][i]).invert();
    \n-
    129 }
    \n-
    \n-
    130
    \n-
    131 private:
    \n-
    132
    \n-
    133 // ////////////////////////////////////////////////////////////////////////////
    \n-
    134 // The following methods from the base class should now actually be called
    \n-
    135 // ////////////////////////////////////////////////////////////////////////////
    \n-
    136
    \n-
    137 // createbegin and createend should be in there, too, but I can't get it to compile
    \n-
    138 // BCRSMatrix<B,A>::CreateIterator createbegin () {}
    \n-
    139 // BCRSMatrix<B,A>::CreateIterator createend () {}
    \n-
    140 void setrowsize (size_type i, size_type s) {}
    \n-
    141 void incrementrowsize (size_type i) {}
    \n-
    142 void endrowsizes () {}
    \n-
    143 void addindex (size_type row, size_type col) {}
    \n-
    144 void endindices () {}
    \n-
    145 };
    \n-
    \n-
    146
    \n-
    147 template<typename B, typename A>
    \n-
    \n-
    148 struct FieldTraits< BDMatrix<B, A> >
    \n-
    149 {
    \n-\n-
    151 using real_type = typename FieldTraits<field_type>::real_type;
    \n-
    152 };
    \n-
    \n-
    155} // end namespace Dune
    \n-
    156
    \n-
    157#endif
    \n-
    Helper functions for determining the vector/matrix block level.
    \n-
    Implementation of the BCRSMatrix class.
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n+
    92
    \n+
    93#endif
    \n+
    94
    \n+
    95 template<class V, class V1>
    \n+
    96 template<typename T>
    \n+
    97 inline void
    \n+
    \n+\n+
    99 Vector& coarse, Vector& fine,
    \n+
    100 [[maybe_unused]] Vector& fineRedist,
    \n+
    101 T damp,
    \n+
    102 [[maybe_unused]] const SequentialInformation& comm,
    \n+
    103 [[maybe_unused]] const Redist& redist)
    \n+
    104 {
    \n+
    105 prolongateVector(aggregates, coarse, fine, damp);
    \n+
    106 }
    \n+
    \n+
    107 template<class V, class V1>
    \n+
    108 template<typename T>
    \n+
    109 inline void
    \n+
    \n+\n+
    111 Vector& coarse, Vector& fine,
    \n+
    112 T damp,
    \n+
    113 [[maybe_unused]] const SequentialInformation& comm)
    \n+
    114 {
    \n+
    115 typedef typename Vector::iterator Iterator;
    \n+
    116
    \n+
    117 Iterator end = coarse.end();
    \n+
    118 Iterator begin= coarse.begin();
    \n+
    119 for(; begin!=end; ++begin)
    \n+
    120 *begin*=damp;
    \n+
    121 end=fine.end();
    \n+
    122 begin=fine.begin();
    \n+
    123
    \n+
    124 for(Iterator block=begin; block != end; ++block) {
    \n+
    125 std::ptrdiff_t index=block-begin;
    \n+
    126 const Vertex& vertex = aggregates[index];
    \n+\n+
    128 *block += coarse[aggregates[index]];
    \n+
    129 }
    \n+
    130 }
    \n+
    \n+
    131
    \n+
    132 template<class V, class V1>
    \n+
    133 inline void
    \n+
    \n+\n+
    135 Vector& coarse,
    \n+
    136 const Vector& fine,
    \n+
    137 [[maybe_unused]] const SequentialInformation& comm)
    \n+
    138 {
    \n+
    139 // Set coarse vector to zero
    \n+
    140 coarse=0;
    \n+
    141
    \n+
    142 typedef typename Vector::const_iterator Iterator;
    \n+
    143 Iterator end = fine.end();
    \n+
    144 Iterator begin=fine.begin();
    \n+
    145
    \n+
    146 for(Iterator block=begin; block != end; ++block) {
    \n+
    147 const Vertex& vertex = aggregates[block-begin];
    \n+\n+
    149 coarse[vertex] += *block;
    \n+
    150 }
    \n+
    151 }
    \n+
    \n+
    152
    \n+
    153#if HAVE_MPI
    \n+
    154 template<class V, class V1, class T1, class T2>
    \n+
    155 template<typename T3>
    \n+
    \n+
    156 inline void Transfer<V,V1,OwnerOverlapCopyCommunication<T1,T2> >::prolongateVector(const AggregatesMap<Vertex>& aggregates,
    \n+
    157 Vector& coarse, Vector& fine,
    \n+
    158 Vector& fineRedist, T3 damp,
    \n+\n+
    160 const Redist& redist)
    \n+
    161 {
    \n+
    162 if(fineRedist.size()>0)
    \n+
    163 // we operated on the coarse level
    \n+
    164 Transfer<V,V1,SequentialInformation>::prolongateVector(aggregates, coarse, fineRedist, damp);
    \n+
    165
    \n+
    166 // TODO This could be accomplished with one communication, too!
    \n+
    167 redist.redistributeBackward(fine, fineRedist);
    \n+
    168 comm.copyOwnerToAll(fine,fine);
    \n+
    169 }
    \n+
    \n+
    170
    \n+
    171 template<class V, class V1, class T1, class T2>
    \n+
    172 template<typename T3>
    \n+
    \n+\n+
    174 const AggregatesMap<Vertex>& aggregates,
    \n+
    175 Vector& coarse, Vector& fine, T3 damp,
    \n+
    176 [[maybe_unused]] OwnerOverlapCopyCommunication<T1,T2>& comm)
    \n+
    177 {
    \n+
    178 Transfer<V,V1,SequentialInformation>::prolongateVector(aggregates, coarse, fine, damp);
    \n+
    179 }
    \n+
    \n+
    180 template<class V, class V1, class T1, class T2>
    \n+
    \n+
    181 inline void Transfer<V,V1,OwnerOverlapCopyCommunication<T1,T2> >::restrictVector(const AggregatesMap<Vertex>& aggregates,
    \n+
    182 Vector& coarse, const Vector& fine,
    \n+\n+
    184 {
    \n+\n+
    186 // We need this here to avoid it in the smoothers on the coarse level.
    \n+
    187 // There (in the preconditioner d is const.
    \n+
    188 comm.project(coarse);
    \n+
    189 }
    \n+
    \n+
    190#endif
    \n+
    192 } // namspace Amg
    \n+
    193} // namspace Dune
    \n+
    194#endif
    \n+
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+
    Functionality for redistributing a sparse matrix.
    \n+
    Provides classes for the Coloring process of AMG.
    \n+\n+
    const_iterator end() const
    Definition aggregates.hh:730
    \n
    Definition allocator.hh:11
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    void endrowsizes()
    indicate that size of all rows is defined
    Definition bcrsmatrix.hh:1146
    \n-
    @ random
    Build entries randomly.
    Definition bcrsmatrix.hh:526
    \n-
    void endindices()
    indicate that all indices are defined, check consistency
    Definition bcrsmatrix.hh:1269
    \n-
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n-
    void setSize(size_type rows, size_type columns, size_type nnz=0)
    Set the size of the matrix.
    Definition bcrsmatrix.hh:858
    \n-
    BCRSMatrix & operator=(const BCRSMatrix &Mat)
    assignment
    Definition bcrsmatrix.hh:908
    \n-
    A block-diagonal matrix.
    Definition bdmatrix.hh:33
    \n-
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bdmatrix.hh:39
    \n-
    A::size_type size_type
    implement row_type with compressed vector
    Definition bdmatrix.hh:51
    \n-
    BDMatrix()
    Default constructor.
    Definition bdmatrix.hh:54
    \n-
    BDMatrix(std::initializer_list< B > const &list)
    Construct from a std::initializer_list.
    Definition bdmatrix.hh:72
    \n-
    B block_type
    export the type representing the components
    Definition bdmatrix.hh:42
    \n-
    void solve(V &x, const V &rhs) const
    Solve the system Ax=b in O(n) time.
    Definition bdmatrix.hh:116
    \n-
    A allocator_type
    export the allocator type
    Definition bdmatrix.hh:45
    \n-
    BDMatrix(int size)
    Definition bdmatrix.hh:56
    \n-
    BDMatrix & operator=(const BDMatrix &other)
    assignment
    Definition bdmatrix.hh:99
    \n-
    void setSize(size_type size)
    Resize the matrix. Invalidates the content!
    Definition bdmatrix.hh:81
    \n-
    void invert()
    Inverts the matrix.
    Definition bdmatrix.hh:126
    \n-
    typename BDMatrix< B, A >::field_type field_type
    Definition bdmatrix.hh:150
    \n-
    typename FieldTraits< field_type >::real_type real_type
    Definition bdmatrix.hh:151
    \n+
    Definition matrixredistribute.hh:22
    \n+
    void redistributeBackward(D &from, const D &to) const
    Definition matrixredistribute.hh:32
    \n+
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n+
    void project(T1 &x) const
    Set vector to zero at copy dofs.
    Definition owneroverlapcopy.hh:538
    \n+
    void copyOwnerToAll(const T &source, T &dest) const
    Communicate values from owner data points to all other data points.
    Definition owneroverlapcopy.hh:311
    \n+
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n+
    Definition pinfo.hh:28
    \n+
    Definition transfer.hh:32
    \n+
    static void restrictVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, const Vector &fine, T &comm)
    \n+
    static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, T1 damp)
    \n+
    static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, Vector &fineRedist, T1 damp, R &redistributor=R())
    \n+
    V1 Vertex
    Definition transfer.hh:35
    \n+
    V2 Vector
    Definition transfer.hh:36
    \n+
    RedistributeInformation< SequentialInformation > Redist
    Definition transfer.hh:56
    \n+\n+\n+
    static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, Vector &fineRedist, T1 damp, const SequentialInformation &comm=SequentialInformation(), const Redist &redist=Redist())
    \n+
    static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector &coarse, Vector &fine, T1 damp, const SequentialInformation &comm=SequentialInformation())
    \n+\n+
    RedistributeInformation< OwnerOverlapCopyCommunication< T1, T2 > > Redist
    Definition transfer.hh:80
    \n+\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,227 +1,294 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-bdmatrix.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+transfer.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_BDMATRIX_HH\n-6#define DUNE_ISTL_BDMATRIX_HH\n+5#ifndef DUNE_AMGTRANSFER_HH\n+6#define DUNE_AMGTRANSFER_HH\n 7\n-8#include \n-9\n-10#include \n-11#include \n-12\n-13#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n-15\n-21namespace _\bD_\bu_\bn_\be {\n-31 template >\n-_\b3_\b2 class _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx : public _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-33 {\n+8#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+9#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh>\n+10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh>\n+11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n+12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n+13#include \n+14\n+15namespace _\bD_\bu_\bn_\be\n+16{\n+17 namespace Amg\n+18 {\n+19\n+30 template\n+_\b3_\b1 class _\bT_\br_\ba_\bn_\bs_\bf_\be_\br\n+32 {\n+33\n 34 public:\n-35\n-36 //===== type definitions and constants\n+_\b3_\b5 typedef V1 _\bV_\be_\br_\bt_\be_\bx;\n+_\b3_\b6 typedef V2 _\bV_\be_\bc_\bt_\bo_\br;\n 37\n-_\b3_\b9 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n-40\n-_\b4_\b2 typedef B _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-43\n-_\b4_\b5 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n-46\n-48 //typedef BCRSMatrix::row_type row_type;\n+38 template\n+_\b3_\b9 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n+40 _\bV_\be_\bc_\bt_\bo_\br& fineRedist,T1 damp, R& redistributor=R());\n+41\n+42 template\n+_\b4_\b3 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n+44 T1 damp);\n+45\n+_\b4_\b6 static void _\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, _\bV_\be_\bc_\bt_\bo_\br&\n+coarse, const _\bV_\be_\bc_\bt_\bo_\br& fine,\n+47 T& comm);\n+48 };\n 49\n-_\b5_\b1 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-52\n-_\b5_\b4 _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx() : _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx() {}\n-55\n-_\b5_\b6 explicit _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx(int size)\n-57 : _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx(size, size, _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx::_\br_\ba_\bn_\bd_\bo_\bm) {\n-58\n-59 for (int i=0; i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be(i, 1);\n-61\n-62 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs();\n-63\n-64 for (int i=0; i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i);\n+50 template\n+_\b5_\b1 class _\bT_\br_\ba_\bn_\bs_\bf_\be_\br\n+52 {\n+53 public:\n+_\b5_\b4 typedef V _\bV_\be_\br_\bt_\be_\bx;\n+_\b5_\b5 typedef V1 _\bV_\be_\bc_\bt_\bo_\br;\n+_\b5_\b6 typedef _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b> _\bR_\be_\bd_\bi_\bs_\bt;\n+57 template\n+_\b5_\b8 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n+59 _\bV_\be_\bc_\bt_\bo_\br& fineRedist, T1 damp,\n+60 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm=_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(),\n+61 const _\bR_\be_\bd_\bi_\bs_\bt& redist=_\bR_\be_\bd_\bi_\bs_\bt());\n+62 template\n+_\b6_\b3 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n+64 T1 damp,\n+65 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm=_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n 66\n-67 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs();\n-68\n-69 }\n-70\n-_\b7_\b2 _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx (std::initializer_list const &list)\n-73 : _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx(list.size())\n-74 {\n-75 size_t i=0;\n-76 for (auto it = list.begin(); it != list.end(); ++it, ++i)\n-77 (*this)[i][i] = *it;\n-78 }\n-79\n-_\b8_\b1 void _\bs_\be_\bt_\bS_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size)\n-82 {\n-83 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be(size, // rows\n-84 size, // columns\n-85 size); // nonzeros\n-86\n-87 for (auto i : range(size))\n-88 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be(i, 1);\n-89\n-90 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs();\n-91\n-92 for (auto i : range(size))\n-93 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i);\n+67\n+68 static void _\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, _\bV_\be_\bc_\bt_\bo_\br&\n+coarse, const _\bV_\be_\bc_\bt_\bo_\br& fine,\n+69 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm);\n+70 };\n+71\n+72#if HAVE_MPI\n+73\n+74 template\n+_\b7_\b5 class _\bT_\br_\ba_\bn_\bs_\bf_\be_\br >\n+76 {\n+77 public:\n+_\b7_\b8 typedef V _\bV_\be_\br_\bt_\be_\bx;\n+_\b7_\b9 typedef V1 _\bV_\be_\bc_\bt_\bo_\br;\n+_\b8_\b0 typedef _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b> >\n+_\bR_\be_\bd_\bi_\bs_\bt;\n+81 template\n+82 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n+83 _\bV_\be_\bc_\bt_\bo_\br& fineRedist, T3 damp, _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm,\n+84 const _\bR_\be_\bd_\bi_\bs_\bt& redist);\n+85 template\n+86 static void _\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+_\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n+87 T3 damp, _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm);\n+88\n+89 static void _\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, _\bV_\be_\bc_\bt_\bo_\br&\n+coarse, const _\bV_\be_\bc_\bt_\bo_\br& fine,\n+90 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm);\n+91 };\n+92\n+93#endif\n 94\n-95 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs();\n-96 }\n-97\n-_\b9_\b9 _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx& other) {\n-100 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(other);\n-101 return *this;\n-102 }\n-103\n-_\b1_\b0_\b5 _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k) {\n-106 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(k);\n-107 return *this;\n-108 }\n-109\n-115 template \n-_\b1_\b1_\b6 void _\bs_\bo_\bl_\bv_\be (V& x, const V& rhs) const {\n-117 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i_\bN(); i++)\n-118 {\n-119 auto&& xv = Impl::asVector(x[i]);\n-120 auto&& rhsv = Impl::asVector(rhs[i]);\n-121 Impl::asMatrix((*this)[i][i]).solve(xv,rhsv);\n-122 }\n-123 }\n-124\n-_\b1_\b2_\b6 void _\bi_\bn_\bv_\be_\br_\bt() {\n-127 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i_\bN(); i++)\n-128 Impl::asMatrix((*this)[i][i])._\bi_\bn_\bv_\be_\br_\bt();\n+95 template\n+96 template\n+97 inline void\n+_\b9_\b8 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+99 _\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n+100 [[maybe_unused]] _\bV_\be_\bc_\bt_\bo_\br& fineRedist,\n+101 T damp,\n+102 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm,\n+103 [[maybe_unused]] const _\bR_\be_\bd_\bi_\bs_\bt& redist)\n+104 {\n+105 prolongateVector(aggregates, coarse, fine, damp);\n+106 }\n+107 template\n+108 template\n+109 inline void\n+_\b1_\b1_\b0 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+111 _\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n+112 T damp,\n+113 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm)\n+114 {\n+115 typedef typename Vector::iterator Iterator;\n+116\n+117 Iterator end = coarse.end();\n+118 Iterator begin= coarse.begin();\n+119 for(; begin!=end; ++begin)\n+120 *begin*=damp;\n+121 end=fine.end();\n+122 begin=fine.begin();\n+123\n+124 for(Iterator block=begin; block != end; ++block) {\n+125 std::ptrdiff_t index=block-begin;\n+126 const _\bV_\be_\br_\bt_\be_\bx& vertex = aggregates[index];\n+127 if(vertex != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n+128 *block += coarse[aggregates[index]];\n 129 }\n-130\n-131 private:\n-132\n-133 // ////////////////////////////////////////////////////////////////////////\n-////\n-134 // The following methods from the base class should now actually be called\n-135 // ////////////////////////////////////////////////////////////////////////\n-////\n-136\n-137 // createbegin and createend should be in there, too, but I can't get it to\n-compile\n-138 // BCRSMatrix::CreateIterator createbegin () {}\n-139 // BCRSMatrix::CreateIterator createend () {}\n-140 void setrowsize (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s) {}\n-141 void incrementrowsize (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) {}\n-142 void endrowsizes () {}\n-143 void addindex (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl) {}\n-144 void endindices () {}\n-145 };\n-146\n-147 template\n-_\b1_\b4_\b8 struct FieldTraits< _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx >\n-149 {\n-_\b1_\b5_\b0 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\b _\bA_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b1_\b5_\b1 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename FieldTraits::real_type;\n-152 };\n-155} // end namespace Dune\n-156\n-157#endif\n-_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n-Helper functions for determining the vector/matrix block level.\n-_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implementation of the BCRSMatrix class.\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+130 }\n+131\n+132 template\n+133 inline void\n+_\b1_\b3_\b4 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+135 _\bV_\be_\bc_\bt_\bo_\br& coarse,\n+136 const _\bV_\be_\bc_\bt_\bo_\br& fine,\n+137 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& comm)\n+138 {\n+139 // Set coarse vector to zero\n+140 coarse=0;\n+141\n+142 typedef typename Vector::const_iterator Iterator;\n+143 Iterator end = fine._\be_\bn_\bd();\n+144 Iterator begin=fine.begin();\n+145\n+146 for(Iterator block=begin; block != end; ++block) {\n+147 const _\bV_\be_\br_\bt_\be_\bx& vertex = aggregates[block-begin];\n+148 if(vertex != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n+149 coarse[vertex] += *block;\n+150 }\n+151 }\n+152\n+153#if HAVE_MPI\n+154 template\n+155 template\n+_\b1_\b5_\b6 inline void _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b> >::\n+prolongateVector(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+157 _\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine,\n+158 _\bV_\be_\bc_\bt_\bo_\br& fineRedist, T3 damp,\n+159 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm,\n+160 const _\bR_\be_\bd_\bi_\bs_\bt& redist)\n+161 {\n+162 if(fineRedist.size()>0)\n+163 // we operated on the coarse level\n+164 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(aggregates, coarse,\n+fineRedist, damp);\n+165\n+166 // TODO This could be accomplished with one communication, too!\n+167 redist._\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd(fine, fineRedist);\n+168 comm._\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl(fine,fine);\n+169 }\n+170\n+171 template\n+172 template\n+_\b1_\b7_\b3 inline void _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b> >::\n+prolongateVector(\n+174 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+175 _\bV_\be_\bc_\bt_\bo_\br& coarse, _\bV_\be_\bc_\bt_\bo_\br& fine, T3 damp,\n+176 [[maybe_unused]] _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm)\n+177 {\n+178 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(aggregates, coarse,\n+fine, damp);\n+179 }\n+180 template\n+_\b1_\b8_\b1 inline void _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b> >::\n+restrictVector(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+182 _\bV_\be_\bc_\bt_\bo_\br& coarse, const _\bV_\be_\bc_\bt_\bo_\br& fine,\n+183 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b>& comm)\n+184 {\n+185 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bV_\b,_\bV_\b1_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(aggregates, coarse,\n+fine, _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n+186 // We need this here to avoid it in the smoothers on the coarse level.\n+187 // There (in the preconditioner d is const.\n+188 comm._\bp_\br_\bo_\bj_\be_\bc_\bt(coarse);\n+189 }\n+190#endif\n+192 } // namspace Amg\n+193} // namspace Dune\n+194#endif\n+_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n+Classes providing communication interfaces for overlapping Schwarz methods.\n+_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+This file implements a vector space as a tensor product of a given vector\n+space. The number of compon...\n+_\bm_\ba_\bt_\br_\bi_\bx_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\b._\bh_\bh\n+Functionality for redistributing a sparse matrix.\n+_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n+Provides classes for the Coloring process of AMG.\n+_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n+const_iterator end() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:730\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs\n-void endrowsizes()\n-indicate that size of all rows is defined\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1146\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\ba_\bn_\bd_\bo_\bm\n-@ random\n-Build entries randomly.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:526\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs\n-void endindices()\n-indicate that all indices are defined, check consistency\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-size_type N() const\n-number of rows (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n-void setSize(size_type rows, size_type columns, size_type nnz=0)\n-Set the size of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:858\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-BCRSMatrix & operator=(const BCRSMatrix &Mat)\n-assignment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:908\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx\n-A block-diagonal matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< B >::field_type field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:39\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-implement row_type with compressed vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx\n-BDMatrix()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx\n-BDMatrix(std::initializer_list< B > const &list)\n-Construct from a std::initializer_list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-B block_type\n-export the type representing the components\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bo_\bl_\bv_\be\n-void solve(V &x, const V &rhs) const\n-Solve the system Ax=b in O(n) time.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n-A allocator_type\n-export the allocator type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:45\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx\n-BDMatrix(int size)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-BDMatrix & operator=(const BDMatrix &other)\n-assignment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:99\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n-void setSize(size_type size)\n-Resize the matrix. Invalidates the content!\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt\n-void invert()\n-Inverts the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename BDMatrix< B, A >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-typename FieldTraits< field_type >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bdmatrix.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd\n+void redistributeBackward(D &from, const D &to) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+A class setting up standard communication for a two-valued attribute set with\n+owner/overlap/copy sema...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bj_\be_\bc_\bt\n+void project(T1 &x) const\n+Set vector to zero at copy dofs.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:538\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl\n+void copyOwnerToAll(const T &source, T &dest) const\n+Communicate values from owner data points to all other data points.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:311\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+Class providing information about the mapping of the vertices onto aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b:_\b:_\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br\n+static void restrictVector(const AggregatesMap< Vertex > &aggregates, Vector\n+&coarse, const Vector &fine, T &comm)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br\n+static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector\n+&coarse, Vector &fine, T1 damp)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br\n+static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector\n+&coarse, Vector &fine, Vector &fineRedist, T1 damp, R &redistributor=R())\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+V1 Vertex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b:_\b:_\bV_\be_\bc_\bt_\bo_\br\n+V2 Vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt\n+RedistributeInformation< SequentialInformation > Redist\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+V Vertex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bV_\be_\bc_\bt_\bo_\br\n+V1 Vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br\n+static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector\n+&coarse, Vector &fine, Vector &fineRedist, T1 damp, const SequentialInformation\n+&comm=SequentialInformation(), const Redist &redist=Redist())\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br\n+static void prolongateVector(const AggregatesMap< Vertex > &aggregates, Vector\n+&coarse, Vector &fine, T1 damp, const SequentialInformation\n+&comm=SequentialInformation())\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+V Vertex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt\n+RedistributeInformation< OwnerOverlapCopyCommunication< T1, T2 > > Redist\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\b _\bV_\b,_\b _\bV_\b1_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>_\b:_\b:_\bV_\be_\bc_\bt_\bo_\br\n+V1 Vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:79\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00167.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00167.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: counter.hh File Reference\n+dune-istl: construction.hh File Reference\n \n \n \n \n \n \n \n@@ -65,125 +65,68 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    counter.hh File Reference
    \n+Classes |\n+Namespaces
    \n+ \n \n
    \n-
    #include <cassert>
    \n-#include <typeinfo>
    \n-#include <iostream>
    \n-#include <memory>
    \n-#include <tuple>
    \n-#include <utility>
    \n-#include <dune/common/typeutilities.hh>
    \n+\n+

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

    \n+\n

    Go to the source code of this file.

    \n \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+Classes

    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::ConstructionTraits< SequentialInformation >
     
    struct  Dune::Amg::ConstructionTraits< OwnerOverlapCopyCommunication< T1, T2 > >
     
    \n \n \n \n-\n+\n \n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::CounterImpl
    namespace  Dune::Amg
     
    \n-\n-\n-\n-\n-\n-

    \n-Macros

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

    \n-Variables

    constexpr std::size_t maxcount = 100
     
    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_GET_COUNTER

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

    ◆ DUNE_INC_COUNTER

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

    Variable Documentation

    \n-\n-

    ◆ maxcount

    \n-\n-
    \n-
    \n-\n- \n- \n- \n- \n
    \n- \n- \n- \n- \n-
    constexpr std::size_t maxcount = 100
    \n-
    \n-constexpr
    \n-
    \n-\n-
    \n-
    \n-
    \n+

    Detailed Description

    \n+

    Helper classes for the construction of classes without empty constructor.

    \n+
    Author
    Markus Blatt
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,56 +1,54 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n-counter.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+construction.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Helper classes for the construction of classes without empty constructor.\n+_\bM_\bo_\br_\be_\b._\b._\b.\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh>\n+#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b<_\b _\bM_\b,_\b _\bC_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC\n+ _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,\n+ _\bC_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n+ _\b>\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\bI_\bm_\bp_\bl\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n-M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR(Tag)\u00a0\u00a0\u00a0 (counterFunc(Dune::PriorityTag<_\bm_\ba_\bx_\bc_\bo_\bu_\bn_\bt>{},\n- Tag{}, Dune::CounterImpl::ADLTag{}))\n-\u00a0\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bI_\bN_\bC_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR(Tag)\n-\u00a0\n-V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n-constexpr std::size_t\u00a0 _\bm_\ba_\bx_\bc_\bo_\bu_\bn_\bt = 100\n-\u00a0\n-*\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_G\bGE\bET\bT_\b_C\bCO\bOU\bUN\bNT\bTE\bER\bR *\b**\b**\b**\b**\b*\n-#define DUNE_GET_COUNTER ( \u00a0 Tag ) \u00a0\u00a0\u00a0 (counterFunc(Dune::PriorityTag<_\bm_\ba_\bx_\bc_\bo_\bu_\bn_\bt>\n- {}, Tag{}, Dune::CounterImpl::ADLTag{}))\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_I\bIN\bNC\bC_\b_C\bCO\bOU\bUN\bNT\bTE\bER\bR *\b**\b**\b**\b**\b*\n-#define DUNE_INC_COUNTER ( \u00a0 Tag )\n-V\bVa\bal\blu\bue\be:\b:\n-namespace { \\\n-namespace CounterImpl { \\\n-constexpr std::size_t \\\n-counterFunc(Dune::PriorityTag<_\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR(Tag)+1> p, Tag, ADLTag) \\\n-{ \\\n-return p.value; \\\n-} \\\n-} \\\n-} \\\n-static_assert(true, \"unfudge indentation\")\n-_\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR\n-#define DUNE_GET_COUNTER(Tag)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn counter.hh:17\n-*\b**\b**\b**\b**\b* V\bVa\bar\bri\bia\bab\bbl\ble\be D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0m\bma\bax\bxc\bco\bou\bun\bnt\bt *\b**\b**\b**\b**\b*\n-constexpr std::size_t maxcount = 100 constexpr\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Helper classes for the construction of classes without empty constructor.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00167_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00167_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: counter.hh Source File\n+dune-istl: construction.hh Source File\n \n \n \n \n \n \n \n@@ -70,77 +70,260 @@\n \n \n \n \n \n \n \n
    \n-
    counter.hh
    \n+
    construction.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    3#ifndef DUNE_ISTL_COMMON_COUNTER_HH
    \n-
    4#define DUNE_ISTL_COMMON_COUNTER_HH
    \n-
    5
    \n-
    6#include <cassert>
    \n-
    7#include <typeinfo>
    \n-
    8#include <iostream>
    \n-
    9#include <memory>
    \n-
    10#include <tuple>
    \n-
    11#include <utility>
    \n-
    12
    \n-
    13#include <dune/common/typeutilities.hh>
    \n-
    14
    \n-
    15constexpr std::size_t maxcount = 100;
    \n-
    16
    \n-
    \n-
    17#define DUNE_GET_COUNTER(Tag) \\
    \n-
    18 (counterFunc(Dune::PriorityTag<maxcount>{}, Tag{}, Dune::CounterImpl::ADLTag{}))
    \n-
    \n-
    19
    \n-
    \n-
    20#define DUNE_INC_COUNTER(Tag) \\
    \n-
    21 namespace { \\
    \n-
    22 namespace CounterImpl { \\
    \n-
    23 constexpr std::size_t \\
    \n-
    24 counterFunc(Dune::PriorityTag<DUNE_GET_COUNTER(Tag)+1> p, Tag, ADLTag) \\
    \n-
    25 { \\
    \n-
    26 return p.value; \\
    \n-
    27 } \\
    \n-
    28 } \\
    \n-
    29 } \\
    \n-
    30 static_assert(true, "unfudge indentation")
    \n-
    \n-
    31
    \n-
    32namespace Dune {
    \n-
    33 namespace {
    \n-
    34
    \n-
    \n-
    35 namespace CounterImpl {
    \n-
    36
    \n-
    37 struct ADLTag {};
    \n-
    38
    \n-
    39 template<class Tag>
    \n-
    40 constexpr std::size_t counterFunc(Dune::PriorityTag<0>, Tag, ADLTag)
    \n-
    41 {
    \n-
    42 return 0;
    \n-
    43 }
    \n-
    44
    \n-
    45 } // end namespace CounterImpl
    \n-
    \n-
    46 } // end empty namespace
    \n-
    47} // end namespace Dune
    \n-
    48#endif // DUNE_ISTL_COMMON_COUNTER_HH
    \n-
    constexpr std::size_t maxcount
    Definition counter.hh:15
    \n+
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    4// vi: set et ts=4 sw=2 sts=2:
    \n+
    5#ifndef DUNE_AMGCONSTRUCTION_HH
    \n+
    6#define DUNE_AMGCONSTRUCTION_HH
    \n+
    7
    \n+\n+\n+\n+\n+
    12#include "pinfo.hh"
    \n+
    13
    \n+
    14namespace Dune
    \n+
    15{
    \n+
    16 namespace Amg
    \n+
    17 {
    \n+
    18
    \n+
    37 template<typename T>
    \n+
    38 struct ConstructionTraits
    \n+
    39 {
    \n+
    44 typedef const void* Arguments;
    \n+
    45
    \n+
    \n+
    52 static inline std::shared_ptr<T> construct(Arguments& args)
    \n+
    53 {
    \n+
    54 return std::make_shared<T>();
    \n+
    55 }
    \n+
    \n+
    56 };
    \n+
    57
    \n+
    58 template<class T, class A>
    \n+
    \n+
    59 struct ConstructionTraits<BlockVector<T,A> >
    \n+
    60 {
    \n+
    61 typedef const int Arguments;
    \n+
    \n+
    62 static inline std::shared_ptr<BlockVector<T,A>> construct(Arguments& n)
    \n+
    63 {
    \n+
    64 return std::make_shared<BlockVector<T,A>>(n);
    \n+
    65 }
    \n+
    \n+
    66 };
    \n+
    \n+
    67
    \n+
    68 template<class M, class C>
    \n+
    \n+\n+
    70 {
    \n+
    \n+
    71 ParallelOperatorArgs(std::shared_ptr<M> matrix, const C& comm)
    \n+
    72 : matrix_(matrix), comm_(comm)
    \n+
    73 {}
    \n+
    \n+
    74
    \n+
    75 std::shared_ptr<M> matrix_;
    \n+
    76 const C& comm_;
    \n+
    77 };
    \n+
    \n+
    78
    \n+
    79#if HAVE_MPI
    \n+
    \n+\n+
    81 {
    \n+
    \n+\n+
    83 : comm_(comm), cat_(cat)
    \n+
    84 {}
    \n+
    \n+
    85
    \n+
    86 MPI_Comm comm_;
    \n+\n+
    88 };
    \n+
    \n+
    89#endif
    \n+
    90
    \n+
    \n+\n+
    92 {
    \n+
    \n+
    93 SequentialCommunicationArgs(Communication<void*> comm, [[maybe_unused]] int cat)
    \n+
    94 : comm_(comm)
    \n+
    95 {}
    \n+
    \n+
    96
    \n+
    97 Communication<void*> comm_;
    \n+
    98 };
    \n+
    \n+
    99
    \n+
    100 } // end Amg namspace
    \n+
    101
    \n+
    102 // forward declaration
    \n+
    103 template<class M, class X, class Y, class C>
    \n+\n+
    105
    \n+
    106 template<class M, class X, class Y, class C>
    \n+\n+
    108
    \n+
    109 namespace Amg
    \n+
    110 {
    \n+
    111 template<class M, class X, class Y, class C>
    \n+
    \n+
    112 struct ConstructionTraits<OverlappingSchwarzOperator<M,X,Y,C> >
    \n+
    113 {
    \n+\n+
    115
    \n+
    \n+
    116 static inline std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C>> construct(const Arguments& args)
    \n+
    117 {
    \n+
    118 return std::make_shared<OverlappingSchwarzOperator<M,X,Y,C>>
    \n+
    119 (args.matrix_, args.comm_);
    \n+
    120 }
    \n+
    \n+
    121 };
    \n+
    \n+
    122
    \n+
    123 template<class M, class X, class Y, class C>
    \n+
    \n+
    124 struct ConstructionTraits<NonoverlappingSchwarzOperator<M,X,Y,C> >
    \n+
    125 {
    \n+\n+
    127
    \n+
    \n+
    128 static inline std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C>> construct(const Arguments& args)
    \n+
    129 {
    \n+
    130 return std::make_shared<NonoverlappingSchwarzOperator<M,X,Y,C>>
    \n+
    131 (args.matrix_, args.comm_);
    \n+
    132 }
    \n+
    \n+
    133 };
    \n+
    \n+
    134
    \n+
    135 template<class M, class X, class Y>
    \n+
    \n+\n+
    137 {
    \n+
    \n+
    138 MatrixAdapterArgs(std::shared_ptr<M> matrix, const SequentialInformation)
    \n+
    139 : matrix_(matrix)
    \n+
    140 {}
    \n+
    \n+
    141
    \n+
    142 std::shared_ptr<M> matrix_;
    \n+
    143 };
    \n+
    \n+
    144
    \n+
    145 template<class M, class X, class Y>
    \n+
    \n+
    146 struct ConstructionTraits<MatrixAdapter<M,X,Y> >
    \n+
    147 {
    \n+\n+
    149
    \n+
    \n+
    150 static inline std::shared_ptr<MatrixAdapter<M,X,Y>> construct(Arguments& args)
    \n+
    151 {
    \n+
    152 return std::make_shared<MatrixAdapter<M,X,Y>>(args.matrix_);
    \n+
    153 }
    \n+
    \n+
    154 };
    \n+
    \n+
    155
    \n+
    156 template<>
    \n+
    \n+
    157 struct ConstructionTraits<SequentialInformation>
    \n+
    158 {
    \n+\n+
    \n+
    160 static inline std::shared_ptr<SequentialInformation> construct(Arguments& args)
    \n+
    161 {
    \n+
    162 return std::make_shared<SequentialInformation>(args.comm_);
    \n+
    163 }
    \n+
    \n+
    164 };
    \n+
    \n+
    165
    \n+
    166
    \n+
    167#if HAVE_MPI
    \n+
    168
    \n+
    169 template<class T1, class T2>
    \n+
    \n+
    170 struct ConstructionTraits<OwnerOverlapCopyCommunication<T1,T2> >
    \n+
    171 {
    \n+\n+
    173
    \n+
    \n+
    174 static inline std::shared_ptr<OwnerOverlapCopyCommunication<T1,T2>> construct(Arguments& args)
    \n+
    175 {
    \n+
    176 return std::make_shared<OwnerOverlapCopyCommunication<T1,T2>>(args.comm_, args.cat_);
    \n+
    177 }
    \n+
    \n+
    178 };
    \n+
    \n+
    179
    \n+
    180#endif
    \n+
    181
    \n+
    183 } // namespace Amg
    \n+
    184} // namespace Dune
    \n+
    185#endif
    \n+
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n+\n+
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+\n+
    const int Arguments
    Definition construction.hh:61
    \n+
    SequentialCommunicationArgs(Communication< void * > comm, int cat)
    Definition construction.hh:93
    \n+
    OwnerOverlapCopyCommunicationArgs(MPI_Comm comm, SolverCategory::Category cat)
    Definition construction.hh:82
    \n+
    MPI_Comm comm_
    Definition construction.hh:86
    \n+
    SolverCategory::Category cat_
    Definition construction.hh:87
    \n+
    const C & comm_
    Definition construction.hh:76
    \n+
    ParallelOperatorArgs(std::shared_ptr< M > matrix, const C &comm)
    Definition construction.hh:71
    \n+
    std::shared_ptr< M > matrix_
    Definition construction.hh:75
    \n+
    const void * Arguments
    A type holding all the arguments needed to call the constructor.
    Definition construction.hh:44
    \n+
    static std::shared_ptr< T > construct(Arguments &args)
    Construct an object with the specified arguments.
    Definition construction.hh:52
    \n+
    Communication< void * > comm_
    Definition construction.hh:97
    \n+
    static std::shared_ptr< BlockVector< T, A > > construct(Arguments &n)
    Definition construction.hh:62
    \n
    Definition allocator.hh:11
    \n+
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n+
    A nonoverlapping operator with communication object.
    Definition novlpschwarz.hh:61
    \n+
    Adapter to turn a matrix into a linear operator.
    Definition operators.hh:136
    \n+
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n+
    Definition construction.hh:70
    \n+\n+
    Definition construction.hh:92
    \n+
    An overlapping Schwarz operator.
    Definition schwarz.hh:75
    \n+
    ParallelOperatorArgs< M, C > Arguments
    Definition construction.hh:114
    \n+
    static std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > construct(const Arguments &args)
    Definition construction.hh:116
    \n+
    ParallelOperatorArgs< M, C > Arguments
    Definition construction.hh:126
    \n+
    static std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > construct(const Arguments &args)
    Definition construction.hh:128
    \n+
    Definition construction.hh:137
    \n+
    MatrixAdapterArgs(std::shared_ptr< M > matrix, const SequentialInformation)
    Definition construction.hh:138
    \n+
    std::shared_ptr< M > matrix_
    Definition construction.hh:142
    \n+
    static std::shared_ptr< MatrixAdapter< M, X, Y > > construct(Arguments &args)
    Definition construction.hh:150
    \n+
    const MatrixAdapterArgs< M, X, Y > Arguments
    Definition construction.hh:148
    \n+
    const SequentialCommunicationArgs Arguments
    Definition construction.hh:159
    \n+
    static std::shared_ptr< SequentialInformation > construct(Arguments &args)
    Definition construction.hh:160
    \n+
    static std::shared_ptr< OwnerOverlapCopyCommunication< T1, T2 > > construct(Arguments &args)
    Definition construction.hh:174
    \n+
    const OwnerOverlapCopyCommunicationArgs Arguments
    Definition construction.hh:172
    \n+
    Definition pinfo.hh:28
    \n+
    Category
    Definition solvercategory.hh:23
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,66 +1,300 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bc_\bo_\bm_\bm_\bo_\bn\n-counter.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+construction.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3#ifndef DUNE_ISTL_COMMON_COUNTER_HH\n-4#define DUNE_ISTL_COMMON_COUNTER_HH\n-5\n-6#include \n-7#include \n-8#include \n-9#include \n-10#include \n-11#include \n-12\n-13#include \n-14\n-_\b1_\b5constexpr std::size_t _\bm_\ba_\bx_\bc_\bo_\bu_\bn_\bt = 100;\n-16\n-_\b1_\b7#define DUNE_GET_COUNTER(Tag) \\\n-18 (counterFunc(Dune::PriorityTag{}, Tag{}, Dune::CounterImpl::ADLTag\n-{}))\n-19\n-_\b2_\b0#define DUNE_INC_COUNTER(Tag) \\\n-21 namespace { \\\n-22 namespace CounterImpl { \\\n-23 constexpr std::size_t \\\n-24 counterFunc(Dune::PriorityTag p, Tag, ADLTag) \\\n-25 { \\\n-26 return p.value; \\\n-27 } \\\n-28 } \\\n-29 } \\\n-30 static_assert(true, \"unfudge indentation\")\n-31\n-32namespace _\bD_\bu_\bn_\be {\n-33 namespace {\n-34\n-_\b3_\b5 namespace CounterImpl {\n-36\n-37 struct ADLTag {};\n-38\n-39 template\n-40 constexpr std::size_t counterFunc(Dune::PriorityTag<0>, Tag, ADLTag)\n-41 {\n-42 return 0;\n-43 }\n-44\n-45 } // end namespace CounterImpl\n-46 } // end empty namespace\n-47} // end namespace Dune\n-48#endif // DUNE_ISTL_COMMON_COUNTER_HH\n-_\bm_\ba_\bx_\bc_\bo_\bu_\bn_\bt\n-constexpr std::size_t maxcount\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn counter.hh:15\n+3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+4// vi: set et ts=4 sw=2 sts=2:\n+5#ifndef DUNE_AMGCONSTRUCTION_HH\n+6#define DUNE_AMGCONSTRUCTION_HH\n+7\n+8#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n+9#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n+11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh>\n+12#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n+13\n+14namespace _\bD_\bu_\bn_\be\n+15{\n+16 namespace Amg\n+17 {\n+18\n+37 template\n+38 struct ConstructionTraits\n+39 {\n+_\b4_\b4 typedef const void* _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+45\n+_\b5_\b2 static inline std::shared_ptr _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+53 {\n+54 return std::make_shared();\n+55 }\n+56 };\n+57\n+58 template\n+_\b5_\b9 struct ConstructionTraits<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n+60 {\n+_\b6_\b1 typedef const int _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+_\b6_\b2 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& n)\n+63 {\n+64 return std::make_shared>(n);\n+65 }\n+66 };\n+67\n+68 template\n+_\b6_\b9 struct _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs\n+70 {\n+_\b7_\b1 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs(std::shared_ptr matrix, const C& comm)\n+72 : _\bm_\ba_\bt_\br_\bi_\bx_\b_(matrix), _\bc_\bo_\bm_\bm_\b_(comm)\n+73 {}\n+74\n+_\b7_\b5 std::shared_ptr _\bm_\ba_\bt_\br_\bi_\bx_\b_;\n+_\b7_\b6 const C& _\bc_\bo_\bm_\bm_\b_;\n+77 };\n+78\n+79#if HAVE_MPI\n+_\b8_\b0 struct _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+81 {\n+_\b8_\b2 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs(MPI_Comm comm, _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+cat)\n+83 : _\bc_\bo_\bm_\bm_\b_(comm), _\bc_\ba_\bt_\b_(cat)\n+84 {}\n+85\n+_\b8_\b6 MPI_Comm _\bc_\bo_\bm_\bm_\b_;\n+_\b8_\b7 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\b_;\n+88 };\n+89#endif\n+90\n+_\b9_\b1 struct _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+92 {\n+_\b9_\b3 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs(Communication comm, [[maybe_unused]] int\n+cat)\n+94 : _\bc_\bo_\bm_\bm_\b_(comm)\n+95 {}\n+96\n+_\b9_\b7 Communication _\bc_\bo_\bm_\bm_\b_;\n+98 };\n+99\n+100 } // end Amg namspace\n+101\n+102 // forward declaration\n+103 template\n+104 class _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n+105\n+106 template\n+107 class _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n+108\n+109 namespace Amg\n+110 {\n+111 template\n+_\b1_\b1_\b2 struct ConstructionTraits<_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br >\n+113 {\n+_\b1_\b1_\b4 typedef _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b<_\bM_\b,_\bC_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+115\n+_\b1_\b1_\b6 static inline std::shared_ptr>\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(const _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+117 {\n+118 return std::make_shared>\n+119 (args._\bm_\ba_\bt_\br_\bi_\bx_\b_, args._\bc_\bo_\bm_\bm_\b_);\n+120 }\n+121 };\n+122\n+123 template\n+_\b1_\b2_\b4 struct ConstructionTraits<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br >\n+125 {\n+_\b1_\b2_\b6 typedef _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b<_\bM_\b,_\bC_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+127\n+_\b1_\b2_\b8 static inline std::shared_ptr>\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(const _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+129 {\n+130 return std::make_shared>\n+131 (args._\bm_\ba_\bt_\br_\bi_\bx_\b_, args._\bc_\bo_\bm_\bm_\b_);\n+132 }\n+133 };\n+134\n+135 template\n+_\b1_\b3_\b6 struct _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs\n+137 {\n+_\b1_\b3_\b8 _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs(std::shared_ptr matrix, const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn)\n+139 : _\bm_\ba_\bt_\br_\bi_\bx_\b_(matrix)\n+140 {}\n+141\n+_\b1_\b4_\b2 std::shared_ptr _\bm_\ba_\bt_\br_\bi_\bx_\b_;\n+143 };\n+144\n+145 template\n+_\b1_\b4_\b6 struct ConstructionTraits<_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br >\n+147 {\n+_\b1_\b4_\b8 typedef const _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs_\b<_\bM_\b,_\bX_\b,_\bY_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+149\n+_\b1_\b5_\b0 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs&\n+args)\n+151 {\n+152 return std::make_shared>(args._\bm_\ba_\bt_\br_\bi_\bx_\b_);\n+153 }\n+154 };\n+155\n+156 template<>\n+_\b1_\b5_\b7 struct ConstructionTraits<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn>\n+158 {\n+_\b1_\b5_\b9 typedef const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+_\b1_\b6_\b0 static inline std::shared_ptr _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs&\n+args)\n+161 {\n+162 return std::make_shared(args._\bc_\bo_\bm_\bm_\b_);\n+163 }\n+164 };\n+165\n+166\n+167#if HAVE_MPI\n+168\n+169 template\n+_\b1_\b7_\b0 struct ConstructionTraits<_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn >\n+171 {\n+_\b1_\b7_\b2 typedef const _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+173\n+_\b1_\b7_\b4 static inline std::shared_ptr>\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+175 {\n+176 return std::make_shared>(args._\bc_\bo_\bm_\bm_\b_,\n+args._\bc_\ba_\bt_\b_);\n+177 }\n+178 };\n+179\n+180#endif\n+181\n+183 } // namespace Amg\n+184} // namespace Dune\n+185#endif\n+_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n+Classes providing communication interfaces for overlapping Schwarz methods.\n+_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n+_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n+Define general, extensible interface for operators. The available\n+implementation wraps a matrix.\n+_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+This file implements a vector space as a tensor product of a given vector\n+space. The number of compon...\n+_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+const int Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+SequentialCommunicationArgs(Communication< void * > comm, int cat)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:93\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+OwnerOverlapCopyCommunicationArgs(MPI_Comm comm, SolverCategory::Category cat)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bc_\bo_\bm_\bm_\b_\n+MPI_Comm comm_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:86\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bc_\ba_\bt_\b_\n+SolverCategory::Category cat_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b:_\b:_\bc_\bo_\bm_\bm_\b_\n+const C & comm_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs\n+ParallelOperatorArgs(std::shared_ptr< M > matrix, const C &comm)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n+std::shared_ptr< M > matrix_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+const void * Arguments\n+A type holding all the arguments needed to call the constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< T > construct(Arguments &args)\n+Construct an object with the specified arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bc_\bo_\bm_\bm_\b_\n+Communication< void * > comm_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:97\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< BlockVector< T, A > > construct(Arguments &n)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:62\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A vector of blocks with memory management.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A nonoverlapping operator with communication object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n+Adapter to turn a matrix into a linear operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+A class setting up standard communication for a two-valued attribute set with\n+owner/overlap/copy sema...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bA_\br_\bg_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:92\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+An overlapping Schwarz operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+ParallelOperatorArgs< M, C > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:114\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< OverlappingSchwarzOperator< M, X, Y, C > > construct\n+(const Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+ParallelOperatorArgs< M, C > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< NonoverlappingSchwarzOperator< M, X, Y, C > > construct\n+(const Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:137\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs\n+MatrixAdapterArgs(std::shared_ptr< M > matrix, const SequentialInformation)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:138\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n+std::shared_ptr< M > matrix_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< MatrixAdapter< M, X, Y > > construct(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+const MatrixAdapterArgs< M, X, Y > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:148\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+const SequentialCommunicationArgs Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:159\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< SequentialInformation > construct(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:160\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>_\b:_\b:\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< OwnerOverlapCopyCommunication< T1, T2 > > construct\n+(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:174\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+const OwnerOverlapCopyCommunicationArgs Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:172\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00170.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00170.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: registry.hh File Reference\n+dune-istl: fastamg.hh File Reference\n \n \n \n \n \n \n \n@@ -65,92 +65,79 @@\n \n \n \n \n \n \n \n
    \n \n-
    registry.hh File Reference
    \n+
    fastamg.hh File Reference
    \n
    \n
    \n-
    #include <cstddef>
    \n-#include <iostream>
    \n-#include <memory>
    \n-#include <string>
    \n-#include <utility>
    \n-#include "counter.hh"
    \n-#include <dune/common/typelist.hh>
    \n-#include <dune/common/hybridutilities.hh>
    \n-#include <dune/common/parameterizedobject.hh>
    \n+\n+

    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. \n+More...

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

    Go to the source code of this file.

    \n \n+\n+\n+\n+\n+

    \n+Classes

    class  Dune::Amg::FastAMG< M, X, PI, A >
     A fast (sequential) algebraic multigrid based on agglomeration that saves memory bandwidth. More...
     
    \n \n \n \n+\n+\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n \n-\n-\n+\n+\n

    \n Macros

    #define DUNE_REGISTRY_PUT(Tag, id, ...)
     
    #define DIRECTSOLVER   SuperLU
     
    \n-

    Macro Definition Documentation

    \n-\n-

    ◆ DUNE_REGISTRY_PUT

    \n+

    Detailed Description

    \n+

    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.

    \n+
    Author
    Markus Blatt
    \n+

    Macro Definition Documentation

    \n+\n+

    ◆ DIRECTSOLVER

    \n \n
    \n
    \n \n \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n- \n+ \n \n
    #define DUNE_REGISTRY_PUT( Tag,
     id,
     ... 
    )#define DIRECTSOLVER   SuperLU
    \n
    \n-Value:
    namespace { \\
    \n-
    template<> \\
    \n-
    struct Registry<Tag, DUNE_GET_COUNTER(Tag)> \\
    \n-
    { \\
    \n-
    static auto getCreator() \\
    \n-
    { \\
    \n-
    return __VA_ARGS__; \\
    \n-
    } \\
    \n-
    static std::string name() { return id; } \\
    \n-
    }; \\
    \n-
    } \\
    \n-
    DUNE_INC_COUNTER(Tag)
    \n-
    #define DUNE_GET_COUNTER(Tag)
    Definition counter.hh:17
    \n-
    \n+\n
    \n
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,49 +1,51 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bc_\bo_\bm_\bm_\bo_\bn\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs\n-registry.hh File Reference\n-#include \n-#include \n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bM_\ba_\bc_\br_\bo_\bs\n+fastamg.hh File Reference\n+A fast AMG method, that currently only allows only Gauss-Seidel smoothing and\n+is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep\n+with the defect calculation to reduce memory transfers. _\bM_\bo_\br_\be_\b._\b._\b.\n #include \n-#include \n-#include \n-#include \"_\bc_\bo_\bu_\bn_\bt_\be_\br_\b._\bh_\bh\"\n-#include \n-#include \n-#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bo_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n+#include \"_\bf_\ba_\bs_\bt_\ba_\bm_\bg_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bP_\bI_\b,_\b _\bA_\b _\b>\n+\u00a0 A fast (sequential) algebraic multigrid based on agglomeration that\n+ saves memory bandwidth. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+\u00a0\n M\bMa\bac\bcr\bro\bos\bs\n-#define\u00a0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bR_\bY_\b__\bP_\bU_\bT(Tag, id, ...)\n+#define\u00a0 _\bD_\bI_\bR_\bE_\bC_\bT_\bS_\bO_\bL_\bV_\bE_\bR\u00a0\u00a0\u00a0SuperLU\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+A fast AMG method, that currently only allows only Gauss-Seidel smoothing and\n+is currently purely sequential. It combines one Gauss-Seidel presmoothing sweep\n+with the defect calculation to reduce memory transfers.\n+ Author\n+ Markus Blatt\n *\b**\b**\b**\b**\b* M\bMa\bac\bcr\bro\bo D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDU\bUN\bNE\bE_\b_R\bRE\bEG\bGI\bIS\bST\bTR\bRY\bY_\b_P\bPU\bUT\bT *\b**\b**\b**\b**\b*\n-#define DUNE_REGISTRY_PUT ( \u00a0 Tag,\n- \u00a0 id,\n- \u00a0 .\b..\b..\b.\u00a0\n- )\n-V\bVa\bal\blu\bue\be:\b:\n-namespace { \\\n-template<> \\\n-struct Registry \\\n-{ \\\n-static auto getCreator() \\\n-{ \\\n-return __VA_ARGS__; \\\n-} \\\n-static std::string name() { return id; } \\\n-}; \\\n-} \\\n-DUNE_INC_COUNTER(Tag)\n-_\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR\n-#define DUNE_GET_COUNTER(Tag)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn counter.hh:17\n+*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0D\bDI\bIR\bRE\bEC\bCT\bTS\bSO\bOL\bLV\bVE\bER\bR *\b**\b**\b**\b**\b*\n+#define DIRECTSOLVER\u00a0\u00a0\u00a0SuperLU\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00170_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00170_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: registry.hh Source File\n+dune-istl: fastamg.hh Source File\n \n \n \n \n \n \n \n@@ -70,106 +70,679 @@\n
    \n \n \n \n \n \n \n
    \n-
    registry.hh
    \n+
    fastamg.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    3#ifndef DUNE_ISTL_COMMON_REGISTRY_HH
    \n-
    4#define DUNE_ISTL_COMMON_REGISTRY_HH
    \n-
    5
    \n-
    6#include <cstddef>
    \n-
    7#include <iostream>
    \n+
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    4// vi: set et ts=4 sw=2 sts=2:
    \n+
    5#ifndef DUNE_ISTL_FASTAMG_HH
    \n+
    6#define DUNE_ISTL_FASTAMG_HH
    \n+
    7
    \n
    8#include <memory>
    \n-
    9#include <string>
    \n-
    10#include <utility>
    \n-
    11
    \n-
    12#include "counter.hh"
    \n-
    13
    \n-
    14#include <dune/common/typelist.hh>
    \n-
    15#include <dune/common/hybridutilities.hh>
    \n-
    16#include <dune/common/parameterizedobject.hh>
    \n-
    17
    \n-
    \n-
    18#define DUNE_REGISTRY_PUT(Tag, id, ...) \\
    \n-
    19 namespace { \\
    \n-
    20 template<> \\
    \n-
    21 struct Registry<Tag, DUNE_GET_COUNTER(Tag)> \\
    \n-
    22 { \\
    \n-
    23 static auto getCreator() \\
    \n-
    24 { \\
    \n-
    25 return __VA_ARGS__; \\
    \n-
    26 } \\
    \n-
    27 static std::string name() { return id; } \\
    \n-
    28 }; \\
    \n-
    29 } \\
    \n-
    30 DUNE_INC_COUNTER(Tag)
    \n-
    \n-
    31
    \n-
    32
    \n-
    33namespace Dune {
    \n-
    34 namespace {
    \n-
    35 template<class Tag, std::size_t index>
    \n-
    36 struct Registry;
    \n-
    37 }
    \n-
    38
    \n-
    39 namespace {
    \n-
    40 template<template<class> class Base, class V, class Tag, typename... Args>
    \n-
    41 auto registryGet(Tag , std::string name, Args... args)
    \n-
    42 {
    \n-
    43 constexpr auto count = DUNE_GET_COUNTER(Tag);
    \n-
    44 std::shared_ptr<Base<V> > result;
    \n-
    45 Dune::Hybrid::forEach(std::make_index_sequence<count>{},
    \n-
    46 [&](auto index) {
    \n-
    47 using Reg = Registry<Tag, index>;
    \n-
    48 if(!result && Reg::name() == name) {
    \n-
    49 result = Reg::getCreator()(Dune::MetaType<V>{}, args...);
    \n-
    50 }
    \n-
    51 });
    \n-
    52 return result;
    \n-
    53 }
    \n-
    54
    \n-
    55 /*
    \n-
    56 Register all creators from the registry in the Parameterizedobjectfactory An
    \n-
    57 object of V is passed in the creator and should be used to determine the
    \n-
    58 template arguments.
    \n-
    59 */
    \n-
    60 template<class V, class Type, class Tag, class... Args>
    \n-
    61 int addRegistryToFactory(Dune::ParameterizedObjectFactory<Type(Args...), std::string>& factory,
    \n-
    62 Tag){
    \n-
    63 constexpr auto count = DUNE_GET_COUNTER(Tag);
    \n-
    64 Dune::Hybrid::forEach(std::make_index_sequence<count>{},
    \n-
    65 [&](auto index) {
    \n-
    66 // we first get the generic lambda
    \n-
    67 // and later specialize it with given parameters.
    \n-
    68 // doing all at once leads to an ICE with g++-6
    \n-
    69 using Reg = Registry<Tag, index>;
    \n-
    70 auto genericcreator = Reg::getCreator();
    \n-
    71 factory.define(Reg::name(), [genericcreator](Args... args){
    \n-
    72 return genericcreator(V{}, args...);
    \n-
    73 });
    \n-
    74 });
    \n-
    75 return count;
    \n-
    76 }
    \n-
    77 } // end anonymous namespace
    \n-
    78} // end namespace Dune
    \n-
    79
    \n-
    80#endif // DUNE_ISTL_COMMON_REGISTRY_HH
    \n-\n-
    #define DUNE_GET_COUNTER(Tag)
    Definition counter.hh:17
    \n+
    9#include <dune/common/exceptions.hh>
    \n+
    10#include <dune/common/typetraits.hh>
    \n+\n+\n+\n+
    14#include <dune/istl/solvers.hh>
    \n+\n+
    16#include <dune/istl/superlu.hh>
    \n+
    17#include <dune/istl/umfpack.hh>
    \n+\n+
    19#include <dune/istl/io.hh>
    \n+\n+
    21
    \n+
    22#include "fastamgsmoother.hh"
    \n+
    23
    \n+
    32namespace Dune
    \n+
    33{
    \n+
    34 namespace Amg
    \n+
    35 {
    \n+
    58 template<class M, class X, class PI=SequentialInformation, class A=std::allocator<X> >
    \n+
    \n+
    59 class FastAMG : public Preconditioner<X,X>
    \n+
    60 {
    \n+
    61 public:
    \n+
    63 typedef M Operator;
    \n+\n+\n+\n+
    75
    \n+
    77 typedef X Domain;
    \n+
    79 typedef X Range;
    \n+\n+
    82
    \n+
    90 FastAMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
    \n+
    91 const Parameters& parms,
    \n+
    92 bool symmetric=true);
    \n+
    93
    \n+
    105 template<class C>
    \n+
    106 FastAMG(std::shared_ptr<const Operator> fineOperator,
    \n+
    107 const C& criterion,
    \n+
    108 const Parameters& parms=Parameters(),
    \n+
    109 bool symmetric=true,
    \n+\n+
    111
    \n+
    124 template<class C>
    \n+
    \n+
    125 FastAMG(const Operator& fineOperator,
    \n+
    126 const C& criterion,
    \n+
    127 const Parameters& parms=Parameters(),
    \n+
    128 bool symmetric=true,
    \n+\n+
    130 : FastAMG(stackobject_to_shared_ptr(fineOperator),
    \n+
    131 criterion, parms, symmetric, pinfo)
    \n+
    132 {}
    \n+
    \n+
    133
    \n+
    137 FastAMG(const FastAMG& amg);
    \n+
    138
    \n+
    140 void pre(Domain& x, Range& b);
    \n+
    141
    \n+
    143 void apply(Domain& v, const Range& d);
    \n+
    144
    \n+
    \n+\n+
    147 {
    \n+\n+
    149 }
    \n+
    \n+
    150
    \n+
    152 void post(Domain& x);
    \n+
    153
    \n+
    158 template<class A1>
    \n+
    159 void getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont);
    \n+
    160
    \n+
    161 std::size_t levels();
    \n+
    162
    \n+
    163 std::size_t maxlevels();
    \n+
    164
    \n+
    \n+\n+
    174 {
    \n+
    175 matrices_->recalculateGalerkin(NegateSet<typename PI::OwnerSet>());
    \n+
    176 }
    \n+
    \n+
    177
    \n+
    182 bool usesDirectCoarseLevelSolver() const;
    \n+
    183
    \n+
    184 private:
    \n+
    191 template<class C>
    \n+
    192 void createHierarchies(C& criterion,
    \n+
    193 std::shared_ptr<const Operator> fineOperator,
    \n+
    194 const PI& pinfo);
    \n+
    195
    \n+
    202 struct LevelContext
    \n+
    203 {
    \n+
    207 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix;
    \n+\n+
    215 typename OperatorHierarchy::RedistributeInfoList::const_iterator redist;
    \n+
    219 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates;
    \n+\n+\n+\n+
    235 std::size_t level;
    \n+
    236 };
    \n+
    237
    \n+
    239 void mgc(LevelContext& levelContext, Domain& x, const Range& b);
    \n+
    240
    \n+
    247 void presmooth(LevelContext& levelContext, Domain& x, const Range& b);
    \n+
    248
    \n+
    255 void postsmooth(LevelContext& levelContext, Domain& x, const Range& b);
    \n+
    256
    \n+
    263 void moveToFineLevel(LevelContext& levelContext, bool processedFineLevel,
    \n+
    264 Domain& fineX);
    \n+
    265
    \n+
    270 bool moveToCoarseLevel(LevelContext& levelContext);
    \n+
    271
    \n+
    276 void initIteratorsWithFineLevel(LevelContext& levelContext);
    \n+
    277
    \n+
    279 std::shared_ptr<OperatorHierarchy> matrices_;
    \n+
    281 std::shared_ptr<CoarseSolver> solver_;
    \n+
    283 std::shared_ptr<Hierarchy<Range,A>> rhs_;
    \n+
    285 std::shared_ptr<Hierarchy<Domain,A>> lhs_;
    \n+
    287 std::shared_ptr<Hierarchy<Domain,A>> residual_;
    \n+
    288
    \n+\n+
    292 std::shared_ptr<ScalarProduct> scalarProduct_;
    \n+
    294 std::size_t gamma_;
    \n+
    296 std::size_t preSteps_;
    \n+
    298 std::size_t postSteps_;
    \n+
    299 std::size_t level;
    \n+
    300 bool buildHierarchy_;
    \n+
    301 bool symmetric;
    \n+
    302 bool coarsesolverconverged;
    \n+\n+
    304 typedef std::shared_ptr<Smoother> SmootherPointer;
    \n+
    305 SmootherPointer coarseSmoother_;
    \n+
    307 std::size_t verbosity_;
    \n+
    308 };
    \n+
    \n+
    309
    \n+
    310 template<class M, class X, class PI, class A>
    \n+
    \n+\n+
    312 : matrices_(amg.matrices_), solver_(amg.solver_),
    \n+
    313 rhs_(), lhs_(), residual_(), scalarProduct_(amg.scalarProduct_),
    \n+
    314 gamma_(amg.gamma_), preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),
    \n+
    315 symmetric(amg.symmetric), coarsesolverconverged(amg.coarsesolverconverged),
    \n+
    316 coarseSmoother_(amg.coarseSmoother_), verbosity_(amg.verbosity_)
    \n+
    317 {}
    \n+
    \n+
    318
    \n+
    319 template<class M, class X, class PI, class A>
    \n+
    \n+\n+
    321 const Parameters& parms, bool symmetric_)
    \n+
    322 : matrices_(stackobject_to_shared_ptr(matrices)), solver_(&coarseSolver),
    \n+
    323 rhs_(), lhs_(), residual_(), scalarProduct_(),
    \n+
    324 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),
    \n+
    325 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),
    \n+
    326 symmetric(symmetric_), coarsesolverconverged(true),
    \n+
    327 coarseSmoother_(), verbosity_(parms.debugLevel())
    \n+
    328 {
    \n+
    329 if(preSteps_>1||postSteps_>1)
    \n+
    330 {
    \n+
    331 std::cerr<<"WARNING only one step of smoothing is supported!"<<std::endl;
    \n+
    332 preSteps_=postSteps_=0;
    \n+
    333 }
    \n+
    334 assert(matrices_->isBuilt());
    \n+
    335 static_assert(std::is_same<PI,SequentialInformation>::value,
    \n+
    336 "Currently only sequential runs are supported");
    \n+
    337 }
    \n+
    \n+
    338 template<class M, class X, class PI, class A>
    \n+
    339 template<class C>
    \n+
    \n+
    340 FastAMG<M,X,PI,A>::FastAMG(std::shared_ptr<const Operator> fineOperator,
    \n+
    341 const C& criterion,
    \n+
    342 const Parameters& parms,
    \n+
    343 bool symmetric_,
    \n+
    344 const PI& pinfo)
    \n+
    345 : solver_(), rhs_(), lhs_(), residual_(), scalarProduct_(), gamma_(parms.getGamma()),
    \n+
    346 preSteps_(parms.getNoPreSmoothSteps()), postSteps_(parms.getNoPostSmoothSteps()),
    \n+
    347 buildHierarchy_(true),
    \n+
    348 symmetric(symmetric_), coarsesolverconverged(true),
    \n+
    349 coarseSmoother_(), verbosity_(criterion.debugLevel())
    \n+
    350 {
    \n+
    351 if(preSteps_>1||postSteps_>1)
    \n+
    352 {
    \n+
    353 std::cerr<<"WARNING only one step of smoothing is supported!"<<std::endl;
    \n+
    354 preSteps_=postSteps_=1;
    \n+
    355 }
    \n+
    356 static_assert(std::is_same<PI,SequentialInformation>::value,
    \n+
    357 "Currently only sequential runs are supported");
    \n+
    358 // TODO: reestablish compile time checks.
    \n+
    359 //static_assert(static_cast<int>(PI::category)==static_cast<int>(S::category),
    \n+
    360 // "Matrix and Solver must match in terms of category!");
    \n+
    361 createHierarchies(criterion, std::move(fineOperator), pinfo);
    \n+
    362 }
    \n+
    \n+
    363
    \n+
    364 template<class M, class X, class PI, class A>
    \n+
    365 template<class C>
    \n+
    366 void FastAMG<M,X,PI,A>::createHierarchies(C& criterion,
    \n+
    367 std::shared_ptr<const Operator> fineOperator,
    \n+
    368 const PI& pinfo)
    \n+
    369 {
    \n+
    370 Timer watch;
    \n+
    371 matrices_ = std::make_shared<OperatorHierarchy>(
    \n+
    372 std::const_pointer_cast<Operator>(std::move(fineOperator)),
    \n+
    373 stackobject_to_shared_ptr(const_cast<PI&>(pinfo)));
    \n+
    374
    \n+
    375 matrices_->template build<NegateSet<typename PI::OwnerSet> >(criterion);
    \n+
    376
    \n+
    377 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
    \n+
    378 std::cout<<"Building Hierarchy of "<<matrices_->maxlevels()<<" levels took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n+
    379
    \n+
    380 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels()) {
    \n+
    381 // We have the carsest level. Create the coarse Solver
    \n+
    382 typedef typename SmootherTraits<Smoother>::Arguments SmootherArgs;
    \n+
    383 SmootherArgs sargs;
    \n+
    384 sargs.iterations = 1;
    \n+
    385
    \n+\n+
    387 cargs.setArgs(sargs);
    \n+
    388 if(matrices_->redistributeInformation().back().isSetup()) {
    \n+
    389 // Solve on the redistributed partitioning
    \n+
    390 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat());
    \n+
    391 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed());
    \n+
    392 }else{
    \n+
    393 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());
    \n+
    394 cargs.setComm(*matrices_->parallelInformation().coarsest());
    \n+
    395 }
    \n+
    396
    \n+
    397 coarseSmoother_ = ConstructionTraits<Smoother>::construct(cargs);
    \n+
    398 scalarProduct_ = createScalarProduct<X>(cargs.getComm(),category());
    \n+
    399
    \n+
    400#if HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK
    \n+
    401#if HAVE_SUITESPARSE_UMFPACK
    \n+
    402#define DIRECTSOLVER UMFPack
    \n+
    403#else
    \n+
    404#define DIRECTSOLVER SuperLU
    \n+
    405#endif
    \n+
    406 // Use superlu if we are purely sequential or with only one processor on the coarsest level.
    \n+
    407 if(std::is_same<ParallelInformation,SequentialInformation>::value // sequential mode
    \n+
    408 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //parallel mode and only one processor
    \n+
    409 || (matrices_->parallelInformation().coarsest().isRedistributed()
    \n+
    410 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()==1
    \n+
    411 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()>0)) { // redistribute and 1 proc
    \n+
    412 if(verbosity_>0 && matrices_->parallelInformation().coarsest()->communicator().rank()==0)
    \n+
    413 std::cout<<"Using superlu"<<std::endl;
    \n+
    414 if(matrices_->parallelInformation().coarsest().isRedistributed())
    \n+
    415 {
    \n+
    416 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
    \n+
    417 // We are still participating on this level
    \n+
    418 solver_.reset(new DIRECTSOLVER<typename M::matrix_type>(matrices_->matrices().coarsest().getRedistributed().getmat(), false, false));
    \n+
    419 else
    \n+
    420 solver_.reset();
    \n+
    421 }else
    \n+
    422 solver_.reset(new DIRECTSOLVER<typename M::matrix_type>(matrices_->matrices().coarsest()->getmat(), false, false));
    \n+
    423 }else
    \n+
    424#undef DIRECTSOLVER
    \n+
    425#endif // HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK
    \n+
    426 {
    \n+
    427 if(matrices_->parallelInformation().coarsest().isRedistributed())
    \n+
    428 {
    \n+
    429 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
    \n+
    430 // We are still participating on this level
    \n+
    431 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(matrices_->matrices().coarsest().getRedistributed()),
    \n+
    432 *scalarProduct_,
    \n+
    433 *coarseSmoother_, 1E-2, 1000, 0));
    \n+
    434 else
    \n+
    435 solver_.reset();
    \n+
    436 }else
    \n+
    437 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(*matrices_->matrices().coarsest()),
    \n+
    438 *scalarProduct_,
    \n+
    439 *coarseSmoother_, 1E-2, 1000, 0));
    \n+
    440 }
    \n+
    441 }
    \n+
    442
    \n+
    443 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
    \n+
    444 std::cout<<"Building Hierarchy of "<<matrices_->maxlevels()<<" levels took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n+
    445 }
    \n+
    446
    \n+
    447
    \n+
    448 template<class M, class X, class PI, class A>
    \n+
    \n+\n+
    450 {
    \n+
    451 Timer watch, watch1;
    \n+
    452 // Detect Matrix rows where all offdiagonal entries are
    \n+
    453 // zero and set x such that A_dd*x_d=b_d
    \n+
    454 // Thus users can be more careless when setting up their linear
    \n+
    455 // systems.
    \n+
    456 typedef typename M::matrix_type Matrix;
    \n+
    457 typedef typename Matrix::ConstRowIterator RowIter;
    \n+
    458 typedef typename Matrix::ConstColIterator ColIter;
    \n+
    459 typedef typename Matrix::block_type Block;
    \n+
    460 Block zero;
    \n+
    461 zero=typename Matrix::field_type();
    \n+
    462
    \n+
    463 const Matrix& mat=matrices_->matrices().finest()->getmat();
    \n+
    464 for(RowIter row=mat.begin(); row!=mat.end(); ++row) {
    \n+
    465 bool isDirichlet = true;
    \n+
    466 bool hasDiagonal = false;
    \n+
    467 ColIter diag;
    \n+
    468 for(ColIter col=row->begin(); col!=row->end(); ++col) {
    \n+
    469 if(row.index()==col.index()) {
    \n+
    470 diag = col;
    \n+
    471 hasDiagonal = (*col != zero);
    \n+
    472 }else{
    \n+
    473 if(*col!=zero)
    \n+
    474 isDirichlet = false;
    \n+
    475 }
    \n+
    476 }
    \n+
    477 if(isDirichlet && hasDiagonal)
    \n+
    478 diag->solve(x[row.index()], b[row.index()]);
    \n+
    479 }
    \n+
    480 if (verbosity_>0)
    \n+
    481 std::cout<<" Preprocessing Dirichlet took "<<watch1.elapsed()<<std::endl;
    \n+
    482 watch1.reset();
    \n+
    483 // No smoother to make x consistent! Do it by hand
    \n+
    484 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x);
    \n+
    485 rhs_ = std::make_shared<Hierarchy<Range,A>>(std::make_shared<Range>(b));
    \n+
    486 lhs_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
    \n+
    487 residual_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
    \n+
    488 matrices_->coarsenVector(*rhs_);
    \n+
    489 matrices_->coarsenVector(*lhs_);
    \n+
    490 matrices_->coarsenVector(*residual_);
    \n+
    491
    \n+
    492 // The preconditioner might change x and b. So we have to
    \n+
    493 // copy the changes to the original vectors.
    \n+
    494 x = *lhs_->finest();
    \n+
    495 b = *rhs_->finest();
    \n+
    496 }
    \n+
    \n+
    497 template<class M, class X, class PI, class A>
    \n+
    \n+\n+
    499 {
    \n+
    500 return matrices_->levels();
    \n+
    501 }
    \n+
    \n+
    502 template<class M, class X, class PI, class A>
    \n+
    \n+\n+
    504 {
    \n+
    505 return matrices_->maxlevels();
    \n+
    506 }
    \n+
    \n+
    507
    \n+
    509 template<class M, class X, class PI, class A>
    \n+
    \n+\n+
    511 {
    \n+
    512 LevelContext levelContext;
    \n+
    513 // Init all iterators for the current level
    \n+
    514 initIteratorsWithFineLevel(levelContext);
    \n+
    515
    \n+
    516 assert(v.two_norm()==0);
    \n+
    517
    \n+
    518 level=0;
    \n+
    519 if(matrices_->maxlevels()==1){
    \n+
    520 // The coarse solver might modify the d!
    \n+
    521 Range b(d);
    \n+
    522 mgc(levelContext, v, b);
    \n+
    523 }else
    \n+
    524 mgc(levelContext, v, d);
    \n+
    525 if(postSteps_==0||matrices_->maxlevels()==1)
    \n+
    526 levelContext.pinfo->copyOwnerToAll(v, v);
    \n+
    527 }
    \n+
    \n+
    528
    \n+
    529 template<class M, class X, class PI, class A>
    \n+
    530 void FastAMG<M,X,PI,A>::initIteratorsWithFineLevel(LevelContext& levelContext)
    \n+
    531 {
    \n+
    532 levelContext.matrix = matrices_->matrices().finest();
    \n+
    533 levelContext.pinfo = matrices_->parallelInformation().finest();
    \n+
    534 levelContext.redist =
    \n+
    535 matrices_->redistributeInformation().begin();
    \n+
    536 levelContext.aggregates = matrices_->aggregatesMaps().begin();
    \n+
    537 levelContext.lhs = lhs_->finest();
    \n+
    538 levelContext.residual = residual_->finest();
    \n+
    539 levelContext.rhs = rhs_->finest();
    \n+
    540 levelContext.level=0;
    \n+
    541 }
    \n+
    542
    \n+
    543 template<class M, class X, class PI, class A>
    \n+
    544 bool FastAMG<M,X,PI,A>
    \n+
    545 ::moveToCoarseLevel(LevelContext& levelContext)
    \n+
    546 {
    \n+
    547 bool processNextLevel=true;
    \n+
    548
    \n+
    549 if(levelContext.redist->isSetup()) {
    \n+
    550 throw "bla";
    \n+
    551 levelContext.redist->redistribute(static_cast<const Range&>(*levelContext.residual),
    \n+
    552 levelContext.residual.getRedistributed());
    \n+
    553 processNextLevel = levelContext.residual.getRedistributed().size()>0;
    \n+
    554 if(processNextLevel) {
    \n+
    555 //restrict defect to coarse level right hand side.
    \n+
    556 ++levelContext.pinfo;
    \n+
    557 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n+
    558 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
    \n+
    559 static_cast<const Range&>(levelContext.residual.getRedistributed()),
    \n+
    560 *levelContext.pinfo);
    \n+
    561 }
    \n+
    562 }else{
    \n+
    563 //restrict defect to coarse level right hand side.
    \n+
    564 ++levelContext.rhs;
    \n+
    565 ++levelContext.pinfo;
    \n+
    566 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n+
    567 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
    \n+
    568 static_cast<const Range&>(*levelContext.residual), *levelContext.pinfo);
    \n+
    569 }
    \n+
    570
    \n+
    571 if(processNextLevel) {
    \n+
    572 // prepare coarse system
    \n+
    573 ++levelContext.residual;
    \n+
    574 ++levelContext.lhs;
    \n+
    575 ++levelContext.matrix;
    \n+
    576 ++levelContext.level;
    \n+
    577 ++levelContext.redist;
    \n+
    578
    \n+
    579 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
    \n+
    580 // next level is not the globally coarsest one
    \n+
    581 ++levelContext.aggregates;
    \n+
    582 }
    \n+
    583 // prepare the lhs on the next level
    \n+
    584 *levelContext.lhs=0;
    \n+
    585 *levelContext.residual=0;
    \n+
    586 }
    \n+
    587 return processNextLevel;
    \n+
    588 }
    \n+
    589
    \n+
    590 template<class M, class X, class PI, class A>
    \n+
    591 void FastAMG<M,X,PI,A>
    \n+
    592 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel, Domain& x)
    \n+
    593 {
    \n+
    594 if(processNextLevel) {
    \n+
    595 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
    \n+
    596 // previous level is not the globally coarsest one
    \n+
    597 --levelContext.aggregates;
    \n+
    598 }
    \n+
    599 --levelContext.redist;
    \n+
    600 --levelContext.level;
    \n+
    601 //prolongate and add the correction (update is in coarse left hand side)
    \n+
    602 --levelContext.matrix;
    \n+
    603 --levelContext.residual;
    \n+
    604
    \n+
    605 }
    \n+
    606
    \n+
    607 typename Hierarchy<Domain,A>::Iterator coarseLhs = levelContext.lhs--;
    \n+
    608 if(levelContext.redist->isSetup()) {
    \n+
    609
    \n+
    610 // Need to redistribute during prolongate
    \n+
    611 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n+
    612 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,
    \n+
    613 levelContext.lhs.getRedistributed(),
    \n+
    614 matrices_->getProlongationDampingFactor(),
    \n+
    615 *levelContext.pinfo, *levelContext.redist);
    \n+
    616 }else{
    \n+
    617 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n+
    618 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,
    \n+
    619 matrices_->getProlongationDampingFactor(), *levelContext.pinfo);
    \n+
    620
    \n+
    621 // printvector(std::cout, *lhs, "prolongated coarse grid correction", "lhs", 10, 10, 10);
    \n+
    622 }
    \n+
    623
    \n+
    624
    \n+
    625 if(processNextLevel) {
    \n+
    626 --levelContext.rhs;
    \n+
    627 }
    \n+
    628
    \n+
    629 }
    \n+
    630
    \n+
    631
    \n+
    632 template<class M, class X, class PI, class A>
    \n+
    633 void FastAMG<M,X,PI,A>
    \n+
    634 ::presmooth(LevelContext& levelContext, Domain& x, const Range& b)
    \n+
    635 {
    \n+
    636 constexpr auto bl = blockLevel<typename M::matrix_type>();
    \n+
    637 GaussSeidelPresmoothDefect<bl>::apply(levelContext.matrix->getmat(),
    \n+
    638 x,
    \n+
    639 *levelContext.residual,
    \n+
    640 b);
    \n+
    641 }
    \n+
    642
    \n+
    643 template<class M, class X, class PI, class A>
    \n+
    644 void FastAMG<M,X,PI,A>
    \n+
    645 ::postsmooth(LevelContext& levelContext, Domain& x, const Range& b)
    \n+
    646 {
    \n+
    647 constexpr auto bl = blockLevel<typename M::matrix_type>();
    \n+
    648 GaussSeidelPostsmoothDefect<bl>
    \n+
    649 ::apply(levelContext.matrix->getmat(), x, *levelContext.residual, b);
    \n+
    650 }
    \n+
    651
    \n+
    652
    \n+
    653 template<class M, class X, class PI, class A>
    \n+\n+
    658
    \n+
    659 template<class M, class X, class PI, class A>
    \n+
    660 void FastAMG<M,X,PI,A>::mgc(LevelContext& levelContext, Domain& v, const Range& b){
    \n+
    661
    \n+
    662 if(levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels()) {
    \n+
    663 // Solve directly
    \n+\n+
    665 res.converged=true; // If we do not compute this flag will not get updated
    \n+
    666 if(levelContext.redist->isSetup()) {
    \n+
    667 levelContext.redist->redistribute(b, levelContext.rhs.getRedistributed());
    \n+
    668 if(levelContext.rhs.getRedistributed().size()>0) {
    \n+
    669 // We are still participating in the computation
    \n+
    670 levelContext.pinfo.getRedistributed().copyOwnerToAll(levelContext.rhs.getRedistributed(),
    \n+
    671 levelContext.rhs.getRedistributed());
    \n+
    672 solver_->apply(levelContext.lhs.getRedistributed(), levelContext.rhs.getRedistributed(), res);
    \n+
    673 }
    \n+
    674 levelContext.redist->redistributeBackward(v, levelContext.lhs.getRedistributed());
    \n+
    675 levelContext.pinfo->copyOwnerToAll(v, v);
    \n+
    676 }else{
    \n+
    677 levelContext.pinfo->copyOwnerToAll(b, b);
    \n+
    678 solver_->apply(v, const_cast<Range&>(b), res);
    \n+
    679 }
    \n+
    680
    \n+
    681 // printvector(std::cout, *lhs, "coarse level update", "u", 10, 10, 10);
    \n+
    682 // printvector(std::cout, *rhs, "coarse level rhs", "rhs", 10, 10, 10);
    \n+
    683 if (!res.converged)
    \n+
    684 coarsesolverconverged = false;
    \n+
    685 }else{
    \n+
    686 // presmoothing
    \n+
    687 presmooth(levelContext, v, b);
    \n+
    688 // printvector(std::cout, *lhs, "update", "u", 10, 10, 10);
    \n+
    689 // printvector(std::cout, *residual, "post presmooth residual", "r", 10);
    \n+
    690#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
    \n+
    691 bool processNextLevel = moveToCoarseLevel(levelContext);
    \n+
    692
    \n+
    693 if(processNextLevel) {
    \n+
    694 // next level
    \n+
    695 for(std::size_t i=0; i<gamma_; i++)
    \n+
    696 mgc(levelContext, *levelContext.lhs, *levelContext.rhs);
    \n+
    697 }
    \n+
    698
    \n+
    699 moveToFineLevel(levelContext, processNextLevel, v);
    \n+
    700#else
    \n+
    701 *lhs=0;
    \n+
    702#endif
    \n+
    703
    \n+
    704 if(levelContext.matrix == matrices_->matrices().finest()) {
    \n+
    705 coarsesolverconverged = matrices_->parallelInformation().finest()->communicator().prod(coarsesolverconverged);
    \n+
    706 if(!coarsesolverconverged)
    \n+
    707 DUNE_THROW(MathError, "Coarse solver did not converge");
    \n+
    708 }
    \n+
    709
    \n+
    710 postsmooth(levelContext, v, b);
    \n+
    711 }
    \n+
    712 }
    \n+
    713
    \n+
    714
    \n+
    716 template<class M, class X, class PI, class A>
    \n+
    \n+
    717 void FastAMG<M,X,PI,A>::post([[maybe_unused]] Domain& x)
    \n+
    718 {
    \n+
    719 lhs_=nullptr;
    \n+
    720 rhs_=nullptr;
    \n+
    721 residual_=nullptr;
    \n+
    722 }
    \n+
    \n+
    723
    \n+
    724 template<class M, class X, class PI, class A>
    \n+
    725 template<class A1>
    \n+
    \n+
    726 void FastAMG<M,X,PI,A>::getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont)
    \n+
    727 {
    \n+
    728 matrices_->getCoarsestAggregatesOnFinest(cont);
    \n+
    729 }
    \n+
    \n+
    730
    \n+
    731 } // end namespace Amg
    \n+
    732} // end namespace Dune
    \n+
    733
    \n+
    734#endif
    \n+
    Some generic functions for pretty printing vectors and matrices.
    \n+
    Classes for using UMFPack with ISTL matrices.
    \n+
    Classes for using SuperLU with ISTL matrices.
    \n+
    Define base class for scalar product and norm.
    \n+
    Implementations of the inverse operator interface.
    \n+
    Define general preconditioner interface.
    \n+
    Templates characterizing the type of a solver.
    \n+
    Provides a classes representing the hierarchies in AMG.
    \n+
    Prolongation and restriction for amg.
    \n+\n+
    Classes for the generic construction and application of the smoothers.
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n+
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    void presmooth(LevelContext &levelContext, size_t steps)
    Apply pre smoothing on the current level.
    Definition smoother.hh:406
    \n+
    const void * Arguments
    A type holding all the arguments needed to call the constructor.
    Definition construction.hh:44
    \n+
    static std::shared_ptr< T > construct(Arguments &args)
    Construct an object with the specified arguments.
    Definition construction.hh:52
    \n+
    void postsmooth(LevelContext &levelContext, size_t steps)
    Apply post smoothing on the current level.
    Definition smoother.hh:428
    \n+
    int iterations
    The number of iterations to perform.
    Definition smoother.hh:47
    \n+
    OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix
    The iterator over the matrices.
    Definition fastamg.hh:207
    \n+
    void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)
    Get the aggregate number of each unknown on the coarsest level.
    Definition fastamg.hh:726
    \n+
    ParallelInformationHierarchy::Iterator pinfo
    The iterator over the parallel information.
    Definition fastamg.hh:211
    \n+
    void recalculateHierarchy()
    Recalculate the matrix hierarchy.
    Definition fastamg.hh:173
    \n+
    void post(Domain &x)
    Clean up.
    Definition fastamg.hh:717
    \n+
    std::size_t maxlevels()
    Definition fastamg.hh:503
    \n+
    X Domain
    The domain type.
    Definition fastamg.hh:77
    \n+
    Hierarchy< Domain, A >::Iterator residual
    The iterator over the residuals.
    Definition fastamg.hh:227
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition fastamg.hh:146
    \n+
    MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy
    The operator hierarchy type.
    Definition fastamg.hh:72
    \n+
    OperatorHierarchy::RedistributeInfoList::const_iterator redist
    The iterator over the redistribution information.
    Definition fastamg.hh:215
    \n+
    X Range
    The range type.
    Definition fastamg.hh:79
    \n+
    PI ParallelInformation
    The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
    Definition fastamg.hh:70
    \n+
    M Operator
    The matrix operator type.
    Definition fastamg.hh:63
    \n+
    std::size_t levels()
    Definition fastamg.hh:498
    \n+
    FastAMG(const Operator &fineOperator, const C &criterion, const Parameters &parms=Parameters(), bool symmetric=true, const ParallelInformation &pinfo=ParallelInformation())
    Construct an AMG with an inexact coarse solver based on the smoother.
    Definition fastamg.hh:125
    \n+
    InverseOperator< X, X > CoarseSolver
    the type of the coarse solver.
    Definition fastamg.hh:81
    \n+
    bool usesDirectCoarseLevelSolver() const
    Check whether the coarse solver used is a direct solver.
    Definition fastamg.hh:654
    \n+
    Hierarchy< Domain, A >::Iterator lhs
    The iterator over the left hand side.
    Definition fastamg.hh:223
    \n+
    Hierarchy< Range, A >::Iterator rhs
    The iterator over the right hand sided.
    Definition fastamg.hh:231
    \n+
    std::size_t level
    The level index.
    Definition fastamg.hh:235
    \n+
    void apply(Domain &v, const Range &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition fastamg.hh:510
    \n+
    OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy
    The parallal data distribution hierarchy type.
    Definition fastamg.hh:74
    \n+
    void pre(Domain &x, Range &b)
    Prepare the preconditioner.
    Definition fastamg.hh:449
    \n+
    FastAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const Parameters &parms, bool symmetric=true)
    Construct a new amg with a specific coarse solver.
    Definition fastamg.hh:320
    \n+
    OperatorHierarchy::AggregatesMapList::const_iterator aggregates
    The iterator over the aggregates maps.
    Definition fastamg.hh:219
    \n
    Definition allocator.hh:11
    \n+
    ConstIterator class for sequential access.
    Definition matrix.hh:404
    \n+
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    typename Imp::BlockTraits< T >::field_type field_type
    Export the type representing the underlying field.
    Definition matrix.hh:565
    \n+
    row_type::const_iterator ConstColIterator
    Const iterator for the entries of each row.
    Definition matrix.hh:589
    \n+
    T block_type
    Export the type representing the components.
    Definition matrix.hh:568
    \n+
    A fast (sequential) algebraic multigrid based on agglomeration that saves memory bandwidth.
    Definition fastamg.hh:60
    \n+
    static void apply(const M &A, X &x, Y &d, const Y &b)
    Definition fastamgsmoother.hh:19
    \n+\n+
    LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
    Type of the mutable iterator.
    Definition hierarchy.hh:216
    \n+
    Iterator over the levels in the hierarchy.
    Definition hierarchy.hh:120
    \n+
    The hierarchies build by the coarsening process.
    Definition matrixhierarchy.hh:61
    \n+
    All parameters for AMG.
    Definition parameters.hh:416
    \n+
    The default class for the smoother arguments.
    Definition smoother.hh:38
    \n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    Sequential SSOR preconditioner.
    Definition preconditioners.hh:142
    \n+
    Base class for scalar product and norm computation.
    Definition scalarproducts.hh:52
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n+
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    Definition solvertype.hh:16
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,99 +1,841 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\bc_\bo_\bm_\bm_\bo_\bn\n-registry.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+fastamg.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3#ifndef DUNE_ISTL_COMMON_REGISTRY_HH\n-4#define DUNE_ISTL_COMMON_REGISTRY_HH\n-5\n-6#include \n-7#include \n+3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+4// vi: set et ts=4 sw=2 sts=2:\n+5#ifndef DUNE_ISTL_FASTAMG_HH\n+6#define DUNE_ISTL_FASTAMG_HH\n+7\n 8#include \n-9#include \n-10#include \n-11\n-12#include \"_\bc_\bo_\bu_\bn_\bt_\be_\br_\b._\bh_\bh\"\n-13\n-14#include \n-15#include \n-16#include \n-17\n-_\b1_\b8#define DUNE_REGISTRY_PUT(Tag, id, ...) \\\n-19 namespace { \\\n-20 template<> \\\n-21 struct Registry \\\n-22 { \\\n-23 static auto getCreator() \\\n-24 { \\\n-25 return __VA_ARGS__; \\\n-26 } \\\n-27 static std::string name() { return id; } \\\n-28 }; \\\n-29 } \\\n-30 DUNE_INC_COUNTER(Tag)\n-31\n-32\n-33namespace _\bD_\bu_\bn_\be {\n-34 namespace {\n-35 template\n-36 struct Registry;\n-37 }\n-38\n-39 namespace {\n-40 template class Base, class V, class Tag, typename... Args>\n-41 auto registryGet(Tag , std::string name, Args... args)\n-42 {\n-43 constexpr auto count = _\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR(Tag);\n-44 std::shared_ptr > result;\n-45 Dune::Hybrid::forEach(std::make_index_sequence{},\n-46 [&](auto index) {\n-47 using Reg = Registry;\n-48 if(!result && Reg::name() == name) {\n-49 result = Reg::getCreator()(Dune::MetaType{}, args...);\n-50 }\n-51 });\n-52 return result;\n-53 }\n-54\n-55 /*\n-56 Register all creators from the registry in the Parameterizedobjectfactory An\n-57 object of V is passed in the creator and should be used to determine the\n-58 template arguments.\n-59 */\n-60 template\n-61 int addRegistryToFactory(Dune::ParameterizedObjectFactory& factory,\n-62 Tag){\n-63 constexpr auto count = _\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR(Tag);\n-64 Dune::Hybrid::forEach(std::make_index_sequence{},\n-65 [&](auto index) {\n-66 // we first get the generic lambda\n-67 // and later specialize it with given parameters.\n-68 // doing all at once leads to an ICE with g++-6\n-69 using Reg = Registry;\n-70 auto genericcreator = Reg::getCreator();\n-71 factory.define(Reg::name(), [genericcreator](Args... args){\n-72 return genericcreator(V{}, args...);\n-73 });\n-74 });\n-75 return count;\n-76 }\n-77 } // end anonymous namespace\n-78} // end namespace Dune\n-79\n-80#endif // DUNE_ISTL_COMMON_REGISTRY_HH\n-_\bc_\bo_\bu_\bn_\bt_\be_\br_\b._\bh_\bh\n-_\bD_\bU_\bN_\bE_\b__\bG_\bE_\bT_\b__\bC_\bO_\bU_\bN_\bT_\bE_\bR\n-#define DUNE_GET_COUNTER(Tag)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn counter.hh:17\n+9#include \n+10#include \n+11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n+12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n+13#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh>\n+16#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh>\n+17#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+19#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bo_\b._\bh_\bh>\n+20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n+21\n+22#include \"_\bf_\ba_\bs_\bt_\ba_\bm_\bg_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\"\n+23\n+32namespace _\bD_\bu_\bn_\be\n+33{\n+34 namespace Amg\n+35 {\n+58 template >\n+_\b5_\b9 class _\bF_\ba_\bs_\bt_\bA_\bM_\bG : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+60 {\n+61 public:\n+_\b6_\b3 typedef M _\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n+_\b7_\b0 typedef PI _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n+_\b7_\b2 typedef _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\b> _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n+_\b7_\b4 typedef typename _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n+75\n+_\b7_\b7 typedef X _\bD_\bo_\bm_\ba_\bi_\bn;\n+_\b7_\b9 typedef X _\bR_\ba_\bn_\bg_\be;\n+_\b8_\b1 typedef _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bX_\b> _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br;\n+82\n+90 _\bF_\ba_\bs_\bt_\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br& coarseSolver,\n+91 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms,\n+92 bool symmetric=true);\n+93\n+105 template\n+106 _\bF_\ba_\bs_\bt_\bA_\bM_\bG(std::shared_ptr fineOperator,\n+107 const C& criterion,\n+108 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms=_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(),\n+109 bool symmetric=true,\n+110 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo=_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n+111\n+124 template\n+_\b1_\b2_\b5 _\bF_\ba_\bs_\bt_\bA_\bM_\bG(const _\bO_\bp_\be_\br_\ba_\bt_\bo_\br& fineOperator,\n+126 const C& criterion,\n+127 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms=_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(),\n+128 bool symmetric=true,\n+129 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo=_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn())\n+130 : _\bF_\ba_\bs_\bt_\bA_\bM_\bG(stackobject_to_shared_ptr(fineOperator),\n+131 criterion, parms, symmetric, pinfo)\n+132 {}\n+133\n+137 _\bF_\ba_\bs_\bt_\bA_\bM_\bG(const _\bF_\ba_\bs_\bt_\bA_\bM_\bG& amg);\n+138\n+140 void _\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b);\n+141\n+143 void _\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d);\n+144\n+_\b1_\b4_\b6 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+147 {\n+148 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+149 }\n+150\n+152 void _\bp_\bo_\bs_\bt(_\bD_\bo_\bm_\ba_\bi_\bn& x);\n+153\n+158 template\n+159 void _\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs(std::vector& cont);\n+160\n+161 std::size_t _\bl_\be_\bv_\be_\bl_\bs();\n+162\n+163 std::size_t _\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs();\n+164\n+_\b1_\b7_\b3 void _\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by()\n+174 {\n+175 matrices_->recalculateGalerkin(NegateSet());\n+176 }\n+177\n+182 bool _\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br() const;\n+183\n+184 private:\n+191 template\n+192 void createHierarchies(C& criterion,\n+193 std::shared_ptr fineOperator,\n+194 const PI& pinfo);\n+195\n+202 struct LevelContext\n+203 {\n+_\b2_\b0_\b7 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator _\bm_\ba_\bt_\br_\bi_\bx;\n+_\b2_\b1_\b1 typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bp_\bi_\bn_\bf_\bo;\n+_\b2_\b1_\b5 typename OperatorHierarchy::RedistributeInfoList::const_iterator _\br_\be_\bd_\bi_\bs_\bt;\n+_\b2_\b1_\b9 typename OperatorHierarchy::AggregatesMapList::const_iterator _\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs;\n+_\b2_\b2_\b3 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bl_\bh_\bs;\n+_\b2_\b2_\b7 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\be_\bs_\bi_\bd_\bu_\ba_\bl;\n+_\b2_\b3_\b1 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bR_\ba_\bn_\bg_\be_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\bh_\bs;\n+_\b2_\b3_\b5 std::size_t _\bl_\be_\bv_\be_\bl;\n+236 };\n+237\n+239 void mgc(LevelContext& levelContext, _\bD_\bo_\bm_\ba_\bi_\bn& x, const _\bR_\ba_\bn_\bg_\be& b);\n+240\n+247 void presmooth(LevelContext& levelContext, _\bD_\bo_\bm_\ba_\bi_\bn& x, const _\bR_\ba_\bn_\bg_\be& b);\n+248\n+255 void postsmooth(LevelContext& levelContext, _\bD_\bo_\bm_\ba_\bi_\bn& x, const _\bR_\ba_\bn_\bg_\be& b);\n+256\n+263 void moveToFineLevel(LevelContext& levelContext, bool processedFineLevel,\n+264 _\bD_\bo_\bm_\ba_\bi_\bn& fineX);\n+265\n+270 bool moveToCoarseLevel(LevelContext& levelContext);\n+271\n+276 void initIteratorsWithFineLevel(LevelContext& levelContext);\n+277\n+279 std::shared_ptr matrices_;\n+281 std::shared_ptr solver_;\n+283 std::shared_ptr> rhs_;\n+285 std::shared_ptr> lhs_;\n+287 std::shared_ptr> residual_;\n+288\n+290 using _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt = _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bX_\b>;\n+292 std::shared_ptr scalarProduct_;\n+294 std::size_t gamma_;\n+296 std::size_t preSteps_;\n+298 std::size_t postSteps_;\n+299 std::size_t level;\n+300 bool buildHierarchy_;\n+301 bool symmetric;\n+302 bool coarsesolverconverged;\n+303 typedef _\bS_\be_\bq_\bS_\bS_\bO_\bR_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b,_\bX_\b,_\bX_\b> _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n+304 typedef std::shared_ptr SmootherPointer;\n+305 SmootherPointer coarseSmoother_;\n+307 std::size_t verbosity_;\n+308 };\n+309\n+310 template\n+_\b3_\b1_\b1 _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG(const _\bF_\ba_\bs_\bt_\bA_\bM_\bG& amg)\n+312 : matrices_(amg.matrices_), solver_(amg.solver_),\n+313 rhs_(), lhs_(), residual_(), scalarProduct_(amg.scalarProduct_),\n+314 gamma_(amg.gamma_), preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),\n+315 symmetric(amg.symmetric), coarsesolverconverged(amg.coarsesolverconverged),\n+316 coarseSmoother_(amg.coarseSmoother_), verbosity_(amg.verbosity_)\n+317 {}\n+318\n+319 template\n+_\b3_\b2_\b0 _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br&\n+coarseSolver,\n+321 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms, bool symmetric_)\n+322 : matrices_(stackobject_to_shared_ptr(matrices)), solver_(&coarseSolver),\n+323 rhs_(), lhs_(), residual_(), scalarProduct_(),\n+324 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),\n+325 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),\n+326 symmetric(symmetric_), coarsesolverconverged(true),\n+327 coarseSmoother_(), verbosity_(parms.debugLevel())\n+328 {\n+329 if(preSteps_>1||postSteps_>1)\n+330 {\n+331 std::cerr<<\"WARNING only one step of smoothing is supported!\"<isBuilt());\n+335 static_assert(std::is_same::value,\n+336 \"Currently only sequential runs are supported\");\n+337 }\n+338 template\n+339 template\n+_\b3_\b4_\b0 _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG(std::shared_ptr fineOperator,\n+341 const C& criterion,\n+342 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms,\n+343 bool symmetric_,\n+344 const PI& pinfo)\n+345 : solver_(), rhs_(), lhs_(), residual_(), scalarProduct_(), gamma_\n+(parms.getGamma()),\n+346 preSteps_(parms.getNoPreSmoothSteps()), postSteps_\n+(parms.getNoPostSmoothSteps()),\n+347 buildHierarchy_(true),\n+348 symmetric(symmetric_), coarsesolverconverged(true),\n+349 coarseSmoother_(), verbosity_(criterion.debugLevel())\n+350 {\n+351 if(preSteps_>1||postSteps_>1)\n+352 {\n+353 std::cerr<<\"WARNING only one step of smoothing is supported!\"<::value,\n+357 \"Currently only sequential runs are supported\");\n+358 // TODO: reestablish compile time checks.\n+359 //static_assert(static_cast(PI::category)==static_cast(S::\n+category),\n+360 // \"Matrix and Solver must match in terms of category!\");\n+361 createHierarchies(criterion, std::move(fineOperator), pinfo);\n+362 }\n+363\n+364 template\n+365 template\n+366 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\bi_\be_\bs(C& criterion,\n+367 std::shared_ptr fineOperator,\n+368 const PI& pinfo)\n+369 {\n+370 Timer watch;\n+371 matrices_ = std::make_shared(\n+372 std::const_pointer_cast(std::move(fineOperator)),\n+373 stackobject_to_shared_ptr(const_cast(pinfo)));\n+374\n+375 matrices_->template build >(criterion);\n+376\n+377 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator\n+().rank()==0)\n+378 std::cout<<\"Building Hierarchy of \"<maxlevels()<<\" levels took\n+\"<levels()==matrices_->maxlevels()) {\n+381 // We have the carsest level. Create the coarse Solver\n+382 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs SmootherArgs;\n+383 SmootherArgs sargs;\n+384 sargs._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 1;\n+385\n+386 typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs cargs;\n+387 cargs.setArgs(sargs);\n+388 if(matrices_->redistributeInformation().back().isSetup()) {\n+389 // Solve on the redistributed partitioning\n+390 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat\n+());\n+391 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed\n+());\n+392 }else{\n+393 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());\n+394 cargs.setComm(*matrices_->parallelInformation().coarsest());\n+395 }\n+396\n+397 coarseSmoother_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(cargs);\n+398 scalarProduct_ = createScalarProduct(cargs.getComm(),category());\n+399\n+400#if HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK\n+401#if HAVE_SUITESPARSE_UMFPACK\n+402#define DIRECTSOLVER UMFPack\n+403#else\n+404#define DIRECTSOLVER SuperLU\n+405#endif\n+406 // Use superlu if we are purely sequential or with only one processor on\n+the coarsest level.\n+407 if(std::is_same::value /\n+/ sequential mode\n+408 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //\n+parallel mode and only one processor\n+409 || (matrices_->parallelInformation().coarsest().isRedistributed()\n+410 && matrices_->parallelInformation().coarsest().getRedistributed\n+().communicator().size()==1\n+411 && matrices_->parallelInformation().coarsest().getRedistributed\n+().communicator().size()>0)) { // redistribute and 1 proc\n+412 if(verbosity_>0 && matrices_->parallelInformation().coarsest()-\n+>communicator().rank()==0)\n+413 std::cout<<\"Using superlu\"<parallelInformation().coarsest().isRedistributed())\n+415 {\n+416 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)\n+417 // We are still participating on this level\n+418 solver_.reset(new DIRECTSOLVER(matrices_->matrices\n+().coarsest().getRedistributed().getmat(), false, false));\n+419 else\n+420 solver_.reset();\n+421 }else\n+422 solver_.reset(new DIRECTSOLVER(matrices_->matrices\n+().coarsest()->getmat(), false, false));\n+423 }else\n+424#undef DIRECTSOLVER\n+425#endif // HAVE_SUPERLU|| HAVE_SUITESPARSE_UMFPACK\n+426 {\n+427 if(matrices_->parallelInformation().coarsest().isRedistributed())\n+428 {\n+429 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)\n+430 // We are still participating on this level\n+431 solver_.reset(new BiCGSTABSolver(const_cast(matrices_->matrices\n+().coarsest().getRedistributed()),\n+432 *scalarProduct_,\n+433 *coarseSmoother_, 1E-2, 1000, 0));\n+434 else\n+435 solver_.reset();\n+436 }else\n+437 solver_.reset(new BiCGSTABSolver(const_cast(*matrices_->matrices\n+().coarsest()),\n+438 *scalarProduct_,\n+439 *coarseSmoother_, 1E-2, 1000, 0));\n+440 }\n+441 }\n+442\n+443 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator\n+().rank()==0)\n+444 std::cout<<\"Building Hierarchy of \"<maxlevels()<<\" levels took\n+\"<\n+_\b4_\b4_\b9 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b)\n+450 {\n+451 Timer watch, watch1;\n+452 // Detect Matrix rows where all offdiagonal entries are\n+453 // zero and set x such that A_dd*x_d=b_d\n+454 // Thus users can be more careless when setting up their linear\n+455 // systems.\n+456 typedef typename M::matrix_type _\bM_\ba_\bt_\br_\bi_\bx;\n+457 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br RowIter;\n+458 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ColIter;\n+459 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be Block;\n+460 Block zero;\n+461 zero=typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be();\n+462\n+463 const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt=matrices_->matrices().finest()->getmat();\n+464 for(RowIter row=_\bm_\ba_\bt.begin(); row!=_\bm_\ba_\bt.end(); ++row) {\n+465 bool isDirichlet = true;\n+466 bool hasDiagonal = false;\n+467 ColIter diag;\n+468 for(ColIter _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl!=row->end(); ++_\bc_\bo_\bl) {\n+469 if(row.index()==_\bc_\bo_\bl.index()) {\n+470 diag = _\bc_\bo_\bl;\n+471 hasDiagonal = (*_\bc_\bo_\bl != zero);\n+472 }else{\n+473 if(*_\bc_\bo_\bl!=zero)\n+474 isDirichlet = false;\n+475 }\n+476 }\n+477 if(isDirichlet && hasDiagonal)\n+478 diag->solve(x[row.index()], b[row.index()]);\n+479 }\n+480 if (verbosity_>0)\n+481 std::cout<<\" Preprocessing Dirichlet took \"<parallelInformation().coarsest()->copyOwnerToAll(x,x);\n+485 rhs_ = std::make_shared>(std::make_shared(b));\n+486 lhs_ = std::make_shared>(std::make_shared(x));\n+487 residual_ = std::make_shared>(std::make_shared\n+(x));\n+488 matrices_->coarsenVector(*rhs_);\n+489 matrices_->coarsenVector(*lhs_);\n+490 matrices_->coarsenVector(*residual_);\n+491\n+492 // The preconditioner might change x and b. So we have to\n+493 // copy the changes to the original vectors.\n+494 x = *lhs_->finest();\n+495 b = *rhs_->finest();\n+496 }\n+497 template\n+_\b4_\b9_\b8 std::size_t _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs()\n+499 {\n+500 return matrices_->levels();\n+501 }\n+502 template\n+_\b5_\b0_\b3 std::size_t _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs()\n+504 {\n+505 return matrices_->maxlevels();\n+506 }\n+507\n+509 template\n+_\b5_\b1_\b0 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n+511 {\n+512 LevelContext levelContext;\n+513 // Init all iterators for the current level\n+514 initIteratorsWithFineLevel(levelContext);\n+515\n+516 assert(v.two_norm()==0);\n+517\n+518 level=0;\n+519 if(matrices_->maxlevels()==1){\n+520 // The coarse solver might modify the d!\n+521 _\bR_\ba_\bn_\bg_\be b(d);\n+522 mgc(levelContext, v, b);\n+523 }else\n+524 mgc(levelContext, v, d);\n+525 if(postSteps_==0||matrices_->maxlevels()==1)\n+526 levelContext.pinfo->copyOwnerToAll(v, v);\n+527 }\n+528\n+529 template\n+530 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\bW_\bi_\bt_\bh_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl(LevelContext&\n+levelContext)\n+531 {\n+532 levelContext.matrix = matrices_->matrices().finest();\n+533 levelContext.pinfo = matrices_->parallelInformation().finest();\n+534 levelContext.redist =\n+535 matrices_->redistributeInformation().begin();\n+536 levelContext.aggregates = matrices_->aggregatesMaps().begin();\n+537 levelContext.lhs = lhs_->finest();\n+538 levelContext.residual = residual_->finest();\n+539 levelContext.rhs = rhs_->finest();\n+540 levelContext.level=0;\n+541 }\n+542\n+543 template\n+544 bool FastAMG\n+545 ::moveToCoarseLevel(LevelContext& levelContext)\n+546 {\n+547 bool processNextLevel=true;\n+548\n+549 if(levelContext.redist->isSetup()) {\n+550 throw \"bla\";\n+551 levelContext.redist->redistribute(static_cast\n+(*levelContext.residual),\n+552 levelContext.residual.getRedistributed());\n+553 processNextLevel = levelContext.residual.getRedistributed().size()>0;\n+554 if(processNextLevel) {\n+555 //restrict defect to coarse level right hand side.\n+556 ++levelContext.pinfo;\n+557 Transfer\n+558 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,\n+559 static_cast(levelContext.residual.getRedistributed()),\n+560 *levelContext.pinfo);\n+561 }\n+562 }else{\n+563 //restrict defect to coarse level right hand side.\n+564 ++levelContext.rhs;\n+565 ++levelContext.pinfo;\n+566 Transfer\n+567 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,\n+568 static_cast(*levelContext.residual), *levelContext.pinfo);\n+569 }\n+570\n+571 if(processNextLevel) {\n+572 // prepare coarse system\n+573 ++levelContext.residual;\n+574 ++levelContext.lhs;\n+575 ++levelContext.matrix;\n+576 ++levelContext.level;\n+577 ++levelContext.redist;\n+578\n+579 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_-\n+>levels()maxlevels()) {\n+580 // next level is not the globally coarsest one\n+581 ++levelContext.aggregates;\n+582 }\n+583 // prepare the lhs on the next level\n+584 *levelContext.lhs=0;\n+585 *levelContext.residual=0;\n+586 }\n+587 return processNextLevel;\n+588 }\n+589\n+590 template\n+591 void FastAMG\n+592 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel,\n+Domain& x)\n+593 {\n+594 if(processNextLevel) {\n+595 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_-\n+>levels()maxlevels()) {\n+596 // previous level is not the globally coarsest one\n+597 --levelContext.aggregates;\n+598 }\n+599 --levelContext.redist;\n+600 --levelContext.level;\n+601 //prolongate and add the correction (update is in coarse left hand side)\n+602 --levelContext.matrix;\n+603 --levelContext.residual;\n+604\n+605 }\n+606\n+607 typename Hierarchy::Iterator coarseLhs = levelContext.lhs--;\n+608 if(levelContext.redist->isSetup()) {\n+609\n+610 // Need to redistribute during prolongate\n+611 Transfer\n+612 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,\n+613 levelContext.lhs.getRedistributed(),\n+614 matrices_->getProlongationDampingFactor(),\n+615 *levelContext.pinfo, *levelContext.redist);\n+616 }else{\n+617 Transfer\n+618 ::prolongateVector(*(*levelContext.aggregates), *coarseLhs, x,\n+619 matrices_->getProlongationDampingFactor(), *levelContext.pinfo);\n+620\n+621 // printvector(std::cout, *lhs, \"prolongated coarse grid correction\",\n+\"lhs\", 10, 10, 10);\n+622 }\n+623\n+624\n+625 if(processNextLevel) {\n+626 --levelContext.rhs;\n+627 }\n+628\n+629 }\n+630\n+631\n+632 template\n+633 void FastAMG\n+634 ::presmooth(LevelContext& levelContext, Domain& x, const Range& b)\n+635 {\n+636 constexpr auto bl = blockLevel();\n+637 _\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b<_\bb_\bl_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(levelContext.matrix->getmat(),\n+638 x,\n+639 *levelContext.residual,\n+640 b);\n+641 }\n+642\n+643 template\n+644 void FastAMG\n+645 ::postsmooth(LevelContext& levelContext, Domain& x, const Range& b)\n+646 {\n+647 constexpr auto bl = blockLevel();\n+648 GaussSeidelPostsmoothDefect\n+649 ::apply(levelContext.matrix->getmat(), x, *levelContext.residual, b);\n+650 }\n+651\n+652\n+653 template\n+_\b6_\b5_\b4 bool _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br() const\n+655 {\n+656 return _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be;\n+657 }\n+658\n+659 template\n+660 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bm_\bg_\bc(LevelContext& levelContext, Domain& v, const\n+Range& b){\n+661\n+662 if(levelContext.matrix == matrices_->matrices().coarsest() && levels\n+()==maxlevels()) {\n+663 // Solve directly\n+664 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt res;\n+665 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd=true; // If we do not compute this flag will not get updated\n+666 if(levelContext.redist->isSetup()) {\n+667 levelContext.redist->redistribute(b, levelContext.rhs.getRedistributed());\n+668 if(levelContext.rhs.getRedistributed().size()>0) {\n+669 // We are still participating in the computation\n+670 levelContext.pinfo.getRedistributed().copyOwnerToAll\n+(levelContext.rhs.getRedistributed(),\n+671 levelContext.rhs.getRedistributed());\n+672 solver_->apply(levelContext.lhs.getRedistributed(),\n+levelContext.rhs.getRedistributed(), res);\n+673 }\n+674 levelContext.redist->redistributeBackward(v,\n+levelContext.lhs.getRedistributed());\n+675 levelContext.pinfo->copyOwnerToAll(v, v);\n+676 }else{\n+677 levelContext.pinfo->copyOwnerToAll(b, b);\n+678 solver_->apply(v, const_cast(b), res);\n+679 }\n+680\n+681 // printvector(std::cout, *lhs, \"coarse level update\", \"u\", 10, 10, 10);\n+682 // printvector(std::cout, *rhs, \"coarse level rhs\", \"rhs\", 10, 10, 10);\n+683 if (!res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd)\n+684 coarsesolverconverged = false;\n+685 }else{\n+686 // presmoothing\n+687 _\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh(levelContext, v, b);\n+688 // printvector(std::cout, *lhs, \"update\", \"u\", 10, 10, 10);\n+689 // printvector(std::cout, *residual, \"post presmooth residual\", \"r\", 10);\n+690#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION\n+691 bool processNextLevel = moveToCoarseLevel(levelContext);\n+692\n+693 if(processNextLevel) {\n+694 // next level\n+695 for(std::size_t i=0; imatrices().finest()) {\n+705 coarsesolverconverged = matrices_->parallelInformation().finest()-\n+>communicator().prod(coarsesolverconverged);\n+706 if(!coarsesolverconverged)\n+707 DUNE_THROW(MathError, \"Coarse solver did not converge\");\n+708 }\n+709\n+710 _\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh(levelContext, v, b);\n+711 }\n+712 }\n+713\n+714\n+716 template\n+_\b7_\b1_\b7 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bp_\bo_\bs_\bt([[maybe_unused]] _\bD_\bo_\bm_\ba_\bi_\bn& x)\n+718 {\n+719 lhs_=nullptr;\n+720 rhs_=nullptr;\n+721 residual_=nullptr;\n+722 }\n+723\n+724 template\n+725 template\n+_\b7_\b2_\b6 void _\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs(std::vector& cont)\n+727 {\n+728 matrices_->getCoarsestAggregatesOnFinest(cont);\n+729 }\n+730\n+731 } // end namespace Amg\n+732} // end namespace Dune\n+733\n+734#endif\n+_\bi_\bo_\b._\bh_\bh\n+Some generic functions for pretty printing vectors and matrices.\n+_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh\n+Classes for using UMFPack with ISTL matrices.\n+_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh\n+Classes for using SuperLU with ISTL matrices.\n+_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\n+Define base class for scalar product and norm.\n+_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n+Implementations of the inverse operator interface.\n+_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n+Define general preconditioner interface.\n+_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n+Templates characterizing the type of a solver.\n+_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh\n+Provides a classes representing the hierarchies in AMG.\n+_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh\n+Prolongation and restriction for amg.\n+_\bf_\ba_\bs_\bt_\ba_\bm_\bg_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\n+_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\n+Classes for the generic construction and application of the smoothers.\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh\n+void presmooth(LevelContext &levelContext, size_t steps)\n+Apply pre smoothing on the current level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:406\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+const void * Arguments\n+A type holding all the arguments needed to call the constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< T > construct(Arguments &args)\n+Construct an object with the specified arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh\n+void postsmooth(LevelContext &levelContext, size_t steps)\n+Apply post smoothing on the current level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:428\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+int iterations\n+The number of iterations to perform.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:47\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n+OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix\n+The iterator over the matrices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:207\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs\n+void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)\n+Get the aggregate number of each unknown on the coarsest level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:726\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bp_\bi_\bn_\bf_\bo\n+ParallelInformationHierarchy::Iterator pinfo\n+The iterator over the parallel information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+void recalculateHierarchy()\n+Recalculate the matrix hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:173\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bp_\bo_\bs_\bt\n+void post(Domain &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:717\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs\n+std::size_t maxlevels()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:503\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n+X Domain\n+The domain type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\br_\be_\bs_\bi_\bd_\bu_\ba_\bl\n+Hierarchy< Domain, A >::Iterator residual\n+The iterator over the residuals.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:227\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:146\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy\n+The operator hierarchy type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt\n+OperatorHierarchy::RedistributeInfoList::const_iterator redist\n+The iterator over the redistribution information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:215\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be\n+X Range\n+The range type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:79\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+PI ParallelInformation\n+The type of the parallel information. Either OwnerOverlapCommunication or\n+another type describing the...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+M Operator\n+The matrix operator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs\n+std::size_t levels()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:498\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG\n+FastAMG(const Operator &fineOperator, const C &criterion, const Parameters\n+&parms=Parameters(), bool symmetric=true, const ParallelInformation\n+&pinfo=ParallelInformation())\n+Construct an AMG with an inexact coarse solver based on the smoother.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br\n+InverseOperator< X, X > CoarseSolver\n+the type of the coarse solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n+bool usesDirectCoarseLevelSolver() const\n+Check whether the coarse solver used is a direct solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:654\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bl_\bh_\bs\n+Hierarchy< Domain, A >::Iterator lhs\n+The iterator over the left hand side.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:223\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\br_\bh_\bs\n+Hierarchy< Range, A >::Iterator rhs\n+The iterator over the right hand sided.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:231\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bl_\be_\bv_\be_\bl\n+std::size_t level\n+The level index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:235\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(Domain &v, const Range &d)\n+Apply one step of the preconditioner to the system A(v)=d.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:510\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy\n+The parallal data distribution hierarchy type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bp_\br_\be\n+void pre(Domain &x, Range &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:449\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG\n+FastAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const\n+Parameters &parms, bool symmetric=true)\n+Construct a new amg with a specific coarse solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:320\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs\n+OperatorHierarchy::AggregatesMapList::const_iterator aggregates\n+The iterator over the aggregates maps.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:219\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:404\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+A generic dynamic dense matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< T >::field_type field_type\n+Export the type representing the underlying field.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:565\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::const_iterator ConstColIterator\n+Const iterator for the entries of each row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:589\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+T block_type\n+Export the type representing the components.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:568\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\ba_\bs_\bt_\bA_\bM_\bG\n+A fast (sequential) algebraic multigrid based on agglomeration that saves\n+memory bandwidth.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamg.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+static void apply(const M &A, X &x, Y &d, const Y &b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamgsmoother.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation\n+> Iterator\n+Type of the mutable iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator over the levels in the hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+The hierarchies build by the coarsening process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+All parameters for AMG.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+The default class for the smoother arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n+Sequential SSOR preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Base class for scalar product and norm computation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n+bool converged\n+True if convergence criterion has been met.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Abstract base class for all solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00173.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00173.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: solver.hh File Reference\n+dune-istl: dependency.hh File Reference\n \n \n \n \n \n \n \n@@ -65,77 +65,69 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n \n+ \n \n
    \n \n-

    Define general, extensible interface for inverse operators. \n+

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

    \n-
    #include <dune-istl-config.hh>
    \n-#include <iomanip>
    \n+
    #include <bitset>
    \n #include <ostream>
    \n-#include <string>
    \n-#include <functional>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/shared_ptr.hh>
    \n-#include <dune/common/simd/io.hh>
    \n-#include <dune/common/simd/simd.hh>
    \n-#include <dune/common/parametertree.hh>
    \n-#include <dune/common/timer.hh>
    \n-#include "solvertype.hh"
    \n-#include "preconditioner.hh"
    \n-#include "operators.hh"
    \n-#include "scalarproducts.hh"
    \n+#include "graph.hh"
    \n+#include "properties.hh"
    \n+#include <dune/common/propertymap.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n

    \n Classes

    struct  Dune::InverseOperatorResult
     Statistics about the application of an inverse operator. More...
    class  Dune::Amg::EdgeProperties
     Class representing the properties of an edge in the matrix graph. More...
     
    class  Dune::InverseOperator< X, Y >
     Abstract base class for all solvers. More...
    class  Dune::Amg::VertexProperties
     Class representing a node in the matrix graph. More...
     
    class  Dune::IterativeSolver< X, Y >
     Base class for all implementations of iterative solvers. More...
    class  Dune::Amg::PropertyGraphVertexPropertyMap< G, i >
     
    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...
    struct  Dune::PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >
     
    \n \n \n \n+\n+\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+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)
     
    \n

    Detailed Description

    \n-

    Define general, extensible interface for inverse operators.

    \n-

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

    \n+

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

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,63 +1,56 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-solver.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs\n-Define general, extensible interface for inverse operators. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+dependency.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Provides classes for initializing the link attributes of a matrix graph.\n+_\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n #include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \"_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\"\n-#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\"\n-#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n-#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n+#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n+#include \"_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b._\bh_\bh\"\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-\u00a0 Statistics about the application of an inverse operator. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+\u00a0 Class representing the properties of an edge in the matrix graph.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0 Abstract base class for all solvers. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+\u00a0 Class representing a node in the matrix graph. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0 Base class for all implementations of iterative solvers. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b<_\b _\bG_\b,_\b _\bi_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bC_\bo_\bu_\bn_\bt_\bT_\by_\bp_\be_\b _\b>\n-\u00a0 Class for controlling iterative methods. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b,_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b _\b>\n- Helper class for notifying a DUNE-ISTL linear solver about a change of\n-\u00a0 the iteration matrix object in a unified way, i.e. independent from\n- the solver's type (direct/iterative). _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b,_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b _\b>_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b<\n- _\bi_\bs_\b__\bd_\bi_\br_\be_\bc_\bt_\b__\bs_\bo_\bl_\bv_\be_\br_\b,_\b _\bD_\bu_\bm_\bm_\by_\b _\b>\n-\u00a0 _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn that works together with iterative _\bI_\bS_\bT_\bL solvers, e.g.\n- _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br or _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bi_\bC_\bG_\bS_\bT_\bA_\bB_\bS_\bo_\bl_\bv_\be_\br. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b,_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b _\b>_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b<\n- _\bt_\br_\bu_\be_\b,_\b _\bD_\bu_\bm_\bm_\by_\b _\b>\n-\u00a0 _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn that works together with direct _\bI_\bS_\bT_\bL solvers, e.g.\n- _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU or _\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\by_\bp_\be_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg_\b,_\b _\bA_\bm_\bg_\b:_\b:\n+ _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,_\b _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b,_\b _\bE_\bP_\b,_\b _\bV_\bM_\b,_\b _\bE_\bM_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+ PropertyMapTypeSelector< _\bA_\bm_\bg_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg, _\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh< _\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt (const _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n+ G, _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs, EP, VM, EM > &tag, _\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh< G, _\bA_\bm_\bg_\b:_\b:\n+ >::Type\u00a0 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs, EP, VM, EM > &graph)\n+\u00a0\n+ std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream\n+ &os, const _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs &props)\n+\u00a0\n+ std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream\n+ &os, const _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs &props)\n+\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Define general, extensible interface for inverse operators.\n-Implementation here covers only inversion of linear operators, but the\n-implementation might be used for nonlinear operators as well.\n+Provides classes for initializing the link attributes of a matrix graph.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00173_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00173_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: solver.hh Source File\n+dune-istl: dependency.hh Source File\n \n \n \n \n \n \n \n@@ -70,501 +70,490 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    solver.hh
    \n+
    dependency.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5
    \n-
    6#ifndef DUNE_ISTL_SOLVER_HH
    \n-
    7#define DUNE_ISTL_SOLVER_HH
    \n+
    5#ifndef DUNE_AMG_DEPENDENCY_HH
    \n+
    6#define DUNE_AMG_DEPENDENCY_HH
    \n+
    7
    \n
    8
    \n-
    9#include <dune-istl-config.hh> // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n-
    10
    \n-
    11#include <iomanip>
    \n-
    12#include <ostream>
    \n-
    13#include <string>
    \n-
    14#include <functional>
    \n+
    9#include <bitset>
    \n+
    10#include <ostream>
    \n+
    11
    \n+
    12#include "graph.hh"
    \n+
    13#include "properties.hh"
    \n+
    14#include <dune/common/propertymap.hh>
    \n
    15
    \n-
    16#include <dune/common/exceptions.hh>
    \n-
    17#include <dune/common/shared_ptr.hh>
    \n-
    18#include <dune/common/simd/io.hh>
    \n-
    19#include <dune/common/simd/simd.hh>
    \n-
    20#include <dune/common/parametertree.hh>
    \n-
    21#include <dune/common/timer.hh>
    \n-
    22
    \n-
    23#include "solvertype.hh"
    \n-
    24#include "preconditioner.hh"
    \n-
    25#include "operators.hh"
    \n-
    26#include "scalarproducts.hh"
    \n-
    27
    \n-
    28namespace Dune
    \n-
    29{
    \n-
    \n-\n-
    50 {
    \n-
    \n-\n-
    53 {
    \n-
    54 clear();
    \n-
    55 }
    \n-
    \n-
    56
    \n-
    \n-
    58 void clear ()
    \n-
    59 {
    \n-
    60 iterations = 0;
    \n-
    61 reduction = 0;
    \n-
    62 converged = false;
    \n-
    63 conv_rate = 1;
    \n-
    64 elapsed = 0;
    \n-\n-
    66 }
    \n-
    \n-
    67
    \n-\n+
    16
    \n+
    17namespace Dune
    \n+
    18{
    \n+
    19 namespace Amg
    \n+
    20 {
    \n+
    \n+\n+
    39 {
    \n+
    40 friend std::ostream& operator<<(std::ostream& os, const EdgeProperties& props);
    \n+
    41 public:
    \n+\n+
    44
    \n+
    45 private:
    \n+
    46
    \n+
    47 std::bitset<SIZE> flags_;
    \n+
    48 public:
    \n+\n+
    51
    \n+
    53 std::bitset<SIZE>::reference operator[](std::size_t v);
    \n+
    54
    \n+
    56 bool operator[](std::size_t v) const;
    \n+
    57
    \n+
    63 bool depends() const;
    \n+
    64
    \n+
    69 void setDepends();
    \n
    70
    \n-
    72 double reduction;
    \n-
    73
    \n-\n-
    76
    \n-
    78 double conv_rate;
    \n-
    79
    \n-
    81 double condition_estimate = -1;
    \n-
    82
    \n-
    84 double elapsed;
    \n-
    85 };
    \n-
    \n+
    74 void resetDepends();
    \n+
    75
    \n+
    80 bool influences() const;
    \n+
    81
    \n+
    85 void setInfluences();
    \n
    86
    \n-
    87
    \n-
    88 //=====================================================================
    \n-
    100 template<class X, class Y>
    \n-
    \n-\n-
    102 public:
    \n-
    104 typedef X domain_type;
    \n-
    105
    \n-
    107 typedef Y range_type;
    \n-
    108
    \n-
    110 typedef typename X::field_type field_type;
    \n-
    111
    \n-
    113 typedef typename FieldTraits<field_type>::real_type real_type;
    \n+
    90 void resetInfluences();
    \n+
    91
    \n+
    96 bool isOneWay() const;
    \n+
    97
    \n+
    102 bool isTwoWay() const;
    \n+
    103
    \n+
    108 bool isStrong() const;
    \n+
    109
    \n+
    113 void reset();
    \n
    114
    \n-
    116 typedef Simd::Scalar<real_type> scalar_real_type;
    \n-
    117
    \n-
    130 virtual void apply (X& x, Y& b, InverseOperatorResult& res) = 0;
    \n+
    118 void printFlags() const;
    \n+
    119 };
    \n+
    \n+
    120
    \n+
    \n+\n+
    127 friend std::ostream& operator<<(std::ostream& os, const VertexProperties& props);
    \n+
    128 public:
    \n+\n+
    130 private:
    \n
    131
    \n-
    145 virtual void apply (X& x, Y& b, double reduction, InverseOperatorResult& res) = 0;
    \n-
    146
    \n-\n-
    149#ifdef DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n-
    150 {
    \n-
    151 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method in a derived classes, in the future this method will pure virtual.");
    \n-
    152 }
    \n-
    153#else
    \n-
    154 = 0;
    \n-
    155#endif
    \n-
    156
    \n-
    158 virtual ~InverseOperator () {}
    \n-
    159
    \n-
    160 protected:
    \n-
    161 // spacing values
    \n-
    162 enum { iterationSpacing = 5 , normSpacing = 16 };
    \n-
    163
    \n-
    \n-
    165 void printHeader(std::ostream& s) const
    \n-
    166 {
    \n-
    167 s << std::setw(iterationSpacing) << " Iter";
    \n-
    168 s << std::setw(normSpacing) << "Defect";
    \n-
    169 s << std::setw(normSpacing) << "Rate" << std::endl;
    \n-
    170 }
    \n-
    \n-
    171
    \n-
    173 template <typename CountType, typename DataType>
    \n-
    \n-
    174 void printOutput(std::ostream& s,
    \n-
    175 const CountType& iter,
    \n-
    176 const DataType& norm,
    \n-
    177 const DataType& norm_old) const
    \n-
    178 {
    \n-
    179 const DataType rate = norm/norm_old;
    \n-
    180 s << std::setw(iterationSpacing) << iter << " ";
    \n-
    181 s << std::setw(normSpacing) << Simd::io(norm) << " ";
    \n-
    182 s << std::setw(normSpacing) << Simd::io(rate) << std::endl;
    \n-
    183 }
    \n-
    \n-
    184
    \n-
    186 template <typename CountType, typename DataType>
    \n-
    \n-
    187 void printOutput(std::ostream& s,
    \n-
    188 const CountType& iter,
    \n-
    189 const DataType& norm) const
    \n-
    190 {
    \n-
    191 s << std::setw(iterationSpacing) << iter << " ";
    \n-
    192 s << std::setw(normSpacing) << Simd::io(norm) << std::endl;
    \n-
    193 }
    \n-
    \n-
    194 };
    \n-
    \n-
    195
    \n-
    204 template<class X, class Y>
    \n-
    \n-
    205 class IterativeSolver : public InverseOperator<X,Y>{
    \n-
    206 public:
    \n-\n-\n-\n-
    210 using typename InverseOperator<X,Y>::real_type;
    \n-\n-
    212
    \n-
    \n-
    232 IterativeSolver (const LinearOperator<X,Y>& op, Preconditioner<X,Y>& prec, scalar_real_type reduction, int maxit, int verbose) :
    \n-
    233 _op(stackobject_to_shared_ptr(op)),
    \n-
    234 _prec(stackobject_to_shared_ptr(prec)),
    \n-
    235 _sp(new SeqScalarProduct<X>),
    \n-
    236 _reduction(reduction), _maxit(maxit), _verbose(verbose), _category(SolverCategory::sequential)
    \n-
    237 {
    \n-\n-
    239 DUNE_THROW(InvalidSolverCategory, "LinearOperator has to be sequential!");
    \n-\n-
    241 DUNE_THROW(InvalidSolverCategory, "Preconditioner has to be sequential!");
    \n-
    242 }
    \n-
    \n-
    243
    \n-
    \n-\n-
    265 scalar_real_type reduction, int maxit, int verbose) :
    \n-
    266 _op(stackobject_to_shared_ptr(op)),
    \n-
    267 _prec(stackobject_to_shared_ptr(prec)),
    \n-
    268 _sp(stackobject_to_shared_ptr(sp)),
    \n-
    269 _reduction(reduction), _maxit(maxit), _verbose(verbose), _category(SolverCategory::category(op))
    \n-
    270 {
    \n-\n-
    272 DUNE_THROW(InvalidSolverCategory, "LinearOperator and Preconditioner must have the same SolverCategory!");
    \n-\n-
    274 DUNE_THROW(InvalidSolverCategory, "LinearOperator and ScalarProduct must have the same SolverCategory!");
    \n-
    275 }
    \n-
    \n-
    276
    \n-
    \n-
    292 IterativeSolver (std::shared_ptr<const LinearOperator<X,Y> > op, std::shared_ptr<Preconditioner<X,X> > prec, const ParameterTree& configuration) :
    \n-
    293 IterativeSolver(op,std::make_shared<SeqScalarProduct<X>>(),prec,
    \n-
    294 configuration.get<real_type>("reduction"),
    \n-
    295 configuration.get<int>("maxit"),
    \n-
    296 configuration.get<int>("verbose"))
    \n-
    297 {}
    \n+
    133 std::bitset<SIZE> flags_;
    \n+
    134
    \n+
    135 public:
    \n+\n+
    138
    \n+
    140 std::bitset<SIZE>::reference operator[](std::size_t v);
    \n+
    141
    \n+
    143 bool operator[](std::size_t v) const;
    \n+
    144
    \n+
    151 void setIsolated();
    \n+
    152
    \n+
    156 bool isolated() const;
    \n+
    157
    \n+
    161 void resetIsolated();
    \n+
    162
    \n+
    166 void setVisited();
    \n+
    167
    \n+
    171 bool visited() const;
    \n+
    172
    \n+
    176 void resetVisited();
    \n+
    177
    \n+
    181 void setFront();
    \n+
    182
    \n+
    186 bool front() const;
    \n+
    187
    \n+
    191 void resetFront();
    \n+
    192
    \n+
    196 void setExcludedBorder();
    \n+
    197
    \n+
    202 bool excludedBorder() const;
    \n+
    203
    \n+
    207 void resetExcludedBorder();
    \n+
    208
    \n+
    212 void reset();
    \n+
    213
    \n+
    214 };
    \n+
    \n+
    215
    \n+
    216 template<typename G, std::size_t i>
    \n+
    \n+\n+
    218 : public RAPropertyMapHelper<typename std::bitset<VertexProperties::SIZE>::reference,
    \n+
    219 PropertyGraphVertexPropertyMap<G,i> >
    \n+
    220 {
    \n+
    221 public:
    \n+
    222
    \n+
    223 typedef ReadWritePropertyMapTag Category;
    \n+
    224
    \n+
    225 enum {
    \n+
    227 index = i
    \n+
    228 };
    \n+
    229
    \n+
    233 typedef G Graph;
    \n+
    234
    \n+
    238 typedef std::bitset<VertexProperties::SIZE> BitSet;
    \n+
    239
    \n+
    243 typedef typename BitSet::reference Reference;
    \n+
    244
    \n+
    248 typedef bool ValueType;
    \n+
    249
    \n+
    253 typedef typename G::VertexDescriptor Vertex;
    \n+
    254
    \n+
    \n+\n+
    260 : graph_(&g)
    \n+
    261 {}
    \n+
    \n+
    262
    \n+
    \n+\n+
    267 : graph_(0)
    \n+
    268 {}
    \n+
    \n+
    269
    \n+
    270
    \n+
    \n+
    275 Reference operator[](const Vertex& vertex) const
    \n+
    276 {
    \n+
    277 return graph_->getVertexProperties(vertex)[index];
    \n+
    278 }
    \n+
    \n+
    279 private:
    \n+
    280 Graph* graph_;
    \n+
    281 };
    \n+
    \n+
    282
    \n+
    283 } // end namespace Amg
    \n+
    284
    \n+
    285 template<typename G, typename EP, typename VM, typename EM>
    \n+
    \n+
    286 struct PropertyMapTypeSelector<Amg::VertexVisitedTag,Amg::PropertiesGraph<G,Amg::VertexProperties,EP,VM,EM> >
    \n+
    287 {
    \n+\n+
    289 };
    \n+
    \n+
    290
    \n+
    291 template<typename G, typename EP, typename VM, typename EM>
    \n+
    292 typename PropertyMapTypeSelector<Amg::VertexVisitedTag,Amg::PropertiesGraph<G,Amg::VertexProperties,EP,VM,EM> >::Type
    \n+\n+
    297
    \n+
    298 namespace Amg
    \n+
    299 {
    \n+
    \n+
    300 inline std::ostream& operator<<(std::ostream& os, const EdgeProperties& props)
    \n+
    301 {
    \n+
    302 return os << props.flags_;
    \n+
    303 }
    \n+
    \n+
    304
    \n+
    \n+\n+
    306 : flags_()
    \n+
    307 {}
    \n+
    \n+
    308
    \n+
    309 inline std::bitset<EdgeProperties::SIZE>::reference
    \n+
    \n+\n+
    311 {
    \n+
    312 return flags_[v];
    \n+
    313 }
    \n
    \n-
    298
    \n+
    314
    \n
    \n-
    315 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) :
    \n-
    316 IterativeSolver(op,sp,prec,
    \n-
    317 configuration.get<scalar_real_type>("reduction"),
    \n-
    318 configuration.get<int>("maxit"),
    \n-
    319 configuration.get<int>("verbose"))
    \n-
    320 {}
    \n-
    \n-
    321
    \n-
    \n-
    342 IterativeSolver (std::shared_ptr<const LinearOperator<X,Y>> op,
    \n-
    343 std::shared_ptr<const ScalarProduct<X>> sp,
    \n-
    344 std::shared_ptr<Preconditioner<X,Y>> prec,
    \n-
    345 scalar_real_type reduction, int maxit, int verbose) :
    \n-
    346 _op(op),
    \n-
    347 _prec(prec),
    \n-
    348 _sp(sp),
    \n-
    349 _reduction(reduction), _maxit(maxit), _verbose(verbose),
    \n-\n-
    351 {
    \n-\n-
    353 DUNE_THROW(InvalidSolverCategory, "LinearOperator and Preconditioner must have the same SolverCategory!");
    \n-\n-
    355 DUNE_THROW(InvalidSolverCategory, "LinearOperator and ScalarProduct must have the same SolverCategory!");
    \n+
    315 inline bool EdgeProperties::operator[](std::size_t i) const
    \n+
    316 {
    \n+
    317 return flags_[i];
    \n+
    318 }
    \n+
    \n+
    319
    \n+
    \n+\n+
    321 {
    \n+
    322 flags_.reset();
    \n+
    323 }
    \n+
    \n+
    324
    \n+
    \n+\n+
    326 {
    \n+
    327 // Set the INFLUENCE bit
    \n+
    328 //flags_ |= (1<<INFLUENCE);
    \n+
    329 flags_.set(INFLUENCE);
    \n+
    330 }
    \n+
    \n+
    331
    \n+
    \n+
    332 inline bool EdgeProperties::influences() const
    \n+
    333 {
    \n+
    334 // Test the INFLUENCE bit
    \n+
    335 return flags_.test(INFLUENCE);
    \n+
    336 }
    \n+
    \n+
    337
    \n+
    \n+\n+
    339 {
    \n+
    340 // Set the first bit.
    \n+
    341 //flags_ |= (1<<DEPEND);
    \n+
    342 flags_.set(DEPEND);
    \n+
    343 }
    \n+
    \n+
    344
    \n+
    \n+\n+
    346 {
    \n+
    347 // reset the first bit.
    \n+
    348 //flags_ &= ~(1<<DEPEND);
    \n+
    349 flags_.reset(DEPEND);
    \n+
    350 }
    \n+
    \n+
    351
    \n+
    \n+
    352 inline bool EdgeProperties::depends() const
    \n+
    353 {
    \n+
    354 // Return the first bit.
    \n+
    355 return flags_.test(DEPEND);
    \n
    356 }
    \n
    \n
    357
    \n-
    358 // #warning actually we want to have this as the default and just implement the second one
    \n-
    359 // //! \\copydoc InverseOperator::apply(X&,Y&,InverseOperatorResult&)
    \n-
    360 // virtual void apply (X& x, Y& b, InverseOperatorResult& res)
    \n-
    361 // {
    \n-
    362 // apply(x,b,_reduction,res);
    \n-
    363 // }
    \n-
    364
    \n-
    365#ifndef DOXYGEN
    \n-
    366 // make sure the three-argument apply from the base class does not get shadowed
    \n-
    367 // by the redefined four-argument version below
    \n-
    368 using InverseOperator<X,Y>::apply;
    \n-
    369#endif
    \n+
    \n+\n+
    359 {
    \n+
    360 // reset the second bit.
    \n+
    361 flags_ &= ~(1<<INFLUENCE);
    \n+
    362 }
    \n+
    \n+
    363
    \n+
    \n+
    364 inline bool EdgeProperties::isOneWay() const
    \n+
    365 {
    \n+
    366 // Test whether only the first bit is set
    \n+
    367 //return isStrong() && !isTwoWay();
    \n+
    368 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND)))==(1<<DEPEND);
    \n+
    369 }
    \n+
    \n
    370
    \n-
    \n-
    376 virtual void apply (X& x, X& b, double reduction, InverseOperatorResult& res)
    \n-
    377 {
    \n-
    378 scalar_real_type saved_reduction = _reduction;
    \n-
    379 _reduction = reduction;
    \n-
    380 this->apply(x,b,res);
    \n-
    381 _reduction = saved_reduction;
    \n-
    382 }
    \n+
    \n+
    371 inline bool EdgeProperties::isTwoWay() const
    \n+
    372 {
    \n+
    373 // Test whether the first and second bit is set
    \n+
    374 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND)))==((1<<INFLUENCE)|(1<<DEPEND));
    \n+
    375 }
    \n+
    \n+
    376
    \n+
    \n+
    377 inline bool EdgeProperties::isStrong() const
    \n+
    378 {
    \n+
    379 // Test whether the first or second bit is set
    \n+
    380 return ((flags_) & std::bitset<SIZE>((1<<INFLUENCE)|(1<<DEPEND))).to_ulong();
    \n+
    381 }
    \n
    \n+
    382
    \n
    383
    \n-
    \n-\n-
    386 {
    \n-
    387 return _category;
    \n-
    388 }
    \n-
    \n-
    389
    \n-
    \n-
    390 std::string name() const{
    \n-
    391 std::string name = className(*this);
    \n-
    392 return name.substr(0, name.find("<"));
    \n-
    393 }
    \n-
    \n-
    394
    \n-
    412 template<class CountType = unsigned int>
    \n-
    \n-
    413 class Iteration {
    \n-
    414 public:
    \n+
    \n+
    384 inline std::ostream& operator<<(std::ostream& os, const VertexProperties& props)
    \n+
    385 {
    \n+
    386 return os << props.flags_;
    \n+
    387 }
    \n+
    \n+
    388
    \n+
    \n+\n+
    390 : flags_()
    \n+
    391 {}
    \n+
    \n+
    392
    \n+
    393
    \n+
    394 inline std::bitset<VertexProperties::SIZE>::reference
    \n+
    \n+\n+
    396 {
    \n+
    397 return flags_[v];
    \n+
    398 }
    \n+
    \n+
    399
    \n+
    \n+
    400 inline bool VertexProperties::operator[](std::size_t v) const
    \n+
    401 {
    \n+
    402 return flags_[v];
    \n+
    403 }
    \n+
    \n+
    404
    \n+
    \n+\n+
    406 {
    \n+
    407 flags_.set(ISOLATED);
    \n+
    408 }
    \n+
    \n+
    409
    \n+
    \n+
    410 inline bool VertexProperties::isolated() const
    \n+
    411 {
    \n+
    412 return flags_.test(ISOLATED);
    \n+
    413 }
    \n+
    \n+
    414
    \n
    \n-\n-
    416 : _i(0)
    \n-
    417 , _res(res)
    \n-
    418 , _parent(parent)
    \n-
    419 , _valid(true)
    \n-
    420 {
    \n-
    421 res.clear();
    \n-
    422 if(_parent._verbose>0){
    \n-
    423 std::cout << "=== " << parent.name() << std::endl;
    \n-
    424 if(_parent._verbose > 1)
    \n-
    425 _parent.printHeader(std::cout);
    \n-
    426 }
    \n-
    427 }
    \n+\n+
    416 {
    \n+
    417 flags_.reset(ISOLATED);
    \n+
    418 }
    \n+
    \n+
    419
    \n+
    \n+\n+
    421 {
    \n+
    422 flags_.set(VISITED);
    \n+
    423 }
    \n+
    \n+
    424
    \n+
    \n+
    425 inline bool VertexProperties::visited() const
    \n+
    426 {
    \n+
    427 return flags_.test(VISITED);
    \n+
    428 }
    \n
    \n-
    428
    \n-
    429 Iteration(const Iteration&) = delete;
    \n+
    429
    \n
    \n-\n-
    431 : _def0(other._def0)
    \n-
    432 , _def(other._def)
    \n-
    433 , _i(other._i)
    \n-
    434 , _watch(other._watch)
    \n-
    435 , _res(other._res)
    \n-
    436 , _parent(other._parent)
    \n-
    437 , _valid(other._valid)
    \n-
    438 {
    \n-
    439 other._valid = false;
    \n-
    440 }
    \n-
    \n-
    441
    \n-
    \n-\n-
    443 if(_valid)
    \n-
    444 finalize();
    \n-
    445 }
    \n-
    \n-
    446
    \n-
    \n-
    457 bool step(CountType i, real_type def){
    \n-
    458 if (!Simd::allTrue(isFinite(def))) // check for inf or NaN
    \n-
    459 {
    \n-
    460 if (_parent._verbose>0)
    \n-
    461 std::cout << "=== " << _parent.name() << ": abort due to infinite or NaN defect"
    \n-
    462 << std::endl;
    \n-
    463 DUNE_THROW(SolverAbort,
    \n-
    464 _parent.name() << ": defect=" << Simd::io(def)
    \n-
    465 << " is infinite or NaN");
    \n-
    466 }
    \n-
    467 if(i == 0)
    \n-
    468 _def0 = def;
    \n-
    469 if(_parent._verbose > 1){
    \n-
    470 if(i!=0)
    \n-
    471 _parent.printOutput(std::cout,i,def,_def);
    \n-
    472 else
    \n-
    473 _parent.printOutput(std::cout,i,def);
    \n-
    474 }
    \n-
    475 _def = def;
    \n-
    476 _i = i;
    \n-
    477 _res.converged = (Simd::allTrue(def<_def0*_parent._reduction || def<real_type(1E-30))); // convergence check
    \n-
    478 return _res.converged;
    \n-
    479 }
    \n-
    \n-
    480
    \n-
    481 protected:
    \n-
    \n-
    482 void finalize(){
    \n-
    483 _res.converged = (Simd::allTrue(_def<_def0*_parent._reduction || _def<real_type(1E-30)));
    \n-\n-
    485 _res.reduction = static_cast<double>(Simd::max(_def/_def0));
    \n-
    486 _res.conv_rate = pow(_res.reduction,1.0/_i);
    \n-
    487 _res.elapsed = _watch.elapsed();
    \n-
    488 if (_parent._verbose>0) // final print
    \n-
    489 {
    \n-
    490 std::cout << "=== rate=" << _res.conv_rate
    \n-
    491 << ", T=" << _res.elapsed
    \n-
    492 << ", TIT=" << _res.elapsed/_res.iterations
    \n-
    493 << ", IT=" << _res.iterations << std::endl;
    \n-
    494 }
    \n-
    495 }
    \n-
    \n-
    496
    \n-
    497 real_type _def0 = 0.0, _def = 0.0;
    \n-
    498 CountType _i;
    \n-
    499 Timer _watch;
    \n-\n-\n-
    502 bool _valid;
    \n-
    503 };
    \n-
    \n-
    504
    \n-
    505 protected:
    \n-
    506 std::shared_ptr<const LinearOperator<X,Y>> _op;
    \n-
    507 std::shared_ptr<Preconditioner<X,Y>> _prec;
    \n-
    508 std::shared_ptr<const ScalarProduct<X>> _sp;
    \n-\n-\n-\n-\n-
    513 };
    \n-
    \n-
    514
    \n-
    522 template <typename ISTLLinearSolver, typename BCRSMatrix>
    \n-
    \n-\n-
    524 {
    \n-
    525 public:
    \n-
    \n-
    526 static void setMatrix (ISTLLinearSolver& solver,
    \n-
    527 const BCRSMatrix& matrix)
    \n-
    528 {
    \n-
    529 static const bool is_direct_solver
    \n-\n-\n-\n-
    533 }
    \n-
    \n-
    534
    \n-
    535 protected:
    \n-
    540 template <bool is_direct_solver, typename Dummy = void>
    \n-
    \n-\n-
    542 {
    \n-
    \n-
    543 static void setMatrix (ISTLLinearSolver&,
    \n-
    544 const BCRSMatrix&)
    \n-
    545 {}
    \n-
    \n-
    546 };
    \n-
    \n-
    547
    \n-
    552 template <typename Dummy>
    \n-
    \n-
    553 struct Implementation<true,Dummy>
    \n-
    554 {
    \n-
    \n-
    555 static void setMatrix (ISTLLinearSolver& solver,
    \n-
    556 const BCRSMatrix& matrix)
    \n-
    557 {
    \n-
    558 solver.setMatrix(matrix);
    \n-
    559 }
    \n-
    \n-
    560 };
    \n-
    \n-
    561 };
    \n-
    \n-
    562
    \n-
    566}
    \n-
    567
    \n-
    568#endif
    \n-
    Define base class for scalar product and norm.
    \n-\n-
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n-
    Templates characterizing the type of a solver.
    \n-
    STL namespace.
    \n+\n+
    431 {
    \n+
    432 flags_.reset(VISITED);
    \n+
    433 }
    \n+
    \n+
    434
    \n+
    \n+\n+
    436 {
    \n+
    437 flags_.set(FRONT);
    \n+
    438 }
    \n+
    \n+
    439
    \n+
    \n+
    440 inline bool VertexProperties::front() const
    \n+
    441 {
    \n+
    442 return flags_.test(FRONT);
    \n+
    443 }
    \n+
    \n+
    444
    \n+
    \n+\n+
    446 {
    \n+
    447 flags_.reset(FRONT);
    \n+
    448 }
    \n+
    \n+
    449
    \n+
    \n+\n+
    451 {
    \n+
    452 flags_.set(BORDER);
    \n+
    453 }
    \n+
    \n+
    454
    \n+
    \n+\n+
    456 {
    \n+
    457 return flags_.test(BORDER);
    \n+
    458 }
    \n+
    \n+
    459
    \n+
    \n+\n+
    461 {
    \n+
    462 flags_.reset(BORDER);
    \n+
    463 }
    \n+
    \n+
    464
    \n+
    \n+\n+
    466 {
    \n+
    467 flags_.reset();
    \n+
    468 }
    \n+
    \n+
    469
    \n+
    471 }
    \n+
    472}
    \n+
    473#endif
    \n+
    Provides classes for building the matrix graph.
    \n+
    Provides classes for handling internal properties in a graph.
    \n+
    bool depends() const
    Checks whether the vertex the edge points to depends on the vertex the edge starts.
    Definition dependency.hh:352
    \n+
    void resetFront()
    Resets the front node flag.
    Definition dependency.hh:445
    \n+
    std::bitset< VertexProperties::SIZE > BitSet
    The type of the bitset.
    Definition dependency.hh:238
    \n+
    bool isolated() const
    Checks whether the node is isolated.
    Definition dependency.hh:410
    \n+
    bool ValueType
    The value type.
    Definition dependency.hh:248
    \n+
    friend std::ostream & operator<<(std::ostream &os, const VertexProperties &props)
    Definition dependency.hh:384
    \n+
    BitSet::reference Reference
    The reference type.
    Definition dependency.hh:243
    \n+
    bool isTwoWay() const
    Checks whether the edge is two way. I.e. both the influence flag and the depends flag are that.
    Definition dependency.hh:371
    \n+
    void setInfluences()
    Marks the edge as one of which the start vertex by the end vertex.
    Definition dependency.hh:325
    \n+
    VertexProperties()
    Constructor.
    Definition dependency.hh:389
    \n+
    void setDepends()
    Marks the edge as one of which the end point depends on the starting point.
    Definition dependency.hh:338
    \n+
    PropertyGraphVertexPropertyMap()
    Default constructor.
    Definition dependency.hh:266
    \n+
    PropertyGraphVertexPropertyMap(G &g)
    Constructor.
    Definition dependency.hh:259
    \n+
    G::VertexDescriptor Vertex
    The vertex descriptor.
    Definition dependency.hh:253
    \n+
    void resetExcludedBorder()
    Marks the vertex as included in the aggregation.
    Definition dependency.hh:460
    \n+
    void setFront()
    Marks the node as belonging to the current clusters front.
    Definition dependency.hh:435
    \n+
    void reset()
    Reset all flags.
    Definition dependency.hh:465
    \n+
    void setVisited()
    Mark the node as already visited.
    Definition dependency.hh:420
    \n+
    EdgeProperties()
    Constructor.
    Definition dependency.hh:305
    \n+
    void resetInfluences()
    Resets the influence flag.
    Definition dependency.hh:358
    \n+
    G Graph
    The type of the graph with internal properties.
    Definition dependency.hh:233
    \n+
    std::bitset< SIZE >::reference operator[](std::size_t v)
    Access the bits directly.
    Definition dependency.hh:395
    \n+
    void printFlags() const
    Prints the attributes of the edge for debugging.
    \n+
    friend std::ostream & operator<<(std::ostream &os, const EdgeProperties &props)
    Definition dependency.hh:300
    \n+
    Amg::PropertyGraphVertexPropertyMap< Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM >, Amg::VertexProperties::VISITED > Type
    Definition dependency.hh:288
    \n+
    bool influences() const
    Checks whether the start vertex is influenced by the end vertex.
    Definition dependency.hh:332
    \n+
    void setIsolated()
    Marks that node as being isolated.
    Definition dependency.hh:405
    \n+
    bool excludedBorder() const
    Tests whether the vertex is excluded from the aggregation.
    Definition dependency.hh:455
    \n+
    void resetVisited()
    Resets the visited flag.
    Definition dependency.hh:430
    \n+
    bool visited() const
    Checks whether the node is marked as visited.
    Definition dependency.hh:425
    \n+
    Reference operator[](const Vertex &vertex) const
    Get the properties associated to a vertex.
    Definition dependency.hh:275
    \n+
    void reset()
    Reset all flags.
    Definition dependency.hh:320
    \n+
    void resetDepends()
    Resets the depends flag.
    Definition dependency.hh:345
    \n+
    ReadWritePropertyMapTag Category
    Definition dependency.hh:223
    \n+
    void resetIsolated()
    Resets the isolated flag.
    Definition dependency.hh:415
    \n+
    std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T > &criterion)
    Definition aggregates.hh:113
    \n+
    bool isStrong() const
    Checks whether the edge is strong. I.e. the influence or depends flag is set.
    Definition dependency.hh:377
    \n+
    bool front() const
    Checks whether the node is marked as a front node.
    Definition dependency.hh:440
    \n+
    std::bitset< SIZE >::reference operator[](std::size_t v)
    Access the bits directly.
    Definition dependency.hh:310
    \n+
    void setExcludedBorder()
    Marks the vertex as excluded from the aggregation.
    Definition dependency.hh:450
    \n+
    bool isOneWay() const
    Checks whether the edge is one way. I.e. either the influence or the depends flag but is set.
    Definition dependency.hh:364
    \n+
    @ index
    the index to access in the bitset.
    Definition dependency.hh:227
    \n+
    @ VISITED
    Definition dependency.hh:129
    \n+
    @ ISOLATED
    Definition dependency.hh:129
    \n+
    @ SIZE
    Definition dependency.hh:129
    \n+
    @ BORDER
    Definition dependency.hh:129
    \n+
    @ FRONT
    Definition dependency.hh:129
    \n+
    @ DEPEND
    Definition dependency.hh:43
    \n+
    @ SIZE
    Definition dependency.hh:43
    \n+
    @ INFLUENCE
    Definition dependency.hh:43
    \n
    Definition allocator.hh:11
    \n
    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
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    Thrown when a solver aborts due to some problem.
    Definition istlexception.hh:46
    \n-
    A linear operator.
    Definition operators.hh:69
    \n-
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n-
    Base class for scalar product and norm computation.
    Definition scalarproducts.hh:52
    \n-
    Default implementation for the scalar case.
    Definition scalarproducts.hh:168
    \n-
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n-
    InverseOperatorResult()
    Default constructor.
    Definition solver.hh:52
    \n-
    double condition_estimate
    Estimate of condition number.
    Definition solver.hh:81
    \n-
    double elapsed
    Elapsed time in seconds.
    Definition solver.hh:84
    \n-
    int iterations
    Number of iterations.
    Definition solver.hh:69
    \n-
    double reduction
    Reduction achieved: .
    Definition solver.hh:72
    \n-
    void clear()
    Resets all data.
    Definition solver.hh:58
    \n-
    double conv_rate
    Convergence rate (average reduction per step)
    Definition solver.hh:78
    \n-
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n-
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n-
    void printHeader(std::ostream &s) const
    helper function for printing header of solver output
    Definition solver.hh:165
    \n-
    virtual ~InverseOperator()
    Destructor.
    Definition solver.hh:158
    \n-
    void printOutput(std::ostream &s, const CountType &iter, const DataType &norm) const
    helper function for printing solver output
    Definition solver.hh:187
    \n-
    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:174
    \n-
    virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)=0
    apply inverse operator, with given convergence criteria.
    \n-
    Simd::Scalar< real_type > scalar_real_type
    scalar type underlying the field_type
    Definition solver.hh:116
    \n-
    Y range_type
    Type of the range of the operator to be inverted.
    Definition solver.hh:107
    \n-
    @ normSpacing
    Definition solver.hh:162
    \n-
    @ iterationSpacing
    Definition solver.hh:162
    \n-
    X domain_type
    Type of the domain of the operator to be inverted.
    Definition solver.hh:104
    \n-
    virtual void apply(X &x, Y &b, InverseOperatorResult &res)=0
    Apply inverse operator,.
    \n-
    X::field_type field_type
    The field type of the operator.
    Definition solver.hh:110
    \n-
    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:113
    \n-
    virtual SolverCategory::Category category() const =0
    Category of the solver (see SolverCategory::Category)
    \n-
    Base class for all implementations of iterative solvers.
    Definition solver.hh:205
    \n-
    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:315
    \n-
    IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)
    Constructor.
    Definition solver.hh:292
    \n-
    virtual void apply(X &x, X &b, double reduction, InverseOperatorResult &res)
    Apply inverse operator with given reduction factor.
    Definition solver.hh:376
    \n-
    std::shared_ptr< const ScalarProduct< X > > _sp
    Definition solver.hh:508
    \n-
    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:342
    \n-
    std::string name() const
    Definition solver.hh:390
    \n-
    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:232
    \n-
    std::shared_ptr< const LinearOperator< X, Y > > _op
    Definition solver.hh:506
    \n-
    int _maxit
    Definition solver.hh:510
    \n-
    int _verbose
    Definition solver.hh:511
    \n-
    scalar_real_type _reduction
    Definition solver.hh:509
    \n-
    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:264
    \n-
    SolverCategory::Category _category
    Definition solver.hh:512
    \n-
    std::shared_ptr< Preconditioner< X, Y > > _prec
    Definition solver.hh:507
    \n-
    virtual SolverCategory::Category category() const
    Category of the solver (see SolverCategory::Category)
    Definition solver.hh:385
    \n-
    Class for controlling iterative methods.
    Definition solver.hh:413
    \n-
    Iteration(const IterativeSolver &parent, InverseOperatorResult &res)
    Definition solver.hh:415
    \n-
    Iteration(Iteration &&other)
    Definition solver.hh:430
    \n-
    InverseOperatorResult & _res
    Definition solver.hh:500
    \n-
    const IterativeSolver & _parent
    Definition solver.hh:501
    \n-
    Timer _watch
    Definition solver.hh:499
    \n-
    Iteration(const Iteration &)=delete
    \n-
    CountType _i
    Definition solver.hh:498
    \n-
    real_type _def0
    Definition solver.hh:497
    \n-
    bool step(CountType i, real_type def)
    registers the iteration step, checks for invalid defect norm and convergence.
    Definition solver.hh:457
    \n-
    void finalize()
    Definition solver.hh:482
    \n-
    real_type _def
    Definition solver.hh:497
    \n-
    ~Iteration()
    Definition solver.hh:442
    \n-
    bool _valid
    Definition solver.hh:502
    \n-
    Helper class for notifying a DUNE-ISTL linear solver about a change of the iteration matrix object in...
    Definition solver.hh:524
    \n-
    static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
    Definition solver.hh:526
    \n-
    Implementation that works together with iterative ISTL solvers, e.g. Dune::CGSolver or Dune::BiCGSTAB...
    Definition solver.hh:542
    \n-
    static void setMatrix(ISTLLinearSolver &, const BCRSMatrix &)
    Definition solver.hh:543
    \n-
    static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
    Definition solver.hh:555
    \n-
    Categories for the solvers.
    Definition solvercategory.hh:22
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n-
    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
    \n-
    Definition solvercategory.hh:54
    \n-
    Definition solvertype.hh:16
    \n+
    Class representing the properties of an edge in the matrix graph.
    Definition dependency.hh:39
    \n+
    Class representing a node in the matrix graph.
    Definition dependency.hh:126
    \n+
    Definition dependency.hh:220
    \n+
    Attaches properties to the edges and vertices of a graph.
    Definition graph.hh:978
    \n+
    Tag idnetifying the visited property of a vertex.
    Definition properties.hh:29
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,644 +1,575 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-solver.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+dependency.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5\n-6#ifndef DUNE_ISTL_SOLVER_HH\n-7#define DUNE_ISTL_SOLVER_HH\n+5#ifndef DUNE_AMG_DEPENDENCY_HH\n+6#define DUNE_AMG_DEPENDENCY_HH\n+7\n 8\n-9#include // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n-10\n-11#include \n-12#include \n-13#include \n-14#include \n+9#include \n+10#include \n+11\n+12#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n+13#include \"_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b._\bh_\bh\"\n+14#include \n 15\n-16#include \n-17#include \n-18#include \n-19#include \n-20#include \n-21#include \n-22\n-23#include \"_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\"\n-24#include \"_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\"\n-25#include \"_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\"\n-26#include \"_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\"\n-27\n-28namespace _\bD_\bu_\bn_\be\n-29{\n-_\b4_\b9 struct _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-50 {\n-_\b5_\b2 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt ()\n-53 {\n-54 _\bc_\bl_\be_\ba_\br();\n-55 }\n-56\n-_\b5_\b8 void _\bc_\bl_\be_\ba_\br ()\n-59 {\n-60 _\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 0;\n-61 _\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn = 0;\n-62 _\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = false;\n-63 _\bc_\bo_\bn_\bv_\b__\br_\ba_\bt_\be = 1;\n-64 _\be_\bl_\ba_\bp_\bs_\be_\bd = 0;\n-65 _\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\b__\be_\bs_\bt_\bi_\bm_\ba_\bt_\be = -1;\n-66 }\n-67\n-_\b6_\b9 int _\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs;\n+16\n+17namespace _\bD_\bu_\bn_\be\n+18{\n+19 namespace Amg\n+20 {\n+_\b3_\b8 class _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+39 {\n+40 friend std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs&\n+props);\n+41 public:\n+_\b4_\b3 enum {_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE, _\bD_\bE_\bP_\bE_\bN_\bD, _\bS_\bI_\bZ_\bE};\n+44\n+45 private:\n+46\n+47 std::bitset flags_;\n+48 public:\n+50 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs();\n+51\n+53 std::bitset::reference _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v);\n+54\n+56 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v) const;\n+57\n+63 bool _\bd_\be_\bp_\be_\bn_\bd_\bs() const;\n+64\n+69 void _\bs_\be_\bt_\bD_\be_\bp_\be_\bn_\bd_\bs();\n 70\n-_\b7_\b2 double _\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n-73\n-_\b7_\b5 bool _\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd;\n-76\n-_\b7_\b8 double _\bc_\bo_\bn_\bv_\b__\br_\ba_\bt_\be;\n-79\n-_\b8_\b1 double _\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\b__\be_\bs_\bt_\bi_\bm_\ba_\bt_\be = -1;\n-82\n-_\b8_\b4 double _\be_\bl_\ba_\bp_\bs_\be_\bd;\n-85 };\n+74 void _\br_\be_\bs_\be_\bt_\bD_\be_\bp_\be_\bn_\bd_\bs();\n+75\n+80 bool _\bi_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs() const;\n+81\n+85 void _\bs_\be_\bt_\bI_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs();\n 86\n-87\n-88 //=====================================================================\n-100 template\n-_\b1_\b0_\b1 class _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br {\n-102 public:\n-_\b1_\b0_\b4 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-105\n-_\b1_\b0_\b7 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-108\n-_\b1_\b1_\b0 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-111\n-_\b1_\b1_\b3 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+90 void _\br_\be_\bs_\be_\bt_\bI_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs();\n+91\n+96 bool _\bi_\bs_\bO_\bn_\be_\bW_\ba_\by() const;\n+97\n+102 bool _\bi_\bs_\bT_\bw_\bo_\bW_\ba_\by() const;\n+103\n+108 bool _\bi_\bs_\bS_\bt_\br_\bo_\bn_\bg() const;\n+109\n+113 void _\br_\be_\bs_\be_\bt();\n 114\n-_\b1_\b1_\b6 typedef Simd::Scalar _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-117\n-_\b1_\b3_\b0 virtual void _\ba_\bp_\bp_\bl_\by (X& x, Y& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res) = 0;\n+_\b1_\b1_\b8 void _\bp_\br_\bi_\bn_\bt_\bF_\bl_\ba_\bg_\bs() const;\n+119 };\n+120\n+_\b1_\b2_\b6 class _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs {\n+127 friend std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs&\n+props);\n+128 public:\n+_\b1_\b2_\b9 enum { _\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD, _\bV_\bI_\bS_\bI_\bT_\bE_\bD, _\bF_\bR_\bO_\bN_\bT, _\bB_\bO_\bR_\bD_\bE_\bR, _\bS_\bI_\bZ_\bE };\n+130 private:\n 131\n-_\b1_\b4_\b5 virtual void _\ba_\bp_\bp_\bl_\by (X& x, Y& b, double reduction, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt&\n-res) = 0;\n-146\n-_\b1_\b4_\b8 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-149#ifdef DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n-150 {\n-151 DUNE_THROW(Dune::Exception,\"It is necessary to implement the category\n-method in a derived classes, in the future this method will pure virtual.\");\n-152 }\n-153#else\n-154 = 0;\n-155#endif\n-156\n-_\b1_\b5_\b8 virtual _\b~_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br () {}\n-159\n-160 protected:\n-161 // spacing values\n-_\b1_\b6_\b2 enum { _\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bS_\bp_\ba_\bc_\bi_\bn_\bg = 5 , _\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg = 16 };\n-163\n-_\b1_\b6_\b5 void _\bp_\br_\bi_\bn_\bt_\bH_\be_\ba_\bd_\be_\br(std::ostream& s) const\n-166 {\n-167 s << std::setw(_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << \" Iter\";\n-168 s << std::setw(_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << \"Defect\";\n-169 s << std::setw(_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << \"Rate\" << std::endl;\n-170 }\n-171\n-173 template \n-_\b1_\b7_\b4 void _\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt(std::ostream& s,\n-175 const CountType& iter,\n-176 const DataType& norm,\n-177 const DataType& norm_old) const\n-178 {\n-179 const DataType rate = norm/norm_old;\n-180 s << std::setw(_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << iter << \" \";\n-181 s << std::setw(_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << Simd::io(norm) << \" \";\n-182 s << std::setw(_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << Simd::io(rate) << std::endl;\n-183 }\n-184\n-186 template \n-_\b1_\b8_\b7 void _\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt(std::ostream& s,\n-188 const CountType& iter,\n-189 const DataType& norm) const\n-190 {\n-191 s << std::setw(_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << iter << \" \";\n-192 s << std::setw(_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg) << Simd::io(norm) << std::endl;\n-193 }\n-194 };\n-195\n-204 template\n-_\b2_\b0_\b5 class _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br{\n-206 public:\n-207 using typename _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-208 using typename _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-209 using typename _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-210 using typename _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-211 using typename _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-212\n-_\b2_\b3_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br (const _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>& op, _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b>& prec,\n-_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose) :\n-233 _\b__\bo_\bp(stackobject_to_shared_ptr(op)),\n-234 _\b__\bp_\br_\be_\bc(stackobject_to_shared_ptr(prec)),\n-235 _\b__\bs_\bp(new _\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt),\n-236 _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn(reduction), _\b__\bm_\ba_\bx_\bi_\bt(maxit), _\b__\bv_\be_\br_\bb_\bo_\bs_\be(verbose), _\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::sequential)\n-237 {\n-238 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(op) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl)\n-239 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"LinearOperator has to be sequential!\");\n-240 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(prec) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl)\n-241 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"Preconditioner has to be sequential!\");\n-242 }\n-243\n-_\b2_\b6_\b4 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br (const _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bY_\b>& op, const _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bX_\b>& sp,\n-_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b>& prec,\n-265 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose) :\n-266 _\b__\bo_\bp(stackobject_to_shared_ptr(op)),\n-267 _\b__\bp_\br_\be_\bc(stackobject_to_shared_ptr(prec)),\n-268 _\b__\bs_\bp(stackobject_to_shared_ptr(sp)),\n-269 _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn(reduction), _\b__\bm_\ba_\bx_\bi_\bt(maxit), _\b__\bv_\be_\br_\bb_\bo_\bs_\be(verbose), _\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(op))\n-270 {\n-271 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(op) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(prec))\n-272 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"LinearOperator and Preconditioner must\n-have the same SolverCategory!\");\n-273 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(op) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(sp))\n-274 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"LinearOperator and ScalarProduct must\n-have the same SolverCategory!\");\n-275 }\n-276\n-_\b2_\b9_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr > op, std::\n-shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b> > prec, const ParameterTree& configuration) :\n-293 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,_\bs_\bt_\bd::make_shared<_\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt>(),prec,\n-294 configuration._\bg_\be_\bt<_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be>(\"reduction\"),\n-295 configuration._\bg_\be_\bt(\"maxit\"),\n-296 configuration._\bg_\be_\bt(\"verbose\"))\n-297 {}\n-298\n-_\b3_\b1_\b5 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr > op, std::\n-shared_ptr > sp, std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bX_\b> >\n-prec, const ParameterTree& configuration) :\n-316 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br(op,sp,prec,\n-317 configuration._\bg_\be_\bt<_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be>(\"reduction\"),\n-318 configuration._\bg_\be_\bt(\"maxit\"),\n-319 configuration._\bg_\be_\bt(\"verbose\"))\n-320 {}\n-321\n-_\b3_\b4_\b2 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br (std::shared_ptr> op,\n-343 std::shared_ptr> sp,\n-344 std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b>> prec,\n-345 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be reduction, int maxit, int verbose) :\n-346 _\b__\bo_\bp(op),\n-347 _\b__\bp_\br_\be_\bc(prec),\n-348 _\b__\bs_\bp(sp),\n-349 _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn(reduction), _\b__\bm_\ba_\bx_\bi_\bt(maxit), _\b__\bv_\be_\br_\bb_\bo_\bs_\be(verbose),\n-350 _\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*op))\n-351 {\n-352 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*op) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*prec))\n-353 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"LinearOperator and Preconditioner must\n-have the same SolverCategory!\");\n-354 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*op) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(*sp))\n-355 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"LinearOperator and ScalarProduct must\n-have the same SolverCategory!\");\n+133 std::bitset flags_;\n+134\n+135 public:\n+137 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs();\n+138\n+140 std::bitset::reference _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v);\n+141\n+143 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v) const;\n+144\n+151 void _\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd();\n+152\n+156 bool _\bi_\bs_\bo_\bl_\ba_\bt_\be_\bd() const;\n+157\n+161 void _\br_\be_\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd();\n+162\n+166 void _\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd();\n+167\n+171 bool _\bv_\bi_\bs_\bi_\bt_\be_\bd() const;\n+172\n+176 void _\br_\be_\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd();\n+177\n+181 void _\bs_\be_\bt_\bF_\br_\bo_\bn_\bt();\n+182\n+186 bool _\bf_\br_\bo_\bn_\bt() const;\n+187\n+191 void _\br_\be_\bs_\be_\bt_\bF_\br_\bo_\bn_\bt();\n+192\n+196 void _\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br();\n+197\n+202 bool _\be_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br() const;\n+203\n+207 void _\br_\be_\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br();\n+208\n+212 void _\br_\be_\bs_\be_\bt();\n+213\n+214 };\n+215\n+216 template\n+_\b2_\b1_\b7 class _\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+218 : public RAPropertyMapHelper::\n+reference,\n+219 PropertyGraphVertexPropertyMap >\n+220 {\n+221 public:\n+222\n+_\b2_\b2_\b3 typedef ReadWritePropertyMapTag _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n+224\n+225 enum {\n+227 _\bi_\bn_\bd_\be_\bx = i\n+_\b2_\b2_\b8 };\n+229\n+_\b2_\b3_\b3 typedef G _\bG_\br_\ba_\bp_\bh;\n+234\n+_\b2_\b3_\b8 typedef std::bitset _\bB_\bi_\bt_\bS_\be_\bt;\n+239\n+_\b2_\b4_\b3 typedef typename BitSet::reference _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+244\n+_\b2_\b4_\b8 typedef bool _\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be;\n+249\n+_\b2_\b5_\b3 typedef typename G::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n+254\n+_\b2_\b5_\b9 _\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp(G& g)\n+260 : graph_(&g)\n+261 {}\n+262\n+_\b2_\b6_\b6 _\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp()\n+267 : graph_(0)\n+268 {}\n+269\n+270\n+_\b2_\b7_\b5 _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bV_\be_\br_\bt_\be_\bx& vertex) const\n+276 {\n+277 return graph_->getVertexProperties(vertex)[_\bi_\bn_\bd_\be_\bx];\n+278 }\n+279 private:\n+280 _\bG_\br_\ba_\bp_\bh* graph_;\n+281 };\n+282\n+283 } // end namespace Amg\n+284\n+285 template\n+_\b2_\b8_\b6 struct PropertyMapTypeSelector >\n+287 {\n+_\b2_\b8_\b8 typedef _\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b<_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\bG_\b,_\bA_\bm_\bg_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b,_\bE_\bP_\b,_\bV_\bM_\b,_\bE_\bM_\b>, Amg::VertexProperties::VISITED> _\bT_\by_\bp_\be;\n+289 };\n+290\n+291 template\n+292 typename PropertyMapTypeSelector >::Type\n+_\b2_\b9_\b3 _\bg_\be_\bt([[maybe_unused]] const _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg& tag, _\bA_\bm_\bg_\b:_\b:\n+_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\bG_\b,_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b,_\bE_\bP_\b,_\bV_\bM_\b,_\bE_\bM_\b>& graph)\n+294 {\n+295 return _\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b<_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\bG_\b,_\bA_\bm_\bg_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b,_\bE_\bP_\b,_\bV_\bM_\b,_\bE_\bM_\b>, _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bV_\bI_\bS_\bI_\bT_\bE_\bD>(graph);\n+296 }\n+297\n+298 namespace Amg\n+299 {\n+_\b3_\b0_\b0 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs&\n+props)\n+301 {\n+302 return os << props.flags_;\n+303 }\n+304\n+_\b3_\b0_\b5 inline _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs()\n+306 : flags_()\n+307 {}\n+308\n+309 inline std::bitset::reference\n+_\b3_\b1_\b0 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v)\n+311 {\n+312 return flags_[v];\n+313 }\n+314\n+_\b3_\b1_\b5 inline bool _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t i) const\n+316 {\n+317 return flags_[i];\n+318 }\n+319\n+_\b3_\b2_\b0 inline void _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt()\n+321 {\n+322 flags_.reset();\n+323 }\n+324\n+_\b3_\b2_\b5 inline void _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs()\n+326 {\n+327 // Set the INFLUENCE bit\n+328 //flags_ |= (1<_\b:_\b:_\ba_\bp_\bp_\bl_\by;\n-369#endif\n+_\b3_\b5_\b8 inline void _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bI_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs()\n+359 {\n+360 // reset the second bit.\n+361 flags_ &= ~(1<<_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE);\n+362 }\n+363\n+_\b3_\b6_\b4 inline bool _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bO_\bn_\be_\bW_\ba_\by() const\n+365 {\n+366 // Test whether only the first bit is set\n+367 //return isStrong() && !isTwoWay();\n+368 return ((flags_) & std::bitset((1<<_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE)|(1<<_\bD_\bE_\bP_\bE_\bN_\bD)))==\n+(1<<_\bD_\bE_\bP_\bE_\bN_\bD);\n+369 }\n 370\n-_\b3_\b7_\b6 virtual void _\ba_\bp_\bp_\bl_\by (X& x, X& b, double reduction, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt&\n-res)\n-377 {\n-378 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be saved_reduction = _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n-379 _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn = reduction;\n-380 this->_\ba_\bp_\bp_\bl_\by(x,b,res);\n-381 _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn = saved_reduction;\n-382 }\n+_\b3_\b7_\b1 inline bool _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bT_\bw_\bo_\bW_\ba_\by() const\n+372 {\n+373 // Test whether the first and second bit is set\n+374 return ((flags_) & std::bitset((1<<_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE)|(1<<_\bD_\bE_\bP_\bE_\bN_\bD)))==(\n+(1<<_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE)|(1<<_\bD_\bE_\bP_\bE_\bN_\bD));\n+375 }\n+376\n+_\b3_\b7_\b7 inline bool _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bS_\bt_\br_\bo_\bn_\bg() const\n+378 {\n+379 // Test whether the first or second bit is set\n+380 return ((flags_) & std::bitset((1<<_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE)|(1<<_\bD_\bE_\bP_\bE_\bN_\bD))).to_ulong\n+();\n+381 }\n+382\n 383\n-_\b3_\b8_\b5 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-386 {\n-387 return _\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by;\n-388 }\n-389\n-_\b3_\b9_\b0 std::string _\bn_\ba_\bm_\be() const{\n-391 std::string _\bn_\ba_\bm_\be = className(*this);\n-392 return _\bn_\ba_\bm_\be.substr(0, _\bn_\ba_\bm_\be.find(\"<\"));\n-393 }\n-394\n-412 template\n-_\b4_\b1_\b3 class _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn {\n-414 public:\n-_\b4_\b1_\b5 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn(const _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br& parent, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n-416 : _\b__\bi(0)\n-417 , _\b__\br_\be_\bs(res)\n-418 , _\b__\bp_\ba_\br_\be_\bn_\bt(parent)\n-419 , _\b__\bv_\ba_\bl_\bi_\bd(true)\n-420 {\n-421 res._\bc_\bl_\be_\ba_\br();\n-422 if(_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\bv_\be_\br_\bb_\bo_\bs_\be>0){\n-423 std::cout << \"=== \" << parent._\bn_\ba_\bm_\be() << std::endl;\n-424 if(_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\bv_\be_\br_\bb_\bo_\bs_\be > 1)\n-425 _\b__\bp_\ba_\br_\be_\bn_\bt._\bp_\br_\bi_\bn_\bt_\bH_\be_\ba_\bd_\be_\br(std::cout);\n-426 }\n-427 }\n-428\n-_\b4_\b2_\b9 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn(const _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn&) = delete;\n-_\b4_\b3_\b0 _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn(_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn&& other)\n-431 : _\b__\bd_\be_\bf_\b0(other._\b__\bd_\be_\bf_\b0)\n-432 , _\b__\bd_\be_\bf(other._\b__\bd_\be_\bf)\n-433 , _\b__\bi(other._\b__\bi)\n-434 , _\b__\bw_\ba_\bt_\bc_\bh(other._\b__\bw_\ba_\bt_\bc_\bh)\n-435 , _\b__\br_\be_\bs(other._\b__\br_\be_\bs)\n-436 , _\b__\bp_\ba_\br_\be_\bn_\bt(other._\b__\bp_\ba_\br_\be_\bn_\bt)\n-437 , _\b__\bv_\ba_\bl_\bi_\bd(other._\b__\bv_\ba_\bl_\bi_\bd)\n-438 {\n-439 other._valid = false;\n-440 }\n-441\n-_\b4_\b4_\b2 _\b~_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn(){\n-443 if(_\b__\bv_\ba_\bl_\bi_\bd)\n-444 _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be();\n-445 }\n-446\n-_\b4_\b5_\b7 bool _\bs_\bt_\be_\bp(CountType i, _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be def){\n-458 if (!Simd::allTrue(isFinite(def))) // check for inf or NaN\n-459 {\n-460 if (_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\bv_\be_\br_\bb_\bo_\bs_\be>0)\n-461 std::cout << \"=== \" << _\b__\bp_\ba_\br_\be_\bn_\bt._\bn_\ba_\bm_\be() << \": abort due to infinite or NaN\n-defect\"\n-462 << std::endl;\n-463 DUNE_THROW(_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt,\n-464 _\b__\bp_\ba_\br_\be_\bn_\bt._\bn_\ba_\bm_\be() << \": defect=\" << Simd::io(def)\n-465 << \" is infinite or NaN\");\n-466 }\n-467 if(i == 0)\n-468 _\b__\bd_\be_\bf_\b0 = def;\n-469 if(_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\bv_\be_\br_\bb_\bo_\bs_\be > 1){\n-470 if(i!=0)\n-471 _\b__\bp_\ba_\br_\be_\bn_\bt._\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt(std::cout,i,def,_\b__\bd_\be_\bf);\n-472 else\n-473 _\b__\bp_\ba_\br_\be_\bn_\bt._\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt(std::cout,i,def);\n-474 }\n-475 _\b__\bd_\be_\bf = def;\n-476 _\b__\bi = i;\n-477 _\b__\br_\be_\bs._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = (Simd::allTrue(def<_\b__\bd_\be_\bf_\b0*_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn ||\n-def<_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1E-30))); // convergence check\n-478 return _\b__\br_\be_\bs._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd;\n-479 }\n-480\n-481 protected:\n-_\b4_\b8_\b2 void _\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be(){\n-483 _\b__\br_\be_\bs._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = (Simd::allTrue(_\b__\bd_\be_\bf<_\b__\bd_\be_\bf_\b0*_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn ||\n-_\b__\bd_\be_\bf<_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(1E-30)));\n-484 _\b__\br_\be_\bs._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = _\b__\bi;\n-485 _\b__\br_\be_\bs._\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn = static_cast(Simd::max(_\b__\bd_\be_\bf/_\b__\bd_\be_\bf_\b0));\n-486 _\b__\br_\be_\bs._\bc_\bo_\bn_\bv_\b__\br_\ba_\bt_\be = pow(_\b__\br_\be_\bs._\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn,1.0/_\b__\bi);\n-487 _\b__\br_\be_\bs._\be_\bl_\ba_\bp_\bs_\be_\bd = _\b__\bw_\ba_\bt_\bc_\bh.elapsed();\n-488 if (_\b__\bp_\ba_\br_\be_\bn_\bt._\b__\bv_\be_\br_\bb_\bo_\bs_\be>0) // final print\n-489 {\n-490 std::cout << \"=== rate=\" << _\b__\br_\be_\bs._\bc_\bo_\bn_\bv_\b__\br_\ba_\bt_\be\n-491 << \", T=\" << _\b__\br_\be_\bs._\be_\bl_\ba_\bp_\bs_\be_\bd\n-492 << \", TIT=\" << _\b__\br_\be_\bs._\be_\bl_\ba_\bp_\bs_\be_\bd/_\b__\br_\be_\bs._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n-493 << \", IT=\" << _\b__\br_\be_\bs._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs << std::endl;\n-494 }\n-495 }\n-496\n-_\b4_\b9_\b7 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\b__\bd_\be_\bf_\b0 = 0.0, _\b__\bd_\be_\bf = 0.0;\n-_\b4_\b9_\b8 CountType _\b__\bi;\n-_\b4_\b9_\b9 Timer _\b__\bw_\ba_\bt_\bc_\bh;\n-_\b5_\b0_\b0 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& _\b__\br_\be_\bs;\n-_\b5_\b0_\b1 const _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br& _\b__\bp_\ba_\br_\be_\bn_\bt;\n-_\b5_\b0_\b2 bool _\b__\bv_\ba_\bl_\bi_\bd;\n-503 };\n-504\n-505 protected:\n-_\b5_\b0_\b6 std::shared_ptr> _\b__\bo_\bp;\n-_\b5_\b0_\b7 std::shared_ptr> _\b__\bp_\br_\be_\bc;\n-_\b5_\b0_\b8 std::shared_ptr> _\b__\bs_\bp;\n-_\b5_\b0_\b9 _\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn;\n-_\b5_\b1_\b0 int _\b__\bm_\ba_\bx_\bi_\bt;\n-_\b5_\b1_\b1 int _\b__\bv_\be_\br_\bb_\bo_\bs_\be;\n-_\b5_\b1_\b2 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by;\n-513 };\n-514\n-522 template \n-_\b5_\b2_\b3 class _\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-524 {\n-525 public:\n-_\b5_\b2_\b6 static void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx (ISTLLinearSolver& solver,\n-527 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n-528 {\n-529 static const bool is_direct_solver\n-530 = _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be;\n-531 _\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b,_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:\n-532_\b _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bs_\b__\bd_\bi_\br_\be_\bc_\bt_\b__\bs_\bo_\bl_\bv_\be_\br_\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(solver,matrix);\n-533 }\n-534\n-535 protected:\n-540 template \n-_\b5_\b4_\b1 struct _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn\n-542 {\n-_\b5_\b4_\b3 static void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx (ISTLLinearSolver&,\n-544 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx&)\n-545 {}\n-546 };\n-547\n-552 template \n-_\b5_\b5_\b3 struct _\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn\n-554 {\n-_\b5_\b5_\b5 static void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx (ISTLLinearSolver& solver,\n-556 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n-557 {\n-558 solver.setMatrix(matrix);\n-559 }\n-560 };\n-561 };\n-562\n-566}\n-567\n-568#endif\n-_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\n-Define base class for scalar product and norm.\n-_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b._\bh_\bh\n-_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n-Define general, extensible interface for operators. The available\n-implementation wraps a matrix.\n-_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n-Templates characterizing the type of a solver.\n-_\bs_\bt_\bd\n-STL namespace.\n+_\b3_\b8_\b4 inline std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs&\n+props)\n+385 {\n+386 return os << props.flags_;\n+387 }\n+388\n+_\b3_\b8_\b9 inline _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs()\n+390 : flags_()\n+391 {}\n+392\n+393\n+394 inline std::bitset::reference\n+_\b3_\b9_\b5 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v)\n+396 {\n+397 return flags_[v];\n+398 }\n+399\n+_\b4_\b0_\b0 inline bool _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t v) const\n+401 {\n+402 return flags_[v];\n+403 }\n+404\n+_\b4_\b0_\b5 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd()\n+406 {\n+407 flags_.set(_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n+408 }\n+409\n+_\b4_\b1_\b0 inline bool _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bo_\bl_\ba_\bt_\be_\bd() const\n+411 {\n+412 return flags_.test(_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n+413 }\n+414\n+_\b4_\b1_\b5 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd()\n+416 {\n+417 flags_.reset(_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n+418 }\n+419\n+_\b4_\b2_\b0 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd()\n+421 {\n+422 flags_.set(_\bV_\bI_\bS_\bI_\bT_\bE_\bD);\n+423 }\n+424\n+_\b4_\b2_\b5 inline bool _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\be_\bd() const\n+426 {\n+427 return flags_.test(_\bV_\bI_\bS_\bI_\bT_\bE_\bD);\n+428 }\n+429\n+_\b4_\b3_\b0 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd()\n+431 {\n+432 flags_.reset(_\bV_\bI_\bS_\bI_\bT_\bE_\bD);\n+433 }\n+434\n+_\b4_\b3_\b5 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bF_\br_\bo_\bn_\bt()\n+436 {\n+437 flags_.set(_\bF_\bR_\bO_\bN_\bT);\n+438 }\n+439\n+_\b4_\b4_\b0 inline bool _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bf_\br_\bo_\bn_\bt() const\n+441 {\n+442 return flags_.test(_\bF_\bR_\bO_\bN_\bT);\n+443 }\n+444\n+_\b4_\b4_\b5 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bF_\br_\bo_\bn_\bt()\n+446 {\n+447 flags_.reset(_\bF_\bR_\bO_\bN_\bT);\n+448 }\n+449\n+_\b4_\b5_\b0 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br()\n+451 {\n+452 flags_.set(_\bB_\bO_\bR_\bD_\bE_\bR);\n+453 }\n+454\n+_\b4_\b5_\b5 inline bool _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\be_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br() const\n+456 {\n+457 return flags_.test(_\bB_\bO_\bR_\bD_\bE_\bR);\n+458 }\n+459\n+_\b4_\b6_\b0 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br()\n+461 {\n+462 flags_.reset(_\bB_\bO_\bR_\bD_\bE_\bR);\n+463 }\n+464\n+_\b4_\b6_\b5 inline void _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt()\n+466 {\n+467 flags_.reset();\n+468 }\n+469\n+471 }\n+472}\n+473#endif\n+_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\n+Provides classes for building the matrix graph.\n+_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b._\bh_\bh\n+Provides classes for handling internal properties in a graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bd_\be_\bp_\be_\bn_\bd_\bs\n+bool depends() const\n+Checks whether the vertex the edge points to depends on the vertex the edge\n+starts.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:352\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bF_\br_\bo_\bn_\bt\n+void resetFront()\n+Resets the front node flag.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:445\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bB_\bi_\bt_\bS_\be_\bt\n+std::bitset< VertexProperties::SIZE > BitSet\n+The type of the bitset.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bo_\bl_\ba_\bt_\be_\bd\n+bool isolated() const\n+Checks whether the node is isolated.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:410\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bV_\ba_\bl_\bu_\be_\bT_\by_\bp_\be\n+bool ValueType\n+The value type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:248\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+friend std::ostream & operator<<(std::ostream &os, const VertexProperties\n+&props)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:384\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+BitSet::reference Reference\n+The reference type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:243\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bT_\bw_\bo_\bW_\ba_\by\n+bool isTwoWay() const\n+Checks whether the edge is two way. I.e. both the influence flag and the\n+depends flag are that.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:371\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs\n+void setInfluences()\n+Marks the edge as one of which the start vertex by the end vertex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:325\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+VertexProperties()\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:389\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bD_\be_\bp_\be_\bn_\bd_\bs\n+void setDepends()\n+Marks the edge as one of which the end point depends on the starting point.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:338\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+PropertyGraphVertexPropertyMap()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:266\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+PropertyGraphVertexPropertyMap(G &g)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:259\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+G::VertexDescriptor Vertex\n+The vertex descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:253\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br\n+void resetExcludedBorder()\n+Marks the vertex as included in the aggregation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:460\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bF_\br_\bo_\bn_\bt\n+void setFront()\n+Marks the node as belonging to the current clusters front.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:435\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt\n+void reset()\n+Reset all flags.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:465\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd\n+void setVisited()\n+Mark the node as already visited.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:420\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+EdgeProperties()\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:305\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bI_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs\n+void resetInfluences()\n+Resets the influence flag.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:358\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bG_\br_\ba_\bp_\bh\n+G Graph\n+The type of the graph with internal properties.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:233\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+std::bitset< SIZE >::reference operator[](std::size_t v)\n+Access the bits directly.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:395\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bF_\bl_\ba_\bg_\bs\n+void printFlags() const\n+Prints the attributes of the edge for debugging.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+friend std::ostream & operator<<(std::ostream &os, const EdgeProperties &props)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:300\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\bT_\by_\bp_\be_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg_\b,_\b _\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b<_\b _\bG_\b,\n+_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b,_\b _\bE_\bP_\b,_\b _\bV_\bM_\b,_\b _\bE_\bM_\b _\b>_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n+Amg::PropertyGraphVertexPropertyMap< Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM >, Amg::VertexProperties::VISITED > Type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:288\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bn_\bf_\bl_\bu_\be_\bn_\bc_\be_\bs\n+bool influences() const\n+Checks whether the start vertex is influenced by the end vertex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:332\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n+void setIsolated()\n+Marks that node as being isolated.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:405\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\be_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br\n+bool excludedBorder() const\n+Tests whether the vertex is excluded from the aggregation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:455\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bV_\bi_\bs_\bi_\bt_\be_\bd\n+void resetVisited()\n+Resets the visited flag.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:430\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\be_\bd\n+bool visited() const\n+Checks whether the node is marked as visited.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:425\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+Reference operator[](const Vertex &vertex) const\n+Get the properties associated to a vertex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:275\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt\n+void reset()\n+Reset all flags.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:320\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bD_\be_\bp_\be_\bn_\bd_\bs\n+void resetDepends()\n+Resets the depends flag.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:345\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+ReadWritePropertyMapTag Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:223\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\br_\be_\bs_\be_\bt_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n+void resetIsolated()\n+Resets the isolated flag.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:415\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T >\n+&criterion)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bS_\bt_\br_\bo_\bn_\bg\n+bool isStrong() const\n+Checks whether the edge is strong. I.e. the influence or depends flag is set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:377\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bf_\br_\bo_\bn_\bt\n+bool front() const\n+Checks whether the node is marked as a front node.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:440\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+std::bitset< SIZE >::reference operator[](std::size_t v)\n+Access the bits directly.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:310\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bs_\be_\bt_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bB_\bo_\br_\bd_\be_\br\n+void setExcludedBorder()\n+Marks the vertex as excluded from the aggregation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:450\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bi_\bs_\bO_\bn_\be_\bW_\ba_\by\n+bool isOneWay() const\n+Checks whether the edge is one way. I.e. either the influence or the depends\n+flag but is set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:364\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bi_\bn_\bd_\be_\bx\n+@ index\n+the index to access in the bitset.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:227\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bV_\bI_\bS_\bI_\bT_\bE_\bD\n+@ VISITED\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:129\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD\n+@ ISOLATED\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:129\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bS_\bI_\bZ_\bE\n+@ SIZE\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:129\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bB_\bO_\bR_\bD_\bE_\bR\n+@ BORDER\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:129\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bF_\bR_\bO_\bN_\bT\n+@ FRONT\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:129\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bD_\bE_\bP_\bE_\bN_\bD\n+@ DEPEND\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bS_\bI_\bZ_\bE\n+@ SIZE\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b:_\b:_\bI_\bN_\bF_\bL_\bU_\bE_\bN_\bC_\bE\n+@ INFLUENCE\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:43\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n _\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bA_\bb_\bo_\br_\bt\n-Thrown when a solver aborts due to some problem.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-A linear operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Base class for matrix free definition of preconditioners.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-Base class for scalar product and norm computation.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-Default implementation for the scalar case.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:168\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-Statistics about the application of an inverse operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-InverseOperatorResult()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\b__\be_\bs_\bt_\bi_\bm_\ba_\bt_\be\n-double condition_estimate\n-Estimate of condition number.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\be_\bl_\ba_\bp_\bs_\be_\bd\n-double elapsed\n-Elapsed time in seconds.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n-int iterations\n-Number of iterations.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn\n-double reduction\n-Reduction achieved: .\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bl_\be_\ba_\br\n-void clear()\n-Resets all data.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:58\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\b__\br_\ba_\bt_\be\n-double conv_rate\n-Convergence rate (average reduction per step)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n-bool converged\n-True if convergence criterion has been met.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Abstract base class for all solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bH_\be_\ba_\bd_\be_\br\n-void printHeader(std::ostream &s) const\n-helper function for printing header of solver output\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:165\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\b~_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-virtual ~InverseOperator()\n-Destructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt\n-void printOutput(std::ostream &s, const CountType &iter, const DataType &norm)\n-const\n-helper function for printing solver output\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:187\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bO_\bu_\bt_\bp_\bu_\bt\n-void printOutput(std::ostream &s, const CountType &iter, const DataType &norm,\n-const DataType &norm_old) const\n-helper function for printing solver output\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &x, Y &b, double reduction, InverseOperatorResult &res)=0\n-apply inverse operator, with given convergence criteria.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br_\b__\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-Simd::Scalar< real_type > scalar_real_type\n-scalar type underlying the field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-Type of the range of the operator to be inverted.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bn_\bo_\br_\bm_\bS_\bp_\ba_\bc_\bi_\bn_\bg\n-@ normSpacing\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:162\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bS_\bp_\ba_\bc_\bi_\bn_\bg\n-@ iterationSpacing\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:162\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-Type of the domain of the operator to be inverted.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:104\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &x, Y &b, InverseOperatorResult &res)=0\n-Apply inverse operator,.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< field_type >::real_type real_type\n-The real type of the field type (is the same if using real numbers, but differs\n-for std::complex)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const =0\n-Category of the solver (see SolverCategory::Category)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n-Base class for all implementations of iterative solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:205\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n-IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::\n-shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X,\n-X > > prec, const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:315\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n-IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::\n-shared_ptr< Preconditioner< X, X > > prec, const ParameterTree &configuration)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:292\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(X &x, X &b, double reduction, InverseOperatorResult &res)\n-Apply inverse operator with given reduction factor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:376\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bs_\bp\n-std::shared_ptr< const ScalarProduct< X > > _sp\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:508\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n-IterativeSolver(std::shared_ptr< const LinearOperator< X, Y > > op, std::\n-shared_ptr< const ScalarProduct< X > > sp, std::shared_ptr< Preconditioner< X,\n-Y > > prec, scalar_real_type reduction, int maxit, int verbose)\n-General constructor to initialize an iterative solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:342\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bn_\ba_\bm_\be\n-std::string name() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:390\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n-IterativeSolver(const LinearOperator< X, Y > &op, Preconditioner< X, Y > &prec,\n-scalar_real_type reduction, int maxit, int verbose)\n-General constructor to initialize an iterative solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:232\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bo_\bp\n-std::shared_ptr< const LinearOperator< X, Y > > _op\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:506\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bm_\ba_\bx_\bi_\bt\n-int _maxit\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:510\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bv_\be_\br_\bb_\bo_\bs_\be\n-int _verbose\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:511\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\br_\be_\bd_\bu_\bc_\bt_\bi_\bo_\bn\n-scalar_real_type _reduction\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:509\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br\n-IterativeSolver(const LinearOperator< X, Y > &op, const ScalarProduct< X > &sp,\n-Preconditioner< X, Y > &prec, scalar_real_type reduction, int maxit, int\n-verbose)\n-General constructor to initialize an iterative solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:264\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-SolverCategory::Category _category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:512\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\b__\bp_\br_\be_\bc\n-std::shared_ptr< Preconditioner< X, Y > > _prec\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:507\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the solver (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:385\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n-Class for controlling iterative methods.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:413\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n-Iteration(const IterativeSolver &parent, InverseOperatorResult &res)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:415\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n-Iteration(Iteration &&other)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:430\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\br_\be_\bs\n-InverseOperatorResult & _res\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:500\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bp_\ba_\br_\be_\bn_\bt\n-const IterativeSolver & _parent\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:501\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bw_\ba_\bt_\bc_\bh\n-Timer _watch\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:499\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n-Iteration(const Iteration &)=delete\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bi\n-CountType _i\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:498\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bd_\be_\bf_\b0\n-real_type _def0\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:497\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\bt_\be_\bp\n-bool step(CountType i, real_type def)\n-registers the iteration step, checks for invalid defect norm and convergence.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:457\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bf_\bi_\bn_\ba_\bl_\bi_\bz_\be\n-void finalize()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:482\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bd_\be_\bf\n-real_type _def\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:497\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b~_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n-~Iteration()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:442\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b__\bv_\ba_\bl_\bi_\bd\n-bool _valid\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:502\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-Helper class for notifying a DUNE-ISTL linear solver about a change of the\n-iteration matrix object in...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:524\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:526\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn\n-Implementation that works together with iterative ISTL solvers, e.g. Dune::\n-CGSolver or Dune::BiCGSTAB...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:542\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-static void setMatrix(ISTLLinearSolver &, const BCRSMatrix &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:543\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bI_\bm_\bp_\bl_\be_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bt_\br_\bu_\be_\b,_\b _\bD_\bu_\bm_\bm_\by_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:555\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Categories for the solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:22\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-static Category category(const OP &op, decltype(op.category()) *=nullptr)\n-Helperfunction to extract the solver category either from an enum, or from the\n-newly introduced virtu...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+Class representing the properties of an edge in the matrix graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+Class representing a node in the matrix graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bG_\br_\ba_\bp_\bh_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:220\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n+Attaches properties to the edges and vertices of a graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:978\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n+Tag idnetifying the visited property of a vertex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:29\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00176.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00176.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: foreach.hh File Reference\n+dune-istl: renumberer.hh File Reference\n \n \n \n \n \n \n \n@@ -65,62 +65,46 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n \n-
    foreach.hh File Reference
    \n+
    renumberer.hh File Reference
    \n
    \n
    \n-
    #include <type_traits>
    \n-#include <utility>
    \n-#include <cassert>
    \n-#include <dune/common/std/type_traits.hh>
    \n-#include <dune/common/diagonalmatrix.hh>
    \n-#include <dune/common/hybridutilities.hh>
    \n-#include <dune/common/indices.hh>
    \n-#include <dune/istl/bcrsmatrix.hh>
    \n-#include <dune/istl/scaledidmatrix.hh>
    \n+
    #include "aggregates.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n+\n+\n+\n+

    \n+Classes

    class  Dune::Amg::AggregateRenumberer< G >
     
    \n \n \n \n-\n+\n \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::ForEach
    namespace  Dune::Amg
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n

    \n 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.
     
    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)
     
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,51 +1,26 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-foreach.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+renumberer.hh File Reference\n+#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\b _\bG_\b _\b>\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\br_\bo_\bw_\bs (_\bM_\ba_\bt_\br_\bi_\bx const\n- &matrix)\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bc_\bo_\bl_\bs (_\bM_\ba_\bt_\br_\bi_\bx const\n- &matrix)\n-\u00a0\n-template\n- auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bs_\bi_\bz_\be (Vector const\n- &vector)\n-\u00a0\n-template\n- std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh (Vector\n- &&vector, F &&f, std::size_t offset=0)\n-\u00a0 Traverse a blocked vector and call a\n- functor at each scalar entry.\n-\u00a0\n-template\n-std::pair< std::size_t, std::size_t >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh (_\bM_\ba_\bt_\br_\bi_\bx\n- &&matrix, F &&f, std::size_t\n- rowOffset=0, std::size_t colOffset=0)\n-\u00a0 Traverse a blocked matrix and call a\n- functor at each scalar entry.\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs (const G &graph, I index, I endIndex, V\n+ &visitedMap, _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp< typename G::VertexDescriptor > &aggregates)\n \u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00176_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00176_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: foreach.hh Source File\n+dune-istl: renumberer.hh Source File\n \n \n \n \n \n \n \n@@ -70,209 +70,122 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    foreach.hh
    \n+
    renumberer.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    3#pragma once
    \n-
    4
    \n-
    5#include<type_traits>
    \n-
    6#include<utility>
    \n-
    7#include<cassert>
    \n-
    8
    \n-
    9#include<dune/common/std/type_traits.hh>
    \n-
    10#include<dune/common/diagonalmatrix.hh>
    \n-
    11#include<dune/common/hybridutilities.hh>
    \n-
    12#include<dune/common/indices.hh>
    \n-
    13
    \n-\n-\n-
    16
    \n-
    17namespace Dune{
    \n-
    18
    \n-
    19 namespace Impl {
    \n+
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n+
    4// vi: set et ts=4 sw=2 sts=2:
    \n+
    5#ifndef DUNE_AMG_RENUMBERER_HH
    \n+
    6#define DUNE_AMG_RENUMBERER_HH
    \n+
    7
    \n+
    8#include "aggregates.hh"
    \n+
    9
    \n+
    10namespace Dune
    \n+
    11{
    \n+
    12 namespace Amg
    \n+
    13 {
    \n+
    14 template<class G>
    \n+
    \n+\n+
    16 {
    \n+
    17 public:
    \n+
    19 typedef typename G::VertexDescriptor Vertex;
    \n
    20
    \n-
    21 // stolen from dune-functions: we call a type "scalar" if it does not support index accessing
    \n-
    22 template<class C>
    \n-
    23 using StaticIndexAccessConcept = decltype(std::declval<C>()[Dune::Indices::_0]);
    \n-
    24
    \n-
    25 template<class C>
    \n-
    26 using IsScalar = std::negation<Dune::Std::is_detected<StaticIndexAccessConcept, std::remove_reference_t<C>>>;
    \n-
    27
    \n-
    28 // Type trait for matrix types that supports
    \n-
    29 // - iteration done row-wise
    \n-
    30 // - sparse iteration over nonzero entries
    \n-
    31 template <class T>
    \n-
    32 struct IsRowMajorSparse : std::false_type {};
    \n+\n+
    26
    \n+
    28 operator Vertex() const;
    \n+
    29
    \n+
    30 void operator()(const typename G::ConstEdgeIterator& edge);
    \n+
    31
    \n+
    32 void operator++();
    \n
    33
    \n-
    34 // This is supported by the following matrix types:
    \n-
    35 template <class B, class A>
    \n-
    36 struct IsRowMajorSparse<BCRSMatrix<B,A>> : std::true_type {};
    \n-
    37
    \n-
    38 template <class K, int n>
    \n-
    39 struct IsRowMajorSparse<DiagonalMatrix<K,n>> : std::true_type {};
    \n-
    40
    \n-
    41 template <class K, int n>
    \n-
    42 struct IsRowMajorSparse<ScaledIdentityMatrix<K,n>> : std::true_type {};
    \n+
    34 protected:
    \n+\n+\n+
    37 };
    \n+
    \n+
    38
    \n+
    39 template<class G>
    \n+
    \n+\n+
    41 : number_(0), aggregates_(aggregates)
    \n+
    42 {}
    \n+
    \n
    43
    \n-
    44
    \n-
    45 template <class Matrix>
    \n-
    46 auto rows(Matrix const& /*matrix*/, PriorityTag<2>) -> std::integral_constant<std::size_t, Matrix::N()> { return {}; }
    \n-
    47
    \n-
    48 template <class Matrix>
    \n-
    49 auto cols(Matrix const& /*matrix*/, PriorityTag<2>) -> std::integral_constant<std::size_t, Matrix::M()> { return {}; }
    \n-
    50
    \n-
    51 template <class Matrix>
    \n-
    52 auto rows(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.N()) { return matrix.N(); }
    \n-
    53
    \n-
    54 template <class Matrix>
    \n-
    55 auto cols(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.M()) { return matrix.M(); }
    \n-
    56
    \n-
    57 template <class Vector>
    \n-
    58 auto size(Vector const& /*vector*/, PriorityTag<2>) -> std::integral_constant<std::size_t, Vector::size()> { return {}; }
    \n-
    59
    \n-
    60 template <class Vector>
    \n-
    61 auto size(Vector const& vector, PriorityTag<1>) -> decltype(vector.size()) { return vector.size(); }
    \n-
    62
    \n-
    63
    \n-
    64 } // end namespace Impl
    \n-
    65
    \n-
    \n-
    66namespace ForEach{
    \n+
    44 template<class G>
    \n+
    \n+\n+
    46 {
    \n+
    47 return number_;
    \n+
    48 }
    \n+
    \n+
    49
    \n+
    50 template<class G>
    \n+
    \n+
    51 void AggregateRenumberer<G>::operator()(const typename G::ConstEdgeIterator& edge)
    \n+
    52 {
    \n+
    53 aggregates_[edge.target()]=number_;
    \n+
    54 }
    \n+
    \n+
    55
    \n+
    56 template<class G>
    \n+
    \n+\n+
    58 {
    \n+
    59 ++number_;
    \n+
    60 }
    \n+
    \n+
    61
    \n+
    62 template<class G, class I, class V>
    \n+
    \n+
    63 void renumberAggregates(const G& graph, I index, I endIndex, V& visitedMap,
    \n+\n+
    65 {
    \n+
    66 AggregateRenumberer<G> renumberer(aggregates);
    \n
    67
    \n-
    68 template <class Matrix>
    \n-
    69 auto rows(Matrix const& matrix) { return Impl::rows(matrix, PriorityTag<5>{}); }
    \n-
    70
    \n-
    71 template <class Matrix>
    \n-
    72 auto cols(Matrix const& matrix) { return Impl::cols(matrix, PriorityTag<5>{}); }
    \n-
    73
    \n-
    74 template <class Vector>
    \n-
    75 auto size(Vector const& vector) { return Impl::size(vector, PriorityTag<5>{}); }
    \n-
    76
    \n-
    77} // namespace ForEach
    \n+
    68 for(I index1=index; index1 != endIndex; ++index1)
    \n+
    69 if(aggregates[index1.index()]!=AggregatesMap<typename G::VertexDescriptor>::ISOLATED &&
    \n+
    70 !get(visitedMap, index1.index())) {
    \n+
    71
    \n+
    72 aggregates.template breadthFirstSearch<false>(index1.index(), aggregates[index1.index()],
    \n+
    73 graph, renumberer, visitedMap);
    \n+
    74 aggregates[index1.index()] = renumberer;
    \n+
    75 ++renumberer;
    \n+
    76 }
    \n+
    77 for(; index != endIndex; ++index)
    \n+
    78 put(visitedMap, index.index(), false);
    \n+
    79 }
    \n
    \n-
    78
    \n-
    79
    \n
    80
    \n-
    81
    \n-
    94template <class Vector, class F>
    \n-
    \n-
    95std::size_t flatVectorForEach(Vector&& vector, F&& f, std::size_t offset = 0)
    \n-
    96{
    \n-
    97 using V = std::decay_t<Vector>;
    \n-
    98 if constexpr( Impl::IsScalar<V>::value )
    \n-
    99 {
    \n-
    100 f(vector, offset);
    \n-
    101 return 1;
    \n-
    102 }
    \n-
    103 else
    \n-
    104 {
    \n-
    105 std::size_t idx = 0;
    \n-
    106 Hybrid::forEach(Dune::range(ForEach::size(vector)), [&](auto i) {
    \n-
    107 idx += flatVectorForEach(vector[i], f, offset + idx);
    \n-
    108 });
    \n-
    109 return idx;
    \n-
    110 }
    \n-
    111}
    \n-
    \n-
    112
    \n-
    113
    \n-
    131template <class Matrix, class F>
    \n-
    \n-
    132std::pair<std::size_t,std::size_t> flatMatrixForEach(Matrix&& matrix, F&& f, std::size_t rowOffset = 0, std::size_t colOffset = 0)
    \n-
    133{
    \n-
    134 using M = std::decay_t<Matrix>;
    \n-
    135 if constexpr ( Impl::IsScalar<M>::value )
    \n-
    136 {
    \n-
    137 f(matrix,rowOffset,colOffset);
    \n-
    138 return {1,1};
    \n-
    139 }
    \n-
    140 else
    \n-
    141 {
    \n-
    142 // if M supports the IsRowMajorSparse type trait: iterate just over the nonzero entries and
    \n-
    143 // and compute the flat row/col size directly
    \n-
    144 if constexpr ( Impl::IsRowMajorSparse<M>::value )
    \n-
    145 {
    \n-
    146 using Block = std::decay_t<decltype(matrix[0][0])>;
    \n-
    147
    \n-
    148 // find an existing block or at least try to create one
    \n-
    149 auto block = [&]{
    \n-
    150 for (auto const& row : matrix)
    \n-
    151 for (auto const& entry : row)
    \n-
    152 return entry;
    \n-
    153 return Block{};
    \n-
    154 }();
    \n-
    155
    \n-
    156 // compute the scalar size of the block
    \n-
    157 auto [blockRows, blockCols] = flatMatrixForEach(block, [](...){});
    \n-
    158
    \n-
    159 // check whether we have valid sized blocks
    \n-
    160 assert( ( blockRows!=0 or blockCols!=0 ) and "the block size can't be zero");
    \n-
    161
    \n-
    162 for (auto rowIt = matrix.begin(); rowIt != matrix.end(); ++rowIt)
    \n-
    163 {
    \n-
    164 auto&& row = *rowIt;
    \n-
    165 auto rowIdx = rowIt.index();
    \n-
    166 for (auto colIt = row.begin(); colIt != row.end(); colIt++)
    \n-
    167 {
    \n-
    168 auto&& entry = *colIt;
    \n-
    169 auto colIdx = colIt.index();
    \n-
    170#ifndef NDEBUG
    \n-
    171 // only instantiate return value in debug mode (for the assert)
    \n-
    172 auto [ numRows, numCols ] =
    \n-
    173#endif
    \n-
    174 flatMatrixForEach(entry, f, rowOffset + rowIdx*blockRows, colOffset + colIdx*blockCols);
    \n-
    175 assert( numRows == blockRows and numCols == blockCols and "we need the same size of each block in this matrix type");
    \n-
    176 }
    \n-
    177 }
    \n-
    178
    \n-
    179 return { matrix.N()*blockRows, matrix.M()*blockCols };
    \n-
    180 }
    \n-
    181 // all other matrix types are accessed index-wise with dynamic flat row/col counting
    \n-
    182 else
    \n-
    183 {
    \n-
    184 std::size_t r = 0, c = 0;
    \n-
    185 std::size_t nRows, nCols;
    \n-
    186
    \n-
    187 Hybrid::forEach(Dune::range(ForEach::rows(matrix)), [&](auto i) {
    \n-
    188 c = 0;
    \n-
    189 Hybrid::forEach(Dune::range(ForEach::cols(matrix)), [&](auto j) {
    \n-
    190 std::tie(nRows,nCols) = flatMatrixForEach(matrix[i][j], f, rowOffset + r, colOffset + c);
    \n-
    191 c += nCols;
    \n-
    192 });
    \n-
    193 r += nRows;
    \n-
    194 });
    \n-
    195 return {r,c};
    \n-
    196 }
    \n-
    197 }
    \n-
    198}
    \n-
    \n-
    199
    \n-
    200} // namespace Dune
    \n-
    Implementation of the BCRSMatrix class.
    \n-
    This file implements a quadratic matrix of fixed size which is a multiple of the identity.
    \n+
    81 } // namespace AMG
    \n+
    82} // namespace Dune
    \n+
    83#endif
    \n+
    Provides classes for the Coloring process of AMG.
    \n
    Definition allocator.hh:11
    \n-
    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
    \n-
    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
    \n-
    auto rows(Matrix const &matrix)
    Definition foreach.hh:69
    \n-
    auto cols(Matrix const &matrix)
    Definition foreach.hh:72
    \n-
    auto size(Vector const &vector)
    Definition foreach.hh:75
    \n-
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n-
    size_type M() const
    Return the number of columns.
    Definition matrix.hh:696
    \n-
    size_type N() const
    Return the number of rows.
    Definition matrix.hh:691
    \n+
    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
    \n+
    void renumberAggregates(const G &graph, I index, I endIndex, V &visitedMap, AggregatesMap< typename G::VertexDescriptor > &aggregates)
    Definition renumberer.hh:63
    \n+
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n+
    Definition renumberer.hh:16
    \n+
    void operator++()
    Definition renumberer.hh:57
    \n+
    G::VertexDescriptor Vertex
    The vertex type.
    Definition renumberer.hh:19
    \n+
    void operator()(const typename G::ConstEdgeIterator &edge)
    Definition renumberer.hh:51
    \n+
    AggregatesMap< Vertex > & aggregates_
    Definition renumberer.hh:36
    \n+
    AggregateRenumberer(AggregatesMap< Vertex > &aggregates)
    Constructor.
    Definition renumberer.hh:40
    \n+
    Vertex number_
    Definition renumberer.hh:35
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,237 +1,131 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-foreach.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+renumberer.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3#pragma once\n-4\n-5#include\n-6#include\n-7#include\n-8\n-9#include\n-10#include\n-11#include\n-12#include\n-13\n-14#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-15#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-16\n-17namespace _\bD_\bu_\bn_\be{\n-18\n-19 namespace Impl {\n+3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n+4// vi: set et ts=4 sw=2 sts=2:\n+5#ifndef DUNE_AMG_RENUMBERER_HH\n+6#define DUNE_AMG_RENUMBERER_HH\n+7\n+8#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n+9\n+10namespace _\bD_\bu_\bn_\be\n+11{\n+12 namespace Amg\n+13 {\n+14 template\n+_\b1_\b5 class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n+16 {\n+17 public:\n+_\b1_\b9 typedef typename G::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n 20\n-21 // stolen from dune-functions: we call a type \"scalar\" if it does not\n-support index accessing\n-22 template\n-23 using StaticIndexAccessConcept = decltype(std::declval()[Dune::Indices::\n-_0]);\n-24\n-25 template\n-26 using IsScalar = std::negation>>;\n-27\n-28 // Type trait for matrix types that supports\n-29 // - iteration done row-wise\n-30 // - sparse iteration over nonzero entries\n-31 template \n-32 struct IsRowMajorSparse : std::false_type {};\n+25 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br(_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates);\n+26\n+28 operator _\bV_\be_\br_\bt_\be_\bx() const;\n+29\n+30 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename G::ConstEdgeIterator& edge);\n+31\n+32 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n 33\n-34 // This is supported by the following matrix types:\n-35 template \n-36 struct IsRowMajorSparse> : std::true_type {};\n-37\n-38 template \n-39 struct IsRowMajorSparse> : std::true_type {};\n-40\n-41 template \n-42 struct IsRowMajorSparse> : std::true_type {};\n+34 protected:\n+_\b3_\b5 _\bV_\be_\br_\bt_\be_\bx _\bn_\bu_\bm_\bb_\be_\br_\b_;\n+_\b3_\b6 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& _\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b_;\n+37 };\n+38\n+39 template\n+_\b4_\b0 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br(_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n+aggregates)\n+41 : number_(0), aggregates_(aggregates)\n+42 {}\n 43\n-44\n-45 template \n-46 auto rows(Matrix const& /*matrix*/, PriorityTag<2>) -> std::\n-integral_constant { return {}; }\n-47\n-48 template \n-49 auto cols(Matrix const& /*matrix*/, PriorityTag<2>) -> std::\n-integral_constant { return {}; }\n-50\n-51 template \n-52 auto rows(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.N())\n-{ return matrix.N(); }\n-53\n-54 template \n-55 auto cols(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.M())\n-{ return matrix.M(); }\n-56\n-57 template \n-58 auto size(Vector const& /*vector*/, PriorityTag<2>) -> std::\n-integral_constant { return {}; }\n-59\n-60 template \n-61 auto size(Vector const& vector, PriorityTag<1>) -> decltype(vector.size())\n-{ return vector.size(); }\n-62\n-63\n-64 } // end namespace Impl\n-65\n-_\b6_\b6namespace ForEach{\n+44 template\n+_\b4_\b5 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br _\bV_\be_\br_\bt_\be_\bx() const\n+46 {\n+47 return number_;\n+48 }\n+49\n+50 template\n+_\b5_\b1 void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename G::ConstEdgeIterator&\n+edge)\n+52 {\n+53 aggregates_[edge.target()]=number_;\n+54 }\n+55\n+56 template\n+_\b5_\b7 void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+58 {\n+59 ++number_;\n+60 }\n+61\n+62 template\n+_\b6_\b3 void _\br_\be_\bn_\bu_\bm_\bb_\be_\br_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs(const G& graph, I index, I endIndex, V& visitedMap,\n+64 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates)\n+65 {\n+66 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b> renumberer(aggregates);\n 67\n-68 template \n-_\b6_\b9 auto _\br_\bo_\bw_\bs(_\bM_\ba_\bt_\br_\bi_\bx const& matrix) { return Impl::rows(matrix, PriorityTag<5>\n-{}); }\n-70\n-71 template \n-_\b7_\b2 auto _\bc_\bo_\bl_\bs(_\bM_\ba_\bt_\br_\bi_\bx const& matrix) { return Impl::cols(matrix, PriorityTag<5>\n-{}); }\n-73\n-74 template \n-_\b7_\b5 auto _\bs_\bi_\bz_\be(Vector const& vector) { return Impl::size(vector, PriorityTag<5>\n-{}); }\n-76\n-77} // namespace ForEach\n-78\n-79\n+68 for(I index1=index; index1 != endIndex; ++index1)\n+69 if(aggregates[index1.index()]!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:\n+_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD &&\n+70 !_\bg_\be_\bt(visitedMap, index1.index())) {\n+71\n+72 aggregates.template breadthFirstSearch(index1.index(), aggregates\n+[index1.index()],\n+73 graph, renumberer, visitedMap);\n+74 aggregates[index1.index()] = renumberer;\n+75 ++renumberer;\n+76 }\n+77 for(; index != endIndex; ++index)\n+78 put(visitedMap, index.index(), false);\n+79 }\n 80\n-81\n-94template \n-_\b9_\b5std::size_t _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(Vector&& vector, F&& f, std::size_t offset = 0)\n-96{\n-97 using V = std::decay_t;\n-98 if constexpr( Impl::IsScalar::value )\n-99 {\n-100 f(vector, offset);\n-101 return 1;\n-102 }\n-103 else\n-104 {\n-105 std::size_t idx = 0;\n-106 Hybrid::forEach(Dune::range(_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bs_\bi_\bz_\be(vector)), [&](auto i) {\n-107 idx += _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(vector[i], f, offset + idx);\n-108 });\n-109 return idx;\n-110 }\n-111}\n-112\n-113\n-131template \n-_\b1_\b3_\b2std::pair _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(_\bM_\ba_\bt_\br_\bi_\bx&& matrix, F&& f,\n-std::size_t rowOffset = 0, std::size_t colOffset = 0)\n-133{\n-134 using M = std::decay_t;\n-135 if constexpr ( Impl::IsScalar::value )\n-136 {\n-137 f(matrix,rowOffset,colOffset);\n-138 return {1,1};\n-139 }\n-140 else\n-141 {\n-142 // if M supports the IsRowMajorSparse type trait: iterate just over the\n-nonzero entries and\n-143 // and compute the flat row/col size directly\n-144 if constexpr ( Impl::IsRowMajorSparse::value )\n-145 {\n-146 using Block = std::decay_t;\n-147\n-148 // find an existing block or at least try to create one\n-149 auto block = [&]{\n-150 for (auto const& row : matrix)\n-151 for (auto const& entry : row)\n-152 return entry;\n-153 return Block{};\n-154 }();\n-155\n-156 // compute the scalar size of the block\n-157 auto [blockRows, blockCols] = _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(block, [](...){});\n-158\n-159 // check whether we have valid sized blocks\n-160 assert( ( blockRows!=0 or blockCols!=0 ) and \"the block size can't be\n-zero\");\n-161\n-162 for (auto rowIt = matrix.begin(); rowIt != matrix.end(); ++rowIt)\n-163 {\n-164 auto&& row = *rowIt;\n-165 auto rowIdx = rowIt.index();\n-166 for (auto colIt = row.begin(); colIt != row.end(); colIt++)\n-167 {\n-168 auto&& entry = *colIt;\n-169 auto colIdx = colIt.index();\n-170#ifndef NDEBUG\n-171 // only instantiate return value in debug mode (for the assert)\n-172 auto [ numRows, numCols ] =\n-173#endif\n-174 _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(entry, f, rowOffset + rowIdx*blockRows, colOffset +\n-colIdx*blockCols);\n-175 assert( numRows == blockRows and numCols == blockCols and \"we need the same\n-size of each block in this matrix type\");\n-176 }\n-177 }\n-178\n-179 return { matrix.N()*blockRows, matrix.M()*blockCols };\n-180 }\n-181 // all other matrix types are accessed index-wise with dynamic flat row/col\n-counting\n-182 else\n-183 {\n-184 std::size_t r = 0, c = 0;\n-185 std::size_t nRows, nCols;\n-186\n-187 Hybrid::forEach(Dune::range(_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\br_\bo_\bw_\bs(matrix)), [&](auto i) {\n-188 c = 0;\n-189 Hybrid::forEach(Dune::range(_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bc_\bo_\bl_\bs(matrix)), [&](auto j) {\n-190 std::tie(nRows,nCols) = _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(matrix[i][j], f, rowOffset + r,\n-colOffset + c);\n-191 c += nCols;\n-192 });\n-193 r += nRows;\n-194 });\n-195 return {r,c};\n-196 }\n-197 }\n-198}\n-199\n-200} // namespace Dune\n-_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implementation of the BCRSMatrix class.\n-_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-This file implements a quadratic matrix of fixed size which is a multiple of\n-the identity.\n+81 } // namespace AMG\n+82} // namespace Dune\n+83#endif\n+_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n+Provides classes for the Coloring process of AMG.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh\n-std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f,\n-std::size_t rowOffset=0, std::size_t colOffset=0)\n-Traverse a blocked matrix and call a functor at each scalar entry.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh\n-std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0)\n-Traverse a blocked vector and call a functor at each scalar entry.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\br_\bo_\bw_\bs\n-auto rows(Matrix const &matrix)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bc_\bo_\bl_\bs\n-auto cols(Matrix const &matrix)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bs_\bi_\bz_\be\n-auto size(Vector const &vector)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-A generic dynamic dense matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n-size_type M() const\n-Return the number of columns.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:696\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-size_type N() const\n-Return the number of rows.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:691\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs\n+void renumberAggregates(const G &graph, I index, I endIndex, V &visitedMap,\n+AggregatesMap< typename G::VertexDescriptor > &aggregates)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+Class providing information about the mapping of the vertices onto aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+void operator++()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+G::VertexDescriptor Vertex\n+The vertex type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const typename G::ConstEdgeIterator &edge)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b_\n+AggregatesMap< Vertex > & aggregates_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n+AggregateRenumberer(AggregatesMap< Vertex > &aggregates)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bn_\bu_\bm_\bb_\be_\br_\b_\n+Vertex number_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:35\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00179.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00179.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixmarket.hh File Reference\n+dune-istl: graphcreator.hh File Reference\n \n \n \n \n \n \n \n@@ -65,271 +65,47 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n \n+
    graphcreator.hh File Reference
    \n \n
    \n-\n-

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

    \n-
    #include <algorithm>
    \n-#include <complex>
    \n-#include <cstddef>
    \n-#include <fstream>
    \n-#include <ios>
    \n-#include <iostream>
    \n-#include <istream>
    \n-#include <limits>
    \n-#include <ostream>
    \n-#include <set>
    \n-#include <sstream>
    \n-#include <string>
    \n-#include <tuple>
    \n-#include <type_traits>
    \n-#include <vector>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/fmatrix.hh>
    \n-#include <dune/common/fvector.hh>
    \n-#include <dune/common/hybridutilities.hh>
    \n-#include <dune/common/stdstreams.hh>
    \n-#include <dune/common/simd/simd.hh>
    \n-#include <dune/istl/bcrsmatrix.hh>
    \n-#include <dune/istl/bvector.hh>
    \n-#include <dune/istl/matrixutils.hh>
    \n-#include <dune/istl/owneroverlapcopy.hh>
    \n+
    #include <tuple>
    \n+#include "graph.hh"
    \n+#include "dependency.hh"
    \n+#include "pinfo.hh"
    \n+#include <dune/istl/operators.hh>
    \n+#include <dune/istl/bcrsmatrix.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n

    \n 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::MatrixMarketImpl::mm_block_structure_header< BlockVector< T, A > >
     
    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::Amg::PropertiesGraphCreator< M, PI >
     
    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
    struct  Dune::Amg::PropertiesGraphCreator< M, SequentialInformation >
     
    \n \n \n \n-\n+\n \n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::MatrixMarketImpl
    namespace  Dune::Amg
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Enumerations

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

    \n-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.
     
    \n-\n-\n-\n

    \n-Variables

    static const int Dune::default_precision = -1
     
    \n-

    Detailed Description

    \n-

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

    \n-
    Author
    Markus Blatt
    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,316 +1,28 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs | _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs\n-matrixmarket.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bS_\bp_\ba_\br_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bc_\bl_\ba_\bs_\bs_\be_\bs \u00bb\n-_\bI_\bO_\b _\bf_\bo_\br_\b _\bm_\ba_\bt_\br_\bi_\bc_\be_\bs_\b _\ba_\bn_\bd_\b _\bv_\be_\bc_\bt_\bo_\br_\bs_\b.\n-Provides classes for reading and writing MatrixMarket Files with an extension\n-for parallel matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+graphcreator.hh File Reference\n #include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n+#include \"_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh\"\n+#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bT_\b _\b>\n-\u00a0 Helper metaprogram to get the matrix market string representation of\n- the numeric type. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bP_\bI_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bi_\bn_\bt_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bj_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,_\b _\bj_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n- _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<\n- _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bi_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>\n- _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<\n- _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,_\b _\bj_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,\n- _\bj_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bi_\b _\b>\n- _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0 a wrapper class of numeric values. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by\n-\u00a0 Utility class for marking the pattern type of the MatrixMarket\n- matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\b _\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b<_\b _\bD_\b,_\b _\bb_\br_\bo_\bw_\bs_\b,_\b _\bb_\bc_\bo_\bl_\bs_\b _\b>\n-\u00a0 Functor to the data values of the matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b<_\b _\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by_\b,_\b _\bb_\br_\bo_\bw_\bs_\b,_\b _\bb_\bc_\bo_\bl_\bs\n- _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bT_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bT_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\b _\bM_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bi_\b,\n- _\bj_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl\n-\u00a0\n-E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bL_\bi_\bn_\be_\bT_\by_\bp_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bH_\bE_\bA_\bD_\bE_\bR ,\n- _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bI_\bS_\bT_\bL_\bS_\bT_\bR_\bU_\bC_\bT , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bD_\bA_\bT_\bA }\n-\u00a0\n-enum \u00a0 { _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bM_\bA_\bX_\b__\bL_\bI_\bN_\bE_\b__\bL_\bE_\bN_\bG_\bT_\bH =1025 }\n-\u00a0\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bT_\bY_\bP_\bE { _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:\n- _\bc_\bo_\bo_\br_\bd_\bi_\bn_\ba_\bt_\be_\b__\bt_\by_\bp_\be , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\ba_\br_\br_\ba_\by_\b__\bt_\by_\bp_\be , _\bD_\bu_\bn_\be_\b:_\b:\n- _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bt_\by_\bp_\be }\n-\u00a0\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bC_\bT_\bY_\bP_\bE {\n- \u00a0\u00a0_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bt_\by_\bp_\be , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:\n- _\bd_\bo_\bu_\bb_\bl_\be_\b__\bt_\by_\bp_\be , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b__\bt_\by_\bp_\be , _\bD_\bu_\bn_\be_\b:_\b:\n- _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bp_\ba_\bt_\bt_\be_\br_\bn ,\n- \u00a0\u00a0_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bc_\bt_\by_\bp_\be\n- }\n-\u00a0\n-enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bS_\bT_\bR_\bU_\bC_\bT_\bU_\bR_\bE {\n- \u00a0\u00a0_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bg_\be_\bn_\be_\br_\ba_\bl , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc ,\n- _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc , _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:\n- _\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn ,\n- \u00a0\u00a0_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be\n- }\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bl_\bi_\bn_\be_\bF_\be_\be_\bd (std::\n- istream &file)\n-\u00a0\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bk_\bi_\bp_\bC_\bo_\bm_\bm_\be_\bn_\bt_\bs\n- (std::istream &file)\n-\u00a0\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:\n- _\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bB_\ba_\bn_\bn_\be_\br (std::istream\n- &file, _\bM_\bM_\bH_\be_\ba_\bd_\be_\br &mmHeader)\n-\u00a0\n-template\n- std::tuple< std::size_t, std::size_t, _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bN_\bN_\bZ\n- std::size_t >\u00a0 (std::size_t rows, std::size_t cols,\n- std::size_t entries, const _\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n- &header)\n-\u00a0\n-template\n- std::istream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n- (std::istream &is, _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br< T >\n- &num)\n-\u00a0\n- std::istream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n- (std::istream &is, _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br<\n- _\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by > &num)\n-\u00a0\n-template\n- bool\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n- (const _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba< T > &i1, const\n- _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba< T > &i2)\n-\u00a0 LessThan operator.\n-\u00a0\n-template\n- std::istream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n- (std::istream &is, _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba< T >\n- &data)\n-\u00a0 Read _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba from a stream.\n-\u00a0\n-template\n- std::istream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n- (std::istream &is, _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba<\n- _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br< std::complex< T > > >\n- &data)\n-\u00a0 Read _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba from a stream.\n- Specialization for std::complex.\n-\u00a0\n-template\n- std::enable_if_t:: _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bn_\bj (const T\n- value, T >\u00a0 &r)\n-\u00a0\n-template\n- std::enable_if_t< _\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx< T >:: _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bn_\bj (const T\n- value, T >\u00a0 &r)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:\n- _\br_\be_\ba_\bd_\bS_\bp_\ba_\br_\bs_\be_\bE_\bn_\bt_\br_\bi_\be_\bs (_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< T,\n- A > &matrix, std::istream &file, std::\n- size_t entries, const _\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n- &mmHeader, const D &)\n-\u00a0\n-std::tuple< std::string, std::string >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n- (const std::string &filename)\n-\u00a0\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bh_\be_\ba_\bd_\be_\br (std::size_t\n- &rows, std::size_t &cols,\n- _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br &header,\n- std::istream &istr, bool isVector)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs (_\bD_\bu_\bn_\be_\b:_\b:\n- _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br< T, A > &vector, std::\n- size_t size, std::istream &istr, size_t\n- lane)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs (_\bD_\bu_\bn_\be_\b:_\b:\n- _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br< Dune::FieldVector< T,\n- entries >, A > &vector, std::size_t\n- size, std::istream &istr, size_t lane)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (_\bD_\bu_\bn_\be_\b:_\b:\n- _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br< T, A > &vector, std::\n- istream &istr)\n-\u00a0 Reads a _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br from a matrix\n- market file.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (_\bD_\bu_\bn_\be_\b:_\b:\n- _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx< T, A > &matrix, std::\n- istream &istr)\n-\u00a0 Reads a sparse matrix from a matrix\n- market file.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\be_\bn_\bt_\br_\by (const B &entry,\n- std::size_t rowidx, std::size_t colidx,\n- std::ostream &ostr)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by (const V\n- &entry, std::ostream &ostr, const std::\n- integral_constant< int, 1 > &, size_t\n- lane)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by (const V\n- &vector, std::ostream &ostr, const\n- std::integral_constant< int, 0 > &,\n- size_t lane)\n-\u00a0\n-template\n- std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs (const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br<\n- T, A > &vector)\n-\u00a0\n-template\n- std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs (const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br<\n- FieldVector< T, i >, A > &vector)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (const V\n- &vector, std::ostream &ostr, const\n- std::integral_constant< int, 0 > &)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (const M\n- &matrix, std::ostream &ostr, const\n- std::integral_constant< int, 1 > &)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (const M\n- &matrix, std::ostream &ostr)\n-\u00a0 writes a _\bI_\bS_\bT_\bL matrix or vector to a\n- stream in matrix market format.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\bo_\br_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (const M\n- &matrix, std::string filename, int\n- prec=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn)\n-\u00a0 Stores a parallel matrix/vector in\n- matrix market format in a file.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\bo_\br_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (const M\n- &matrix, std::string filename, const\n- _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn< G, L >\n- &comm, bool storeIndices=true, int\n- prec=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn)\n-\u00a0 Stores a parallel matrix/vector in\n- matrix market format in a file.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (M &matrix,\n- const std::string &filename,\n- _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn< G, L >\n- &comm, bool readIndices=true)\n-\u00a0 Load a parallel matrix/vector stored in\n- matrix market format.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt (M &matrix,\n- const std::string &filename)\n-\u00a0 Load a matrix/vector stored in matrix\n- market format.\n-\u00a0\n-V\bVa\bar\bri\bia\bab\bbl\ble\bes\bs\n-static const int\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn = -1\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Provides classes for reading and writing MatrixMarket Files with an extension\n-for parallel matrices.\n- Author\n- Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00179_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00179_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixmarket.hh Source File\n+dune-istl: graphcreator.hh Source File\n \n \n \n \n \n \n \n@@ -70,1503 +70,156 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    matrixmarket.hh
    \n+
    graphcreator.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_MATRIXMARKET_HH
    \n-
    6#define DUNE_ISTL_MATRIXMARKET_HH
    \n+
    5#ifndef DUNE_AMG_GRAPHCREATOR_HH
    \n+
    6#define DUNE_AMG_GRAPHCREATOR_HH
    \n
    7
    \n-
    8#include <algorithm>
    \n-
    9#include <complex>
    \n-
    10#include <cstddef>
    \n-
    11#include <fstream>
    \n-
    12#include <ios>
    \n-
    13#include <iostream>
    \n-
    14#include <istream>
    \n-
    15#include <limits>
    \n-
    16#include <ostream>
    \n-
    17#include <set>
    \n-
    18#include <sstream>
    \n-
    19#include <string>
    \n-
    20#include <tuple>
    \n-
    21#include <type_traits>
    \n-
    22#include <vector>
    \n-
    23
    \n-
    24#include <dune/common/exceptions.hh>
    \n-
    25#include <dune/common/fmatrix.hh>
    \n-
    26#include <dune/common/fvector.hh>
    \n-
    27#include <dune/common/hybridutilities.hh>
    \n-
    28#include <dune/common/stdstreams.hh>
    \n-
    29#include <dune/common/simd/simd.hh>
    \n-
    30
    \n-\n-
    32#include <dune/istl/bvector.hh>
    \n-
    33#include <dune/istl/matrixutils.hh> // countNonZeros()
    \n-\n+
    8#include <tuple>
    \n+
    9
    \n+
    10#include "graph.hh"
    \n+
    11#include "dependency.hh"
    \n+
    12#include "pinfo.hh"
    \n+\n+\n+
    15
    \n+
    16namespace Dune
    \n+
    17{
    \n+
    18 namespace Amg
    \n+
    19 {
    \n+
    20 template<class M, class PI>
    \n+
    \n+\n+
    22 {
    \n+
    23 typedef typename M::matrix_type Matrix;
    \n+\n+\n+
    26 std::vector<bool> > SubGraph;
    \n+\n+\n+\n+
    30 IdentityMap,
    \n+\n+\n+
    33
    \n+
    34 typedef std::tuple<MatrixGraph*,PropertiesGraph*,SubGraph*> GraphTuple;
    \n
    35
    \n-
    36namespace Dune
    \n-
    37{
    \n-
    38
    \n-
    \n-
    64 namespace MatrixMarketImpl
    \n-
    65 {
    \n-
    75 template<class T>
    \n-
    \n-\n-
    77 enum {
    \n-
    81 is_numeric=false
    \n-
    82 };
    \n-
    83 };
    \n-
    \n-
    84
    \n-
    85 template<>
    \n-
    \n-
    86 struct mm_numeric_type<int>
    \n-
    87 {
    \n-
    88 enum {
    \n-
    92 is_numeric=true
    \n-
    93 };
    \n-
    94
    \n-
    \n-
    95 static std::string str()
    \n-
    96 {
    \n-
    97 return "integer";
    \n-
    98 }
    \n-
    \n-
    99 };
    \n-
    \n-
    100
    \n-
    101 template<>
    \n-
    \n-
    102 struct mm_numeric_type<double>
    \n-
    103 {
    \n-
    104 enum {
    \n-
    108 is_numeric=true
    \n-
    109 };
    \n-
    110
    \n-
    \n-
    111 static std::string str()
    \n-
    112 {
    \n-
    113 return "real";
    \n-
    114 }
    \n-
    \n-
    115 };
    \n-
    \n-
    116
    \n-
    117 template<>
    \n-
    \n-
    118 struct mm_numeric_type<float>
    \n-
    119 {
    \n-
    120 enum {
    \n-
    124 is_numeric=true
    \n-
    125 };
    \n-
    126
    \n-
    \n-
    127 static std::string str()
    \n-
    128 {
    \n-
    129 return "real";
    \n-
    130 }
    \n-
    \n-
    131 };
    \n-
    \n-
    132
    \n-
    133 template<>
    \n-
    \n-
    134 struct mm_numeric_type<std::complex<double> >
    \n-
    135 {
    \n-
    136 enum {
    \n-
    140 is_numeric=true
    \n-
    141 };
    \n-
    142
    \n-
    \n-
    143 static std::string str()
    \n-
    144 {
    \n-
    145 return "complex";
    \n-
    146 }
    \n-
    \n-
    147 };
    \n-
    \n-
    148
    \n-
    149 template<>
    \n-
    \n-
    150 struct mm_numeric_type<std::complex<float> >
    \n-
    151 {
    \n-
    152 enum {
    \n-
    156 is_numeric=true
    \n-
    157 };
    \n-
    158
    \n-
    \n-
    159 static std::string str()
    \n-
    160 {
    \n-
    161 return "complex";
    \n-
    162 }
    \n-
    \n-
    163 };
    \n-
    \n-
    164
    \n-
    173 template<class M>
    \n-\n-
    175
    \n-
    176 template<typename T, typename A>
    \n-
    \n-\n-
    178 {
    \n-
    \n-
    179 static void print(std::ostream& os)
    \n-
    180 {
    \n-
    181 os<<"%%MatrixMarket matrix coordinate ";
    \n-
    182 os<<mm_numeric_type<Simd::Scalar<typename Imp::BlockTraits<T>::field_type>>::str()<<" general"<<std::endl;
    \n-
    183 }
    \n-
    \n-
    184 };
    \n-
    \n-
    185
    \n-
    186 template<typename B, typename A>
    \n-
    \n-\n-
    188 {
    \n-
    \n-
    189 static void print(std::ostream& os)
    \n-
    190 {
    \n-
    191 os<<"%%MatrixMarket matrix array ";
    \n-
    192 os<<mm_numeric_type<Simd::Scalar<typename Imp::BlockTraits<B>::field_type>>::str()<<" general"<<std::endl;
    \n-
    193 }
    \n-
    \n-
    194 };
    \n-
    \n-
    195
    \n-
    196 template<typename T, int j>
    \n-
    \n-
    197 struct mm_header_printer<FieldVector<T,j> >
    \n-
    198 {
    \n-
    \n-
    199 static void print(std::ostream& os)
    \n-
    200 {
    \n-
    201 os<<"%%MatrixMarket matrix array ";
    \n-
    202 os<<mm_numeric_type<T>::str()<<" general"<<std::endl;
    \n-
    203 }
    \n-
    \n-
    204 };
    \n-
    \n-
    205
    \n-
    206 template<typename T, int i, int j>
    \n-
    \n-\n-
    208 {
    \n-
    \n-
    209 static void print(std::ostream& os)
    \n-
    210 {
    \n-
    211 os<<"%%MatrixMarket matrix array ";
    \n-
    212 os<<mm_numeric_type<T>::str()<<" general"<<std::endl;
    \n-
    213 }
    \n-
    \n-
    214 };
    \n-
    \n-
    215
    \n-
    224 template<class M>
    \n-\n-
    226
    \n-
    227 template<typename T, typename A>
    \n-
    \n-\n-
    229 {
    \n-\n-
    231 static_assert(IsNumber<T>::value, "Only scalar entries are expected here!");
    \n-
    232
    \n-
    \n-
    233 static void print(std::ostream& os, const M&)
    \n-
    234 {
    \n-
    235 os<<"% ISTL_STRUCT blocked ";
    \n-
    236 os<<"1 1"<<std::endl;
    \n-
    237 }
    \n-
    \n-
    238 };
    \n-
    \n-
    239
    \n-
    240 template<typename T, typename A, int i>
    \n-
    \n-
    241 struct mm_block_structure_header<BlockVector<FieldVector<T,i>,A> >
    \n-
    242 {
    \n-\n-
    244
    \n-
    \n-
    245 static void print(std::ostream& os, const M&)
    \n-
    246 {
    \n-
    247 os<<"% ISTL_STRUCT blocked ";
    \n-
    248 os<<i<<" "<<1<<std::endl;
    \n-
    249 }
    \n-
    \n-
    250 };
    \n-
    \n-
    251
    \n-
    252 template<typename T, typename A>
    \n-
    \n-\n-
    254 {
    \n-\n-
    256 static_assert(IsNumber<T>::value, "Only scalar entries are expected here!");
    \n-
    257
    \n-
    \n-
    258 static void print(std::ostream& os, const M&)
    \n-
    259 {
    \n-
    260 os<<"% ISTL_STRUCT blocked ";
    \n-
    261 os<<"1 1"<<std::endl;
    \n-
    262 }
    \n-
    \n-
    263 };
    \n-
    \n-
    264
    \n-
    265 template<typename T, typename A, int i, int j>
    \n-
    \n-\n-
    267 {
    \n-\n-
    269
    \n-
    \n-
    270 static void print(std::ostream& os, const M&)
    \n-
    271 {
    \n-
    272 os<<"% ISTL_STRUCT blocked ";
    \n-
    273 os<<i<<" "<<j<<std::endl;
    \n-
    274 }
    \n-
    \n-
    275 };
    \n-
    \n-
    276
    \n-
    277
    \n-
    278 template<typename T, int i, int j>
    \n-
    \n-\n-
    280 {
    \n-\n-
    282
    \n-
    \n-
    283 static void print(std::ostream& os, const M& m)
    \n-
    284 {}
    \n-
    \n-
    285 };
    \n-
    \n-
    286
    \n-
    287 template<typename T, int i>
    \n-
    \n-
    288 struct mm_block_structure_header<FieldVector<T,i> >
    \n-
    289 {
    \n-
    290 typedef FieldVector<T,i> M;
    \n-
    291
    \n-
    \n-
    292 static void print(std::ostream& os, const M& m)
    \n-
    293 {}
    \n-
    \n-
    294 };
    \n-
    \n-
    295
    \n-\n-
    297 enum { MM_MAX_LINE_LENGTH=1025 };
    \n-
    298
    \n-\n-
    300
    \n-\n-
    302
    \n-\n-
    304
    \n-
    \n-
    305 struct MMHeader
    \n-
    306 {
    \n-\n-\n-\n-\n-
    313 };
    \n-
    \n-
    314
    \n-
    \n-
    315 inline bool lineFeed(std::istream& file)
    \n-
    316 {
    \n-
    317 char c;
    \n-
    318 if(!file.eof())
    \n-
    319 c=file.peek();
    \n-
    320 else
    \n-
    321 return false;
    \n-
    322 // ignore whitespace
    \n-
    323 while(c==' ')
    \n-
    324 {
    \n-
    325 file.get();
    \n-
    326 if(file.eof())
    \n-
    327 return false;
    \n-
    328 c=file.peek();
    \n-
    329 }
    \n-
    330
    \n-
    331 if(c=='\\n') {
    \n-
    332 /* eat the line feed */
    \n-
    333 file.get();
    \n-
    334 return true;
    \n-
    335 }
    \n-
    336 return false;
    \n-
    337 }
    \n-
    \n-
    338
    \n-
    \n-
    339 inline void skipComments(std::istream& file)
    \n-
    340 {
    \n-
    341 lineFeed(file);
    \n-
    342 char c=file.peek();
    \n-
    343 // ignore comment lines
    \n-
    344 while(c=='%')
    \n-
    345 {
    \n-
    346 /* discard the rest of the line */
    \n-
    347 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    348 c=file.peek();
    \n-
    349 }
    \n-
    350 }
    \n-
    \n-
    351
    \n-
    352
    \n-
    \n-
    353 inline bool readMatrixMarketBanner(std::istream& file, MMHeader& mmHeader)
    \n-
    354 {
    \n-
    355 std::string buffer;
    \n-
    356 char c;
    \n-
    357 file >> buffer;
    \n-
    358 c=buffer[0];
    \n-
    359 mmHeader=MMHeader();
    \n-
    360 if(c!='%')
    \n-
    361 return false;
    \n-
    362 dverb<<buffer<<std::endl;
    \n-
    363 /* read the banner */
    \n-
    364 if(buffer!="%%MatrixMarket") {
    \n-
    365 /* discard the rest of the line */
    \n-
    366 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    367 return false;
    \n-
    368 }
    \n-
    369
    \n-
    370 if(lineFeed(file))
    \n-
    371 /* premature end of line */
    \n-
    372 return false;
    \n-
    373
    \n-
    374 /* read the matrix_type */
    \n-
    375 file >> buffer;
    \n-
    376
    \n-
    377 if(buffer != "matrix")
    \n-
    378 {
    \n-
    379 /* discard the rest of the line */
    \n-
    380 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    381 return false;
    \n-
    382 }
    \n-
    383
    \n-
    384 if(lineFeed(file))
    \n-
    385 /* premature end of line */
    \n-
    386 return false;
    \n-
    387
    \n-
    388 /* The type of the matrix */
    \n-
    389 file >> buffer;
    \n-
    390
    \n-
    391 if(buffer.empty())
    \n-
    392 return false;
    \n-
    393
    \n-
    394 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
    \n-
    395 ::tolower);
    \n-
    396
    \n-
    397 switch(buffer[0])
    \n-
    398 {
    \n-
    399 case 'a' :
    \n-
    400 /* sanity check */
    \n-
    401 if(buffer != "array")
    \n-
    402 {
    \n-
    403 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    404 return false;
    \n-
    405 }
    \n-
    406 mmHeader.type=array_type;
    \n-
    407 break;
    \n-
    408 case 'c' :
    \n-
    409 /* sanity check */
    \n-
    410 if(buffer != "coordinate")
    \n-
    411 {
    \n-
    412 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    413 return false;
    \n-
    414 }
    \n-
    415 mmHeader.type=coordinate_type;
    \n-
    416 break;
    \n-
    417 default :
    \n-
    418 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    419 return false;
    \n-
    420 }
    \n-
    421
    \n-
    422 if(lineFeed(file))
    \n-
    423 /* premature end of line */
    \n-
    424 return false;
    \n-
    425
    \n-
    426 /* The numeric type used. */
    \n-
    427 file >> buffer;
    \n-
    428
    \n-
    429 if(buffer.empty())
    \n-
    430 return false;
    \n-
    431
    \n-
    432 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
    \n-
    433 ::tolower);
    \n-
    434 switch(buffer[0])
    \n-
    435 {
    \n-
    436 case 'i' :
    \n-
    437 /* sanity check */
    \n-
    438 if(buffer != "integer")
    \n-
    439 {
    \n-
    440 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    441 return false;
    \n-
    442 }
    \n-
    443 mmHeader.ctype=integer_type;
    \n-
    444 break;
    \n-
    445 case 'r' :
    \n-
    446 /* sanity check */
    \n-
    447 if(buffer != "real")
    \n-
    448 {
    \n-
    449 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    450 return false;
    \n-
    451 }
    \n-
    452 mmHeader.ctype=double_type;
    \n-
    453 break;
    \n-
    454 case 'c' :
    \n-
    455 /* sanity check */
    \n-
    456 if(buffer != "complex")
    \n-
    457 {
    \n-
    458 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    459 return false;
    \n-
    460 }
    \n-
    461 mmHeader.ctype=complex_type;
    \n-
    462 break;
    \n-
    463 case 'p' :
    \n-
    464 /* sanity check */
    \n-
    465 if(buffer != "pattern")
    \n-
    466 {
    \n-
    467 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    468 return false;
    \n-
    469 }
    \n-
    470 mmHeader.ctype=pattern;
    \n-
    471 break;
    \n-
    472 default :
    \n-
    473 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    474 return false;
    \n-
    475 }
    \n-
    476
    \n-
    477 if(lineFeed(file))
    \n-
    478 return false;
    \n-
    479
    \n-
    480 file >> buffer;
    \n-
    481
    \n-
    482 std::transform(buffer.begin(), buffer.end(), buffer.begin(),
    \n-
    483 ::tolower);
    \n-
    484 switch(buffer[0])
    \n-
    485 {
    \n-
    486 case 'g' :
    \n-
    487 /* sanity check */
    \n-
    488 if(buffer != "general")
    \n-
    489 {
    \n-
    490 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    491 return false;
    \n-
    492 }
    \n-
    493 mmHeader.structure=general;
    \n-
    494 break;
    \n-
    495 case 'h' :
    \n-
    496 /* sanity check */
    \n-
    497 if(buffer != "hermitian")
    \n-
    498 {
    \n-
    499 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    500 return false;
    \n-
    501 }
    \n-
    502 mmHeader.structure=hermitian;
    \n-
    503 break;
    \n-
    504 case 's' :
    \n-
    505 if(buffer.size()==1) {
    \n-
    506 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    507 return false;
    \n-
    508 }
    \n-
    509
    \n-
    510 switch(buffer[1])
    \n-
    511 {
    \n-
    512 case 'y' :
    \n-
    513 /* sanity check */
    \n-
    514 if(buffer != "symmetric")
    \n-
    515 {
    \n-
    516 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    517 return false;
    \n-
    518 }
    \n-
    519 mmHeader.structure=symmetric;
    \n-
    520 break;
    \n-
    521 case 'k' :
    \n-
    522 /* sanity check */
    \n-
    523 if(buffer != "skew-symmetric")
    \n-
    524 {
    \n-
    525 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    526 return false;
    \n-
    527 }
    \n-
    528 mmHeader.structure=skew_symmetric;
    \n-
    529 break;
    \n-
    530 default :
    \n-
    531 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    532 return false;
    \n-
    533 }
    \n-
    534 break;
    \n-
    535 default :
    \n-
    536 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    537 return false;
    \n-
    538 }
    \n-
    539 file.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    540 c=file.peek();
    \n-
    541 return true;
    \n-
    542
    \n-
    543 }
    \n-
    \n-
    544
    \n-
    545 template<std::size_t brows, std::size_t bcols>
    \n-
    546 std::tuple<std::size_t, std::size_t, std::size_t>
    \n-
    \n-
    547 calculateNNZ(std::size_t rows, std::size_t cols, std::size_t entries, const MMHeader& header)
    \n-
    548 {
    \n-
    549 std::size_t blockrows=rows/brows;
    \n-
    550 std::size_t blockcols=cols/bcols;
    \n-
    551 std::size_t blocksize=brows*bcols;
    \n-
    552 std::size_t blockentries=0;
    \n-
    553
    \n-
    554 switch(header.structure)
    \n-
    555 {
    \n-
    556 case general :
    \n-
    557 blockentries = entries/blocksize; break;
    \n-
    558 case skew_symmetric :
    \n-
    559 blockentries = 2*entries/blocksize; break;
    \n-
    560 case symmetric :
    \n-
    561 blockentries = (2*entries-rows)/blocksize; break;
    \n-
    562 case hermitian :
    \n-
    563 blockentries = (2*entries-rows)/blocksize; break;
    \n-
    564 default :
    \n-
    565 throw Dune::NotImplemented();
    \n-
    566 }
    \n-
    567 return std::make_tuple(blockrows, blockcols, blockentries);
    \n-
    568 }
    \n-
    \n-
    569
    \n-
    570 /*
    \n-
    571 * @brief Storage class for the column index and the numeric value.
    \n-
    572 *
    \n-
    573 * \\tparam T Either a NumericWrapper of the numeric type or PatternDummy
    \n-
    574 * for MatrixMarket pattern case.
    \n-
    575 */
    \n-
    576 template<typename T>
    \n-
    \n-
    577 struct IndexData : public T
    \n-
    578 {
    \n-
    579 std::size_t index = {};
    \n-
    580 };
    \n-
    \n-
    581
    \n-
    582
    \n-
    593 template<typename T>
    \n-
    \n-\n-
    595 {
    \n-
    596 T number = {};
    \n-
    \n-
    597 operator T&()
    \n-
    598 {
    \n-
    599 return number;
    \n-
    600 }
    \n-
    \n-
    601 };
    \n-
    \n-
    602
    \n-
    \n-\n-
    607 {};
    \n-
    \n-
    608
    \n-
    609 template<>
    \n-
    \n-\n-
    611 {};
    \n-
    \n-
    612
    \n-
    613 template<typename T>
    \n-
    \n-
    614 std::istream& operator>>(std::istream& is, NumericWrapper<T>& num)
    \n-
    615 {
    \n-
    616 return is>>num.number;
    \n-
    617 }
    \n-
    \n-
    618
    \n-
    \n-
    619 inline std::istream& operator>>(std::istream& is, [[maybe_unused]] NumericWrapper<PatternDummy>& num)
    \n-
    620 {
    \n-
    621 return is;
    \n-
    622 }
    \n-
    \n-
    623
    \n-
    629 template<typename T>
    \n-
    \n-
    630 bool operator<(const IndexData<T>& i1, const IndexData<T>& i2)
    \n-
    631 {
    \n-
    632 return i1.index<i2.index;
    \n-
    633 }
    \n-
    \n-
    634
    \n-
    640 template<typename T>
    \n-
    \n-
    641 std::istream& operator>>(std::istream& is, IndexData<T>& data)
    \n-
    642 {
    \n-
    643 is>>data.index;
    \n-
    644 /* MatrixMarket indices are one based. Decrement for C++ */
    \n-
    645 --data.index;
    \n-
    646 return is>>data.number;
    \n-
    647 }
    \n-
    \n-
    648
    \n-
    654 template<typename T>
    \n-
    \n-
    655 std::istream& operator>>(std::istream& is, IndexData<NumericWrapper<std::complex<T>>>& data)
    \n-
    656 {
    \n-
    657 is>>data.index;
    \n-
    658 /* MatrixMarket indices are one based. Decrement for C++ */
    \n-
    659 --data.index;
    \n-
    660 // real and imaginary part needs to be read separately as
    \n-
    661 // complex numbers are not provided in pair form. (x,y)
    \n-
    662 NumericWrapper<T> real, imag;
    \n-
    663 is>>real;
    \n-
    664 is>>imag;
    \n-
    665 data.number = {real.number, imag.number};
    \n-
    666 return is;
    \n-
    667 }
    \n-
    \n-
    668
    \n-
    675 template<typename D, int brows, int bcols>
    \n-
    \n-\n-
    677 {
    \n-
    683 template<typename T>
    \n-
    \n-
    684 void operator()(const std::vector<std::set<IndexData<D> > >& rows,
    \n-
    685 BCRSMatrix<T>& matrix)
    \n-
    686 {
    \n-
    687 static_assert(IsNumber<T>::value && brows==1 && bcols==1, "Only scalar entries are expected here!");
    \n-
    688 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter)
    \n-
    689 {
    \n-
    690 auto brow=iter.index();
    \n-
    691 for (auto siter=rows[brow].begin(); siter != rows[brow].end(); ++siter)
    \n-
    692 (*iter)[siter->index] = siter->number;
    \n-
    693 }
    \n-
    694 }
    \n-
    \n-
    695
    \n-
    701 template<typename T>
    \n-
    \n-
    702 void operator()(const std::vector<std::set<IndexData<D> > >& rows,
    \n-\n-
    704 {
    \n-
    705 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter)
    \n-
    706 {
    \n-
    707 for (auto brow=iter.index()*brows,
    \n-
    708 browend=iter.index()*brows+brows;
    \n-
    709 brow<browend; ++brow)
    \n-
    710 {
    \n-
    711 for (auto siter=rows[brow].begin(), send=rows[brow].end();
    \n-
    712 siter != send; ++siter)
    \n-
    713 (*iter)[siter->index/bcols][brow%brows][siter->index%bcols]=siter->number;
    \n-
    714 }
    \n-
    715 }
    \n-
    716 }
    \n-
    \n-
    717 };
    \n-
    \n-
    718
    \n-
    719 template<int brows, int bcols>
    \n-
    \n-\n-
    721 {
    \n-
    722 template<typename M>
    \n-
    \n-
    723 void operator()(const std::vector<std::set<IndexData<PatternDummy> > >& rows,
    \n-
    724 M& matrix)
    \n-
    725 {}
    \n-
    \n-
    726 };
    \n-
    \n-
    727
    \n-
    728 template<class T> struct is_complex : std::false_type {};
    \n-
    729 template<class T> struct is_complex<std::complex<T>> : std::true_type {};
    \n-
    730
    \n-
    731 // wrapper for std::conj. Returns T if T is not complex.
    \n-
    732 template<class T>
    \n-
    \n-
    733 std::enable_if_t<!is_complex<T>::value, T> conj(const T& r){
    \n-
    734 return r;
    \n-
    735 }
    \n-
    \n-
    736
    \n-
    737 template<class T>
    \n-
    \n-
    738 std::enable_if_t<is_complex<T>::value, T> conj(const T& r){
    \n-
    739 return std::conj(r);
    \n-
    740 }
    \n-
    \n-
    741
    \n-
    742 template<typename M>
    \n-
    \n-\n-
    744 {};
    \n-
    \n-
    745
    \n-
    746 template<typename B, typename A>
    \n-
    \n-\n-
    748 {
    \n-
    749 enum {
    \n-
    750 rows = 1,
    \n-
    751 cols = 1
    \n-
    752 };
    \n-
    753 };
    \n-
    \n-
    754
    \n-
    755 template<typename B, int i, int j, typename A>
    \n-
    \n-\n-
    757 {
    \n-
    758 enum {
    \n-
    759 rows = i,
    \n-
    760 cols = j
    \n-
    761 };
    \n-
    762 };
    \n-
    \n-
    763
    \n-
    764 template<typename T, typename A, typename D>
    \n-
    \n-\n-
    766 std::istream& file, std::size_t entries,
    \n-
    767 const MMHeader& mmHeader, const D&)
    \n-
    768 {
    \n-\n-
    770
    \n-
    771 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)
    \n-
    772 constexpr int brows = mm_multipliers<Matrix>::rows;
    \n-
    773 constexpr int bcols = mm_multipliers<Matrix>::cols;
    \n-
    774
    \n-
    775 // First path
    \n-
    776 // store entries together with column index in a separate
    \n-
    777 // data structure
    \n-
    778 std::vector<std::set<IndexData<D> > > rows(matrix.N()*brows);
    \n-
    779
    \n-
    780 auto readloop = [&] (auto symmetryFixup) {
    \n-
    781 for(std::size_t i = 0; i < entries; ++i) {
    \n-
    782 std::size_t row;
    \n-
    783 IndexData<D> data;
    \n-
    784 skipComments(file);
    \n-
    785 file>>row;
    \n-
    786 --row; // Index was 1 based.
    \n-
    787 assert(row/bcols<matrix.N());
    \n-
    788 file>>data;
    \n-
    789 assert(data.index/bcols<matrix.M());
    \n-
    790 rows[row].insert(data);
    \n-
    791 if(row!=data.index)
    \n-
    792 symmetryFixup(row, data);
    \n-
    793 }
    \n-
    794 };
    \n-
    795
    \n-
    796 switch(mmHeader.structure)
    \n-
    797 {
    \n-
    798 case general:
    \n-
    799 readloop([](auto...){});
    \n-
    800 break;
    \n-
    801 case symmetric :
    \n-
    802 readloop([&](auto row, auto data) {
    \n-
    803 IndexData<D> data_sym(data);
    \n-
    804 data_sym.index = row;
    \n-
    805 rows[data.index].insert(data_sym);
    \n-
    806 });
    \n-
    807 break;
    \n-
    808 case skew_symmetric :
    \n-
    809 readloop([&](auto row, auto data) {
    \n-
    810 IndexData<D> data_sym;
    \n-
    811 data_sym.number = -data.number;
    \n-
    812 data_sym.index = row;
    \n-
    813 rows[data.index].insert(data_sym);
    \n-
    814 });
    \n-
    815 break;
    \n-
    816 case hermitian :
    \n-
    817 readloop([&](auto row, auto data) {
    \n-
    818 IndexData<D> data_sym;
    \n-
    819 data_sym.number = conj(data.number);
    \n-
    820 data_sym.index = row;
    \n-
    821 rows[data.index].insert(data_sym);
    \n-
    822 });
    \n-
    823 break;
    \n-
    824 default:
    \n-
    825 DUNE_THROW(Dune::NotImplemented,
    \n-
    826 "Only general, symmetric, skew-symmetric and hermitian is supported right now!");
    \n-
    827 }
    \n-
    828
    \n-
    829 // Setup the matrix sparsity pattern
    \n-
    830 int nnz=0;
    \n-
    831 for(typename Matrix::CreateIterator iter=matrix.createbegin();
    \n-
    832 iter!= matrix.createend(); ++iter)
    \n-
    833 {
    \n-
    834 for(std::size_t brow=iter.index()*brows, browend=iter.index()*brows+brows;
    \n-
    835 brow<browend; ++brow)
    \n-
    836 {
    \n-
    837 typedef typename std::set<IndexData<D> >::const_iterator Siter;
    \n-
    838 for(Siter siter=rows[brow].begin(), send=rows[brow].end();
    \n-
    839 siter != send; ++siter, ++nnz)
    \n-
    840 iter.insert(siter->index/bcols);
    \n-
    841 }
    \n-
    842 }
    \n-
    843
    \n-
    844 //Set the matrix values
    \n-
    845 matrix=0;
    \n-
    846
    \n-\n-
    848
    \n-
    849 Setter(rows, matrix);
    \n-
    850 }
    \n-
    \n-
    851
    \n-
    \n-
    852 inline std::tuple<std::string, std::string> splitFilename(const std::string& filename) {
    \n-
    853 std::size_t lastdot = filename.find_last_of(".");
    \n-
    854 if(lastdot == std::string::npos)
    \n-
    855 return std::make_tuple(filename, "");
    \n-
    856 else {
    \n-
    857 std::string potentialFileExtension = filename.substr(lastdot);
    \n-
    858 if (potentialFileExtension == ".mm" || potentialFileExtension == ".mtx")
    \n-
    859 return std::make_tuple(filename.substr(0, lastdot), potentialFileExtension);
    \n-
    860 else
    \n-
    861 return std::make_tuple(filename, "");
    \n-
    862 }
    \n-
    863 }
    \n-
    \n-
    864
    \n-
    865 } // end namespace MatrixMarketImpl
    \n-
    \n-
    866
    \n-
    \n-
    867 class MatrixMarketFormatError : public Dune::Exception
    \n-
    868 {};
    \n-
    \n-
    869
    \n-
    870
    \n-
    \n-
    871 inline void mm_read_header(std::size_t& rows, std::size_t& cols,
    \n-
    872 MatrixMarketImpl::MMHeader& header, std::istream& istr,
    \n-
    873 bool isVector)
    \n-
    874 {
    \n-
    875 using namespace MatrixMarketImpl;
    \n-
    876
    \n-
    877 if(!readMatrixMarketBanner(istr, header)) {
    \n-
    878 std::cerr << "First line was not a correct Matrix Market banner. Using default:\\n"
    \n-
    879 << "%%MatrixMarket matrix coordinate real general"<<std::endl;
    \n-
    880 // Go to the beginning of the file
    \n-
    881 istr.clear() ;
    \n-
    882 istr.seekg(0, std::ios::beg);
    \n-
    883 if(isVector)
    \n-
    884 header.type=array_type;
    \n-
    885 }
    \n-
    886
    \n-
    887 skipComments(istr);
    \n-
    888
    \n-
    889 if(lineFeed(istr))
    \n-\n-
    891
    \n-
    892 istr >> rows;
    \n-
    893
    \n-
    894 if(lineFeed(istr))
    \n-\n-
    896 istr >> cols;
    \n-
    897 }
    \n-
    \n-
    898
    \n-
    899 template<typename T, typename A>
    \n-
    \n-\n-
    901 std::size_t size,
    \n-
    902 std::istream& istr,
    \n-
    903 size_t lane)
    \n-
    904 {
    \n-
    905 for (int i=0; size>0; ++i, --size)
    \n-
    906 istr>>Simd::lane(lane,vector[i]);
    \n-
    907 }
    \n-
    \n-
    908
    \n-
    909 template<typename T, typename A, int entries>
    \n-
    \n-
    910 void mm_read_vector_entries(Dune::BlockVector<Dune::FieldVector<T,entries>,A>& vector,
    \n-
    911 std::size_t size,
    \n-
    912 std::istream& istr,
    \n-
    913 size_t lane)
    \n-
    914 {
    \n-
    915 for(int i=0; size>0; ++i, --size) {
    \n-
    916 Simd::Scalar<T> val;
    \n-
    917 istr>>val;
    \n-
    918 Simd::lane(lane, vector[i/entries][i%entries])=val;
    \n-
    919 }
    \n-
    920 }
    \n-
    \n-
    921
    \n-
    922
    \n-
    929 template<typename T, typename A>
    \n-
    \n-\n-
    931 std::istream& istr)
    \n-
    932 {
    \n-
    933 typedef typename Dune::BlockVector<T,A>::field_type field_type;
    \n-
    934 using namespace MatrixMarketImpl;
    \n-
    935
    \n-
    936 MMHeader header;
    \n-
    937 std::size_t rows, cols;
    \n-
    938 mm_read_header(rows,cols,header,istr, true);
    \n-
    939 if(cols!=Simd::lanes<field_type>()) {
    \n-
    940 if(Simd::lanes<field_type>() == 1)
    \n-
    941 DUNE_THROW(MatrixMarketFormatError, "cols!=1, therefore this is no vector!");
    \n-
    942 else
    \n-
    943 DUNE_THROW(MatrixMarketFormatError, "cols does not match the number of lanes in the field_type!");
    \n-
    944 }
    \n-
    945
    \n-
    946 if(header.type!=array_type)
    \n-
    947 DUNE_THROW(MatrixMarketFormatError, "Vectors have to be stored in array format!");
    \n-
    948
    \n-
    949
    \n-
    950 if constexpr (Dune::IsNumber<T>())
    \n-
    951 vector.resize(rows);
    \n-
    952 else
    \n-
    953 {
    \n-
    954 T dummy;
    \n-
    955 auto blocksize = dummy.size();
    \n-
    956 std::size_t size=rows/blocksize;
    \n-
    957 if(size*blocksize!=rows)
    \n-
    958 DUNE_THROW(MatrixMarketFormatError, "Block size of vector is not correct!");
    \n-
    959
    \n-
    960 vector.resize(size);
    \n-
    961 }
    \n-
    962
    \n-
    963 istr.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    964 for(size_t l=0;l<Simd::lanes<field_type>();++l){
    \n-
    965 mm_read_vector_entries(vector, rows, istr, l);
    \n-
    966 }
    \n-
    967 }
    \n-
    \n-
    968
    \n-
    975 template<typename T, typename A>
    \n-
    \n-\n-
    977 std::istream& istr)
    \n-
    978 {
    \n-
    979 using namespace MatrixMarketImpl;
    \n-\n-
    981
    \n-
    982 MMHeader header;
    \n-
    983 if(!readMatrixMarketBanner(istr, header)) {
    \n-
    984 std::cerr << "First line was not a correct Matrix Market banner. Using default:\\n"
    \n-
    985 << "%%MatrixMarket matrix coordinate real general"<<std::endl;
    \n-
    986 // Go to the beginning of the file
    \n-
    987 istr.clear() ;
    \n-
    988 istr.seekg(0, std::ios::beg);
    \n-
    989 }
    \n-
    990 skipComments(istr);
    \n-
    991
    \n-
    992 std::size_t rows, cols, entries;
    \n-
    993
    \n-
    994 if(lineFeed(istr))
    \n-\n-
    996
    \n-
    997 istr >> rows;
    \n-
    998
    \n-
    999 if(lineFeed(istr))
    \n-\n-
    1001 istr >> cols;
    \n-
    1002
    \n-
    1003 if(lineFeed(istr))
    \n-\n-
    1005
    \n-
    1006 istr >>entries;
    \n-
    1007
    \n-
    1008 std::size_t nnz, blockrows, blockcols;
    \n-
    1009
    \n-
    1010 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)
    \n-
    1011 constexpr int brows = mm_multipliers<Matrix>::rows;
    \n-
    1012 constexpr int bcols = mm_multipliers<Matrix>::cols;
    \n-
    1013
    \n-
    1014 std::tie(blockrows, blockcols, nnz) = calculateNNZ<brows, bcols>(rows, cols, entries, header);
    \n-
    1015
    \n-
    1016 istr.ignore(std::numeric_limits<std::streamsize>::max(),'\\n');
    \n-
    1017
    \n-
    1018
    \n-
    1019 matrix.setSize(blockrows, blockcols, nnz);
    \n-\n-
    1021
    \n-
    1022 if(header.type==array_type)
    \n-
    1023 DUNE_THROW(Dune::NotImplemented, "Array format currently not supported for matrices!");
    \n-
    1024
    \n-
    1025 readSparseEntries(matrix, istr, entries, header, NumericWrapper<typename Matrix::field_type>());
    \n-
    1026 }
    \n-
    \n-
    1027
    \n-
    1028 // Print a scalar entry
    \n-
    1029 template<typename B>
    \n-
    \n-
    1030 void mm_print_entry(const B& entry,
    \n-
    1031 std::size_t rowidx,
    \n-
    1032 std::size_t colidx,
    \n-
    1033 std::ostream& ostr)
    \n-
    1034 {
    \n-
    1035 if constexpr (IsNumber<B>())
    \n-
    1036 ostr << rowidx << " " << colidx << " " << entry << std::endl;
    \n-
    1037 else
    \n-
    1038 {
    \n-
    1039 for (auto row=entry.begin(); row != entry.end(); ++row, ++rowidx) {
    \n-
    1040 int coli=colidx;
    \n-
    1041 for (auto col = row->begin(); col != row->end(); ++col, ++coli)
    \n-
    1042 ostr<< rowidx<<" "<<coli<<" "<<*col<<std::endl;
    \n-
    1043 }
    \n-
    1044 }
    \n-
    1045 }
    \n-
    \n-
    1046
    \n-
    1047 // Write a vector entry
    \n-
    1048 template<typename V>
    \n-
    \n-
    1049 void mm_print_vector_entry(const V& entry, std::ostream& ostr,
    \n-
    1050 const std::integral_constant<int,1>&,
    \n-
    1051 size_t lane)
    \n-
    1052 {
    \n-
    1053 ostr<<Simd::lane(lane,entry)<<std::endl;
    \n-
    1054 }
    \n-
    \n-
    1055
    \n-
    1056 // Write a vector
    \n-
    1057 template<typename V>
    \n-
    \n-
    1058 void mm_print_vector_entry(const V& vector, std::ostream& ostr,
    \n-
    1059 const std::integral_constant<int,0>&,
    \n-
    1060 size_t lane)
    \n-
    1061 {
    \n-
    1062 using namespace MatrixMarketImpl;
    \n-
    1063
    \n-
    1064 // Is the entry a supported numeric type?
    \n-
    1065 const int isnumeric = mm_numeric_type<Simd::Scalar<typename V::block_type>>::is_numeric;
    \n-
    1066 typedef typename V::const_iterator VIter;
    \n-
    1067
    \n-
    1068 for(VIter i=vector.begin(); i != vector.end(); ++i)
    \n-
    1069
    \n-
    1070 mm_print_vector_entry(*i, ostr,
    \n-
    1071 std::integral_constant<int,isnumeric>(),
    \n-
    1072 lane);
    \n-
    1073 }
    \n-
    \n-
    1074
    \n-
    1075 template<typename T, typename A>
    \n-
    \n-
    1076 std::size_t countEntries(const BlockVector<T,A>& vector)
    \n-
    1077 {
    \n-
    1078 return vector.size();
    \n-
    1079 }
    \n-
    \n-
    1080
    \n-
    1081 template<typename T, typename A, int i>
    \n-
    \n-
    1082 std::size_t countEntries(const BlockVector<FieldVector<T,i>,A>& vector)
    \n-
    1083 {
    \n-
    1084 return vector.size()*i;
    \n-
    1085 }
    \n-
    \n-
    1086
    \n-
    1087 // Version for writing vectors.
    \n-
    1088 template<typename V>
    \n-
    \n-
    1089 void writeMatrixMarket(const V& vector, std::ostream& ostr,
    \n-
    1090 const std::integral_constant<int,0>&)
    \n-
    1091 {
    \n-
    1092 using namespace MatrixMarketImpl;
    \n-
    1093 typedef typename V::field_type field_type;
    \n-
    1094
    \n-
    1095 ostr<<countEntries(vector)<<" "<<Simd::lanes<field_type>()<<std::endl;
    \n-
    1096 const int isnumeric = mm_numeric_type<Simd::Scalar<V>>::is_numeric;
    \n-
    1097 for(size_t l=0;l<Simd::lanes<field_type>(); ++l){
    \n-
    1098 mm_print_vector_entry(vector,ostr, std::integral_constant<int,isnumeric>(), l);
    \n-
    1099 }
    \n-
    1100 }
    \n-
    \n-
    1101
    \n-
    1102 // Versions for writing matrices
    \n-
    1103 template<typename M>
    \n-
    \n-
    1104 void writeMatrixMarket(const M& matrix,
    \n-
    1105 std::ostream& ostr,
    \n-
    1106 const std::integral_constant<int,1>&)
    \n-
    1107 {
    \n-
    1108 ostr<<matrix.N()*MatrixMarketImpl::mm_multipliers<M>::rows<<" "
    \n-\n-
    1110 <<countNonZeros(matrix)<<std::endl;
    \n-
    1111
    \n-
    1112 typedef typename M::const_iterator riterator;
    \n-
    1113 typedef typename M::ConstColIterator citerator;
    \n-
    1114 for(riterator row=matrix.begin(); row != matrix.end(); ++row)
    \n-
    1115 for(citerator col = row->begin(); col != row->end(); ++col)
    \n-
    1116 // Matrix Market indexing start with 1!
    \n-\n-\n-
    1119 }
    \n-
    \n-
    1120
    \n-
    1121
    \n-
    1125 template<typename M>
    \n-
    \n-
    1126 void writeMatrixMarket(const M& matrix,
    \n-
    1127 std::ostream& ostr)
    \n-
    1128 {
    \n-
    1129 using namespace MatrixMarketImpl;
    \n-
    1130
    \n-
    1131 // Write header information
    \n-
    1132 mm_header_printer<M>::print(ostr);
    \n-
    1133 mm_block_structure_header<M>::print(ostr,matrix);
    \n-
    1134 // Choose the correct function for matrix and vector
    \n-
    1135 writeMatrixMarket(matrix,ostr,std::integral_constant<int,IsMatrix<M>::value>());
    \n-
    1136 }
    \n-
    \n-
    1137
    \n-
    1138 static const int default_precision = -1;
    \n-
    1150 template<typename M>
    \n-
    \n-
    1151 void storeMatrixMarket(const M& matrix,
    \n-
    1152 std::string filename,
    \n-
    1153 int prec=default_precision)
    \n-
    1154 {
    \n-
    1155 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
    \n-
    1156 std::string rfilename;
    \n-
    1157 std::ofstream file;
    \n-
    1158 if (extension != "") {
    \n-
    1159 rfilename = pureFilename + extension;
    \n-
    1160 file.open(rfilename.c_str());
    \n-
    1161 if(!file)
    \n-
    1162 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
    \n-
    1163 }
    \n-
    1164 else {
    \n-
    1165 // only try .mm so we do not ignore potential errors
    \n-
    1166 rfilename = pureFilename + ".mm";
    \n-
    1167 file.open(rfilename.c_str());
    \n-
    1168 if(!file)
    \n-
    1169 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
    \n-
    1170 }
    \n-
    1171
    \n-
    1172 file.setf(std::ios::scientific,std::ios::floatfield);
    \n-
    1173 if(prec>0)
    \n-
    1174 file.precision(prec);
    \n-
    1175 writeMatrixMarket(matrix, file);
    \n-
    1176 file.close();
    \n-
    1177 }
    \n-
    \n-
    1178
    \n-
    1179#if HAVE_MPI
    \n-
    1194 template<typename M, typename G, typename L>
    \n-
    \n-
    1195 void storeMatrixMarket(const M& matrix,
    \n-
    1196 std::string filename,
    \n-\n-
    1198 bool storeIndices=true,
    \n-
    1199 int prec=default_precision)
    \n-
    1200 {
    \n-
    1201 // Get our rank
    \n-
    1202 int rank = comm.communicator().rank();
    \n-
    1203 // Write the local matrix
    \n-
    1204 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
    \n-
    1205 std::string rfilename;
    \n-
    1206 std::ofstream file;
    \n-
    1207 if (extension != "") {
    \n-
    1208 rfilename = pureFilename + "_" + std::to_string(rank) + extension;
    \n-
    1209 file.open(rfilename.c_str());
    \n-
    1210 dverb<< rfilename <<std::endl;
    \n-
    1211 if(!file)
    \n-
    1212 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
    \n-
    1213 }
    \n-
    1214 else {
    \n-
    1215 // only try .mm so we do not ignore potential errors
    \n-
    1216 rfilename = pureFilename + "_" + std::to_string(rank) + ".mm";
    \n-
    1217 file.open(rfilename.c_str());
    \n-
    1218 dverb<< rfilename <<std::endl;
    \n-
    1219 if(!file)
    \n-
    1220 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
    \n-
    1221 }
    \n-
    1222 file.setf(std::ios::scientific,std::ios::floatfield);
    \n-
    1223 if(prec>0)
    \n-
    1224 file.precision(prec);
    \n-
    1225 writeMatrixMarket(matrix, file);
    \n-
    1226 file.close();
    \n-
    1227
    \n-
    1228 if(!storeIndices)
    \n-
    1229 return;
    \n-
    1230
    \n-
    1231 // Write the global to local index mapping
    \n-
    1232 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx";
    \n-
    1233 file.open(rfilename.c_str());
    \n-
    1234 if(!file)
    \n-
    1235 DUNE_THROW(IOError, "Could not open file for storage: " << rfilename.c_str());
    \n-
    1236 file.setf(std::ios::scientific,std::ios::floatfield);
    \n-\n-
    1238 typedef typename IndexSet::const_iterator Iterator;
    \n-
    1239 for(Iterator iter = comm.indexSet().begin();
    \n-
    1240 iter != comm.indexSet().end(); ++iter) {
    \n-
    1241 file << iter->global()<<" "<<(std::size_t)iter->local()<<" "
    \n-
    1242 <<(int)iter->local().attribute()<<" "<<(int)iter->local().isPublic()<<std::endl;
    \n-
    1243 }
    \n-
    1244 // Store neighbour information for efficient remote indices setup.
    \n-
    1245 file<<"neighbours:";
    \n-
    1246 const std::set<int>& neighbours=comm.remoteIndices().getNeighbours();
    \n-
    1247 typedef std::set<int>::const_iterator SIter;
    \n-
    1248 for(SIter neighbour=neighbours.begin(); neighbour != neighbours.end(); ++neighbour) {
    \n-
    1249 file<<" "<< *neighbour;
    \n-
    1250 }
    \n-
    1251 file.close();
    \n-
    1252 }
    \n-
    \n-
    1253
    \n-
    1268 template<typename M, typename G, typename L>
    \n-
    \n-
    1269 void loadMatrixMarket(M& matrix,
    \n-
    1270 const std::string& filename,
    \n-\n-
    1272 bool readIndices=true)
    \n-
    1273 {
    \n-
    1274 using namespace MatrixMarketImpl;
    \n-
    1275
    \n-\n-
    1277 typedef typename LocalIndexT::Attribute Attribute;
    \n-
    1278 // Get our rank
    \n-
    1279 int rank = comm.communicator().rank();
    \n-
    1280 // load local matrix
    \n-
    1281 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
    \n-
    1282 std::string rfilename;
    \n-
    1283 std::ifstream file;
    \n-
    1284 if (extension != "") {
    \n-
    1285 rfilename = pureFilename + "_" + std::to_string(rank) + extension;
    \n-
    1286 file.open(rfilename.c_str(), std::ios::in);
    \n-
    1287 dverb<< rfilename <<std::endl;
    \n-
    1288 if(!file)
    \n-
    1289 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
    \n-
    1290 }
    \n-
    1291 else {
    \n-
    1292 // try both .mm and .mtx
    \n-
    1293 rfilename = pureFilename + "_" + std::to_string(rank) + ".mm";
    \n-
    1294 file.open(rfilename.c_str(), std::ios::in);
    \n-
    1295 if(!file) {
    \n-
    1296 rfilename = pureFilename + "_" + std::to_string(rank) + ".mtx";
    \n-
    1297 file.open(rfilename.c_str(), std::ios::in);
    \n-
    1298 dverb<< rfilename <<std::endl;
    \n-
    1299 if(!file)
    \n-
    1300 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
    \n-
    1301 }
    \n-
    1302 }
    \n-
    1303 readMatrixMarket(matrix,file);
    \n-
    1304 file.close();
    \n-
    1305
    \n-
    1306 if(!readIndices)
    \n-
    1307 return;
    \n-
    1308
    \n-
    1309 // read indices
    \n-\n-
    1311 IndexSet& pis=comm.pis;
    \n-
    1312 rfilename = pureFilename + "_" + std::to_string(rank) + ".idx";
    \n-
    1313 file.open(rfilename.c_str());
    \n-
    1314 if(!file)
    \n-
    1315 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
    \n-
    1316 if(pis.size()!=0)
    \n-
    1317 DUNE_THROW(InvalidIndexSetState, "Index set is not empty!");
    \n-
    1318
    \n-
    1319 pis.beginResize();
    \n-
    1320 while(!file.eof() && file.peek()!='n') {
    \n-
    1321 G g;
    \n-
    1322 file >>g;
    \n-
    1323 std::size_t l;
    \n-
    1324 file >>l;
    \n-
    1325 int c;
    \n-
    1326 file >>c;
    \n-
    1327 bool b;
    \n-
    1328 file >> b;
    \n-
    1329 pis.add(g,LocalIndexT(l,Attribute(c),b));
    \n-
    1330 lineFeed(file);
    \n-
    1331 }
    \n-
    1332 pis.endResize();
    \n-
    1333 if(!file.eof()) {
    \n-
    1334 // read neighbours
    \n-
    1335 std::string s;
    \n-
    1336 file>>s;
    \n-
    1337 if(s!="neighbours:")
    \n-
    1338 DUNE_THROW(MatrixMarketFormatError, "was expecting the string: \\"neighbours:\\"");
    \n-
    1339 std::set<int> nb;
    \n-
    1340 while(!file.eof()) {
    \n-
    1341 int i;
    \n-
    1342 file >> i;
    \n-
    1343 nb.insert(i);
    \n-
    1344 }
    \n-
    1345 file.close();
    \n-
    1346 comm.ri.setNeighbours(nb);
    \n-
    1347 }
    \n-
    1348 comm.ri.template rebuild<false>();
    \n-
    1349 }
    \n-
    \n-
    1350
    \n-
    1351 #endif
    \n-
    1352
    \n-
    1363 template<typename M>
    \n-
    \n-
    1364 void loadMatrixMarket(M& matrix,
    \n-
    1365 const std::string& filename)
    \n-
    1366 {
    \n-
    1367 auto [pureFilename, extension] = MatrixMarketImpl::splitFilename(filename);
    \n-
    1368 std::string rfilename;
    \n-
    1369 std::ifstream file;
    \n-
    1370 if (extension != "") {
    \n-
    1371 rfilename = pureFilename + extension;
    \n-
    1372 file.open(rfilename.c_str());
    \n-
    1373 if(!file)
    \n-
    1374 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
    \n-
    1375 }
    \n-
    1376 else {
    \n-
    1377 // try both .mm and .mtx
    \n-
    1378 rfilename = pureFilename + ".mm";
    \n-
    1379 file.open(rfilename.c_str(), std::ios::in);
    \n-
    1380 if(!file) {
    \n-
    1381 rfilename = pureFilename + ".mtx";
    \n-
    1382 file.open(rfilename.c_str(), std::ios::in);
    \n-
    1383 if(!file)
    \n-
    1384 DUNE_THROW(IOError, "Could not open file: " << rfilename.c_str());
    \n-
    1385 }
    \n-
    1386 }
    \n-
    1387 readMatrixMarket(matrix,file);
    \n-
    1388 file.close();
    \n-
    1389 }
    \n-
    \n-
    1390
    \n-
    1392}
    \n-
    1393#endif
    \n-
    Some handy generic functions for ISTL matrices.
    \n-
    Implementation of the BCRSMatrix class.
    \n-
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n-
    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
    \n-
    void readMatrixMarket(Dune::BlockVector< T, A > &vector, std::istream &istr)
    Reads a BlockVector from a matrix market file.
    Definition matrixmarket.hh:930
    \n-
    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
    \n-
    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
    \n-
    std::size_t countEntries(const BlockVector< T, A > &vector)
    Definition matrixmarket.hh:1076
    \n-
    void writeMatrixMarket(const V &vector, std::ostream &ostr, const std::integral_constant< int, 0 > &)
    Definition matrixmarket.hh:1089
    \n-
    void mm_print_vector_entry(const V &entry, std::ostream &ostr, const std::integral_constant< int, 1 > &, size_t lane)
    Definition matrixmarket.hh:1049
    \n-
    static const int default_precision
    Definition matrixmarket.hh:1138
    \n-
    void mm_read_vector_entries(Dune::BlockVector< T, A > &vector, std::size_t size, std::istream &istr, size_t lane)
    Definition matrixmarket.hh:900
    \n-
    void mm_read_header(std::size_t &rows, std::size_t &cols, MatrixMarketImpl::MMHeader &header, std::istream &istr, bool isVector)
    Definition matrixmarket.hh:871
    \n-
    void mm_print_entry(const B &entry, std::size_t rowidx, std::size_t colidx, std::ostream &ostr)
    Definition matrixmarket.hh:1030
    \n-
    STL namespace.
    \n+
    36 template<class OF, class T>
    \n+
    \n+
    37 static GraphTuple create(const M& matrix, T& excluded,
    \n+
    38 PI& pinfo, const OF& of)
    \n+
    39 {
    \n+
    40 MatrixGraph* mg = new MatrixGraph(matrix.getmat());
    \n+
    41 typedef typename PI::ParallelIndexSet ParallelIndexSet;
    \n+
    42 typedef typename ParallelIndexSet::const_iterator IndexIterator;
    \n+
    43 IndexIterator iend = pinfo.indexSet().end();
    \n+
    44
    \n+
    45 for(IndexIterator index = pinfo.indexSet().begin(); index != iend; ++index)
    \n+
    46 excluded[index->local()] = of.contains(index->local().attribute());
    \n+
    47
    \n+
    48 SubGraph* sg= new SubGraph(*mg, excluded);
    \n+
    49 PropertiesGraph* pg = new PropertiesGraph(*sg, IdentityMap(), sg->getEdgeIndexMap());
    \n+
    50 return GraphTuple(mg,pg,sg);
    \n+
    51 }
    \n+
    \n+
    52
    \n+
    \n+
    53 static void free(GraphTuple& graphs)
    \n+
    54 {
    \n+
    55 delete std::get<2>(graphs);
    \n+
    56 delete std::get<1>(graphs);
    \n+
    57 }
    \n+
    \n+
    58 };
    \n+
    \n+
    59
    \n+
    60 template<class M>
    \n+
    \n+\n+
    62 {
    \n+
    63 typedef typename M::matrix_type Matrix;
    \n+
    64
    \n+\n+
    66
    \n+\n+\n+\n+
    70 IdentityMap,
    \n+
    71 IdentityMap> PropertiesGraph;
    \n+
    72
    \n+
    73 typedef std::tuple<MatrixGraph*,PropertiesGraph*> GraphTuple;
    \n+
    74
    \n+
    75 template<class OF, class T>
    \n+
    \n+
    76 static GraphTuple create([[maybe_unused]] const M& matrix,
    \n+
    77 [[maybe_unused]] T& excluded,
    \n+
    78 [[maybe_unused]] const SequentialInformation& pinfo,
    \n+
    79 const OF&)
    \n+
    80 {
    \n+
    81 MatrixGraph* mg = new MatrixGraph(matrix.getmat());
    \n+
    82 PropertiesGraph* pg = new PropertiesGraph(*mg, IdentityMap(), IdentityMap());
    \n+
    83 return GraphTuple(mg,pg);
    \n+
    84 }
    \n+
    \n+
    85
    \n+
    \n+
    86 static void free(GraphTuple& graphs)
    \n+
    87 {
    \n+
    88 delete std::get<1>(graphs);
    \n+
    89 }
    \n+
    \n+
    90
    \n+
    91 };
    \n+
    \n+
    92
    \n+
    93 } //namespace Amg
    \n+
    94} // namespace Dune
    \n+
    95#endif
    \n+
    Implementation of the BCRSMatrix class.
    \n+
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n+
    Provides classes for building the matrix graph.
    \n+
    Provides classes for initializing the link attributes of a matrix graph.
    \n+\n
    Definition allocator.hh:11
    \n-
    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
    \n-
    bool operator<(const IndexData< T > &i1, const IndexData< T > &i2)
    LessThan operator.
    Definition matrixmarket.hh:630
    \n-
    LineType
    Definition matrixmarket.hh:296
    \n-
    @ DATA
    Definition matrixmarket.hh:296
    \n-
    @ MM_HEADER
    Definition matrixmarket.hh:296
    \n-
    @ MM_ISTLSTRUCT
    Definition matrixmarket.hh:296
    \n-
    bool readMatrixMarketBanner(std::istream &file, MMHeader &mmHeader)
    Definition matrixmarket.hh:353
    \n-
    void readSparseEntries(Dune::BCRSMatrix< T, A > &matrix, std::istream &file, std::size_t entries, const MMHeader &mmHeader, const D &)
    Definition matrixmarket.hh:765
    \n-
    MM_TYPE
    Definition matrixmarket.hh:299
    \n-
    @ array_type
    Definition matrixmarket.hh:299
    \n-
    @ coordinate_type
    Definition matrixmarket.hh:299
    \n-
    @ unknown_type
    Definition matrixmarket.hh:299
    \n-
    std::istream & operator>>(std::istream &is, NumericWrapper< T > &num)
    Definition matrixmarket.hh:614
    \n-
    void skipComments(std::istream &file)
    Definition matrixmarket.hh:339
    \n-
    bool lineFeed(std::istream &file)
    Definition matrixmarket.hh:315
    \n-
    @ MM_MAX_LINE_LENGTH
    Definition matrixmarket.hh:297
    \n-
    MM_STRUCTURE
    Definition matrixmarket.hh:303
    \n-
    @ skew_symmetric
    Definition matrixmarket.hh:303
    \n-
    @ general
    Definition matrixmarket.hh:303
    \n-
    @ hermitian
    Definition matrixmarket.hh:303
    \n-
    @ unknown_structure
    Definition matrixmarket.hh:303
    \n-
    @ symmetric
    Definition matrixmarket.hh:303
    \n-
    MM_CTYPE
    Definition matrixmarket.hh:301
    \n-
    @ unknown_ctype
    Definition matrixmarket.hh:301
    \n-
    @ pattern
    Definition matrixmarket.hh:301
    \n-
    @ complex_type
    Definition matrixmarket.hh:301
    \n-
    @ double_type
    Definition matrixmarket.hh:301
    \n-
    @ integer_type
    Definition matrixmarket.hh:301
    \n-
    std::enable_if_t<!is_complex< T >::value, T > conj(const T &r)
    Definition matrixmarket.hh:733
    \n-
    std::tuple< std::string, std::string > splitFilename(const std::string &filename)
    Definition matrixmarket.hh:852
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    Iterator begin()
    Get iterator to first row.
    Definition bcrsmatrix.hh:671
    \n-
    Iterator end()
    Get iterator to one beyond last row.
    Definition bcrsmatrix.hh:677
    \n-
    CreateIterator createend()
    get create iterator pointing to one after the last block
    Definition bcrsmatrix.hh:1100
    \n-
    size_type M() const
    number of columns (counted in blocks)
    Definition bcrsmatrix.hh:2007
    \n-
    CreateIterator createbegin()
    get initial create iterator
    Definition bcrsmatrix.hh:1094
    \n-
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n-
    void setBuildMode(BuildMode bm)
    Sets the build mode of the matrix.
    Definition bcrsmatrix.hh:830
    \n-
    void setSize(size_type rows, size_type columns, size_type nnz=0)
    Set the size of the matrix.
    Definition bcrsmatrix.hh:858
    \n-
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n-
    void resize(size_type size)
    Resize the vector.
    Definition bvector.hh:496
    \n-
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bvector.hh:398
    \n-
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n-
    Helper metaprogram to get the matrix market string representation of the numeric type.
    Definition matrixmarket.hh:76
    \n-
    @ is_numeric
    Whether T is a supported numeric type.
    Definition matrixmarket.hh:81
    \n-
    static std::string str()
    Definition matrixmarket.hh:95
    \n-
    static std::string str()
    Definition matrixmarket.hh:111
    \n-
    static std::string str()
    Definition matrixmarket.hh:127
    \n-
    static std::string str()
    Definition matrixmarket.hh:143
    \n-
    static std::string str()
    Definition matrixmarket.hh:159
    \n-
    Meta program to write the correct Matrix Market header.
    Definition matrixmarket.hh:174
    \n-
    static void print(std::ostream &os)
    Definition matrixmarket.hh:179
    \n-
    static void print(std::ostream &os)
    Definition matrixmarket.hh:189
    \n-
    static void print(std::ostream &os)
    Definition matrixmarket.hh:199
    \n-
    static void print(std::ostream &os)
    Definition matrixmarket.hh:209
    \n-
    Metaprogram for writing the ISTL block structure header.
    Definition matrixmarket.hh:225
    \n-
    static void print(std::ostream &os, const M &)
    Definition matrixmarket.hh:233
    \n-
    BlockVector< T, A > M
    Definition matrixmarket.hh:230
    \n-
    BlockVector< FieldVector< T, i >, A > M
    Definition matrixmarket.hh:243
    \n-
    static void print(std::ostream &os, const M &)
    Definition matrixmarket.hh:245
    \n-
    BCRSMatrix< T, A > M
    Definition matrixmarket.hh:255
    \n-
    static void print(std::ostream &os, const M &)
    Definition matrixmarket.hh:258
    \n-
    BCRSMatrix< FieldMatrix< T, i, j >, A > M
    Definition matrixmarket.hh:268
    \n-
    static void print(std::ostream &os, const M &)
    Definition matrixmarket.hh:270
    \n-
    static void print(std::ostream &os, const M &m)
    Definition matrixmarket.hh:283
    \n-
    FieldMatrix< T, i, j > M
    Definition matrixmarket.hh:281
    \n-
    static void print(std::ostream &os, const M &m)
    Definition matrixmarket.hh:292
    \n-
    FieldVector< T, i > M
    Definition matrixmarket.hh:290
    \n-
    Definition matrixmarket.hh:306
    \n-
    MM_STRUCTURE structure
    Definition matrixmarket.hh:312
    \n-
    MM_TYPE type
    Definition matrixmarket.hh:310
    \n-
    MMHeader()
    Definition matrixmarket.hh:307
    \n-
    MM_CTYPE ctype
    Definition matrixmarket.hh:311
    \n-
    Definition matrixmarket.hh:578
    \n-
    std::size_t index
    Definition matrixmarket.hh:579
    \n-
    a wrapper class of numeric values.
    Definition matrixmarket.hh:595
    \n-
    T number
    Definition matrixmarket.hh:596
    \n-
    Utility class for marking the pattern type of the MatrixMarket matrices.
    Definition matrixmarket.hh:607
    \n-
    Functor to the data values of the matrix.
    Definition matrixmarket.hh:677
    \n-
    void operator()(const std::vector< std::set< IndexData< D > > > &rows, BCRSMatrix< T > &matrix)
    Sets the matrix values.
    Definition matrixmarket.hh:684
    \n-
    void operator()(const std::vector< std::set< IndexData< D > > > &rows, BCRSMatrix< FieldMatrix< T, brows, bcols > > &matrix)
    Sets the matrix values.
    Definition matrixmarket.hh:702
    \n-
    void operator()(const std::vector< std::set< IndexData< PatternDummy > > > &rows, M &matrix)
    Definition matrixmarket.hh:723
    \n-
    Definition matrixmarket.hh:728
    \n-
    Definition matrixmarket.hh:744
    \n-
    Definition matrixmarket.hh:868
    \n-
    Definition matrixutils.hh:27
    \n-
    Test whether a type is an ISTL Matrix.
    Definition matrixutils.hh:504
    \n-
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n-
    const ParallelIndexSet & indexSet() const
    Get the underlying parallel index set.
    Definition owneroverlapcopy.hh:462
    \n-
    const Communication< MPI_Comm > & communicator() const
    Definition owneroverlapcopy.hh:299
    \n-
    const RemoteIndices & remoteIndices() const
    Get the underlying remote indices.
    Definition owneroverlapcopy.hh:471
    \n-
    Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
    The type of the parallel index set.
    Definition owneroverlapcopy.hh:449
    \n+
    Class representing the properties of an edge in the matrix graph.
    Definition dependency.hh:39
    \n+
    Class representing a node in the matrix graph.
    Definition dependency.hh:126
    \n+
    The (undirected) graph of a matrix.
    Definition graph.hh:51
    \n+
    A subgraph of a graph.
    Definition graph.hh:443
    \n+
    EdgeIndexMap getEdgeIndexMap()
    Get an edge index map for the graph.
    \n+
    An index map for mapping the edges to indices.
    Definition graph.hh:470
    \n+
    Attaches properties to the edges and vertices of a graph.
    Definition graph.hh:978
    \n+
    Definition graphcreator.hh:22
    \n+
    Dune::Amg::SubGraph< MatrixGraph, std::vector< bool > > SubGraph
    Definition graphcreator.hh:26
    \n+
    Dune::Amg::PropertiesGraph< SubGraph, VertexProperties, EdgeProperties, IdentityMap, typename SubGraph::EdgeIndexMap > PropertiesGraph
    Definition graphcreator.hh:32
    \n+
    M::matrix_type Matrix
    Definition graphcreator.hh:23
    \n+
    static GraphTuple create(const M &matrix, T &excluded, PI &pinfo, const OF &of)
    Definition graphcreator.hh:37
    \n+
    static void free(GraphTuple &graphs)
    Definition graphcreator.hh:53
    \n+
    Dune::Amg::MatrixGraph< const Matrix > MatrixGraph
    Definition graphcreator.hh:24
    \n+
    std::tuple< MatrixGraph *, PropertiesGraph *, SubGraph * > GraphTuple
    Definition graphcreator.hh:34
    \n+
    Dune::Amg::MatrixGraph< const Matrix > MatrixGraph
    Definition graphcreator.hh:65
    \n+
    M::matrix_type Matrix
    Definition graphcreator.hh:63
    \n+
    Dune::Amg::PropertiesGraph< MatrixGraph, VertexProperties, EdgeProperties, IdentityMap, IdentityMap > PropertiesGraph
    Definition graphcreator.hh:71
    \n+
    std::tuple< MatrixGraph *, PropertiesGraph * > GraphTuple
    Definition graphcreator.hh:73
    \n+
    static GraphTuple create(const M &matrix, T &excluded, const SequentialInformation &pinfo, const OF &)
    Definition graphcreator.hh:76
    \n+
    static void free(GraphTuple &graphs)
    Definition graphcreator.hh:86
    \n+
    Definition pinfo.hh:28
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1632 +1,188 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-matrixmarket.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+graphcreator.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_MATRIXMARKET_HH\n-6#define DUNE_ISTL_MATRIXMARKET_HH\n+5#ifndef DUNE_AMG_GRAPHCREATOR_HH\n+6#define DUNE_AMG_GRAPHCREATOR_HH\n 7\n-8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15#include \n-16#include \n-17#include \n-18#include \n-19#include \n-20#include \n-21#include \n-22#include \n-23\n-24#include \n-25#include \n-26#include \n-27#include \n-28#include \n-29#include \n-30\n-31#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-32#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-33#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh> // countNonZeros()\n-34#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n+8#include \n+9\n+10#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n+11#include \"_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh\"\n+12#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n+13#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+15\n+16namespace _\bD_\bu_\bn_\be\n+17{\n+18 namespace Amg\n+19 {\n+20 template\n+_\b2_\b1 struct _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br\n+22 {\n+_\b2_\b3 typedef typename M::matrix_type _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b2_\b4 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\ba_\bt_\br_\bi_\bx_\b> _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh;\n+25 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh,\n+_\b2_\b6 std::vector > _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh;\n+27 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh<_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh,\n+28 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n+29 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n+30 IdentityMap,\n+31 typename _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp>\n+_\b3_\b2 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh;\n+33\n+_\b3_\b4 typedef std::tuple _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be;\n 35\n-36namespace _\bD_\bu_\bn_\be\n-37{\n-38\n-_\b6_\b4 namespace MatrixMarketImpl\n-65 {\n-75 template\n-_\b7_\b6 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be {\n-77 enum {\n-81 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=false\n-_\b8_\b2 };\n-83 };\n-84\n-85 template<>\n-_\b8_\b6 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be\n-87 {\n-88 enum {\n-92 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=true\n-_\b9_\b3 };\n-94\n-_\b9_\b5 static std::string _\bs_\bt_\br()\n-96 {\n-97 return \"integer\";\n-98 }\n-99 };\n-100\n-101 template<>\n-_\b1_\b0_\b2 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be\n-103 {\n-104 enum {\n-108 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=true\n-_\b1_\b0_\b9 };\n-110\n-_\b1_\b1_\b1 static std::string _\bs_\bt_\br()\n-112 {\n-113 return \"real\";\n-114 }\n-115 };\n-116\n-117 template<>\n-_\b1_\b1_\b8 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be\n-119 {\n-120 enum {\n-124 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=true\n-_\b1_\b2_\b5 };\n-126\n-_\b1_\b2_\b7 static std::string _\bs_\bt_\br()\n-128 {\n-129 return \"real\";\n-130 }\n-131 };\n-132\n-133 template<>\n-_\b1_\b3_\b4 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be<_\bs_\bt_\bd::complex >\n-135 {\n-136 enum {\n-140 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=true\n-_\b1_\b4_\b1 };\n-142\n-_\b1_\b4_\b3 static std::string _\bs_\bt_\br()\n-144 {\n-145 return \"complex\";\n-146 }\n-147 };\n-148\n-149 template<>\n-_\b1_\b5_\b0 struct _\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be<_\bs_\bt_\bd::complex >\n-151 {\n-152 enum {\n-156 _\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc=true\n-_\b1_\b5_\b7 };\n-158\n-_\b1_\b5_\b9 static std::string _\bs_\bt_\br()\n-160 {\n-161 return \"complex\";\n-162 }\n-163 };\n-164\n-173 template\n-_\b1_\b7_\b4 struct _\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br;\n-175\n-176 template\n-_\b1_\b7_\b7 struct _\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n-178 {\n-_\b1_\b7_\b9 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os)\n-180 {\n-181 os<<\"%%MatrixMarket matrix coordinate \";\n-182 os<::\n-field_type>>::str()<<\" general\"<\n-_\b1_\b8_\b7 struct _\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n-188 {\n-_\b1_\b8_\b9 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os)\n-190 {\n-191 os<<\"%%MatrixMarket matrix array \";\n-192 os<::\n-field_type>>::str()<<\" general\"<\n-_\b1_\b9_\b7 struct _\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br >\n-198 {\n-_\b1_\b9_\b9 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os)\n-200 {\n-201 os<<\"%%MatrixMarket matrix array \";\n-202 os<::str()<<\" general\"<\n-_\b2_\b0_\b7 struct _\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n-208 {\n-_\b2_\b0_\b9 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os)\n-210 {\n-211 os<<\"%%MatrixMarket matrix array \";\n-212 os<::str()<<\" general\"<\n-_\b2_\b2_\b5 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br;\n-226\n-227 template\n-_\b2_\b2_\b8 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n-229 {\n-_\b2_\b3_\b0 typedef _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b> _\bM;\n-231 static_assert(IsNumber::value, \"Only scalar entries are expected\n-here!\");\n-232\n-_\b2_\b3_\b3 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM&)\n-234 {\n-235 os<<\"% ISTL_STRUCT blocked \";\n-236 os<<\"1 1\"<\n-_\b2_\b4_\b1 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br<_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br,A> >\n-242 {\n-_\b2_\b4_\b3 typedef _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bi_\b>,A> _\bM;\n-244\n-_\b2_\b4_\b5 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM&)\n-246 {\n-247 os<<\"% ISTL_STRUCT blocked \";\n-248 os<\n-_\b2_\b5_\b3 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n-254 {\n-_\b2_\b5_\b5 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b> _\bM;\n-256 static_assert(IsNumber::value, \"Only scalar entries are expected\n-here!\");\n-257\n-_\b2_\b5_\b8 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM&)\n-259 {\n-260 os<<\"% ISTL_STRUCT blocked \";\n-261 os<<\"1 1\"<\n-_\b2_\b6_\b6 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A> >\n-267 {\n-_\b2_\b6_\b8 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bi_\b,_\bj_\b>,A> _\bM;\n-269\n-_\b2_\b7_\b0 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM&)\n-271 {\n-272 os<<\"% ISTL_STRUCT blocked \";\n-273 os<\n-_\b2_\b7_\b9 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n-280 {\n-_\b2_\b8_\b1 typedef _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bi_\b,_\bj_\b> _\bM;\n-282\n-_\b2_\b8_\b3 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM& m)\n-284 {}\n-285 };\n-286\n-287 template\n-_\b2_\b8_\b8 struct _\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br >\n-289 {\n-_\b2_\b9_\b0 typedef FieldVector _\bM;\n-291\n-_\b2_\b9_\b2 static void _\bp_\br_\bi_\bn_\bt(std::ostream& os, const _\bM& m)\n-293 {}\n-294 };\n-295\n-_\b2_\b9_\b6 enum _\bL_\bi_\bn_\be_\bT_\by_\bp_\be { _\bM_\bM_\b__\bH_\bE_\bA_\bD_\bE_\bR, _\bM_\bM_\b__\bI_\bS_\bT_\bL_\bS_\bT_\bR_\bU_\bC_\bT, _\bD_\bA_\bT_\bA };\n-_\b2_\b9_\b7 enum { _\bM_\bM_\b__\bM_\bA_\bX_\b__\bL_\bI_\bN_\bE_\b__\bL_\bE_\bN_\bG_\bT_\bH=1025 };\n-298\n-_\b2_\b9_\b9 enum _\bM_\bM_\b__\bT_\bY_\bP_\bE { _\bc_\bo_\bo_\br_\bd_\bi_\bn_\ba_\bt_\be_\b__\bt_\by_\bp_\be, _\ba_\br_\br_\ba_\by_\b__\bt_\by_\bp_\be, _\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bt_\by_\bp_\be };\n-300\n-_\b3_\b0_\b1 enum _\bM_\bM_\b__\bC_\bT_\bY_\bP_\bE { _\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bt_\by_\bp_\be, _\bd_\bo_\bu_\bb_\bl_\be_\b__\bt_\by_\bp_\be, _\bc_\bo_\bm_\bp_\bl_\be_\bx_\b__\bt_\by_\bp_\be, _\bp_\ba_\bt_\bt_\be_\br_\bn,\n-_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bc_\bt_\by_\bp_\be };\n-302\n-_\b3_\b0_\b3 enum _\bM_\bM_\b__\bS_\bT_\bR_\bU_\bC_\bT_\bU_\bR_\bE { _\bg_\be_\bn_\be_\br_\ba_\bl, _\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc, _\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc, _\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn,\n-_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be };\n-304\n-_\b3_\b0_\b5 struct _\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n-306 {\n-_\b3_\b0_\b7 _\bM_\bM_\bH_\be_\ba_\bd_\be_\br()\n-308 : _\bt_\by_\bp_\be(_\bc_\bo_\bo_\br_\bd_\bi_\bn_\ba_\bt_\be_\b__\bt_\by_\bp_\be), _\bc_\bt_\by_\bp_\be(_\bd_\bo_\bu_\bb_\bl_\be_\b__\bt_\by_\bp_\be), _\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be(_\bg_\be_\bn_\be_\br_\ba_\bl)\n-309 {}\n-_\b3_\b1_\b0 _\bM_\bM_\b__\bT_\bY_\bP_\bE _\bt_\by_\bp_\be;\n-_\b3_\b1_\b1 _\bM_\bM_\b__\bC_\bT_\bY_\bP_\bE _\bc_\bt_\by_\bp_\be;\n-_\b3_\b1_\b2 _\bM_\bM_\b__\bS_\bT_\bR_\bU_\bC_\bT_\bU_\bR_\bE _\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be;\n-313 };\n-314\n-_\b3_\b1_\b5 inline bool _\bl_\bi_\bn_\be_\bF_\be_\be_\bd(std::istream& file)\n-316 {\n-317 char c;\n-318 if(!file.eof())\n-319 c=file.peek();\n-320 else\n-321 return false;\n-322 // ignore whitespace\n-323 while(c==' ')\n-324 {\n-325 file.get();\n-326 if(file.eof())\n-327 return false;\n-328 c=file.peek();\n-329 }\n-330\n-331 if(c=='\\n') {\n-332 /* eat the line feed */\n-333 file.get();\n-334 return true;\n-335 }\n-336 return false;\n-337 }\n-338\n-_\b3_\b3_\b9 inline void _\bs_\bk_\bi_\bp_\bC_\bo_\bm_\bm_\be_\bn_\bt_\bs(std::istream& file)\n-340 {\n-341 _\bl_\bi_\bn_\be_\bF_\be_\be_\bd(file);\n-342 char c=file.peek();\n-343 // ignore comment lines\n-344 while(c=='%')\n-345 {\n-346 /* discard the rest of the line */\n-347 file.ignore(std::numeric_limits::max(),'\\n');\n-348 c=file.peek();\n-349 }\n-350 }\n-351\n-352\n-_\b3_\b5_\b3 inline bool _\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bB_\ba_\bn_\bn_\be_\br(std::istream& file, _\bM_\bM_\bH_\be_\ba_\bd_\be_\br& mmHeader)\n-354 {\n-355 std::string buffer;\n-356 char c;\n-357 file >> buffer;\n-358 c=buffer[0];\n-359 mmHeader=_\bM_\bM_\bH_\be_\ba_\bd_\be_\br();\n-360 if(c!='%')\n-361 return false;\n-362 dverb<::max(),'\\n');\n-367 return false;\n-368 }\n-369\n-370 if(_\bl_\bi_\bn_\be_\bF_\be_\be_\bd(file))\n-371 /* premature end of line */\n-372 return false;\n-373\n-374 /* read the matrix_type */\n-375 file >> buffer;\n-376\n-377 if(buffer != \"matrix\")\n-378 {\n-379 /* discard the rest of the line */\n-380 file.ignore(std::numeric_limits::max(),'\\n');\n-381 return false;\n-382 }\n-383\n-384 if(_\bl_\bi_\bn_\be_\bF_\be_\be_\bd(file))\n-385 /* premature end of line */\n-386 return false;\n-387\n-388 /* The type of the matrix */\n-389 file >> buffer;\n-390\n-391 if(buffer.empty())\n-392 return false;\n-393\n-394 std::transform(buffer.begin(), buffer.end(), buffer.begin(),\n-395 ::tolower);\n-396\n-397 switch(buffer[0])\n-398 {\n-399 case 'a' :\n-400 /* sanity check */\n-401 if(buffer != \"array\")\n-402 {\n-403 file.ignore(std::numeric_limits::max(),'\\n');\n-404 return false;\n-405 }\n-406 mmHeader._\bt_\by_\bp_\be=_\ba_\br_\br_\ba_\by_\b__\bt_\by_\bp_\be;\n-407 break;\n-408 case 'c' :\n-409 /* sanity check */\n-410 if(buffer != \"coordinate\")\n-411 {\n-412 file.ignore(std::numeric_limits::max(),'\\n');\n-413 return false;\n-414 }\n-415 mmHeader._\bt_\by_\bp_\be=_\bc_\bo_\bo_\br_\bd_\bi_\bn_\ba_\bt_\be_\b__\bt_\by_\bp_\be;\n-416 break;\n-417 default :\n-418 file.ignore(std::numeric_limits::max(),'\\n');\n-419 return false;\n-420 }\n-421\n-422 if(_\bl_\bi_\bn_\be_\bF_\be_\be_\bd(file))\n-423 /* premature end of line */\n-424 return false;\n-425\n-426 /* The numeric type used. */\n-427 file >> buffer;\n-428\n-429 if(buffer.empty())\n-430 return false;\n-431\n-432 std::transform(buffer.begin(), buffer.end(), buffer.begin(),\n-433 ::tolower);\n-434 switch(buffer[0])\n-435 {\n-436 case 'i' :\n-437 /* sanity check */\n-438 if(buffer != \"integer\")\n-439 {\n-440 file.ignore(std::numeric_limits::max(),'\\n');\n-441 return false;\n-442 }\n-443 mmHeader._\bc_\bt_\by_\bp_\be=_\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bt_\by_\bp_\be;\n-444 break;\n-445 case 'r' :\n-446 /* sanity check */\n-447 if(buffer != \"real\")\n-448 {\n-449 file.ignore(std::numeric_limits::max(),'\\n');\n-450 return false;\n-451 }\n-452 mmHeader._\bc_\bt_\by_\bp_\be=_\bd_\bo_\bu_\bb_\bl_\be_\b__\bt_\by_\bp_\be;\n-453 break;\n-454 case 'c' :\n-455 /* sanity check */\n-456 if(buffer != \"complex\")\n-457 {\n-458 file.ignore(std::numeric_limits::max(),'\\n');\n-459 return false;\n-460 }\n-461 mmHeader._\bc_\bt_\by_\bp_\be=_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b__\bt_\by_\bp_\be;\n-462 break;\n-463 case 'p' :\n-464 /* sanity check */\n-465 if(buffer != \"pattern\")\n-466 {\n-467 file.ignore(std::numeric_limits::max(),'\\n');\n-468 return false;\n-469 }\n-470 mmHeader._\bc_\bt_\by_\bp_\be=_\bp_\ba_\bt_\bt_\be_\br_\bn;\n-471 break;\n-472 default :\n-473 file.ignore(std::numeric_limits::max(),'\\n');\n-474 return false;\n-475 }\n-476\n-477 if(_\bl_\bi_\bn_\be_\bF_\be_\be_\bd(file))\n-478 return false;\n-479\n-480 file >> buffer;\n-481\n-482 std::transform(buffer.begin(), buffer.end(), buffer.begin(),\n-483 ::tolower);\n-484 switch(buffer[0])\n-485 {\n-486 case 'g' :\n-487 /* sanity check */\n-488 if(buffer != \"general\")\n-489 {\n-490 file.ignore(std::numeric_limits::max(),'\\n');\n-491 return false;\n-492 }\n-493 mmHeader._\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be=_\bg_\be_\bn_\be_\br_\ba_\bl;\n-494 break;\n-495 case 'h' :\n-496 /* sanity check */\n-497 if(buffer != \"hermitian\")\n-498 {\n-499 file.ignore(std::numeric_limits::max(),'\\n');\n-500 return false;\n-501 }\n-502 mmHeader._\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be=_\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn;\n-503 break;\n-504 case 's' :\n-505 if(buffer.size()==1) {\n-506 file.ignore(std::numeric_limits::max(),'\\n');\n-507 return false;\n-508 }\n-509\n-510 switch(buffer[1])\n-511 {\n-512 case 'y' :\n-513 /* sanity check */\n-514 if(buffer != \"symmetric\")\n-515 {\n-516 file.ignore(std::numeric_limits::max(),'\\n');\n-517 return false;\n-518 }\n-519 mmHeader._\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be=_\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc;\n-520 break;\n-521 case 'k' :\n-522 /* sanity check */\n-523 if(buffer != \"skew-symmetric\")\n-524 {\n-525 file.ignore(std::numeric_limits::max(),'\\n');\n-526 return false;\n-527 }\n-528 mmHeader._\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be=_\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc;\n-529 break;\n-530 default :\n-531 file.ignore(std::numeric_limits::max(),'\\n');\n-532 return false;\n-533 }\n-534 break;\n-535 default :\n-536 file.ignore(std::numeric_limits::max(),'\\n');\n-537 return false;\n-538 }\n-539 file.ignore(std::numeric_limits::max(),'\\n');\n-540 c=file.peek();\n-541 return true;\n-542\n-543 }\n-544\n-545 template\n-546 std::tuple\n-_\b5_\b4_\b7 _\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bN_\bN_\bZ(std::size_t rows, std::size_t cols, std::size_t entries, const\n-_\bM_\bM_\bH_\be_\ba_\bd_\be_\br& header)\n-548 {\n-549 std::size_t blockrows=rows/brows;\n-550 std::size_t blockcols=cols/bcols;\n-551 std::size_t blocksize=brows*bcols;\n-552 std::size_t blockentries=0;\n-553\n-554 switch(header._\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be)\n-555 {\n-556 case _\bg_\be_\bn_\be_\br_\ba_\bl :\n-557 blockentries = entries/blocksize; break;\n-558 case _\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc :\n-559 blockentries = 2*entries/blocksize; break;\n-560 case _\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc :\n-561 blockentries = (2*entries-rows)/blocksize; break;\n-562 case _\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn :\n-563 blockentries = (2*entries-rows)/blocksize; break;\n-564 default :\n-565 throw Dune::NotImplemented();\n-566 }\n-567 return std::make_tuple(blockrows, blockcols, blockentries);\n-568 }\n-569\n-570 /*\n-571 * @brief Storage class for the column index and the numeric value.\n-572 *\n-573 * \\tparam T Either a NumericWrapper of the numeric type or PatternDummy\n-574 * for MatrixMarket pattern case.\n-575 */\n-576 template\n-_\b5_\b7_\b7 struct _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba : public T\n-578 {\n-_\b5_\b7_\b9 std::size_t _\bi_\bn_\bd_\be_\bx = {};\n-580 };\n-581\n-582\n-593 template\n-_\b5_\b9_\b4 struct _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br\n-595 {\n-_\b5_\b9_\b6 T _\bn_\bu_\bm_\bb_\be_\br = {};\n-_\b5_\b9_\b7 operator T&()\n-598 {\n-599 return _\bn_\bu_\bm_\bb_\be_\br;\n-600 }\n-601 };\n-602\n-_\b6_\b0_\b6 struct _\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by\n-607 {};\n-608\n-609 template<>\n-_\b6_\b1_\b0 struct _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br<_\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by>\n-611 {};\n-612\n-613 template\n-_\b6_\b1_\b4 std::istream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(std::istream& is, _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\bT_\b>& num)\n-615 {\n-616 return is>>num._\bn_\bu_\bm_\bb_\be_\br;\n-617 }\n-618\n-_\b6_\b1_\b9 inline std::istream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(std::istream& is, [[maybe_unused]]\n-_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by_\b>& num)\n-620 {\n-621 return is;\n-622 }\n-623\n-629 template\n-_\b6_\b3_\b0 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<(const _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bT_\b>& i1, const _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bT_\b>& i2)\n-631 {\n-632 return i1._\bi_\bn_\bd_\be_\bx\n-_\b6_\b4_\b1 std::istream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(std::istream& is, _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bT_\b>& data)\n-642 {\n-643 is>>data._\bi_\bn_\bd_\be_\bx;\n-644 /* MatrixMarket indices are one based. Decrement for C++ */\n-645 --data._\bi_\bn_\bd_\be_\bx;\n-646 return is>>data.number;\n-647 }\n-648\n-654 template\n-_\b6_\b5_\b5 std::istream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>(std::istream& is, _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba<_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br>>& data)\n-656 {\n-657 is>>data._\bi_\bn_\bd_\be_\bx;\n-658 /* MatrixMarket indices are one based. Decrement for C++ */\n-659 --data.index;\n-660 // real and imaginary part needs to be read separately as\n-661 // complex numbers are not provided in pair form. (x,y)\n-662 _\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b<_\bT_\b> real, imag;\n-663 is>>real;\n-664 is>>imag;\n-665 data._\bn_\bu_\bm_\bb_\be_\br = {real._\bn_\bu_\bm_\bb_\be_\br, imag._\bn_\bu_\bm_\bb_\be_\br};\n-666 return is;\n-667 }\n-668\n-675 template\n-_\b6_\b7_\b6 struct _\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br\n-677 {\n-683 template\n-_\b6_\b8_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const std::vector > >& rows,\n-685 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b>& matrix)\n-686 {\n-687 static_assert(IsNumber::value && brows==1 && bcols==1, \"Only scalar\n-entries are expected here!\");\n-688 for (auto iter=matrix._\bb_\be_\bg_\bi_\bn(); iter!= matrix._\be_\bn_\bd(); ++iter)\n-689 {\n-690 auto brow=iter.index();\n-691 for (auto siter=rows[brow].begin(); siter != rows[brow].end(); ++siter)\n-692 (*iter)[siter->index] = siter->number;\n-693 }\n-694 }\n-695\n-701 template\n-_\b7_\b0_\b2 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const std::vector > >& rows,\n-703 _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bb_\br_\bo_\bw_\bs_\b,_\bb_\bc_\bo_\bl_\bs_\b> >& matrix)\n-704 {\n-705 for (auto iter=matrix.begin(); iter!= matrix.end(); ++iter)\n-706 {\n-707 for (auto brow=iter.index()*brows,\n-708 browend=iter.index()*brows+brows;\n-709 browindex/bcols][brow%brows][siter->index%bcols]=siter->number;\n-714 }\n-715 }\n-716 }\n-717 };\n-718\n-719 template\n-_\b7_\b2_\b0 struct _\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br<_\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by,brows,bcols>\n-721 {\n-722 template\n-_\b7_\b2_\b3 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const std::vector > >&\n-rows,\n-724 M& matrix)\n-725 {}\n-726 };\n-727\n-_\b7_\b2_\b8 template struct _\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx : std::false_type {};\n-_\b7_\b2_\b9 template struct _\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx<_\bs_\bt_\bd::complex> : std::true_type {};\n-730\n-731 // wrapper for std::conj. Returns T if T is not complex.\n-732 template\n-_\b7_\b3_\b3 std::enable_if_t::value, T> _\bc_\bo_\bn_\bj(const T& r){\n-734 return r;\n-735 }\n-736\n-737 template\n-_\b7_\b3_\b8 std::enable_if_t::value, T> _\bc_\bo_\bn_\bj(const T& r){\n-739 return std::conj(r);\n-740 }\n-741\n-742 template\n-_\b7_\b4_\b3 struct _\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs\n-744 {};\n-745\n-746 template\n-_\b7_\b4_\b7 struct _\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n-748 {\n-749 enum {\n-_\b7_\b5_\b0 rows = 1,\n-751 cols = 1\n-_\b7_\b5_\b2 };\n-753 };\n-754\n-755 template\n-_\b7_\b5_\b6 struct _\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A> >\n-757 {\n-758 enum {\n-_\b7_\b5_\b9 rows = i,\n-760 cols = j\n-_\b7_\b6_\b1 };\n-762 };\n-763\n-764 template\n-_\b7_\b6_\b5 void _\br_\be_\ba_\bd_\bS_\bp_\ba_\br_\bs_\be_\bE_\bn_\bt_\br_\bi_\be_\bs(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>& matrix,\n-766 std::istream& file, std::size_t entries,\n-767 const _\bM_\bM_\bH_\be_\ba_\bd_\be_\br& mmHeader, const D&)\n-768 {\n-769 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n-770\n-771 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)\n-772 constexpr int brows = _\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bs;\n-773 constexpr int bcols = _\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bs;\n-774\n-775 // First path\n-776 // store entries together with column index in a separate\n-777 // data structure\n-778 std::vector > > rows(matrix._\bN()*brows);\n-779\n-780 auto readloop = [&] (auto symmetryFixup) {\n-781 for(std::size_t i = 0; i < entries; ++i) {\n-782 std::size_t row;\n-783 _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bD_\b> data;\n-784 _\bs_\bk_\bi_\bp_\bC_\bo_\bm_\bm_\be_\bn_\bt_\bs(file);\n-785 file>>row;\n-786 --row; // Index was 1 based.\n-787 assert(row/bcols>data;\n-789 assert(data._\bi_\bn_\bd_\be_\bx/bcols data_sym(data);\n-804 data_sym._\bi_\bn_\bd_\be_\bx = row;\n-805 rows[data.index].insert(data_sym);\n-806 });\n-807 break;\n-808 case _\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc :\n-809 readloop([&](auto row, auto data) {\n-810 _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bD_\b> data_sym;\n-811 data_sym.number = -data.number;\n-812 data_sym._\bi_\bn_\bd_\be_\bx = row;\n-813 rows[data.index].insert(data_sym);\n-814 });\n-815 break;\n-816 case _\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn :\n-817 readloop([&](auto row, auto data) {\n-818 _\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b<_\bD_\b> data_sym;\n-819 data_sym.number = _\bc_\bo_\bn_\bj(data.number);\n-820 data_sym._\bi_\bn_\bd_\be_\bx = row;\n-821 rows[data.index].insert(data_sym);\n-822 });\n-823 break;\n-824 default:\n-825 DUNE_THROW(Dune::NotImplemented,\n-826 \"Only general, symmetric, skew-symmetric and hermitian is supported right\n-now!\");\n-827 }\n-828\n-829 // Setup the matrix sparsity pattern\n-830 int nnz=0;\n-831 for(typename Matrix::CreateIterator iter=matrix._\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn();\n-832 iter!= matrix._\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd(); ++iter)\n-833 {\n-834 for(std::size_t brow=iter.index()*brows, browend=iter.index()*brows+brows;\n-835 brow >::const_iterator Siter;\n-838 for(Siter siter=rows[brow].begin(), send=rows[brow].end();\n-839 siter != send; ++siter, ++nnz)\n-840 iter.insert(siter->index/bcols);\n-841 }\n-842 }\n-843\n-844 //Set the matrix values\n-845 matrix=0;\n-846\n-847 _\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b<_\bD_\b,_\bb_\br_\bo_\bw_\bs_\b,_\bb_\bc_\bo_\bl_\bs_\b> Setter;\n-848\n-849 Setter(rows, matrix);\n-850 }\n-851\n-_\b8_\b5_\b2 inline std::tuple _\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be(const std::\n-string& filename) {\n-853 std::size_t lastdot = filename.find_last_of(\".\");\n-854 if(lastdot == std::string::npos)\n-855 return std::make_tuple(filename, \"\");\n-856 else {\n-857 std::string potentialFileExtension = filename.substr(lastdot);\n-858 if (potentialFileExtension == \".mm\" || potentialFileExtension == \".mtx\")\n-859 return std::make_tuple(filename.substr(0, lastdot),\n-potentialFileExtension);\n-860 else\n-861 return std::make_tuple(filename, \"\");\n-862 }\n-863 }\n-864\n-865 } // end namespace MatrixMarketImpl\n-866\n-_\b8_\b6_\b7 class _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br : public Dune::Exception\n-868 {};\n-869\n-870\n-_\b8_\b7_\b1 inline void _\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bh_\be_\ba_\bd_\be_\br(std::size_t& rows, std::size_t& cols,\n-872 _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br& header, std::istream& istr,\n-873 bool isVector)\n-874 {\n-875 using namespace MatrixMarketImpl;\n-876\n-877 if(!readMatrixMarketBanner(istr, header)) {\n-878 std::cerr << \"First line was not a correct Matrix Market banner. Using\n-default:\\n\"\n-879 << \"%%MatrixMarket matrix coordinate real general\"<> rows;\n-893\n-894 if(lineFeed(istr))\n-895 throw _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br();\n-896 istr >> cols;\n-897 }\n-898\n-899 template\n-_\b9_\b0_\b0 void _\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& vector,\n-901 std::size_t size,\n-902 std::istream& istr,\n-903 size_t lane)\n-904 {\n-905 for (int i=0; size>0; ++i, --size)\n-906 istr>>Simd::lane(lane,vector[i]);\n-907 }\n-908\n-909 template\n-_\b9_\b1_\b0 void _\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br,A>& vector,\n-911 std::size_t size,\n-912 std::istream& istr,\n-913 size_t lane)\n-914 {\n-915 for(int i=0; size>0; ++i, --size) {\n-916 Simd::Scalar val;\n-917 istr>>val;\n-918 Simd::lane(lane, vector[i/entries][i%entries])=val;\n-919 }\n-920 }\n-921\n-922\n-929 template\n-_\b9_\b3_\b0 void _\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& vector,\n-931 std::istream& istr)\n-932 {\n-933 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be field_type;\n-934 using namespace MatrixMarketImpl;\n-935\n-936 MMHeader header;\n-937 std::size_t rows, cols;\n-938 _\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bh_\be_\ba_\bd_\be_\br(rows,cols,header,istr, true);\n-939 if(cols!=Simd::lanes()) {\n-940 if(Simd::lanes() == 1)\n-941 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br, \"cols!=1, therefore this is no\n-vector!\");\n-942 else\n-943 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br, \"cols does not match the number of\n-lanes in the field_type!\");\n-944 }\n-945\n-946 if(header.type!=array_type)\n-947 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br, \"Vectors have to be stored in array\n-format!\");\n-948\n-949\n-950 if constexpr (Dune::IsNumber())\n-951 vector._\br_\be_\bs_\bi_\bz_\be(rows);\n-952 else\n-953 {\n-954 T dummy;\n-955 auto blocksize = dummy.size();\n-956 std::size_t size=rows/blocksize;\n-957 if(size*blocksize!=rows)\n-958 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br, \"Block size of vector is not\n-correct!\");\n-959\n-960 vector._\br_\be_\bs_\bi_\bz_\be(size);\n-961 }\n-962\n-963 istr.ignore(std::numeric_limits::max(),'\\n');\n-964 for(size_t l=0;l();++l){\n-965 _\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs(vector, rows, istr, l);\n-966 }\n-967 }\n-968\n-975 template\n-_\b9_\b7_\b6 void _\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>& matrix,\n-977 std::istream& istr)\n-978 {\n-979 using namespace MatrixMarketImpl;\n-980 using _\bM_\ba_\bt_\br_\bi_\bx = _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>;\n-981\n-982 MMHeader header;\n-983 if(!readMatrixMarketBanner(istr, header)) {\n-984 std::cerr << \"First line was not a correct Matrix Market banner. Using\n-default:\\n\"\n-985 << \"%%MatrixMarket matrix coordinate real general\"<> rows;\n-998\n-999 if(lineFeed(istr))\n-1000 throw _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br();\n-1001 istr >> cols;\n-1002\n-1003 if(lineFeed(istr))\n-1004 throw _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br();\n-1005\n-1006 istr >>entries;\n-1007\n-1008 std::size_t nnz, blockrows, blockcols;\n-1009\n-1010 // Number of rows and columns of T, if it is a matrix (1x1 otherwise)\n-1011 constexpr int brows = mm_multipliers::rows;\n-1012 constexpr int bcols = mm_multipliers::cols;\n-1013\n-1014 std::tie(blockrows, blockcols, nnz) = calculateNNZ(rows,\n-cols, entries, header);\n-1015\n-1016 istr.ignore(std::numeric_limits::max(),'\\n');\n-1017\n-1018\n-1019 matrix._\bs_\be_\bt_\bS_\bi_\bz_\be(blockrows, blockcols, nnz);\n-1020 matrix._\bs_\be_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be(_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bA_\b>_\b:_\b:_\br_\bo_\bw_\b__\bw_\bi_\bs_\be);\n-1021\n-1022 if(header.type==array_type)\n-1023 DUNE_THROW(Dune::NotImplemented, \"Array format currently not supported for\n-matrices!\");\n-1024\n-1025 readSparseEntries(matrix, istr, entries, header, NumericWrapper());\n-1026 }\n-1027\n-1028 // Print a scalar entry\n-1029 template\n-_\b1_\b0_\b3_\b0 void _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\be_\bn_\bt_\br_\by(const B& entry,\n-1031 std::size_t rowidx,\n-1032 std::size_t colidx,\n-1033 std::ostream& ostr)\n-1034 {\n-1035 if constexpr (IsNumber())\n-1036 ostr << rowidx << \" \" << colidx << \" \" << entry << std::endl;\n-1037 else\n-1038 {\n-1039 for (auto row=entry.begin(); row != entry.end(); ++row, ++rowidx) {\n-1040 int coli=colidx;\n-1041 for (auto _\bc_\bo_\bl = row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl, ++coli)\n-1042 ostr<< rowidx<<\" \"<\n-_\b1_\b0_\b4_\b9 void _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by(const V& entry, std::ostream& ostr,\n-1050 const std::integral_constant&,\n-1051 size_t lane)\n-1052 {\n-1053 ostr<\n-_\b1_\b0_\b5_\b8 void _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by(const V& vector, std::ostream& ostr,\n-1059 const std::integral_constant&,\n-1060 size_t lane)\n-1061 {\n-1062 using namespace MatrixMarketImpl;\n-1063\n-1064 // Is the entry a supported numeric type?\n-1065 const int isnumeric = mm_numeric_type>::is_numeric;\n-1066 typedef typename V::const_iterator VIter;\n-1067\n-1068 for(VIter i=vector.begin(); i != vector.end(); ++i)\n-1069\n-1070 _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by(*i, ostr,\n-1071 std::integral_constant(),\n-1072 lane);\n-1073 }\n-1074\n-1075 template\n-_\b1_\b0_\b7_\b6 std::size_t _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bA_\b>& vector)\n-1077 {\n-1078 return vector.size();\n-1079 }\n-1080\n-1081 template\n-_\b1_\b0_\b8_\b2 std::size_t _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br,A>& vector)\n-1083 {\n-1084 return vector.size()*i;\n-1085 }\n-1086\n-1087 // Version for writing vectors.\n-1088 template\n-_\b1_\b0_\b8_\b9 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(const V& vector, std::ostream& ostr,\n-1090 const std::integral_constant&)\n-1091 {\n-1092 using namespace MatrixMarketImpl;\n-1093 typedef typename V::field_type field_type;\n-1094\n-1095 ostr<<_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(vector)<<\" \"<()<>::is_numeric;\n-1097 for(size_t l=0;l(); ++l){\n-1098 _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by(vector,ostr, std::integral_constant\n-(), l);\n-1099 }\n-1100 }\n-1101\n-1102 // Versions for writing matrices\n-1103 template\n-_\b1_\b1_\b0_\b4 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(const M& matrix,\n-1105 std::ostream& ostr,\n-1106 const std::integral_constant&)\n-1107 {\n-1108 ostr<_\b:_\b:_\br_\bo_\bw_\bs<<\" \"\n-1109 <_\b:_\b:_\bc_\bo_\bl_\bs<<\" \"\n-1110 <<_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs(matrix)<begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl)\n-1116 // Matrix Market indexing start with 1!\n-1117 _\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\be_\bn_\bt_\br_\by(*_\bc_\bo_\bl, row.index()*_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\bM_\b>_\b:_\b:\n-_\br_\bo_\bw_\bs+1,\n-1118 _\bc_\bo_\bl.index()*_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs_\b<_\bM_\b>_\b:_\b:_\bc_\bo_\bl_\bs+1, ostr);\n-1119 }\n-1120\n-1121\n-1125 template\n-_\b1_\b1_\b2_\b6 void _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(const M& matrix,\n-1127 std::ostream& ostr)\n-1128 {\n-1129 using namespace MatrixMarketImpl;\n-1130\n-1131 // Write header information\n-1132 mm_header_printer::print(ostr);\n-1133 mm_block_structure_header::print(ostr,matrix);\n-1134 // Choose the correct function for matrix and vector\n-1135 _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(matrix,ostr,std::integral_constant_\b:_\b:\n-_\bv_\ba_\bl_\bu_\be>());\n-1136 }\n-1137\n-_\b1_\b1_\b3_\b8 static const int _\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn = -1;\n-1150 template\n-_\b1_\b1_\b5_\b1 void _\bs_\bt_\bo_\br_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(const M& matrix,\n-1152 std::string filename,\n-1153 int prec=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn)\n-1154 {\n-1155 auto [pureFilename, extension] = _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n-(filename);\n-1156 std::string rfilename;\n-1157 std::ofstream file;\n-1158 if (extension != \"\") {\n-1159 rfilename = pureFilename + extension;\n-1160 file.open(rfilename.c_str());\n-1161 if(!file)\n-1162 DUNE_THROW(IOError, \"Could not open file for storage: \" << rfilename.c_str\n-());\n-1163 }\n-1164 else {\n-1165 // only try .mm so we do not ignore potential errors\n-1166 rfilename = pureFilename + \".mm\";\n-1167 file.open(rfilename.c_str());\n-1168 if(!file)\n-1169 DUNE_THROW(IOError, \"Could not open file for storage: \" << rfilename.c_str\n-());\n-1170 }\n-1171\n-1172 file.setf(std::ios::scientific,std::ios::floatfield);\n-1173 if(prec>0)\n-1174 file.precision(prec);\n-1175 _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(matrix, file);\n-1176 file.close();\n-1177 }\n-1178\n-1179#if HAVE_MPI\n-1194 template\n-_\b1_\b1_\b9_\b5 void _\bs_\bt_\bo_\br_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(const M& matrix,\n-1196 std::string filename,\n-1197 const _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bG_\b,_\bL_\b>& comm,\n-1198 bool storeIndices=true,\n-1199 int prec=_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn)\n-1200 {\n-1201 // Get our rank\n-1202 int rank = comm._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br().rank();\n-1203 // Write the local matrix\n-1204 auto [pureFilename, extension] = _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n-(filename);\n-1205 std::string rfilename;\n-1206 std::ofstream file;\n-1207 if (extension != \"\") {\n-1208 rfilename = pureFilename + \"_\" + std::to_string(rank) + extension;\n-1209 file.open(rfilename.c_str());\n-1210 dverb<< rfilename <\n+_\b3_\b7 static _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be _\bc_\br_\be_\ba_\bt_\be(const M& matrix, T& excluded,\n+38 PI& pinfo, const OF& of)\n+39 {\n+40 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh* mg = new _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh(matrix.getmat());\n+41 typedef typename PI::ParallelIndexSet ParallelIndexSet;\n+42 typedef typename ParallelIndexSet::const_iterator IndexIterator;\n+43 IndexIterator iend = pinfo.indexSet().end();\n+44\n+45 for(IndexIterator index = pinfo.indexSet().begin(); index != iend; ++index)\n+46 excluded[index->local()] = of.contains(index->local().attribute());\n+47\n+48 _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh* sg= new _\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh(*mg, excluded);\n+49 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh* pg = new _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(*sg, IdentityMap(), sg-\n+>_\bg_\be_\bt_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp());\n+50 return _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be(mg,pg,sg);\n+51 }\n+52\n+_\b5_\b3 static void _\bf_\br_\be_\be(_\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be& graphs)\n+54 {\n+55 delete std::get<2>(graphs);\n+56 delete std::get<1>(graphs);\n+57 }\n+58 };\n+59\n+60 template\n+_\b6_\b1 struct _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br\n+62 {\n+_\b6_\b3 typedef typename M::matrix_type _\bM_\ba_\bt_\br_\bi_\bx;\n+64\n+_\b6_\b5 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\ba_\bt_\br_\bi_\bx_\b> _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh;\n+66\n+67 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh,\n+68 _\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n+69 _\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n+70 IdentityMap,\n+_\b7_\b1 IdentityMap> _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh;\n+72\n+_\b7_\b3 typedef std::tuple _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be;\n+74\n+75 template\n+_\b7_\b6 static _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be _\bc_\br_\be_\ba_\bt_\be([[maybe_unused]] const M& matrix,\n+77 [[maybe_unused]] T& excluded,\n+78 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n+79 const OF&)\n+80 {\n+81 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh* mg = new _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh(matrix.getmat());\n+82 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh* pg = new _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh(*mg, IdentityMap(), IdentityMap\n ());\n-1213 }\n-1214 else {\n-1215 // only try .mm so we do not ignore potential errors\n-1216 rfilename = pureFilename + \"_\" + std::to_string(rank) + \".mm\";\n-1217 file.open(rfilename.c_str());\n-1218 dverb<< rfilename <0)\n-1224 file.precision(prec);\n-1225 _\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(matrix, file);\n-1226 file.close();\n-1227\n-1228 if(!storeIndices)\n-1229 return;\n-1230\n-1231 // Write the global to local index mapping\n-1232 rfilename = pureFilename + \"_\" + std::to_string(rank) + \".idx\";\n-1233 file.open(rfilename.c_str());\n-1234 if(!file)\n-1235 DUNE_THROW(IOError, \"Could not open file for storage: \" << rfilename.c_str\n-());\n-1236 file.setf(std::ios::scientific,std::ios::floatfield);\n-1237 typedef typename _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bG_\b,_\bL_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-IndexSet;\n-1238 typedef typename IndexSet::const_iterator Iterator;\n-1239 for(Iterator iter = comm._\bi_\bn_\bd_\be_\bx_\bS_\be_\bt().begin();\n-1240 iter != comm._\bi_\bn_\bd_\be_\bx_\bS_\be_\bt().end(); ++iter) {\n-1241 file << iter->global()<<\" \"<<(std::size_t)iter->local()<<\" \"\n-1242 <<(int)iter->local().attribute()<<\" \"<<(int)iter->local().isPublic\n-()<& neighbours=comm._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().getNeighbours();\n-1247 typedef std::set::const_iterator SIter;\n-1248 for(SIter neighbour=neighbours.begin(); neighbour != neighbours.end();\n-++neighbour) {\n-1249 file<<\" \"<< *neighbour;\n-1250 }\n-1251 file.close();\n-1252 }\n-1253\n-1268 template\n-_\b1_\b2_\b6_\b9 void _\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(M& matrix,\n-1270 const std::string& filename,\n-1271 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bG_\b,_\bL_\b>& comm,\n-1272 bool readIndices=true)\n-1273 {\n-1274 using namespace MatrixMarketImpl;\n-1275\n-1276 using LocalIndexT = typename _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bG_\b,_\bL_\b>_\b:_\b:\n-_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-1277 typedef typename LocalIndexT::Attribute Attribute;\n-1278 // Get our rank\n-1279 int rank = comm._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br().rank();\n-1280 // load local matrix\n-1281 auto [pureFilename, extension] = _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n-(filename);\n-1282 std::string rfilename;\n-1283 std::ifstream file;\n-1284 if (extension != \"\") {\n-1285 rfilename = pureFilename + \"_\" + std::to_string(rank) + extension;\n-1286 file.open(rfilename.c_str(), std::ios::in);\n-1287 dverb<< rfilename <_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-IndexSet;\n-1311 IndexSet& pis=comm.pis;\n-1312 rfilename = pureFilename + \"_\" + std::to_string(rank) + \".idx\";\n-1313 file.open(rfilename.c_str());\n-1314 if(!file)\n-1315 DUNE_THROW(IOError, \"Could not open file: \" << rfilename.c_str());\n-1316 if(pis.size()!=0)\n-1317 DUNE_THROW(InvalidIndexSetState, \"Index set is not empty!\");\n-1318\n-1319 pis.beginResize();\n-1320 while(!file.eof() && file.peek()!='n') {\n-1321 G g;\n-1322 file >>g;\n-1323 std::size_t l;\n-1324 file >>l;\n-1325 int c;\n-1326 file >>c;\n-1327 bool b;\n-1328 file >> b;\n-1329 pis.add(g,LocalIndexT(l,Attribute(c),b));\n-1330 lineFeed(file);\n-1331 }\n-1332 pis.endResize();\n-1333 if(!file.eof()) {\n-1334 // read neighbours\n-1335 std::string s;\n-1336 file>>s;\n-1337 if(s!=\"neighbours:\")\n-1338 DUNE_THROW(_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br, \"was expecting the string:\n-\\\"neighbours:\\\"\");\n-1339 std::set nb;\n-1340 while(!file.eof()) {\n-1341 int i;\n-1342 file >> i;\n-1343 nb.insert(i);\n-1344 }\n-1345 file.close();\n-1346 comm.ri.setNeighbours(nb);\n-1347 }\n-1348 comm.ri.template rebuild();\n-1349 }\n-1350\n-1351 #endif\n-1352\n-1363 template\n-_\b1_\b3_\b6_\b4 void _\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(M& matrix,\n-1365 const std::string& filename)\n-1366 {\n-1367 auto [pureFilename, extension] = _\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n-(filename);\n-1368 std::string rfilename;\n-1369 std::ifstream file;\n-1370 if (extension != \"\") {\n-1371 rfilename = pureFilename + extension;\n-1372 file.open(rfilename.c_str());\n-1373 if(!file)\n-1374 DUNE_THROW(IOError, \"Could not open file: \" << rfilename.c_str());\n-1375 }\n-1376 else {\n-1377 // try both .mm and .mtx\n-1378 rfilename = pureFilename + \".mm\";\n-1379 file.open(rfilename.c_str(), std::ios::in);\n-1380 if(!file) {\n-1381 rfilename = pureFilename + \".mtx\";\n-1382 file.open(rfilename.c_str(), std::ios::in);\n-1383 if(!file)\n-1384 DUNE_THROW(IOError, \"Could not open file: \" << rfilename.c_str());\n-1385 }\n-1386 }\n-1387 _\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(matrix,file);\n-1388 file.close();\n-1389 }\n-1390\n-1392}\n-1393#endif\n-_\bm_\ba_\bt_\br_\bi_\bx_\bu_\bt_\bi_\bl_\bs_\b._\bh_\bh\n-Some handy generic functions for ISTL matrices.\n+83 return _\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be(mg,pg);\n+84 }\n+85\n+_\b8_\b6 static void _\bf_\br_\be_\be(_\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be& graphs)\n+87 {\n+88 delete std::get<1>(graphs);\n+89 }\n+90\n+91 };\n+92\n+93 } //namespace Amg\n+94} // namespace Dune\n+95#endif\n _\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n Implementation of the BCRSMatrix class.\n-_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n-Classes providing communication interfaces for overlapping Schwarz methods.\n-_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-This file implements a vector space as a tensor product of a given vector\n-space. The number of compon...\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs\n-auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::\n-value > *sfinae=nullptr)\n-Get the number of nonzero fields in the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:119\n-_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt\n-void readMatrixMarket(Dune::BlockVector< T, A > &vector, std::istream &istr)\n-Reads a BlockVector from a matrix market file.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:930\n-_\bD_\bu_\bn_\be_\b:_\b:_\bs_\bt_\bo_\br_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt\n-void storeMatrixMarket(const M &matrix, std::string filename, int\n-prec=default_precision)\n-Stores a parallel matrix/vector in matrix market format in a file.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt\n-void loadMatrixMarket(M &matrix, const std::string &filename,\n-OwnerOverlapCopyCommunication< G, L > &comm, bool readIndices=true)\n-Load a parallel matrix/vector stored in matrix market format.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs\n-std::size_t countEntries(const BlockVector< T, A > &vector)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1076\n-_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\bi_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt\n-void writeMatrixMarket(const V &vector, std::ostream &ostr, const std::\n-integral_constant< int, 0 > &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1089\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\by\n-void mm_print_vector_entry(const V &entry, std::ostream &ostr, const std::\n-integral_constant< int, 1 > &, size_t lane)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1049\n-_\bD_\bu_\bn_\be_\b:_\b:_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b__\bp_\br_\be_\bc_\bi_\bs_\bi_\bo_\bn\n-static const int default_precision\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1138\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bv_\be_\bc_\bt_\bo_\br_\b__\be_\bn_\bt_\br_\bi_\be_\bs\n-void mm_read_vector_entries(Dune::BlockVector< T, A > &vector, std::size_t\n-size, std::istream &istr, size_t lane)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:900\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\br_\be_\ba_\bd_\b__\bh_\be_\ba_\bd_\be_\br\n-void mm_read_header(std::size_t &rows, std::size_t &cols, MatrixMarketImpl::\n-MMHeader &header, std::istream &istr, bool isVector)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:871\n-_\bD_\bu_\bn_\be_\b:_\b:_\bm_\bm_\b__\bp_\br_\bi_\bn_\bt_\b__\be_\bn_\bt_\br_\by\n-void mm_print_entry(const B &entry, std::size_t rowidx, std::size_t colidx,\n-std::ostream &ostr)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1030\n-_\bs_\bt_\bd\n-STL namespace.\n+_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n+Define general, extensible interface for operators. The available\n+implementation wraps a matrix.\n+_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\n+Provides classes for building the matrix graph.\n+_\bd_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b._\bh_\bh\n+Provides classes for initializing the link attributes of a matrix graph.\n+_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bN_\bN_\bZ\n-std::tuple< std::size_t, std::size_t, std::size_t > calculateNNZ(std::size_t\n-rows, std::size_t cols, std::size_t entries, const MMHeader &header)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:547\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<\n-bool operator<(const IndexData< T > &i1, const IndexData< T > &i2)\n-LessThan operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:630\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bL_\bi_\bn_\be_\bT_\by_\bp_\be\n-LineType\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bD_\bA_\bT_\bA\n-@ DATA\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bH_\bE_\bA_\bD_\bE_\bR\n-@ MM_HEADER\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bI_\bS_\bT_\bL_\bS_\bT_\bR_\bU_\bC_\bT\n-@ MM_ISTLSTRUCT\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\br_\be_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bB_\ba_\bn_\bn_\be_\br\n-bool readMatrixMarketBanner(std::istream &file, MMHeader &mmHeader)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:353\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\br_\be_\ba_\bd_\bS_\bp_\ba_\br_\bs_\be_\bE_\bn_\bt_\br_\bi_\be_\bs\n-void readSparseEntries(Dune::BCRSMatrix< T, A > &matrix, std::istream &file,\n-std::size_t entries, const MMHeader &mmHeader, const D &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:765\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bT_\bY_\bP_\bE\n-MM_TYPE\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\ba_\br_\br_\ba_\by_\b__\bt_\by_\bp_\be\n-@ array_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bo_\br_\bd_\bi_\bn_\ba_\bt_\be_\b__\bt_\by_\bp_\be\n-@ coordinate_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bt_\by_\bp_\be\n-@ unknown_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b>\n-std::istream & operator>>(std::istream &is, NumericWrapper< T > &num)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:614\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bk_\bi_\bp_\bC_\bo_\bm_\bm_\be_\bn_\bt_\bs\n-void skipComments(std::istream &file)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:339\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bl_\bi_\bn_\be_\bF_\be_\be_\bd\n-bool lineFeed(std::istream &file)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:315\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bM_\bA_\bX_\b__\bL_\bI_\bN_\bE_\b__\bL_\bE_\bN_\bG_\bT_\bH\n-@ MM_MAX_LINE_LENGTH\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:297\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bS_\bT_\bR_\bU_\bC_\bT_\bU_\bR_\bE\n-MM_STRUCTURE\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bk_\be_\bw_\b__\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc\n-@ skew_symmetric\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bg_\be_\bn_\be_\br_\ba_\bl\n-@ general\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bh_\be_\br_\bm_\bi_\bt_\bi_\ba_\bn\n-@ hermitian\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be\n-@ unknown_structure\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\by_\bm_\bm_\be_\bt_\br_\bi_\bc\n-@ symmetric\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:303\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\b__\bC_\bT_\bY_\bP_\bE\n-MM_CTYPE\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bu_\bn_\bk_\bn_\bo_\bw_\bn_\b__\bc_\bt_\by_\bp_\be\n-@ unknown_ctype\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bp_\ba_\bt_\bt_\be_\br_\bn\n-@ pattern\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b__\bt_\by_\bp_\be\n-@ complex_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bd_\bo_\bu_\bb_\bl_\be_\b__\bt_\by_\bp_\be\n-@ double_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bn_\bt_\be_\bg_\be_\br_\b__\bt_\by_\bp_\be\n-@ integer_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:301\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bc_\bo_\bn_\bj\n-std::enable_if_t::value, T > conj(const T &r)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:733\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bs_\bp_\bl_\bi_\bt_\bF_\bi_\bl_\be_\bn_\ba_\bm_\be\n-std::tuple< std::string, std::string > splitFilename(const std::string\n-&filename)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:852\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-Iterator begin()\n-Get iterator to first row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:671\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-Iterator end()\n-Get iterator to one beyond last row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:677\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd\n-CreateIterator createend()\n-get create iterator pointing to one after the last block\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n-size_type M() const\n-number of columns (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2007\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn\n-CreateIterator createbegin()\n-get initial create iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1094\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-size_type N() const\n-number of rows (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bB_\bu_\bi_\bl_\bd_\bM_\bo_\bd_\be\n-void setBuildMode(BuildMode bm)\n-Sets the build mode of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:830\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n-void setSize(size_type rows, size_type columns, size_type nnz=0)\n-Set the size of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:858\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-A vector of blocks with memory management.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-void resize(size_type size)\n-Resize the vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:496\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< B >::field_type field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:398\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-A generic dynamic dense matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be\n-Helper metaprogram to get the matrix market string representation of the\n-numeric type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b:_\b:_\bi_\bs_\b__\bn_\bu_\bm_\be_\br_\bi_\bc\n-@ is_numeric\n-Whether T is a supported numeric type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bi_\bn_\bt_\b _\b>_\b:_\b:_\bs_\bt_\br\n-static std::string str()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:95\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b:_\b:_\bs_\bt_\br\n-static std::string str()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b:_\b:_\bs_\bt_\br\n-static std::string str()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:127\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b _\b>_\b _\b>_\b:_\b:_\bs_\bt_\br\n-static std::string str()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:143\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bn_\bu_\bm_\be_\br_\bi_\bc_\b__\bt_\by_\bp_\be_\b<_\b _\bs_\bt_\bd_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bx_\b<_\b _\bf_\bl_\bo_\ba_\bt_\b _\b>_\b _\b>_\b:_\b:_\bs_\bt_\br\n-static std::string str()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:159\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br\n-Meta program to write the correct Matrix Market header.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n-static void print(std::ostream &os)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:179\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n-static void print(std::ostream &os)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:189\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bj_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n-static void print(std::ostream &os)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:199\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bh_\be_\ba_\bd_\be_\br_\b__\bp_\br_\bi_\bn_\bt_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,_\b _\bj_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n-static void print(std::ostream &os)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:209\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br\n-Metaprogram for writing the ISTL block structure header.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:225\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n-static void print(std::ostream &os, const M &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:233\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM\n-BlockVector< T, A > M\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,\n-_\bi_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM\n-BlockVector< FieldVector< T, i >, A > M\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:243\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,\n-_\bi_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n-static void print(std::ostream &os, const M &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:245\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM\n-BCRSMatrix< T, A > M\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:255\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n-static void print(std::ostream &os, const M &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:258\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,\n-_\bi_\b,_\b _\bj_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM\n-BCRSMatrix< FieldMatrix< T, i, j >, A > M\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:268\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,\n-_\bi_\b,_\b _\bj_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n-static void print(std::ostream &os, const M &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:270\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,_\b _\bj_\b _\b>_\b _\b>_\b:_\b:\n-_\bp_\br_\bi_\bn_\bt\n-static void print(std::ostream &os, const M &m)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:283\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bi_\b,_\b _\bj_\b _\b>_\b _\b>_\b:_\b:_\bM\n-FieldMatrix< T, i, j > M\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:281\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bi_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\bi_\bn_\bt\n-static void print(std::ostream &os, const M &m)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:292\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bb_\bl_\bo_\bc_\bk_\b__\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be_\b__\bh_\be_\ba_\bd_\be_\br_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bT_\b,_\b _\bi_\b _\b>_\b _\b>_\b:_\b:_\bM\n-FieldVector< T, i > M\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:290\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:306\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br_\b:_\b:_\bs_\bt_\br_\bu_\bc_\bt_\bu_\br_\be\n-MM_STRUCTURE structure\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:312\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br_\b:_\b:_\bt_\by_\bp_\be\n-MM_TYPE type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:310\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br\n-MMHeader()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:307\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\bM_\bH_\be_\ba_\bd_\be_\br_\b:_\b:_\bc_\bt_\by_\bp_\be\n-MM_CTYPE ctype\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:311\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:578\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bD_\ba_\bt_\ba_\b:_\b:_\bi_\bn_\bd_\be_\bx\n-std::size_t index\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:579\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br\n-a wrapper class of numeric values.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:595\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bN_\bu_\bm_\be_\br_\bi_\bc_\bW_\br_\ba_\bp_\bp_\be_\br_\b:_\b:_\bn_\bu_\bm_\bb_\be_\br\n-T number\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:596\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by\n-Utility class for marking the pattern type of the MatrixMarket matrices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:607\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br\n-Functor to the data values of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:677\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const std::vector< std::set< IndexData< D > > > &rows,\n-BCRSMatrix< T > &matrix)\n-Sets the matrix values.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:684\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const std::vector< std::set< IndexData< D > > > &rows,\n-BCRSMatrix< FieldMatrix< T, brows, bcols > > &matrix)\n-Sets the matrix values.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:702\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bV_\ba_\bl_\bu_\be_\bs_\bS_\be_\bt_\bt_\be_\br_\b<_\b _\bP_\ba_\bt_\bt_\be_\br_\bn_\bD_\bu_\bm_\bm_\by_\b,_\b _\bb_\br_\bo_\bw_\bs_\b,_\b _\bb_\bc_\bo_\bl_\bs_\b _\b>_\b:_\b:\n-_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-void operator()(const std::vector< std::set< IndexData< PatternDummy > > >\n-&rows, M &matrix)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:723\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bi_\bs_\b__\bc_\bo_\bm_\bp_\bl_\be_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:728\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bI_\bm_\bp_\bl_\b:_\b:_\bm_\bm_\b__\bm_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\be_\br_\bs\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:744\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt_\bF_\bo_\br_\bm_\ba_\bt_\bE_\br_\br_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:868\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx\n-Test whether a type is an ISTL Matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:504\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-A class setting up standard communication for a two-valued attribute set with\n-owner/overlap/copy sema...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bn_\bd_\be_\bx_\bS_\be_\bt\n-const ParallelIndexSet & indexSet() const\n-Get the underlying parallel index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:462\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-const Communication< MPI_Comm > & communicator() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-const RemoteIndices & remoteIndices() const\n-Get the underlying remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:471\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet\n-The type of the parallel index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:449\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+Class representing the properties of an edge in the matrix graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+Class representing a node in the matrix graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+The (undirected) graph of a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n+A subgraph of a graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:443\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bg_\be_\bt_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+EdgeIndexMap getEdgeIndexMap()\n+Get an edge index map for the graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bn_\bd_\be_\bx_\bM_\ba_\bp\n+An index map for mapping the edges to indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:470\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n+Attaches properties to the edges and vertices of a graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:978\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bu_\bb_\bG_\br_\ba_\bp_\bh\n+Dune::Amg::SubGraph< MatrixGraph, std::vector< bool > > SubGraph\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:26\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n+Dune::Amg::PropertiesGraph< SubGraph, VertexProperties, EdgeProperties,\n+IdentityMap, typename SubGraph::EdgeIndexMap > PropertiesGraph\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+M::matrix_type Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be\n+static GraphTuple create(const M &matrix, T &excluded, PI &pinfo, const OF &of)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bf_\br_\be_\be\n+static void free(GraphTuple &graphs)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+Dune::Amg::MatrixGraph< const Matrix > MatrixGraph\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:24\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be\n+std::tuple< MatrixGraph *, PropertiesGraph *, SubGraph * > GraphTuple\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+Dune::Amg::MatrixGraph< const Matrix > MatrixGraph\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+M::matrix_type Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n+Dune::Amg::PropertiesGraph< MatrixGraph, VertexProperties, EdgeProperties,\n+IdentityMap, IdentityMap > PropertiesGraph\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:71\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bG_\br_\ba_\bp_\bh_\bT_\bu_\bp_\bl_\be\n+std::tuple< MatrixGraph *, PropertiesGraph * > GraphTuple\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be\n+static GraphTuple create(const M &matrix, T &excluded, const\n+SequentialInformation &pinfo, const OF &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\bC_\br_\be_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bf_\br_\be_\be\n+static void free(GraphTuple &graphs)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graphcreator.hh:86\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00182.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00182.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: solverfactory.hh File Reference\n+dune-istl: galerkin.hh File Reference\n \n \n \n \n \n \n \n@@ -65,95 +65,74 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n \n-
    solverfactory.hh File Reference
    \n+Namespaces
    \n+ \n \n
    \n-
    #include <unordered_map>
    \n-#include <functional>
    \n-#include <memory>
    \n-#include <dune/common/parametertree.hh>
    \n-#include <dune/common/singleton.hh>
    \n-#include "solverregistry.hh"
    \n-#include <dune/istl/solver.hh>
    \n-#include <dune/istl/schwarz.hh>
    \n-#include <dune/istl/novlpschwarz.hh>
    \n+\n+

    Provides a class for building the galerkin product based on a aggregation scheme. \n+More...

    \n+
    #include "aggregates.hh"
    \n+#include "pinfo.hh"
    \n+#include <dune/common/poolallocator.hh>
    \n+#include <dune/common/enumset.hh>
    \n+#include <set>
    \n+#include <limits>
    \n+#include <algorithm>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::SolverFactory< Operator >
     Factory to assembly solvers configured by a ParameterTree. More...
    struct  Dune::Amg::OverlapVertex< T >
     
    class  Dune::Amg::SparsityBuilder< M >
     Functor for building the sparsity pattern of the matrix using examineConnectivity. More...
     
    class  Dune::Amg::BaseGalerkinProduct
     
    class  Dune::Amg::GalerkinProduct< T >
     
    class  Dune::Amg::GalerkinProduct< SequentialInformation >
     
    struct  Dune::Amg::BaseConnectivityConstructor
     
    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 >
     
    \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-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 > > >
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n

    \n-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::Amg
     
    \n-
    \n+

    Detailed Description

    \n+

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

    \n+
    Author
    Markus Blatt
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,101 +1,60 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bT_\by_\bp_\be_\bd_\be_\bf_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-solverfactory.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \"_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh\"\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+galerkin.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Provides a class for building the galerkin product based on a aggregation\n+scheme. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n+#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n+#include \n+#include \n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\b _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b _\b>\n-\u00a0 Factory to assembly solvers configured by a ParameterTree. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\b _\bT_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\b _\bM_\b _\b>\n+\u00a0 Functor for building the sparsity pattern of the matrix using\n+ examineConnectivity. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bT_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\b _\bG_\b,_\b _\bS_\b,_\b _\bV_\b _\b>\n+\u00a0 Visitor for identifying connected aggregates during a\n+ breadthFirstSearch. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\b _\bG_\b,_\b _\bT_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\b _\bG_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br_\b<_\b _\bT_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-T\bTy\byp\bpe\bed\bde\bef\bfs\bs\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr< _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< X, Y > >\n- (const M &, const ParameterTree &)\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by = Singleton< ParameterizedObjectFactory<\n- _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be< M, X, Y > > >\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br< X, Y >\n- >(const std::shared_ptr< M > &, const ParameterTree &)\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by = Singleton< ParameterizedObjectFactory<\n- _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be< M, X, Y > > >\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr< _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< X, Y\n- > >(const std::shared_ptr< _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< X, Y > > &, const std::\n- shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > > &, const std::shared_ptr<\n- _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br< X, Y > >, const ParameterTree &)\n-\u00a0\n-template\n-using\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by = Singleton< ParameterizedObjectFactory<\n- _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be< X, Y > > >\n-\u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl (const\n- std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br > &prec,\n- const O &)\n-\u00a0\n-template\n- std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl (const\n- std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br > &prec,\n- const std::shared_ptr<\n- _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< M, X, Y, C >\n- > &op)\n-\u00a0\n-template\n- std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl (const\n- std::shared_ptr< _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br > &prec,\n- const std::shared_ptr<\n- _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< M, X, Y,\n- C > > &op)\n-\u00a0\n-template\n-std::shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const std::\n- shared_ptr< _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br< M, X, Y > >\n- &)\n-\u00a0\n-template\n-std::shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const std::\n- shared_ptr< _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br<\n- M, X, Y, C > > &op)\n-\u00a0\n-template\n-std::shared_ptr< _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt< X > >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt (const std::\n- shared_ptr<\n- _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< M, X, Y,\n- C > > &op)\n-\u00a0\n-template\n- std::shared_ptr< _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br< _\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\br_\bo_\bm_\bF_\ba_\bc_\bt_\bo_\br_\by (std::\n- typename Operator::domain_type, shared_ptr< Operator > op, const\n- typename Operator::range_type > >\u00a0 ParameterTree &config, std::shared_ptr<\n- _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br< typename Operator::\n- domain_type, typename Operator::\n- range_type > > prec=nullptr)\n- Instantiates an _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br from an\n-\u00a0 Operator and a configuration given as a\n- ParameterTree.\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Provides a class for building the galerkin product based on a aggregation\n+scheme.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00182_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00182_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: solverfactory.hh Source File\n+dune-istl: galerkin.hh Source File\n \n \n \n \n \n \n \n@@ -70,244 +70,742 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    solverfactory.hh
    \n+
    galerkin.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5
    \n-
    6#ifndef DUNE_ISTL_SOLVERFACTORY_HH
    \n-
    7#define DUNE_ISTL_SOLVERFACTORY_HH
    \n-
    8
    \n-
    9#include <unordered_map>
    \n-
    10#include <functional>
    \n-
    11#include <memory>
    \n-
    12
    \n-
    13#include <dune/common/parametertree.hh>
    \n-
    14#include <dune/common/singleton.hh>
    \n+
    5#ifndef DUNE_GALERKIN_HH
    \n+
    6#define DUNE_GALERKIN_HH
    \n+
    7
    \n+
    8#include "aggregates.hh"
    \n+
    9#include "pinfo.hh"
    \n+
    10#include <dune/common/poolallocator.hh>
    \n+
    11#include <dune/common/enumset.hh>
    \n+
    12#include <set>
    \n+
    13#include <limits>
    \n+
    14#include <algorithm>
    \n
    15
    \n-
    16#include "solverregistry.hh"
    \n-
    17#include <dune/istl/solver.hh>
    \n-
    18#include <dune/istl/schwarz.hh>
    \n-\n-
    20
    \n-
    21namespace Dune{
    \n-
    26 // Direct solver factory:
    \n-
    27 template<class M, class X, class Y>
    \n-
    28 using DirectSolverSignature = std::shared_ptr<InverseOperator<X,Y>>(const M&, const ParameterTree&);
    \n-
    29 template<class M, class X, class Y>
    \n-
    30 using DirectSolverFactory = Singleton<ParameterizedObjectFactory<DirectSolverSignature<M,X,Y>>>;
    \n-
    31
    \n-
    32 // Preconditioner factory:
    \n-
    33 template<class M, class X, class Y>
    \n-
    34 using PreconditionerSignature = std::shared_ptr<Preconditioner<X,Y>>(const std::shared_ptr<M>&, const ParameterTree&);
    \n-
    35 template<class M, class X, class Y>
    \n-
    36 using PreconditionerFactory = Singleton<ParameterizedObjectFactory<PreconditionerSignature<M,X,Y>>>;
    \n-
    37
    \n-
    38 // Iterative solver factory
    \n-
    39 template<class X, class Y>
    \n-
    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&);
    \n-
    41 template<class X, class Y>
    \n-
    42 using IterativeSolverFactory = Singleton<ParameterizedObjectFactory<IterativeSolverSignature<X,Y>>>;
    \n+
    16namespace Dune
    \n+
    17{
    \n+
    18 namespace Amg
    \n+
    19 {
    \n+
    31 template<class T>
    \n+
    \n+\n+
    33 {
    \n+
    37 typedef T Aggregate;
    \n+
    38
    \n+
    42 typedef T Vertex;
    \n
    43
    \n-
    44 // initSolverFactories differs in different compilation units, so we have it
    \n-
    45 // in an anonymous namespace
    \n-
    46 namespace {
    \n-
    47
    \n-
    53 template<class O>
    \n-
    54 int initSolverFactories(){
    \n-
    55 using M = typename O::matrix_type;
    \n-
    56 using X = typename O::range_type;
    \n-
    57 using Y = typename O::domain_type;
    \n-
    58 using TL = Dune::TypeList<M,X,Y>;
    \n-\n-
    60 addRegistryToFactory<TL>(dsfac, DirectSolverTag{});
    \n-\n-
    62 addRegistryToFactory<TL>(pfac, PreconditionerTag{});
    \n-
    63 using TLS = Dune::TypeList<X,Y>;
    \n-\n-
    65 return addRegistryToFactory<TLS>(isfac, IterativeSolverTag{});
    \n-
    66 }
    \n-
    67 } // end anonymous namespace
    \n-
    68
    \n-
    69
    \n-
    70 template<class O, class Preconditioner>
    \n-
    \n-
    71 std::shared_ptr<Preconditioner> wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
    \n-
    72 const O&)
    \n-
    73 {
    \n-
    74 return prec;
    \n-
    75 }
    \n-
    \n-
    76
    \n-
    77 template<class M, class X, class Y, class C, class Preconditioner>
    \n-
    78 std::shared_ptr<Preconditioner>
    \n-
    \n-
    79 wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
    \n-
    80 const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C> >& op)
    \n-
    81 {
    \n-
    82 return std::make_shared<BlockPreconditioner<X,Y,C,Preconditioner> >(prec, op->getCommunication());
    \n-
    83 }
    \n-
    \n-
    84
    \n-
    85 template<class M, class X, class Y, class C, class Preconditioner>
    \n-
    86 std::shared_ptr<Preconditioner>
    \n-
    \n-
    87 wrapPreconditioner4Parallel(const std::shared_ptr<Preconditioner>& prec,
    \n-
    88 const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C> >& op)
    \n-
    89 {
    \n-
    90 return std::make_shared<NonoverlappingBlockPreconditioner<C,Preconditioner> >(prec, op->getCommunication());
    \n-
    91 }
    \n-
    \n-
    92
    \n-
    93 template<class M, class X, class Y>
    \n-
    \n-
    94 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<MatrixAdapter<M,X,Y> >&)
    \n-
    95 {
    \n-
    96 return std::make_shared<SeqScalarProduct<X>>();
    \n-
    97 }
    \n-
    \n-
    98 template<class M, class X, class Y, class C>
    \n-
    \n-
    99 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C> >& op)
    \n-
    100 {
    \n-
    101 return createScalarProduct<X>(op->getCommunication(), op->category());
    \n-
    102 }
    \n-
    \n-
    103
    \n-
    104 template<class M, class X, class Y, class C>
    \n-
    \n-
    105 std::shared_ptr<ScalarProduct<X>> createScalarProduct(const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C> >& op)
    \n-
    106 {
    \n-
    107 return createScalarProduct<X>(op->getCommunication(), op->category());
    \n-
    108 }
    \n-
    \n-
    109
    \n-
    129 template<class Operator>
    \n-
    \n-\n-
    131 using Domain = typename Operator::domain_type;
    \n-
    132 using Range = typename Operator::range_type;
    \n-\n-\n-
    135
    \n-
    136 template<class O>
    \n-
    137 using _matrix_type = typename O::matrix_type;
    \n-
    138 using matrix_type = Std::detected_or_t<int, _matrix_type, Operator>;
    \n-
    139 static constexpr bool isAssembled = !std::is_same<matrix_type, int>::value;
    \n-
    140
    \n-
    141 static const matrix_type* getmat(std::shared_ptr<Operator> op){
    \n-
    142 std::shared_ptr<AssembledLinearOperator<matrix_type, Domain, Range>> aop
    \n-
    143 = std::dynamic_pointer_cast<AssembledLinearOperator<matrix_type, Domain, Range>>(op);
    \n-
    144 if(aop)
    \n-
    145 return &aop->getmat();
    \n-
    146 return nullptr;
    \n-
    147 }
    \n-
    148
    \n-
    149 public:
    \n-
    150
    \n-
    \n-
    153 static std::shared_ptr<Solver> get(std::shared_ptr<Operator> op,
    \n-
    154 const ParameterTree& config,
    \n-
    155 std::shared_ptr<Preconditioner> prec = nullptr){
    \n-
    156 std::string type = config.get<std::string>("type");
    \n-
    157 std::shared_ptr<Solver> result;
    \n-
    158 const matrix_type* mat = getmat(op);
    \n-
    159 if(mat){
    \n-\n-
    161 if(op->category()!=SolverCategory::sequential){
    \n-
    162 DUNE_THROW(NotImplemented, "The solver factory does not support parallel direct solvers!");
    \n-
    163 }
    \n-
    164 result = DirectSolverFactory<matrix_type, Domain, Range>::instance().create(type, *mat, config);
    \n-
    165 return result;
    \n-
    166 }
    \n-
    167 }
    \n-
    168 // if no direct solver is found it might be an iterative solver
    \n-\n-
    170 DUNE_THROW(Dune::InvalidStateException, "Solver not found in the factory.");
    \n-
    171 }
    \n-
    172 if(!prec){
    \n-
    173 const ParameterTree& precConfig = config.sub("preconditioner");
    \n-
    174 std::string prec_type = precConfig.get<std::string>("type");
    \n-
    175 prec = PreconditionerFactory<Operator, Domain, Range>::instance().create(prec_type, op, precConfig);
    \n-
    176 if (prec->category() != op->category() && prec->category() == SolverCategory::sequential)
    \n-
    177 // try to wrap to a parallel preconditioner
    \n-
    178 prec = wrapPreconditioner4Parallel(prec, op);
    \n-
    179 }
    \n-
    180 std::shared_ptr<ScalarProduct<Domain>> sp = createScalarProduct(op);
    \n-
    181 result = IterativeSolverFactory<Domain, Range>::instance().create(type, op, sp, prec, config);
    \n-
    182 return result;
    \n-
    183 }
    \n-
    \n-
    184
    \n-
    \n-
    188 static std::shared_ptr<Preconditioner> getPreconditioner(std::shared_ptr<Operator> op,
    \n-
    189 const ParameterTree& config){
    \n-
    190 const matrix_type* mat = getmat(op);
    \n-
    191 if(mat){
    \n-
    192 std::string prec_type = config.get<std::string>("type");
    \n-
    193 return PreconditionerFactory<Operator, Domain, Range>::instance().create(prec_type, op, config);
    \n-
    194 }else{
    \n-
    195 DUNE_THROW(InvalidStateException, "Could not obtain matrix from operator. Please pass in an AssembledLinearOperator.");
    \n-
    196 }
    \n-
    197 }
    \n-
    \n-
    198 };
    \n-
    \n+\n+
    48
    \n+\n+
    53 };
    \n+
    \n+
    54
    \n+
    55
    \n+
    56
    \n+
    61 template<class M>
    \n+
    \n+\n+
    63 {
    \n+
    64 public:
    \n+
    70 SparsityBuilder(M& matrix);
    \n+
    71
    \n+
    72 void insert(const typename M::size_type& index);
    \n+
    73
    \n+
    74 void operator++();
    \n+
    75
    \n+
    76 std::size_t minRowSize();
    \n+
    77
    \n+
    78 std::size_t maxRowSize();
    \n+
    79
    \n+
    80 std::size_t sumRowSize();
    \n+
    \n+
    81 std::size_t index()
    \n+
    82 {
    \n+
    83 return row_.index();
    \n+
    84 }
    \n+
    \n+
    85 private:
    \n+
    87 typename M::CreateIterator row_;
    \n+
    89 std::size_t minRowSize_;
    \n+
    91 std::size_t maxRowSize_;
    \n+
    92 std::size_t sumRowSize_;
    \n+
    93#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    94 bool diagonalInserted;
    \n+
    95#endif
    \n+
    96 };
    \n+
    \n+
    97
    \n+
    \n+\n+
    99 {
    \n+
    100 public:
    \n+
    109 template<class M, class V, class I, class O>
    \n+
    110 void calculate(const M& fine, const AggregatesMap<V>& aggregates, M& coarse,
    \n+
    111 const I& pinfo, const O& copy);
    \n+
    112
    \n+
    113 };
    \n+
    \n+
    114
    \n+
    115 template<class T>
    \n+
    \n+\n+
    117 : public BaseGalerkinProduct
    \n+
    118 {
    \n+
    119 public:
    \n+\n+
    121
    \n+
    131 template<class G, class V, class Set>
    \n+
    132 typename G::MutableMatrix* build(G& fineGraph, V& visitedMap,
    \n+
    133 const ParallelInformation& pinfo,
    \n+\n+
    135 const typename G::Matrix::size_type& size,
    \n+
    136 const Set& copy);
    \n+
    137 private:
    \n+
    138
    \n+
    145 template<class G, class I, class Set>
    \n+\n+
    147 buildOverlapVertices(const G& graph, const I& pinfo,
    \n+\n+
    149 const Set& overlap,
    \n+
    150 std::size_t& overlapCount);
    \n+
    151
    \n+
    152 template<class A>
    \n+
    153 struct OVLess
    \n+
    154 {
    \n+
    \n+\n+
    156 {
    \n+
    157 return *o1.aggregate < *o2.aggregate;
    \n+
    158 }
    \n+
    \n+
    159 };
    \n+
    160 };
    \n+
    \n+
    161
    \n+
    162 template<>
    \n+
    \n+\n+
    164 : public BaseGalerkinProduct
    \n+
    165 {
    \n+
    166 public:
    \n+
    176 template<class G, class V, class Set>
    \n+
    177 typename G::MutableMatrix* build(G& fineGraph, V& visitedMap,
    \n+
    178 const SequentialInformation& pinfo,
    \n+\n+
    180 const typename G::Matrix::size_type& size,
    \n+
    181 const Set& copy);
    \n+
    182 };
    \n+
    \n+
    183
    \n+
    \n+\n+
    185 {
    \n+
    186 template<class R, class G, class V>
    \n+
    187 static void constructOverlapConnectivity(R& row, G& graph, V& visitedMap,
    \n+\n+\n+\n+
    191
    \n+
    195 template<class R, class G, class V>
    \n+
    196 static void constructNonOverlapConnectivity(R& row, G& graph, V& visitedMap,
    \n+\n+
    198 const typename G::VertexDescriptor& seed);
    \n
    199
    \n-
    210 template<class Operator>
    \n-
    211 std::shared_ptr<InverseOperator<typename Operator::domain_type,
    \n-
    \n-
    212 typename Operator::range_type>> getSolverFromFactory(std::shared_ptr<Operator> op,
    \n-
    213 const ParameterTree& config,
    \n-
    214 std::shared_ptr<Preconditioner<typename Operator::domain_type,
    \n-
    215 typename Operator::range_type>> prec = nullptr){
    \n-
    216 return SolverFactory<Operator>::get(op, config, prec);
    \n-
    217 }
    \n-
    \n-
    218
    \n-
    222} // end namespace Dune
    \n-
    223
    \n-
    224
    \n-
    225#endif
    \n-\n-\n-\n-
    Define general, extensible interface for inverse operators.
    \n-
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n-
    Singleton< ParameterizedObjectFactory< PreconditionerSignature< M, X, Y > > > PreconditionerFactory
    Definition solverfactory.hh:36
    \n-
    Singleton< ParameterizedObjectFactory< DirectSolverSignature< M, X, Y > > > DirectSolverFactory
    Definition solverfactory.hh:30
    \n-
    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
    \n-
    std::shared_ptr< Preconditioner > wrapPreconditioner4Parallel(const std::shared_ptr< Preconditioner > &prec, const O &)
    Definition solverfactory.hh:71
    \n-
    std::shared_ptr< InverseOperator< X, Y > >(const M &, const ParameterTree &) DirectSolverSignature
    Definition solverfactory.hh:28
    \n-
    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:212
    \n-
    Singleton< ParameterizedObjectFactory< IterativeSolverSignature< X, Y > > > IterativeSolverFactory
    Definition solverfactory.hh:42
    \n-
    std::shared_ptr< Preconditioner< X, Y > >(const std::shared_ptr< M > &, const ParameterTree &) PreconditionerSignature
    Definition solverfactory.hh:34
    \n+
    200
    \n+
    204 template<class G, class S, class V>
    \n+
    \n+\n+
    206 {
    \n+
    207 public:
    \n+
    211 typedef G Graph;
    \n+
    215 typedef typename Graph::ConstEdgeIterator ConstEdgeIterator;
    \n+
    216
    \n+
    220 typedef S Set;
    \n+
    221
    \n+
    225 typedef V VisitedMap;
    \n+
    226
    \n+
    230 typedef typename Graph::VertexDescriptor Vertex;
    \n+
    231
    \n+
    239 ConnectedBuilder(const AggregatesMap<Vertex>& aggregates, Graph& graph,
    \n+
    240 VisitedMap& visitedMap, Set& connected);
    \n+
    241
    \n+
    246 void operator()(const ConstEdgeIterator& edge);
    \n+
    247
    \n+
    248 private:
    \n+
    252 const AggregatesMap<Vertex>& aggregates_;
    \n+
    253
    \n+
    254 Graph& graph_;
    \n+
    255
    \n+
    259 VisitedMap& visitedMap_;
    \n+
    260
    \n+
    264 Set& connected_;
    \n+
    265 };
    \n+
    \n+
    266
    \n+
    267 };
    \n+
    \n+
    268
    \n+
    269 template<class G, class T>
    \n+
    \n+\n+
    271 {
    \n+
    272 typedef typename G::VertexDescriptor Vertex;
    \n+
    273
    \n+
    274 template<class V, class O, class R>
    \n+
    275 static void examine(G& graph,
    \n+
    276 V& visitedMap,
    \n+
    277 const T& pinfo,
    \n+
    278 const AggregatesMap<Vertex>& aggregates,
    \n+
    279 const O& overlap,
    \n+
    280 const OverlapVertex<Vertex>* overlapVertices,
    \n+
    281 const OverlapVertex<Vertex>* overlapEnd,
    \n+
    282 R& row);
    \n+
    283 };
    \n+
    \n+
    284
    \n+
    285 template<class G>
    \n+
    \n+\n+
    287 {
    \n+
    288 typedef typename G::VertexDescriptor Vertex;
    \n+
    289
    \n+
    290 template<class V, class R>
    \n+
    291 static void examine(G& graph,
    \n+
    292 V& visitedMap,
    \n+
    293 const SequentialInformation& pinfo,
    \n+
    294 const AggregatesMap<Vertex>& aggregates,
    \n+
    295 R& row);
    \n+
    296 };
    \n+
    \n+
    297
    \n+
    298 template<class T>
    \n+
    \n+\n+
    300 {
    \n+
    301 template<class M, class O>
    \n+
    302 static void set(M& coarse, const T& pinfo, const O& copy);
    \n+
    303 };
    \n+
    \n+
    304
    \n+
    305 template<>
    \n+
    \n+\n+
    307 {
    \n+
    308 template<class M, class O>
    \n+
    309 static void set(M& coarse, const SequentialInformation& pinfo, const O& copy);
    \n+
    310 };
    \n+
    \n+
    311
    \n+
    312 template<class R, class G, class V>
    \n+
    \n+\n+\n+
    315 const typename G::VertexDescriptor& seed)
    \n+
    316 {
    \n+
    317 assert(row.index()==aggregates[seed]);
    \n+
    318 row.insert(aggregates[seed]);
    \n+
    319 ConnectedBuilder<G,R,V> conBuilder(aggregates, graph, visitedMap, row);
    \n+
    320 typedef typename G::VertexDescriptor Vertex;
    \n+
    321 typedef std::allocator<Vertex> Allocator;
    \n+
    322 typedef SLList<Vertex,Allocator> VertexList;
    \n+
    323 typedef typename AggregatesMap<Vertex>::DummyEdgeVisitor DummyVisitor;
    \n+
    324 VertexList vlist;
    \n+
    325 DummyVisitor dummy;
    \n+
    326 aggregates.template breadthFirstSearch<true,false>(seed,aggregates[seed], graph, vlist, dummy,
    \n+
    327 conBuilder, visitedMap);
    \n+
    328 }
    \n+
    \n+
    329
    \n+
    330 template<class R, class G, class V>
    \n+
    \n+\n+\n+\n+\n+
    335 {
    \n+
    336 ConnectedBuilder<G,R,V> conBuilder(aggregates, graph, visitedMap, row);
    \n+
    337 const typename G::VertexDescriptor aggregate=*seed->aggregate;
    \n+
    338
    \n+
    339 if (row.index()==*seed->aggregate) {
    \n+
    340 while(seed != overlapEnd && aggregate == *seed->aggregate) {
    \n+
    341 row.insert(*seed->aggregate);
    \n+
    342 // Walk over all neighbours and add them to the connected array.
    \n+
    343 visitNeighbours(graph, seed->vertex, conBuilder);
    \n+
    344 // Mark vertex as visited
    \n+
    345 put(visitedMap, seed->vertex, true);
    \n+
    346 ++seed;
    \n+
    347 }
    \n+
    348 }
    \n+
    349 }
    \n+
    \n+
    350
    \n+
    351 template<class G, class S, class V>
    \n+
    \n+\n+
    353 Graph& graph, VisitedMap& visitedMap,
    \n+
    354 Set& connected)
    \n+
    355 : aggregates_(aggregates), graph_(graph), visitedMap_(visitedMap), connected_(connected)
    \n+
    356 {}
    \n+
    \n+
    357
    \n+
    358 template<class G, class S, class V>
    \n+
    \n+\n+
    360 {
    \n+
    361 const Vertex& vertex = aggregates_[edge.target()];
    \n+\n+\n+
    364 connected_.insert(vertex);
    \n+
    365 }
    \n+
    \n+
    366
    \n+
    367 template<class T>
    \n+
    368 template<class G, class I, class Set>
    \n+\n+
    370 GalerkinProduct<T>::buildOverlapVertices(const G& graph, const I& pinfo,
    \n+\n+
    372 const Set& overlap,
    \n+
    373 std::size_t& overlapCount)
    \n+
    374 {
    \n+
    375 // count the overlap vertices.
    \n+
    376 typedef typename G::ConstVertexIterator ConstIterator;
    \n+
    377 typedef typename I::GlobalLookupIndexSet GlobalLookup;
    \n+
    378 typedef typename GlobalLookup::IndexPair IndexPair;
    \n+
    379
    \n+
    380 const ConstIterator end = graph.end();
    \n+
    381 overlapCount = 0;
    \n+
    382
    \n+
    383 const GlobalLookup& lookup=pinfo.globalLookup();
    \n+
    384
    \n+
    385 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {
    \n+
    386 const IndexPair* pair = lookup.pair(*vertex);
    \n+
    387
    \n+
    388 if(pair!=0 && overlap.contains(pair->local().attribute()))
    \n+
    389 ++overlapCount;
    \n+
    390 }
    \n+
    391 // Allocate space
    \n+
    392 typedef typename G::VertexDescriptor Vertex;
    \n+
    393
    \n+
    394 OverlapVertex<Vertex>* overlapVertices = new OverlapVertex<Vertex>[overlapCount=0 ? 1 : overlapCount];
    \n+
    395 if(overlapCount==0)
    \n+
    396 return overlapVertices;
    \n+
    397
    \n+
    398 // Initialize them
    \n+
    399 overlapCount=0;
    \n+
    400 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {
    \n+
    401 const IndexPair* pair = lookup.pair(*vertex);
    \n+
    402
    \n+
    403 if(pair!=0 && overlap.contains(pair->local().attribute())) {
    \n+
    404 overlapVertices[overlapCount].aggregate = &aggregates[pair->local()];
    \n+
    405 overlapVertices[overlapCount].vertex = pair->local();
    \n+
    406 ++overlapCount;
    \n+
    407 }
    \n+
    408 }
    \n+
    409
    \n+
    410 dverb << overlapCount<<" overlap vertices"<<std::endl;
    \n+
    411
    \n+
    412 std::sort(overlapVertices, overlapVertices+overlapCount, OVLess<Vertex>());
    \n+
    413 // due to the sorting the isolated aggregates (to be skipped) are at the end.
    \n+
    414
    \n+
    415 return overlapVertices;
    \n+
    416 }
    \n+
    417
    \n+
    418 template<class G, class T>
    \n+
    419 template<class V, class O, class R>
    \n+
    \n+\n+
    421 V& visitedMap,
    \n+
    422 const T& pinfo,
    \n+
    423 const AggregatesMap<Vertex>& aggregates,
    \n+
    424 const O& overlap,
    \n+
    425 const OverlapVertex<Vertex>* overlapVertices,
    \n+
    426 const OverlapVertex<Vertex>* overlapEnd,
    \n+
    427 R& row)
    \n+
    428 {
    \n+
    429 typedef typename T::GlobalLookupIndexSet GlobalLookup;
    \n+
    430 const GlobalLookup& lookup = pinfo.globalLookup();
    \n+
    431
    \n+
    432 typedef typename G::VertexIterator VertexIterator;
    \n+
    433
    \n+
    434 VertexIterator vend=graph.end();
    \n+
    435
    \n+
    436#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    437 std::set<Vertex> examined;
    \n+
    438#endif
    \n+
    439
    \n+
    440 // The aggregates owned by the process have lower local indices
    \n+
    441 // then those not owned. We process them in the first pass.
    \n+
    442 // They represent the rows 0, 1, ..., n of the coarse matrix
    \n+
    443 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex)
    \n+
    444 if(!get(visitedMap, *vertex)) {
    \n+
    445 // In the first pass we only process owner nodes
    \n+
    446 typedef typename GlobalLookup::IndexPair IndexPair;
    \n+
    447 const IndexPair* pair = lookup.pair(*vertex);
    \n+
    448 if(pair==0 || !overlap.contains(pair->local().attribute())) {
    \n+
    449#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    450 assert(examined.find(aggregates[*vertex])==examined.end());
    \n+
    451 examined.insert(aggregates[*vertex]);
    \n+
    452#endif
    \n+
    453 constructNonOverlapConnectivity(row, graph, visitedMap, aggregates, *vertex);
    \n+
    454
    \n+
    455 // only needed for ALU
    \n+
    456 // (ghosts with same global id as owners on the same process)
    \n+
    457 if (SolverCategory::category(pinfo) == static_cast<int>(SolverCategory::nonoverlapping)) {
    \n+
    458 if(overlapVertices != overlapEnd) {
    \n+
    459 if(*overlapVertices->aggregate!=AggregatesMap<Vertex>::ISOLATED) {
    \n+
    460 constructOverlapConnectivity(row, graph, visitedMap, aggregates, overlapVertices, overlapEnd);
    \n+
    461 }
    \n+
    462 else{
    \n+
    463 ++overlapVertices;
    \n+
    464 }
    \n+
    465 }
    \n+
    466 }
    \n+
    467 ++row;
    \n+
    468 }
    \n+
    469 }
    \n+
    470
    \n+
    471 dvverb<<"constructed "<<row.index()<<" non-overlapping rows"<<std::endl;
    \n+
    472
    \n+
    473 // Now come the aggregates not owned by use.
    \n+
    474 // They represent the rows n+1, ..., N
    \n+
    475 while(overlapVertices != overlapEnd)
    \n+
    476 if(*overlapVertices->aggregate!=AggregatesMap<Vertex>::ISOLATED) {
    \n+
    477
    \n+
    478#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    479 typedef typename GlobalLookup::IndexPair IndexPair;
    \n+
    480 const IndexPair* pair = lookup.pair(overlapVertices->vertex);
    \n+
    481 assert(pair!=0 && overlap.contains(pair->local().attribute()));
    \n+
    482 assert(examined.find(aggregates[overlapVertices->vertex])==examined.end());
    \n+
    483 examined.insert(aggregates[overlapVertices->vertex]);
    \n+
    484#endif
    \n+
    485 constructOverlapConnectivity(row, graph, visitedMap, aggregates, overlapVertices, overlapEnd);
    \n+
    486 ++row;
    \n+
    487 }else{
    \n+
    488 ++overlapVertices;
    \n+
    489 }
    \n+
    490 }
    \n+
    \n+
    491
    \n+
    492 template<class G>
    \n+
    493 template<class V, class R>
    \n+
    \n+\n+
    495 V& visitedMap,
    \n+
    496 [[maybe_unused]] const SequentialInformation& pinfo,
    \n+
    497 const AggregatesMap<Vertex>& aggregates,
    \n+
    498 R& row)
    \n+
    499 {
    \n+
    500 typedef typename G::VertexIterator VertexIterator;
    \n+
    501
    \n+
    502 VertexIterator vend=graph.end();
    \n+
    503 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex) {
    \n+
    504 if(!get(visitedMap, *vertex)) {
    \n+
    505 constructNonOverlapConnectivity(row, graph, visitedMap, aggregates, *vertex);
    \n+
    506 ++row;
    \n+
    507 }
    \n+
    508 }
    \n+
    509
    \n+
    510 }
    \n+
    \n+
    511
    \n+
    512 template<class M>
    \n+
    \n+\n+
    514 : row_(matrix.createbegin()),
    \n+
    515 minRowSize_(std::numeric_limits<std::size_t>::max()),
    \n+
    516 maxRowSize_(0), sumRowSize_(0)
    \n+
    517 {
    \n+
    518#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    519 diagonalInserted = false;
    \n+
    520#endif
    \n+
    521 }
    \n+
    \n+
    522 template<class M>
    \n+
    \n+\n+
    524 {
    \n+
    525 return maxRowSize_;
    \n+
    526 }
    \n+
    \n+
    527 template<class M>
    \n+
    \n+\n+
    529 {
    \n+
    530 return minRowSize_;
    \n+
    531 }
    \n+
    \n+
    532
    \n+
    533 template<class M>
    \n+
    \n+\n+
    535 {
    \n+
    536 return sumRowSize_;
    \n+
    537 }
    \n+
    \n+
    538 template<class M>
    \n+
    \n+\n+
    540 {
    \n+
    541 sumRowSize_ += row_.size();
    \n+
    542 minRowSize_=std::min(minRowSize_, row_.size());
    \n+
    543 maxRowSize_=std::max(maxRowSize_, row_.size());
    \n+
    544 ++row_;
    \n+
    545#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    546 assert(diagonalInserted);
    \n+
    547 diagonalInserted = false;
    \n+
    548#endif
    \n+
    549 }
    \n+
    \n+
    550
    \n+
    551 template<class M>
    \n+
    \n+
    552 void SparsityBuilder<M>::insert(const typename M::size_type& index)
    \n+
    553 {
    \n+
    554 row_.insert(index);
    \n+
    555#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    556 diagonalInserted = diagonalInserted || row_.index()==index;
    \n+
    557#endif
    \n+
    558 }
    \n+
    \n+
    559
    \n+
    560 template<class T>
    \n+
    561 template<class G, class V, class Set>
    \n+
    562 typename G::MutableMatrix*
    \n+
    \n+
    563 GalerkinProduct<T>::build(G& fineGraph, V& visitedMap,
    \n+
    564 const ParallelInformation& pinfo,
    \n+\n+
    566 const typename G::Matrix::size_type& size,
    \n+
    567 const Set& overlap)
    \n+
    568 {
    \n+\n+
    570
    \n+
    571 std::size_t count;
    \n+
    572
    \n+
    573 const OverlapVertex* overlapVertices = buildOverlapVertices(fineGraph,
    \n+
    574 pinfo,
    \n+
    575 aggregates,
    \n+
    576 overlap,
    \n+
    577 count);
    \n+
    578 typedef typename G::MutableMatrix M;
    \n+
    579 M* coarseMatrix = new M(size, size, M::row_wise);
    \n+
    580
    \n+
    581 // Reset the visited flags of all vertices.
    \n+
    582 // As the isolated nodes will be skipped we simply mark them as visited
    \n+
    583
    \n+
    584 typedef typename G::VertexIterator Vertex;
    \n+
    585 Vertex vend = fineGraph.end();
    \n+
    586 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {
    \n+\n+
    588 put(visitedMap, *vertex, aggregates[*vertex]==AggregatesMap<typename G::VertexDescriptor>::ISOLATED);
    \n+
    589 }
    \n+
    590
    \n+
    591 typedef typename G::MutableMatrix M;
    \n+
    592 SparsityBuilder<M> sparsityBuilder(*coarseMatrix);
    \n+
    593
    \n+
    594 ConnectivityConstructor<G,T>::examine(fineGraph, visitedMap, pinfo,
    \n+
    595 aggregates, overlap,
    \n+
    596 overlapVertices,
    \n+
    597 overlapVertices+count,
    \n+
    598 sparsityBuilder);
    \n+
    599
    \n+
    600 dinfo<<pinfo.communicator().rank()<<": Matrix ("<<coarseMatrix->N()<<"x"<<coarseMatrix->M()<<" row: min="<<sparsityBuilder.minRowSize()<<" max="
    \n+
    601 <<sparsityBuilder.maxRowSize()<<" avg="
    \n+
    602 <<static_cast<double>(sparsityBuilder.sumRowSize())/coarseMatrix->N()
    \n+
    603 <<std::endl;
    \n+
    604
    \n+
    605 delete[] overlapVertices;
    \n+
    606
    \n+
    607 return coarseMatrix;
    \n+
    608 }
    \n+
    \n+
    609
    \n+
    610 template<class G, class V, class Set>
    \n+
    611 typename G::MutableMatrix*
    \n+
    \n+\n+
    613 const SequentialInformation& pinfo,
    \n+\n+
    615 const typename G::Matrix::size_type& size,
    \n+
    616 [[maybe_unused]] const Set& overlap)
    \n+
    617 {
    \n+
    618 typedef typename G::MutableMatrix M;
    \n+
    619 M* coarseMatrix = new M(size, size, M::row_wise);
    \n+
    620
    \n+
    621 // Reset the visited flags of all vertices.
    \n+
    622 // As the isolated nodes will be skipped we simply mark them as visited
    \n+
    623
    \n+
    624 typedef typename G::VertexIterator Vertex;
    \n+
    625 Vertex vend = fineGraph.end();
    \n+
    626 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {
    \n+\n+
    628 put(visitedMap, *vertex, aggregates[*vertex]==AggregatesMap<typename G::VertexDescriptor>::ISOLATED);
    \n+
    629 }
    \n+
    630
    \n+
    631 SparsityBuilder<M> sparsityBuilder(*coarseMatrix);
    \n+
    632
    \n+\n+
    634 aggregates, sparsityBuilder);
    \n+
    635 dinfo<<"Matrix row: min="<<sparsityBuilder.minRowSize()<<" max="
    \n+
    636 <<sparsityBuilder.maxRowSize()<<" average="
    \n+
    637 <<static_cast<double>(sparsityBuilder.sumRowSize())/coarseMatrix->N()<<std::endl;
    \n+
    638 return coarseMatrix;
    \n+
    639 }
    \n+
    \n+
    640
    \n+
    641 template<class M, class V, class P, class O>
    \n+
    \n+
    642 void BaseGalerkinProduct::calculate(const M& fine, const AggregatesMap<V>& aggregates, M& coarse,
    \n+
    643 const P& pinfo, [[maybe_unused]] const O& copy)
    \n+
    644 {
    \n+
    645 coarse = static_cast<typename M::field_type>(0);
    \n+
    646
    \n+
    647 typedef typename M::ConstIterator RowIterator;
    \n+
    648 RowIterator endRow = fine.end();
    \n+
    649
    \n+
    650 for(RowIterator row = fine.begin(); row != endRow; ++row)
    \n+
    651 if(aggregates[row.index()] != AggregatesMap<V>::ISOLATED) {
    \n+
    652 assert(aggregates[row.index()]!=AggregatesMap<V>::UNAGGREGATED);
    \n+
    653 typedef typename M::ConstColIterator ColIterator;
    \n+
    654 ColIterator endCol = row->end();
    \n+
    655
    \n+
    656 for(ColIterator col = row->begin(); col != endCol; ++col)
    \n+
    657 if(aggregates[col.index()] != AggregatesMap<V>::ISOLATED) {
    \n+
    658 assert(aggregates[row.index()]!=AggregatesMap<V>::UNAGGREGATED);
    \n+
    659 coarse[aggregates[row.index()]][aggregates[col.index()]]+=*col;
    \n+
    660 }
    \n+
    661 }
    \n+
    662
    \n+
    663 // get the right diagonal matrix values on copy lines from owner processes
    \n+
    664 typedef typename M::block_type BlockType;
    \n+
    665 std::vector<BlockType> rowsize(coarse.N(),BlockType(0));
    \n+
    666 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)
    \n+
    667 rowsize[row.index()]=coarse[row.index()][row.index()];
    \n+
    668 pinfo.copyOwnerToAll(rowsize,rowsize);
    \n+
    669 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)
    \n+
    670 coarse[row.index()][row.index()] = rowsize[row.index()];
    \n+
    671
    \n+
    672 // don't set dirichlet boundaries for copy lines to make novlp case work,
    \n+
    673 // the preconditioner yields slightly different results now.
    \n+
    674
    \n+
    675 // Set the dirichlet border
    \n+
    676 //DirichletBoundarySetter<P>::template set<M>(coarse, pinfo, copy);
    \n+
    677
    \n+
    678 }
    \n+
    \n+
    679
    \n+
    680 template<class T>
    \n+
    681 template<class M, class O>
    \n+
    \n+
    682 void DirichletBoundarySetter<T>::set(M& coarse, const T& pinfo, const O& copy)
    \n+
    683 {
    \n+
    684 typedef typename T::ParallelIndexSet::const_iterator ConstIterator;
    \n+
    685 ConstIterator end = pinfo.indexSet().end();
    \n+
    686 typedef typename M::block_type Block;
    \n+
    687 Block identity=Block(0.0);
    \n+
    688 for(typename Block::RowIterator b=identity.begin(); b != identity.end(); ++b)
    \n+
    689 b->operator[](b.index())=1.0;
    \n+
    690
    \n+
    691 for(ConstIterator index = pinfo.indexSet().begin();
    \n+
    692 index != end; ++index) {
    \n+
    693 if(copy.contains(index->local().attribute())) {
    \n+
    694 typedef typename M::ColIterator ColIterator;
    \n+
    695 typedef typename M::row_type Row;
    \n+
    696 Row row = coarse[index->local()];
    \n+
    697 ColIterator cend = row.find(index->local());
    \n+
    698 ColIterator col = row.begin();
    \n+
    699 for(; col != cend; ++col)
    \n+
    700 *col = 0;
    \n+
    701
    \n+
    702 cend = row.end();
    \n+
    703
    \n+
    704 assert(col != cend); // There should be a diagonal entry
    \n+
    705 *col = identity;
    \n+
    706
    \n+
    707 for(++col; col != cend; ++col)
    \n+
    708 *col = 0;
    \n+
    709 }
    \n+
    710 }
    \n+
    711 }
    \n+
    \n+
    712
    \n+
    713 template<class M, class O>
    \n+
    \n+\n+
    715 const SequentialInformation& pinfo,
    \n+
    716 const O& overlap)
    \n+
    717 {}
    \n+
    \n+
    718
    \n+
    719 } // namespace Amg
    \n+
    720} // namespace Dune
    \n+
    721#endif
    \n+
    Provides classes for the Coloring process of AMG.
    \n+\n+
    Col col
    Definition matrixmatrix.hh:351
    \n+
    bool operator()(const OverlapVertex< A > &o1, const OverlapVertex< A > &o2)
    Definition galerkin.hh:155
    \n+
    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
    \n+
    G Graph
    The type of the graph.
    Definition galerkin.hh:211
    \n+
    void operator++()
    Definition galerkin.hh:539
    \n+
    void operator()(const ConstEdgeIterator &edge)
    Process an edge pointing to another aggregate.
    Definition galerkin.hh:359
    \n+
    void insert(const typename M::size_type &index)
    Definition galerkin.hh:552
    \n+
    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
    \n+
    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
    \n+
    std::size_t index()
    Definition galerkin.hh:81
    \n+
    T ParallelInformation
    Definition galerkin.hh:120
    \n+
    G::VertexDescriptor Vertex
    Definition galerkin.hh:272
    \n+
    T Aggregate
    The aggregate descriptor.
    Definition galerkin.hh:37
    \n+
    SparsityBuilder(M &matrix)
    Constructor.
    Definition galerkin.hh:513
    \n+
    ConnectedBuilder(const AggregatesMap< Vertex > &aggregates, Graph &graph, VisitedMap &visitedMap, Set &connected)
    Constructor.
    Definition galerkin.hh:352
    \n+
    Graph::ConstEdgeIterator ConstEdgeIterator
    The constant edge iterator.
    Definition galerkin.hh:215
    \n+
    T Vertex
    The vertex descriptor.
    Definition galerkin.hh:42
    \n+
    G::VertexDescriptor Vertex
    Definition galerkin.hh:288
    \n+
    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
    \n+
    V VisitedMap
    The type of the map for marking vertices as visited.
    Definition galerkin.hh:225
    \n+
    int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
    Visit all neighbour vertices of a vertex in a graph.
    \n+
    S Set
    The type of the connected set.
    Definition galerkin.hh:220
    \n+
    Aggregate * aggregate
    The aggregate the vertex belongs to.
    Definition galerkin.hh:47
    \n+
    std::size_t sumRowSize()
    Definition galerkin.hh:534
    \n+
    Vertex vertex
    The vertex descriptor.
    Definition galerkin.hh:52
    \n+
    std::size_t minRowSize()
    Definition galerkin.hh:528
    \n+
    static void set(M &coarse, const T &pinfo, const O &copy)
    Definition galerkin.hh:682
    \n+
    Graph::VertexDescriptor Vertex
    The vertex descriptor of the graph.
    Definition galerkin.hh:230
    \n+
    void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
    Calculate the galerkin product.
    \n+
    std::size_t maxRowSize()
    Definition galerkin.hh:523
    \n+
    STL namespace.
    \n
    Definition allocator.hh:11
    \n-
    std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, SolverCategory::Category category)
    Definition scalarproducts.hh:242
    \n-
    A nonoverlapping operator with communication object.
    Definition novlpschwarz.hh:61
    \n-
    Adapter to turn a matrix into a linear operator.
    Definition operators.hh:136
    \n-
    An overlapping Schwarz operator.
    Definition schwarz.hh:75
    \n-
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n-\n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n-
    Factory to assembly solvers configured by a ParameterTree.
    Definition solverfactory.hh:130
    \n-
    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:153
    \n-
    static std::shared_ptr< Preconditioner > getPreconditioner(std::shared_ptr< Operator > op, const ParameterTree &config)
    Construct a Preconditioner for a given Operator.
    Definition solverfactory.hh:188
    \n+
    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
    \n+
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n+
    A Dummy visitor that does nothing for each visited edge.
    Definition aggregates.hh:598
    \n+
    Definition galerkin.hh:33
    \n+
    Functor for building the sparsity pattern of the matrix using examineConnectivity.
    Definition galerkin.hh:63
    \n+
    Definition galerkin.hh:99
    \n+
    Definition galerkin.hh:118
    \n+
    Definition galerkin.hh:185
    \n+
    Visitor for identifying connected aggregates during a breadthFirstSearch.
    Definition galerkin.hh:206
    \n+
    Definition galerkin.hh:271
    \n+
    Definition galerkin.hh:300
    \n+
    Definition pinfo.hh:28
    \n+
    @ nonoverlapping
    Category for non-overlapping solvers.
    Definition solvercategory.hh:27
    \n+
    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
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,298 +1,816 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-solverfactory.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+galerkin.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5\n-6#ifndef DUNE_ISTL_SOLVERFACTORY_HH\n-7#define DUNE_ISTL_SOLVERFACTORY_HH\n-8\n-9#include \n-10#include \n-11#include \n-12\n-13#include \n-14#include \n+5#ifndef DUNE_GALERKIN_HH\n+6#define DUNE_GALERKIN_HH\n+7\n+8#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n+9#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n 15\n-16#include \"_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh\"\n-17#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n-20\n-21namespace _\bD_\bu_\bn_\be{\n-26 // Direct solver factory:\n-27 template\n-_\b2_\b8 using _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr>(const\n-M&, const ParameterTree&);\n-29 template\n-_\b3_\b0 using _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by =\n-Singleton>>;\n-31\n-32 // Preconditioner factory:\n-33 template\n-_\b3_\b4 using _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr>(const\n-std::shared_ptr&, const ParameterTree&);\n-35 template\n-_\b3_\b6 using _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by =\n-Singleton>>;\n-37\n-38 // Iterative solver factory\n-39 template\n-_\b4_\b0 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be = std::shared_ptr>(const\n-std::shared_ptr>&, const std::\n-shared_ptr>&, const std::shared_ptr>,\n-const ParameterTree&);\n-41 template\n-_\b4_\b2 using _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by =\n-Singleton>>;\n+16namespace _\bD_\bu_\bn_\be\n+17{\n+18 namespace Amg\n+19 {\n+31 template\n+_\b3_\b2 struct _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx\n+33 {\n+_\b3_\b7 typedef T _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be;\n+38\n+_\b4_\b2 typedef T _\bV_\be_\br_\bt_\be_\bx;\n 43\n-44 // initSolverFactories differs in different compilation units, so we have it\n-45 // in an anonymous namespace\n-46 namespace {\n-47\n-53 template\n-54 int initSolverFactories(){\n-55 using M = typename O::matrix_type;\n-56 using X = typename O::range_type;\n-57 using Y = typename O::domain_type;\n-58 using TL = Dune::TypeList;\n-59 auto& dsfac=_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bM_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be();\n-60 addRegistryToFactory(dsfac, DirectSolverTag{});\n-61 auto& pfac=_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bO_\b,_\bX_\b,_\bY_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be();\n-62 addRegistryToFactory(pfac, PreconditionerTag{});\n-63 using TLS = Dune::TypeList;\n-64 auto& isfac=_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bX_\b,_\bY_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be();\n-65 return addRegistryToFactory(isfac, IterativeSolverTag{});\n-66 }\n-67 } // end anonymous namespace\n-68\n-69\n-70 template\n-_\b7_\b1 std::shared_ptr _\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl(const std::\n-shared_ptr& prec,\n-72 const O&)\n-73 {\n-74 return prec;\n-75 }\n-76\n-77 template\n-78 std::shared_ptr\n-_\b7_\b9 _\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl(const std::shared_ptr& prec,\n-80 const std::shared_ptr<_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b> >& op)\n-81 {\n-82 return std::make_shared >(prec,\n-op->getCommunication());\n-83 }\n-84\n-85 template\n-86 std::shared_ptr\n-_\b8_\b7 _\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl(const std::shared_ptr& prec,\n-88 const std::shared_ptr<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b> >& op)\n-89 {\n-90 return std::make_shared\n->(prec, op->getCommunication());\n-91 }\n-92\n-93 template\n-_\b9_\b4 std::shared_ptr> _\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(const std::\n-shared_ptr<_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b> >&)\n-95 {\n-96 return std::make_shared>();\n-97 }\n-98 template\n-_\b9_\b9 std::shared_ptr> _\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(const std::\n-shared_ptr<_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b> >& op)\n-100 {\n-101 return createScalarProduct(op->getCommunication(), op->category());\n-102 }\n-103\n-104 template\n-_\b1_\b0_\b5 std::shared_ptr> _\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(const std::\n-shared_ptr<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b> >& op)\n-106 {\n-107 return createScalarProduct(op->getCommunication(), op->category());\n-108 }\n-109\n-129 template\n-_\b1_\b3_\b0 class _\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by {\n-131 using Domain = typename Operator::domain_type;\n-132 using Range = typename Operator::range_type;\n-133 using _\bS_\bo_\bl_\bv_\be_\br = _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bR_\ba_\bn_\bg_\be_\b>;\n-134 using _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br = _\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>;\n-135\n-136 template\n-137 using _matrix_type = typename O::matrix_type;\n-138 using matrix_type = Std::detected_or_t;\n-139 static constexpr bool isAssembled = !std::is_same::value;\n-140\n-141 static const matrix_type* getmat(std::shared_ptr op){\n-142 std::shared_ptr> aop\n-143 = std::dynamic_pointer_cast>(op);\n-144 if(aop)\n-145 return &aop->getmat();\n-146 return nullptr;\n-147 }\n-148\n-149 public:\n-150\n-_\b1_\b5_\b3 static std::shared_ptr _\bg_\be_\bt(std::shared_ptr op,\n-154 const ParameterTree& config,\n-155 std::shared_ptr prec = nullptr){\n-156 std::string type = config.get(\"type\");\n-157 std::shared_ptr result;\n-158 const matrix_type* _\bm_\ba_\bt = getmat(op);\n-159 if(_\bm_\ba_\bt){\n-160 if (_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b,_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().contains\n-(type)) {\n-161 if(op->category()!=_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl){\n-162 DUNE_THROW(NotImplemented, \"The solver factory does not support parallel\n-direct solvers!\");\n-163 }\n-164 result = _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b,_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().create\n-(type, *_\bm_\ba_\bt, config);\n-165 return result;\n-166 }\n-167 }\n-168 // if no direct solver is found it might be an iterative solver\n-169 if (!_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().contains(type)) {\n-170 DUNE_THROW(Dune::InvalidStateException, \"Solver not found in the\n-factory.\");\n-171 }\n-172 if(!prec){\n-173 const ParameterTree& precConfig = config.sub(\"preconditioner\");\n-174 std::string prec_type = precConfig.get(\"type\");\n-175 prec = _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().create\n-(prec_type, op, precConfig);\n-176 if (prec->category() != op->category() && prec->category() ==\n-_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl)\n-177 // try to wrap to a parallel preconditioner\n-178 prec = _\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl(prec, op);\n-179 }\n-180 std::shared_ptr> sp = _\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt(op);\n-181 result = _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().create(type, op,\n-sp, prec, config);\n-182 return result;\n-183 }\n-184\n-_\b1_\b8_\b8 static std::shared_ptr _\bg_\be_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br(std::\n-shared_ptr op,\n-189 const ParameterTree& config){\n-190 const matrix_type* _\bm_\ba_\bt = getmat(op);\n-191 if(_\bm_\ba_\bt){\n-192 std::string prec_type = config.get(\"type\");\n-193 return _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b>_\b:_\b:_\bi_\bn_\bs_\bt_\ba_\bn_\bc_\be().create\n-(prec_type, op, config);\n-194 }else{\n-195 DUNE_THROW(InvalidStateException, \"Could not obtain matrix from operator.\n-Please pass in an AssembledLinearOperator.\");\n-196 }\n-197 }\n-198 };\n+_\b4_\b7 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be* _\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be;\n+48\n+_\b5_\b2 _\bV_\be_\br_\bt_\be_\bx _\bv_\be_\br_\bt_\be_\bx;\n+53 };\n+54\n+55\n+56\n+61 template\n+_\b6_\b2 class _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br\n+63 {\n+64 public:\n+70 _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br(M& matrix);\n+71\n+72 void _\bi_\bn_\bs_\be_\br_\bt(const typename M::size_type& _\bi_\bn_\bd_\be_\bx);\n+73\n+74 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n+75\n+76 std::size_t _\bm_\bi_\bn_\bR_\bo_\bw_\bS_\bi_\bz_\be();\n+77\n+78 std::size_t _\bm_\ba_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be();\n+79\n+80 std::size_t _\bs_\bu_\bm_\bR_\bo_\bw_\bS_\bi_\bz_\be();\n+_\b8_\b1 std::size_t _\bi_\bn_\bd_\be_\bx()\n+82 {\n+83 return row_.index();\n+84 }\n+85 private:\n+87 typename M::CreateIterator row_;\n+89 std::size_t minRowSize_;\n+91 std::size_t maxRowSize_;\n+92 std::size_t sumRowSize_;\n+93#ifdef DUNE_ISTL_WITH_CHECKING\n+94 bool diagonalInserted;\n+95#endif\n+96 };\n+97\n+_\b9_\b8 class _\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+99 {\n+100 public:\n+109 template\n+_\b1_\b1_\b0 void _\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be(const M& fine, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>& aggregates, M&\n+coarse,\n+111 const I& pinfo, const O& copy);\n+112\n+113 };\n+114\n+115 template\n+_\b1_\b1_\b6 class _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+117 : public _\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+118 {\n+119 public:\n+_\b1_\b2_\b0 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n+121\n+131 template\n+132 typename G::MutableMatrix* _\bb_\bu_\bi_\bl_\bd(G& fineGraph, V& visitedMap,\n+133 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n+134 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+135 const typename G::Matrix::size_type& size,\n+136 const Set& copy);\n+137 private:\n+138\n+145 template\n+146 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>*\n+147 buildOverlapVertices(const G& graph, const I& pinfo,\n+148 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+149 const Set& overlap,\n+150 std::size_t& overlapCount);\n+151\n+152 template\n+153 struct OVLess\n+154 {\n+_\b1_\b5_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bA_\b>& o1, const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bA_\b>& o2)\n+156 {\n+157 return *o1._\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be < *o2._\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be;\n+158 }\n+159 };\n+160 };\n+161\n+162 template<>\n+_\b1_\b6_\b3 class _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn>\n+164 : public _\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+165 {\n+166 public:\n+176 template\n+177 typename G::MutableMatrix* _\bb_\bu_\bi_\bl_\bd(G& fineGraph, V& visitedMap,\n+178 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n+179 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+180 const typename G::Matrix::size_type& size,\n+181 const Set& copy);\n+182 };\n+183\n+_\b1_\b8_\b4 struct _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n+185 {\n+186 template\n+187 static void _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(R& row, G& graph, V& visitedMap,\n+188 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+189 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>*& seed,\n+190 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>* overlapEnd);\n+191\n+195 template\n+196 static void _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bN_\bo_\bn_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(R& row, G& graph, V&\n+visitedMap,\n+197 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+198 const typename G::VertexDescriptor& seed);\n 199\n-210 template\n-211 std::shared_ptr> _\bg_\be_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\br_\bo_\bm_\bF_\ba_\bc_\bt_\bo_\br_\by(std::\n-shared_ptr op,\n-213 const ParameterTree& config,\n-214 std::shared_ptr<_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br> prec = nullptr){\n-216 return _\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b<_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b>_\b:_\b:_\bg_\be_\bt(op, config, prec);\n-217 }\n-218\n-222} // end namespace Dune\n-223\n-224\n-225#endif\n-_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh\n-_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh\n-_\bs_\bo_\bl_\bv_\be_\br_\br_\be_\bg_\bi_\bs_\bt_\br_\by_\b._\bh_\bh\n-_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n-Define general, extensible interface for inverse operators.\n-_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n-Singleton< ParameterizedObjectFactory< PreconditionerSignature< M, X, Y > > >\n-PreconditionerFactory\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n-Singleton< ParameterizedObjectFactory< DirectSolverSignature< M, X, Y > > >\n-DirectSolverFactory\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be\n-std::shared_ptr< InverseOperator< X, Y > >(const std::shared_ptr<\n-LinearOperator< X, Y > > &, const std::shared_ptr< ScalarProduct< X > > &,\n-const std::shared_ptr< Preconditioner< X, Y > >, const ParameterTree &)\n-IterativeSolverSignature\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bw_\br_\ba_\bp_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b4_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl\n-std::shared_ptr< Preconditioner > wrapPreconditioner4Parallel(const std::\n-shared_ptr< Preconditioner > &prec, const O &)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be\n-std::shared_ptr< InverseOperator< X, Y > >(const M &, const ParameterTree &)\n-DirectSolverSignature\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt_\bS_\bo_\bl_\bv_\be_\br_\bF_\br_\bo_\bm_\bF_\ba_\bc_\bt_\bo_\br_\by\n-std::shared_ptr< InverseOperator< typename Operator::domain_type, typename\n-Operator::range_type > > getSolverFromFactory(std::shared_ptr< Operator > op,\n-const ParameterTree &config, std::shared_ptr< Preconditioner< typename\n-Operator::domain_type, typename Operator::range_type > > prec=nullptr)\n-Instantiates an InverseOperator from an Operator and a configuration given as a\n-ParameterTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:212\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n-Singleton< ParameterizedObjectFactory< IterativeSolverSignature< X, Y > > >\n-IterativeSolverFactory\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:42\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bS_\bi_\bg_\bn_\ba_\bt_\bu_\br_\be\n-std::shared_ptr< Preconditioner< X, Y > >(const std::shared_ptr< M > &, const\n-ParameterTree &) PreconditionerSignature\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:34\n+200\n+204 template\n+_\b2_\b0_\b5 class _\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br\n+206 {\n+207 public:\n+_\b2_\b1_\b1 typedef G _\bG_\br_\ba_\bp_\bh;\n+_\b2_\b1_\b5 typedef typename Graph::ConstEdgeIterator _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n+216\n+_\b2_\b2_\b0 typedef S _\bS_\be_\bt;\n+221\n+_\b2_\b2_\b5 typedef V _\bV_\bi_\bs_\bi_\bt_\be_\bd_\bM_\ba_\bp;\n+226\n+_\b2_\b3_\b0 typedef typename Graph::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n+231\n+239 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, _\bG_\br_\ba_\bp_\bh& graph,\n+240 _\bV_\bi_\bs_\bi_\bt_\be_\bd_\bM_\ba_\bp& visitedMap, _\bS_\be_\bt& connected);\n+241\n+246 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const _\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n+247\n+248 private:\n+252 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n+253\n+254 _\bG_\br_\ba_\bp_\bh& graph_;\n+255\n+259 _\bV_\bi_\bs_\bi_\bt_\be_\bd_\bM_\ba_\bp& visitedMap_;\n+260\n+264 _\bS_\be_\bt& connected_;\n+265 };\n+266\n+267 };\n+268\n+269 template\n+_\b2_\b7_\b0 struct _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br : public _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n+271 {\n+_\b2_\b7_\b2 typedef typename G::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n+273\n+274 template\n+275 static void _\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph,\n+276 V& visitedMap,\n+277 const T& pinfo,\n+278 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+279 const O& overlap,\n+280 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>* overlapVertices,\n+281 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>* overlapEnd,\n+282 R& row);\n+283 };\n+284\n+285 template\n+_\b2_\b8_\b6 struct _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br : public\n+_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n+287 {\n+_\b2_\b8_\b8 typedef typename G::VertexDescriptor _\bV_\be_\br_\bt_\be_\bx;\n+289\n+290 template\n+291 static void _\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph,\n+292 V& visitedMap,\n+293 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n+294 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+295 R& row);\n+296 };\n+297\n+298 template\n+_\b2_\b9_\b9 struct _\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br\n+300 {\n+301 template\n+302 static void _\bs_\be_\bt(M& coarse, const T& pinfo, const O& copy);\n+303 };\n+304\n+305 template<>\n+_\b3_\b0_\b6 struct _\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn>\n+307 {\n+308 template\n+309 static void _\bs_\be_\bt(M& coarse, const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo, const O&\n+copy);\n+310 };\n+311\n+312 template\n+_\b3_\b1_\b3 void _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bN_\bo_\bn_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(R& row,\n+G& graph, V& visitedMap,\n+314 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+315 const typename G::VertexDescriptor& seed)\n+316 {\n+317 assert(row.index()==aggregates[seed]);\n+318 row.insert(aggregates[seed]);\n+319 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bG_\b,_\bR_\b,_\bV_\b> conBuilder(aggregates, graph, visitedMap, row);\n+320 typedef typename G::VertexDescriptor Vertex;\n+321 typedef std::allocator Allocator;\n+322 typedef SLList VertexList;\n+323 typedef typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br DummyVisitor;\n+324 VertexList vlist;\n+325 DummyVisitor dummy;\n+326 aggregates.template breadthFirstSearch(seed,aggregates[seed],\n+graph, vlist, dummy,\n+327 conBuilder, visitedMap);\n+328 }\n+329\n+330 template\n+_\b3_\b3_\b1 void _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(R& row, G&\n+graph, V& visitedMap,\n+332 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+333 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>*& seed,\n+334 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>* overlapEnd)\n+335 {\n+336 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bG_\b,_\bR_\b,_\bV_\b> conBuilder(aggregates, graph, visitedMap, row);\n+337 const typename G::VertexDescriptor aggregate=*seed->_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be;\n+338\n+339 if (row.index()==*seed->_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be) {\n+340 while(seed != overlapEnd && aggregate == *seed->_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be) {\n+341 row.insert(*seed->_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be);\n+342 // Walk over all neighbours and add them to the connected array.\n+343 _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(graph, seed->_\bv_\be_\br_\bt_\be_\bx, conBuilder);\n+344 // Mark vertex as visited\n+345 put(visitedMap, seed->_\bv_\be_\br_\bt_\be_\bx, true);\n+346 ++seed;\n+347 }\n+348 }\n+349 }\n+350\n+351 template\n+_\b3_\b5_\b2 _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bG_\b,_\bS_\b,_\bV_\b>_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br\n+(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+353 _\bG_\br_\ba_\bp_\bh& graph, _\bV_\bi_\bs_\bi_\bt_\be_\bd_\bM_\ba_\bp& visitedMap,\n+354 _\bS_\be_\bt& connected)\n+355 : aggregates_(aggregates), graph_(graph), visitedMap_(visitedMap),\n+connected_(connected)\n+356 {}\n+357\n+358 template\n+_\b3_\b5_\b9 void _\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bG_\b,_\bS_\b,_\bV_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const\n+_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n+360 {\n+361 const _\bV_\be_\br_\bt_\be_\bx& vertex = aggregates_[edge.target()];\n+362 assert(vertex!= _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n+363 if(vertex!= _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n+364 connected_.insert(vertex);\n+365 }\n+366\n+367 template\n+368 template\n+369 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>*\n+370 _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bT_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\bi_\bc_\be_\bs(const G& graph, const I& pinfo,\n+371 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+372 const Set& overlap,\n+373 std::size_t& overlapCount)\n+374 {\n+375 // count the overlap vertices.\n+376 typedef typename G::ConstVertexIterator ConstIterator;\n+377 typedef typename I::GlobalLookupIndexSet GlobalLookup;\n+378 typedef typename GlobalLookup::IndexPair IndexPair;\n+379\n+380 const ConstIterator end = graph.end();\n+381 overlapCount = 0;\n+382\n+383 const GlobalLookup& lookup=pinfo.globalLookup();\n+384\n+385 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {\n+386 const IndexPair* pair = lookup.pair(*vertex);\n+387\n+388 if(pair!=0 && overlap.contains(pair->local().attribute()))\n+389 ++overlapCount;\n+390 }\n+391 // Allocate space\n+392 typedef typename G::VertexDescriptor Vertex;\n+393\n+394 _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>* overlapVertices = new _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>\n+[overlapCount=0 ? 1 : overlapCount];\n+395 if(overlapCount==0)\n+396 return overlapVertices;\n+397\n+398 // Initialize them\n+399 overlapCount=0;\n+400 for(ConstIterator vertex=graph.begin(); vertex != end; ++vertex) {\n+401 const IndexPair* pair = lookup.pair(*vertex);\n+402\n+403 if(pair!=0 && overlap.contains(pair->local().attribute())) {\n+404 overlapVertices[overlapCount]._\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be = &aggregates[pair->local()];\n+405 overlapVertices[overlapCount]._\bv_\be_\br_\bt_\be_\bx = pair->local();\n+406 ++overlapCount;\n+407 }\n+408 }\n+409\n+410 dverb << overlapCount<<\" overlap vertices\"<());\n+413 // due to the sorting the isolated aggregates (to be skipped) are at the\n+end.\n+414\n+415 return overlapVertices;\n+416 }\n+417\n+418 template\n+419 template\n+_\b4_\b2_\b0 void _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\bG_\b,_\bT_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph,\n+421 V& visitedMap,\n+422 const T& pinfo,\n+423 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+424 const O& overlap,\n+425 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>* overlapVertices,\n+426 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bV_\be_\br_\bt_\be_\bx_\b>* overlapEnd,\n+427 R& row)\n+428 {\n+429 typedef typename T::GlobalLookupIndexSet GlobalLookup;\n+430 const GlobalLookup& lookup = pinfo.globalLookup();\n+431\n+432 typedef typename G::VertexIterator VertexIterator;\n+433\n+434 VertexIterator vend=graph.end();\n+435\n+436#ifdef DUNE_ISTL_WITH_CHECKING\n+437 std::set examined;\n+438#endif\n+439\n+440 // The aggregates owned by the process have lower local indices\n+441 // then those not owned. We process them in the first pass.\n+442 // They represent the rows 0, 1, ..., n of the coarse matrix\n+443 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex)\n+444 if(!_\bg_\be_\bt(visitedMap, *vertex)) {\n+445 // In the first pass we only process owner nodes\n+446 typedef typename GlobalLookup::IndexPair IndexPair;\n+447 const IndexPair* pair = lookup.pair(*vertex);\n+448 if(pair==0 || !overlap.contains(pair->local().attribute())) {\n+449#ifdef DUNE_ISTL_WITH_CHECKING\n+450 assert(examined.find(aggregates[*vertex])==examined.end());\n+451 examined.insert(aggregates[*vertex]);\n+452#endif\n+453 _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bN_\bo_\bn_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(row, graph, visitedMap, aggregates,\n+*vertex);\n+454\n+455 // only needed for ALU\n+456 // (ghosts with same global id as owners on the same process)\n+457 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(pinfo) == static_cast(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:\n+_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg)) {\n+458 if(overlapVertices != overlapEnd) {\n+459 if(*overlapVertices->_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n+460 _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(row, graph, visitedMap, aggregates,\n+overlapVertices, overlapEnd);\n+461 }\n+462 else{\n+463 ++overlapVertices;\n+464 }\n+465 }\n+466 }\n+467 ++row;\n+468 }\n+469 }\n+470\n+471 dvverb<<\"constructed \"<_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n+477\n+478#ifdef DUNE_ISTL_WITH_CHECKING\n+479 typedef typename GlobalLookup::IndexPair IndexPair;\n+480 const IndexPair* pair = lookup.pair(overlapVertices->_\bv_\be_\br_\bt_\be_\bx);\n+481 assert(pair!=0 && overlap.contains(pair->local().attribute()));\n+482 assert(examined.find(aggregates[overlapVertices->_\bv_\be_\br_\bt_\be_\bx])==examined.end());\n+483 examined.insert(aggregates[overlapVertices->_\bv_\be_\br_\bt_\be_\bx]);\n+484#endif\n+485 _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(row, graph, visitedMap, aggregates,\n+overlapVertices, overlapEnd);\n+486 ++row;\n+487 }else{\n+488 ++overlapVertices;\n+489 }\n+490 }\n+491\n+492 template\n+493 template\n+_\b4_\b9_\b4 void _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\bG_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph,\n+495 V& visitedMap,\n+496 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n+497 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+498 R& row)\n+499 {\n+500 typedef typename G::VertexIterator VertexIterator;\n+501\n+502 VertexIterator vend=graph.end();\n+503 for(VertexIterator vertex = graph.begin(); vertex != vend; ++vertex) {\n+504 if(!_\bg_\be_\bt(visitedMap, *vertex)) {\n+505 _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bN_\bo_\bn_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(row, graph, visitedMap, aggregates,\n+*vertex);\n+506 ++row;\n+507 }\n+508 }\n+509\n+510 }\n+511\n+512 template\n+_\b5_\b1_\b3 _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br(M& matrix)\n+514 : row_(matrix.createbegin()),\n+515 minRowSize_(_\bs_\bt_\bd::numeric_limits<_\bs_\bt_\bd::size_t>::max()),\n+516 maxRowSize_(0), sumRowSize_(0)\n+517 {\n+518#ifdef DUNE_ISTL_WITH_CHECKING\n+519 diagonalInserted = false;\n+520#endif\n+521 }\n+522 template\n+_\b5_\b2_\b3 std::size_t _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bm_\ba_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be()\n+524 {\n+525 return maxRowSize_;\n+526 }\n+527 template\n+_\b5_\b2_\b8 std::size_t _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bm_\bi_\bn_\bR_\bo_\bw_\bS_\bi_\bz_\be()\n+529 {\n+530 return minRowSize_;\n+531 }\n+532\n+533 template\n+_\b5_\b3_\b4 std::size_t _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bs_\bu_\bm_\bR_\bo_\bw_\bS_\bi_\bz_\be()\n+535 {\n+536 return sumRowSize_;\n+537 }\n+538 template\n+_\b5_\b3_\b9 void _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n+540 {\n+541 sumRowSize_ += row_.size();\n+542 minRowSize_=std::min(minRowSize_, row_.size());\n+543 maxRowSize_=std::max(maxRowSize_, row_.size());\n+544 ++row_;\n+545#ifdef DUNE_ISTL_WITH_CHECKING\n+546 assert(diagonalInserted);\n+547 diagonalInserted = false;\n+548#endif\n+549 }\n+550\n+551 template\n+_\b5_\b5_\b2 void _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b>_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt(const typename M::size_type& index)\n+553 {\n+554 row_.insert(index);\n+555#ifdef DUNE_ISTL_WITH_CHECKING\n+556 diagonalInserted = diagonalInserted || row_.index()==index;\n+557#endif\n+558 }\n+559\n+560 template\n+561 template\n+562 typename G::MutableMatrix*\n+_\b5_\b6_\b3 _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bT_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd(G& fineGraph, V& visitedMap,\n+564 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n+565 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+566 const typename G::Matrix::size_type& size,\n+567 const Set& overlap)\n+568 {\n+569 typedef _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b> _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx;\n+570\n+571 std::size_t count;\n+572\n+573 const _\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx* overlapVertices = buildOverlapVertices(fineGraph,\n+574 pinfo,\n+575 aggregates,\n+576 overlap,\n+577 count);\n+578 typedef typename G::MutableMatrix M;\n+579 M* coarseMatrix = new M(size, size, M::row_wise);\n+580\n+581 // Reset the visited flags of all vertices.\n+582 // As the isolated nodes will be skipped we simply mark them as visited\n+583\n+584 typedef typename G::VertexIterator Vertex;\n+585 Vertex vend = fineGraph.end();\n+586 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {\n+587 assert(aggregates[*vertex] != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:\n+_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n+588 put(visitedMap, *vertex, aggregates[*vertex]==_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n+589 }\n+590\n+591 typedef typename G::MutableMatrix M;\n+592 _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b> sparsityBuilder(*coarseMatrix);\n+593\n+594 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\bG_\b,_\bT_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(fineGraph, visitedMap, pinfo,\n+595 aggregates, overlap,\n+596 overlapVertices,\n+597 overlapVertices+count,\n+598 sparsityBuilder);\n+599\n+600 dinfo<N\n+()<<\"x\"<M()<<\" row: min=\"<(sparsityBuilder._\bs_\bu_\bm_\bR_\bo_\bw_\bS_\bi_\bz_\be())/coarseMatrix->N()\n+603 <\n+611 typename G::MutableMatrix*\n+_\b6_\b1_\b2 _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd(G& fineGraph, V& visitedMap,\n+613 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n+614 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+615 const typename G::Matrix::size_type& size,\n+616 [[maybe_unused]] const Set& overlap)\n+617 {\n+618 typedef typename G::MutableMatrix M;\n+619 M* coarseMatrix = new M(size, size, M::row_wise);\n+620\n+621 // Reset the visited flags of all vertices.\n+622 // As the isolated nodes will be skipped we simply mark them as visited\n+623\n+624 typedef typename G::VertexIterator Vertex;\n+625 Vertex vend = fineGraph.end();\n+626 for(Vertex vertex = fineGraph.begin(); vertex != vend; ++vertex) {\n+627 assert(aggregates[*vertex] != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:\n+_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n+628 put(visitedMap, *vertex, aggregates[*vertex]==_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n+629 }\n+630\n+631 _\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b<_\bM_\b> sparsityBuilder(*coarseMatrix);\n+632\n+633 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\bG_\b,_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(fineGraph,\n+visitedMap, pinfo,\n+634 aggregates, sparsityBuilder);\n+635 dinfo<<\"Matrix row: min=\"<(sparsityBuilder._\bs_\bu_\bm_\bR_\bo_\bw_\bS_\bi_\bz_\be())/coarseMatrix->N\n+()<\n+_\b6_\b4_\b2 void _\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be(const M& fine, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>&\n+aggregates, M& coarse,\n+643 const P& pinfo, [[maybe_unused]] const O& copy)\n+644 {\n+645 coarse = static_cast(0);\n+646\n+647 typedef typename M::ConstIterator RowIterator;\n+648 RowIterator endRow = fine.end();\n+649\n+650 for(RowIterator row = fine.begin(); row != endRow; ++row)\n+651 if(aggregates[row.index()] != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n+652 assert(aggregates[row.index()]!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n+653 typedef typename M::ConstColIterator ColIterator;\n+654 ColIterator endCol = row->end();\n+655\n+656 for(ColIterator _\bc_\bo_\bl = row->begin(); _\bc_\bo_\bl != endCol; ++_\bc_\bo_\bl)\n+657 if(aggregates[_\bc_\bo_\bl.index()] != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n+658 assert(aggregates[row.index()]!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n+659 coarse[aggregates[row.index()]][aggregates[_\bc_\bo_\bl.index()]]+=*_\bc_\bo_\bl;\n+660 }\n+661 }\n+662\n+663 // get the right diagonal matrix values on copy lines from owner processes\n+664 typedef typename M::block_type BlockType;\n+665 std::vector rowsize(coarse.N(),BlockType(0));\n+666 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)\n+667 rowsize[row.index()]=coarse[row.index()][row.index()];\n+668 pinfo.copyOwnerToAll(rowsize,rowsize);\n+669 for (RowIterator row = coarse.begin(); row != coarse.end(); ++row)\n+670 coarse[row.index()][row.index()] = rowsize[row.index()];\n+671\n+672 // don't set dirichlet boundaries for copy lines to make novlp case work,\n+673 // the preconditioner yields slightly different results now.\n+674\n+675 // Set the dirichlet border\n+676 //DirichletBoundarySetter

    ::template set(coarse, pinfo, copy);\n+677\n+678 }\n+679\n+680 template\n+681 template\n+_\b6_\b8_\b2 void _\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br_\b<_\bT_\b>_\b:_\b:_\bs_\be_\bt(M& coarse, const T& pinfo, const O&\n+copy)\n+683 {\n+684 typedef typename T::ParallelIndexSet::const_iterator ConstIterator;\n+685 ConstIterator end = pinfo.indexSet().end();\n+686 typedef typename M::block_type Block;\n+687 Block identity=Block(0.0);\n+688 for(typename Block::RowIterator b=identity.begin(); b != identity.end();\n+++b)\n+689 b->operator[](b.index())=1.0;\n+690\n+691 for(ConstIterator index = pinfo.indexSet().begin();\n+692 index != end; ++index) {\n+693 if(copy.contains(index->local().attribute())) {\n+694 typedef typename M::ColIterator ColIterator;\n+695 typedef typename M::row_type Row;\n+696 Row row = coarse[index->local()];\n+697 ColIterator cend = row.find(index->local());\n+698 ColIterator _\bc_\bo_\bl = row.begin();\n+699 for(; _\bc_\bo_\bl != cend; ++_\bc_\bo_\bl)\n+700 *_\bc_\bo_\bl = 0;\n+701\n+702 cend = row.end();\n+703\n+704 assert(_\bc_\bo_\bl != cend); // There should be a diagonal entry\n+705 *_\bc_\bo_\bl = identity;\n+706\n+707 for(++_\bc_\bo_\bl; _\bc_\bo_\bl != cend; ++_\bc_\bo_\bl)\n+708 *_\bc_\bo_\bl = 0;\n+709 }\n+710 }\n+711 }\n+712\n+713 template\n+_\b7_\b1_\b4 void _\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br_\b<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>_\b:_\b:_\bs_\be_\bt(M& coarse,\n+715 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n+716 const O& overlap)\n+717 {}\n+718\n+719 } // namespace Amg\n+720} // namespace Dune\n+721#endif\n+_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n+Provides classes for the Coloring process of AMG.\n+_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bO_\bV_\bL_\be_\bs_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+bool operator()(const OverlapVertex< A > &o1, const OverlapVertex< A > &o2)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bN_\bo_\bn_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by\n+static void constructNonOverlapConnectivity(R &row, G &graph, V &visitedMap,\n+const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename\n+G::VertexDescriptor &seed)\n+Construct the connectivity of an aggregate in the overlap.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:313\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bG_\br_\ba_\bp_\bh\n+G Graph\n+The type of the graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+void operator++()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:539\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const ConstEdgeIterator &edge)\n+Process an edge pointing to another aggregate.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:359\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bi_\bn_\bs_\be_\br_\bt\n+void insert(const typename M::size_type &index)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:552\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by\n+static void constructOverlapConnectivity(R &row, G &graph, V &visitedMap, const\n+AggregatesMap< typename G::VertexDescriptor > &aggregates, const OverlapVertex<\n+typename G::VertexDescriptor > *&seed, const OverlapVertex< typename G::\n+VertexDescriptor > *overlapEnd)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:331\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bb_\bu_\bi_\bl_\bd\n+G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation\n+&pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const\n+typename G::Matrix::size_type &size, const Set ©)\n+Calculates the coarse matrix via a Galerkin product.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:563\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n+std::size_t index()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:81\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+T ParallelInformation\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+G::VertexDescriptor Vertex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:272\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n+T Aggregate\n+The aggregate descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br\n+SparsityBuilder(M &matrix)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:513\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br\n+ConnectedBuilder(const AggregatesMap< Vertex > &aggregates, Graph &graph,\n+VisitedMap &visitedMap, Set &connected)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:352\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Graph::ConstEdgeIterator ConstEdgeIterator\n+The constant edge iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:215\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+T Vertex\n+The vertex descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:42\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b<_\b _\bG_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+G::VertexDescriptor Vertex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:288\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n+static void examine(G &graph, V &visitedMap, const T &pinfo, const\n+AggregatesMap< Vertex > &aggregates, const O &overlap, const OverlapVertex<\n+Vertex > *overlapVertices, const OverlapVertex< Vertex > *overlapEnd, R &row)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:420\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bM_\ba_\bp\n+V VisitedMap\n+The type of the map for marking vertices as visited.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:225\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n+int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex,\n+V &visitor)\n+Visit all neighbour vertices of a vertex in a graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bS_\be_\bt\n+S Set\n+The type of the connected set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:220\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n+Aggregate * aggregate\n+The aggregate the vertex belongs to.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:47\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bs_\bu_\bm_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t sumRowSize()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:534\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx_\b:_\b:_\bv_\be_\br_\bt_\be_\bx\n+Vertex vertex\n+The vertex descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bm_\bi_\bn_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t minRowSize()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:528\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br_\b:_\b:_\bs_\be_\bt\n+static void set(M &coarse, const T &pinfo, const O ©)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:682\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+Graph::VertexDescriptor Vertex\n+The vertex descriptor of the graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be\n+void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse,\n+const I &pinfo, const O ©)\n+Calculate the galerkin product.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br_\b:_\b:_\bm_\ba_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be\n+std::size_t maxRowSize()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:523\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n-std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm,\n-SolverCategory::Category category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:242\n-_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-A nonoverlapping operator with communication object.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n-Adapter to turn a matrix into a linear operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-An overlapping Schwarz operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-Base class for matrix free definition of preconditioners.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bD_\bo_\bm_\ba_\bi_\bn_\b,_\b _\bR_\ba_\bn_\bg_\be_\b _\b>\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by\n-Factory to assembly solvers configured by a ParameterTree.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:130\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b:_\b:_\bg_\be_\bt\n-static std::shared_ptr< Solver > get(std::shared_ptr< Operator > op, const\n-ParameterTree &config, std::shared_ptr< Preconditioner > prec=nullptr)\n-get a solver from the factory\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bF_\ba_\bc_\bt_\bo_\br_\by_\b:_\b:_\bg_\be_\bt_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n-static std::shared_ptr< Preconditioner > getPreconditioner(std::shared_ptr<\n-Operator > op, const ParameterTree &config)\n-Construct a Preconditioner for a given Operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverfactory.hh:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+Class providing information about the mapping of the vertices onto aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+A Dummy visitor that does nothing for each visited edge.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:598\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bV_\be_\br_\bt_\be_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bB_\bu_\bi_\bl_\bd_\be_\br\n+Functor for building the sparsity pattern of the matrix using\n+examineConnectivity.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:63\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:99\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:118\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:185\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\be_\bd_\bB_\bu_\bi_\bl_\bd_\be_\br\n+Visitor for identifying connected aggregates during a breadthFirstSearch.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:206\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:271\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt_\bB_\bo_\bu_\bn_\bd_\ba_\br_\by_\bS_\be_\bt_\bt_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:300\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n+@ nonoverlapping\n+Category for non-overlapping solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+static Category category(const OP &op, decltype(op.category()) *=nullptr)\n+Helperfunction to extract the solver category either from an enum, or from the\n+newly introduced virtu...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00185.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00185.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: btdmatrix.hh File Reference\n+dune-istl: properties.hh File Reference\n \n \n \n \n \n \n \n@@ -65,51 +65,50 @@\n \n \n \n \n \n

    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n \n-
    btdmatrix.hh File Reference
    \n+ \n
    \n
    \n \n-

    Implementation of the BTDMatrix class. \n+

    Provides classes for handling internal properties in a graph. \n More...

    \n-
    #include <dune/common/fmatrix.hh>
    \n-#include <dune/common/scalarvectorview.hh>
    \n-#include <dune/common/scalarmatrixview.hh>
    \n-#include <dune/istl/bcrsmatrix.hh>
    \n-#include <dune/istl/blocklevel.hh>
    \n+
    #include <dune/common/propertymap.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n+\n+\n \n

    \n Classes

    class  Dune::BTDMatrix< B, A >
     A block-tridiagonal matrix. More...
    struct  Dune::Amg::VertexVisitedTag
     Tag idnetifying the visited property of a vertex. More...
     
    struct  Dune::FieldTraits< BTDMatrix< B, A > >
    class  Dune::Amg::RandomAccessBundledPropertyMap< C, K, i, T, R >
     A property map that extracts one property out of a bundle using operator[]() More...
     
    \n \n \n \n+\n+\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n

    Detailed Description

    \n-

    Implementation of the BTDMatrix class.

    \n-
    Author
    Oliver Sander
    \n+

    Provides classes for handling internal properties in a graph.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,30 +1,33 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n+ * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-btdmatrix.hh File Reference\n-Implementation of the BTDMatrix class. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+properties.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Provides classes for handling internal properties in a graph. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n-\u00a0 A block-tridiagonal matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n+\u00a0 Tag idnetifying the visited property of a vertex. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b<_\b _\bC_\b,_\b _\bK_\b,_\b _\bi_\b,_\b _\bT_\b,_\b _\bR_\b _\b>\n+\u00a0 A property map that extracts one property out of a bundle using\n+ _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b(_\b) _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Implementation of the BTDMatrix class.\n+Provides classes for handling internal properties in a graph.\n Author\n- Oliver Sander\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00185_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00185_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: btdmatrix.hh Source File\n+dune-istl: properties.hh Source File\n \n \n \n \n \n \n \n@@ -70,240 +70,99 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    btdmatrix.hh
    \n+
    properties.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_BTDMATRIX_HH
    \n-
    6#define DUNE_ISTL_BTDMATRIX_HH
    \n+
    5#ifndef DUNE_ISTL_AMG_PROPERTIES_HH
    \n+
    6#define DUNE_ISTL_AMG_PROPERTIES_HH
    \n
    7
    \n-
    8#include <dune/common/fmatrix.hh>
    \n-
    9#include <dune/common/scalarvectorview.hh>
    \n-
    10#include <dune/common/scalarmatrixview.hh>
    \n-\n-\n-
    13
    \n-
    19namespace Dune {
    \n-
    29 template <class B, class A=std::allocator<B> >
    \n-
    \n-
    30 class BTDMatrix : public BCRSMatrix<B,A>
    \n-
    31 {
    \n-
    32 public:
    \n-
    33
    \n-
    34 //===== type definitions and constants
    \n-
    35
    \n-
    37 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n-
    38
    \n-
    40 typedef B block_type;
    \n-
    41
    \n-
    43 typedef A allocator_type;
    \n-
    44
    \n-
    46 //typedef BCRSMatrix<B,A>::row_type row_type;
    \n+
    8#include <dune/common/propertymap.hh>
    \n+
    9
    \n+
    10namespace Dune
    \n+
    11{
    \n+
    12
    \n+
    13 namespace Amg
    \n+
    14 {
    \n+
    \n+\n+
    29 {};
    \n+
    \n+
    30
    \n+
    31
    \n+
    38 template<typename C, typename K, std::size_t i,typename T=typename C::ValueType,
    \n+
    39 typename R = typename C::Reference>
    \n+
    \n+\n+
    41 : public RAPropertyMapHelper<R,
    \n+
    42 RandomAccessBundledPropertyMap<C,K,i,T,R> >
    \n+
    43 {
    \n+
    44 public:
    \n+
    46 typedef C Container;
    \n
    47
    \n-
    49 typedef typename A::size_type size_type;
    \n+
    49 typedef R Reference;
    \n
    50
    \n-
    52 BTDMatrix() : BCRSMatrix<B,A>() {}
    \n+
    52 typedef K Key;
    \n
    53
    \n-
    \n-
    54 explicit BTDMatrix(size_type size)
    \n-
    55 : BCRSMatrix<B,A>(size, size, BCRSMatrix<B,A>::random)
    \n-
    56 {
    \n-
    57 // Set number of entries for each row
    \n-
    58 // All rows get three entries, except for the first and the last one
    \n-
    59 for (size_t i=0; i<size; i++)
    \n-
    60 this->BCRSMatrix<B,A>::setrowsize(i, 3 - (i==0) - (i==(size-1)));
    \n-
    61
    \n-\n+
    57 typedef LvaluePropertyMapTag Category;
    \n+
    58
    \n+
    59 enum {
    \n+
    61 index = i
    \n+
    62 };
    \n
    63
    \n-
    64 // The actual entries for each row
    \n-
    65 for (size_t i=0; i<size; i++) {
    \n-
    66 if (i>0)
    \n-
    67 this->BCRSMatrix<B,A>::addindex(i, i-1);
    \n-
    68 this->BCRSMatrix<B,A>::addindex(i, i );
    \n-
    69 if (i<size-1)
    \n-
    70 this->BCRSMatrix<B,A>::addindex(i, i+1);
    \n-
    71 }
    \n-
    72
    \n-\n-
    74 }
    \n-
    \n-
    75
    \n-
    \n-
    77 void setSize(size_type size)
    \n-
    78 {
    \n-
    79 auto nonZeros = (size==0) ? 0 : size + 2*(size-1);
    \n-
    80 this->BCRSMatrix<B,A>::setSize(size, // rows
    \n-
    81 size, // columns
    \n-
    82 nonZeros);
    \n-
    83
    \n-
    84 // Set number of entries for each row
    \n-
    85 // All rows get three entries, except for the first and the last one
    \n-
    86 for (size_t i=0; i<size; i++)
    \n-
    87 this->BCRSMatrix<B,A>::setrowsize(i, 3 - (i==0) - (i==(size-1)));
    \n-
    88
    \n-\n-
    90
    \n-
    91 // The actual entries for each row
    \n-
    92 for (size_t i=0; i<size; i++) {
    \n-
    93 if (i>0)
    \n-
    94 this->BCRSMatrix<B,A>::addindex(i, i-1);
    \n-
    95 this->BCRSMatrix<B,A>::addindex(i, i );
    \n-
    96 if (i<size-1)
    \n-
    97 this->BCRSMatrix<B,A>::addindex(i, i+1);
    \n-
    98 }
    \n-
    99
    \n-\n-
    101 }
    \n-
    \n-
    102
    \n-
    \n-\n-
    105 this->BCRSMatrix<B,A>::operator=(other);
    \n-
    106 return *this;
    \n-
    107 }
    \n-
    \n-
    108
    \n-
    \n-\n-\n-
    112 return *this;
    \n-
    113 }
    \n-
    \n-
    114
    \n-
    120 template <class V>
    \n-
    \n-
    121 void solve (V& x, const V& rhs) const {
    \n-
    122
    \n-
    123 // special handling for 1x1 matrices. The generic algorithm doesn't work for them
    \n-
    124 if (this->N()==1) {
    \n-
    125 auto&& x0 = Impl::asVector(x[0]);
    \n-
    126 auto&& rhs0 = Impl::asVector(rhs[0]);
    \n-
    127 Impl::asMatrix((*this)[0][0]).solve(x0, rhs0);
    \n-
    128 return;
    \n-
    129 }
    \n-
    130
    \n-
    131 // Make copies of the rhs and the right matrix band
    \n-
    132 V d = rhs;
    \n-
    133 std::vector<block_type> c(this->N()-1);
    \n-
    134 for (size_t i=0; i<this->N()-1; i++)
    \n-
    135 c[i] = (*this)[i][i+1];
    \n-
    136
    \n-
    137 /* Modify the coefficients. */
    \n-
    138 block_type a_00_inv = (*this)[0][0];
    \n-
    139 Impl::asMatrix(a_00_inv).invert();
    \n-
    140
    \n-
    141 //c[0] /= (*this)[0][0]; /* Division by zero risk. */
    \n-
    142 block_type tmp = a_00_inv;
    \n-
    143 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[0]));
    \n-
    144 c[0] = tmp;
    \n-
    145
    \n-
    146 // d = a^{-1} d /* Division by zero would imply a singular matrix. */
    \n-
    147 auto d_0_tmp = d[0];
    \n-
    148 auto&& d_0 = Impl::asVector(d[0]);
    \n-
    149 Impl::asMatrix(a_00_inv).mv(Impl::asVector(d_0_tmp),d_0);
    \n-
    150
    \n-
    151 for (unsigned int i = 1; i < this->N(); i++) {
    \n-
    152
    \n-
    153 // id = ( a_ii - c_{i-1} a_{i, i-1} ) ^{-1}
    \n-
    154 block_type tmp;
    \n-
    155 tmp = (*this)[i][i-1];
    \n-
    156 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[i-1]));
    \n-
    157
    \n-
    158 block_type id = (*this)[i][i];
    \n-
    159 id -= tmp;
    \n-
    160 Impl::asMatrix(id).invert(); /* Division by zero risk. */
    \n-
    161
    \n-
    162 if (i<c.size()) {
    \n-
    163 Impl::asMatrix(c[i]).leftmultiply(Impl::asMatrix(id)); /* Last value calculated is redundant. */
    \n-
    164 }
    \n-
    165
    \n-
    166 // d[i] = (d[i] - d[i-1] * (*this)[i][i-1]) * id;
    \n-
    167 auto&& d_i = Impl::asVector(d[i]);
    \n-
    168 Impl::asMatrix((*this)[i][i-1]).mmv(Impl::asVector(d[i-1]), d_i);
    \n-
    169 auto tmpVec = d[i];
    \n-
    170 Impl::asMatrix(id).mv(Impl::asVector(tmpVec), d_i);
    \n-
    171 }
    \n-
    172
    \n-
    173 /* Now back substitute. */
    \n-
    174 x[this->N() - 1] = d[this->N() - 1];
    \n-
    175 for (int i = this->N() - 2; i >= 0; i--) {
    \n-
    176 //x[i] = d[i] - c[i] * x[i + 1];
    \n-
    177 x[i] = d[i];
    \n-
    178 auto&& x_i = Impl::asVector(x[i]);
    \n-
    179 Impl::asMatrix(c[i]).mmv(Impl::asVector(x[i+1]), x_i);
    \n-
    180 }
    \n-
    181
    \n-
    182 }
    \n-
    \n-
    183
    \n-
    184 private:
    \n-
    185
    \n-
    186 // ////////////////////////////////////////////////////////////////////////////
    \n-
    187 // The following methods from the base class should now actually be called
    \n-
    188 // ////////////////////////////////////////////////////////////////////////////
    \n-
    189
    \n-
    190 // createbegin and createend should be in there, too, but I can't get it to compile
    \n-
    191 // BCRSMatrix<B,A>::CreateIterator createbegin () {}
    \n-
    192 // BCRSMatrix<B,A>::CreateIterator createend () {}
    \n-
    193 void setrowsize (size_type i, size_type s) {}
    \n-
    194 void incrementrowsize (size_type i) {}
    \n-
    195 void endrowsizes () {}
    \n-
    196 void addindex (size_type row, size_type col) {}
    \n-
    197 void endindices () {}
    \n-
    198 };
    \n-
    \n-
    199
    \n-
    200 template<typename B, typename A>
    \n-
    \n-
    201 struct FieldTraits< BTDMatrix<B, A> >
    \n-
    202 {
    \n-\n-
    204 using real_type = typename FieldTraits<field_type>::real_type;
    \n-
    205 };
    \n-
    \n-
    206
    \n-
    209} // end namespace Dune
    \n-
    210
    \n-
    211#endif
    \n-
    Helper functions for determining the vector/matrix block level.
    \n-
    Implementation of the BCRSMatrix class.
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n+
    \n+
    69 Reference operator[](const Key& key) const
    \n+
    70 {
    \n+
    71 return container_[key][index];
    \n+
    72 }
    \n+
    \n+
    73
    \n+
    \n+\n+
    79 : container_(&container)
    \n+
    80 {}
    \n+
    \n+
    81
    \n+
    \n+\n+
    84 : container_(0)
    \n+
    85 {}
    \n+
    \n+
    86
    \n+
    87 private:
    \n+
    89 Container* container_;
    \n+
    90 };
    \n+
    \n+
    91 }
    \n+
    92}
    \n+
    93
    \n+
    94#endif
    \n+
    Reference operator[](const Key &key) const
    Get the property for a key.
    Definition properties.hh:69
    \n+
    RandomAccessBundledPropertyMap()
    The default constructor.
    Definition properties.hh:83
    \n+
    R Reference
    The reference type of the container.
    Definition properties.hh:49
    \n+
    RandomAccessBundledPropertyMap(Container &container)
    Constructor.
    Definition properties.hh:78
    \n+
    K Key
    The key of the property map.
    Definition properties.hh:52
    \n+
    LvaluePropertyMapTag Category
    The category of the property map.
    Definition properties.hh:57
    \n+
    C Container
    The container that holds the properties.
    Definition properties.hh:46
    \n+
    @ index
    The index of the property in the bundle.
    Definition properties.hh:61
    \n
    Definition allocator.hh:11
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    void endrowsizes()
    indicate that size of all rows is defined
    Definition bcrsmatrix.hh:1146
    \n-
    @ random
    Build entries randomly.
    Definition bcrsmatrix.hh:526
    \n-
    void addindex(size_type row, size_type col)
    add index (row,col) to the matrix
    Definition bcrsmatrix.hh:1188
    \n-
    void endindices()
    indicate that all indices are defined, check consistency
    Definition bcrsmatrix.hh:1269
    \n-
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n-
    void setSize(size_type rows, size_type columns, size_type nnz=0)
    Set the size of the matrix.
    Definition bcrsmatrix.hh:858
    \n-
    BCRSMatrix & operator=(const BCRSMatrix &Mat)
    assignment
    Definition bcrsmatrix.hh:908
    \n-
    A block-tridiagonal matrix.
    Definition btdmatrix.hh:31
    \n-
    BTDMatrix(size_type size)
    Definition btdmatrix.hh:54
    \n-
    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:121
    \n-
    A::size_type size_type
    implement row_type with compressed vector
    Definition btdmatrix.hh:49
    \n-
    A allocator_type
    export the allocator type
    Definition btdmatrix.hh:43
    \n-
    B block_type
    export the type representing the components
    Definition btdmatrix.hh:40
    \n-
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition btdmatrix.hh:37
    \n-
    BTDMatrix & operator=(const BTDMatrix &other)
    assignment
    Definition btdmatrix.hh:104
    \n-
    BTDMatrix()
    Default constructor.
    Definition btdmatrix.hh:52
    \n-
    void setSize(size_type size)
    Resize the matrix. Invalidates the content!
    Definition btdmatrix.hh:77
    \n-
    typename FieldTraits< field_type >::real_type real_type
    Definition btdmatrix.hh:204
    \n-
    typename BTDMatrix< B, A >::field_type field_type
    Definition btdmatrix.hh:203
    \n+
    Tag idnetifying the visited property of a vertex.
    Definition properties.hh:29
    \n+
    A property map that extracts one property out of a bundle using operator[]()
    Definition properties.hh:43
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,281 +1,110 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-btdmatrix.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+properties.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_BTDMATRIX_HH\n-6#define DUNE_ISTL_BTDMATRIX_HH\n+5#ifndef DUNE_ISTL_AMG_PROPERTIES_HH\n+6#define DUNE_ISTL_AMG_PROPERTIES_HH\n 7\n-8#include \n-9#include \n-10#include \n-11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n-13\n-19namespace _\bD_\bu_\bn_\be {\n-29 template >\n-_\b3_\b0 class _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx : public _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-31 {\n-32 public:\n-33\n-34 //===== type definitions and constants\n-35\n-_\b3_\b7 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n-38\n-_\b4_\b0 typedef B _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-41\n-_\b4_\b3 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n-44\n-46 //typedef BCRSMatrix::row_type row_type;\n+8#include \n+9\n+10namespace _\bD_\bu_\bn_\be\n+11{\n+12\n+13 namespace Amg\n+14 {\n+_\b2_\b8 struct _\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n+29 {};\n+30\n+31\n+38 template\n+_\b4_\b0 class _\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+41 : public RAPropertyMapHelper >\n+43 {\n+44 public:\n+_\b4_\b6 typedef C _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n 47\n-_\b4_\b9 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+_\b4_\b9 typedef R _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n 50\n-_\b5_\b2 _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx() : _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx() {}\n+_\b5_\b2 typedef K _\bK_\be_\by;\n 53\n-_\b5_\b4 explicit _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size)\n-55 : _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx(size, size, _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx::_\br_\ba_\bn_\bd_\bo_\bm)\n-56 {\n-57 // Set number of entries for each row\n-58 // All rows get three entries, except for the first and the last one\n-59 for (size_t i=0; i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be(i, 3 - (i==0) - (i==(size-1)));\n-61\n-62 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs();\n+_\b5_\b7 typedef LvaluePropertyMapTag _\bC_\ba_\bt_\be_\bg_\bo_\br_\by;\n+58\n+59 enum {\n+61 _\bi_\bn_\bd_\be_\bx = i\n+_\b6_\b2 };\n 63\n-64 // The actual entries for each row\n-65 for (size_t i=0; i0)\n-67 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i-1);\n-68 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i );\n-69 if (i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i+1);\n-71 }\n-72\n-73 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs();\n-74 }\n-75\n-_\b7_\b7 void _\bs_\be_\bt_\bS_\bi_\bz_\be(size_type size)\n-78 {\n-79 auto nonZeros = (size==0) ? 0 : size + 2*(size-1);\n-80 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be(size, // rows\n-81 size, // columns\n-82 nonZeros);\n-83\n-84 // Set number of entries for each row\n-85 // All rows get three entries, except for the first and the last one\n-86 for (size_t i=0; i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bs_\be_\bt_\br_\bo_\bw_\bs_\bi_\bz_\be(i, 3 - (i==0) - (i==(size-1)));\n-88\n-89 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs();\n-90\n-91 // The actual entries for each row\n-92 for (size_t i=0; i0)\n-94 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i-1);\n-95 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i );\n-96 if (i_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx(i, i+1);\n-98 }\n-99\n-100 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs();\n-101 }\n-102\n-_\b1_\b0_\b4 _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx& other) {\n-105 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(other);\n-106 return *this;\n-107 }\n-108\n-_\b1_\b1_\b0 _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k) {\n-111 this->_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bA_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(k);\n-112 return *this;\n-113 }\n-114\n-120 template \n-_\b1_\b2_\b1 void _\bs_\bo_\bl_\bv_\be (V& x, const V& rhs) const {\n-122\n-123 // special handling for 1x1 matrices. The generic algorithm doesn't work\n-for them\n-124 if (this->_\bN()==1) {\n-125 auto&& x0 = Impl::asVector(x[0]);\n-126 auto&& rhs0 = Impl::asVector(rhs[0]);\n-127 Impl::asMatrix((*this)[0][0]).solve(x0, rhs0);\n-128 return;\n-129 }\n-130\n-131 // Make copies of the rhs and the right matrix band\n-132 V d = rhs;\n-133 std::vector c(this->_\bN()-1);\n-134 for (size_t i=0; i_\bN()-1; i++)\n-135 c[i] = (*this)[i][i+1];\n-136\n-137 /* Modify the coefficients. */\n-138 _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be a_00_inv = (*this)[0][0];\n-139 Impl::asMatrix(a_00_inv).invert();\n-140\n-141 //c[0] /= (*this)[0][0]; /* Division by zero risk. */\n-142 _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be tmp = a_00_inv;\n-143 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[0]));\n-144 c[0] = tmp;\n-145\n-146 // d = a^{-1} d /* Division by zero would imply a singular matrix. */\n-147 auto d_0_tmp = d[0];\n-148 auto&& d_0 = Impl::asVector(d[0]);\n-149 Impl::asMatrix(a_00_inv).mv(Impl::asVector(d_0_tmp),d_0);\n-150\n-151 for (unsigned int i = 1; i < this->_\bN(); i++) {\n-152\n-153 // id = ( a_ii - c_{i-1} a_{i, i-1} ) ^{-1}\n-154 _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be tmp;\n-155 tmp = (*this)[i][i-1];\n-156 Impl::asMatrix(tmp).rightmultiply(Impl::asMatrix(c[i-1]));\n-157\n-158 _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be id = (*this)[i][i];\n-159 id -= tmp;\n-160 Impl::asMatrix(id).invert(); /* Division by zero risk. */\n-161\n-162 if (i_\bN() - 1] = d[this->_\bN() - 1];\n-175 for (int i = this->_\bN() - 2; i >= 0; i--) {\n-176 //x[i] = d[i] - c[i] * x[i + 1];\n-177 x[i] = d[i];\n-178 auto&& x_i = Impl::asVector(x[i]);\n-179 Impl::asMatrix(c[i]).mmv(Impl::asVector(x[i+1]), x_i);\n-180 }\n-181\n-182 }\n-183\n-184 private:\n-185\n-186 // ////////////////////////////////////////////////////////////////////////\n-////\n-187 // The following methods from the base class should now actually be called\n-188 // ////////////////////////////////////////////////////////////////////////\n-////\n-189\n-190 // createbegin and createend should be in there, too, but I can't get it to\n-compile\n-191 // BCRSMatrix::CreateIterator createbegin () {}\n-192 // BCRSMatrix::CreateIterator createend () {}\n-193 void setrowsize (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be s) {}\n-194 void incrementrowsize (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) {}\n-195 void endrowsizes () {}\n-196 void addindex (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be row, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl) {}\n-197 void endindices () {}\n-198 };\n-199\n-200 template\n-_\b2_\b0_\b1 struct FieldTraits< _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx >\n-202 {\n-_\b2_\b0_\b3 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\b _\bA_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b2_\b0_\b4 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename FieldTraits::real_type;\n-205 };\n-206\n-209} // end namespace Dune\n-210\n-211#endif\n-_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n-Helper functions for determining the vector/matrix block level.\n-_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-Implementation of the BCRSMatrix class.\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\b6_\b9 _\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bK_\be_\by& key) const\n+70 {\n+71 return container_[key][_\bi_\bn_\bd_\be_\bx];\n+72 }\n+73\n+_\b7_\b8 _\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp(_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& container)\n+79 : container_(&container)\n+80 {}\n+81\n+_\b8_\b3 _\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp()\n+84 : container_(0)\n+85 {}\n+86\n+87 private:\n+89 _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br* container_;\n+90 };\n+91 }\n+92}\n+93\n+94#endif\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+Reference operator[](const Key &key) const\n+Get the property for a key.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+RandomAccessBundledPropertyMap()\n+The default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:83\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bR_\be_\bf_\be_\br_\be_\bn_\bc_\be\n+R Reference\n+The reference type of the container.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+RandomAccessBundledPropertyMap(Container &container)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bK_\be_\by\n+K Key\n+The key of the property map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+LvaluePropertyMapTag Category\n+The category of the property map.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n+C Container\n+The container that holds the properties.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp_\b:_\b:_\bi_\bn_\bd_\be_\bx\n+@ index\n+The index of the property in the bundle.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:61\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\br_\bo_\bw_\bs_\bi_\bz_\be_\bs\n-void endrowsizes()\n-indicate that size of all rows is defined\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1146\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\ba_\bn_\bd_\bo_\bm\n-@ random\n-Build entries randomly.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:526\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bd_\bd_\bi_\bn_\bd_\be_\bx\n-void addindex(size_type row, size_type col)\n-add index (row,col) to the matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd_\bi_\bn_\bd_\bi_\bc_\be_\bs\n-void endindices()\n-indicate that all indices are defined, check consistency\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-size_type N() const\n-number of rows (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n-void setSize(size_type rows, size_type columns, size_type nnz=0)\n-Set the size of the matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:858\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-BCRSMatrix & operator=(const BCRSMatrix &Mat)\n-assignment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:908\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx\n-A block-tridiagonal matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:31\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx\n-BTDMatrix(size_type size)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bo_\bl_\bv_\be\n-void solve(V &x, const V &rhs) const\n-Use the Thomas algorithm to solve the system Ax=b in O(n) time.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:121\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-implement row_type with compressed vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n-A allocator_type\n-export the allocator type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-B block_type\n-export the type representing the components\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< B >::field_type field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-BTDMatrix & operator=(const BTDMatrix &other)\n-assignment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:104\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx\n-BTDMatrix()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\be_\bt_\bS_\bi_\bz_\be\n-void setSize(size_type size)\n-Resize the matrix. Invalidates the content!\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-typename FieldTraits< field_type >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:204\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bT_\bD_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename BTDMatrix< B, A >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn btdmatrix.hh:203\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bV_\bi_\bs_\bi_\bt_\be_\bd_\bT_\ba_\bg\n+Tag idnetifying the visited property of a vertex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bd_\bo_\bm_\bA_\bc_\bc_\be_\bs_\bs_\bB_\bu_\bn_\bd_\bl_\be_\bd_\bP_\br_\bo_\bp_\be_\br_\bt_\by_\bM_\ba_\bp\n+A property map that extracts one property out of a bundle using operator[]()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn properties.hh:43\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00188.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00188.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: ilu.hh File Reference\n+dune-istl: parameters.hh File Reference\n \n \n \n \n \n \n \n@@ -65,85 +65,67 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n \n-
    ilu.hh File Reference
    \n+Enumerations
    \n+ \n \n
    \n \n-

    The incomplete LU factorization kernels. \n+

    Parameter classes for customizing AMG. \n More...

    \n-
    #include <cmath>
    \n-#include <complex>
    \n-#include <map>
    \n-#include <vector>
    \n-#include <dune/common/fmatrix.hh>
    \n-#include <dune/common/scalarvectorview.hh>
    \n-#include <dune/common/scalarmatrixview.hh>
    \n-#include "istlexception.hh"
    \n+
    #include <cstddef>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    struct  Dune::ILU::CRS< B, Alloc >
     a simple compressed row storage matrix class More...
    class  Dune::Amg::DependencyParameters
     Parameters needed to check whether a node depends on another. More...
     
    class  Dune::Amg::AggregationParameters
     Parameters needed for the aggregation process. More...
     
    class  Dune::Amg::CoarseningParameters
     Parameters for the complete coarsening process. More...
     
    class  Dune::Amg::Parameters
     All parameters for AMG. More...
     
    \n \n \n \n-\n+\n \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::ILU
    namespace  Dune::Amg
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n

    \n-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.
     

    \n+Enumerations

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

    Detailed Description

    \n-

    The incomplete LU factorization kernels.

    \n+

    Parameter classes for customizing AMG.

    \n+
    Author
    Markus Blatt
    \n+

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

    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,67 +1,45 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-ilu.hh File Reference\n-The incomplete LU factorization kernels. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bE_\bn_\bu_\bm_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+parameters.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Parameter classes for customizing AMG. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b<_\b _\bB_\b,_\b _\bA_\bl_\bl_\bo_\bc_\b _\b>\n-\u00a0 a simple compressed row storage matrix class _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+\u00a0 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs needed to check whether a node depends on another. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+\u00a0 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs needed for the aggregation process. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+\u00a0 _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs for the complete coarsening process. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+\u00a0 All parameters for _\bA_\bM_\bG. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn (M &A)\n-\u00a0 compute _\bI_\bL_\bU decomposition of A. A is overwritten by its\n- decomposition\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const M &A, X &v, const Y &d)\n-\u00a0 LU backsolve with stored inverse.\n-\u00a0\n-template\n-M::field_type &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (M &A, typename std::\n- enable_if_t::value > *sfinae=nullptr)\n-\u00a0\n-template\n- K &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (K &A, typename std::\n- enable_if_t< Dune::IsNumber< K >::value > *sfinae=nullptr)\n-\u00a0\n-template\n- K &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx< K, n, m > &A)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn (const M &A, int n, M &ILU)\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bt_\bT_\bo_\bC_\bR_\bS (const M &A, _\bC_\bR_\bS &lower, _\bC_\bR_\bS &upper,\n- InvVector &inv)\n-\u00a0 convert _\bI_\bL_\bU decomposition into _\bC_\bR_\bS format for lower and upper\n- triangular and inverse.\n-\u00a0\n-template\n- void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const _\bC_\bR_\bS &lower, const _\bC_\bR_\bS\n- &upper, const InvVector &inv, X &v, const Y &d)\n-\u00a0 LU backsolve with stored inverse in _\bC_\bR_\bS format for lower and\n- upper triangular.\n+E\bEn\bnu\bum\bme\ber\bra\bat\bti\bio\bon\bns\bs\n+enum \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be { _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bn_\bo_\bA_\bc_\bc_\bu = 0 , _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:\n+ _\ba_\bt_\bO_\bn_\bc_\be_\bA_\bc_\bc_\bu =1 , _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu =2 }\n+\u00a0 Identifiers for the different accumulation modes. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-The incomplete LU factorization kernels.\n+Parameter classes for customizing AMG.\n+ Author\n+ Markus Blatt\n+All parameters of the AMG can be set by using the class Parameter, which can be\n+provided to CoarsenCriterion via its constructor.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00188_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00188_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: ilu.hh Source File\n+dune-istl: parameters.hh Source File\n \n \n \n \n \n \n \n@@ -70,479 +70,414 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    ilu.hh
    \n+
    parameters.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_ILU_HH
    \n-
    6#define DUNE_ISTL_ILU_HH
    \n+
    5#ifndef DUNE_AMG_PARAMETERS_HH
    \n+
    6#define DUNE_AMG_PARAMETERS_HH
    \n
    7
    \n-
    8#include <cmath>
    \n-
    9#include <complex>
    \n-
    10#include <map>
    \n-
    11#include <vector>
    \n-
    12
    \n-
    13#include <dune/common/fmatrix.hh>
    \n-
    14#include <dune/common/scalarvectorview.hh>
    \n-
    15#include <dune/common/scalarmatrixview.hh>
    \n-
    16
    \n-
    17#include "istlexception.hh"
    \n-
    18
    \n-
    23namespace Dune {
    \n-
    24
    \n-
    \n-
    29 namespace ILU {
    \n-
    30
    \n-
    32 template<class M>
    \n-
    \n-\n-
    34 {
    \n-
    35 // iterator types
    \n-
    36 typedef typename M::RowIterator rowiterator;
    \n-
    37 typedef typename M::ColIterator coliterator;
    \n-
    38 typedef typename M::block_type block;
    \n-
    39
    \n-
    40 // implement left looking variant with stored inverse
    \n-
    41 rowiterator endi=A.end();
    \n-
    42 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n+
    8#include <cstddef>
    \n+
    9
    \n+
    10namespace Dune
    \n+
    11{
    \n+
    12 namespace Amg
    \n+
    13 {
    \n+
    \n+\n+
    31 {
    \n+
    32 public:
    \n+
    \n+\n+
    35 : alpha_(1.0/3.0), beta_(1.0E-5)
    \n+
    36 {}
    \n+
    \n+
    37
    \n+
    \n+
    42 void setBeta(double b)
    \n
    43 {
    \n-
    44 // coliterator is diagonal after the following loop
    \n-
    45 coliterator endij=(*i).end(); // end of row i
    \n-
    46 coliterator ij;
    \n-
    47
    \n-
    48 // eliminate entries left of diagonal; store L factor
    \n-
    49 for (ij=(*i).begin(); ij.index()<i.index(); ++ij)
    \n-
    50 {
    \n-
    51 // find A_jj which eliminates A_ij
    \n-
    52 coliterator jj = A[ij.index()].find(ij.index());
    \n-
    53
    \n-
    54 // compute L_ij = A_jj^-1 * A_ij
    \n-
    55 Impl::asMatrix(*ij).rightmultiply(Impl::asMatrix(*jj));
    \n+
    44 beta_ = b;
    \n+
    45 }
    \n+
    \n+
    46
    \n+
    \n+
    52 double beta() const
    \n+
    53 {
    \n+
    54 return beta_;
    \n+
    55 }
    \n+
    \n
    56
    \n-
    57 // modify row
    \n-
    58 coliterator endjk=A[ij.index()].end(); // end of row j
    \n-
    59 coliterator jk=jj; ++jk;
    \n-
    60 coliterator ik=ij; ++ik;
    \n-
    61 while (ik!=endij && jk!=endjk)
    \n-
    62 if (ik.index()==jk.index())
    \n-
    63 {
    \n-
    64 block B(*jk);
    \n-
    65 Impl::asMatrix(B).leftmultiply(Impl::asMatrix(*ij));
    \n-
    66 *ik -= B;
    \n-
    67 ++ik; ++jk;
    \n-
    68 }
    \n-
    69 else
    \n-
    70 {
    \n-
    71 if (ik.index()<jk.index())
    \n-
    72 ++ik;
    \n-
    73 else
    \n-
    74 ++jk;
    \n-
    75 }
    \n-
    76 }
    \n-
    77
    \n-
    78 // invert pivot and store it in A
    \n-
    79 if (ij.index()!=i.index())
    \n-
    80 DUNE_THROW(ISTLError,"diagonal entry missing");
    \n-
    81 try {
    \n-
    82 Impl::asMatrix(*ij).invert(); // compute inverse of diagonal block
    \n-
    83 }
    \n-
    84 catch (Dune::FMatrixError & e) {
    \n-
    85 DUNE_THROW(MatrixBlockError, "ILU failed to invert matrix block A["
    \n-
    86 << i.index() << "][" << ij.index() << "]" << e.what();
    \n-
    87 th__ex.r=i.index(); th__ex.c=ij.index(););
    \n-
    88 }
    \n-
    89 }
    \n-
    90 }
    \n-
    \n-
    91
    \n-
    93 template<class M, class X, class Y>
    \n-
    \n-
    94 void blockILUBacksolve (const M& A, X& v, const Y& d)
    \n-
    95 {
    \n-
    96 // iterator types
    \n-
    97 typedef typename M::ConstRowIterator rowiterator;
    \n-
    98 typedef typename M::ConstColIterator coliterator;
    \n-
    99 typedef typename Y::block_type dblock;
    \n-
    100 typedef typename X::block_type vblock;
    \n-
    101
    \n-
    102 // lower triangular solve
    \n-
    103 rowiterator endi=A.end();
    \n-
    104 for (rowiterator i=A.begin(); i!=endi; ++i)
    \n-
    105 {
    \n-
    106 // We need to be careful here: Directly using
    \n-
    107 // auto rhs = Impl::asVector(d[ i.index() ]);
    \n-
    108 // is not OK in case this is a proxy. Hence
    \n-
    109 // we first have to copy the value. Notice that
    \n-
    110 // this is still not OK, if the vector type itself returns
    \n-
    111 // proxy references.
    \n-
    112 dblock rhsValue(d[i.index()]);
    \n-
    113 auto&& rhs = Impl::asVector(rhsValue);
    \n-
    114 for (coliterator j=(*i).begin(); j.index()<i.index(); ++j)
    \n-
    115 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);
    \n-
    116 Impl::asVector(v[i.index()]) = rhs; // Lii = I
    \n-
    117 }
    \n-
    118
    \n-
    119 // upper triangular solve
    \n-
    120 rowiterator rendi=A.beforeBegin();
    \n-
    121 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)
    \n-
    122 {
    \n-
    123 // We need to be careful here: Directly using
    \n-
    124 // auto rhs = Impl::asVector(v[ i.index() ]);
    \n-
    125 // is not OK in case this is a proxy. Hence
    \n-
    126 // we first have to copy the value. Notice that
    \n-
    127 // this is still not OK, if the vector type itself returns
    \n-
    128 // proxy references.
    \n-
    129 vblock rhsValue(v[i.index()]);
    \n-
    130 auto&& rhs = Impl::asVector(rhsValue);
    \n-
    131 coliterator j;
    \n-
    132 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)
    \n-
    133 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);
    \n-
    134 auto&& vi = Impl::asVector(v[i.index()]);
    \n-
    135 Impl::asMatrix(*j).mv(rhs,vi); // diagonal stores inverse!
    \n+
    \n+
    61 void setAlpha(double a)
    \n+
    62 {
    \n+
    63 alpha_ = a;
    \n+
    64 }
    \n+
    \n+
    65
    \n+
    \n+
    70 double alpha() const
    \n+
    71 {
    \n+
    72 return alpha_;
    \n+
    73 }
    \n+
    \n+
    74
    \n+
    75 private:
    \n+
    76 double alpha_, beta_;
    \n+
    77 };
    \n+
    \n+
    78
    \n+
    \n+\n+\n+
    84 {
    \n+
    85 public:
    \n+
    \n+\n+
    96 : maxDistance_(2), minAggregateSize_(4), maxAggregateSize_(6),
    \n+
    97 connectivity_(15), skipiso_(false)
    \n+
    98 {}
    \n+
    \n+
    99
    \n+
    \n+
    109 void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
    \n+
    110 {
    \n+
    111 maxDistance_=diameter-1;
    \n+
    112 std::size_t csize=1;
    \n+
    113
    \n+
    114 for(; dim>0; dim--) {
    \n+
    115 csize*=diameter;
    \n+
    116 maxDistance_+=diameter-1;
    \n+
    117 }
    \n+
    118 minAggregateSize_=csize;
    \n+
    119 maxAggregateSize_=static_cast<std::size_t>(csize*1.5);
    \n+
    120 }
    \n+
    \n+
    121
    \n+
    \n+
    132 void setDefaultValuesAnisotropic(std::size_t dim,std::size_t diameter=2)
    \n+
    133 {
    \n+
    134 setDefaultValuesIsotropic(dim, diameter);
    \n+
    135 maxDistance_+=dim-1;
    \n
    136 }
    \n-
    137 }
    \n
    \n-
    138
    \n-
    139 // recursive function template to access first entry of a matrix
    \n-
    140 template<class M>
    \n-
    \n-
    141 typename M::field_type& firstMatrixElement (M& A,
    \n-
    142 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr)
    \n-
    143 {
    \n-
    144 return firstMatrixElement(*(A.begin()->begin()));
    \n-
    145 }
    \n-
    \n-
    146
    \n-
    147 template<class K>
    \n-
    \n-\n-
    149 [[maybe_unused]] typename std::enable_if_t<Dune::IsNumber<K>::value>* sfinae = nullptr)
    \n-
    150 {
    \n-
    151 return A;
    \n-
    152 }
    \n-
    \n-
    153
    \n-
    154 template<class K, int n, int m>
    \n-
    \n-\n-
    156 {
    \n-
    157 return A[0][0];
    \n-
    158 }
    \n-
    \n-
    159
    \n-
    166 template<class M>
    \n-
    \n-
    167 void blockILUDecomposition (const M& A, int n, M& ILU)
    \n-
    168 {
    \n-
    169 // iterator types
    \n-
    170 typedef typename M::ColIterator coliterator;
    \n-
    171 typedef typename M::ConstRowIterator crowiterator;
    \n-
    172 typedef typename M::ConstColIterator ccoliterator;
    \n-
    173 typedef typename M::CreateIterator createiterator;
    \n-
    174 typedef typename M::field_type K;
    \n-
    175 typedef std::map<size_t, int> map;
    \n-
    176 typedef typename map::iterator mapiterator;
    \n-
    177
    \n-
    178 // symbolic factorization phase, store generation number in first matrix element
    \n-
    179 crowiterator endi=A.end();
    \n-
    180 createiterator ci=ILU.createbegin();
    \n-
    181 for (crowiterator i=A.begin(); i!=endi; ++i)
    \n-
    182 {
    \n-
    183 map rowpattern; // maps column index to generation
    \n-
    184
    \n-
    185 // initialize pattern with row of A
    \n-
    186 for (ccoliterator j=(*i).begin(); j!=(*i).end(); ++j)
    \n-
    187 rowpattern[j.index()] = 0;
    \n+
    144 std::size_t maxDistance() const { return maxDistance_;}
    \n+
    145
    \n+
    154 void setMaxDistance(std::size_t distance) { maxDistance_ = distance;}
    \n+
    155
    \n+
    \n+
    161 bool skipIsolated() const
    \n+
    162 {
    \n+
    163 return skipiso_;
    \n+
    164 }
    \n+
    \n+
    165
    \n+
    \n+
    171 void setSkipIsolated(bool skip)
    \n+
    172 {
    \n+
    173 skipiso_=skip;
    \n+
    174 }
    \n+
    \n+
    175
    \n+
    180 std::size_t minAggregateSize() const { return minAggregateSize_;}
    \n+
    181
    \n+
    187 void setMinAggregateSize(std::size_t size){ minAggregateSize_=size;}
    \n
    188
    \n-
    189 // eliminate entries in row which are to the left of the diagonal
    \n-
    190 for (mapiterator ik=rowpattern.begin(); (*ik).first<i.index(); ++ik)
    \n-
    191 {
    \n-
    192 if ((*ik).second<n)
    \n-
    193 {
    \n-
    194 coliterator endk = ILU[(*ik).first].end(); // end of row k
    \n-
    195 coliterator kj = ILU[(*ik).first].find((*ik).first); // diagonal in k
    \n-
    196 for (++kj; kj!=endk; ++kj) // row k eliminates in row i
    \n-
    197 {
    \n-
    198 // we misuse the storage to store an int. If the field_type is std::complex, we have to access the real/abs part
    \n-
    199 // starting from C++11, we can use std::abs to always return a real value, even if it is double/float
    \n-
    200 using std::abs;
    \n-
    201 int generation = (int) Simd::lane(0, abs( firstMatrixElement(*kj) ));
    \n-
    202 if (generation<n)
    \n-
    203 {
    \n-
    204 mapiterator ij = rowpattern.find(kj.index());
    \n-
    205 if (ij==rowpattern.end())
    \n-
    206 {
    \n-
    207 rowpattern[kj.index()] = generation+1;
    \n-
    208 }
    \n-
    209 }
    \n-
    210 }
    \n-
    211 }
    \n-
    212 }
    \n-
    213
    \n-
    214 // create row
    \n-
    215 for (mapiterator ik=rowpattern.begin(); ik!=rowpattern.end(); ++ik)
    \n-
    216 ci.insert((*ik).first);
    \n-
    217 ++ci; // now row i exist
    \n-
    218
    \n-
    219 // write generation index into entries
    \n-
    220 coliterator endILUij = ILU[i.index()].end();;
    \n-
    221 for (coliterator ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)
    \n-
    222 Simd::lane(0, firstMatrixElement(*ILUij)) = (Simd::Scalar<K>) rowpattern[ILUij.index()];
    \n-
    223 }
    \n+
    193 std::size_t maxAggregateSize() const { return maxAggregateSize_;}
    \n+
    194
    \n+
    201 void setMaxAggregateSize(std::size_t size){ maxAggregateSize_ = size;}
    \n+
    202
    \n+
    210 std::size_t maxConnectivity() const { return connectivity_;}
    \n+
    211
    \n+
    219 void setMaxConnectivity(std::size_t connectivity){ connectivity_ = connectivity;}
    \n+
    220
    \n+
    221 private:
    \n+
    222 std::size_t maxDistance_, minAggregateSize_, maxAggregateSize_, connectivity_;
    \n+
    223 bool skipiso_;
    \n
    224
    \n-
    225 // copy entries of A
    \n-
    226 for (crowiterator i=A.begin(); i!=endi; ++i)
    \n-
    227 {
    \n-
    228 coliterator ILUij;
    \n-
    229 coliterator endILUij = ILU[i.index()].end();;
    \n-
    230 for (ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)
    \n-
    231 (*ILUij) = 0; // clear row
    \n-
    232 ccoliterator Aij = (*i).begin();
    \n-
    233 ccoliterator endAij = (*i).end();
    \n-
    234 ILUij = ILU[i.index()].begin();
    \n-
    235 while (Aij!=endAij && ILUij!=endILUij)
    \n-
    236 {
    \n-
    237 if (Aij.index()==ILUij.index())
    \n-
    238 {
    \n-
    239 *ILUij = *Aij;
    \n-
    240 ++Aij; ++ILUij;
    \n-
    241 }
    \n-
    242 else
    \n-
    243 {
    \n-
    244 if (Aij.index()<ILUij.index())
    \n-
    245 ++Aij;
    \n-
    246 else
    \n-
    247 ++ILUij;
    \n-
    248 }
    \n-
    249 }
    \n-
    250 }
    \n+
    225 };
    \n+
    \n+
    226
    \n+
    227
    \n+
    \n+\n+\n+\n+\n+
    248 };
    \n+
    \n+
    249
    \n+
    250
    \n
    251
    \n-
    252 // call decomposition on pattern
    \n-\n-
    254 }
    \n-
    \n-
    255
    \n-
    257 template <class B, class Alloc = std::allocator<B>>
    \n-
    \n-
    258 struct CRS
    \n-
    259 {
    \n-
    260 typedef B block_type;
    \n-
    261 typedef size_t size_type;
    \n-
    262
    \n-
    263 CRS() : nRows_( 0 ) {}
    \n-
    264
    \n-
    265 size_type rows() const { return nRows_; }
    \n-
    266
    \n-
    \n-\n-
    268 {
    \n-
    269 assert( rows_[ rows() ] != size_type(-1) );
    \n-
    270 return rows_[ rows() ];
    \n-
    271 }
    \n-
    \n-
    272
    \n-
    \n-
    273 void resize( const size_type nRows )
    \n-
    274 {
    \n-
    275 if( nRows_ != nRows )
    \n-
    276 {
    \n-
    277 nRows_ = nRows ;
    \n-
    278 rows_.resize( nRows_+1, size_type(-1) );
    \n-
    279 }
    \n+
    252
    \n+
    \n+\n+
    257 {
    \n+
    258 public:
    \n+
    \n+
    262 void setMaxLevel(int l)
    \n+
    263 {
    \n+
    264 maxLevel_ = l;
    \n+
    265 }
    \n+
    \n+
    \n+
    269 int maxLevel() const
    \n+
    270 {
    \n+
    271 return maxLevel_;
    \n+
    272 }
    \n+
    \n+
    273
    \n+
    \n+
    277 void setCoarsenTarget(int nodes)
    \n+
    278 {
    \n+
    279 coarsenTarget_ = nodes;
    \n
    280 }
    \n
    \n
    281
    \n-
    \n-\n-
    283 {
    \n-
    284 const size_type needed = values_.size() + nonZeros ;
    \n-
    285 if( values_.capacity() < needed )
    \n-
    286 {
    \n-
    287 const size_type estimate = needed * 1.1;
    \n-
    288 values_.reserve( estimate );
    \n-
    289 cols_.reserve( estimate );
    \n-
    290 }
    \n-
    291 }
    \n-
    \n-
    292
    \n-
    \n-
    293 void push_back( const block_type& value, const size_type index )
    \n-
    294 {
    \n-
    295 values_.push_back( value );
    \n-
    296 cols_.push_back( index );
    \n-
    297 }
    \n-
    \n-
    298
    \n-
    299 std::vector< size_type > rows_;
    \n-
    300 std::vector< block_type, Alloc> values_;
    \n-
    301 std::vector< size_type > cols_;
    \n-\n-
    303 };
    \n-
    \n-
    304
    \n-
    306 template<class M, class CRS, class InvVector>
    \n-
    \n-
    307 void convertToCRS(const M& A, CRS& lower, CRS& upper, InvVector& inv )
    \n-
    308 {
    \n-
    309 typedef typename M :: size_type size_type;
    \n-
    310
    \n-
    311 lower.resize( A.N() );
    \n-
    312 upper.resize( A.N() );
    \n-
    313 inv.resize( A.N() );
    \n-
    314
    \n-
    315 // lower and upper triangular should store half of non zeros minus diagonal
    \n-
    316 const size_t memEstimate = (A.nonzeroes() - A.N())/2;
    \n-
    317
    \n-
    318 assert( A.nonzeroes() != 0 );
    \n-
    319 lower.reserveAdditional( memEstimate );
    \n-
    320 upper.reserveAdditional( memEstimate );
    \n-
    321
    \n-
    322 const auto endi = A.end();
    \n-
    323 size_type row = 0;
    \n-
    324 size_type colcount = 0;
    \n-
    325 lower.rows_[ 0 ] = colcount;
    \n-
    326 for (auto i=A.begin(); i!=endi; ++i, ++row)
    \n-
    327 {
    \n-
    328 const size_type iIndex = i.index();
    \n-
    329
    \n-
    330 // store entries left of diagonal
    \n-
    331 for (auto j=(*i).begin(); j.index() < iIndex; ++j )
    \n-
    332 {
    \n-
    333 lower.push_back( (*j), j.index() );
    \n-
    334 ++colcount;
    \n-
    335 }
    \n-
    336 lower.rows_[ iIndex+1 ] = colcount;
    \n-
    337 }
    \n-
    338
    \n-
    339 const auto rendi = A.beforeBegin();
    \n-
    340 row = 0;
    \n-
    341 colcount = 0;
    \n-
    342 upper.rows_[ 0 ] = colcount ;
    \n-
    343
    \n-
    344 // NOTE: upper and inv store entries in reverse row and col order,
    \n-
    345 // reverse here relative to ILU
    \n-
    346 for (auto i=A.beforeEnd(); i!=rendi; --i, ++ row )
    \n-
    347 {
    \n-
    348 const auto endij=(*i).beforeBegin(); // end of row i
    \n+
    \n+
    285 int coarsenTarget() const
    \n+
    286 {
    \n+
    287 return coarsenTarget_;
    \n+
    288 }
    \n+
    \n+
    289
    \n+
    \n+
    295 void setMinCoarsenRate(double rate)
    \n+
    296 {
    \n+
    297 minCoarsenRate_ = rate;
    \n+
    298 }
    \n+
    \n+
    299
    \n+
    \n+
    303 double minCoarsenRate() const
    \n+
    304 {
    \n+
    305 return minCoarsenRate_;
    \n+
    306 }
    \n+
    \n+
    307
    \n+
    \n+\n+
    312 {
    \n+
    313 return accumulate_;
    \n+
    314 }
    \n+
    \n+
    \n+\n+
    319 {
    \n+
    320 accumulate_=accu;
    \n+
    321 }
    \n+
    \n+
    322
    \n+
    \n+
    323 void setAccumulate(bool accu){
    \n+
    324 accumulate_=accu ? successiveAccu : noAccu;
    \n+
    325 }
    \n+
    \n+
    326
    \n+
    \n+
    330 bool useFixedOrder() const
    \n+
    331 {
    \n+
    332 return useFixedOrder_;
    \n+
    333 }
    \n+
    \n+
    334
    \n+
    \n+\n+
    336 {
    \n+
    337 useFixedOrder_ = useFixedOrder;
    \n+
    338 }
    \n+
    \n+
    339
    \n+
    \n+\n+
    346 {
    \n+
    347 dampingFactor_ = d;
    \n+
    348 }
    \n+
    \n
    349
    \n-
    350 const size_type iIndex = i.index();
    \n-
    351
    \n-
    352 // store in reverse row order for faster access during backsolve
    \n-
    353 for (auto j=(*i).beforeEnd(); j != endij; --j )
    \n-
    354 {
    \n-
    355 const size_type jIndex = j.index();
    \n-
    356 if( j.index() == iIndex )
    \n-
    357 {
    \n-
    358 inv[ row ] = (*j);
    \n-
    359 break; // assuming consecutive ordering of A
    \n-
    360 }
    \n-
    361 else if ( j.index() >= i.index() )
    \n-
    362 {
    \n-
    363 upper.push_back( (*j), jIndex );
    \n-
    364 ++colcount ;
    \n-
    365 }
    \n-
    366 }
    \n-
    367 upper.rows_[ row+1 ] = colcount;
    \n-
    368 }
    \n-
    369 } // end convertToCRS
    \n-
    \n-
    370
    \n-
    372 template<class CRS, class InvVector, class X, class Y>
    \n-
    \n-
    373 void blockILUBacksolve (const CRS& lower,
    \n-
    374 const CRS& upper,
    \n-
    375 const InvVector& inv,
    \n-
    376 X& v, const Y& d)
    \n-
    377 {
    \n-
    378 // iterator types
    \n-
    379 typedef typename Y :: block_type dblock;
    \n-
    380 typedef typename X :: block_type vblock;
    \n-
    381 typedef typename X :: size_type size_type ;
    \n-
    382
    \n-
    383 const size_type iEnd = lower.rows();
    \n-
    384 const size_type lastRow = iEnd - 1;
    \n-
    385 if( iEnd != upper.rows() )
    \n-
    386 {
    \n-
    387 DUNE_THROW(ISTLError,"ILU::blockILUBacksolve: lower and upper rows must be the same");
    \n-
    388 }
    \n-
    389
    \n-
    390 // lower triangular solve
    \n-
    391 for( size_type i=0; i<iEnd; ++ i )
    \n-
    392 {
    \n-
    393 dblock rhsValue( d[ i ] );
    \n-
    394 auto&& rhs = Impl::asVector(rhsValue);
    \n-
    395 const size_type rowI = lower.rows_[ i ];
    \n-
    396 const size_type rowINext = lower.rows_[ i+1 ];
    \n-
    397
    \n-
    398 for( size_type col = rowI; col < rowINext; ++ col )
    \n-
    399 Impl::asMatrix(lower.values_[ col ]).mmv( Impl::asVector(v[ lower.cols_[ col ] ] ), rhs );
    \n-
    400
    \n-
    401 Impl::asVector(v[ i ]) = rhs; // Lii = I
    \n-
    402 }
    \n-
    403
    \n-
    404 // upper triangular solve
    \n-
    405 for( size_type i=0; i<iEnd; ++ i )
    \n-
    406 {
    \n-
    407 auto&& vBlock = Impl::asVector(v[ lastRow - i ]);
    \n-
    408 vblock rhsValue ( v[ lastRow - i ] );
    \n-
    409 auto&& rhs = Impl::asVector(rhsValue);
    \n-
    410 const size_type rowI = upper.rows_[ i ];
    \n-
    411 const size_type rowINext = upper.rows_[ i+1 ];
    \n-
    412
    \n-
    413 for( size_type col = rowI; col < rowINext; ++ col )
    \n-
    414 Impl::asMatrix(upper.values_[ col ]).mmv( Impl::asVector(v[ upper.cols_[ col ] ]), rhs );
    \n-
    415
    \n-
    416 // apply inverse and store result
    \n-
    417 Impl::asMatrix(inv[ i ]).mv(rhs, vBlock);
    \n-
    418 }
    \n-
    419 }
    \n-
    \n-
    420
    \n-
    421 } // end namespace ILU
    \n-
    \n-
    422
    \n-
    425} // end namespace
    \n-
    426
    \n-
    427#endif
    \n-\n-
    Col col
    Definition matrixmatrix.hh:351
    \n+
    \n+\n+
    356 {
    \n+
    357 return dampingFactor_;
    \n+
    358 }
    \n+
    \n+
    \n+\n+
    373 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu,
    \n+
    374 bool useFixedOrder = false)
    \n+
    375 : maxLevel_(maxLevel), coarsenTarget_(coarsenTarget), minCoarsenRate_(minCoarsenRate),
    \n+
    376 dampingFactor_(prolongDamp), accumulate_( accumulate), useFixedOrder_(useFixedOrder)
    \n+
    377 {}
    \n+
    \n+
    378
    \n+
    379 private:
    \n+
    383 int maxLevel_;
    \n+
    387 int coarsenTarget_;
    \n+
    391 double minCoarsenRate_;
    \n+
    395 double dampingFactor_;
    \n+
    400 AccumulationMode accumulate_;
    \n+
    406 bool useFixedOrder_;
    \n+
    407 };
    \n+
    \n+
    408
    \n+
    \n+\n+
    416 {
    \n+
    417 public:
    \n+
    \n+
    424 void setDebugLevel(int level)
    \n+
    425 {
    \n+
    426 debugLevel_ = level;
    \n+
    427 }
    \n+
    \n+
    428
    \n+
    \n+
    434 int debugLevel() const
    \n+
    435 {
    \n+
    436 return debugLevel_;
    \n+
    437 }
    \n+
    \n+
    438
    \n+
    \n+
    443 void setNoPreSmoothSteps(std::size_t steps)
    \n+
    444 {
    \n+
    445 preSmoothSteps_=steps;
    \n+
    446 }
    \n+
    \n+
    \n+
    451 std::size_t getNoPreSmoothSteps() const
    \n+
    452 {
    \n+
    453 return preSmoothSteps_;
    \n+
    454 }
    \n+
    \n+
    455
    \n+
    \n+
    460 void setNoPostSmoothSteps(std::size_t steps)
    \n+
    461 {
    \n+
    462 postSmoothSteps_=steps;
    \n+
    463 }
    \n+
    \n+
    \n+
    468 std::size_t getNoPostSmoothSteps() const
    \n+
    469 {
    \n+
    470 return postSmoothSteps_;
    \n+
    471 }
    \n+
    \n+
    472
    \n+
    \n+
    476 void setGamma(std::size_t gamma)
    \n+
    477 {
    \n+
    478 gamma_=gamma;
    \n+
    479 }
    \n+
    \n+
    \n+
    483 std::size_t getGamma() const
    \n+
    484 {
    \n+
    485 return gamma_;
    \n+
    486 }
    \n+
    \n+
    487
    \n+
    \n+
    492 void setAdditive(bool additive)
    \n+
    493 {
    \n+
    494 additive_=additive;
    \n+
    495 }
    \n+
    \n+
    496
    \n+
    \n+
    501 bool getAdditive() const
    \n+
    502 {
    \n+
    503 return additive_;
    \n+
    504 }
    \n+
    \n+
    505
    \n+
    \n+
    516 Parameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2,
    \n+
    517 double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu, bool useFixedOrder = false)
    \n+\n+
    519 , debugLevel_(2), preSmoothSteps_(2), postSmoothSteps_(2), gamma_(1),
    \n+
    520 additive_(false)
    \n+
    521 {}
    \n+
    \n+
    522 private:
    \n+
    523 int debugLevel_;
    \n+
    524 std::size_t preSmoothSteps_;
    \n+
    525 std::size_t postSmoothSteps_;
    \n+
    526 std::size_t gamma_;
    \n+
    527 bool additive_;
    \n+
    528 };
    \n+
    \n+
    529
    \n+
    530 } //namespace AMG
    \n+
    531
    \n+
    532} //namespace Dune
    \n+
    533#endif
    \n+
    void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2)
    Sets reasonable default values for an anisotropic problem.
    Definition parameters.hh:132
    \n+
    void setAdditive(bool additive)
    Set whether to use additive multigrid.
    Definition parameters.hh:492
    \n+
    void setSkipIsolated(bool skip)
    Set whether isolated aggregates will not be represented on the coarse level.
    Definition parameters.hh:171
    \n+
    void setProlongationDampingFactor(double d)
    Set the damping factor for the prolongation.
    Definition parameters.hh:345
    \n+
    CoarseningParameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu, bool useFixedOrder=false)
    Constructor.
    Definition parameters.hh:372
    \n+
    double alpha() const
    Get the scaling value for marking connections as strong. Default value is 1/3.
    Definition parameters.hh:70
    \n+
    void setMaxAggregateSize(std::size_t size)
    Set the maximum number of nodes a aggregate is allowed to have.
    Definition parameters.hh:201
    \n+
    void setMinCoarsenRate(double rate)
    Set the minimum coarsening rate to be achieved in each coarsening.
    Definition parameters.hh:295
    \n+
    double minCoarsenRate() const
    Get the minimum coarsening rate to be achieved.
    Definition parameters.hh:303
    \n+
    std::size_t maxAggregateSize() const
    Get the maximum number of nodes a aggregate is allowed to have.
    Definition parameters.hh:193
    \n+
    void setAlpha(double a)
    Set the scaling value for marking connections as strong. Default value is 1/3.
    Definition parameters.hh:61
    \n+
    Parameters(int maxLevel=100, int coarsenTarget=1000, double minCoarsenRate=1.2, double prolongDamp=1.6, AccumulationMode accumulate=successiveAccu, bool useFixedOrder=false)
    Constructor.
    Definition parameters.hh:516
    \n+
    double beta() const
    Get the threshold for marking nodes as isolated. The default value is 1.0E-5.
    Definition parameters.hh:52
    \n+
    std::size_t maxConnectivity() const
    Get the maximum number of connections a aggregate is allowed to have.
    Definition parameters.hh:210
    \n+
    int coarsenTarget() const
    Get the maximum number of unknowns allowed on the coarsest level.
    Definition parameters.hh:285
    \n+
    void setAccumulate(AccumulationMode accu)
    Set whether the data should be accumulated on fewer processes on coarser levels.
    Definition parameters.hh:318
    \n+
    double getProlongationDampingFactor() const
    Get the damping factor for the prolongation.
    Definition parameters.hh:355
    \n+
    AccumulationMode accumulate() const
    Whether the data should be accumulated on fewer processes on coarser levels.
    Definition parameters.hh:311
    \n+
    void setUseFixedOrder(bool useFixedOrder)
    Definition parameters.hh:335
    \n+
    bool useFixedOrder() const
    Check if the indices for the coarser levels should be created in a fixed order.
    Definition parameters.hh:330
    \n+
    void setMaxConnectivity(std::size_t connectivity)
    Set the maximum number of connections a aggregate is allowed to have.
    Definition parameters.hh:219
    \n+
    std::size_t minAggregateSize() const
    Get the minimum number of nodes a aggregate has to consist of.
    Definition parameters.hh:180
    \n+
    bool getAdditive() const
    Get whether to use additive multigrid.
    Definition parameters.hh:501
    \n+
    void setMaxLevel(int l)
    Set the maximum number of levels allowed in the hierarchy.
    Definition parameters.hh:262
    \n+
    void setDebugLevel(int level)
    Set the debugging level.
    Definition parameters.hh:424
    \n+
    std::size_t getGamma() const
    Get the value of gamma; 1 for V-cycle, 2 for W-cycle.
    Definition parameters.hh:483
    \n+
    void setNoPostSmoothSteps(std::size_t steps)
    Set the number of postsmoothing steps to apply.
    Definition parameters.hh:460
    \n+
    std::size_t getNoPreSmoothSteps() const
    Get the number of presmoothing steps to apply.
    Definition parameters.hh:451
    \n+
    DependencyParameters()
    Constructor.
    Definition parameters.hh:34
    \n+
    void setMinAggregateSize(std::size_t size)
    Set the minimum number of nodes a aggregate has to consist of.
    Definition parameters.hh:187
    \n+
    int maxLevel() const
    Get the maximum number of levels allowed in the hierarchy.
    Definition parameters.hh:269
    \n+
    void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
    Sets reasonable default values for an isotropic problem.
    Definition parameters.hh:109
    \n+
    AggregationParameters()
    Constructor.
    Definition parameters.hh:95
    \n+
    bool skipIsolated() const
    Whether isolated aggregates will not be represented on the coarse level.
    Definition parameters.hh:161
    \n+
    void setCoarsenTarget(int nodes)
    Set the maximum number of unknowns allowed on the coarsest level.
    Definition parameters.hh:277
    \n+
    void setNoPreSmoothSteps(std::size_t steps)
    Set the number of presmoothing steps to apply.
    Definition parameters.hh:443
    \n+
    AccumulationMode
    Identifiers for the different accumulation modes.
    Definition parameters.hh:231
    \n+
    void setBeta(double b)
    Set threshold for marking nodes as isolated. The default value is 1.0E-5.
    Definition parameters.hh:42
    \n+
    std::size_t maxDistance() const
    Get the maximal distance allowed between two nodes in a aggregate.
    Definition parameters.hh:144
    \n+
    void setGamma(std::size_t gamma)
    Set the value of gamma; 1 for V-cycle, 2 for W-cycle.
    Definition parameters.hh:476
    \n+
    void setAccumulate(bool accu)
    Definition parameters.hh:323
    \n+
    void setMaxDistance(std::size_t distance)
    Set the maximal distance allowed between two nodes in a aggregate.
    Definition parameters.hh:154
    \n+
    int debugLevel() const
    Get the debugging Level.
    Definition parameters.hh:434
    \n+
    std::size_t getNoPostSmoothSteps() const
    Get the number of postsmoothing steps to apply.
    Definition parameters.hh:468
    \n+
    @ atOnceAccu
    Accumulate data to one process at once.
    Definition parameters.hh:243
    \n+
    @ noAccu
    No data accumulution.
    Definition parameters.hh:237
    \n+
    @ successiveAccu
    Successively accumulate to fewer processes.
    Definition parameters.hh:247
    \n
    Definition allocator.hh:11
    \n-
    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
    \n-
    void blockILUBacksolve(const M &A, X &v, const Y &d)
    LU backsolve with stored inverse.
    Definition ilu.hh:94
    \n-
    M::field_type & firstMatrixElement(M &A, typename std::enable_if_t<!Dune::IsNumber< M >::value > *sfinae=nullptr)
    Definition ilu.hh:141
    \n-
    void blockILU0Decomposition(M &A)
    compute ILU decomposition of A. A is overwritten by its decomposition
    Definition ilu.hh:33
    \n-
    void blockILUDecomposition(const M &A, int n, M &ILU)
    Definition ilu.hh:167
    \n-
    a simple compressed row storage matrix class
    Definition ilu.hh:259
    \n-
    std::vector< size_type > cols_
    Definition ilu.hh:301
    \n-
    size_type nonZeros() const
    Definition ilu.hh:267
    \n-
    void resize(const size_type nRows)
    Definition ilu.hh:273
    \n-
    size_type rows() const
    Definition ilu.hh:265
    \n-
    CRS()
    Definition ilu.hh:263
    \n-
    void reserveAdditional(const size_type nonZeros)
    Definition ilu.hh:282
    \n-
    B block_type
    Definition ilu.hh:260
    \n-
    std::vector< block_type, Alloc > values_
    Definition ilu.hh:300
    \n-
    size_type nRows_
    Definition ilu.hh:302
    \n-
    size_t size_type
    Definition ilu.hh:261
    \n-
    std::vector< size_type > rows_
    Definition ilu.hh:299
    \n-
    void push_back(const block_type &value, const size_type index)
    Definition ilu.hh:293
    \n-
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    Error when performing an operation on a matrix block.
    Definition istlexception.hh:52
    \n-
    Definition matrixutils.hh:27
    \n+
    Parameters needed to check whether a node depends on another.
    Definition parameters.hh:31
    \n+
    Parameters needed for the aggregation process.
    Definition parameters.hh:84
    \n+
    Parameters for the complete coarsening process.
    Definition parameters.hh:257
    \n+
    All parameters for AMG.
    Definition parameters.hh:416
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,499 +1,486 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-ilu.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+parameters.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_ILU_HH\n-6#define DUNE_ISTL_ILU_HH\n+5#ifndef DUNE_AMG_PARAMETERS_HH\n+6#define DUNE_AMG_PARAMETERS_HH\n 7\n-8#include \n-9#include \n-10#include \n-11#include \n-12\n-13#include \n-14#include \n-15#include \n-16\n-17#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-18\n-23namespace _\bD_\bu_\bn_\be {\n-24\n-_\b2_\b9 namespace ILU {\n-30\n-32 template\n-_\b3_\b3 void _\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn (M& A)\n-34 {\n-35 // iterator types\n-36 typedef typename M::RowIterator rowiterator;\n-37 typedef typename M::ColIterator coliterator;\n-38 typedef typename M::block_type block;\n-39\n-40 // implement left looking variant with stored inverse\n-41 rowiterator endi=A.end();\n-42 for (rowiterator i=A.begin(); i!=endi; ++i)\n+8#include \n+9\n+10namespace _\bD_\bu_\bn_\be\n+11{\n+12 namespace Amg\n+13 {\n+_\b3_\b0 class _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+31 {\n+32 public:\n+_\b3_\b4 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs()\n+35 : alpha_(1.0/3.0), beta_(1.0E-5)\n+36 {}\n+37\n+_\b4_\b2 void _\bs_\be_\bt_\bB_\be_\bt_\ba(double b)\n 43 {\n-44 // coliterator is diagonal after the following loop\n-45 coliterator endij=(*i).end(); // end of row i\n-46 coliterator ij;\n-47\n-48 // eliminate entries left of diagonal; store L factor\n-49 for (ij=(*i).begin(); ij.index()\n-_\b9_\b4 void _\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const M& A, X& v, const Y& d)\n-95 {\n-96 // iterator types\n-97 typedef typename M::ConstRowIterator rowiterator;\n-98 typedef typename M::ConstColIterator coliterator;\n-99 typedef typename Y::block_type dblock;\n-100 typedef typename X::block_type vblock;\n-101\n-102 // lower triangular solve\n-103 rowiterator endi=A.end();\n-104 for (rowiterator i=A.begin(); i!=endi; ++i)\n-105 {\n-106 // We need to be careful here: Directly using\n-107 // auto rhs = Impl::asVector(d[ i.index() ]);\n-108 // is not OK in case this is a proxy. Hence\n-109 // we first have to copy the value. Notice that\n-110 // this is still not OK, if the vector type itself returns\n-111 // proxy references.\n-112 dblock rhsValue(d[i.index()]);\n-113 auto&& rhs = Impl::asVector(rhsValue);\n-114 for (coliterator j=(*i).begin(); j.index()0; dim--) {\n+115 csize*=diameter;\n+116 maxDistance_+=diameter-1;\n 117 }\n-118\n-119 // upper triangular solve\n-120 rowiterator rendi=A.beforeBegin();\n-121 for (rowiterator i=A.beforeEnd(); i!=rendi; --i)\n-122 {\n-123 // We need to be careful here: Directly using\n-124 // auto rhs = Impl::asVector(v[ i.index() ]);\n-125 // is not OK in case this is a proxy. Hence\n-126 // we first have to copy the value. Notice that\n-127 // this is still not OK, if the vector type itself returns\n-128 // proxy references.\n-129 vblock rhsValue(v[i.index()]);\n-130 auto&& rhs = Impl::asVector(rhsValue);\n-131 coliterator j;\n-132 for (j=(*i).beforeEnd(); j.index()>i.index(); --j)\n-133 Impl::asMatrix(*j).mmv(Impl::asVector(v[j.index()]),rhs);\n-134 auto&& vi = Impl::asVector(v[i.index()]);\n-135 Impl::asMatrix(*j).mv(rhs,vi); // diagonal stores inverse!\n+118 minAggregateSize_=csize;\n+119 maxAggregateSize_=static_cast(csize*1.5);\n+120 }\n+121\n+_\b1_\b3_\b2 void _\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bA_\bn_\bi_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc(std::size_t dim,std::size_t diameter=2)\n+133 {\n+134 _\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bI_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc(dim, diameter);\n+135 maxDistance_+=dim-1;\n 136 }\n-137 }\n-138\n-139 // recursive function template to access first entry of a matrix\n-140 template\n-_\b1_\b4_\b1 typename M::field_type& _\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (M& A,\n-142 [[maybe_unused]] typename std::enable_if_t::value>*\n-sfinae = nullptr)\n-143 {\n-144 return _\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt(*(A.begin()->begin()));\n-145 }\n-146\n-147 template\n-_\b1_\b4_\b8 K& _\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (K& A,\n-149 [[maybe_unused]] typename std::enable_if_t::value>*\n-sfinae = nullptr)\n-150 {\n-151 return A;\n-152 }\n-153\n-154 template\n-_\b1_\b5_\b5 K& _\bf_\bi_\br_\bs_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bl_\be_\bm_\be_\bn_\bt (_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b,_\bm_\b>& A)\n-156 {\n-157 return A[0][0];\n-158 }\n-159\n-166 template\n-_\b1_\b6_\b7 void _\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn (const M& A, int n, M& ILU)\n-168 {\n-169 // iterator types\n-170 typedef typename M::ColIterator coliterator;\n-171 typedef typename M::ConstRowIterator crowiterator;\n-172 typedef typename M::ConstColIterator ccoliterator;\n-173 typedef typename M::CreateIterator createiterator;\n-174 typedef typename M::field_type K;\n-175 typedef std::map map;\n-176 typedef typename map::iterator mapiterator;\n-177\n-178 // symbolic factorization phase, store generation number in first matrix\n-element\n-179 crowiterator endi=A.end();\n-180 createiterator ci=ILU.createbegin();\n-181 for (crowiterator i=A.begin(); i!=endi; ++i)\n-182 {\n-183 map rowpattern; // maps column index to generation\n-184\n-185 // initialize pattern with row of A\n-186 for (ccoliterator j=(*i).begin(); j!=(*i).end(); ++j)\n-187 rowpattern[j.index()] = 0;\n+_\b1_\b4_\b4 std::size_t _\bm_\ba_\bx_\bD_\bi_\bs_\bt_\ba_\bn_\bc_\be() const { return maxDistance_;}\n+145\n+_\b1_\b5_\b4 void _\bs_\be_\bt_\bM_\ba_\bx_\bD_\bi_\bs_\bt_\ba_\bn_\bc_\be(std::size_t distance) { maxDistance_ = distance;}\n+155\n+_\b1_\b6_\b1 bool _\bs_\bk_\bi_\bp_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd() const\n+162 {\n+163 return skipiso_;\n+164 }\n+165\n+_\b1_\b7_\b1 void _\bs_\be_\bt_\bS_\bk_\bi_\bp_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd(bool skip)\n+172 {\n+173 skipiso_=skip;\n+174 }\n+175\n+_\b1_\b8_\b0 std::size_t _\bm_\bi_\bn_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be() const { return minAggregateSize_;}\n+181\n+_\b1_\b8_\b7 void _\bs_\be_\bt_\bM_\bi_\bn_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be(std::size_t size){ minAggregateSize_=size;}\n 188\n-189 // eliminate entries in row which are to the left of the diagonal\n-190 for (mapiterator ik=rowpattern.begin(); (*ik).first) rowpattern\n-[ILUij.index()];\n-223 }\n+_\b1_\b9_\b3 std::size_t _\bm_\ba_\bx_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be() const { return maxAggregateSize_;}\n+194\n+_\b2_\b0_\b1 void _\bs_\be_\bt_\bM_\ba_\bx_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bS_\bi_\bz_\be(std::size_t size){ maxAggregateSize_ = size;}\n+202\n+_\b2_\b1_\b0 std::size_t _\bm_\ba_\bx_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by() const { return connectivity_;}\n+211\n+_\b2_\b1_\b9 void _\bs_\be_\bt_\bM_\ba_\bx_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by(std::size_t connectivity){ connectivity_ =\n+connectivity;}\n+220\n+221 private:\n+222 std::size_t maxDistance_, minAggregateSize_, maxAggregateSize_,\n+connectivity_;\n+223 bool skipiso_;\n 224\n-225 // copy entries of A\n-226 for (crowiterator i=A.begin(); i!=endi; ++i)\n-227 {\n-228 coliterator ILUij;\n-229 coliterator endILUij = ILU[i.index()].end();;\n-230 for (ILUij=ILU[i.index()].begin(); ILUij!=endILUij; ++ILUij)\n-231 (*ILUij) = 0; // clear row\n-232 ccoliterator Aij = (*i).begin();\n-233 ccoliterator endAij = (*i).end();\n-234 ILUij = ILU[i.index()].begin();\n-235 while (Aij!=endAij && ILUij!=endILUij)\n-236 {\n-237 if (Aij.index()==ILUij.index())\n-238 {\n-239 *ILUij = *Aij;\n-240 ++Aij; ++ILUij;\n-241 }\n-242 else\n-243 {\n-244 if (Aij.index()>\n-_\b2_\b5_\b8 struct _\bC_\bR_\bS\n-259 {\n-_\b2_\b6_\b0 typedef B _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-_\b2_\b6_\b1 typedef size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-262\n-_\b2_\b6_\b3 _\bC_\bR_\bS() : _\bn_\bR_\bo_\bw_\bs_\b_( 0 ) {}\n-264\n-_\b2_\b6_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bs() const { return _\bn_\bR_\bo_\bw_\bs_\b_; }\n-266\n-_\b2_\b6_\b7 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn_\bo_\bn_\bZ_\be_\br_\bo_\bs() const\n-268 {\n-269 assert( _\br_\bo_\bw_\bs_\b_[ _\br_\bo_\bw_\bs() ] != _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be(-1) );\n-270 return _\br_\bo_\bw_\bs_\b_[ _\br_\bo_\bw_\bs() ];\n-271 }\n-272\n-_\b2_\b7_\b3 void _\br_\be_\bs_\bi_\bz_\be( const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nRows )\n-274 {\n-275 if( _\bn_\bR_\bo_\bw_\bs_\b_ != nRows )\n-276 {\n-277 _\bn_\bR_\bo_\bw_\bs_\b_ = nRows ;\n-278 _\br_\bo_\bw_\bs_\b_.resize( _\bn_\bR_\bo_\bw_\bs_\b_+1, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be(-1) );\n-279 }\n+252\n+_\b2_\b5_\b6 class _\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs : public _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+257 {\n+258 public:\n+_\b2_\b6_\b2 void _\bs_\be_\bt_\bM_\ba_\bx_\bL_\be_\bv_\be_\bl(int l)\n+263 {\n+264 maxLevel_ = l;\n+265 }\n+_\b2_\b6_\b9 int _\bm_\ba_\bx_\bL_\be_\bv_\be_\bl() const\n+270 {\n+271 return maxLevel_;\n+272 }\n+273\n+_\b2_\b7_\b7 void _\bs_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bn_\bT_\ba_\br_\bg_\be_\bt(int nodes)\n+278 {\n+279 coarsenTarget_ = nodes;\n 280 }\n 281\n-_\b2_\b8_\b2 void _\br_\be_\bs_\be_\br_\bv_\be_\bA_\bd_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl( const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn_\bo_\bn_\bZ_\be_\br_\bo_\bs )\n-283 {\n-284 const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be needed = _\bv_\ba_\bl_\bu_\be_\bs_\b_.size() + _\bn_\bo_\bn_\bZ_\be_\br_\bo_\bs ;\n-285 if( _\bv_\ba_\bl_\bu_\be_\bs_\b_.capacity() < needed )\n+_\b2_\b8_\b5 int _\bc_\bo_\ba_\br_\bs_\be_\bn_\bT_\ba_\br_\bg_\be_\bt() const\n 286 {\n-287 const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be estimate = needed * 1.1;\n-288 _\bv_\ba_\bl_\bu_\be_\bs_\b_.reserve( estimate );\n-289 _\bc_\bo_\bl_\bs_\b_.reserve( estimate );\n-290 }\n-291 }\n-292\n-_\b2_\b9_\b3 void _\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk( const _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be& value, const _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be index )\n-294 {\n-295 _\bv_\ba_\bl_\bu_\be_\bs_\b_.push_back( value );\n-296 _\bc_\bo_\bl_\bs_\b_.push_back( index );\n-297 }\n-298\n-_\b2_\b9_\b9 std::vector< size_type > _\br_\bo_\bw_\bs_\b_;\n-_\b3_\b0_\b0 std::vector< block_type, Alloc> _\bv_\ba_\bl_\bu_\be_\bs_\b_;\n-_\b3_\b0_\b1 std::vector< size_type > _\bc_\bo_\bl_\bs_\b_;\n-_\b3_\b0_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bn_\bR_\bo_\bw_\bs_\b_;\n-303 };\n-304\n-306 template\n-_\b3_\b0_\b7 void _\bc_\bo_\bn_\bv_\be_\br_\bt_\bT_\bo_\bC_\bR_\bS(const M& A, _\bC_\bR_\bS& lower, _\bC_\bR_\bS& upper, InvVector& inv )\n-308 {\n-309 typedef typename M :: size_type size_type;\n-310\n-311 lower._\br_\be_\bs_\bi_\bz_\be( A.N() );\n-312 upper._\br_\be_\bs_\bi_\bz_\be( A.N() );\n-313 inv.resize( A.N() );\n-314\n-315 // lower and upper triangular should store half of non zeros minus diagonal\n-316 const size_t memEstimate = (A.nonzeroes() - A.N())/2;\n-317\n-318 assert( A.nonzeroes() != 0 );\n-319 lower._\br_\be_\bs_\be_\br_\bv_\be_\bA_\bd_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl( memEstimate );\n-320 upper._\br_\be_\bs_\be_\br_\bv_\be_\bA_\bd_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl( memEstimate );\n-321\n-322 const auto endi = A.end();\n-323 size_type row = 0;\n-324 size_type colcount = 0;\n-325 lower._\br_\bo_\bw_\bs_\b_[ 0 ] = colcount;\n-326 for (auto i=A.begin(); i!=endi; ++i, ++row)\n-327 {\n-328 const size_type iIndex = i.index();\n-329\n-330 // store entries left of diagonal\n-331 for (auto j=(*i).begin(); j.index() < iIndex; ++j )\n-332 {\n-333 lower._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk( (*j), j.index() );\n-334 ++colcount;\n-335 }\n-336 lower._\br_\bo_\bw_\bs_\b_[ iIndex+1 ] = colcount;\n-337 }\n-338\n-339 const auto rendi = A.beforeBegin();\n-340 row = 0;\n-341 colcount = 0;\n-342 upper._\br_\bo_\bw_\bs_\b_[ 0 ] = colcount ;\n-343\n-344 // NOTE: upper and inv store entries in reverse row and col order,\n-345 // reverse here relative to ILU\n-346 for (auto i=A.beforeEnd(); i!=rendi; --i, ++ row )\n-347 {\n-348 const auto endij=(*i).beforeBegin(); // end of row i\n+287 return coarsenTarget_;\n+288 }\n+289\n+_\b2_\b9_\b5 void _\bs_\be_\bt_\bM_\bi_\bn_\bC_\bo_\ba_\br_\bs_\be_\bn_\bR_\ba_\bt_\be(double rate)\n+296 {\n+297 minCoarsenRate_ = rate;\n+298 }\n+299\n+_\b3_\b0_\b3 double _\bm_\bi_\bn_\bC_\bo_\ba_\br_\bs_\be_\bn_\bR_\ba_\bt_\be() const\n+304 {\n+305 return minCoarsenRate_;\n+306 }\n+307\n+_\b3_\b1_\b1 _\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be _\ba_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be() const\n+312 {\n+313 return accumulate_;\n+314 }\n+_\b3_\b1_\b8 void _\bs_\be_\bt_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be(_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be accu)\n+319 {\n+320 accumulate_=accu;\n+321 }\n+322\n+_\b3_\b2_\b3 void _\bs_\be_\bt_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\be(bool accu){\n+324 accumulate_=accu ? _\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu : _\bn_\bo_\bA_\bc_\bc_\bu;\n+325 }\n+326\n+_\b3_\b3_\b0 bool _\bu_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br() const\n+331 {\n+332 return useFixedOrder_;\n+333 }\n+334\n+_\b3_\b3_\b5 void _\bs_\be_\bt_\bU_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br(bool _\bu_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br)\n+336 {\n+337 useFixedOrder_ = _\bu_\bs_\be_\bF_\bi_\bx_\be_\bd_\bO_\br_\bd_\be_\br;\n+338 }\n+339\n+_\b3_\b4_\b5 void _\bs_\be_\bt_\bP_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\bi_\bo_\bn_\bD_\ba_\bm_\bp_\bi_\bn_\bg_\bF_\ba_\bc_\bt_\bo_\br(double d)\n+346 {\n+347 dampingFactor_ = d;\n+348 }\n 349\n-350 const size_type iIndex = i.index();\n-351\n-352 // store in reverse row order for faster access during backsolve\n-353 for (auto j=(*i).beforeEnd(); j != endij; --j )\n-354 {\n-355 const size_type jIndex = j.index();\n-356 if( j.index() == iIndex )\n-357 {\n-358 inv[ row ] = (*j);\n-359 break; // assuming consecutive ordering of A\n-360 }\n-361 else if ( j.index() >= i.index() )\n-362 {\n-363 upper._\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk( (*j), jIndex );\n-364 ++colcount ;\n-365 }\n-366 }\n-367 upper._\br_\bo_\bw_\bs_\b_[ row+1 ] = colcount;\n-368 }\n-369 } // end convertToCRS\n-370\n-372 template\n-_\b3_\b7_\b3 void _\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bB_\ba_\bc_\bk_\bs_\bo_\bl_\bv_\be (const _\bC_\bR_\bS& lower,\n-374 const _\bC_\bR_\bS& upper,\n-375 const InvVector& inv,\n-376 X& v, const Y& d)\n-377 {\n-378 // iterator types\n-379 typedef typename Y :: block_type dblock;\n-380 typedef typename X :: block_type vblock;\n-381 typedef typename X :: size_type size_type ;\n-382\n-383 const size_type iEnd = lower._\br_\bo_\bw_\bs();\n-384 const size_type lastRow = iEnd - 1;\n-385 if( iEnd != upper._\br_\bo_\bw_\bs() )\n-386 {\n-387 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"ILU::blockILUBacksolve: lower and upper rows must be\n-the same\");\n-388 }\n-389\n-390 // lower triangular solve\n-391 for( size_type i=0; i::value > *sfinae=nullptr)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:141\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\b0_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-void blockILU0Decomposition(M &A)\n-compute ILU decomposition of A. A is overwritten by its decomposition\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:33\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\bI_\bL_\bU_\bD_\be_\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\bi_\bo_\bn\n-void blockILUDecomposition(const M &A, int n, M &ILU)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:167\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS\n-a simple compressed row storage matrix class\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:259\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bc_\bo_\bl_\bs_\b_\n-std::vector< size_type > cols_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:301\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bn_\bo_\bn_\bZ_\be_\br_\bo_\bs\n-size_type nonZeros() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:267\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-void resize(const size_type nRows)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:273\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\br_\bo_\bw_\bs\n-size_type rows() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:265\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bC_\bR_\bS\n-CRS()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:263\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\br_\be_\bs_\be_\br_\bv_\be_\bA_\bd_\bd_\bi_\bt_\bi_\bo_\bn_\ba_\bl\n-void reserveAdditional(const size_type nonZeros)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:282\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-B block_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:260\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bv_\ba_\bl_\bu_\be_\bs_\b_\n-std::vector< block_type, Alloc > values_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:300\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bn_\bR_\bo_\bw_\bs_\b_\n-size_type nRows_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:302\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-size_t size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:261\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\br_\bo_\bw_\bs_\b_\n-std::vector< size_type > rows_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bL_\bU_\b:_\b:_\bC_\bR_\bS_\b:_\b:_\bp_\bu_\bs_\bh_\b__\bb_\ba_\bc_\bk\n-void push_back(const block_type &value, const size_type index)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ilu.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-derive error class from the base class in common\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bB_\bl_\bo_\bc_\bk_\bE_\br_\br_\bo_\br\n-Error when performing an operation on a matrix block.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+Parameters needed to check whether a node depends on another.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:31\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+Parameters needed for the aggregation process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bi_\bn_\bg_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+Parameters for the complete coarsening process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:257\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+All parameters for AMG.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00191.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00191.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: multitypeblockvector.hh File Reference\n+dune-istl: amg.hh File Reference\n \n \n \n \n \n \n \n@@ -65,67 +65,79 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n \n-
    multitypeblockvector.hh File Reference
    \n+ \n
    \n
    \n-
    #include <cmath>
    \n-#include <iostream>
    \n-#include <tuple>
    \n-#include <dune/common/dotproduct.hh>
    \n-#include <dune/common/ftraits.hh>
    \n-#include <dune/common/hybridutilities.hh>
    \n+\n+

    The AMG preconditioner. \n+More...

    \n+
    #include <memory>
    \n+#include <sstream>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/istl/paamg/smoother.hh>
    \n+#include <dune/istl/paamg/transfer.hh>
    \n+#include <dune/istl/paamg/matrixhierarchy.hh>
    \n+#include <dune/istl/solvers.hh>
    \n+#include <dune/istl/scalarproducts.hh>
    \n+#include <dune/istl/superlu.hh>
    \n+#include <dune/istl/umfpack.hh>
    \n+#include <dune/istl/solvertype.hh>
    \n #include <dune/common/typetraits.hh>
    \n-#include <dune/common/std/type_traits.hh>
    \n-#include "istlexception.hh"
    \n-#include "gsetc.hh"
    \n+#include <dune/common/scalarvectorview.hh>
    \n+#include <dune/common/scalarmatrixview.hh>
    \n+#include <dune/common/parametertree.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n

    \n Classes

    struct  Dune::FieldTraits< MultiTypeBlockVector< Args... > >
    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 >
     
    class  Dune::MultiTypeBlockVector< Args >
     A Vector class to support different block types. More...
    struct  Dune::AMGCreator
     
    struct  std::tuple_element< i, Dune::MultiTypeBlockVector< Args... > >
     Make std::tuple_element work for MultiTypeBlockVector. More...
    struct  Dune::AMGCreator::isValidBlockType< class >
     
    struct  std::tuple_size< Dune::MultiTypeBlockVector< Args... > >
     Make std::tuple_size work for MultiTypeBlockVector. More...
    struct  Dune::AMGCreator::isValidBlockType< FieldMatrix< T, n, m > >
     
    \n \n \n \n-\n-\n+\n \n

    \n Namespaces

    namespace  Dune
     
    namespace  std
     STL namespace.
    namespace  Dune::Amg
     
    \n \n-\n-\n-\n-\n+\n+\n

    \n Functions

    template<typename... Args>
    std::ostream & Dune::operator<< (std::ostream &s, const MultiTypeBlockVector< Args... > &v)
     Send MultiTypeBlockVector to an outstream.
     
     Dune::DUNE_REGISTER_PRECONDITIONER ("amg", AMGCreator())
     
    \n-
    \n+

    Detailed Description

    \n+

    The AMG preconditioner.

    \n+
    Author
    Markus Blatt
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,45 +1,60 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n+ * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-multitypeblockvector.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+amg.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+The AMG preconditioner. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n #include \n-#include \n-#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bS_\b,_\b _\bP_\bI_\b,_\b _\bA_\b _\b>\n+\u00a0 Parallel algebraic multigrid based on agglomeration. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b _\b>\n-\u00a0 A Vector class to support different block types. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\b>\n \u00a0\n-struct \u00a0 _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n-\u00a0 Make std::tuple_element work for MultiTypeBlockVector. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\b>_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,\n+ _\bS_\bo_\bl_\bv_\be_\br_\bT_\by_\bp_\be_\b _\b>\n \u00a0\n-struct \u00a0 _\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\bs_\bi_\bz_\be_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>\n-\u00a0 Make std::tuple_size work for MultiTypeBlockVector. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\b>_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bs_\bu_\bp_\be_\br_\bl_\bu\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be_\b<_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bs_\bt_\bd\n-\u00a0 STL namespace.\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &s, const _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br<\n- Args... > &v)\n-\u00a0 Send _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br to an outstream.\n+\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR (\"amg\", _\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br())\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+The AMG preconditioner.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00191_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00191_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: multitypeblockvector.hh Source File\n+dune-istl: amg.hh Source File\n \n \n \n \n \n \n \n@@ -70,358 +70,1279 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    multitypeblockvector.hh
    \n+
    amg.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH
    \n-
    6#define DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH
    \n+
    5#ifndef DUNE_AMG_AMG_HH
    \n+
    6#define DUNE_AMG_AMG_HH
    \n
    7
    \n-
    8#include <cmath>
    \n-
    9#include <iostream>
    \n-
    10#include <tuple>
    \n-
    11
    \n-
    12#include <dune/common/dotproduct.hh>
    \n-
    13#include <dune/common/ftraits.hh>
    \n-
    14#include <dune/common/hybridutilities.hh>
    \n-
    15#include <dune/common/typetraits.hh>
    \n-
    16#include <dune/common/std/type_traits.hh>
    \n-
    17
    \n-
    18#include "istlexception.hh"
    \n-
    19
    \n-
    20// forward declaration
    \n-
    21namespace Dune {
    \n-
    22 template < typename... Args >
    \n-
    23 class MultiTypeBlockVector;
    \n-
    24}
    \n-
    25
    \n-
    26#include "gsetc.hh"
    \n-
    27
    \n-
    28namespace Dune {
    \n-
    29
    \n-
    41 template <typename... Args>
    \n-
    \n-
    42 struct FieldTraits< MultiTypeBlockVector<Args...> >
    \n-
    43 {
    \n-
    44 using field_type = typename MultiTypeBlockVector<Args...>::field_type;
    \n-
    45 using real_type = typename MultiTypeBlockVector<Args...>::real_type;
    \n-
    46 };
    \n-
    \n-
    56 template < typename... Args >
    \n-
    \n-\n-
    58 : public std::tuple<Args...>
    \n-
    59 {
    \n-
    61 typedef std::tuple<Args...> TupleType;
    \n-
    62 public:
    \n-
    63
    \n-
    65 using size_type = std::size_t;
    \n-
    66
    \n-
    70 using TupleType::TupleType;
    \n-
    71
    \n-
    75 typedef MultiTypeBlockVector<Args...> type;
    \n-
    76
    \n-
    82 using field_type = Std::detected_t<std::common_type_t, typename FieldTraits< std::decay_t<Args> >::field_type...>;
    \n-
    83
    \n-
    89 using real_type = Std::detected_t<std::common_type_t, typename FieldTraits< std::decay_t<Args> >::real_type...>;
    \n-
    90
    \n-
    91 // make sure that we have an std::common_type: using an assertion produces a more readable error message
    \n-
    92 // than a compiler template instantiation error
    \n-
    93 static_assert ( sizeof...(Args) == 0 or
    \n-
    94 not (std::is_same_v<field_type, Std::nonesuch> or std::is_same_v<real_type, Std::nonesuch>),
    \n-
    95 "No std::common_type implemented for the given field_type/real_type of the Args. Please provide an implementation and check that a FieldTraits class is present for your type.");
    \n-
    96
    \n-
    97
    \n-
    \n-
    103 static constexpr size_type size()
    \n-
    104 {
    \n-
    105 return sizeof...(Args);
    \n-
    106 }
    \n-
    \n-
    107
    \n-
    \n-
    110 static constexpr size_type N()
    \n-
    111 {
    \n-
    112 return sizeof...(Args);
    \n-
    113 }
    \n-
    \n-
    114
    \n-
    \n-\n-
    117 {
    \n-
    118 size_type result = 0;
    \n-
    119 Hybrid::forEach(std::make_index_sequence<N()>{},
    \n-
    120 [&](auto i){result += std::get<i>(*this).dim();});
    \n-
    121
    \n-
    122 return result;
    \n-
    123 }
    \n-
    \n-
    124
    \n-
    143 template< size_type index >
    \n-
    144 typename std::tuple_element<index,TupleType>::type&
    \n-
    \n-
    145 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable)
    \n-
    146 {
    \n-
    147 return std::get<index>(*this);
    \n-
    148 }
    \n-
    \n-
    149
    \n-
    155 template< size_type index >
    \n-
    156 const typename std::tuple_element<index,TupleType>::type&
    \n-
    \n-
    157 operator[] ([[maybe_unused]] const std::integral_constant< size_type, index > indexVariable) const
    \n-
    158 {
    \n-
    159 return std::get<index>(*this);
    \n-
    160 }
    \n-
    \n-
    161
    \n-
    164 template<typename T>
    \n-
    \n-
    165 void operator= (const T& newval) {
    \n-
    166 Dune::Hybrid::forEach(*this, [&](auto&& entry) {
    \n-
    167 entry = newval;
    \n-
    168 });
    \n-
    169 }
    \n-
    \n-
    170
    \n-
    \n-
    174 void operator+= (const type& newv) {
    \n-
    175 using namespace Dune::Hybrid;
    \n-
    176 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
    \n-
    177 (*this)[i] += newv[i];
    \n-
    178 });
    \n-
    179 }
    \n-
    \n-
    180
    \n-
    \n-
    184 void operator-= (const type& newv) {
    \n-
    185 using namespace Dune::Hybrid;
    \n-
    186 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
    \n-
    187 (*this)[i] -= newv[i];
    \n-
    188 });
    \n-
    189 }
    \n-
    \n-
    190
    \n-
    192 template<class T,
    \n-
    193 std::enable_if_t< IsNumber<T>::value, int> = 0>
    \n+
    8#include <memory>
    \n+
    9#include <sstream>
    \n+
    10#include <dune/common/exceptions.hh>
    \n+\n+\n+\n+
    14#include <dune/istl/solvers.hh>
    \n+\n+
    16#include <dune/istl/superlu.hh>
    \n+
    17#include <dune/istl/umfpack.hh>
    \n+\n+
    19#include <dune/common/typetraits.hh>
    \n+
    20#include <dune/common/exceptions.hh>
    \n+
    21#include <dune/common/scalarvectorview.hh>
    \n+
    22#include <dune/common/scalarmatrixview.hh>
    \n+
    23#include <dune/common/parametertree.hh>
    \n+
    24
    \n+
    25namespace Dune
    \n+
    26{
    \n+
    27 namespace Amg
    \n+
    28 {
    \n+
    46 template<class M, class X, class S, class P, class K, class A>
    \n+
    47 class KAMG;
    \n+
    48
    \n+
    49 template<class T>
    \n+
    50 class KAmgTwoGrid;
    \n+
    51
    \n+
    62 template<class M, class X, class S, class PI=SequentialInformation,
    \n+
    63 class A=std::allocator<X> >
    \n+
    \n+
    64 class AMG : public Preconditioner<X,X>
    \n+
    65 {
    \n+
    66 template<class M1, class X1, class S1, class P1, class K1, class A1>
    \n+
    67 friend class KAMG;
    \n+
    68
    \n+
    69 friend class KAmgTwoGrid<AMG>;
    \n+
    70
    \n+
    71 public:
    \n+
    73 typedef M Operator;
    \n+\n+\n+\n+
    85
    \n+
    87 typedef X Domain;
    \n+
    89 typedef X Range;
    \n+\n+
    97 typedef S Smoother;
    \n+
    98
    \n+\n+
    101
    \n+
    \n+
    111 AMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
    \n+
    112 const SmootherArgs& smootherArgs, const Parameters& parms);
    \n+
    113
    \n+
    125 template<class C>
    \n+
    \n+
    126 AMG(const Operator& fineOperator, const C& criterion,
    \n+
    127 const SmootherArgs& smootherArgs=SmootherArgs(),
    \n+\n+
    129
    \n+
    \n+
    180 AMG(std::shared_ptr<const Operator> fineOperator, const ParameterTree& configuration, const ParallelInformation& pinfo=ParallelInformation());
    \n+
    181
    \n+
    \n+
    185 AMG(const AMG& amg);
    \n+
    186
    \n+
    \n+
    188 void pre(Domain& x, Range& b);
    \n+
    189
    \n+
    \n+
    191 void apply(Domain& v, const Range& d);
    \n+
    192
    \n
    \n-
    194 void operator*= (const T& w) {
    \n-
    195 Hybrid::forEach(*this, [&](auto&& entry) {
    \n-
    196 entry *= w;
    \n-
    197 });
    \n-
    198 }
    \n-
    \n-
    199
    \n-
    201 template<class T,
    \n-
    202 std::enable_if_t< IsNumber<T>::value, int> = 0>
    \n-
    \n-
    203 void operator/= (const T& w) {
    \n-
    204 Hybrid::forEach(*this, [&](auto&& entry) {
    \n-
    205 entry /= w;
    \n-
    206 });
    \n-
    207 }
    \n-
    \n+\n+
    195 {
    \n+
    196 return category_;
    \n+
    197 }
    \n+
    \n+
    198
    \n+
    \n+
    200 void post(Domain& x);
    \n+
    201
    \n+
    206 template<class A1>
    \n+
    \n+
    207 void getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont);
    \n
    208
    \n
    \n-
    209 field_type operator* (const type& newv) const {
    \n-
    210 using namespace Dune::Hybrid;
    \n-
    211 return accumulate(integralRange(Hybrid::size(*this)), field_type(0), [&](auto&& a, auto&& i) {
    \n-
    212 return a + (*this)[i]*newv[i];
    \n-
    213 });
    \n-
    214 }
    \n-
    \n-
    215
    \n-
    \n-
    216 field_type dot (const type& newv) const {
    \n-
    217 using namespace Dune::Hybrid;
    \n-
    218 return accumulate(integralRange(Hybrid::size(*this)), field_type(0), [&](auto&& a, auto&& i) {
    \n-
    219 return a + (*this)[i].dot(newv[i]);
    \n-
    220 });
    \n-
    221 }
    \n-
    \n-
    222
    \n-
    \n-
    225 auto one_norm() const {
    \n-
    226 using namespace Dune::Hybrid;
    \n-
    227 return accumulate(*this, real_type(0), [&](auto&& a, auto&& entry) {
    \n-
    228 return a + entry.one_norm();
    \n-
    229 });
    \n-
    230 }
    \n-
    \n+
    209 std::size_t levels();
    \n+
    210
    \n+
    \n+
    211 std::size_t maxlevels();
    \n+
    212
    \n+
    \n+\n+
    222 {
    \n+
    223 matrices_->recalculateGalerkin(NegateSet<typename PI::OwnerSet>());
    \n+
    224 }
    \n+
    \n+
    225
    \n+
    \n+\n
    231
    \n-
    \n-
    234 auto one_norm_real() const {
    \n-
    235 using namespace Dune::Hybrid;
    \n-
    236 return accumulate(*this, real_type(0), [&](auto&& a, auto&& entry) {
    \n-
    237 return a + entry.one_norm_real();
    \n-
    238 });
    \n-
    239 }
    \n-
    \n-
    240
    \n-
    \n-\n-
    244 using namespace Dune::Hybrid;
    \n-
    245 return accumulate(*this, real_type(0), [&](auto&& a, auto&& entry) {
    \n-
    246 return a + entry.two_norm2();
    \n-
    247 });
    \n-
    248 }
    \n-
    \n-
    249
    \n-
    252 real_type two_norm() const {return sqrt(this->two_norm2());}
    \n-
    253
    \n-
    \n-\n-
    257 {
    \n-
    258 using namespace Dune::Hybrid;
    \n-
    259 using std::max;
    \n-
    260
    \n-
    261 real_type result = 0.0;
    \n-
    262 // Compute max norm tracking appearing nan values
    \n-
    263 // if the field type supports nan.
    \n-
    264 if constexpr (HasNaN<field_type>()) {
    \n-
    265 // This variable will preserve any nan value
    \n-
    266 real_type nanTracker = 1.0;
    \n-
    267 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    268 forEach(*this, [&](auto&& entry) {
    \n-
    269 real_type entryNorm = entry.infinity_norm();
    \n-
    270 result = max(entryNorm, result);
    \n-
    271 nanTracker += entryNorm;
    \n-
    272 });
    \n-
    273 // Incorporate possible nan value into result
    \n-
    274 result *= (nanTracker / nanTracker);
    \n-
    275 } else {
    \n-
    276 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    277 forEach(*this, [&](auto&& entry) {
    \n-
    278 result = max(entry.infinity_norm(), result);
    \n-
    279 });
    \n-
    280 }
    \n-
    281 return result;
    \n-
    282 }
    \n-
    \n-
    283
    \n-
    \n-\n-
    287 {
    \n-
    288 using namespace Dune::Hybrid;
    \n-
    289 using std::max;
    \n-
    290
    \n-
    291 real_type result = 0.0;
    \n-
    292 // Compute max norm tracking appearing nan values
    \n-
    293 // if the field type supports nan.
    \n-
    294 if constexpr (HasNaN<field_type>()) {
    \n-
    295 // This variable will preserve any nan value
    \n-
    296 real_type nanTracker = 1.0;
    \n-
    297 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    298 forEach(*this, [&](auto&& entry) {
    \n-
    299 real_type entryNorm = entry.infinity_norm_real();
    \n-
    300 result = max(entryNorm, result);
    \n-
    301 nanTracker += entryNorm;
    \n-
    302 });
    \n-
    303 // Incorporate possible nan value into result
    \n-
    304 result *= (nanTracker / nanTracker);
    \n-
    305 } else {
    \n-
    306 using namespace Dune::Hybrid; // needed for icc, see issue #31
    \n-
    307 forEach(*this, [&](auto&& entry) {
    \n-
    308 result = max(entry.infinity_norm_real(), result);
    \n-
    309 });
    \n-
    310 }
    \n-
    311 return result;
    \n-
    312 }
    \n-
    \n+
    232 private:
    \n+
    233 /*
    \n+
    234 * @brief Helper function to create hierarchies with parameter tree.
    \n+
    235 *
    \n+
    236 * Will create the coarsen criterion with the norm and create the
    \n+
    237 * Hierarchies
    \n+
    238 * \\tparam Norm Type of the norm to use.
    \n+
    239 */
    \n+
    240 template<class Norm>
    \n+
    241 void createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr,
    \n+
    242 const PI& pinfo, const Norm&,
    \n+
    243 const ParameterTree& configuration,
    \n+
    244 std::true_type compiles = std::true_type());
    \n+
    245 template<class Norm>
    \n+
    246 void createCriterionAndHierarchies(std::shared_ptr<const Operator> matrixptr,
    \n+
    247 const PI& pinfo, const Norm&,
    \n+
    248 const ParameterTree& configuration,
    \n+
    249 std::false_type);
    \n+
    254 template<class C>
    \n+
    255 void createHierarchies(C& criterion, std::shared_ptr<const Operator> matrixptr,
    \n+
    256 const PI& pinfo, const ParameterTree& configuration);
    \n+
    263 template<class C>
    \n+
    264 void createHierarchies(C& criterion,
    \n+
    265 const std::shared_ptr<const Operator>& matrixptr,
    \n+
    266 const PI& pinfo);
    \n+
    273 struct LevelContext
    \n+
    274 {
    \n+\n+\n+
    283 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix;
    \n+\n+
    291 typename OperatorHierarchy::RedistributeInfoList::const_iterator redist;
    \n+
    295 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates;
    \n+\n+\n+\n+
    311 std::size_t level;
    \n+
    312 };
    \n
    313
    \n-
    318 template<typename Ta>
    \n-
    \n-
    319 void axpy (const Ta& a, const type& y) {
    \n-
    320 using namespace Dune::Hybrid;
    \n-
    321 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {
    \n-
    322 (*this)[i].axpy(a, y[i]);
    \n-
    323 });
    \n-
    324 }
    \n-
    \n-
    325
    \n-
    326 };
    \n-
    \n-
    327
    \n-
    328
    \n-
    329
    \n-
    332 template <typename... Args>
    \n-
    \n-
    333 std::ostream& operator<< (std::ostream& s, const MultiTypeBlockVector<Args...>& v) {
    \n-
    334 using namespace Dune::Hybrid;
    \n-
    335 forEach(integralRange(Dune::Hybrid::size(v)), [&](auto&& i) {
    \n-
    336 s << "\\t(" << i << "):\\n" << v[i] << "\\n";
    \n-
    337 });
    \n-
    338 return s;
    \n-
    339 }
    \n-
    \n-
    340
    \n-
    341} // end namespace Dune
    \n+
    314
    \n+
    319 void mgc(LevelContext& levelContext);
    \n+
    320
    \n+
    321 void additiveMgc();
    \n+
    322
    \n+
    329 void moveToFineLevel(LevelContext& levelContext,bool processedFineLevel);
    \n+
    330
    \n+
    335 bool moveToCoarseLevel(LevelContext& levelContext);
    \n+
    336
    \n+
    341 void initIteratorsWithFineLevel(LevelContext& levelContext);
    \n
    342
    \n-
    343namespace std
    \n-
    344{
    \n-
    349 template <size_t i, typename... Args>
    \n-
    \n-
    350 struct tuple_element<i,Dune::MultiTypeBlockVector<Args...> >
    \n-
    351 {
    \n-
    352 using type = typename std::tuple_element<i, std::tuple<Args...> >::type;
    \n-
    353 };
    \n-
    \n-
    354
    \n-
    359 template <typename... Args>
    \n-
    \n-
    360 struct tuple_size<Dune::MultiTypeBlockVector<Args...> >
    \n-
    361 : std::integral_constant<std::size_t, sizeof...(Args)>
    \n-
    362 {};
    \n-
    \n-
    363}
    \n-
    364
    \n-
    365#endif
    \n-
    Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a generic way.
    \n-\n-
    void operator=(const T &newval)
    Assignment operator.
    Definition multitypeblockvector.hh:165
    \n-
    std::size_t size_type
    Type used for vector sizes.
    Definition multitypeblockvector.hh:65
    \n-
    static constexpr size_type N()
    Number of elements.
    Definition multitypeblockvector.hh:110
    \n-
    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
    \n-
    static constexpr size_type size()
    Return the number of non-zero vector entries.
    Definition multitypeblockvector.hh:103
    \n-
    std::tuple_element< index, TupleType >::type & operator[](const std::integral_constant< size_type, index > indexVariable)
    Random-access operator.
    Definition multitypeblockvector.hh:145
    \n-
    typename MultiTypeBlockVector< Args... >::field_type field_type
    Definition multitypeblockvector.hh:44
    \n-
    size_type dim() const
    Number of scalar elements.
    Definition multitypeblockvector.hh:116
    \n-
    Std::detected_t< std::common_type_t, typename FieldTraits< std::decay_t< Args > >::real_type... > real_type
    The type used for real values.
    Definition multitypeblockvector.hh:89
    \n-
    field_type dot(const type &newv) const
    Definition multitypeblockvector.hh:216
    \n-
    void operator*=(const T &w)
    Multiplication with a scalar.
    Definition multitypeblockvector.hh:194
    \n-
    void axpy(const Ta &a, const type &y)
    Axpy operation on this vector (*this += a * y)
    Definition multitypeblockvector.hh:319
    \n-
    real_type two_norm() const
    Compute the Euclidean norm.
    Definition multitypeblockvector.hh:252
    \n-
    void operator/=(const T &w)
    Division by a scalar.
    Definition multitypeblockvector.hh:203
    \n-
    MultiTypeBlockVector< Args... > type
    Definition multitypeblockvector.hh:75
    \n-
    auto one_norm() const
    Compute the 1-norm.
    Definition multitypeblockvector.hh:225
    \n-
    real_type two_norm2() const
    Compute the squared Euclidean norm.
    Definition multitypeblockvector.hh:243
    \n-
    real_type infinity_norm_real() const
    Compute the simplified maximum norm (uses 1-norm for complex values)
    Definition multitypeblockvector.hh:286
    \n-
    void operator-=(const type &newv)
    Definition multitypeblockvector.hh:184
    \n-
    real_type infinity_norm() const
    Compute the maximum norm.
    Definition multitypeblockvector.hh:256
    \n-
    field_type operator*(const type &newv) const
    Definition multitypeblockvector.hh:209
    \n-
    void operator+=(const type &newv)
    Definition multitypeblockvector.hh:174
    \n-
    typename std::tuple_element< i, std::tuple< Args... > >::type type
    Definition multitypeblockvector.hh:352
    \n-
    auto one_norm_real() const
    Compute the simplified 1-norm (uses 1-norm also for complex values)
    Definition multitypeblockvector.hh:234
    \n-
    typename MultiTypeBlockVector< Args... >::real_type real_type
    Definition multitypeblockvector.hh:45
    \n-
    STL namespace.
    \n+
    344 std::shared_ptr<OperatorHierarchy> matrices_;
    \n+
    346 SmootherArgs smootherArgs_;
    \n+
    348 std::shared_ptr<Hierarchy<Smoother,A> > smoothers_;
    \n+
    350 std::shared_ptr<CoarseSolver> solver_;
    \n+
    352 std::shared_ptr<Hierarchy<Range,A>> rhs_;
    \n+
    354 std::shared_ptr<Hierarchy<Domain,A>> lhs_;
    \n+
    356 std::shared_ptr<Hierarchy<Domain,A>> update_;
    \n+\n+
    360 std::shared_ptr<ScalarProduct> scalarProduct_;
    \n+
    362 std::size_t gamma_;
    \n+
    364 std::size_t preSteps_;
    \n+
    366 std::size_t postSteps_;
    \n+
    367 bool buildHierarchy_;
    \n+
    368 bool additive;
    \n+
    369 bool coarsesolverconverged;
    \n+
    370 std::shared_ptr<Smoother> coarseSmoother_;
    \n+
    372 SolverCategory::Category category_;
    \n+
    374 std::size_t verbosity_;
    \n+
    375
    \n+
    376 struct ToLower
    \n+
    377 {
    \n+
    \n+
    378 std::string operator()(const std::string& str)
    \n+
    379 {
    \n+
    380 std::stringstream retval;
    \n+
    381 std::ostream_iterator<char> out(retval);
    \n+
    382 std::transform(str.begin(), str.end(), out,
    \n+
    383 [](char c){
    \n+
    384 return std::tolower(c, std::locale::classic());
    \n+
    385 });
    \n+
    386 return retval.str();
    \n+
    387 }
    \n+
    \n+
    388 };
    \n+
    389 };
    \n+
    390
    \n+
    391 template<class M, class X, class S, class PI, class A>
    \n+
    \n+
    392 inline AMG<M,X,S,PI,A>::AMG(const AMG& amg)
    \n+
    393 : matrices_(amg.matrices_), smootherArgs_(amg.smootherArgs_),
    \n+
    394 smoothers_(amg.smoothers_), solver_(amg.solver_),
    \n+
    395 rhs_(), lhs_(), update_(),
    \n+
    396 scalarProduct_(amg.scalarProduct_), gamma_(amg.gamma_),
    \n+
    397 preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),
    \n+
    398 buildHierarchy_(amg.buildHierarchy_),
    \n+
    399 additive(amg.additive), coarsesolverconverged(amg.coarsesolverconverged),
    \n+
    400 coarseSmoother_(amg.coarseSmoother_),
    \n+
    401 category_(amg.category_),
    \n+
    402 verbosity_(amg.verbosity_)
    \n+
    403 {}
    \n+
    \n+
    404
    \n+
    405 template<class M, class X, class S, class PI, class A>
    \n+
    \n+\n+
    407 const SmootherArgs& smootherArgs,
    \n+
    408 const Parameters& parms)
    \n+
    409 : matrices_(stackobject_to_shared_ptr(matrices)), smootherArgs_(smootherArgs),
    \n+
    410 smoothers_(new Hierarchy<Smoother,A>), solver_(&coarseSolver),
    \n+
    411 rhs_(), lhs_(), update_(), scalarProduct_(0),
    \n+
    412 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),
    \n+
    413 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),
    \n+
    414 additive(parms.getAdditive()), coarsesolverconverged(true),
    \n+
    415 coarseSmoother_(),
    \n+
    416// #warning should category be retrieved from matrices?
    \n+
    417 category_(SolverCategory::category(*smoothers_->coarsest())),
    \n+
    418 verbosity_(parms.debugLevel())
    \n+
    419 {
    \n+
    420 assert(matrices_->isBuilt());
    \n+
    421
    \n+
    422 // build the necessary smoother hierarchies
    \n+
    423 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);
    \n+
    424 }
    \n+
    \n+
    425
    \n+
    426 template<class M, class X, class S, class PI, class A>
    \n+
    427 template<class C>
    \n+
    \n+\n+
    429 const C& criterion,
    \n+
    430 const SmootherArgs& smootherArgs,
    \n+
    431 const PI& pinfo)
    \n+
    432 : smootherArgs_(smootherArgs),
    \n+
    433 smoothers_(new Hierarchy<Smoother,A>), solver_(),
    \n+
    434 rhs_(), lhs_(), update_(), scalarProduct_(),
    \n+
    435 gamma_(criterion.getGamma()), preSteps_(criterion.getNoPreSmoothSteps()),
    \n+
    436 postSteps_(criterion.getNoPostSmoothSteps()), buildHierarchy_(true),
    \n+
    437 additive(criterion.getAdditive()), coarsesolverconverged(true),
    \n+
    438 coarseSmoother_(),
    \n+
    439 category_(SolverCategory::category(pinfo)),
    \n+
    440 verbosity_(criterion.debugLevel())
    \n+
    441 {
    \n+\n+
    443 DUNE_THROW(InvalidSolverCategory, "Matrix and Communication must have the same SolverCategory!");
    \n+
    444 // TODO: reestablish compile time checks.
    \n+
    445 //static_assert(static_cast<int>(PI::category)==static_cast<int>(S::category),
    \n+
    446 // "Matrix and Solver must match in terms of category!");
    \n+
    447 auto matrixptr = stackobject_to_shared_ptr(matrix);
    \n+
    448 createHierarchies(criterion, matrixptr, pinfo);
    \n+
    449 }
    \n+
    \n+
    450
    \n+
    451 template<class M, class X, class S, class PI, class A>
    \n+
    \n+
    452 AMG<M,X,S,PI,A>::AMG(std::shared_ptr<const Operator> matrixptr,
    \n+
    453 const ParameterTree& configuration,
    \n+
    454 const ParallelInformation& pinfo) :
    \n+
    455 smoothers_(new Hierarchy<Smoother,A>),
    \n+
    456 solver_(), rhs_(), lhs_(), update_(), scalarProduct_(), buildHierarchy_(true),
    \n+
    457 coarsesolverconverged(true), coarseSmoother_(),
    \n+
    458 category_(SolverCategory::category(pinfo))
    \n+
    459 {
    \n+
    460
    \n+
    461 if (configuration.hasKey ("smootherIterations"))
    \n+
    462 smootherArgs_.iterations = configuration.get<int>("smootherIterations");
    \n+
    463
    \n+
    464 if (configuration.hasKey ("smootherRelaxation"))
    \n+
    465 smootherArgs_.relaxationFactor = configuration.get<typename SmootherArgs::RelaxationFactor>("smootherRelaxation");
    \n+
    466
    \n+
    467 auto normName = ToLower()(configuration.get("strengthMeasure", "diagonal"));
    \n+
    468 auto index = configuration.get<int>("diagonalRowIndex", 0);
    \n+
    469
    \n+
    470 if ( normName == "diagonal")
    \n+
    471 {
    \n+
    472 using field_type = typename M::field_type;
    \n+
    473 using real_type = typename FieldTraits<field_type>::real_type;
    \n+
    474 std::is_convertible<field_type, real_type> compiles;
    \n+
    475
    \n+
    476 switch (index)
    \n+
    477 {
    \n+
    478 case 0:
    \n+
    479 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<0>(), configuration, compiles);
    \n+
    480 break;
    \n+
    481 case 1:
    \n+
    482 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<1>(), configuration, compiles);
    \n+
    483 break;
    \n+
    484 case 2:
    \n+
    485 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<2>(), configuration, compiles);
    \n+
    486 break;
    \n+
    487 case 3:
    \n+
    488 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<3>(), configuration, compiles);
    \n+
    489 break;
    \n+
    490 case 4:
    \n+
    491 createCriterionAndHierarchies(matrixptr, pinfo, Diagonal<4>(), configuration, compiles);
    \n+
    492 break;
    \n+
    493 default:
    \n+
    494 DUNE_THROW(InvalidStateException, "Currently strengthIndex>4 is not supported.");
    \n+
    495 }
    \n+
    496 }
    \n+
    497 else if (normName == "rowsum")
    \n+
    498 createCriterionAndHierarchies(matrixptr, pinfo, RowSum(), configuration);
    \n+
    499 else if (normName == "frobenius")
    \n+
    500 createCriterionAndHierarchies(matrixptr, pinfo, FrobeniusNorm(), configuration);
    \n+
    501 else if (normName == "one")
    \n+
    502 createCriterionAndHierarchies(matrixptr, pinfo, AlwaysOneNorm(), configuration);
    \n+
    503 else
    \n+
    504 DUNE_THROW(Dune::NotImplemented, "Wrong config file: strengthMeasure "<<normName<<" is not supported by AMG");
    \n+
    505 }
    \n+
    \n+
    506
    \n+
    507 template<class M, class X, class S, class PI, class A>
    \n+
    508 template<class Norm>
    \n+
    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)
    \n+
    510 {
    \n+
    511 DUNE_THROW(InvalidStateException, "Strength of connection measure does not support this type ("
    \n+
    512 << className<typename M::field_type>() << ") as it is lacking a conversion to"
    \n+
    513 << className<typename FieldTraits<typename M::field_type>::real_type>() << ".");
    \n+
    514 }
    \n+
    515
    \n+
    516 template<class M, class X, class S, class PI, class A>
    \n+
    517 template<class Norm>
    \n+
    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)
    \n+
    519 {
    \n+
    520 if (configuration.get<bool>("criterionSymmetric", true))
    \n+
    521 {
    \n+
    522 using Criterion = Dune::Amg::CoarsenCriterion<
    \n+\n+
    524 Criterion criterion;
    \n+
    525 createHierarchies(criterion, matrixptr, pinfo, configuration);
    \n+
    526 }
    \n+
    527 else
    \n+
    528 {
    \n+
    529 using Criterion = Dune::Amg::CoarsenCriterion<
    \n+\n+
    531 Criterion criterion;
    \n+
    532 createHierarchies(criterion, matrixptr, pinfo, configuration);
    \n+
    533 }
    \n+
    534 }
    \n+
    535
    \n+
    536 template<class M, class X, class S, class PI, class A>
    \n+
    537 template<class C>
    \n+
    538 void AMG<M,X,S,PI,A>::createHierarchies(C& criterion, std::shared_ptr<const Operator> matrixptr, const PI& pinfo, const ParameterTree& configuration)
    \n+
    539 {
    \n+
    540 if (configuration.hasKey ("maxLevel"))
    \n+
    541 criterion.setMaxLevel(configuration.get<int>("maxLevel"));
    \n+
    542
    \n+
    543 if (configuration.hasKey ("minCoarseningRate"))
    \n+
    544 criterion.setMinCoarsenRate(configuration.get<int>("minCoarseningRate"));
    \n+
    545
    \n+
    546 if (configuration.hasKey ("coarsenTarget"))
    \n+
    547 criterion.setCoarsenTarget (configuration.get<int>("coarsenTarget"));
    \n+
    548
    \n+
    549 if (configuration.hasKey ("accumulationMode"))
    \n+
    550 {
    \n+
    551 std::string mode = ToLower()(configuration.get<std::string>("accumulationMode"));
    \n+
    552 if ( mode == "none")
    \n+
    553 criterion.setAccumulate(AccumulationMode::noAccu);
    \n+
    554 else if ( mode == "atonce" )
    \n+
    555 criterion.setAccumulate(AccumulationMode::atOnceAccu);
    \n+
    556 else if ( mode == "successive")
    \n+
    557 criterion.setCoarsenTarget (AccumulationMode::successiveAccu);
    \n+
    558 else
    \n+
    559 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode does not allow value "
    \n+
    560 << mode <<".");
    \n+
    561 }
    \n+
    562
    \n+
    563 if (configuration.hasKey ("prolongationDampingFactor"))
    \n+
    564 criterion.setProlongationDampingFactor (configuration.get<double>("prolongationDampingFactor"));
    \n+
    565
    \n+
    566 if (configuration.hasKey("defaultAggregationSizeMode"))
    \n+
    567 {
    \n+
    568 auto mode = ToLower()(configuration.get<std::string>("defaultAggregationSizeMode"));
    \n+
    569 auto dim = configuration.get<std::size_t>("defaultAggregationDimension");
    \n+
    570 std::size_t maxDistance = 2;
    \n+
    571 if (configuration.hasKey("MaxAggregateDistance"))
    \n+
    572 maxDistance = configuration.get<std::size_t>("maxAggregateDistance");
    \n+
    573 if (mode == "isotropic")
    \n+
    574 criterion.setDefaultValuesIsotropic(dim, maxDistance);
    \n+
    575 else if(mode == "anisotropic")
    \n+
    576 criterion.setDefaultValuesAnisotropic(dim, maxDistance);
    \n+
    577 else
    \n+
    578 DUNE_THROW(InvalidSolverFactoryConfiguration, "Parameter accumulationMode does not allow value "
    \n+
    579 << mode <<".");
    \n+
    580 }
    \n+
    581
    \n+
    582 if (configuration.hasKey("maxAggregateDistance"))
    \n+
    583 criterion.setMaxDistance(configuration.get<std::size_t>("maxAggregateDistance"));
    \n+
    584
    \n+
    585 if (configuration.hasKey("minAggregateSize"))
    \n+
    586 criterion.setMinAggregateSize(configuration.get<std::size_t>("minAggregateSize"));
    \n+
    587
    \n+
    588 if (configuration.hasKey("maxAggregateSize"))
    \n+
    589 criterion.setMaxAggregateSize(configuration.get<std::size_t>("maxAggregateSize"));
    \n+
    590
    \n+
    591 if (configuration.hasKey("maxAggregateConnectivity"))
    \n+
    592 criterion.setMaxConnectivity(configuration.get<std::size_t>("maxAggregateConnectivity"));
    \n+
    593
    \n+
    594 if (configuration.hasKey ("alpha"))
    \n+
    595 criterion.setAlpha (configuration.get<double> ("alpha"));
    \n+
    596
    \n+
    597 if (configuration.hasKey ("beta"))
    \n+
    598 criterion.setBeta (configuration.get<double> ("beta"));
    \n+
    599
    \n+
    600 if (configuration.hasKey ("gamma"))
    \n+
    601 criterion.setGamma (configuration.get<std::size_t> ("gamma"));
    \n+
    602 gamma_ = criterion.getGamma();
    \n+
    603
    \n+
    604 if (configuration.hasKey ("additive"))
    \n+
    605 criterion.setAdditive (configuration.get<bool>("additive"));
    \n+
    606 additive = criterion.getAdditive();
    \n+
    607
    \n+
    608 if (configuration.hasKey ("preSteps"))
    \n+
    609 criterion.setNoPreSmoothSteps (configuration.get<std::size_t> ("preSteps"));
    \n+
    610 preSteps_ = criterion.getNoPreSmoothSteps ();
    \n+
    611
    \n+
    612 if (configuration.hasKey ("postSteps"))
    \n+
    613 criterion.setNoPostSmoothSteps (configuration.get<std::size_t> ("postSteps"));
    \n+
    614 postSteps_ = criterion.getNoPostSmoothSteps ();
    \n+
    615
    \n+
    616 verbosity_ = configuration.get("verbosity", 0);
    \n+
    617 criterion.setDebugLevel (verbosity_);
    \n+
    618
    \n+
    619 createHierarchies(criterion, matrixptr, pinfo);
    \n+
    620 }
    \n+
    621
    \n+
    622 template <class Matrix,
    \n+
    623 class Vector>
    \n+
    \n+\n+
    625 {
    \n+
    626 typedef typename Matrix :: field_type field_type;
    \n+\n+
    628
    \n+
    629 static constexpr SolverType solver =
    \n+
    630#if DISABLE_AMG_DIRECTSOLVER
    \n+
    631 none;
    \n+
    632#elif HAVE_SUITESPARSE_UMFPACK
    \n+\n+
    634#elif HAVE_SUPERLU
    \n+
    635 superlu ;
    \n+
    636#else
    \n+
    637 none;
    \n+
    638#endif
    \n+
    639
    \n+
    640 template <class M, SolverType>
    \n+
    \n+
    641 struct Solver
    \n+
    642 {
    \n+\n+
    \n+
    644 static type* create(const M& mat, bool verbose, bool reusevector )
    \n+
    645 {
    \n+
    646 DUNE_THROW(NotImplemented,"DirectSolver not selected");
    \n+
    647 return nullptr;
    \n+
    648 }
    \n+
    \n+
    649 static std::string name () { return "None"; }
    \n+
    650 };
    \n+
    \n+
    651#if HAVE_SUITESPARSE_UMFPACK
    \n+
    652 template <class M>
    \n+
    653 struct Solver< M, umfpack >
    \n+
    654 {
    \n+
    655 typedef UMFPack< M > type;
    \n+
    656 static type* create(const M& mat, bool verbose, bool reusevector )
    \n+
    657 {
    \n+
    658 return new type(mat, verbose, reusevector );
    \n+
    659 }
    \n+
    660 static std::string name () { return "UMFPack"; }
    \n+
    661 };
    \n+
    662#endif
    \n+
    663#if HAVE_SUPERLU
    \n+
    664 template <class M>
    \n+
    \n+
    665 struct Solver< M, superlu >
    \n+
    666 {
    \n+\n+
    \n+
    668 static type* create(const M& mat, bool verbose, bool reusevector )
    \n+
    669 {
    \n+
    670 return new type(mat, verbose, reusevector );
    \n+
    671 }
    \n+
    \n+
    672 static std::string name () { return "SuperLU"; }
    \n+
    673 };
    \n+
    \n+
    674#endif
    \n+
    675
    \n+
    676 // define direct solver type to be used
    \n+\n+
    678 typedef typename SelectedSolver :: type DirectSolver;
    \n+
    679 static constexpr bool isDirectSolver = solver != none;
    \n+
    680 static std::string name() { return SelectedSolver :: name (); }
    \n+
    \n+
    681 static DirectSolver* create(const Matrix& mat, bool verbose, bool reusevector )
    \n+
    682 {
    \n+
    683 return SelectedSolver :: create( mat, verbose, reusevector );
    \n+
    684 }
    \n+
    \n+
    685 };
    \n+
    \n+
    686
    \n+
    687 template<class M, class X, class S, class PI, class A>
    \n+
    688 template<class C>
    \n+
    689 void AMG<M,X,S,PI,A>::createHierarchies(C& criterion,
    \n+
    690 const std::shared_ptr<const Operator>& matrixptr,
    \n+
    691 const PI& pinfo)
    \n+
    692 {
    \n+
    693 Timer watch;
    \n+
    694 matrices_ = std::make_shared<OperatorHierarchy>(
    \n+
    695 std::const_pointer_cast<Operator>(matrixptr),
    \n+
    696 stackobject_to_shared_ptr(const_cast<PI&>(pinfo)));
    \n+
    697
    \n+
    698 matrices_->template build<NegateSet<typename PI::OwnerSet> >(criterion);
    \n+
    699
    \n+
    700 // build the necessary smoother hierarchies
    \n+
    701 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);
    \n+
    702
    \n+
    703 // test whether we should solve on the coarse level. That is the case if we
    \n+
    704 // have that level and if there was a redistribution on this level then our
    \n+
    705 // communicator has to be valid (size()>0) as the smoother might try to communicate
    \n+
    706 // in the constructor.
    \n+
    707 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels()
    \n+
    708 && ( ! matrices_->redistributeInformation().back().isSetup() ||
    \n+
    709 matrices_->parallelInformation().coarsest().getRedistributed().communicator().size() ) )
    \n+
    710 {
    \n+
    711 // We have the carsest level. Create the coarse Solver
    \n+
    712 SmootherArgs sargs(smootherArgs_);
    \n+
    713 sargs.iterations = 1;
    \n+
    714
    \n+\n+
    716 cargs.setArgs(sargs);
    \n+
    717 if(matrices_->redistributeInformation().back().isSetup()) {
    \n+
    718 // Solve on the redistributed partitioning
    \n+
    719 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat());
    \n+
    720 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed());
    \n+
    721 }else{
    \n+
    722 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());
    \n+
    723 cargs.setComm(*matrices_->parallelInformation().coarsest());
    \n+
    724 }
    \n+
    725
    \n+
    726 coarseSmoother_ = ConstructionTraits<Smoother>::construct(cargs);
    \n+
    727 scalarProduct_ = createScalarProduct<X>(cargs.getComm(),category());
    \n+
    728
    \n+
    729 typedef DirectSolverSelector< typename M::matrix_type, X > SolverSelector;
    \n+
    730
    \n+
    731 // Use superlu if we are purely sequential or with only one processor on the coarsest level.
    \n+
    732 if( SolverSelector::isDirectSolver &&
    \n+
    733 (std::is_same<ParallelInformation,SequentialInformation>::value // sequential mode
    \n+
    734 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //parallel mode and only one processor
    \n+
    735 || (matrices_->parallelInformation().coarsest().isRedistributed()
    \n+
    736 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()==1
    \n+
    737 && matrices_->parallelInformation().coarsest().getRedistributed().communicator().size()>0) )
    \n+
    738 )
    \n+
    739 { // redistribute and 1 proc
    \n+
    740 if(matrices_->parallelInformation().coarsest().isRedistributed())
    \n+
    741 {
    \n+
    742 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
    \n+
    743 {
    \n+
    744 // We are still participating on this level
    \n+
    745 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest().getRedistributed().getmat(), false, false));
    \n+
    746 }
    \n+
    747 else
    \n+
    748 solver_.reset();
    \n+
    749 }
    \n+
    750 else
    \n+
    751 {
    \n+
    752 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest()->getmat(), false, false));
    \n+
    753 }
    \n+
    754 if(verbosity_>0 && matrices_->parallelInformation().coarsest()->communicator().rank()==0)
    \n+
    755 std::cout<< "Using a direct coarse solver (" << SolverSelector::name() << ")" << std::endl;
    \n+
    756 }
    \n+
    757 else
    \n+
    758 {
    \n+
    759 if(matrices_->parallelInformation().coarsest().isRedistributed())
    \n+
    760 {
    \n+
    761 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)
    \n+
    762 // We are still participating on this level
    \n+
    763
    \n+
    764 // we have to allocate these types using the rebound allocator
    \n+
    765 // in order to ensure that we fulfill the alignment requirements
    \n+
    766 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(matrices_->matrices().coarsest().getRedistributed()),
    \n+
    767 *scalarProduct_,
    \n+
    768 *coarseSmoother_, 1E-2, 1000, 0));
    \n+
    769 else
    \n+
    770 solver_.reset();
    \n+
    771 }else
    \n+
    772 {
    \n+
    773 solver_.reset(new BiCGSTABSolver<X>(const_cast<M&>(*matrices_->matrices().coarsest()),
    \n+
    774 *scalarProduct_,
    \n+
    775 *coarseSmoother_, 1E-2, 1000, 0));
    \n+
    776 // // we have to allocate these types using the rebound allocator
    \n+
    777 // // in order to ensure that we fulfill the alignment requirements
    \n+
    778 // using Alloc = typename std::allocator_traits<A>::template rebind_alloc<BiCGSTABSolver<X>>;
    \n+
    779 // Alloc alloc;
    \n+
    780 // auto p = alloc.allocate(1);
    \n+
    781 // std::allocator_traits<Alloc>::construct(alloc, p,
    \n+
    782 // const_cast<M&>(*matrices_->matrices().coarsest()),
    \n+
    783 // *scalarProduct_,
    \n+
    784 // *coarseSmoother_, 1E-2, 1000, 0);
    \n+
    785 // solver_.reset(p,[](BiCGSTABSolver<X>* p){
    \n+
    786 // Alloc alloc;
    \n+
    787 // std::allocator_traits<Alloc>::destroy(alloc, p);
    \n+
    788 // alloc.deallocate(p,1);
    \n+
    789 // });
    \n+
    790 }
    \n+
    791 }
    \n+
    792 }
    \n+
    793
    \n+
    794 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator().rank()==0)
    \n+
    795 std::cout<<"Building hierarchy of "<<matrices_->maxlevels()<<" levels "
    \n+
    796 <<"(including coarse solver) took "<<watch.elapsed()<<" seconds."<<std::endl;
    \n+
    797 }
    \n+
    798
    \n+
    799
    \n+
    800 template<class M, class X, class S, class PI, class A>
    \n+
    \n+\n+
    802 {
    \n+
    803 // Detect Matrix rows where all offdiagonal entries are
    \n+
    804 // zero and set x such that A_dd*x_d=b_d
    \n+
    805 // Thus users can be more careless when setting up their linear
    \n+
    806 // systems.
    \n+
    807 typedef typename M::matrix_type Matrix;
    \n+
    808 typedef typename Matrix::ConstRowIterator RowIter;
    \n+
    809 typedef typename Matrix::ConstColIterator ColIter;
    \n+
    810 typedef typename Matrix::block_type Block;
    \n+
    811 Block zero;
    \n+
    812 zero=typename Matrix::field_type();
    \n+
    813
    \n+
    814 const Matrix& mat=matrices_->matrices().finest()->getmat();
    \n+
    815 for(RowIter row=mat.begin(); row!=mat.end(); ++row) {
    \n+
    816 bool isDirichlet = true;
    \n+
    817 bool hasDiagonal = false;
    \n+
    818 Block diagonal{};
    \n+
    819 for(ColIter col=row->begin(); col!=row->end(); ++col) {
    \n+
    820 if(row.index()==col.index()) {
    \n+
    821 diagonal = *col;
    \n+
    822 hasDiagonal = true;
    \n+
    823 }else{
    \n+
    824 if(*col!=zero)
    \n+
    825 isDirichlet = false;
    \n+
    826 }
    \n+
    827 }
    \n+
    828 if(isDirichlet && hasDiagonal)
    \n+
    829 {
    \n+
    830 auto&& xEntry = Impl::asVector(x[row.index()]);
    \n+
    831 auto&& bEntry = Impl::asVector(b[row.index()]);
    \n+
    832 Impl::asMatrix(diagonal).solve(xEntry, bEntry);
    \n+
    833 }
    \n+
    834 }
    \n+
    835
    \n+
    836 if(smoothers_->levels()>0)
    \n+
    837 smoothers_->finest()->pre(x,b);
    \n+
    838 else
    \n+
    839 // No smoother to make x consistent! Do it by hand
    \n+
    840 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x);
    \n+
    841 rhs_ = std::make_shared<Hierarchy<Range,A>>(std::make_shared<Range>(b));
    \n+
    842 lhs_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
    \n+
    843 update_ = std::make_shared<Hierarchy<Domain,A>>(std::make_shared<Domain>(x));
    \n+
    844 matrices_->coarsenVector(*rhs_);
    \n+
    845 matrices_->coarsenVector(*lhs_);
    \n+
    846 matrices_->coarsenVector(*update_);
    \n+
    847
    \n+
    848 // Preprocess all smoothers
    \n+
    849 typedef typename Hierarchy<Smoother,A>::Iterator Iterator;
    \n+
    850 typedef typename Hierarchy<Range,A>::Iterator RIterator;
    \n+
    851 typedef typename Hierarchy<Domain,A>::Iterator DIterator;
    \n+
    852 Iterator coarsest = smoothers_->coarsest();
    \n+
    853 Iterator smoother = smoothers_->finest();
    \n+
    854 RIterator rhs = rhs_->finest();
    \n+
    855 DIterator lhs = lhs_->finest();
    \n+
    856 if(smoothers_->levels()>1) {
    \n+
    857
    \n+
    858 assert(lhs_->levels()==rhs_->levels());
    \n+
    859 assert(smoothers_->levels()==lhs_->levels() || matrices_->levels()==matrices_->maxlevels());
    \n+
    860 assert(smoothers_->levels()+1==lhs_->levels() || matrices_->levels()<matrices_->maxlevels());
    \n+
    861
    \n+
    862 if(smoother!=coarsest)
    \n+
    863 for(++smoother, ++lhs, ++rhs; smoother != coarsest; ++smoother, ++lhs, ++rhs)
    \n+
    864 smoother->pre(*lhs,*rhs);
    \n+
    865 smoother->pre(*lhs,*rhs);
    \n+
    866 }
    \n+
    867
    \n+
    868
    \n+
    869 // The preconditioner might change x and b. So we have to
    \n+
    870 // copy the changes to the original vectors.
    \n+
    871 x = *lhs_->finest();
    \n+
    872 b = *rhs_->finest();
    \n+
    873
    \n+
    874 }
    \n+
    \n+
    875 template<class M, class X, class S, class PI, class A>
    \n+
    \n+\n+
    877 {
    \n+
    878 return matrices_->levels();
    \n+
    879 }
    \n+
    \n+
    880 template<class M, class X, class S, class PI, class A>
    \n+
    \n+\n+
    882 {
    \n+
    883 return matrices_->maxlevels();
    \n+
    884 }
    \n+
    \n+
    885
    \n+
    887 template<class M, class X, class S, class PI, class A>
    \n+
    \n+\n+
    889 {
    \n+
    890 LevelContext levelContext;
    \n+
    891
    \n+
    892 if(additive) {
    \n+
    893 *(rhs_->finest())=d;
    \n+
    894 additiveMgc();
    \n+
    895 v=*lhs_->finest();
    \n+
    896 }else{
    \n+
    897 // Init all iterators for the current level
    \n+
    898 initIteratorsWithFineLevel(levelContext);
    \n+
    899
    \n+
    900
    \n+
    901 *levelContext.lhs = v;
    \n+
    902 *levelContext.rhs = d;
    \n+
    903 *levelContext.update=0;
    \n+
    904 levelContext.level=0;
    \n+
    905
    \n+
    906 mgc(levelContext);
    \n+
    907
    \n+
    908 if(postSteps_==0||matrices_->maxlevels()==1)
    \n+
    909 levelContext.pinfo->copyOwnerToAll(*levelContext.update, *levelContext.update);
    \n+
    910
    \n+
    911 v=*levelContext.update;
    \n+
    912 }
    \n+
    913
    \n+
    914 }
    \n+
    \n+
    915
    \n+
    916 template<class M, class X, class S, class PI, class A>
    \n+
    917 void AMG<M,X,S,PI,A>::initIteratorsWithFineLevel(LevelContext& levelContext)
    \n+
    918 {
    \n+
    919 levelContext.smoother = smoothers_->finest();
    \n+
    920 levelContext.matrix = matrices_->matrices().finest();
    \n+
    921 levelContext.pinfo = matrices_->parallelInformation().finest();
    \n+
    922 levelContext.redist =
    \n+
    923 matrices_->redistributeInformation().begin();
    \n+
    924 levelContext.aggregates = matrices_->aggregatesMaps().begin();
    \n+
    925 levelContext.lhs = lhs_->finest();
    \n+
    926 levelContext.update = update_->finest();
    \n+
    927 levelContext.rhs = rhs_->finest();
    \n+
    928 }
    \n+
    929
    \n+
    930 template<class M, class X, class S, class PI, class A>
    \n+
    931 bool AMG<M,X,S,PI,A>
    \n+
    932 ::moveToCoarseLevel(LevelContext& levelContext)
    \n+
    933 {
    \n+
    934
    \n+
    935 bool processNextLevel=true;
    \n+
    936
    \n+
    937 if(levelContext.redist->isSetup()) {
    \n+
    938 levelContext.redist->redistribute(static_cast<const Range&>(*levelContext.rhs),
    \n+
    939 levelContext.rhs.getRedistributed());
    \n+
    940 processNextLevel = levelContext.rhs.getRedistributed().size()>0;
    \n+
    941 if(processNextLevel) {
    \n+
    942 //restrict defect to coarse level right hand side.
    \n+
    943 typename Hierarchy<Range,A>::Iterator fineRhs = levelContext.rhs++;
    \n+
    944 ++levelContext.pinfo;
    \n+
    945 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n+
    946 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,
    \n+
    947 static_cast<const Range&>(fineRhs.getRedistributed()),
    \n+
    948 *levelContext.pinfo);
    \n+
    949 }
    \n+
    950 }else{
    \n+
    951 //restrict defect to coarse level right hand side.
    \n+
    952 typename Hierarchy<Range,A>::Iterator fineRhs = levelContext.rhs++;
    \n+
    953 ++levelContext.pinfo;
    \n+
    954 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n+
    955 ::restrictVector(*(*levelContext.aggregates),
    \n+
    956 *levelContext.rhs, static_cast<const Range&>(*fineRhs),
    \n+
    957 *levelContext.pinfo);
    \n+
    958 }
    \n+
    959
    \n+
    960 if(processNextLevel) {
    \n+
    961 // prepare coarse system
    \n+
    962 ++levelContext.lhs;
    \n+
    963 ++levelContext.update;
    \n+
    964 ++levelContext.matrix;
    \n+
    965 ++levelContext.level;
    \n+
    966 ++levelContext.redist;
    \n+
    967
    \n+
    968 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
    \n+
    969 // next level is not the globally coarsest one
    \n+
    970 ++levelContext.smoother;
    \n+
    971 ++levelContext.aggregates;
    \n+
    972 }
    \n+
    973 // prepare the update on the next level
    \n+
    974 *levelContext.update=0;
    \n+
    975 }
    \n+
    976 return processNextLevel;
    \n+
    977 }
    \n+
    978
    \n+
    979 template<class M, class X, class S, class PI, class A>
    \n+
    980 void AMG<M,X,S,PI,A>
    \n+
    981 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel)
    \n+
    982 {
    \n+
    983 if(processNextLevel) {
    \n+
    984 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_->levels()<matrices_->maxlevels()) {
    \n+
    985 // previous level is not the globally coarsest one
    \n+
    986 --levelContext.smoother;
    \n+
    987 --levelContext.aggregates;
    \n+
    988 }
    \n+
    989 --levelContext.redist;
    \n+
    990 --levelContext.level;
    \n+
    991 //prolongate and add the correction (update is in coarse left hand side)
    \n+
    992 --levelContext.matrix;
    \n+
    993
    \n+
    994 //typename Hierarchy<Domain,A>::Iterator coarseLhs = lhs--;
    \n+
    995 --levelContext.lhs;
    \n+
    996 --levelContext.pinfo;
    \n+
    997 }
    \n+
    998 if(levelContext.redist->isSetup()) {
    \n+
    999 // Need to redistribute during prolongateVector
    \n+
    1000 levelContext.lhs.getRedistributed()=0;
    \n+
    1001 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n+
    1002 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, *levelContext.lhs,
    \n+
    1003 levelContext.lhs.getRedistributed(),
    \n+
    1004 matrices_->getProlongationDampingFactor(),
    \n+
    1005 *levelContext.pinfo, *levelContext.redist);
    \n+
    1006 }else{
    \n+
    1007 *levelContext.lhs=0;
    \n+
    1008 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n+
    1009 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update, *levelContext.lhs,
    \n+
    1010 matrices_->getProlongationDampingFactor(),
    \n+
    1011 *levelContext.pinfo);
    \n+
    1012 }
    \n+
    1013
    \n+
    1014
    \n+
    1015 if(processNextLevel) {
    \n+
    1016 --levelContext.update;
    \n+
    1017 --levelContext.rhs;
    \n+
    1018 }
    \n+
    1019
    \n+
    1020 *levelContext.update += *levelContext.lhs;
    \n+
    1021 }
    \n+
    1022
    \n+
    1023 template<class M, class X, class S, class PI, class A>
    \n+
    \n+\n+
    1025 {
    \n+\n+
    1027 }
    \n+
    \n+
    \n+
    1028
    \n+
    1029 template<class M, class X, class S, class PI, class A>
    \n+
    1030 void AMG<M,X,S,PI,A>::mgc(LevelContext& levelContext){
    \n+
    1031 if(levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels()) {
    \n+
    1032 // Solve directly
    \n+\n+
    1034 res.converged=true; // If we do not compute this flag will not get updated
    \n+
    1035 if(levelContext.redist->isSetup()) {
    \n+
    1036 levelContext.redist->redistribute(*levelContext.rhs, levelContext.rhs.getRedistributed());
    \n+
    1037 if(levelContext.rhs.getRedistributed().size()>0) {
    \n+
    1038 // We are still participating in the computation
    \n+
    1039 levelContext.pinfo.getRedistributed().copyOwnerToAll(levelContext.rhs.getRedistributed(),
    \n+
    1040 levelContext.rhs.getRedistributed());
    \n+
    1041 solver_->apply(levelContext.update.getRedistributed(),
    \n+
    1042 levelContext.rhs.getRedistributed(), res);
    \n+
    1043 }
    \n+
    1044 levelContext.redist->redistributeBackward(*levelContext.update, levelContext.update.getRedistributed());
    \n+
    1045 levelContext.pinfo->copyOwnerToAll(*levelContext.update, *levelContext.update);
    \n+
    1046 }else{
    \n+
    1047 levelContext.pinfo->copyOwnerToAll(*levelContext.rhs, *levelContext.rhs);
    \n+
    1048 solver_->apply(*levelContext.update, *levelContext.rhs, res);
    \n+
    1049 }
    \n+
    1050
    \n+
    1051 if (!res.converged)
    \n+
    1052 coarsesolverconverged = false;
    \n+
    1053 }else{
    \n+
    1054 // presmoothing
    \n+
    1055 presmooth(levelContext, preSteps_);
    \n+
    1056
    \n+
    1057#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
    \n+
    1058 bool processNextLevel = moveToCoarseLevel(levelContext);
    \n+
    1059
    \n+
    1060 if(processNextLevel) {
    \n+
    1061 // next level
    \n+
    1062 for(std::size_t i=0; i<gamma_; i++){
    \n+
    1063 mgc(levelContext);
    \n+
    1064 if (levelContext.matrix == matrices_->matrices().coarsest() && levels()==maxlevels())
    \n+
    1065 break;
    \n+
    1066 if(i+1 < gamma_){
    \n+
    1067 levelContext.matrix->applyscaleadd(-1., *levelContext.lhs, *levelContext.rhs);
    \n+
    1068 }
    \n+
    1069 }
    \n+
    1070 }
    \n+
    1071
    \n+
    1072 moveToFineLevel(levelContext, processNextLevel);
    \n+
    1073#else
    \n+
    1074 *lhs=0;
    \n+
    1075#endif
    \n+
    1076
    \n+
    1077 if(levelContext.matrix == matrices_->matrices().finest()) {
    \n+
    1078 coarsesolverconverged = matrices_->parallelInformation().finest()->communicator().prod(coarsesolverconverged);
    \n+
    1079 if(!coarsesolverconverged)
    \n+
    1080 DUNE_THROW(MathError, "Coarse solver did not converge");
    \n+
    1081 }
    \n+
    1082 // postsmoothing
    \n+
    1083 postsmooth(levelContext, postSteps_);
    \n+
    1084
    \n+
    1085 }
    \n+
    1086 }
    \n+
    1087
    \n+
    1088 template<class M, class X, class S, class PI, class A>
    \n+
    1089 void AMG<M,X,S,PI,A>::additiveMgc(){
    \n+
    1090
    \n+
    1091 // restrict residual to all levels
    \n+
    1092 typename ParallelInformationHierarchy::Iterator pinfo=matrices_->parallelInformation().finest();
    \n+
    1093 typename Hierarchy<Range,A>::Iterator rhs=rhs_->finest();
    \n+
    1094 typename Hierarchy<Domain,A>::Iterator lhs = lhs_->finest();
    \n+
    1095 typename OperatorHierarchy::AggregatesMapList::const_iterator aggregates=matrices_->aggregatesMaps().begin();
    \n+
    1096
    \n+
    1097 for(typename Hierarchy<Range,A>::Iterator fineRhs=rhs++; fineRhs != rhs_->coarsest(); fineRhs=rhs++, ++aggregates) {
    \n+
    1098 ++pinfo;
    \n+
    1099 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n+
    1100 ::restrictVector(*(*aggregates), *rhs, static_cast<const Range&>(*fineRhs), *pinfo);
    \n+
    1101 }
    \n+
    1102
    \n+
    1103 // pinfo is invalid, set to coarsest level
    \n+
    1104 //pinfo = matrices_->parallelInformation().coarsest
    \n+
    1105 // calculate correction for all levels
    \n+
    1106 lhs = lhs_->finest();
    \n+
    1107 typename Hierarchy<Smoother,A>::Iterator smoother = smoothers_->finest();
    \n+
    1108
    \n+
    1109 for(rhs=rhs_->finest(); rhs != rhs_->coarsest(); ++lhs, ++rhs, ++smoother) {
    \n+
    1110 // presmoothing
    \n+
    1111 *lhs=0;
    \n+
    1112 smoother->apply(*lhs, *rhs);
    \n+
    1113 }
    \n+
    1114
    \n+
    1115 // Coarse level solve
    \n+
    1116#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION
    \n+
    1117 InverseOperatorResult res;
    \n+
    1118 pinfo->copyOwnerToAll(*rhs, *rhs);
    \n+
    1119 solver_->apply(*lhs, *rhs, res);
    \n+
    1120
    \n+
    1121 if(!res.converged)
    \n+
    1122 DUNE_THROW(MathError, "Coarse solver did not converge");
    \n+
    1123#else
    \n+
    1124 *lhs=0;
    \n+
    1125#endif
    \n+
    1126 // Prologate and add up corrections from all levels
    \n+
    1127 --pinfo;
    \n+
    1128 --aggregates;
    \n+
    1129
    \n+
    1130 for(typename Hierarchy<Domain,A>::Iterator coarseLhs = lhs--; coarseLhs != lhs_->finest(); coarseLhs = lhs--, --aggregates, --pinfo) {
    \n+
    1131 Transfer<typename OperatorHierarchy::AggregatesMap::AggregateDescriptor,Range,ParallelInformation>
    \n+
    1132 ::prolongateVector(*(*aggregates), *coarseLhs, *lhs, 1.0, *pinfo);
    \n+
    1133 }
    \n+
    1134 }
    \n+
    1135
    \n+
    1136
    \n+
    1138 template<class M, class X, class S, class PI, class A>
    \n+
    \n+
    1139 void AMG<M,X,S,PI,A>::post([[maybe_unused]] Domain& x)
    \n+
    1140 {
    \n+
    1141 // Postprocess all smoothers
    \n+
    1142 typedef typename Hierarchy<Smoother,A>::Iterator Iterator;
    \n+
    1143 typedef typename Hierarchy<Domain,A>::Iterator DIterator;
    \n+
    1144 Iterator coarsest = smoothers_->coarsest();
    \n+
    1145 Iterator smoother = smoothers_->finest();
    \n+
    1146 DIterator lhs = lhs_->finest();
    \n+
    1147 if(smoothers_->levels()>0) {
    \n+
    1148 if(smoother != coarsest || matrices_->levels()<matrices_->maxlevels())
    \n+
    1149 smoother->post(*lhs);
    \n+
    1150 if(smoother!=coarsest)
    \n+
    1151 for(++smoother, ++lhs; smoother != coarsest; ++smoother, ++lhs)
    \n+
    1152 smoother->post(*lhs);
    \n+
    1153 smoother->post(*lhs);
    \n+
    1154 }
    \n+
    1155 lhs_ = nullptr;
    \n+
    1156 update_ = nullptr;
    \n+
    1157 rhs_ = nullptr;
    \n+
    1158 }
    \n+
    \n+
    1159
    \n+
    1160 template<class M, class X, class S, class PI, class A>
    \n+
    1161 template<class A1>
    \n+
    \n+
    1162 void AMG<M,X,S,PI,A>::getCoarsestAggregateNumbers(std::vector<std::size_t,A1>& cont)
    \n+
    1163 {
    \n+
    1164 matrices_->getCoarsestAggregatesOnFinest(cont);
    \n+
    1165 }
    \n+
    \n+
    1166
    \n+
    1167 } // end namespace Amg
    \n+
    1168
    \n+
    \n+\n+
    1170 template<class> struct isValidBlockType : std::false_type{};
    \n+
    1171 template<class T, int n, int m> struct isValidBlockType<FieldMatrix<T,n,m>> : std::true_type{};
    \n+
    1172
    \n+
    1173 template<class OP>
    \n+
    1174 std::shared_ptr<Dune::Preconditioner<typename OP::element_type::domain_type, typename OP::element_type::range_type> >
    \n+
    \n+
    1175 makeAMG(const OP& op, const std::string& smoother, const Dune::ParameterTree& config) const
    \n+
    1176 {
    \n+
    1177 DUNE_THROW(Dune::Exception, "Operator type not supported by AMG");
    \n+
    1178 }
    \n+
    \n+
    1179
    \n+
    1180 template<class M, class X, class Y>
    \n+
    1181 std::shared_ptr<Dune::Preconditioner<X,Y> >
    \n+
    \n+
    1182 makeAMG(const std::shared_ptr<MatrixAdapter<M,X,Y>>& op, const std::string& smoother,
    \n+
    1183 const Dune::ParameterTree& config) const
    \n+
    1184 {
    \n+
    1185 using OP = MatrixAdapter<M,X,Y>;
    \n+
    1186
    \n+
    1187 if(smoother == "ssor")
    \n+
    1188 return std::make_shared<Amg::AMG<OP, X, SeqSSOR<M,X,Y>>>(op, config);
    \n+
    1189 if(smoother == "sor")
    \n+
    1190 return std::make_shared<Amg::AMG<OP, X, SeqSOR<M,X,Y>>>(op, config);
    \n+
    1191 if(smoother == "jac")
    \n+
    1192 return std::make_shared<Amg::AMG<OP, X, SeqJac<M,X,Y>>>(op, config);
    \n+
    1193 if(smoother == "gs")
    \n+
    1194 return std::make_shared<Amg::AMG<OP, X, SeqGS<M,X,Y>>>(op, config);
    \n+
    1195 if(smoother == "ilu")
    \n+
    1196 return std::make_shared<Amg::AMG<OP, X, SeqILU<M,X,Y>>>(op, config);
    \n+
    1197 else
    \n+
    1198 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
    \n+
    1199 }
    \n+
    \n+
    1200
    \n+
    1201 template<class M, class X, class Y, class C>
    \n+
    1202 std::shared_ptr<Dune::Preconditioner<X,Y> >
    \n+
    \n+
    1203 makeAMG(const std::shared_ptr<OverlappingSchwarzOperator<M,X,Y,C>>& op, const std::string& smoother,
    \n+
    1204 const Dune::ParameterTree& config) const
    \n+
    1205 {
    \n+\n+
    1207
    \n+
    1208 auto cop = std::static_pointer_cast<const OP>(op);
    \n+
    1209
    \n+
    1210 if(smoother == "ssor")
    \n+
    1211 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqSSOR<M,X,Y>>,C>>(cop, config, op->getCommunication());
    \n+
    1212 if(smoother == "sor")
    \n+
    1213 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqSOR<M,X,Y>>,C>>(cop, config, op->getCommunication());
    \n+
    1214 if(smoother == "jac")
    \n+
    1215 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqJac<M,X,Y>>,C>>(cop, config, op->getCommunication());
    \n+
    1216 if(smoother == "gs")
    \n+
    1217 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqGS<M,X,Y>>,C>>(cop, config, op->getCommunication());
    \n+
    1218 if(smoother == "ilu")
    \n+
    1219 return std::make_shared<Amg::AMG<OP, X, BlockPreconditioner<X,Y,C,SeqILU<M,X,Y>>,C>>(cop, config, op->getCommunication());
    \n+
    1220 else
    \n+
    1221 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
    \n+
    1222 }
    \n+
    \n+
    1223
    \n+
    1224 template<class M, class X, class Y, class C>
    \n+
    1225 std::shared_ptr<Dune::Preconditioner<X,Y> >
    \n+
    \n+
    1226 makeAMG(const std::shared_ptr<NonoverlappingSchwarzOperator<M,X,Y,C>>& op, const std::string& smoother,
    \n+
    1227 const Dune::ParameterTree& config) const
    \n+
    1228 {
    \n+\n+
    1230
    \n+
    1231 if(smoother == "ssor")
    \n+
    1232 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqSSOR<M,X,Y>>,C>>(op, config, op->getCommunication());
    \n+
    1233 if(smoother == "sor")
    \n+
    1234 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqSOR<M,X,Y>>,C>>(op, config, op->getCommunication());
    \n+
    1235 if(smoother == "jac")
    \n+
    1236 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqJac<M,X,Y>>,C>>(op, config, op->getCommunication());
    \n+
    1237 if(smoother == "gs")
    \n+
    1238 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqGS<M,X,Y>>,C>>(op, config, op->getCommunication());
    \n+
    1239 if(smoother == "ilu")
    \n+
    1240 return std::make_shared<Amg::AMG<OP, X, NonoverlappingBlockPreconditioner<C,SeqILU<M,X,Y>>,C>>(op, config, op->getCommunication());
    \n+
    1241 else
    \n+
    1242 DUNE_THROW(Dune::Exception, "Unknown smoother for AMG");
    \n+
    1243 }
    \n+
    \n+
    1244
    \n+
    1245 template<typename TL, typename OP>
    \n+
    1246 std::shared_ptr<Dune::Preconditioner<typename Dune::TypeListElement<1, TL>::type,
    \n+
    1247 typename Dune::TypeListElement<2, TL>::type>>
    \n+
    \n+
    1248 operator() (TL tl, const std::shared_ptr<OP>& op, const Dune::ParameterTree& config,
    \n+\n+
    1250 {
    \n+
    1251 using field_type = typename OP::matrix_type::field_type;
    \n+
    1252 using real_type = typename FieldTraits<field_type>::real_type;
    \n+
    1253 if (!std::is_convertible<field_type, real_type>())
    \n+
    1254 DUNE_THROW(UnsupportedType, "AMG needs field_type(" <<
    \n+
    1255 className<field_type>() <<
    \n+
    1256 ") to be convertible to its real_type (" <<
    \n+
    1257 className<real_type>() <<
    \n+
    1258 ").");
    \n+
    1259 std::string smoother = config.get("smoother", "ssor");
    \n+
    1260 return makeAMG(op, smoother, config);
    \n+
    1261 }
    \n+
    \n+
    1262
    \n+
    1263 template<typename TL, typename OP>
    \n+
    1264 std::shared_ptr<Dune::Preconditioner<typename Dune::TypeListElement<1, TL>::type,
    \n+
    1265 typename Dune::TypeListElement<2, TL>::type>>
    \n+
    \n+
    1266 operator() (TL /*tl*/, const std::shared_ptr<OP>& /*mat*/, const Dune::ParameterTree& /*config*/,
    \n+\n+
    1268 {
    \n+
    1269 DUNE_THROW(UnsupportedType, "AMG needs a FieldMatrix as Matrix block_type");
    \n+
    1270 }
    \n+
    \n+
    1271 };
    \n+
    \n+
    1272
    \n+\n+
    1274} // end namespace Dune
    \n+
    1275
    \n+
    1276#endif
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    \n+
    Classes for using UMFPack with ISTL matrices.
    \n+
    Classes for using SuperLU with ISTL matrices.
    \n+
    Define base class for scalar product and norm.
    \n+
    Implementations of the inverse operator interface.
    \n+
    Templates characterizing the type of a solver.
    \n+
    #define DUNE_REGISTER_PRECONDITIONER(name,...)
    Definition solverregistry.hh:16
    \n+
    Provides a classes representing the hierarchies in AMG.
    \n+
    Prolongation and restriction for amg.
    \n+
    Classes for the generic construction and application of the smoothers.
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n+
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    AMG(const AMG &amg)
    Copy constructor.
    Definition amg.hh:392
    \n+
    void pre(Domain &x, Range &b)
    Prepare the preconditioner.
    Definition amg.hh:801
    \n+
    static DirectSolver * create(const Matrix &mat, bool verbose, bool reusevector)
    Definition amg.hh:681
    \n+
    static std::string name()
    Definition amg.hh:680
    \n+
    Hierarchy< Domain, A >::Iterator update
    The iterator over the updates.
    Definition amg.hh:303
    \n+
    Hierarchy< Range, A >::Iterator rhs
    The iterator over the right hand sided.
    Definition amg.hh:307
    \n+
    static std::string name()
    Definition amg.hh:672
    \n+
    bool usesDirectCoarseLevelSolver() const
    Check whether the coarse solver used is a direct solver.
    Definition amg.hh:1024
    \n+
    X Domain
    The domain type.
    Definition amg.hh:87
    \n+
    static type * create(const M &mat, bool verbose, bool reusevector)
    Definition amg.hh:644
    \n+
    AMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const SmootherArgs &smootherArgs, const Parameters &parms)
    Construct a new amg with a specific coarse solver.
    Definition amg.hh:406
    \n+
    AMG(std::shared_ptr< const Operator > fineOperator, const ParameterTree &configuration, const ParallelInformation &pinfo=ParallelInformation())
    Constructor an AMG via ParameterTree.
    Definition amg.hh:452
    \n+
    ParallelInformationHierarchy::Iterator pinfo
    The iterator over the parallel information.
    Definition amg.hh:287
    \n+
    SolverType
    Definition amg.hh:627
    \n+
    OperatorHierarchy::AggregatesMapList::const_iterator aggregates
    The iterator over the aggregates maps.
    Definition amg.hh:295
    \n+
    SmootherTraits< Smoother >::Arguments SmootherArgs
    The argument type for the construction of the smoother.
    Definition amg.hh:100
    \n+
    Solver< Matrix, solver > SelectedSolver
    Definition amg.hh:677
    \n+
    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
    \n+
    std::string operator()(const std::string &str)
    Definition amg.hh:378
    \n+
    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
    \n+
    S Smoother
    The type of the smoother.
    Definition amg.hh:97
    \n+
    static std::string name()
    Definition amg.hh:649
    \n+
    Hierarchy< Smoother, A >::Iterator smoother
    The iterator over the smoothers.
    Definition amg.hh:279
    \n+
    M Operator
    The matrix operator type.
    Definition amg.hh:73
    \n+
    OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix
    The iterator over the matrices.
    Definition amg.hh:283
    \n+\n+
    static type * create(const M &mat, bool verbose, bool reusevector)
    Definition amg.hh:668
    \n+
    OperatorHierarchy::RedistributeInfoList::const_iterator redist
    The iterator over the redistribution information.
    Definition amg.hh:291
    \n+
    X Range
    The range type.
    Definition amg.hh:89
    \n+
    void presmooth(LevelContext &levelContext, size_t steps)
    Apply pre smoothing on the current level.
    Definition smoother.hh:406
    \n+
    void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)
    Get the aggregate number of each unknown on the coarsest level.
    Definition amg.hh:1162
    \n+
    std::size_t levels()
    Definition amg.hh:876
    \n+
    InverseOperator< Vector, Vector > type
    Definition amg.hh:643
    \n+
    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
    \n+
    Hierarchy< Domain, A >::Iterator lhs
    The iterator over the left hand side.
    Definition amg.hh:299
    \n+
    const void * Arguments
    A type holding all the arguments needed to call the constructor.
    Definition construction.hh:44
    \n+
    static constexpr SolverType solver
    Definition amg.hh:629
    \n+
    static std::shared_ptr< T > construct(Arguments &args)
    Construct an object with the specified arguments.
    Definition construction.hh:52
    \n+
    static constexpr bool isDirectSolver
    Definition amg.hh:679
    \n+
    void recalculateHierarchy()
    Recalculate the matrix hierarchy.
    Definition amg.hh:221
    \n+
    Matrix::field_type field_type
    Definition amg.hh:626
    \n+
    SelectedSolver::type DirectSolver
    Definition amg.hh:678
    \n+
    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
    \n+
    OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy
    The parallal data distribution hierarchy type.
    Definition amg.hh:84
    \n+
    InverseOperator< X, X > CoarseSolver
    the type of the coarse solver.
    Definition amg.hh:91
    \n+
    void post(Domain &x)
    Clean up.
    Definition amg.hh:1139
    \n+
    std::size_t maxlevels()
    Definition amg.hh:881
    \n+
    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
    \n+
    void postsmooth(LevelContext &levelContext, size_t steps)
    Apply post smoothing on the current level.
    Definition smoother.hh:428
    \n+
    std::size_t level
    The level index.
    Definition amg.hh:311
    \n+
    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
    \n+
    void apply(Domain &v, const Range &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition amg.hh:888
    \n+
    Smoother SmootherType
    Definition amg.hh:275
    \n+
    MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy
    The operator hierarchy type.
    Definition amg.hh:82
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition amg.hh:194
    \n+
    PI ParallelInformation
    The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
    Definition amg.hh:80
    \n+
    @ none
    Definition amg.hh:627
    \n+
    @ umfpack
    Definition amg.hh:627
    \n+
    @ superlu
    Definition amg.hh:627
    \n+
    @ atOnceAccu
    Accumulate data to one process at once.
    Definition parameters.hh:243
    \n+
    @ noAccu
    No data accumulution.
    Definition parameters.hh:237
    \n+
    @ successiveAccu
    Successively accumulate to fewer processes.
    Definition parameters.hh:247
    \n
    Definition allocator.hh:11
    \n-
    std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
    Send BlockVector to an output stream.
    Definition bvector.hh:583
    \n-
    A Vector class to support different block types.
    Definition multitypeblockvector.hh:59
    \n+
    ConstIterator class for sequential access.
    Definition matrix.hh:404
    \n+
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    typename Imp::BlockTraits< T >::field_type field_type
    Export the type representing the underlying field.
    Definition matrix.hh:565
    \n+
    row_type::const_iterator ConstColIterator
    Const iterator for the entries of each row.
    Definition matrix.hh:589
    \n+
    T block_type
    Export the type representing the components.
    Definition matrix.hh:568
    \n+
    Definition matrixutils.hh:27
    \n+
    A nonoverlapping operator with communication object.
    Definition novlpschwarz.hh:61
    \n+
    Adapter to turn a matrix into a linear operator.
    Definition operators.hh:136
    \n+
    Norm that uses only the [N][N] entry of the block to determine couplings.
    Definition aggregates.hh:379
    \n+
    Functor using the row sum (infinity) norm to determine strong couplings.
    Definition aggregates.hh:463
    \n+
    Definition aggregates.hh:480
    \n+
    Definition aggregates.hh:496
    \n+
    Criterion taking advantage of symmetric matrices.
    Definition aggregates.hh:519
    \n+
    Criterion suitable for unsymmetric matrices.
    Definition aggregates.hh:539
    \n+
    an algebraic multigrid method using a Krylov-cycle.
    Definition kamg.hh:140
    \n+
    Two grid operator for AMG with Krylov cycle.
    Definition kamg.hh:33
    \n+
    Parallel algebraic multigrid based on agglomeration.
    Definition amg.hh:65
    \n+
    Definition amg.hh:625
    \n+\n+
    Definition amg.hh:1169
    \n+\n+
    An overlapping Schwarz operator.
    Definition schwarz.hh:75
    \n+\n+
    LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
    Type of the mutable iterator.
    Definition hierarchy.hh:216
    \n+
    Iterator over the levels in the hierarchy.
    Definition hierarchy.hh:120
    \n+
    The hierarchies build by the coarsening process.
    Definition matrixhierarchy.hh:61
    \n+
    The criterion describing the stop criteria for the coarsening process.
    Definition matrixhierarchy.hh:283
    \n+
    All parameters for AMG.
    Definition parameters.hh:416
    \n+
    Definition pinfo.hh:28
    \n+
    The default class for the smoother arguments.
    Definition smoother.hh:38
    \n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    X::field_type field_type
    The field type of the preconditioner.
    Definition preconditioner.hh:40
    \n+
    Base class for scalar product and norm computation.
    Definition scalarproducts.hh:52
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n+
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n+
    Categories for the solvers.
    Definition solvercategory.hh:22
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    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
    \n+
    Definition solvercategory.hh:54
    \n+
    Definition solverregistry.hh:77
    \n+
    Definition solvertype.hh:16
    \n+
    SuperLu Solver.
    Definition superlu.hh:271
    \n+
    Definition umfpack.hh:52
    \n+
    The UMFPack direct sparse solver.
    Definition umfpack.hh:258
    \n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,392 +1,1593 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-multitypeblockvector.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+amg.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH\n-6#define DUNE_ISTL_MULTITYPEBLOCKVECTOR_HH\n+5#ifndef DUNE_AMG_AMG_HH\n+6#define DUNE_AMG_AMG_HH\n 7\n-8#include \n-9#include \n-10#include \n-11\n-12#include \n-13#include \n-14#include \n-15#include \n-16#include \n-17\n-18#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-19\n-20// forward declaration\n-21namespace _\bD_\bu_\bn_\be {\n-22 template < typename... Args >\n-23 class MultiTypeBlockVector;\n-24}\n-25\n-26#include \"_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\"\n-27\n-28namespace _\bD_\bu_\bn_\be {\n-29\n-41 template \n-_\b4_\b2 struct FieldTraits< _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n-43 {\n-_\b4_\b4 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br::field_type;\n-_\b4_\b5 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br::real_type;\n-46 };\n-56 template < typename... Args >\n-_\b5_\b7 class _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-58 : public std::tuple\n-59 {\n-61 typedef std::tuple TupleType;\n-62 public:\n-63\n-_\b6_\b5 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = std::size_t;\n-66\n-70 using TupleType::TupleType;\n-71\n-_\b7_\b5 typedef _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br _\bt_\by_\bp_\be;\n-76\n-_\b8_\b2 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = Std::detected_t >_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be...>;\n-83\n-_\b8_\b9 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = Std::detected_t >_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be...>;\n-90\n-91 // make sure that we have an std::common_type: using an assertion produces a\n-more readable error message\n-92 // than a compiler template instantiation error\n-93 static_assert ( sizeof...(Args) == 0 or\n-94 not (std::is_same_v or std::is_same_v),\n-95 \"No std::common_type implemented for the given field_type/real_type of the\n-Args. Please provide an implementation and check that a FieldTraits class is\n-present for your type.\");\n-96\n-97\n-_\b1_\b0_\b3 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be()\n-104 {\n-105 return sizeof...(Args);\n-106 }\n-107\n-_\b1_\b1_\b0 static constexpr _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN()\n-111 {\n-112 return sizeof...(Args);\n-113 }\n-114\n-_\b1_\b1_\b6 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bd_\bi_\bm() const\n-117 {\n-118 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be result = 0;\n-119 Hybrid::forEach(std::make_index_sequence<_\bN()>{},\n-120 [&](auto i){result += std::get(*this).dim();});\n-121\n-122 return result;\n-123 }\n-124\n-143 template< size_type index >\n-144 typename std::tuple_element::type&\n-_\b1_\b4_\b5 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ([[maybe_unused]] const std::integral_constant< size_type, index\n-> indexVariable)\n-146 {\n-147 return std::get(*this);\n-148 }\n-149\n-155 template< size_type index >\n-156 const typename std::tuple_element::type&\n-_\b1_\b5_\b7 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b ([[maybe_unused]] const std::integral_constant< size_type, index\n-> indexVariable) const\n-158 {\n-159 return std::get(*this);\n-160 }\n-161\n-164 template\n-_\b1_\b6_\b5 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const T& newval) {\n-166 Dune::Hybrid::forEach(*this, [&](auto&& entry) {\n-167 entry = newval;\n-168 });\n-169 }\n-170\n-_\b1_\b7_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bt_\by_\bp_\be& newv) {\n-175 using namespace Dune::Hybrid;\n-176 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {\n-177 (*this)[i] += newv[i];\n-178 });\n-179 }\n-180\n-_\b1_\b8_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bt_\by_\bp_\be& newv) {\n-185 using namespace Dune::Hybrid;\n-186 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {\n-187 (*this)[i] -= newv[i];\n-188 });\n-189 }\n-190\n-192 template::value, int> = 0>\n-_\b1_\b9_\b4 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const T& w) {\n-195 Hybrid::forEach(*this, [&](auto&& entry) {\n-196 entry *= w;\n-197 });\n-198 }\n-199\n-201 template::value, int> = 0>\n-_\b2_\b0_\b3 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const T& w) {\n-204 Hybrid::forEach(*this, [&](auto&& entry) {\n-205 entry /= w;\n-206 });\n-207 }\n+8#include \n+9#include \n+10#include \n+11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh>\n+12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh>\n+13#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh>\n+14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n+15#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh>\n+16#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh>\n+17#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh>\n+18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+19#include \n+20#include \n+21#include \n+22#include \n+23#include \n+24\n+25namespace _\bD_\bu_\bn_\be\n+26{\n+27 namespace Amg\n+28 {\n+46 template\n+47 class KAMG;\n+48\n+49 template\n+50 class KAmgTwoGrid;\n+51\n+62 template >\n+_\b6_\b4 class _\bA_\bM_\bG : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+65 {\n+66 template\n+_\b6_\b7 friend class _\bK_\bA_\bM_\bG;\n+68\n+69 friend class _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd<_\bA_\bM_\bG>;\n+70\n+71 public:\n+_\b7_\b3 typedef M _\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n+_\b8_\b0 typedef PI _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n+_\b8_\b2 typedef _\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bM_\b,_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\b> _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n+_\b8_\b4 typedef typename _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n+85\n+_\b8_\b7 typedef X _\bD_\bo_\bm_\ba_\bi_\bn;\n+_\b8_\b9 typedef X _\bR_\ba_\bn_\bg_\be;\n+_\b9_\b1 typedef _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bX_\b,_\bX_\b> _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br;\n+_\b9_\b7 typedef S _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n+98\n+_\b1_\b0_\b0 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n+101\n+_\b1_\b1_\b1 _\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br& coarseSolver,\n+112 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs, const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms);\n+113\n+125 template\n+_\b1_\b2_\b6 _\bA_\bM_\bG(const _\bO_\bp_\be_\br_\ba_\bt_\bo_\br& fineOperator, const C& criterion,\n+127 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs=_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs(),\n+128 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo=_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n+129\n+_\b1_\b8_\b0 _\bA_\bM_\bG(std::shared_ptr fineOperator, const ParameterTree&\n+configuration, const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo=_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n+181\n+_\b1_\b8_\b5 _\bA_\bM_\bG(const _\bA_\bM_\bG& amg);\n+186\n+_\b1_\b8_\b8 void _\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b);\n+189\n+_\b1_\b9_\b1 void _\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d);\n+192\n+_\b1_\b9_\b4 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+195 {\n+196 return category_;\n+197 }\n+198\n+_\b2_\b0_\b0 void _\bp_\bo_\bs_\bt(_\bD_\bo_\bm_\ba_\bi_\bn& x);\n+201\n+206 template\n+_\b2_\b0_\b7 void _\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs(std::vector& cont);\n 208\n-_\b2_\b0_\b9 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b (const _\bt_\by_\bp_\be& newv) const {\n-210 using namespace Dune::Hybrid;\n-211 return accumulate(integralRange(Hybrid::size(*this)), _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0), [&]\n-(auto&& a, auto&& i) {\n-212 return a + (*this)[i]*newv[i];\n-213 });\n-214 }\n-215\n-_\b2_\b1_\b6 _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bd_\bo_\bt (const _\bt_\by_\bp_\be& newv) const {\n-217 using namespace Dune::Hybrid;\n-218 return accumulate(integralRange(Hybrid::size(*this)), _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be(0), [&]\n-(auto&& a, auto&& i) {\n-219 return a + (*this)[i].dot(newv[i]);\n-220 });\n-221 }\n-222\n-_\b2_\b2_\b5 auto _\bo_\bn_\be_\b__\bn_\bo_\br_\bm() const {\n-226 using namespace Dune::Hybrid;\n-227 return accumulate(*this, _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(0), [&](auto&& a, auto&& entry) {\n-228 return a + entry.one_norm();\n-229 });\n-230 }\n+_\b2_\b0_\b9 std::size_t _\bl_\be_\bv_\be_\bl_\bs();\n+210\n+_\b2_\b1_\b1 std::size_t _\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs();\n+212\n+_\b2_\b2_\b1 void _\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by()\n+222 {\n+223 matrices_->recalculateGalerkin(NegateSet());\n+224 }\n+225\n+_\b2_\b3_\b0 bool _\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br() const;\n 231\n-_\b2_\b3_\b4 auto _\bo_\bn_\be_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const {\n-235 using namespace Dune::Hybrid;\n-236 return accumulate(*this, _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(0), [&](auto&& a, auto&& entry) {\n-237 return a + entry.one_norm_real();\n-238 });\n-239 }\n-240\n-_\b2_\b4_\b3 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bt_\bw_\bo_\b__\bn_\bo_\br_\bm_\b2() const {\n-244 using namespace Dune::Hybrid;\n-245 return accumulate(*this, _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be(0), [&](auto&& a, auto&& entry) {\n-246 return a + entry.two_norm2();\n-247 });\n-248 }\n-249\n-_\b2_\b5_\b2 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bt_\bw_\bo_\b__\bn_\bo_\br_\bm() const {return sqrt(this->_\bt_\bw_\bo_\b__\bn_\bo_\br_\bm_\b2());}\n-253\n-_\b2_\b5_\b6 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm() const\n-257 {\n-258 using namespace Dune::Hybrid;\n-259 using std::max;\n-260\n-261 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be result = 0.0;\n-262 // Compute max norm tracking appearing nan values\n-263 // if the field type supports nan.\n-264 if constexpr (HasNaN()) {\n-265 // This variable will preserve any nan value\n-266 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be nanTracker = 1.0;\n-267 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-268 forEach(*this, [&](auto&& entry) {\n-269 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be entryNorm = entry.infinity_norm();\n-270 result = max(entryNorm, result);\n-271 nanTracker += entryNorm;\n-272 });\n-273 // Incorporate possible nan value into result\n-274 result *= (nanTracker / nanTracker);\n-275 } else {\n-276 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-277 forEach(*this, [&](auto&& entry) {\n-278 result = max(entry.infinity_norm(), result);\n-279 });\n-280 }\n-281 return result;\n-282 }\n-283\n-_\b2_\b8_\b6 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl() const\n-287 {\n-288 using namespace Dune::Hybrid;\n-289 using std::max;\n-290\n-291 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be result = 0.0;\n-292 // Compute max norm tracking appearing nan values\n-293 // if the field type supports nan.\n-294 if constexpr (HasNaN()) {\n-295 // This variable will preserve any nan value\n-296 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be nanTracker = 1.0;\n-297 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-298 forEach(*this, [&](auto&& entry) {\n-299 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be entryNorm = entry.infinity_norm_real();\n-300 result = max(entryNorm, result);\n-301 nanTracker += entryNorm;\n-302 });\n-303 // Incorporate possible nan value into result\n-304 result *= (nanTracker / nanTracker);\n-305 } else {\n-306 using namespace Dune::Hybrid; // needed for icc, see issue #31\n-307 forEach(*this, [&](auto&& entry) {\n-308 result = max(entry.infinity_norm_real(), result);\n-309 });\n-310 }\n-311 return result;\n-312 }\n+232 private:\n+233 /*\n+234 * @brief Helper function to create hierarchies with parameter tree.\n+235 *\n+236 * Will create the coarsen criterion with the norm and create the\n+237 * Hierarchies\n+238 * \\tparam Norm Type of the norm to use.\n+239 */\n+240 template\n+241 void createCriterionAndHierarchies(std::shared_ptr\n+matrixptr,\n+242 const PI& pinfo, const Norm&,\n+243 const ParameterTree& configuration,\n+244 std::true_type compiles = std::true_type());\n+245 template\n+246 void createCriterionAndHierarchies(std::shared_ptr\n+matrixptr,\n+247 const PI& pinfo, const Norm&,\n+248 const ParameterTree& configuration,\n+249 std::false_type);\n+254 template\n+255 void createHierarchies(C& criterion, std::shared_ptr\n+matrixptr,\n+256 const PI& pinfo, const ParameterTree& configuration);\n+263 template\n+264 void createHierarchies(C& criterion,\n+265 const std::shared_ptr& matrixptr,\n+266 const PI& pinfo);\n+273 struct LevelContext\n+274 {\n+_\b2_\b7_\b5 typedef _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be;\n+_\b2_\b7_\b9 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bs_\bm_\bo_\bo_\bt_\bh_\be_\br;\n+_\b2_\b8_\b3 typename OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator _\bm_\ba_\bt_\br_\bi_\bx;\n+_\b2_\b8_\b7 typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bp_\bi_\bn_\bf_\bo;\n+_\b2_\b9_\b1 typename OperatorHierarchy::RedistributeInfoList::const_iterator _\br_\be_\bd_\bi_\bs_\bt;\n+_\b2_\b9_\b5 typename OperatorHierarchy::AggregatesMapList::const_iterator _\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs;\n+_\b2_\b9_\b9 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bl_\bh_\bs;\n+_\b3_\b0_\b3 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bu_\bp_\bd_\ba_\bt_\be;\n+_\b3_\b0_\b7 typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bR_\ba_\bn_\bg_\be_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\bh_\bs;\n+_\b3_\b1_\b1 std::size_t _\bl_\be_\bv_\be_\bl;\n+312 };\n 313\n-318 template\n-_\b3_\b1_\b9 void _\ba_\bx_\bp_\by (const Ta& a, const _\bt_\by_\bp_\be& y) {\n-320 using namespace Dune::Hybrid;\n-321 forEach(integralRange(Hybrid::size(*this)), [&](auto&& i) {\n-322 (*this)[i].axpy(a, y[i]);\n-323 });\n-324 }\n-325\n-326 };\n-327\n-328\n-329\n-332 template \n-_\b3_\b3_\b3 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const\n-_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bA_\br_\bg_\bs_\b._\b._\b._\b>& v) {\n-334 using namespace Dune::Hybrid;\n-335 forEach(integralRange(Dune::Hybrid::size(v)), [&](auto&& i) {\n-336 s << \"\\t(\" << i << \"):\\n\" << v[i] << \"\\n\";\n-337 });\n-338 return s;\n-339 }\n-340\n-341} // end namespace Dune\n+314\n+319 void mgc(LevelContext& levelContext);\n+320\n+321 void additiveMgc();\n+322\n+329 void moveToFineLevel(LevelContext& levelContext,bool processedFineLevel);\n+330\n+335 bool moveToCoarseLevel(LevelContext& levelContext);\n+336\n+341 void initIteratorsWithFineLevel(LevelContext& levelContext);\n 342\n-343namespace _\bs_\bt_\bd\n-344{\n-349 template \n-_\b3_\b5_\b0 struct tuple_element >\n-351 {\n-_\b3_\b5_\b2 using _\bt_\by_\bp_\be = typename std::tuple_element >::type;\n-353 };\n-354\n-359 template \n-_\b3_\b6_\b0 struct tuple_size<_\bD_\bu_\bn_\be::MultiTypeBlockVector >\n-361 : std::integral_constant\n-362 {};\n-363}\n-364\n-365#endif\n-_\bg_\bs_\be_\bt_\bc_\b._\bh_\bh\n-Simple iterative methods like Jacobi, Gauss-Seidel, SOR, SSOR, etc. in a\n-generic way.\n-_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-void operator=(const T &newval)\n-Assignment operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:165\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-std::size_t size_type\n-Type used for vector sizes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bN\n-static constexpr size_type N()\n-Number of elements.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:110\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-Std::detected_t< std::common_type_t, typename FieldTraits< std::decay_t< Args >\n->::field_type... > field_type\n-The type used for scalars.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n-static constexpr size_type size()\n-Return the number of non-zero vector entries.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:103\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-std::tuple_element< index, TupleType >::type & operator[](const std::\n-integral_constant< size_type, index > indexVariable)\n-Random-access operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:145\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename MultiTypeBlockVector< Args... >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bm\n-size_type dim() const\n-Number of scalar elements.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-Std::detected_t< std::common_type_t, typename FieldTraits< std::decay_t< Args >\n->::real_type... > real_type\n-The type used for real values.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:89\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bt\n-field_type dot(const type &newv) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n-void operator*=(const T &w)\n-Multiplication with a scalar.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:194\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\ba_\bx_\bp_\by\n-void axpy(const Ta &a, const type &y)\n-Axpy operation on this vector (*this += a * y)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:319\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bt_\bw_\bo_\b__\bn_\bo_\br_\bm\n-real_type two_norm() const\n-Compute the Euclidean norm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:252\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n-void operator/=(const T &w)\n-Division by a scalar.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:203\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bt_\by_\bp_\be\n-MultiTypeBlockVector< Args... > type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bn_\be_\b__\bn_\bo_\br_\bm\n-auto one_norm() const\n-Compute the 1-norm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:225\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bt_\bw_\bo_\b__\bn_\bo_\br_\bm_\b2\n-real_type two_norm2() const\n-Compute the squared Euclidean norm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:243\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n-real_type infinity_norm_real() const\n-Compute the simplified maximum norm (uses 1-norm for complex values)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:286\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n-void operator-=(const type &newv)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:184\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n-real_type infinity_norm() const\n-Compute the maximum norm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:256\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-field_type operator*(const type &newv) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:209\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n-void operator+=(const type &newv)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:174\n-_\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\be_\bl_\be_\bm_\be_\bn_\bt_\b<_\b _\bi_\b,_\b _\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n-typename std::tuple_element< i, std::tuple< Args... > >::type type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:352\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bn_\be_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n-auto one_norm_real() const\n-Compute the simplified 1-norm (uses 1-norm also for complex values)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:234\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-typename MultiTypeBlockVector< Args... >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:45\n-_\bs_\bt_\bd\n-STL namespace.\n+344 std::shared_ptr matrices_;\n+346 _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs smootherArgs_;\n+348 std::shared_ptr > smoothers_;\n+350 std::shared_ptr solver_;\n+352 std::shared_ptr> rhs_;\n+354 std::shared_ptr> lhs_;\n+356 std::shared_ptr> update_;\n+358 using _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt = _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bX_\b>;\n+360 std::shared_ptr scalarProduct_;\n+362 std::size_t gamma_;\n+364 std::size_t preSteps_;\n+366 std::size_t postSteps_;\n+367 bool buildHierarchy_;\n+368 bool additive;\n+369 bool coarsesolverconverged;\n+370 std::shared_ptr coarseSmoother_;\n+372 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category_;\n+374 std::size_t verbosity_;\n+375\n+376 struct ToLower\n+377 {\n+_\b3_\b7_\b8 std::string _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const std::string& str)\n+379 {\n+380 std::stringstream retval;\n+381 std::ostream_iterator out(retval);\n+382 std::transform(str.begin(), str.end(), out,\n+383 [](char c){\n+384 return std::tolower(c, std::locale::classic());\n+385 });\n+386 return retval.str();\n+387 }\n+388 };\n+389 };\n+390\n+391 template\n+_\b3_\b9_\b2 inline _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bA_\bM_\bG(const _\bA_\bM_\bG& amg)\n+393 : matrices_(amg.matrices_), smootherArgs_(amg.smootherArgs_),\n+394 smoothers_(amg.smoothers_), solver_(amg.solver_),\n+395 rhs_(), lhs_(), update_(),\n+396 scalarProduct_(amg.scalarProduct_), gamma_(amg.gamma_),\n+397 preSteps_(amg.preSteps_), postSteps_(amg.postSteps_),\n+398 buildHierarchy_(amg.buildHierarchy_),\n+399 additive(amg.additive), coarsesolverconverged(amg.coarsesolverconverged),\n+400 coarseSmoother_(amg.coarseSmoother_),\n+401 category_(amg.category_),\n+402 verbosity_(amg.verbosity_)\n+403 {}\n+404\n+405 template\n+_\b4_\b0_\b6 _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br&\n+coarseSolver,\n+407 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs,\n+408 const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n+409 : matrices_(stackobject_to_shared_ptr(matrices)), smootherArgs_\n+(smootherArgs),\n+410 smoothers_(new _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br,A>), solver_(&coarseSolver),\n+411 rhs_(), lhs_(), update_(), scalarProduct_(0),\n+412 gamma_(parms.getGamma()), preSteps_(parms.getNoPreSmoothSteps()),\n+413 postSteps_(parms.getNoPostSmoothSteps()), buildHierarchy_(false),\n+414 additive(parms.getAdditive()), coarsesolverconverged(true),\n+415 coarseSmoother_(),\n+416// #warning should category be retrieved from matrices?\n+417 category_(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::category(*smoothers_->coarsest())),\n+418 verbosity_(parms.debugLevel())\n+419 {\n+420 assert(matrices_->isBuilt());\n+421\n+422 // build the necessary smoother hierarchies\n+423 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);\n+424 }\n+425\n+426 template\n+427 template\n+_\b4_\b2_\b8 _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bA_\bM_\bG(const _\bO_\bp_\be_\br_\ba_\bt_\bo_\br& matrix,\n+429 const C& criterion,\n+430 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs,\n+431 const PI& pinfo)\n+432 : smootherArgs_(smootherArgs),\n+433 smoothers_(new _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br,A>), solver_(),\n+434 rhs_(), lhs_(), update_(), scalarProduct_(),\n+435 gamma_(criterion.getGamma()), preSteps_(criterion.getNoPreSmoothSteps()),\n+436 postSteps_(criterion.getNoPostSmoothSteps()), buildHierarchy_(true),\n+437 additive(criterion.getAdditive()), coarsesolverconverged(true),\n+438 coarseSmoother_(),\n+439 category_(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::category(pinfo)),\n+440 verbosity_(criterion.debugLevel())\n+441 {\n+442 if(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(matrix) != _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(pinfo))\n+443 DUNE_THROW(_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by, \"Matrix and Communication must have the\n+same SolverCategory!\");\n+444 // TODO: reestablish compile time checks.\n+445 //static_assert(static_cast(PI::category)==static_cast(S::\n+category),\n+446 // \"Matrix and Solver must match in terms of category!\");\n+447 auto matrixptr = stackobject_to_shared_ptr(matrix);\n+448 createHierarchies(criterion, matrixptr, pinfo);\n+449 }\n+450\n+451 template\n+_\b4_\b5_\b2 _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bA_\bM_\bG(std::shared_ptr matrixptr,\n+453 const ParameterTree& configuration,\n+454 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo) :\n+455 smoothers_(new _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br,A>),\n+456 solver_(), rhs_(), lhs_(), update_(), scalarProduct_(), buildHierarchy_\n+(true),\n+457 coarsesolverconverged(true), coarseSmoother_(),\n+458 category_(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by::category(pinfo))\n+459 {\n+460\n+461 if (configuration.hasKey (\"smootherIterations\"))\n+462 smootherArgs_.iterations = configuration.get(\"smootherIterations\");\n+463\n+464 if (configuration.hasKey (\"smootherRelaxation\"))\n+465 smootherArgs_.relaxationFactor = configuration.get(\"smootherRelaxation\");\n+466\n+467 auto normName = ToLower()(configuration.get(\"strengthMeasure\",\n+\"diagonal\"));\n+468 auto index = configuration.get(\"diagonalRowIndex\", 0);\n+469\n+470 if ( normName == \"diagonal\")\n+471 {\n+472 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename M::field_type;\n+473 using real_type = typename FieldTraits::real_type;\n+474 std::is_convertible compiles;\n+475\n+476 switch (index)\n+477 {\n+478 case 0:\n+479 createCriterionAndHierarchies(matrixptr, pinfo, _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b0_\b>(),\n+configuration, compiles);\n+480 break;\n+481 case 1:\n+482 createCriterionAndHierarchies(matrixptr, pinfo, _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b1_\b>(),\n+configuration, compiles);\n+483 break;\n+484 case 2:\n+485 createCriterionAndHierarchies(matrixptr, pinfo, _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b2_\b>(),\n+configuration, compiles);\n+486 break;\n+487 case 3:\n+488 createCriterionAndHierarchies(matrixptr, pinfo, _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b3_\b>(),\n+configuration, compiles);\n+489 break;\n+490 case 4:\n+491 createCriterionAndHierarchies(matrixptr, pinfo, _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b4_\b>(),\n+configuration, compiles);\n+492 break;\n+493 default:\n+494 DUNE_THROW(InvalidStateException, \"Currently strengthIndex>4 is not\n+supported.\");\n+495 }\n+496 }\n+497 else if (normName == \"rowsum\")\n+498 createCriterionAndHierarchies(matrixptr, pinfo, _\bR_\bo_\bw_\bS_\bu_\bm(), configuration);\n+499 else if (normName == \"frobenius\")\n+500 createCriterionAndHierarchies(matrixptr, pinfo, _\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm(),\n+configuration);\n+501 else if (normName == \"one\")\n+502 createCriterionAndHierarchies(matrixptr, pinfo, _\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm(),\n+configuration);\n+503 else\n+504 DUNE_THROW(Dune::NotImplemented, \"Wrong config file: strengthMeasure\n+\"<\n+508 template\n+509 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\bA_\bn_\bd_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\bi_\be_\bs(std::shared_ptr matrixptr, const PI& pinfo, const Norm&, const ParameterTree&\n+configuration, std::false_type)\n+510 {\n+511 DUNE_THROW(InvalidStateException, \"Strength of connection measure does not\n+support this type (\"\n+512 << className() << \") as it is lacking a conversion\n+to\"\n+513 << className::real_type>() <<\n+\".\");\n+514 }\n+515\n+516 template\n+517 template\n+518 void AMG::createCriterionAndHierarchies(std::shared_ptr matrixptr, const PI& pinfo, const Norm&, const ParameterTree&\n+configuration, std::true_type)\n+519 {\n+520 if (configuration.get(\"criterionSymmetric\", true))\n+521 {\n+522 using Criterion = _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn<\n+523 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b,_\bN_\bo_\br_\bm_\b> >;\n+524 Criterion criterion;\n+525 createHierarchies(criterion, matrixptr, pinfo, configuration);\n+526 }\n+527 else\n+528 {\n+529 using Criterion = _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn<\n+530 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b,_\bN_\bo_\br_\bm_\b> >;\n+531 Criterion criterion;\n+532 createHierarchies(criterion, matrixptr, pinfo, configuration);\n+533 }\n+534 }\n+535\n+536 template\n+537 template\n+538 void AMG::createHierarchies(C& criterion, std::shared_ptr matrixptr, const PI& pinfo, const ParameterTree& configuration)\n+539 {\n+540 if (configuration.hasKey (\"maxLevel\"))\n+541 criterion.setMaxLevel(configuration.get(\"maxLevel\"));\n+542\n+543 if (configuration.hasKey (\"minCoarseningRate\"))\n+544 criterion.setMinCoarsenRate(configuration.get(\"minCoarseningRate\"));\n+545\n+546 if (configuration.hasKey (\"coarsenTarget\"))\n+547 criterion.setCoarsenTarget (configuration.get(\"coarsenTarget\"));\n+548\n+549 if (configuration.hasKey (\"accumulationMode\"))\n+550 {\n+551 std::string mode = ToLower()(configuration.get\n+(\"accumulationMode\"));\n+552 if ( mode == \"none\")\n+553 criterion.setAccumulate(_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be_\b:_\b:_\bn_\bo_\bA_\bc_\bc_\bu);\n+554 else if ( mode == \"atonce\" )\n+555 criterion.setAccumulate(_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be_\b:_\b:_\ba_\bt_\bO_\bn_\bc_\be_\bA_\bc_\bc_\bu);\n+556 else if ( mode == \"successive\")\n+557 criterion.setCoarsenTarget (_\bA_\bc_\bc_\bu_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn_\bM_\bo_\bd_\be_\b:_\b:_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu);\n+558 else\n+559 DUNE_THROW(InvalidSolverFactoryConfiguration, \"Parameter accumulationMode\n+does not allow value \"\n+560 << mode <<\".\");\n+561 }\n+562\n+563 if (configuration.hasKey (\"prolongationDampingFactor\"))\n+564 criterion.setProlongationDampingFactor (configuration.get\n+(\"prolongationDampingFactor\"));\n+565\n+566 if (configuration.hasKey(\"defaultAggregationSizeMode\"))\n+567 {\n+568 auto mode = ToLower()(configuration.get\n+(\"defaultAggregationSizeMode\"));\n+569 auto dim = configuration.get(\"defaultAggregationDimension\");\n+570 std::size_t maxDistance = 2;\n+571 if (configuration.hasKey(\"MaxAggregateDistance\"))\n+572 maxDistance = configuration.get(\"maxAggregateDistance\");\n+573 if (mode == \"isotropic\")\n+574 criterion.setDefaultValuesIsotropic(dim, maxDistance);\n+575 else if(mode == \"anisotropic\")\n+576 criterion.setDefaultValuesAnisotropic(dim, maxDistance);\n+577 else\n+578 DUNE_THROW(InvalidSolverFactoryConfiguration, \"Parameter accumulationMode\n+does not allow value \"\n+579 << mode <<\".\");\n+580 }\n+581\n+582 if (configuration.hasKey(\"maxAggregateDistance\"))\n+583 criterion.setMaxDistance(configuration.get\n+(\"maxAggregateDistance\"));\n+584\n+585 if (configuration.hasKey(\"minAggregateSize\"))\n+586 criterion.setMinAggregateSize(configuration.get\n+(\"minAggregateSize\"));\n+587\n+588 if (configuration.hasKey(\"maxAggregateSize\"))\n+589 criterion.setMaxAggregateSize(configuration.get\n+(\"maxAggregateSize\"));\n+590\n+591 if (configuration.hasKey(\"maxAggregateConnectivity\"))\n+592 criterion.setMaxConnectivity(configuration.get\n+(\"maxAggregateConnectivity\"));\n+593\n+594 if (configuration.hasKey (\"alpha\"))\n+595 criterion.setAlpha (configuration.get (\"alpha\"));\n+596\n+597 if (configuration.hasKey (\"beta\"))\n+598 criterion.setBeta (configuration.get (\"beta\"));\n+599\n+600 if (configuration.hasKey (\"gamma\"))\n+601 criterion.setGamma (configuration.get (\"gamma\"));\n+602 gamma_ = criterion.getGamma();\n+603\n+604 if (configuration.hasKey (\"additive\"))\n+605 criterion.setAdditive (configuration.get(\"additive\"));\n+606 additive = criterion.getAdditive();\n+607\n+608 if (configuration.hasKey (\"preSteps\"))\n+609 criterion.setNoPreSmoothSteps (configuration.get\n+(\"preSteps\"));\n+610 preSteps_ = criterion.getNoPreSmoothSteps ();\n+611\n+612 if (configuration.hasKey (\"postSteps\"))\n+613 criterion.setNoPostSmoothSteps (configuration.get\n+(\"postSteps\"));\n+614 postSteps_ = criterion.getNoPostSmoothSteps ();\n+615\n+616 verbosity_ = configuration.get(\"verbosity\", 0);\n+617 criterion.setDebugLevel (verbosity_);\n+618\n+619 createHierarchies(criterion, matrixptr, pinfo);\n+620 }\n+621\n+622 template \n+_\b6_\b2_\b4 struct _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+625 {\n+_\b6_\b2_\b6 typedef typename Matrix :: field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b6_\b2_\b7 enum _\bS_\bo_\bl_\bv_\be_\br_\bT_\by_\bp_\be { _\bu_\bm_\bf_\bp_\ba_\bc_\bk, _\bs_\bu_\bp_\be_\br_\bl_\bu, _\bn_\bo_\bn_\be };\n+628\n+_\b6_\b2_\b9 static constexpr _\bS_\bo_\bl_\bv_\be_\br_\bT_\by_\bp_\be _\bs_\bo_\bl_\bv_\be_\br =\n+630#if DISABLE_AMG_DIRECTSOLVER\n+631 _\bn_\bo_\bn_\be;\n+632#elif HAVE_SUITESPARSE_UMFPACK\n+633 _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br_\b<_\b _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b _\b> :: valid ? _\bu_\bm_\bf_\bp_\ba_\bc_\bk : _\bn_\bo_\bn_\be ;\n+634#elif HAVE_SUPERLU\n+635 _\bs_\bu_\bp_\be_\br_\bl_\bu ;\n+636#else\n+637 _\bn_\bo_\bn_\be;\n+638#endif\n+639\n+640 template \n+_\b6_\b4_\b1 struct _\bS_\bo_\bl_\bv_\be_\br\n+642 {\n+_\b6_\b4_\b3 typedef _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bV_\be_\bc_\bt_\bo_\br_\b,_\bV_\be_\bc_\bt_\bo_\br_\b> _\bt_\by_\bp_\be;\n+_\b6_\b4_\b4 static _\bt_\by_\bp_\be* _\bc_\br_\be_\ba_\bt_\be(const M& _\bm_\ba_\bt, bool verbose, bool reusevector )\n+645 {\n+646 DUNE_THROW(NotImplemented,\"DirectSolver not selected\");\n+647 return nullptr;\n+648 }\n+_\b6_\b4_\b9 static std::string _\bn_\ba_\bm_\be () { return \"None\"; }\n+650 };\n+651#if HAVE_SUITESPARSE_UMFPACK\n+652 template \n+653 struct Solver< M, _\bu_\bm_\bf_\bp_\ba_\bc_\bk >\n+654 {\n+655 typedef _\bU_\bM_\bF_\bP_\ba_\bc_\bk_\b<_\b _\bM_\b _\b> _\bt_\by_\bp_\be;\n+656 static _\bt_\by_\bp_\be* _\bc_\br_\be_\ba_\bt_\be(const M& _\bm_\ba_\bt, bool verbose, bool reusevector )\n+657 {\n+658 return new _\bt_\by_\bp_\be(_\bm_\ba_\bt, verbose, reusevector );\n+659 }\n+660 static std::string _\bn_\ba_\bm_\be () { return \"UMFPack\"; }\n+661 };\n+662#endif\n+663#if HAVE_SUPERLU\n+664 template \n+_\b6_\b6_\b5 struct _\bS_\bo_\bl_\bv_\be_\br< M, _\bs_\bu_\bp_\be_\br_\bl_\bu >\n+666 {\n+_\b6_\b6_\b7 typedef _\bS_\bu_\bp_\be_\br_\bL_\bU_\b<_\b _\bM_\b _\b> _\bt_\by_\bp_\be;\n+_\b6_\b6_\b8 static _\bt_\by_\bp_\be* _\bc_\br_\be_\ba_\bt_\be(const M& _\bm_\ba_\bt, bool verbose, bool reusevector )\n+669 {\n+670 return new _\bt_\by_\bp_\be(_\bm_\ba_\bt, verbose, reusevector );\n+671 }\n+_\b6_\b7_\b2 static std::string _\bn_\ba_\bm_\be () { return \"SuperLU\"; }\n+673 };\n+674#endif\n+675\n+676 // define direct solver type to be used\n+_\b6_\b7_\b7 typedef _\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bs_\bo_\bl_\bv_\be_\br_\b _\b> _\bS_\be_\bl_\be_\bc_\bt_\be_\bd_\bS_\bo_\bl_\bv_\be_\br ;\n+_\b6_\b7_\b8 typedef typename SelectedSolver :: type _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br;\n+_\b6_\b7_\b9 static constexpr bool _\bi_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br = _\bs_\bo_\bl_\bv_\be_\br != _\bn_\bo_\bn_\be;\n+_\b6_\b8_\b0 static std::string _\bn_\ba_\bm_\be() { return SelectedSolver :: name (); }\n+_\b6_\b8_\b1 static _\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br* _\bc_\br_\be_\ba_\bt_\be(const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt, bool verbose, bool\n+reusevector )\n+682 {\n+683 return SelectedSolver :: create( _\bm_\ba_\bt, verbose, reusevector );\n+684 }\n+685 };\n+686\n+687 template\n+688 template\n+689 void AMG::createHierarchies(C& criterion,\n+690 const std::shared_ptr& matrixptr,\n+691 const PI& pinfo)\n+692 {\n+693 Timer watch;\n+694 matrices_ = std::make_shared(\n+695 std::const_pointer_cast(matrixptr),\n+696 stackobject_to_shared_ptr(const_cast(pinfo)));\n+697\n+698 matrices_->template build >(criterion);\n+699\n+700 // build the necessary smoother hierarchies\n+701 matrices_->coarsenSmoother(*smoothers_, smootherArgs_);\n+702\n+703 // test whether we should solve on the coarse level. That is the case if we\n+704 // have that level and if there was a redistribution on this level then our\n+705 // communicator has to be valid (size()>0) as the smoother might try to\n+communicate\n+706 // in the constructor.\n+707 if(buildHierarchy_ && matrices_->levels()==matrices_->maxlevels()\n+708 && ( ! matrices_->redistributeInformation().back().isSetup() ||\n+709 matrices_->parallelInformation().coarsest().getRedistributed().communicator\n+().size() ) )\n+710 {\n+711 // We have the carsest level. Create the coarse Solver\n+712 SmootherArgs sargs(smootherArgs_);\n+713 sargs.iterations = 1;\n+714\n+715 typename _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs cargs;\n+716 cargs.setArgs(sargs);\n+717 if(matrices_->redistributeInformation().back().isSetup()) {\n+718 // Solve on the redistributed partitioning\n+719 cargs.setMatrix(matrices_->matrices().coarsest().getRedistributed().getmat\n+());\n+720 cargs.setComm(matrices_->parallelInformation().coarsest().getRedistributed\n+());\n+721 }else{\n+722 cargs.setMatrix(matrices_->matrices().coarsest()->getmat());\n+723 cargs.setComm(*matrices_->parallelInformation().coarsest());\n+724 }\n+725\n+726 coarseSmoother_ = _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(cargs);\n+727 scalarProduct_ = createScalarProduct(cargs.getComm(),category());\n+728\n+729 typedef DirectSolverSelector< typename M::matrix_type, X > SolverSelector;\n+730\n+731 // Use superlu if we are purely sequential or with only one processor on\n+the coarsest level.\n+732 if( SolverSelector::isDirectSolver &&\n+733 (std::is_same::value /\n+/ sequential mode\n+734 || matrices_->parallelInformation().coarsest()->communicator().size()==1 //\n+parallel mode and only one processor\n+735 || (matrices_->parallelInformation().coarsest().isRedistributed()\n+736 && matrices_->parallelInformation().coarsest().getRedistributed\n+().communicator().size()==1\n+737 && matrices_->parallelInformation().coarsest().getRedistributed\n+().communicator().size()>0) )\n+738 )\n+739 { // redistribute and 1 proc\n+740 if(matrices_->parallelInformation().coarsest().isRedistributed())\n+741 {\n+742 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)\n+743 {\n+744 // We are still participating on this level\n+745 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest\n+().getRedistributed().getmat(), false, false));\n+746 }\n+747 else\n+748 solver_.reset();\n+749 }\n+750 else\n+751 {\n+752 solver_.reset(SolverSelector::create(matrices_->matrices().coarsest()-\n+>getmat(), false, false));\n+753 }\n+754 if(verbosity_>0 && matrices_->parallelInformation().coarsest()-\n+>communicator().rank()==0)\n+755 std::cout<< \"Using a direct coarse solver (\" << SolverSelector::name() <<\n+\")\" << std::endl;\n+756 }\n+757 else\n+758 {\n+759 if(matrices_->parallelInformation().coarsest().isRedistributed())\n+760 {\n+761 if(matrices_->matrices().coarsest().getRedistributed().getmat().N()>0)\n+762 // We are still participating on this level\n+763\n+764 // we have to allocate these types using the rebound allocator\n+765 // in order to ensure that we fulfill the alignment requirements\n+766 solver_.reset(new BiCGSTABSolver(const_cast(matrices_->matrices\n+().coarsest().getRedistributed()),\n+767 *scalarProduct_,\n+768 *coarseSmoother_, 1E-2, 1000, 0));\n+769 else\n+770 solver_.reset();\n+771 }else\n+772 {\n+773 solver_.reset(new BiCGSTABSolver(const_cast(*matrices_->matrices\n+().coarsest()),\n+774 *scalarProduct_,\n+775 *coarseSmoother_, 1E-2, 1000, 0));\n+776 // // we have to allocate these types using the rebound allocator\n+777 // // in order to ensure that we fulfill the alignment requirements\n+778 // using Alloc = typename std::allocator_traits::template\n+rebind_alloc>;\n+779 // Alloc alloc;\n+780 // auto p = alloc.allocate(1);\n+781 // std::allocator_traits::construct(alloc, p,\n+782 // const_cast(*matrices_->matrices().coarsest()),\n+783 // *scalarProduct_,\n+784 // *coarseSmoother_, 1E-2, 1000, 0);\n+785 // solver_.reset(p,[](BiCGSTABSolver* p){\n+786 // Alloc alloc;\n+787 // std::allocator_traits::destroy(alloc, p);\n+788 // alloc.deallocate(p,1);\n+789 // });\n+790 }\n+791 }\n+792 }\n+793\n+794 if(verbosity_>0 && matrices_->parallelInformation().finest()->communicator\n+().rank()==0)\n+795 std::cout<<\"Building hierarchy of \"<maxlevels()<<\" levels \"\n+796 <<\"(including coarse solver) took \"<\n+_\b8_\b0_\b1 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b)\n+802 {\n+803 // Detect Matrix rows where all offdiagonal entries are\n+804 // zero and set x such that A_dd*x_d=b_d\n+805 // Thus users can be more careless when setting up their linear\n+806 // systems.\n+807 typedef typename M::matrix_type _\bM_\ba_\bt_\br_\bi_\bx;\n+808 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br RowIter;\n+809 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ColIter;\n+810 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be Block;\n+811 Block zero;\n+812 zero=typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be();\n+813\n+814 const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt=matrices_->matrices().finest()->getmat();\n+815 for(RowIter row=_\bm_\ba_\bt.begin(); row!=_\bm_\ba_\bt.end(); ++row) {\n+816 bool isDirichlet = true;\n+817 bool hasDiagonal = false;\n+818 Block diagonal{};\n+819 for(ColIter _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl!=row->end(); ++_\bc_\bo_\bl) {\n+820 if(row.index()==_\bc_\bo_\bl.index()) {\n+821 diagonal = *_\bc_\bo_\bl;\n+822 hasDiagonal = true;\n+823 }else{\n+824 if(*_\bc_\bo_\bl!=zero)\n+825 isDirichlet = false;\n+826 }\n+827 }\n+828 if(isDirichlet && hasDiagonal)\n+829 {\n+830 auto&& xEntry = Impl::asVector(x[row.index()]);\n+831 auto&& bEntry = Impl::asVector(b[row.index()]);\n+832 Impl::asMatrix(diagonal).solve(xEntry, bEntry);\n+833 }\n+834 }\n+835\n+836 if(smoothers_->levels()>0)\n+837 smoothers_->finest()->pre(x,b);\n+838 else\n+839 // No smoother to make x consistent! Do it by hand\n+840 matrices_->parallelInformation().coarsest()->copyOwnerToAll(x,x);\n+841 rhs_ = std::make_shared>(std::make_shared(b));\n+842 lhs_ = std::make_shared>(std::make_shared(x));\n+843 update_ = std::make_shared>(std::make_shared\n+(x));\n+844 matrices_->coarsenVector(*rhs_);\n+845 matrices_->coarsenVector(*lhs_);\n+846 matrices_->coarsenVector(*update_);\n+847\n+848 // Preprocess all smoothers\n+849 typedef typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n+850 typedef typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bR_\ba_\bn_\bg_\be_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br RIterator;\n+851 typedef typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br DIterator;\n+852 Iterator coarsest = smoothers_->coarsest();\n+853 Iterator smoother = smoothers_->finest();\n+854 RIterator rhs = rhs_->finest();\n+855 DIterator lhs = lhs_->finest();\n+856 if(smoothers_->levels()>1) {\n+857\n+858 assert(lhs_->levels()==rhs_->levels());\n+859 assert(smoothers_->levels()==lhs_->levels() || matrices_->levels\n+()==matrices_->maxlevels());\n+860 assert(smoothers_->levels()+1==lhs_->levels() || matrices_->levels\n+()maxlevels());\n+861\n+862 if(smoother!=coarsest)\n+863 for(++smoother, ++lhs, ++rhs; smoother != coarsest; ++smoother, ++lhs,\n+++rhs)\n+864 smoother->pre(*lhs,*rhs);\n+865 smoother->pre(*lhs,*rhs);\n+866 }\n+867\n+868\n+869 // The preconditioner might change x and b. So we have to\n+870 // copy the changes to the original vectors.\n+871 x = *lhs_->finest();\n+872 b = *rhs_->finest();\n+873\n+874 }\n+875 template\n+_\b8_\b7_\b6 std::size_t _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs()\n+877 {\n+878 return matrices_->levels();\n+879 }\n+880 template\n+_\b8_\b8_\b1 std::size_t _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs()\n+882 {\n+883 return matrices_->maxlevels();\n+884 }\n+885\n+887 template\n+_\b8_\b8_\b8 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n+889 {\n+890 LevelContext levelContext;\n+891\n+892 if(additive) {\n+893 *(rhs_->finest())=d;\n+894 additiveMgc();\n+895 v=*lhs_->finest();\n+896 }else{\n+897 // Init all iterators for the current level\n+898 initIteratorsWithFineLevel(levelContext);\n+899\n+900\n+901 *levelContext.lhs = v;\n+902 *levelContext.rhs = d;\n+903 *levelContext.update=0;\n+904 levelContext.level=0;\n+905\n+906 mgc(levelContext);\n+907\n+908 if(postSteps_==0||matrices_->maxlevels()==1)\n+909 levelContext.pinfo->copyOwnerToAll(*levelContext.update,\n+*levelContext.update);\n+910\n+911 v=*levelContext.update;\n+912 }\n+913\n+914 }\n+915\n+916 template\n+917 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bs_\bW_\bi_\bt_\bh_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl(LevelContext&\n+levelContext)\n+918 {\n+919 levelContext.smoother = smoothers_->finest();\n+920 levelContext.matrix = matrices_->matrices().finest();\n+921 levelContext.pinfo = matrices_->parallelInformation().finest();\n+922 levelContext.redist =\n+923 matrices_->redistributeInformation().begin();\n+924 levelContext.aggregates = matrices_->aggregatesMaps().begin();\n+925 levelContext.lhs = lhs_->finest();\n+926 levelContext.update = update_->finest();\n+927 levelContext.rhs = rhs_->finest();\n+928 }\n+929\n+930 template\n+931 bool AMG\n+932 ::moveToCoarseLevel(LevelContext& levelContext)\n+933 {\n+934\n+935 bool processNextLevel=true;\n+936\n+937 if(levelContext.redist->isSetup()) {\n+938 levelContext.redist->redistribute(static_cast\n+(*levelContext.rhs),\n+939 levelContext.rhs.getRedistributed());\n+940 processNextLevel = levelContext.rhs.getRedistributed().size()>0;\n+941 if(processNextLevel) {\n+942 //restrict defect to coarse level right hand side.\n+943 typename Hierarchy::Iterator fineRhs = levelContext.rhs++;\n+944 ++levelContext.pinfo;\n+945 Transfer\n+946 ::restrictVector(*(*levelContext.aggregates), *levelContext.rhs,\n+947 static_cast(fineRhs.getRedistributed()),\n+948 *levelContext.pinfo);\n+949 }\n+950 }else{\n+951 //restrict defect to coarse level right hand side.\n+952 typename Hierarchy::Iterator fineRhs = levelContext.rhs++;\n+953 ++levelContext.pinfo;\n+954 Transfer\n+955 ::restrictVector(*(*levelContext.aggregates),\n+956 *levelContext.rhs, static_cast(*fineRhs),\n+957 *levelContext.pinfo);\n+958 }\n+959\n+960 if(processNextLevel) {\n+961 // prepare coarse system\n+962 ++levelContext.lhs;\n+963 ++levelContext.update;\n+964 ++levelContext.matrix;\n+965 ++levelContext.level;\n+966 ++levelContext.redist;\n+967\n+968 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_-\n+>levels()maxlevels()) {\n+969 // next level is not the globally coarsest one\n+970 ++levelContext.smoother;\n+971 ++levelContext.aggregates;\n+972 }\n+973 // prepare the update on the next level\n+974 *levelContext.update=0;\n+975 }\n+976 return processNextLevel;\n+977 }\n+978\n+979 template\n+980 void AMG\n+981 ::moveToFineLevel(LevelContext& levelContext, bool processNextLevel)\n+982 {\n+983 if(processNextLevel) {\n+984 if(levelContext.matrix != matrices_->matrices().coarsest() || matrices_-\n+>levels()maxlevels()) {\n+985 // previous level is not the globally coarsest one\n+986 --levelContext.smoother;\n+987 --levelContext.aggregates;\n+988 }\n+989 --levelContext.redist;\n+990 --levelContext.level;\n+991 //prolongate and add the correction (update is in coarse left hand side)\n+992 --levelContext.matrix;\n+993\n+994 //typename Hierarchy::Iterator coarseLhs = lhs--;\n+995 --levelContext.lhs;\n+996 --levelContext.pinfo;\n+997 }\n+998 if(levelContext.redist->isSetup()) {\n+999 // Need to redistribute during prolongateVector\n+1000 levelContext.lhs.getRedistributed()=0;\n+1001 Transfer\n+1002 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update,\n+*levelContext.lhs,\n+1003 levelContext.lhs.getRedistributed(),\n+1004 matrices_->getProlongationDampingFactor(),\n+1005 *levelContext.pinfo, *levelContext.redist);\n+1006 }else{\n+1007 *levelContext.lhs=0;\n+1008 Transfer\n+1009 ::prolongateVector(*(*levelContext.aggregates), *levelContext.update,\n+*levelContext.lhs,\n+1010 matrices_->getProlongationDampingFactor(),\n+1011 *levelContext.pinfo);\n+1012 }\n+1013\n+1014\n+1015 if(processNextLevel) {\n+1016 --levelContext.update;\n+1017 --levelContext.rhs;\n+1018 }\n+1019\n+1020 *levelContext.update += *levelContext.lhs;\n+1021 }\n+1022\n+1023 template\n+_\b1_\b0_\b2_\b4 bool _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br() const\n+1025 {\n+1026 return _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be;\n+1027 }\n+1028\n+1029 template\n+1030 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bm_\bg_\bc(LevelContext& levelContext){\n+1031 if(levelContext.matrix == matrices_->matrices().coarsest() && levels\n+()==maxlevels()) {\n+1032 // Solve directly\n+1033 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt res;\n+1034 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd=true; // If we do not compute this flag will not get updated\n+1035 if(levelContext.redist->isSetup()) {\n+1036 levelContext.redist->redistribute(*levelContext.rhs,\n+levelContext.rhs.getRedistributed());\n+1037 if(levelContext.rhs.getRedistributed().size()>0) {\n+1038 // We are still participating in the computation\n+1039 levelContext.pinfo.getRedistributed().copyOwnerToAll\n+(levelContext.rhs.getRedistributed(),\n+1040 levelContext.rhs.getRedistributed());\n+1041 solver_->apply(levelContext.update.getRedistributed(),\n+1042 levelContext.rhs.getRedistributed(), res);\n+1043 }\n+1044 levelContext.redist->redistributeBackward(*levelContext.update,\n+levelContext.update.getRedistributed());\n+1045 levelContext.pinfo->copyOwnerToAll(*levelContext.update,\n+*levelContext.update);\n+1046 }else{\n+1047 levelContext.pinfo->copyOwnerToAll(*levelContext.rhs, *levelContext.rhs);\n+1048 solver_->apply(*levelContext.update, *levelContext.rhs, res);\n+1049 }\n+1050\n+1051 if (!res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd)\n+1052 coarsesolverconverged = false;\n+1053 }else{\n+1054 // presmoothing\n+1055 _\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh(levelContext, preSteps_);\n+1056\n+1057#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION\n+1058 bool processNextLevel = moveToCoarseLevel(levelContext);\n+1059\n+1060 if(processNextLevel) {\n+1061 // next level\n+1062 for(std::size_t i=0; imatrices().coarsest() && levels\n+()==maxlevels())\n+1065 break;\n+1066 if(i+1 < gamma_){\n+1067 levelContext.matrix->applyscaleadd(-1., *levelContext.lhs,\n+*levelContext.rhs);\n+1068 }\n+1069 }\n+1070 }\n+1071\n+1072 moveToFineLevel(levelContext, processNextLevel);\n+1073#else\n+1074 *lhs=0;\n+1075#endif\n+1076\n+1077 if(levelContext.matrix == matrices_->matrices().finest()) {\n+1078 coarsesolverconverged = matrices_->parallelInformation().finest()-\n+>communicator().prod(coarsesolverconverged);\n+1079 if(!coarsesolverconverged)\n+1080 DUNE_THROW(MathError, \"Coarse solver did not converge\");\n+1081 }\n+1082 // postsmoothing\n+1083 _\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh(levelContext, postSteps_);\n+1084\n+1085 }\n+1086 }\n+1087\n+1088 template\n+1089 void AMG::additiveMgc(){\n+1090\n+1091 // restrict residual to all levels\n+1092 typename ParallelInformationHierarchy::Iterator pinfo=matrices_-\n+>parallelInformation().finest();\n+1093 typename Hierarchy::Iterator rhs=rhs_->finest();\n+1094 typename Hierarchy::Iterator lhs = lhs_->finest();\n+1095 typename OperatorHierarchy::AggregatesMapList::const_iterator\n+aggregates=matrices_->aggregatesMaps().begin();\n+1096\n+1097 for(typename Hierarchy::Iterator fineRhs=rhs++; fineRhs != rhs_-\n+>coarsest(); fineRhs=rhs++, ++aggregates) {\n+1098 ++pinfo;\n+1099 Transfer\n+1100 ::restrictVector(*(*aggregates), *rhs, static_cast\n+(*fineRhs), *pinfo);\n+1101 }\n+1102\n+1103 // pinfo is invalid, set to coarsest level\n+1104 //pinfo = matrices_->parallelInformation().coarsest\n+1105 // calculate correction for all levels\n+1106 lhs = lhs_->finest();\n+1107 typename Hierarchy::Iterator smoother = smoothers_->finest();\n+1108\n+1109 for(rhs=rhs_->finest(); rhs != rhs_->coarsest(); ++lhs, ++rhs, ++smoother)\n+{\n+1110 // presmoothing\n+1111 *lhs=0;\n+1112 smoother->apply(*lhs, *rhs);\n+1113 }\n+1114\n+1115 // Coarse level solve\n+1116#ifndef DUNE_AMG_NO_COARSEGRIDCORRECTION\n+1117 InverseOperatorResult res;\n+1118 pinfo->copyOwnerToAll(*rhs, *rhs);\n+1119 solver_->apply(*lhs, *rhs, res);\n+1120\n+1121 if(!res.converged)\n+1122 DUNE_THROW(MathError, \"Coarse solver did not converge\");\n+1123#else\n+1124 *lhs=0;\n+1125#endif\n+1126 // Prologate and add up corrections from all levels\n+1127 --pinfo;\n+1128 --aggregates;\n+1129\n+1130 for(typename Hierarchy::Iterator coarseLhs = lhs--; coarseLhs !=\n+lhs_->finest(); coarseLhs = lhs--, --aggregates, --pinfo) {\n+1131 Transfer\n+1132 ::prolongateVector(*(*aggregates), *coarseLhs, *lhs, 1.0, *pinfo);\n+1133 }\n+1134 }\n+1135\n+1136\n+1138 template\n+_\b1_\b1_\b3_\b9 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bp_\bo_\bs_\bt([[maybe_unused]] _\bD_\bo_\bm_\ba_\bi_\bn& x)\n+1140 {\n+1141 // Postprocess all smoothers\n+1142 typedef typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n+1143 typedef typename _\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bA_\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br DIterator;\n+1144 Iterator coarsest = smoothers_->coarsest();\n+1145 Iterator smoother = smoothers_->finest();\n+1146 DIterator lhs = lhs_->finest();\n+1147 if(smoothers_->levels()>0) {\n+1148 if(smoother != coarsest || matrices_->levels()maxlevels())\n+1149 smoother->post(*lhs);\n+1150 if(smoother!=coarsest)\n+1151 for(++smoother, ++lhs; smoother != coarsest; ++smoother, ++lhs)\n+1152 smoother->post(*lhs);\n+1153 smoother->post(*lhs);\n+1154 }\n+1155 lhs_ = nullptr;\n+1156 update_ = nullptr;\n+1157 rhs_ = nullptr;\n+1158 }\n+1159\n+1160 template\n+1161 template\n+_\b1_\b1_\b6_\b2 void _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b>_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs(std::vector& cont)\n+1163 {\n+1164 matrices_->getCoarsestAggregatesOnFinest(cont);\n+1165 }\n+1166\n+1167 } // end namespace Amg\n+1168\n+_\b1_\b1_\b6_\b9 struct _\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br{\n+_\b1_\b1_\b7_\b0 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be : std::false_type{};\n+_\b1_\b1_\b7_\b1 template struct\n+_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx> : std::true_type{};\n+1172\n+1173 template\n+1174 std::shared_ptr >\n+_\b1_\b1_\b7_\b5 _\bm_\ba_\bk_\be_\bA_\bM_\bG(const OP& op, const std::string& smoother, const Dune::\n+ParameterTree& config) const\n+1176 {\n+1177 DUNE_THROW(Dune::Exception, \"Operator type not supported by AMG\");\n+1178 }\n+1179\n+1180 template\n+1181 std::shared_ptr >\n+_\b1_\b1_\b8_\b2 _\bm_\ba_\bk_\be_\bA_\bM_\bG(const std::shared_ptr<_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b>>& op, const std::\n+string& smoother,\n+1183 const Dune::ParameterTree& config) const\n+1184 {\n+1185 using OP = _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b>;\n+1186\n+1187 if(smoother == \"ssor\")\n+1188 return std::make_shared>>(op, config);\n+1189 if(smoother == \"sor\")\n+1190 return std::make_shared>>(op, config);\n+1191 if(smoother == \"jac\")\n+1192 return std::make_shared>>(op, config);\n+1193 if(smoother == \"gs\")\n+1194 return std::make_shared>>(op, config);\n+1195 if(smoother == \"ilu\")\n+1196 return std::make_shared>>(op, config);\n+1197 else\n+1198 DUNE_THROW(Dune::Exception, \"Unknown smoother for AMG\");\n+1199 }\n+1200\n+1201 template\n+1202 std::shared_ptr >\n+_\b1_\b2_\b0_\b3 _\bm_\ba_\bk_\be_\bA_\bM_\bG(const std::shared_ptr<_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b>>& op,\n+const std::string& smoother,\n+1204 const Dune::ParameterTree& config) const\n+1205 {\n+1206 using OP = _\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b>;\n+1207\n+1208 auto cop = std::static_pointer_cast(op);\n+1209\n+1210 if(smoother == \"ssor\")\n+1211 return std::make_shared>,C>>(cop, config, op->getCommunication\n+());\n+1212 if(smoother == \"sor\")\n+1213 return std::make_shared>,C>>(cop, config, op->getCommunication\n+());\n+1214 if(smoother == \"jac\")\n+1215 return std::make_shared>,C>>(cop, config, op->getCommunication\n+());\n+1216 if(smoother == \"gs\")\n+1217 return std::make_shared>,C>>(cop, config, op->getCommunication\n+());\n+1218 if(smoother == \"ilu\")\n+1219 return std::make_shared>,C>>(cop, config, op->getCommunication\n+());\n+1220 else\n+1221 DUNE_THROW(Dune::Exception, \"Unknown smoother for AMG\");\n+1222 }\n+1223\n+1224 template\n+1225 std::shared_ptr >\n+_\b1_\b2_\b2_\b6 _\bm_\ba_\bk_\be_\bA_\bM_\bG(const std::shared_ptr<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b>>& op,\n+const std::string& smoother,\n+1227 const Dune::ParameterTree& config) const\n+1228 {\n+1229 using OP = _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bC_\b>;\n+1230\n+1231 if(smoother == \"ssor\")\n+1232 return std::make_shared>,C>>(op, config, op-\n+>getCommunication());\n+1233 if(smoother == \"sor\")\n+1234 return std::make_shared>,C>>(op, config, op-\n+>getCommunication());\n+1235 if(smoother == \"jac\")\n+1236 return std::make_shared>,C>>(op, config, op-\n+>getCommunication());\n+1237 if(smoother == \"gs\")\n+1238 return std::make_shared>,C>>(op, config, op-\n+>getCommunication());\n+1239 if(smoother == \"ilu\")\n+1240 return std::make_shared>,C>>(op, config, op-\n+>getCommunication());\n+1241 else\n+1242 DUNE_THROW(Dune::Exception, \"Unknown smoother for AMG\");\n+1243 }\n+1244\n+1245 template\n+1246 std::shared_ptr::type,\n+1247 typename Dune::TypeListElement<2, TL>::type>>\n+_\b1_\b2_\b4_\b8 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL tl, const std::shared_ptr& op, const Dune::\n+ParameterTree& config,\n+1249 std::enable_if_t<_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\bP_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be,int> = 0) const\n+1250 {\n+1251 using field_type = typename OP::matrix_type::field_type;\n+1252 using real_type = typename FieldTraits::real_type;\n+1253 if (!std::is_convertible())\n+1254 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be, \"AMG needs field_type(\" <<\n+1255 className() <<\n+1256 \") to be convertible to its real_type (\" <<\n+1257 className() <<\n+1258 \").\");\n+1259 std::string smoother = config.get(\"smoother\", \"ssor\");\n+1260 return _\bm_\ba_\bk_\be_\bA_\bM_\bG(op, smoother, config);\n+1261 }\n+1262\n+1263 template\n+1264 std::shared_ptr::type,\n+1265 typename Dune::TypeListElement<2, TL>::type>>\n+_\b1_\b2_\b6_\b6 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const std::shared_ptr& /*mat*/, const Dune::\n+ParameterTree& /*config*/,\n+1267 std::enable_if_t_\b:_\b:\n+_\bv_\ba_\bl_\bu_\be,int> = 0) const\n+1268 {\n+1269 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be, \"AMG needs a FieldMatrix as Matrix\n+block_type\");\n+1270 }\n+1271 };\n+1272\n+_\b1_\b2_\b7_\b3 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR(\"amg\", _\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br());\n+1274} // end namespace Dune\n+1275\n+1276#endif\n+_\bu_\bm_\bf_\bp_\ba_\bc_\bk_\b._\bh_\bh\n+Classes for using UMFPack with ISTL matrices.\n+_\bs_\bu_\bp_\be_\br_\bl_\bu_\b._\bh_\bh\n+Classes for using SuperLU with ISTL matrices.\n+_\bs_\bc_\ba_\bl_\ba_\br_\bp_\br_\bo_\bd_\bu_\bc_\bt_\bs_\b._\bh_\bh\n+Define base class for scalar product and norm.\n+_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n+Implementations of the inverse operator interface.\n+_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n+Templates characterizing the type of a solver.\n+_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bP_\bR_\bE_\bC_\bO_\bN_\bD_\bI_\bT_\bI_\bO_\bN_\bE_\bR\n+#define DUNE_REGISTER_PRECONDITIONER(name,...)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:16\n+_\bm_\ba_\bt_\br_\bi_\bx_\bh_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b._\bh_\bh\n+Provides a classes representing the hierarchies in AMG.\n+_\bt_\br_\ba_\bn_\bs_\bf_\be_\br_\b._\bh_\bh\n+Prolongation and restriction for amg.\n+_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br_\b._\bh_\bh\n+Classes for the generic construction and application of the smoothers.\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bA_\bM_\bG\n+AMG(const AMG &amg)\n+Copy constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bp_\br_\be\n+void pre(Domain &x, Range &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:801\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be\n+static DirectSolver * create(const Matrix &mat, bool verbose, bool reusevector)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:681\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bn_\ba_\bm_\be\n+static std::string name()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:680\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bu_\bp_\bd_\ba_\bt_\be\n+Hierarchy< Domain, A >::Iterator update\n+The iterator over the updates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:303\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\br_\bh_\bs\n+Hierarchy< Range, A >::Iterator rhs\n+The iterator over the right hand sided.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:307\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bs_\bu_\bp_\be_\br_\bl_\bu_\b _\b>_\b:_\b:_\bn_\ba_\bm_\be\n+static std::string name()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:672\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bu_\bs_\be_\bs_\bD_\bi_\br_\be_\bc_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n+bool usesDirectCoarseLevelSolver() const\n+Check whether the coarse solver used is a direct solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1024\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n+X Domain\n+The domain type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be\n+static type * create(const M &mat, bool verbose, bool reusevector)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:644\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bA_\bM_\bG\n+AMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const SmootherArgs\n+&smootherArgs, const Parameters &parms)\n+Construct a new amg with a specific coarse solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:406\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bA_\bM_\bG\n+AMG(std::shared_ptr< const Operator > fineOperator, const ParameterTree\n+&configuration, const ParallelInformation &pinfo=ParallelInformation())\n+Constructor an AMG via ParameterTree.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:452\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bp_\bi_\bn_\bf_\bo\n+ParallelInformationHierarchy::Iterator pinfo\n+The iterator over the parallel information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:287\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bT_\by_\bp_\be\n+SolverType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:627\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs\n+OperatorHierarchy::AggregatesMapList::const_iterator aggregates\n+The iterator over the aggregates maps.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:295\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+SmootherTraits< Smoother >::Arguments SmootherArgs\n+The argument type for the construction of the smoother.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\be_\bl_\be_\bc_\bt_\be_\bd_\bS_\bo_\bl_\bv_\be_\br\n+Solver< Matrix, solver > SelectedSolver\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:677\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bk_\be_\bA_\bM_\bG\n+std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr<\n+MatrixAdapter< M, X, Y > > &op, const std::string &smoother, const Dune::\n+ParameterTree &config) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1182\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bT_\bo_\bL_\bo_\bw_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+std::string operator()(const std::string &str)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:378\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bk_\be_\bA_\bM_\bG\n+std::shared_ptr< Dune::Preconditioner< typename OP::element_type::domain_type,\n+typename OP::element_type::range_type > > makeAMG(const OP &op, const std::\n+string &smoother, const Dune::ParameterTree &config) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1175\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n+S Smoother\n+The type of the smoother.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:97\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bn_\ba_\bm_\be\n+static std::string name()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:649\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bs_\bm_\bo_\bo_\bt_\bh_\be_\br\n+Hierarchy< Smoother, A >::Iterator smoother\n+The iterator over the smoothers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:279\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+M Operator\n+The matrix operator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n+OperatorHierarchy::ParallelMatrixHierarchy::ConstIterator matrix\n+The iterator over the matrices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:283\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bs_\bu_\bp_\be_\br_\bl_\bu_\b _\b>_\b:_\b:_\bt_\by_\bp_\be\n+SuperLU< M > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:667\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bM_\b,_\b _\bs_\bu_\bp_\be_\br_\bl_\bu_\b _\b>_\b:_\b:_\bc_\br_\be_\ba_\bt_\be\n+static type * create(const M &mat, bool verbose, bool reusevector)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:668\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt\n+OperatorHierarchy::RedistributeInfoList::const_iterator redist\n+The iterator over the redistribution information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:291\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be\n+X Range\n+The range type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh\n+void presmooth(LevelContext &levelContext, size_t steps)\n+Apply pre smoothing on the current level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:406\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bs_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bN_\bu_\bm_\bb_\be_\br_\bs\n+void getCoarsestAggregateNumbers(std::vector< std::size_t, A1 > &cont)\n+Get the aggregate number of each unknown on the coarsest level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bl_\be_\bv_\be_\bl_\bs\n+std::size_t levels()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:876\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bt_\by_\bp_\be\n+InverseOperator< Vector, Vector > type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:643\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bk_\be_\bA_\bM_\bG\n+std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr<\n+OverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother,\n+const Dune::ParameterTree &config) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1203\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bl_\bh_\bs\n+Hierarchy< Domain, A >::Iterator lhs\n+The iterator over the left hand side.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+const void * Arguments\n+A type holding all the arguments needed to call the constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bo_\bl_\bv_\be_\br\n+static constexpr SolverType solver\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:629\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< T > construct(Arguments &args)\n+Construct an object with the specified arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn construction.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n+static constexpr bool isDirectSolver\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:679\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\br_\be_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+void recalculateHierarchy()\n+Recalculate the matrix hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:221\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Matrix::field_type field_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:626\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n+SelectedSolver::type DirectSolver\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:678\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+std::shared_ptr< Dune::Preconditioner< typename Dune::TypeListElement< 1, TL\n+>::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL tl,\n+const std::shared_ptr< OP > &op, const Dune::ParameterTree &config, std::\n+enable_if_t< isValidBlockType< typename OP::matrix_type::block_type >::value,\n+int >=0) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1248\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+OperatorHierarchy::ParallelInformationHierarchy ParallelInformationHierarchy\n+The parallal data distribution hierarchy type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:84\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br\n+InverseOperator< X, X > CoarseSolver\n+the type of the coarse solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bp_\bo_\bs_\bt\n+void post(Domain &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1139\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs\n+std::size_t maxlevels()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:881\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bk_\be_\bA_\bM_\bG\n+std::shared_ptr< Dune::Preconditioner< X, Y > > makeAMG(const std::shared_ptr<\n+NonoverlappingSchwarzOperator< M, X, Y, C > > &op, const std::string &smoother,\n+const Dune::ParameterTree &config) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1226\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh\n+void postsmooth(LevelContext &levelContext, size_t steps)\n+Apply post smoothing on the current level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:428\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bl_\be_\bv_\be_\bl\n+std::size_t level\n+The level index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:311\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bA_\bM_\bG\n+AMG(const Operator &fineOperator, const C &criterion, const SmootherArgs\n+&smootherArgs=SmootherArgs(), const ParallelInformation\n+&pinfo=ParallelInformation())\n+Construct an AMG with an inexact coarse solver based on the smoother.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:428\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(Domain &v, const Range &d)\n+Apply one step of the preconditioner to the system A(v)=d.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:888\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be\n+Smoother SmootherType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:275\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+MatrixHierarchy< M, ParallelInformation, A > OperatorHierarchy\n+The operator hierarchy type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+PI ParallelInformation\n+The type of the parallel information. Either OwnerOverlapCommunication or\n+another type describing the...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bn_\bo_\bn_\be\n+@ none\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:627\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bu_\bm_\bf_\bp_\ba_\bc_\bk\n+@ umfpack\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:627\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bu_\bp_\be_\br_\bl_\bu\n+@ superlu\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:627\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\ba_\bt_\bO_\bn_\bc_\be_\bA_\bc_\bc_\bu\n+@ atOnceAccu\n+Accumulate data to one process at once.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:243\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bn_\bo_\bA_\bc_\bc_\bu\n+@ noAccu\n+No data accumulution.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:237\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bs_\bu_\bc_\bc_\be_\bs_\bs_\bi_\bv_\be_\bA_\bc_\bc_\bu\n+@ successiveAccu\n+Successively accumulate to fewer processes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:247\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)\n-Send BlockVector to an output stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:583\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-A Vector class to support different block types.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockvector.hh:59\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:404\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+A generic dynamic dense matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< T >::field_type field_type\n+Export the type representing the underlying field.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:565\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::const_iterator ConstColIterator\n+Const iterator for the entries of each row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:589\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+T block_type\n+Export the type representing the components.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:568\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A nonoverlapping operator with communication object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n+Adapter to turn a matrix into a linear operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+Norm that uses only the [N][N] entry of the block to determine couplings.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:379\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\bo_\bw_\bS_\bu_\bm\n+Functor using the row sum (infinity) norm to determine strong couplings.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:463\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:480\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:496\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+Criterion taking advantage of symmetric matrices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:519\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+Criterion suitable for unsymmetric matrices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:539\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG\n+an algebraic multigrid method using a Krylov-cycle.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:140\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd\n+Two grid operator for AMG with Krylov cycle.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG\n+Parallel algebraic multigrid based on agglomeration.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:625\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\bS_\be_\bl_\be_\bc_\bt_\bo_\br_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:642\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1169\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bM_\bG_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\bT_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:1170\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+An overlapping Schwarz operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation\n+> Iterator\n+Type of the mutable iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bL_\be_\bv_\be_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator over the levels in the hierarchy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:120\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+The hierarchies build by the coarsening process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+The criterion describing the stop criteria for the coarsening process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:283\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+All parameters for AMG.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+The default class for the smoother arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bX_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:40\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Base class for scalar product and norm computation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n+bool converged\n+True if convergence criterion has been met.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Abstract base class for all solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Categories for the solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:22\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+static Category category(const OP &op, decltype(op.category()) *=nullptr)\n+Helperfunction to extract the solver category either from an enum, or from the\n+newly introduced virtu...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\ba_\bl_\bi_\bd_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bu_\bp_\be_\br_\bL_\bU\n+SuperLu Solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn superlu.hh:271\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk_\bM_\be_\bt_\bh_\bo_\bd_\bC_\bh_\bo_\bo_\bs_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bM_\bF_\bP_\ba_\bc_\bk\n+The UMFPack direct sparse solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn umfpack.hh:258\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00194.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00194.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: ldl.hh File Reference\n+dune-istl: globalaggregates.hh File Reference\n \n \n \n \n \n \n \n@@ -65,71 +65,61 @@\n \n \n \n \n \n \n \n \n+ \n \n
    \n \n-

    Class for using LDL with ISTL matrices. \n+

    Provdes class for identifying aggregates globally. \n More...

    \n-
    #include <iostream>
    \n-#include <memory>
    \n-#include <type_traits>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/istl/bccsmatrixinitializer.hh>
    \n-#include <dune/istl/solvers.hh>
    \n-#include <dune/istl/solvertype.hh>
    \n-#include <dune/istl/solverfactory.hh>
    \n+
    #include "aggregates.hh"
    \n+#include "pinfo.hh"
    \n+#include <dune/common/parallel/indexset.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n-\n+\n \n-\n+\n \n-\n+\n \n-\n+\n+\n \n-\n+\n \n-\n+\n \n

    \n Classes

    class  Dune::LDL< Matrix >
     Use the LDL package to directly solve linear systems – empty default class. More...
    struct  Dune::Amg::GlobalAggregatesMap< T, TI >
     
    class  Dune::LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > >
     The LDL direct sparse solver for matrices of type BCRSMatrix. More...
    class  Dune::Amg::GlobalAggregatesMap< T, TI >::Proxy
     
    struct  Dune::IsDirectSolver< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > >
    struct  Dune::Amg::AggregatesGatherScatter< T, TI >
     
    struct  Dune::StoresColumnCompressed< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > >
    struct  Dune::Amg::AggregatesPublisher< T, O, I >
     
    struct  Dune::LDLCreator
    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::LDLCreator::isValidBlock< F >
    struct  Dune::Amg::AggregatesPublisher< T, O, SequentialInformation >
     
    struct  Dune::LDLCreator::isValidBlock< FieldVector< double, k > >
    struct  Dune::CommPolicy< Amg::GlobalAggregatesMap< T, TI > >
     
    \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n+\n+\n

    \n-Functions

     Dune::DUNE_REGISTER_DIRECT_SOLVER ("ldl", Dune::LDLCreator())
     
    namespace  Dune::Amg
     
    \n

    Detailed Description

    \n-

    Class for using LDL with ISTL matrices.

    \n-
    Author
    Marco Agnese, Andrea Sacconi
    \n+

    Provdes class for identifying aggregates globally.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,50 +1,45 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-ldl.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b)\n-Class for using LDL with ISTL matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+globalaggregates.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Provdes class for identifying aggregates globally. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n+#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\b>\n-\u00a0 Use the LDL package to directly solve linear systems \u2013 empty default\n- class. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0 The LDL direct sparse solver for matrices of type _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b:_\b:_\bP_\br_\bo_\bx_\by\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\b _\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,\n- _\bA_\b _\b>_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bI_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<\n+ _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>_\b _\b>\n+\u00a0 Utility class for publishing the aggregate number of the DOFs in the\n+ overlap to other processors and convert them to local indices. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b,_\b _\bk_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"ldl\", _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br())\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Class for using LDL with ISTL matrices.\n+Provdes class for identifying aggregates globally.\n Author\n- Marco Agnese, Andrea Sacconi\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00194_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00194_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: ldl.hh Source File\n+dune-istl: globalaggregates.hh Source File\n \n \n \n \n \n \n \n@@ -70,435 +70,342 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    ldl.hh
    \n+
    globalaggregates.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_LDL_HH
    \n-
    6#define DUNE_ISTL_LDL_HH
    \n+
    5#ifndef DUNE_GLOBALAGGREGATES_HH
    \n+
    6#define DUNE_GLOBALAGGREGATES_HH
    \n
    7
    \n-
    8#if HAVE_SUITESPARSE_LDL || defined DOXYGEN
    \n-
    9
    \n-
    10#include <iostream>
    \n-
    11#include <memory>
    \n-
    12#include <type_traits>
    \n-
    13
    \n-
    14#ifdef __cplusplus
    \n-
    15extern "C"
    \n-
    16{
    \n-
    17#include <ldl.h>
    \n-
    18#include <amd.h>
    \n-
    19}
    \n-
    20#endif
    \n+
    18#include "aggregates.hh"
    \n+
    19#include "pinfo.hh"
    \n+
    20#include <dune/common/parallel/indexset.hh>
    \n
    21
    \n-
    22#include <dune/common/exceptions.hh>
    \n-
    23
    \n-\n-
    25#include <dune/istl/solvers.hh>
    \n-\n-\n-
    28
    \n-
    29namespace Dune {
    \n-
    41 // forward declarations
    \n-
    42 template<class M, class T, class TM, class TD, class TA>
    \n-
    43 class SeqOverlappingSchwarz;
    \n-
    44
    \n-
    45 template<class T, bool tag>
    \n-
    46 struct SeqOverlappingSchwarzAssemblerHelper;
    \n-
    47
    \n-
    54 template<class Matrix>
    \n-
    \n-
    55 class LDL
    \n-
    56 {};
    \n-
    \n-
    57
    \n-
    71 template<typename T, typename A, int n, int m>
    \n-
    \n-
    72 class LDL<BCRSMatrix<FieldMatrix<T,n,m>,A > >
    \n-
    73 : public InverseOperator<BlockVector<FieldVector<T,m>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > >,
    \n-
    74 BlockVector<FieldVector<T,n>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > > >
    \n-
    75 {
    \n-
    76 public:
    \n-\n-\n-
    81 typedef Dune::ISTL::Impl::BCCSMatrix<T,int> LDLMatrix;
    \n-
    83 typedef ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<FieldMatrix<T,n,m>,A>, int> MatrixInitializer;
    \n-
    85 typedef Dune::BlockVector<FieldVector<T,m>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > > domain_type;
    \n-
    87 typedef Dune::BlockVector<FieldVector<T,n>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > > range_type;
    \n-
    88
    \n-
    \n-\n-
    91 {
    \n-\n-
    93 }
    \n-
    \n-
    94
    \n-
    \n-
    104 LDL(const Matrix& matrix, int verbose=0) : matrixIsLoaded_(false), verbose_(verbose)
    \n-
    105 {
    \n-
    106 //check whether T is a supported type
    \n-
    107 static_assert(std::is_same<T,double>::value,"Unsupported Type in LDL (only double supported)");
    \n-
    108 setMatrix(matrix);
    \n-
    109 }
    \n-
    \n-
    110
    \n-
    \n-
    120 LDL(const Matrix& matrix, int verbose, bool) : matrixIsLoaded_(false), verbose_(verbose)
    \n-
    121 {
    \n-
    122 //check whether T is a supported type
    \n-
    123 static_assert(std::is_same<T,double>::value,"Unsupported Type in LDL (only double supported)");
    \n-
    124 setMatrix(matrix);
    \n-
    125 }
    \n-
    \n-
    126
    \n-
    \n-
    136 LDL(const Matrix& matrix, const ParameterTree& config)
    \n-
    137 : LDL(matrix, config.get<int>("verbose", 0))
    \n-
    138 {}
    \n-
    \n-
    139
    \n-
    \n-
    141 LDL() : matrixIsLoaded_(false), verbose_(0)
    \n-
    142 {}
    \n-
    \n-
    143
    \n-
    \n-
    145 virtual ~LDL()
    \n-
    146 {
    \n-
    147 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)
    \n-
    148 free();
    \n-
    149 }
    \n-
    \n-
    150
    \n-
    \n-\n-
    153 {
    \n-
    154 const int dimMat(ldlMatrix_.N());
    \n-
    155 ldl_perm(dimMat, Y_, reinterpret_cast<double*>(&b[0]), P_);
    \n-
    156 ldl_lsolve(dimMat, Y_, Lp_, Li_, Lx_);
    \n-
    157 ldl_dsolve(dimMat, Y_, D_);
    \n-
    158 ldl_ltsolve(dimMat, Y_, Lp_, Li_, Lx_);
    \n-
    159 ldl_permt(dimMat, reinterpret_cast<double*>(&x[0]), Y_, P_);
    \n-
    160 // this is a direct solver
    \n-
    161 res.iterations = 1;
    \n-
    162 res.converged = true;
    \n-
    163 }
    \n-
    \n-
    164
    \n-
    \n-
    166 virtual void apply(domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
    \n-
    167 {
    \n-
    168 apply(x,b,res);
    \n-
    169 }
    \n-
    \n-
    170
    \n-
    \n-
    176 void apply(T* x, T* b)
    \n-
    177 {
    \n-
    178 const int dimMat(ldlMatrix_.N());
    \n-
    179 ldl_perm(dimMat, Y_, b, P_);
    \n-
    180 ldl_lsolve(dimMat, Y_, Lp_, Li_, Lx_);
    \n-
    181 ldl_dsolve(dimMat, Y_, D_);
    \n-
    182 ldl_ltsolve(dimMat, Y_, Lp_, Li_, Lx_);
    \n-
    183 ldl_permt(dimMat, x, Y_, P_);
    \n-
    184 }
    \n-
    \n-
    185
    \n-
    \n-
    186 void setOption([[maybe_unused]] unsigned int option, [[maybe_unused]] double value)
    \n-
    187 {}
    \n-
    \n-
    188
    \n-
    \n-
    190 void setMatrix(const Matrix& matrix)
    \n-
    191 {
    \n-
    192 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)
    \n-
    193 free();
    \n-
    194
    \n-
    195 if (ldlMatrix_.N() + ldlMatrix_.M() + ldlMatrix_.nonzeroes() != 0)
    \n-
    196 ldlMatrix_.free();
    \n-
    197 ldlMatrix_.setSize(MatrixDimension<Matrix>::rowdim(matrix),
    \n-\n-
    199 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(ldlMatrix_);
    \n-
    200
    \n-
    201 copyToBCCSMatrix(initializer, matrix);
    \n-
    202
    \n-
    203 decompose();
    \n-
    204 }
    \n-
    \n-
    205
    \n-
    206 template<class S>
    \n-
    \n-
    207 void setSubMatrix(const Matrix& matrix, const S& rowIndexSet)
    \n-
    208 {
    \n-
    209 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)
    \n-
    210 free();
    \n-
    211
    \n-
    212 if (ldlMatrix_.N() + ldlMatrix_.M() + ldlMatrix_.nonzeroes() != 0)
    \n-
    213 ldlMatrix_.free();
    \n-
    214
    \n-
    215 ldlMatrix_.setSize(rowIndexSet.size()*MatrixDimension<Matrix>::rowdim(matrix) / matrix.N(),
    \n-
    216 rowIndexSet.size()*MatrixDimension<Matrix>::coldim(matrix) / matrix.M());
    \n-
    217 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(ldlMatrix_);
    \n+
    22namespace Dune
    \n+
    23{
    \n+
    24 namespace Amg
    \n+
    25 {
    \n+
    26
    \n+
    27 template<typename T, typename TI>
    \n+
    \n+\n+
    29 {
    \n+
    30 public:
    \n+
    31 typedef TI ParallelIndexSet;
    \n+
    32
    \n+
    33 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
    \n+
    34
    \n+
    35 typedef typename ParallelIndexSet::GlobalIndex IndexedType;
    \n+
    36
    \n+
    37 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
    \n+
    38
    \n+
    39 typedef T Vertex;
    \n+
    40
    \n+
    \n+\n+
    42 const GlobalLookupIndexSet<ParallelIndexSet>& indexset)
    \n+
    43 : aggregates_(aggregates), indexset_(indexset)
    \n+
    44 {}
    \n+
    \n+
    45
    \n+
    \n+
    46 inline const GlobalIndex& operator[](std::size_t index) const
    \n+
    47 {
    \n+
    48 const Vertex& aggregate = aggregates_[index];
    \n+
    49 if(aggregate >= AggregatesMap<Vertex>::ISOLATED) {
    \n+
    50 assert(aggregate != AggregatesMap<Vertex>::UNAGGREGATED);
    \n+
    51 return isolatedMarker;
    \n+
    52 }else{
    \n+
    53 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
    \n+
    54 assert(pair!=0);
    \n+
    55 return pair->global();
    \n+
    56 }
    \n+
    57 }
    \n+
    \n+
    58
    \n+
    59
    \n+
    \n+
    60 inline GlobalIndex& get(std::size_t index)
    \n+
    61 {
    \n+
    62 const Vertex& aggregate = aggregates_[index];
    \n+
    63 assert(aggregate < AggregatesMap<Vertex>::ISOLATED);
    \n+
    64 const Dune::IndexPair<GlobalIndex,LocalIndex >* pair = indexset_.pair(aggregate);
    \n+
    65 assert(pair!=0);
    \n+
    66 return const_cast<GlobalIndex&>(pair->global());
    \n+
    67 }
    \n+
    \n+
    68
    \n+
    \n+
    69 class Proxy
    \n+
    70 {
    \n+
    71 public:
    \n+
    \n+
    72 Proxy(const GlobalLookupIndexSet<ParallelIndexSet>& indexset, Vertex& aggregate)
    \n+
    73 : indexset_(&indexset), aggregate_(&aggregate)
    \n+
    74 {}
    \n+
    \n+
    75
    \n+
    \n+
    76 Proxy& operator=(const GlobalIndex& global)
    \n+
    77 {
    \n+
    78 if(global==isolatedMarker)
    \n+\n+
    80 else{
    \n+
    81 //assert(global < AggregatesMap<Vertex>::ISOLATED);
    \n+
    82 *aggregate_ = indexset_->operator[](global).local();
    \n+
    83 }
    \n+
    84 return *this;
    \n+
    85 }
    \n+
    \n+
    86 private:
    \n+
    87 const GlobalLookupIndexSet<ParallelIndexSet>* indexset_;
    \n+
    88 Vertex* aggregate_;
    \n+
    89 };
    \n+
    \n+
    90
    \n+
    \n+
    91 inline Proxy operator[](std::size_t index)
    \n+
    92 {
    \n+
    93 return Proxy(indexset_, aggregates_[index]);
    \n+
    94 }
    \n+
    \n+
    95
    \n+
    \n+
    96 inline void put(const GlobalIndex& global, size_t i)
    \n+
    97 {
    \n+
    98 aggregates_[i]=indexset_[global].local();
    \n+
    99
    \n+
    100 }
    \n+
    \n+
    101
    \n+
    102 private:
    \n+
    103 AggregatesMap<Vertex>& aggregates_;
    \n+
    104 const GlobalLookupIndexSet<ParallelIndexSet>& indexset_;
    \n+
    105 static const GlobalIndex isolatedMarker;
    \n+
    106 };
    \n+
    \n+
    107
    \n+
    108 template<typename T, typename TI>
    \n+
    109 const typename TI::GlobalIndex GlobalAggregatesMap<T,TI>::isolatedMarker =
    \n+
    110 std::numeric_limits<typename TI::GlobalIndex>::max();
    \n+
    111
    \n+
    112 template<typename T, typename TI>
    \n+
    \n+\n+
    114 {
    \n+\n+
    116 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
    \n+
    117
    \n+
    \n+
    118 static const GlobalIndex& gather(const GlobalAggregatesMap<T,TI>& ga, size_t i)
    \n+
    119 {
    \n+
    120 return ga[i];
    \n+
    121 }
    \n+
    \n+
    122
    \n+
    \n+
    123 static void scatter(GlobalAggregatesMap<T,TI>& ga, GlobalIndex global, size_t i)
    \n+
    124 {
    \n+
    125 ga[i]=global;
    \n+
    126 }
    \n+
    \n+
    127 };
    \n+
    \n+
    128
    \n+
    129 template<typename T, typename O, typename I>
    \n+
    \n+\n+
    131 {};
    \n+
    \n+
    132
    \n+
    133#if HAVE_MPI
    \n+
    134
    \n+
    135#endif
    \n+
    136
    \n+
    137 } // namespace Amg
    \n+
    138
    \n+
    139#if HAVE_MPI
    \n+
    140 // forward declaration
    \n+
    141 template<class T1, class T2>
    \n+\n+
    143#endif
    \n+
    144
    \n+
    145 namespace Amg
    \n+
    146 {
    \n+
    147
    \n+
    148#if HAVE_MPI
    \n+
    158 template<typename T, typename O, typename T1, typename T2>
    \n+
    \n+\n+
    160 {
    \n+
    161 typedef T Vertex;
    \n+
    162 typedef O OverlapFlags;
    \n+\n+\n+\n+
    166
    \n+
    \n+
    167 static void publish(AggregatesMap<Vertex>& aggregates,
    \n+
    168 ParallelInformation& pinfo,
    \n+
    169 const GlobalLookupIndexSet& globalLookup)
    \n+
    170 {
    \n+\n+
    172 GlobalMap gmap(aggregates, globalLookup);
    \n+
    173 pinfo.copyOwnerToAll(gmap,gmap);
    \n+
    174 // communication only needed for ALU
    \n+
    175 // (ghosts with same global id as owners on the same process)
    \n+
    176 if (SolverCategory::category(pinfo) == static_cast<int>(SolverCategory::nonoverlapping))
    \n+
    177 pinfo.copyCopyToAll(gmap,gmap);
    \n+
    178
    \n+
    179 typedef typename ParallelInformation::RemoteIndices::const_iterator Lists;
    \n+
    180 Lists lists = pinfo.remoteIndices().find(pinfo.communicator().rank());
    \n+
    181 if(lists!=pinfo.remoteIndices().end()) {
    \n+
    182
    \n+
    183 // For periodic boundary conditions we must renumber
    \n+
    184 // the aggregates of vertices in the overlap whose owners are
    \n+
    185 // on the same process
    \n+
    186 Vertex maxAggregate =0;
    \n+
    187 typedef typename AggregatesMap<Vertex>::const_iterator Iter;
    \n+
    188 for(Iter i=aggregates.begin(), end=aggregates.end(); i!=end; ++i)
    \n+
    189 maxAggregate = std::max(maxAggregate, *i);
    \n+
    190
    \n+
    191 // Compute new mapping of aggregates in the overlap that we also own
    \n+
    192 std::map<Vertex,Vertex> newMapping;
    \n+
    193
    \n+
    194 // insert all elements into map
    \n+
    195 typedef typename ParallelInformation::RemoteIndices::RemoteIndexList
    \n+
    196 ::const_iterator RIter;
    \n+
    197 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
    \n+
    198 ri!=rend; ++ri)
    \n+
    199 if(O::contains(ri->localIndexPair().local().attribute()))
    \n+
    200 newMapping.insert(std::make_pair(aggregates[ri->localIndexPair().local()],
    \n+
    201 maxAggregate));
    \n+
    202 // renumber
    \n+
    203 typedef typename std::map<Vertex,Vertex>::iterator MIter;
    \n+
    204 for(MIter mi=newMapping.begin(), mend=newMapping.end();
    \n+
    205 mi != mend; ++mi)
    \n+
    206 mi->second=++maxAggregate;
    \n+
    207
    \n+
    208
    \n+
    209 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end();
    \n+
    210 ri!=rend; ++ri)
    \n+
    211 if(O::contains(ri->localIndexPair().local().attribute()))
    \n+
    212 aggregates[ri->localIndexPair().local()] =
    \n+
    213 newMapping[aggregates[ri->localIndexPair().local()]];
    \n+
    214 }
    \n+
    215 }
    \n+
    \n+
    216 };
    \n+
    \n+
    217#endif
    \n
    218
    \n-
    219 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(matrix,rowIndexSet));
    \n-
    220
    \n-
    221 decompose();
    \n-
    222 }
    \n-
    \n-
    223
    \n-
    \n-
    228 inline void setVerbosity(int v)
    \n-
    229 {
    \n-
    230 verbose_=v;
    \n-
    231 }
    \n-
    \n-
    232
    \n-
    \n-\n-
    238 {
    \n-
    239 return ldlMatrix_;
    \n-
    240 }
    \n-
    \n-
    241
    \n-
    \n-
    246 void free()
    \n-
    247 {
    \n-
    248 delete [] D_;
    \n-
    249 delete [] Y_;
    \n-
    250 delete [] Lp_;
    \n-
    251 delete [] Lx_;
    \n-
    252 delete [] Li_;
    \n-
    253 delete [] P_;
    \n-
    254 delete [] Pinv_;
    \n-
    255 ldlMatrix_.free();
    \n-
    256 matrixIsLoaded_ = false;
    \n-
    257 }
    \n-
    \n-
    258
    \n-
    \n-
    260 inline const char* name()
    \n-
    261 {
    \n-
    262 return "LDL";
    \n-
    263 }
    \n-
    \n-
    264
    \n-
    \n-
    269 inline double* getD()
    \n-
    270 {
    \n-
    271 return D_;
    \n-
    272 }
    \n-
    \n-
    273
    \n-
    \n-
    278 inline int* getLp()
    \n-
    279 {
    \n-
    280 return Lp_;
    \n-
    281 }
    \n-
    \n-
    282
    \n-
    \n-
    287 inline int* getLi()
    \n-
    288 {
    \n-
    289 return Li_;
    \n-
    290 }
    \n-
    \n-
    291
    \n-
    \n-
    296 inline double* getLx()
    \n-
    297 {
    \n-
    298 return Lx_;
    \n-
    299 }
    \n-
    \n-
    300
    \n-
    301 private:
    \n-
    302 template<class M,class X, class TM, class TD, class T1>
    \n-\n-
    304
    \n-\n-
    306
    \n-
    308 void decompose()
    \n-
    309 {
    \n-
    310 // allocate vectors
    \n-
    311 const int dimMat(ldlMatrix_.N());
    \n-
    312 D_ = new double [dimMat];
    \n-
    313 Y_ = new double [dimMat];
    \n-
    314 Lp_ = new int [dimMat + 1];
    \n-
    315 Parent_ = new int [dimMat];
    \n-
    316 Lnz_ = new int [dimMat];
    \n-
    317 Flag_ = new int [dimMat];
    \n-
    318 Pattern_ = new int [dimMat];
    \n-
    319 P_ = new int [dimMat];
    \n-
    320 Pinv_ = new int [dimMat];
    \n-
    321
    \n-
    322 double Info [AMD_INFO];
    \n-
    323 if(amd_order (dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(), P_, (double *) NULL, Info) < AMD_OK)
    \n-
    324 DUNE_THROW(InvalidStateException,"Error: AMD failed!");
    \n-
    325 if(verbose_ > 0)
    \n-
    326 amd_info (Info);
    \n-
    327 // compute the symbolic factorisation
    \n-
    328 ldl_symbolic(dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(), Lp_, Parent_, Lnz_, Flag_, P_, Pinv_);
    \n-
    329 // initialise those entries of additionalVectors_ whose dimension is known only now
    \n-
    330 Lx_ = new double [Lp_[dimMat]];
    \n-
    331 Li_ = new int [Lp_[dimMat]];
    \n-
    332 // compute the numeric factorisation
    \n-
    333 const int rank(ldl_numeric(dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(), ldlMatrix_.getValues(),
    \n-
    334 Lp_, Parent_, Lnz_, Li_, Lx_, D_, Y_, Pattern_, Flag_, P_, Pinv_));
    \n-
    335 // free temporary vectors
    \n-
    336 delete [] Flag_;
    \n-
    337 delete [] Pattern_;
    \n-
    338 delete [] Parent_;
    \n-
    339 delete [] Lnz_;
    \n-
    340
    \n-
    341 if(rank!=dimMat)
    \n-
    342 DUNE_THROW(InvalidStateException,"Error: LDL factorisation failed!");
    \n-
    343 }
    \n-
    344
    \n-
    345 LDLMatrix ldlMatrix_;
    \n-
    346 bool matrixIsLoaded_;
    \n-
    347 int verbose_;
    \n-
    348 int* Lp_;
    \n-
    349 int* Parent_;
    \n-
    350 int* Lnz_;
    \n-
    351 int* Flag_;
    \n-
    352 int* Pattern_;
    \n-
    353 int* P_;
    \n-
    354 int* Pinv_;
    \n-
    355 double* D_;
    \n-
    356 double* Y_;
    \n-
    357 double* Lx_;
    \n-
    358 int* Li_;
    \n-
    359 };
    \n-
    \n-
    360
    \n-
    361 template<typename T, typename A, int n, int m>
    \n-
    \n-\n-
    363 {
    \n-
    364 enum {value = true};
    \n-
    365 };
    \n-
    \n-
    366
    \n-
    367 template<typename T, typename A, int n, int m>
    \n-
    \n-\n-
    369 {
    \n-
    370 enum {value = true};
    \n-
    371 };
    \n-
    \n-
    372
    \n-
    \n-
    373 struct LDLCreator {
    \n-
    374 template<class F> struct isValidBlock : std::false_type{};
    \n-
    375 template<int k> struct isValidBlock<FieldVector<double,k>> : std::true_type{};
    \n-
    376
    \n-
    377 template<typename TL, typename M>
    \n-
    378 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n-
    379 typename Dune::TypeListElement<2, TL>::type>>
    \n-
    \n-
    380 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
    \n-
    381 std::enable_if_t<
    \n-
    382 isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n-
    383 {
    \n-
    384 int verbose = config.get("verbose", 0);
    \n-
    385 return std::make_shared<Dune::LDL<M>>(mat,verbose);
    \n-
    386 }
    \n-
    \n-
    387
    \n-
    388 // second version with SFINAE to validate the template parameters of LDL
    \n-
    389 template<typename TL, typename M>
    \n-
    390 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n-
    391 typename Dune::TypeListElement<2, TL>::type>>
    \n-
    \n-
    392 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
    \n-
    393 std::enable_if_t<
    \n-
    394 !isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n-
    395 {
    \n-
    396 DUNE_THROW(UnsupportedType,
    \n-
    397 "Unsupported Type in LDL (only double and std::complex<double> supported)");
    \n-
    398 }
    \n-
    \n-
    399 };
    \n-
    \n-\n-
    401
    \n-
    402} // end namespace Dune
    \n-
    403
    \n-
    404
    \n-
    405#endif //HAVE_SUITESPARSE_LDL
    \n-
    406#endif //DUNE_ISTL_LDL_HH
    \n-
    #define DUNE_REGISTER_DIRECT_SOLVER(name,...)
    Definition solverregistry.hh:13
    \n-
    Implementations of the inverse operator interface.
    \n-\n-\n-
    Templates characterizing the type of a solver.
    \n-
    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.
    Definition ldl.hh:85
    \n-
    Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    The matrix type.
    Definition ldl.hh:78
    \n-
    int * getLp()
    Get factorization Lp.
    Definition ldl.hh:278
    \n-
    LDLMatrix & getInternalMatrix()
    Return the column compress matrix.
    Definition ldl.hh:237
    \n-
    Dune::ISTL::Impl::BCCSMatrix< T, int > LDLMatrix
    The corresponding SuperLU Matrix type.
    Definition ldl.hh:81
    \n-
    double * getLx()
    Get factorization Lx.
    Definition ldl.hh:296
    \n-
    void setVerbosity(int v)
    Sets the verbosity level for the solver.
    Definition ldl.hh:228
    \n-
    void apply(T *x, T *b)
    Additional apply method with c-arrays in analogy to superlu.
    Definition ldl.hh:176
    \n-
    virtual void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
    apply inverse operator, with given convergence criteria.
    Definition ldl.hh:166
    \n-
    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.
    Definition ldl.hh:87
    \n-
    virtual ~LDL()
    Default constructor.
    Definition ldl.hh:145
    \n-
    void free()
    Free allocated space.
    Definition ldl.hh:246
    \n-
    virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
    Apply inverse operator,.
    Definition ldl.hh:152
    \n-
    int * getLi()
    Get factorization Li.
    Definition ldl.hh:287
    \n-
    Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > matrix_type
    Definition ldl.hh:79
    \n-
    void setMatrix(const Matrix &matrix)
    Initialize data from given matrix.
    Definition ldl.hh:190
    \n-
    void setOption(unsigned int option, double value)
    Definition ldl.hh:186
    \n-
    LDL(const Matrix &matrix, int verbose, bool)
    Constructor for compatibility with SuperLU standard constructor.
    Definition ldl.hh:120
    \n-
    double * getD()
    Get factorization diagonal matrix D.
    Definition ldl.hh:269
    \n-
    LDL(const Matrix &matrix, const ParameterTree &config)
    Constructs the LDL solver.
    Definition ldl.hh:136
    \n-
    virtual SolverCategory::Category category() const
    Category of the solver (see SolverCategory::Category)
    Definition ldl.hh:90
    \n-
    ISTL::Impl::BCCSMatrixInitializer< BCRSMatrix< FieldMatrix< T, n, m >, A >, int > MatrixInitializer
    Type of an associated initializer class.
    Definition ldl.hh:83
    \n-
    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 ldl.hh:380
    \n-
    const char * name()
    Get method name.
    Definition ldl.hh:260
    \n-
    void setSubMatrix(const Matrix &matrix, const S &rowIndexSet)
    Definition ldl.hh:207
    \n-
    LDL()
    Default constructor.
    Definition ldl.hh:141
    \n-
    LDL(const Matrix &matrix, int verbose=0)
    Construct a solver object from a BCRSMatrix.
    Definition ldl.hh:104
    \n-
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    219 template<typename T, typename O>
    \n+
    \n+\n+
    221 {
    \n+
    222 typedef T Vertex;
    \n+\n+\n+
    225
    \n+
    \n+
    226 static void publish([[maybe_unused]] AggregatesMap<Vertex>& aggregates,
    \n+
    227 [[maybe_unused]] ParallelInformation& pinfo,
    \n+
    228 [[maybe_unused]] const GlobalLookupIndexSet& globalLookup)
    \n+
    229 {}
    \n+
    \n+
    230 };
    \n+
    \n+
    231
    \n+
    232 } // end Amg namespace
    \n+
    233
    \n+
    234
    \n+
    235#if HAVE_MPI
    \n+
    236 template<typename T, typename TI>
    \n+
    \n+
    237 struct CommPolicy<Amg::GlobalAggregatesMap<T,TI> >
    \n+
    238 {
    \n+\n+\n+
    241 typedef SizeOne IndexedTypeFlag;
    \n+
    \n+
    242 static int getSize(const Type&, int)
    \n+
    243 {
    \n+
    244 return 1;
    \n+
    245 }
    \n+
    \n+
    246 };
    \n+
    \n+
    247#endif
    \n+
    248
    \n+
    249} // end Dune namespace
    \n+
    251#endif
    \n+
    Provides classes for the Coloring process of AMG.
    \n+\n+
    const_iterator begin() const
    Definition aggregates.hh:725
    \n+
    const_iterator end() const
    Definition aggregates.hh:730
    \n+
    const AggregateDescriptor * const_iterator
    Definition aggregates.hh:723
    \n
    Definition allocator.hh:11
    \n-
    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
    \n-
    Definition matrixutils.hh:211
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    size_type M() const
    number of columns (counted in blocks)
    Definition bcrsmatrix.hh:2007
    \n-
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n-
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n-
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n-
    Definition overlappingschwarz.hh:694
    \n-
    Use the LDL package to directly solve linear systems \u2013 empty default class.
    Definition ldl.hh:56
    \n-
    Definition ldl.hh:373
    \n-
    Definition ldl.hh:374
    \n-
    Definition matrixutils.hh:27
    \n-
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n-
    int iterations
    Number of iterations.
    Definition solver.hh:69
    \n-
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n-
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n-
    Definition solverregistry.hh:77
    \n-
    Definition solvertype.hh:16
    \n-
    @ value
    Whether this is a direct solver.
    Definition solvertype.hh:24
    \n-
    Definition solvertype.hh:30
    \n-
    @ value
    whether the solver internally uses column compressed storage
    Definition solvertype.hh:36
    \n+
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n+
    void copyCopyToAll(const T &source, T &dest) const
    Communicate values from copy data points to all other data points.
    Definition owneroverlapcopy.hh:328
    \n+
    Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
    The type of the reverse lookup of indices.
    Definition owneroverlapcopy.hh:456
    \n+
    const Communication< MPI_Comm > & communicator() const
    Definition owneroverlapcopy.hh:299
    \n+
    void copyOwnerToAll(const T &source, T &dest) const
    Communicate values from owner data points to all other data points.
    Definition owneroverlapcopy.hh:311
    \n+
    const RemoteIndices & remoteIndices() const
    Get the underlying remote indices.
    Definition owneroverlapcopy.hh:471
    \n+
    Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
    The type of the parallel index set.
    Definition owneroverlapcopy.hh:449
    \n+
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n+
    Definition globalaggregates.hh:29
    \n+
    const GlobalIndex & operator[](std::size_t index) const
    Definition globalaggregates.hh:46
    \n+
    GlobalIndex & get(std::size_t index)
    Definition globalaggregates.hh:60
    \n+
    ParallelIndexSet::GlobalIndex GlobalIndex
    Definition globalaggregates.hh:33
    \n+
    void put(const GlobalIndex &global, size_t i)
    Definition globalaggregates.hh:96
    \n+
    T Vertex
    Definition globalaggregates.hh:39
    \n+
    GlobalAggregatesMap(AggregatesMap< Vertex > &aggregates, const GlobalLookupIndexSet< ParallelIndexSet > &indexset)
    Definition globalaggregates.hh:41
    \n+
    TI ParallelIndexSet
    Definition globalaggregates.hh:31
    \n+
    ParallelIndexSet::LocalIndex LocalIndex
    Definition globalaggregates.hh:37
    \n+
    ParallelIndexSet::GlobalIndex IndexedType
    Definition globalaggregates.hh:35
    \n+
    Proxy operator[](std::size_t index)
    Definition globalaggregates.hh:91
    \n+
    Definition globalaggregates.hh:70
    \n+
    Proxy(const GlobalLookupIndexSet< ParallelIndexSet > &indexset, Vertex &aggregate)
    Definition globalaggregates.hh:72
    \n+
    Proxy & operator=(const GlobalIndex &global)
    Definition globalaggregates.hh:76
    \n+
    Definition globalaggregates.hh:114
    \n+
    static void scatter(GlobalAggregatesMap< T, TI > &ga, GlobalIndex global, size_t i)
    Definition globalaggregates.hh:123
    \n+
    ParallelIndexSet::GlobalIndex GlobalIndex
    Definition globalaggregates.hh:116
    \n+
    TI ParallelIndexSet
    Definition globalaggregates.hh:115
    \n+
    static const GlobalIndex & gather(const GlobalAggregatesMap< T, TI > &ga, size_t i)
    Definition globalaggregates.hh:118
    \n+
    Definition globalaggregates.hh:131
    \n+
    ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet
    Definition globalaggregates.hh:164
    \n+\n+\n+
    ParallelInformation::ParallelIndexSet IndexSet
    Definition globalaggregates.hh:165
    \n+
    OwnerOverlapCopyCommunication< T1, T2 > ParallelInformation
    Definition globalaggregates.hh:163
    \n+
    static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation &pinfo, const GlobalLookupIndexSet &globalLookup)
    Definition globalaggregates.hh:167
    \n+
    static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation &pinfo, const GlobalLookupIndexSet &globalLookup)
    Definition globalaggregates.hh:226
    \n+
    SequentialInformation ParallelInformation
    Definition globalaggregates.hh:223
    \n+\n+
    ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet
    Definition globalaggregates.hh:224
    \n+
    static int getSize(const Type &, int)
    Definition globalaggregates.hh:242
    \n+
    Amg::GlobalAggregatesMap< T, TI >::IndexedType IndexedType
    Definition globalaggregates.hh:240
    \n+
    Amg::AggregatesMap< T > Type
    Definition globalaggregates.hh:239
    \n+
    SizeOne IndexedTypeFlag
    Definition globalaggregates.hh:241
    \n+
    Definition pinfo.hh:28
    \n+
    int GlobalLookupIndexSet
    Definition pinfo.hh:54
    \n+
    @ nonoverlapping
    Category for non-overlapping solvers.
    Definition solvercategory.hh:27
    \n+
    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
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,535 +1,423 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-ldl.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+globalaggregates.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_LDL_HH\n-6#define DUNE_ISTL_LDL_HH\n+5#ifndef DUNE_GLOBALAGGREGATES_HH\n+6#define DUNE_GLOBALAGGREGATES_HH\n 7\n-8#if HAVE_SUITESPARSE_LDL || defined DOXYGEN\n-9\n-10#include \n-11#include \n-12#include \n-13\n-14#ifdef __cplusplus\n-15extern \"C\"\n-16{\n-17#include \n-18#include \n-19}\n-20#endif\n+18#include \"_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\"\n+19#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n+20#include \n 21\n-22#include \n-23\n-24#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n-25#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n-26#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-27#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n-28\n-29namespace _\bD_\bu_\bn_\be {\n-41 // forward declarations\n-42 template\n-43 class SeqOverlappingSchwarz;\n-44\n-45 template\n-46 struct SeqOverlappingSchwarzAssemblerHelper;\n-47\n-54 template\n-_\b5_\b5 class _\bL_\bD_\bL\n-56 {};\n-57\n-71 template\n-_\b7_\b2 class _\bL_\bD_\bL<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A > >\n-73 : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br, typename std::\n-allocator_traits::template rebind_alloc > >,\n-74 BlockVector, typename std::allocator_traits::template\n-rebind_alloc > > >\n-75 {\n-76 public:\n-_\b7_\b8 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b7_\b9 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b8_\b1 typedef Dune::ISTL::Impl::BCCSMatrix _\bL_\bD_\bL_\bM_\ba_\bt_\br_\bi_\bx;\n-_\b8_\b3 typedef ISTL::Impl::BCCSMatrixInitializer,A>,\n-int> _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n-_\b8_\b5 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bm_\b>, typename std::\n-allocator_traits::template rebind_alloc > > _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b8_\b7 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bn_\b>, typename std::\n-allocator_traits::template rebind_alloc > > _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-88\n-_\b9_\b0 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-91 {\n-92 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-93 }\n-94\n-_\b1_\b0_\b4 _\bL_\bD_\bL(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose=0) : matrixIsLoaded_(false), verbose_\n-(verbose)\n-105 {\n-106 //check whether T is a supported type\n-107 static_assert(std::is_same::value,\"Unsupported Type in LDL (only\n-double supported)\");\n-108 setMatrix(matrix);\n-109 }\n-110\n-_\b1_\b2_\b0 _\bL_\bD_\bL(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose, bool) : matrixIsLoaded_(false),\n-verbose_(verbose)\n-121 {\n-122 //check whether T is a supported type\n-123 static_assert(std::is_same::value,\"Unsupported Type in LDL (only\n-double supported)\");\n-124 setMatrix(matrix);\n-125 }\n-126\n-_\b1_\b3_\b6 _\bL_\bD_\bL(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const ParameterTree& config)\n-137 : _\bL_\bD_\bL(matrix, config._\bg_\be_\bt(\"verbose\", 0))\n-138 {}\n-139\n-_\b1_\b4_\b1 _\bL_\bD_\bL() : matrixIsLoaded_(false), verbose_(0)\n-142 {}\n-143\n-_\b1_\b4_\b5 virtual _\b~_\bL_\bD_\bL()\n+22namespace _\bD_\bu_\bn_\be\n+23{\n+24 namespace Amg\n+25 {\n+26\n+27 template\n+_\b2_\b8 struct _\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+29 {\n+30 public:\n+_\b3_\b1 typedef TI _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+32\n+_\b3_\b3 typedef typename ParallelIndexSet::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+34\n+_\b3_\b5 typedef typename ParallelIndexSet::GlobalIndex _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be;\n+36\n+_\b3_\b7 typedef typename ParallelIndexSet::LocalIndex _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+38\n+_\b3_\b9 typedef T _\bV_\be_\br_\bt_\be_\bx;\n+40\n+_\b4_\b1 _\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+42 const GlobalLookupIndexSet& indexset)\n+43 : aggregates_(aggregates), indexset_(indexset)\n+44 {}\n+45\n+_\b4_\b6 inline const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t index) const\n+47 {\n+48 const _\bV_\be_\br_\bt_\be_\bx& aggregate = aggregates_[index];\n+49 if(aggregate >= _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n+50 assert(aggregate != _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD);\n+51 return isolatedMarker;\n+52 }else{\n+53 const Dune::IndexPair* pair = indexset_.pair\n+(aggregate);\n+54 assert(pair!=0);\n+55 return pair->global();\n+56 }\n+57 }\n+58\n+59\n+_\b6_\b0 inline _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\be_\bt(std::size_t index)\n+61 {\n+62 const _\bV_\be_\br_\bt_\be_\bx& aggregate = aggregates_[index];\n+63 assert(aggregate < _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD);\n+64 const Dune::IndexPair* pair = indexset_.pair\n+(aggregate);\n+65 assert(pair!=0);\n+66 return const_cast<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx&>(pair->global());\n+67 }\n+68\n+_\b6_\b9 class _\bP_\br_\bo_\bx_\by\n+70 {\n+71 public:\n+_\b7_\b2 _\bP_\br_\bo_\bx_\by(const GlobalLookupIndexSet& indexset, _\bV_\be_\br_\bt_\be_\bx&\n+aggregate)\n+73 : indexset_(&indexset), aggregate_(&aggregate)\n+74 {}\n+75\n+_\b7_\b6 _\bP_\br_\bo_\bx_\by& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global)\n+77 {\n+78 if(global==isolatedMarker)\n+79 *aggregate_ = _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD;\n+80 else{\n+81 //assert(global < AggregatesMap::ISOLATED);\n+82 *aggregate_ = indexset_->operator[](global).local();\n+83 }\n+84 return *this;\n+85 }\n+86 private:\n+87 const GlobalLookupIndexSet* indexset_;\n+88 _\bV_\be_\br_\bt_\be_\bx* aggregate_;\n+89 };\n+90\n+_\b9_\b1 inline _\bP_\br_\bo_\bx_\by _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](std::size_t index)\n+92 {\n+93 return _\bP_\br_\bo_\bx_\by(indexset_, aggregates_[index]);\n+94 }\n+95\n+_\b9_\b6 inline void _\bp_\bu_\bt(const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& global, size_t i)\n+97 {\n+98 aggregates_[i]=indexset_[global].local();\n+99\n+100 }\n+101\n+102 private:\n+103 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n+104 const GlobalLookupIndexSet& indexset_;\n+105 static const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx isolatedMarker;\n+106 };\n+107\n+108 template\n+109 const typename TI::GlobalIndex GlobalAggregatesMap::isolatedMarker =\n+110 std::numeric_limits::max();\n+111\n+112 template\n+_\b1_\b1_\b3 struct _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+114 {\n+_\b1_\b1_\b5 typedef TI _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+_\b1_\b1_\b6 typedef typename ParallelIndexSet::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+117\n+_\b1_\b1_\b8 static const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\ba_\bt_\bh_\be_\br(const _\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bT_\b,_\bT_\bI_\b>& ga,\n+size_t i)\n+119 {\n+120 return ga[i];\n+121 }\n+122\n+_\b1_\b2_\b3 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bT_\b,_\bT_\bI_\b>& ga, _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx global,\n+size_t i)\n+124 {\n+125 ga[i]=global;\n+126 }\n+127 };\n+128\n+129 template\n+_\b1_\b3_\b0 struct _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br\n+131 {};\n+132\n+133#if HAVE_MPI\n+134\n+135#endif\n+136\n+137 } // namespace Amg\n+138\n+139#if HAVE_MPI\n+140 // forward declaration\n+141 template\n+142 class _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn;\n+143#endif\n+144\n+145 namespace Amg\n 146 {\n-147 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)\n-148 free();\n-149 }\n-150\n-_\b1_\b5_\b2 virtual void _\ba_\bp_\bp_\bl_\by(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt&\n-res)\n-153 {\n-154 const int dimMat(ldlMatrix_.N());\n-155 ldl_perm(dimMat, Y_, reinterpret_cast(&b[0]), P_);\n-156 ldl_lsolve(dimMat, Y_, Lp_, Li_, Lx_);\n-157 ldl_dsolve(dimMat, Y_, D_);\n-158 ldl_ltsolve(dimMat, Y_, Lp_, Li_, Lx_);\n-159 ldl_permt(dimMat, reinterpret_cast(&x[0]), Y_, P_);\n-160 // this is a direct solver\n-161 res._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 1;\n-162 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = true;\n-163 }\n-164\n-_\b1_\b6_\b6 virtual void _\ba_\bp_\bp_\bl_\by(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, [[maybe_unused]] double\n-reduction, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n-167 {\n-168 apply(x,b,res);\n-169 }\n-170\n-_\b1_\b7_\b6 void _\ba_\bp_\bp_\bl_\by(T* x, T* b)\n-177 {\n-178 const int dimMat(ldlMatrix_.N());\n-179 ldl_perm(dimMat, Y_, b, P_);\n-180 ldl_lsolve(dimMat, Y_, Lp_, Li_, Lx_);\n-181 ldl_dsolve(dimMat, Y_, D_);\n-182 ldl_ltsolve(dimMat, Y_, Lp_, Li_, Lx_);\n-183 ldl_permt(dimMat, x, Y_, P_);\n-184 }\n-185\n-_\b1_\b8_\b6 void _\bs_\be_\bt_\bO_\bp_\bt_\bi_\bo_\bn([[maybe_unused]] unsigned int option, [[maybe_unused]]\n-double value)\n-187 {}\n-188\n-_\b1_\b9_\b0 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix)\n-191 {\n-192 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)\n-193 free();\n-194\n-195 if (ldlMatrix_.N() + ldlMatrix_.M() + ldlMatrix_.nonzeroes() != 0)\n-196 ldlMatrix_.free();\n-197 ldlMatrix_.setSize(_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(matrix),\n-198 _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(matrix));\n-199 ISTL::Impl::BCCSMatrixInitializer initializer(ldlMatrix_);\n-200\n-201 copyToBCCSMatrix(initializer, matrix);\n-202\n-203 decompose();\n-204 }\n-205\n-206 template\n-_\b2_\b0_\b7 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const S& rowIndexSet)\n-208 {\n-209 if ((ldlMatrix_.N() + ldlMatrix_.M() > 0) || matrixIsLoaded_)\n-210 free();\n-211\n-212 if (ldlMatrix_.N() + ldlMatrix_.M() + ldlMatrix_.nonzeroes() != 0)\n-213 ldlMatrix_.free();\n-214\n-215 ldlMatrix_.setSize(rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-(matrix) / matrix._\bN(),\n-216 rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(matrix) / matrix._\bM());\n-217 ISTL::Impl::BCCSMatrixInitializer initializer(ldlMatrix_);\n+147\n+148#if HAVE_MPI\n+158 template\n+_\b1_\b5_\b9 struct _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br >\n+160 {\n+_\b1_\b6_\b1 typedef T _\bV_\be_\br_\bt_\be_\bx;\n+_\b1_\b6_\b2 typedef O _\bO_\bv_\be_\br_\bl_\ba_\bp_\bF_\bl_\ba_\bg_\bs;\n+_\b1_\b6_\b3 typedef _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b1_\b,_\bT_\b2_\b> _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n+_\b1_\b6_\b4 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+_\b1_\b6_\b5 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt _\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+166\n+_\b1_\b6_\b7 static void _\bp_\bu_\bb_\bl_\bi_\bs_\bh(_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+168 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n+169 const _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& globalLookup)\n+170 {\n+171 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> GlobalMap;\n+172 GlobalMap gmap(aggregates, globalLookup);\n+173 pinfo._\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl(gmap,gmap);\n+174 // communication only needed for ALU\n+175 // (ghosts with same global id as owners on the same process)\n+176 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(pinfo) == static_cast(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:\n+_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg))\n+177 pinfo._\bc_\bo_\bp_\by_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl(gmap,gmap);\n+178\n+179 typedef typename ParallelInformation::RemoteIndices::const_iterator Lists;\n+180 Lists lists = pinfo._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().find(pinfo._\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br().rank());\n+181 if(lists!=pinfo._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().end()) {\n+182\n+183 // For periodic boundary conditions we must renumber\n+184 // the aggregates of vertices in the overlap whose owners are\n+185 // on the same process\n+186 _\bV_\be_\br_\bt_\be_\bx maxAggregate =0;\n+187 typedef typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br Iter;\n+188 for(Iter i=aggregates._\bb_\be_\bg_\bi_\bn(), end=aggregates._\be_\bn_\bd(); i!=end; ++i)\n+189 maxAggregate = std::max(maxAggregate, *i);\n+190\n+191 // Compute new mapping of aggregates in the overlap that we also own\n+192 std::map newMapping;\n+193\n+194 // insert all elements into map\n+195 typedef typename ParallelInformation::RemoteIndices::RemoteIndexList\n+196 ::const_iterator RIter;\n+197 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end\n+();\n+198 ri!=rend; ++ri)\n+199 if(O::contains(ri->localIndexPair().local().attribute()))\n+200 newMapping.insert(std::make_pair(aggregates[ri->localIndexPair().local()],\n+201 maxAggregate));\n+202 // renumber\n+203 typedef typename std::map::iterator MIter;\n+204 for(MIter mi=newMapping.begin(), mend=newMapping.end();\n+205 mi != mend; ++mi)\n+206 mi->second=++maxAggregate;\n+207\n+208\n+209 for(RIter ri=lists->second.first->begin(), rend = lists->second.first->end\n+();\n+210 ri!=rend; ++ri)\n+211 if(O::contains(ri->localIndexPair().local().attribute()))\n+212 aggregates[ri->localIndexPair().local()] =\n+213 newMapping[aggregates[ri->localIndexPair().local()]];\n+214 }\n+215 }\n+216 };\n+217#endif\n 218\n-219 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_\bM_\ba_\bt_\br_\bi_\bx,std::\n-set >(matrix,rowIndexSet));\n-220\n-221 decompose();\n-222 }\n-223\n-_\b2_\b2_\b8 inline void _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(int v)\n-229 {\n-230 verbose_=v;\n-231 }\n-232\n-_\b2_\b3_\b7 inline _\bL_\bD_\bL_\bM_\ba_\bt_\br_\bi_\bx& _\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx()\n+219 template\n+_\b2_\b2_\b0 struct _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br\n+221 {\n+_\b2_\b2_\b2 typedef T _\bV_\be_\br_\bt_\be_\bx;\n+_\b2_\b2_\b3 typedef _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n+_\b2_\b2_\b4 typedef typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+225\n+_\b2_\b2_\b6 static void _\bp_\bu_\bb_\bl_\bi_\bs_\bh([[maybe_unused]] _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+227 [[maybe_unused]] _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n+228 [[maybe_unused]] const _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& globalLookup)\n+229 {}\n+230 };\n+231\n+232 } // end Amg namespace\n+233\n+234\n+235#if HAVE_MPI\n+236 template\n+_\b2_\b3_\b7 struct CommPolicy >\n 238 {\n-239 return ldlMatrix_;\n-240 }\n-241\n-_\b2_\b4_\b6 void _\bf_\br_\be_\be()\n-247 {\n-248 delete [] D_;\n-249 delete [] Y_;\n-250 delete [] Lp_;\n-251 delete [] Lx_;\n-252 delete [] Li_;\n-253 delete [] P_;\n-254 delete [] Pinv_;\n-255 ldlMatrix_.free();\n-256 matrixIsLoaded_ = false;\n-257 }\n-258\n-_\b2_\b6_\b0 inline const char* _\bn_\ba_\bm_\be()\n-261 {\n-262 return \"LDL\";\n-263 }\n-264\n-_\b2_\b6_\b9 inline double* _\bg_\be_\bt_\bD()\n-270 {\n-271 return D_;\n-272 }\n-273\n-_\b2_\b7_\b8 inline int* _\bg_\be_\bt_\bL_\bp()\n-279 {\n-280 return Lp_;\n-281 }\n-282\n-_\b2_\b8_\b7 inline int* _\bg_\be_\bt_\bL_\bi()\n-288 {\n-289 return Li_;\n-290 }\n-291\n-_\b2_\b9_\b6 inline double* _\bg_\be_\bt_\bL_\bx()\n-297 {\n-298 return Lx_;\n-299 }\n-300\n-301 private:\n-302 template\n-_\b3_\b0_\b3 friend class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n-304\n-305 friend struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bL_\bD_\bL<_\bM_\ba_\bt_\br_\bi_\bx>,true>;\n-306\n-308 void decompose()\n-309 {\n-310 // allocate vectors\n-311 const int dimMat(ldlMatrix_.N());\n-312 D_ = new double [dimMat];\n-313 Y_ = new double [dimMat];\n-314 Lp_ = new int [dimMat + 1];\n-315 Parent_ = new int [dimMat];\n-316 Lnz_ = new int [dimMat];\n-317 Flag_ = new int [dimMat];\n-318 Pattern_ = new int [dimMat];\n-319 P_ = new int [dimMat];\n-320 Pinv_ = new int [dimMat];\n-321\n-322 double Info [AMD_INFO];\n-323 if(amd_order (dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(),\n-P_, (double *) NULL, Info) < AMD_OK)\n-324 DUNE_THROW(InvalidStateException,\"Error: AMD failed!\");\n-325 if(verbose_ > 0)\n-326 amd_info (Info);\n-327 // compute the symbolic factorisation\n-328 ldl_symbolic(dimMat, ldlMatrix_.getColStart(), ldlMatrix_.getRowIndex(),\n-Lp_, Parent_, Lnz_, Flag_, P_, Pinv_);\n-329 // initialise those entries of additionalVectors_ whose dimension is known\n-only now\n-330 Lx_ = new double [Lp_[dimMat]];\n-331 Li_ = new int [Lp_[dimMat]];\n-332 // compute the numeric factorisation\n-333 const int rank(ldl_numeric(dimMat, ldlMatrix_.getColStart(),\n-ldlMatrix_.getRowIndex(), ldlMatrix_.getValues(),\n-334 Lp_, Parent_, Lnz_, Li_, Lx_, D_, Y_, Pattern_, Flag_, P_, Pinv_));\n-335 // free temporary vectors\n-336 delete [] Flag_;\n-337 delete [] Pattern_;\n-338 delete [] Parent_;\n-339 delete [] Lnz_;\n-340\n-341 if(rank!=dimMat)\n-342 DUNE_THROW(InvalidStateException,\"Error: LDL factorisation failed!\");\n-343 }\n-344\n-345 LDLMatrix ldlMatrix_;\n-346 bool matrixIsLoaded_;\n-347 int verbose_;\n-348 int* Lp_;\n-349 int* Parent_;\n-350 int* Lnz_;\n-351 int* Flag_;\n-352 int* Pattern_;\n-353 int* P_;\n-354 int* Pinv_;\n-355 double* D_;\n-356 double* Y_;\n-357 double* Lx_;\n-358 int* Li_;\n-359 };\n-360\n-361 template\n-_\b3_\b6_\b2 struct _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br<_\bL_\bD_\bL<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A> > >\n-363 {\n-_\b3_\b6_\b4 enum {_\bv_\ba_\bl_\bu_\be = true};\n-365 };\n-366\n-367 template\n-_\b3_\b6_\b8 struct _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd<_\bL_\bD_\bL<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A> > >\n-369 {\n-_\b3_\b7_\b0 enum {_\bv_\ba_\bl_\bu_\be = true};\n-371 };\n-372\n-_\b3_\b7_\b3 struct _\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br {\n-_\b3_\b7_\b4 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::false_type{};\n-_\b3_\b7_\b5 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk> : std::true_type\n-{};\n-376\n-377 template\n-378 std::shared_ptr::type,\n-379 typename Dune::TypeListElement<2, TL>::type>>\n-_\b3_\b8_\b0 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& _\bm_\ba_\bt, const Dune::ParameterTree& config,\n-381 std::enable_if_t<\n-382 _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk::type::block_type>::\n-value,int> = 0) const\n-383 {\n-384 int verbose = config.get(\"verbose\", 0);\n-385 return std::make_shared>(_\bm_\ba_\bt,verbose);\n-386 }\n-387\n-388 // second version with SFINAE to validate the template parameters of LDL\n-389 template\n-390 std::shared_ptr::type,\n-391 typename Dune::TypeListElement<2, TL>::type>>\n-_\b3_\b9_\b2 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /\n-*config*/,\n-393 std::enable_if_t<\n-394 !_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk::type::block_type>::\n-value,int> = 0) const\n-395 {\n-396 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be,\n-397 \"Unsupported Type in LDL (only double and std::complex\n-supported)\");\n-398 }\n-399 };\n-_\b4_\b0_\b0 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"ldl\", _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br());\n-401\n-402} // end namespace Dune\n-403\n-404\n-405#endif //HAVE_SUITESPARSE_LDL\n-406#endif //DUNE_ISTL_LDL_HH\n-_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR\n-#define DUNE_REGISTER_DIRECT_SOLVER(name,...)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:13\n-_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n-Implementations of the inverse operator interface.\n-_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh\n-_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh\n-_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n-Templates characterizing the type of a solver.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-Dune::BlockVector< FieldVector< T, m >, typename std::allocator_traits< A >::\n-template rebind_alloc< FieldVector< T, m > > > domain_type\n-The type of the domain of the solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n-The matrix type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bL_\bp\n-int * getLp()\n-Get factorization Lp.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:278\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n-LDLMatrix & getInternalMatrix()\n-Return the column compress matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:237\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bL_\bD_\bL_\bM_\ba_\bt_\br_\bi_\bx\n-Dune::ISTL::Impl::BCCSMatrix< T, int > LDLMatrix\n-The corresponding SuperLU Matrix type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bL_\bx\n-double * getLx()\n-Get factorization Lx.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:296\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by\n-void setVerbosity(int v)\n-Sets the verbosity level for the solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:228\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(T *x, T *b)\n-Additional apply method with c-arrays in analogy to superlu.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:176\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(domain_type &x, range_type &b, double reduction,\n-InverseOperatorResult &res)\n-apply inverse operator, with given convergence criteria.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:166\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Dune::BlockVector< FieldVector< T, n >, typename std::allocator_traits< A >::\n-template rebind_alloc< FieldVector< T, n > > > range_type\n-The type of the range of the solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\b~_\bL_\bD_\bL\n-virtual ~LDL()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:145\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\br_\be_\be\n-void free()\n-Free allocated space.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:246\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)\n-Apply inverse operator,.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:152\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bL_\bi\n-int * getLi()\n-Get factorization Li.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:287\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > matrix_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-void setMatrix(const Matrix &matrix)\n-Initialize data from given matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:190\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bO_\bp_\bt_\bi_\bo_\bn\n-void setOption(unsigned int option, double value)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:186\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bL_\bD_\bL\n-LDL(const Matrix &matrix, int verbose, bool)\n-Constructor for compatibility with SuperLU standard constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bD\n-double * getD()\n-Get factorization diagonal matrix D.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bL_\bD_\bL\n-LDL(const Matrix &matrix, const ParameterTree &config)\n-Constructs the LDL solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the solver (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:90\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-ISTL::Impl::BCCSMatrixInitializer< BCRSMatrix< FieldMatrix< T, n, m >, A >, int\n-> MatrixInitializer\n-Type of an associated initializer class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL\n->::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const\n-M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock<\n-typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0)\n-const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:380\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bn_\ba_\bm_\be\n-const char * name()\n-Get method name.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:260\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n-void setSubMatrix(const Matrix &matrix, const S &rowIndexSet)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:207\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bL_\bD_\bL\n-LDL()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:141\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bL_\bD_\bL\n-LDL(const Matrix &matrix, int verbose=0)\n-Construct a solver object from a BCRSMatrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:104\n-_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\b2_\b3_\b9 typedef _\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bT_\b> _\bT_\by_\bp_\be;\n+_\b2_\b4_\b0 typedef typename _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bT_\b,_\bT_\bI_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be;\n+_\b2_\b4_\b1 typedef SizeOne _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg;\n+_\b2_\b4_\b2 static int _\bg_\be_\bt_\bS_\bi_\bz_\be(const _\bT_\by_\bp_\be&, int)\n+243 {\n+244 return 1;\n+245 }\n+246 };\n+247#endif\n+248\n+249} // end Dune namespace\n+251#endif\n+_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n+Provides classes for the Coloring process of AMG.\n+_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+const_iterator begin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:725\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n+const_iterator end() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:730\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+const AggregateDescriptor * const_iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:723\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n-PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n-VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n-size_type M() const\n-number of columns (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2007\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-size_type N() const\n-number of rows (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-A vector of blocks with memory management.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n-Sequential overlapping Schwarz preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL\n-Use the LDL package to directly solve linear systems \u00e2\u0080\u0093 empty default class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:373\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bD_\bL_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn ldl.hh:374\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-Statistics about the application of an inverse operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n-int iterations\n-Number of iterations.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n-bool converged\n-True if convergence criterion has been met.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Abstract base class for all solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-@ value\n-Whether this is a direct solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-@ value\n-whether the solver internally uses column compressed storage\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n+A class setting up standard communication for a two-valued attribute set with\n+owner/overlap/copy sema...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl\n+void copyCopyToAll(const T &source, T &dest) const\n+Communicate values from copy data points to all other data points.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:328\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet\n+The type of the reverse lookup of indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:456\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+const Communication< MPI_Comm > & communicator() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl\n+void copyOwnerToAll(const T &source, T &dest) const\n+Communicate values from owner data points to all other data points.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:311\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+const RemoteIndices & remoteIndices() const\n+Get the underlying remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:471\n+_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet\n+The type of the parallel index set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:449\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+Class providing information about the mapping of the vertices onto aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const GlobalIndex & operator[](std::size_t index) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:46\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bg_\be_\bt\n+GlobalIndex & get(std::size_t index)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::GlobalIndex GlobalIndex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bp_\bu_\bt\n+void put(const GlobalIndex &global, size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:96\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+T Vertex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+GlobalAggregatesMap(AggregatesMap< Vertex > &aggregates, const\n+GlobalLookupIndexSet< ParallelIndexSet > &indexset)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+TI ParallelIndexSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:31\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::LocalIndex LocalIndex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:37\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be\n+ParallelIndexSet::GlobalIndex IndexedType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:35\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+Proxy operator[](std::size_t index)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:91\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bP_\br_\bo_\bx_\by\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bP_\br_\bo_\bx_\by_\b:_\b:_\bP_\br_\bo_\bx_\by\n+Proxy(const GlobalLookupIndexSet< ParallelIndexSet > &indexset, Vertex\n+&aggregate)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bP_\br_\bo_\bx_\by_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+Proxy & operator=(const GlobalIndex &global)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:114\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n+static void scatter(GlobalAggregatesMap< T, TI > &ga, GlobalIndex global,\n+size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:123\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::GlobalIndex GlobalIndex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:116\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+TI ParallelIndexSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:115\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n+static const GlobalIndex & gather(const GlobalAggregatesMap< T, TI > &ga,\n+size_t i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:118\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:131\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n+_\b>_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:164\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n+_\b>_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bF_\bl_\ba_\bg_\bs\n+O OverlapFlags\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:162\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n+_\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+T Vertex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:161\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n+_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+ParallelInformation::ParallelIndexSet IndexSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:165\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n+_\b>_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+OwnerOverlapCopyCommunication< T1, T2 > ParallelInformation\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:163\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b1_\b,_\b _\bT_\b2_\b _\b>\n+_\b>_\b:_\b:_\bp_\bu_\bb_\bl_\bi_\bs_\bh\n+static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation\n+&pinfo, const GlobalLookupIndexSet &globalLookup)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:167\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bp_\bu_\bb_\bl_\bi_\bs_\bh\n+static void publish(AggregatesMap< Vertex > &aggregates, ParallelInformation\n+&pinfo, const GlobalLookupIndexSet &globalLookup)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:226\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+SequentialInformation ParallelInformation\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:223\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+T Vertex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:222\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bP_\bu_\bb_\bl_\bi_\bs_\bh_\be_\br_\b<_\b _\bT_\b,_\b _\bO_\b,_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b _\b>_\b:_\b:\n+_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:224\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bS_\bi_\bz_\be\n+static int getSize(const Type &, int)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:242\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be\n+Amg::GlobalAggregatesMap< T, TI >::IndexedType IndexedType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:240\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n+Amg::AggregatesMap< T > Type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:239\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bA_\bm_\bg_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bT_\b,_\b _\bT_\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg\n+SizeOne IndexedTypeFlag\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn globalaggregates.hh:241\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+int GlobalLookupIndexSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n+@ nonoverlapping\n+Category for non-overlapping solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+static Category category(const OP &op, decltype(op.category()) *=nullptr)\n+Helperfunction to extract the solver category either from an enum, or from the\n+newly introduced virtu...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00197.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00197.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: operators.hh File Reference\n+dune-istl: combinedfunctor.hh File Reference\n \n \n \n \n \n \n \n@@ -65,58 +65,44 @@\n \n \n \n \n \n \n \n
    \n \n- \n+
    combinedfunctor.hh File Reference
    \n
    \n
    \n-\n-

    Define general, extensible interface for operators. The available implementation wraps a matrix. \n-More...

    \n-
    #include <dune-istl-config.hh>
    \n-#include <cmath>
    \n-#include <complex>
    \n-#include <iostream>
    \n-#include <iomanip>
    \n-#include <string>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/shared_ptr.hh>
    \n-#include "solvercategory.hh"
    \n+
    #include <tuple>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n \n

    \n Classes

    class  Dune::LinearOperator< X, Y >
     A linear operator. More...
    struct  Dune::Amg::ApplyHelper< i >
     
    class  Dune::AssembledLinearOperator< M, X, Y >
     A linear operator exporting itself in matrix form. More...
    struct  Dune::Amg::ApplyHelper< 0 >
     
    class  Dune::MatrixAdapter< M, X, Y >
     Adapter to turn a matrix into a linear operator. More...
    class  Dune::Amg::CombinedFunctor< T >
     
    \n \n \n \n+\n+\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n-

    Detailed Description

    \n-

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

    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,40 +1,25 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n+ * _\bp_\ba_\ba_\bm_\bg\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-operators.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-_\bc_\bo_\bn_\bc_\be_\bp_\bt\n-Define general, extensible interface for operators. The available\n-implementation wraps a matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n+combinedfunctor.hh File Reference\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0 A linear operator. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\bi_\b _\b>\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0 A linear operator exporting itself in matrix form. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\b0_\b _\b>\n \u00a0\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>\n-\u00a0 Adapter to turn a matrix into a linear operator. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b<_\b _\bT_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Define general, extensible interface for operators. The available\n-implementation wraps a matrix.\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00197_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00197_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: operators.hh Source File\n+dune-istl: combinedfunctor.hh Source File\n \n \n \n \n \n \n \n@@ -70,173 +70,94 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    operators.hh
    \n+
    combinedfunctor.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_OPERATORS_HH
    \n-
    6#define DUNE_ISTL_OPERATORS_HH
    \n+
    5#ifndef DUNE_AMG_COMBINEDFUNCTOR_HH
    \n+
    6#define DUNE_AMG_COMBINEDFUNCTOR_HH
    \n
    7
    \n-
    8#include <dune-istl-config.hh> // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n+
    8#include <tuple>
    \n
    9
    \n-
    10#include <cmath>
    \n-
    11#include <complex>
    \n-
    12#include <iostream>
    \n-
    13#include <iomanip>
    \n-
    14#include <string>
    \n-
    15
    \n-
    16#include <dune/common/exceptions.hh>
    \n-
    17#include <dune/common/shared_ptr.hh>
    \n-
    18
    \n-
    19#include "solvercategory.hh"
    \n-
    20
    \n-
    21
    \n-
    22namespace Dune {
    \n-
    23
    \n-
    46 //=====================================================================
    \n-
    47 // Abstract operator interface
    \n-
    48 //=====================================================================
    \n+
    10namespace Dune
    \n+
    11{
    \n+
    12 namespace Amg
    \n+
    13 {
    \n+
    14
    \n+
    15 template<std::size_t i>
    \n+
    \n+\n+
    17 {
    \n+
    18 template<class TT, class T>
    \n+
    \n+
    19 static void apply(TT tuple, const T& t)
    \n+
    20 {
    \n+
    21 std::get<i-1>(tuple) (t);
    \n+\n+
    23 }
    \n+
    \n+
    24 };
    \n+
    \n+
    25 template<>
    \n+
    \n+
    26 struct ApplyHelper<0>
    \n+
    27 {
    \n+
    28 template<class TT, class T>
    \n+
    \n+
    29 static void apply([[maybe_unused]] TT tuple, [[maybe_unused]] const T& t)
    \n+
    30 {}
    \n+
    \n+
    31 };
    \n+
    \n+
    32
    \n+
    33 template<typename T>
    \n+
    \n+\n+
    35 public T
    \n+
    36 {
    \n+
    37 public:
    \n+
    \n+
    38 CombinedFunctor(const T& tuple_)
    \n+
    39 : T(tuple_)
    \n+
    40 {}
    \n+
    \n+
    41
    \n+
    42 template<class T1>
    \n+
    \n+
    43 void operator()(const T1& t)
    \n+
    44 {
    \n+\n+
    46 }
    \n+
    \n+
    47 };
    \n+
    \n+
    48
    \n
    49
    \n-
    50
    \n-
    68 template<class X, class Y>
    \n-
    \n-\n-
    70 public:
    \n-
    72 typedef X domain_type;
    \n-
    74 typedef Y range_type;
    \n-
    76 typedef typename X::field_type field_type;
    \n-
    77
    \n-
    82 virtual void apply (const X& x, Y& y) const = 0;
    \n-
    83
    \n-
    85 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const = 0;
    \n-
    86
    \n-
    88 virtual ~LinearOperator () {}
    \n-
    89
    \n-\n-
    92#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE
    \n-
    93 {
    \n-
    94 DUNE_THROW(Dune::Exception,"It is necessary to implement the category method in a derived classes, in the future this method will pure virtual.");
    \n-
    95 };
    \n-
    96#else
    \n-
    97 = 0;
    \n-
    98#endif
    \n-
    99 };
    \n-
    \n-
    100
    \n-
    101
    \n-
    110 template<class M, class X, class Y>
    \n-
    \n-\n-
    112 public:
    \n-
    114 typedef M matrix_type;
    \n-
    115 typedef X domain_type;
    \n-
    116 typedef Y range_type;
    \n-
    117 typedef typename X::field_type field_type;
    \n-
    118
    \n-
    120 virtual const M& getmat () const = 0;
    \n-
    121 };
    \n-
    \n-
    122
    \n-
    123
    \n-
    124
    \n-
    125 //=====================================================================
    \n-
    126 // Implementation for ISTL-matrix based operator
    \n-
    127 //=====================================================================
    \n-
    128
    \n-
    134 template<class M, class X, class Y>
    \n-
    \n-\n-
    136 {
    \n-
    137 public:
    \n-
    139 typedef M matrix_type;
    \n-
    140 typedef X domain_type;
    \n-
    141 typedef Y range_type;
    \n-
    142 typedef typename X::field_type field_type;
    \n-
    143
    \n-
    145 explicit MatrixAdapter (const M& A) : _A_(stackobject_to_shared_ptr(A)) {}
    \n-
    146
    \n-
    148 explicit MatrixAdapter (std::shared_ptr<const M> A) : _A_(A) {}
    \n-
    149
    \n-
    \n-
    151 void apply (const X& x, Y& y) const override
    \n-
    152 {
    \n-
    153 _A_->mv(x,y);
    \n-
    154 }
    \n-
    \n-
    155
    \n-
    \n-
    157 void applyscaleadd (field_type alpha, const X& x, Y& y) const override
    \n-
    158 {
    \n-
    159 _A_->usmv(alpha,x,y);
    \n-
    160 }
    \n-
    \n-
    161
    \n-
    \n-
    163 const M& getmat () const override
    \n-
    164 {
    \n-
    165 return *_A_;
    \n-
    166 }
    \n-
    \n-
    167
    \n-
    \n-\n-
    170 {
    \n-\n-
    172 }
    \n-
    \n-
    173
    \n-
    174 private:
    \n-
    175 const std::shared_ptr<const M> _A_;
    \n-
    176 };
    \n-
    \n-
    177
    \n-
    180} // end namespace
    \n-
    181
    \n-
    182#endif
    \n-\n+
    50 } //namespace Amg
    \n+
    51} // namespace Dune
    \n+
    52#endif
    \n
    Definition allocator.hh:11
    \n-
    A linear operator.
    Definition operators.hh:69
    \n-
    virtual ~LinearOperator()
    every abstract base class has a virtual destructor
    Definition operators.hh:88
    \n-
    X::field_type field_type
    The field type of the operator.
    Definition operators.hh:76
    \n-
    virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0
    apply operator to x, scale and add:
    \n-
    virtual SolverCategory::Category category() const =0
    Category of the linear operator (see SolverCategory::Category)
    \n-
    Y range_type
    The type of the range of the operator.
    Definition operators.hh:74
    \n-
    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...
    \n-
    X domain_type
    The type of the domain of the operator.
    Definition operators.hh:72
    \n-
    A linear operator exporting itself in matrix form.
    Definition operators.hh:111
    \n-
    virtual const M & getmat() const =0
    get matrix via *
    \n-
    X domain_type
    Definition operators.hh:115
    \n-
    X::field_type field_type
    Definition operators.hh:117
    \n-
    Y range_type
    Definition operators.hh:116
    \n-
    M matrix_type
    export types, usually they come from the derived class
    Definition operators.hh:114
    \n-
    Adapter to turn a matrix into a linear operator.
    Definition operators.hh:136
    \n-
    MatrixAdapter(std::shared_ptr< const M > A)
    constructor: store an std::shared_ptr to a matrix
    Definition operators.hh:148
    \n-
    MatrixAdapter(const M &A)
    constructor: just store a reference to a matrix
    Definition operators.hh:145
    \n-
    void applyscaleadd(field_type alpha, const X &x, Y &y) const override
    apply operator to x, scale and add:
    Definition operators.hh:157
    \n-
    Y range_type
    Definition operators.hh:141
    \n-
    X domain_type
    Definition operators.hh:140
    \n-
    X::field_type field_type
    Definition operators.hh:142
    \n-
    const M & getmat() const override
    get matrix via *
    Definition operators.hh:163
    \n-
    SolverCategory::Category category() const override
    Category of the solver (see SolverCategory::Category)
    Definition operators.hh:169
    \n-
    void apply(const X &x, Y &y) const override
    apply operator to x:
    Definition operators.hh:151
    \n-
    M matrix_type
    export types
    Definition operators.hh:139
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n+
    Definition combinedfunctor.hh:17
    \n+
    static void apply(TT tuple, const T &t)
    Definition combinedfunctor.hh:19
    \n+
    static void apply(TT tuple, const T &t)
    Definition combinedfunctor.hh:29
    \n+
    Definition combinedfunctor.hh:36
    \n+
    CombinedFunctor(const T &tuple_)
    Definition combinedfunctor.hh:38
    \n+
    void operator()(const T1 &t)
    Definition combinedfunctor.hh:43
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,219 +1,82 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-operators.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+combinedfunctor.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_OPERATORS_HH\n-6#define DUNE_ISTL_OPERATORS_HH\n+5#ifndef DUNE_AMG_COMBINEDFUNCTOR_HH\n+6#define DUNE_AMG_COMBINEDFUNCTOR_HH\n 7\n-8#include // DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n+8#include \n 9\n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15\n-16#include \n-17#include \n-18\n-19#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n-20\n-21\n-22namespace _\bD_\bu_\bn_\be {\n-23\n-46 //=====================================================================\n-47 // Abstract operator interface\n-48 //=====================================================================\n+10namespace _\bD_\bu_\bn_\be\n+11{\n+12 namespace Amg\n+13 {\n+14\n+15 template\n+_\b1_\b6 struct _\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br\n+17 {\n+18 template\n+_\b1_\b9 static void _\ba_\bp_\bp_\bl_\by(TT tuple, const T& t)\n+20 {\n+21 std::get(tuple) (t);\n+22 _\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b<_\bi_\b-_\b1_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(tuple, t);\n+23 }\n+24 };\n+25 template<>\n+_\b2_\b6 struct _\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br<0>\n+27 {\n+28 template\n+_\b2_\b9 static void _\ba_\bp_\bp_\bl_\by([[maybe_unused]] TT tuple, [[maybe_unused]] const T& t)\n+30 {}\n+31 };\n+32\n+33 template\n+_\b3_\b4 class _\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br :\n+35 public T\n+36 {\n+37 public:\n+_\b3_\b8 _\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br(const T& tuple_)\n+39 : T(tuple_)\n+40 {}\n+41\n+42 template\n+_\b4_\b3 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T1& t)\n+44 {\n+45 _\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b<_\bs_\bt_\bd_\b:_\b:_\bt_\bu_\bp_\bl_\be_\b__\bs_\bi_\bz_\be_\b<_\bT_\b>_\b:_\b:_\bv_\ba_\bl_\bu_\be>::apply(*this, t);\n+46 }\n+47 };\n+48\n 49\n-50\n-68 template\n-_\b6_\b9 class _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br {\n-70 public:\n-_\b7_\b2 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b7_\b4 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b7_\b6 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-77\n-_\b8_\b2 virtual void _\ba_\bp_\bp_\bl_\by (const X& x, Y& y) const = 0;\n-83\n-_\b8_\b5 virtual void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha, const X& x, Y& y) const = 0;\n-86\n-_\b8_\b8 virtual _\b~_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br () {}\n-89\n-_\b9_\b1 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-92#if DUNE_ISTL_SUPPORT_OLD_CATEGORY_INTERFACE\n-93 {\n-94 DUNE_THROW(Dune::Exception,\"It is necessary to implement the category method\n-in a derived classes, in the future this method will pure virtual.\");\n-95 };\n-96#else\n-97 = 0;\n-98#endif\n-99 };\n-100\n-101\n-110 template\n-_\b1_\b1_\b1 class _\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br : public _\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br {\n-112 public:\n-_\b1_\b1_\b4 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b1_\b1_\b5 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b1_\b1_\b6 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b1_\b1_\b7 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-118\n-_\b1_\b2_\b0 virtual const M& _\bg_\be_\bt_\bm_\ba_\bt () const = 0;\n-121 };\n-122\n-123\n-124\n-125 //=====================================================================\n-126 // Implementation for ISTL-matrix based operator\n-127 //=====================================================================\n-128\n-134 template\n-_\b1_\b3_\b5 class _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br : public _\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-136 {\n-137 public:\n-_\b1_\b3_\b9 typedef M _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b1_\b4_\b0 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b1_\b4_\b1 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-_\b1_\b4_\b2 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-143\n-_\b1_\b4_\b5 explicit _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br (const M& A) : _A_(stackobject_to_shared_ptr(A)) {}\n-146\n-_\b1_\b4_\b8 explicit _\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br (std::shared_ptr A) : _A_(A) {}\n-149\n-_\b1_\b5_\b1 void _\ba_\bp_\bp_\bl_\by (const X& x, Y& y) const override\n-152 {\n-153 _A_->mv(x,y);\n-154 }\n-155\n-_\b1_\b5_\b7 void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be alpha, const X& x, Y& y) const override\n-158 {\n-159 _A_->usmv(alpha,x,y);\n-160 }\n-161\n-_\b1_\b6_\b3 const M& _\bg_\be_\bt_\bm_\ba_\bt () const override\n-164 {\n-165 return *_A_;\n-166 }\n-167\n-_\b1_\b6_\b9 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const override\n-170 {\n-171 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-172 }\n-173\n-174 private:\n-175 const std::shared_ptr _A_;\n-176 };\n-177\n-180} // end namespace\n-181\n-182#endif\n-_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n+50 } //namespace Amg\n+51} // namespace Dune\n+52#endif\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-A linear operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\b~_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-virtual ~LinearOperator()\n-every abstract base class has a virtual destructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:88\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd\n-virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0\n-apply operator to x, scale and add:\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const =0\n-Category of the linear operator (see SolverCategory::Category)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The type of the range of the operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(const X &x, Y &y) const =0\n-apply operator to x: The input vector is consistent and the output must also be\n-consistent on the in...\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The type of the domain of the operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-A linear operator exporting itself in matrix form.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:111\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bg_\be_\bt_\bm_\ba_\bt\n-virtual const M & getmat() const =0\n-get matrix via *\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:115\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:117\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:116\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\bd_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-export types, usually they come from the derived class\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n-Adapter to turn a matrix into a linear operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n-MatrixAdapter(std::shared_ptr< const M > A)\n-constructor: store an std::shared_ptr to a matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:148\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n-MatrixAdapter(const M &A)\n-constructor: just store a reference to a matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:145\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd\n-void applyscaleadd(field_type alpha, const X &x, Y &y) const override\n-apply operator to x, scale and add:\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:157\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:141\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:140\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bg_\be_\bt_\bm_\ba_\bt\n-const M & getmat() const override\n-get matrix via *\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:163\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-SolverCategory::Category category() const override\n-Category of the solver (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:169\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-void apply(const X &x, Y &y) const override\n-apply operator to x:\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:151\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-M matrix_type\n-export types\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:139\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:17\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+static void apply(TT tuple, const T &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bp_\bp_\bl_\by_\bH_\be_\bl_\bp_\be_\br_\b<_\b _\b0_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+static void apply(TT tuple, const T &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br\n+CombinedFunctor(const T &tuple_)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bF_\bu_\bn_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const T1 &t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn combinedfunctor.hh:43\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00200.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00200.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: spqr.hh File Reference\n+dune-istl: fastamgsmoother.hh File Reference\n \n \n \n \n \n \n \n@@ -65,71 +65,42 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n \n+
    fastamgsmoother.hh File Reference
    \n \n
    \n-\n-

    Class for using SPQR with ISTL matrices. \n-More...

    \n-
    #include <complex>
    \n-#include <type_traits>
    \n-#include <SuiteSparseQR.hpp>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/istl/bccsmatrixinitializer.hh>
    \n-#include <dune/istl/solvers.hh>
    \n-#include <dune/istl/solvertype.hh>
    \n-#include <dune/istl/solverfactory.hh>
    \n+
    #include <cstddef>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n \n-\n-\n-\n-\n-\n+\n \n

    \n Classes

    class  Dune::SPQR< Matrix >
     Use the SPQR package to directly solve linear systems – empty default class. More...
     
    class  Dune::SPQR< BCRSMatrix< FieldMatrix< T, n, m >, A > >
     The SPQR direct sparse solver for matrices of type BCRSMatrix. More...
     
    struct  Dune::IsDirectSolver< SPQR< BCRSMatrix< T, A > > >
     
    struct  Dune::StoresColumnCompressed< SPQR< BCRSMatrix< T, A > > >
    struct  Dune::Amg::GaussSeidelPresmoothDefect< level >
     
    struct  Dune::SPQRCreator
     
    struct  Dune::SPQRCreator::isValidBlock< class >
     
    struct  Dune::SPQRCreator::isValidBlock< FieldVector< double, 1 > >
    struct  Dune::Amg::GaussSeidelPostsmoothDefect< level >
     
    \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n+\n+\n

    \n-Functions

     Dune::DUNE_REGISTER_DIRECT_SOLVER ("spqr", Dune::SPQRCreator())
     
    namespace  Dune::Amg
     
    \n-

    Detailed Description

    \n-

    Class for using SPQR with ISTL matrices.

    \n-
    Author
    Marco Agnese, Andrea Sacconi
    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,49 +1,23 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-spqr.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b)\n-Class for using SPQR with ISTL matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+fastamgsmoother.hh File Reference\n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\b>\n-\u00a0 Use the SPQR package to directly solve linear systems \u2013 empty default\n- class. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b<_\b _\bl_\be_\bv_\be_\bl_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>\n-\u00a0 The SPQR direct sparse solver for matrices of type _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\b _\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bc_\bl_\ba_\bs_\bs_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk_\b<_\b _\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bd_\bo_\bu_\bb_\bl_\be_\b,_\b _\b1_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b<_\b _\bl_\be_\bv_\be_\bl_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR (\"spqr\", _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br())\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Class for using SPQR with ISTL matrices.\n- Author\n- Marco Agnese, Andrea Sacconi\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00200_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00200_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: spqr.hh Source File\n+dune-istl: fastamgsmoother.hh Source File\n \n \n \n \n \n \n \n@@ -70,404 +70,131 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    spqr.hh
    \n+
    fastamgsmoother.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_SPQR_HH
    \n-
    6#define DUNE_ISTL_SPQR_HH
    \n+
    5#ifndef DUNE_ISTL_FASTAMGSMOOTHER_HH
    \n+
    6#define DUNE_ISTL_FASTAMGSMOOTHER_HH
    \n
    7
    \n-
    8#if HAVE_SUITESPARSE_SPQR || defined DOXYGEN
    \n+
    8#include <cstddef>
    \n
    9
    \n-
    10#include <complex>
    \n-
    11#include <type_traits>
    \n-
    12
    \n-
    13#include <SuiteSparseQR.hpp>
    \n+
    10namespace Dune
    \n+
    11{
    \n+
    12 namespace Amg
    \n+
    13 {
    \n
    14
    \n-
    15#include <dune/common/exceptions.hh>
    \n-
    16
    \n-\n-
    18#include <dune/istl/solvers.hh>
    \n-\n-\n-
    21
    \n-
    22namespace Dune {
    \n-
    34 // forward declarations
    \n-
    35 template<class M, class T, class TM, class TD, class TA>
    \n-
    36 class SeqOverlappingSchwarz;
    \n-
    37
    \n-
    38 template<class T, bool tag>
    \n-
    39 struct SeqOverlappingSchwarzAssemblerHelper;
    \n-
    40
    \n-
    46 template<class Matrix>
    \n-
    \n-
    47 class SPQR
    \n-
    48 {};
    \n-
    \n-
    49
    \n-
    63 template<typename T, typename A, int n, int m>
    \n-
    \n-
    64 class SPQR<BCRSMatrix<FieldMatrix<T,n,m>,A > >
    \n-
    65 : public InverseOperator<BlockVector<FieldVector<T,m>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > >,
    \n-
    66 BlockVector<FieldVector<T,n>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > > >
    \n-
    67 {
    \n-
    68 public:
    \n-\n-\n-
    73 typedef ISTL::Impl::BCCSMatrix<T,int> SPQRMatrix;
    \n-
    75 typedef ISTL::Impl::BCCSMatrixInitializer<BCRSMatrix<FieldMatrix<T,n,m>,A>, int> MatrixInitializer;
    \n-
    77 typedef Dune::BlockVector<FieldVector<T,m>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,m> > > domain_type;
    \n-
    79 typedef Dune::BlockVector<FieldVector<T,n>, typename std::allocator_traits<A>::template rebind_alloc<FieldVector<T,n> > > range_type;
    \n-
    80
    \n-
    \n-\n-
    83 {
    \n-\n-
    85 }
    \n-
    \n+
    15 template<std::size_t level>
    \n+
    \n+\n+
    17
    \n+
    18 template<typename M, typename X, typename Y>
    \n+
    \n+
    19 static void apply(const M& A, X& x, Y& d,
    \n+
    20 const Y& b)
    \n+
    21 {
    \n+
    22 typedef typename M::ConstRowIterator RowIterator;
    \n+
    23 typedef typename M::ConstColIterator ColIterator;
    \n+
    24
    \n+
    25 typename Y::iterator dIter=d.begin();
    \n+
    26 typename Y::const_iterator bIter=b.begin();
    \n+
    27 typename X::iterator xIter=x.begin();
    \n+
    28
    \n+
    29 for(RowIterator row=A.begin(), end=A.end(); row != end;
    \n+
    30 ++row, ++dIter, ++xIter, ++bIter)
    \n+
    31 {
    \n+
    32 ColIterator col=(*row).begin();
    \n+
    33 *dIter = *bIter;
    \n+
    34
    \n+
    35 for (; col.index()<row.index(); ++col)
    \n+
    36 (*col).mmv(x[col.index()],*dIter); // rhs -= sum_{j<i} a_ij * xnew_j
    \n+
    37 assert(row.index()==col.index());
    \n+
    38 ColIterator diag=col; // upper diagonal matrix not needed as x was 0 before.
    \n+
    39
    \n+
    40 // Not recursive yet. Just solve with the diagonal
    \n+
    41 diag->solve(*xIter,*dIter);
    \n+
    42 *dIter=0; //as r=v
    \n+
    43
    \n+
    44 // Update residual for the symmetric case
    \n+
    45 for(col=(*row).begin(); col.index()<row.index(); ++col)
    \n+
    46 col->mmv(*xIter, d[col.index()]); //d_j-=A_ij x_i
    \n+
    47 }
    \n+
    48 }
    \n+
    \n+
    49 };
    \n+
    \n+
    50
    \n+
    51 template<std::size_t level>
    \n+
    \n+\n+
    53
    \n+
    54 template<typename M, typename X, typename Y>
    \n+
    \n+
    55 static void apply(const M& A, X& x, Y& d,
    \n+
    56 const Y& b)
    \n+
    57 {
    \n+
    58 typedef typename M::ConstRowIterator RowIterator;
    \n+
    59 typedef typename M::ConstColIterator ColIterator;
    \n+
    60 typedef typename Y::block_type YBlock;
    \n+
    61
    \n+
    62 typename Y::iterator dIter=d.beforeEnd();
    \n+
    63 typename X::iterator xIter=x.beforeEnd();
    \n+
    64 typename Y::const_iterator bIter=b.beforeEnd();
    \n+
    65
    \n+
    66 for(RowIterator row=A.beforeEnd(), end=A.beforeBegin(); row != end;
    \n+
    67 --row, --dIter, --xIter, --bIter)
    \n+
    68 {
    \n+
    69 ColIterator endCol=(*row).beforeBegin();
    \n+
    70 ColIterator col=(*row).beforeEnd();
    \n+
    71 *dIter = *bIter;
    \n+
    72
    \n+
    73 for (; col.index()>row.index(); --col)
    \n+
    74 (*col).mmv(x[col.index()],*dIter); // rhs -= sum_{i>j} a_ij * xnew_j
    \n+
    75 assert(row.index()==col.index());
    \n+
    76 ColIterator diag=col;
    \n+
    77 YBlock v=*dIter;
    \n+
    78 // upper diagonal matrix
    \n+
    79 for (--col; col!=endCol; --col)
    \n+
    80 (*col).mmv(x[col.index()],v); // v -= sum_{j<i} a_ij * xold_j
    \n+
    81
    \n+
    82 // Not recursive yet. Just solve with the diagonal
    \n+
    83 diag->solve(*xIter,v);
    \n+
    84
    \n+
    85 *dIter-=v;
    \n
    86
    \n-
    \n-
    95 SPQR(const Matrix& matrix, int verbose=0) : matrixIsLoaded_(false), verbose_(verbose)
    \n-
    96 {
    \n-
    97 //check whether T is a supported type
    \n-
    98 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n-
    99 "Unsupported Type in SPQR (only double and std::complex<double> supported)");
    \n-
    100 cc_ = new cholmod_common();
    \n-
    101 cholmod_l_start(cc_);
    \n-
    102 setMatrix(matrix);
    \n-
    103 }
    \n-
    \n-
    104
    \n-
    \n-
    113 SPQR(const Matrix& matrix, int verbose, bool) : matrixIsLoaded_(false), verbose_(verbose)
    \n-
    114 {
    \n-
    115 //check whether T is a supported type
    \n-
    116 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n-
    117 "Unsupported Type in SPQR (only double and std::complex<double> supported)");
    \n-
    118 cc_ = new cholmod_common();
    \n-
    119 cholmod_l_start(cc_);
    \n-
    120 setMatrix(matrix);
    \n-
    121 }
    \n-
    \n-
    122
    \n-
    \n-
    132 SPQR(const Matrix& matrix, const ParameterTree& config)
    \n-
    133 : SPQR(matrix, config.get<int>("verbose", 0))
    \n-
    134 {}
    \n-
    \n-
    135
    \n-
    \n-
    137 SPQR() : matrixIsLoaded_(false), verbose_(0)
    \n-
    138 {
    \n-
    139 //check whether T is a supported type
    \n-
    140 static_assert((std::is_same<T,double>::value) || (std::is_same<T,std::complex<double> >::value),
    \n-
    141 "Unsupported Type in SPQR (only double and std::complex<double> supported)");
    \n-
    142 cc_ = new cholmod_common();
    \n-
    143 cholmod_l_start(cc_);
    \n-
    144 }
    \n-
    \n-
    145
    \n-
    \n-
    147 virtual ~SPQR()
    \n-
    148 {
    \n-
    149 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_)
    \n-
    150 free();
    \n-
    151 cholmod_l_finish(cc_);
    \n-
    152 }
    \n-
    \n-
    153
    \n-
    \n-\n-
    156 {
    \n-
    157 const std::size_t numRows(spqrMatrix_.N());
    \n-
    158 // fill B
    \n-
    159 for(std::size_t k = 0; k != numRows/n; ++k)
    \n-
    160 for (int l = 0; l < n; ++l)
    \n-
    161 (static_cast<T*>(B_->x))[n*k+l] = b[k][l];
    \n-
    162
    \n-
    163 cholmod_dense* BTemp = B_;
    \n-
    164 B_ = SuiteSparseQR_qmult<T>(0, spqrfactorization_, B_, cc_);
    \n-
    165 cholmod_dense* X = SuiteSparseQR_solve<T>(1, spqrfactorization_, B_, cc_);
    \n-
    166 cholmod_l_free_dense(&BTemp, cc_);
    \n-
    167
    \n-
    168 const std::size_t numCols(spqrMatrix_.M());
    \n-
    169 // fill x
    \n-
    170 for(std::size_t k = 0; k != numCols/m; ++k)
    \n-
    171 for (int l = 0; l < m; ++l)
    \n-
    172 x[k][l] = (static_cast<T*>(X->x))[m*k+l];
    \n-
    173
    \n-
    174 cholmod_l_free_dense(&X, cc_);
    \n-
    175 // this is a direct solver
    \n-
    176 res.iterations = 1;
    \n-
    177 res.converged = true;
    \n-
    178 if(verbose_ > 0)
    \n-
    179 {
    \n-
    180 std::cout<<std::endl<<"Solving with SuiteSparseQR"<<std::endl;
    \n-
    181 std::cout<<"Flops Taken: "<<cc_->SPQR_flopcount<<std::endl;
    \n-
    182 std::cout<<"Analysis Time: "<<cc_->SPQR_analyze_time<<" s"<<std::endl;
    \n-
    183 std::cout<<"Factorize Time: "<<cc_->SPQR_factorize_time<<" s"<<std::endl;
    \n-
    184 std::cout<<"Backsolve Time: "<<cc_->SPQR_solve_time<<" s"<<std::endl;
    \n-
    185 std::cout<<"Peak Memory Usage: "<<cc_->memory_usage<<" bytes"<<std::endl;
    \n-
    186 std::cout<<"Rank Estimate: "<<cc_->SPQR_istat[4]<<std::endl<<std::endl;
    \n-
    187 }
    \n-
    188 }
    \n-
    \n-
    189
    \n-
    \n-
    191 virtual void apply (domain_type& x, range_type& b, [[maybe_unused]] double reduction, InverseOperatorResult& res)
    \n-
    192 {
    \n-
    193 apply(x, b, res);
    \n-
    194 }
    \n-
    \n-
    195
    \n-
    \n-
    196 void setOption([[maybe_unused]] unsigned int option, [[maybe_unused]] double value)
    \n-
    197 {}
    \n-
    \n-
    198
    \n-
    \n-
    200 void setMatrix(const Matrix& matrix)
    \n-
    201 {
    \n-
    202 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_)
    \n-
    203 free();
    \n-
    204
    \n-
    205 if (spqrMatrix_.N() + spqrMatrix_.M() + spqrMatrix_.nonzeroes() != 0)
    \n-
    206 spqrMatrix_.free();
    \n-
    207 spqrMatrix_.setSize(MatrixDimension<Matrix>::rowdim(matrix),
    \n-\n-
    209 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(spqrMatrix_);
    \n-
    210
    \n-
    211 copyToBCCSMatrix(initializer, matrix);
    \n-
    212
    \n-
    213 decompose();
    \n-
    214 }
    \n-
    \n-
    215
    \n-
    216 template<class S>
    \n-
    \n-
    217 void setSubMatrix(const Matrix& matrix, const S& rowIndexSet)
    \n-
    218 {
    \n-
    219 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_)
    \n-
    220 free();
    \n-
    221
    \n-
    222 if (spqrMatrix_.N() + spqrMatrix_.M() + spqrMatrix_.nonzeroes() != 0)
    \n-
    223 spqrMatrix_.free();
    \n-
    224
    \n-
    225 spqrMatrix_.setSize(rowIndexSet.size()*MatrixDimension<Matrix>::rowdim(matrix) / matrix.N(),
    \n-
    226 rowIndexSet.size()*MatrixDimension<Matrix>::coldim(matrix) / matrix.M());
    \n-
    227 ISTL::Impl::BCCSMatrixInitializer<Matrix, int> initializer(spqrMatrix_);
    \n-
    228
    \n-
    229 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<Matrix,std::set<std::size_t> >(matrix,rowIndexSet));
    \n-
    230
    \n-
    231 decompose();
    \n-
    232 }
    \n-
    \n-
    233
    \n-
    \n-
    238 inline void setVerbosity(int v)
    \n-
    239 {
    \n-
    240 verbose_=v;
    \n-
    241 }
    \n-
    \n-
    242
    \n-
    \n-
    247 inline SuiteSparseQR_factorization<T>* getFactorization()
    \n-
    248 {
    \n-
    249 return spqrfactorization_;
    \n-
    250 }
    \n-
    \n-
    251
    \n-
    \n-\n-
    257 {
    \n-
    258 return spqrMatrix_;
    \n-
    259 }
    \n-
    \n-
    260
    \n-
    \n-
    265 void free()
    \n-
    266 {
    \n-
    267 cholmod_l_free_sparse(&A_, cc_);
    \n-
    268 cholmod_l_free_dense(&B_, cc_);
    \n-
    269 SuiteSparseQR_free<T>(&spqrfactorization_, cc_);
    \n-
    270 spqrMatrix_.free();
    \n-
    271 matrixIsLoaded_ = false;
    \n-
    272 }
    \n-
    \n-
    273
    \n-
    \n-
    275 inline const char* name()
    \n-
    276 {
    \n-
    277 return "SPQR";
    \n-
    278 }
    \n-
    \n-
    279
    \n-
    280 private:
    \n-
    281 template<class M,class X, class TM, class TD, class T1>
    \n-\n-
    283
    \n-\n-
    285
    \n-
    287 void decompose()
    \n-
    288 {
    \n-
    289 const std::size_t nrows(spqrMatrix_.N());
    \n-
    290 const std::size_t ncols(spqrMatrix_.M());
    \n-
    291 const std::size_t nnz(spqrMatrix_.getColStart()[ncols]);
    \n-
    292
    \n-
    293 // initialise the matrix A (sorted, packed, unsymmetric, real entries)
    \n-
    294 A_ = cholmod_l_allocate_sparse(nrows, ncols, nnz, 1, 1, 0, 1, cc_);
    \n-
    295
    \n-
    296 // copy all the entries of Ap, Ai, Ax
    \n-
    297 for(std::size_t k = 0; k != (ncols+1); ++k)
    \n-
    298 (static_cast<long int *>(A_->p))[k] = spqrMatrix_.getColStart()[k];
    \n-
    299
    \n-
    300 for(std::size_t k = 0; k != nnz; ++k)
    \n-
    301 {
    \n-
    302 (static_cast<long int*>(A_->i))[k] = spqrMatrix_.getRowIndex()[k];
    \n-
    303 (static_cast<T*>(A_->x))[k] = spqrMatrix_.getValues()[k];
    \n-
    304 }
    \n-
    305
    \n-
    306 // initialise the vector B
    \n-
    307 B_ = cholmod_l_allocate_dense(nrows, 1, nrows, A_->xtype, cc_);
    \n-
    308 // compute factorization of A
    \n-
    309 spqrfactorization_=SuiteSparseQR_factorize<T>(SPQR_ORDERING_DEFAULT,SPQR_DEFAULT_TOL,A_,cc_);
    \n-
    310 }
    \n-
    311
    \n-
    312 SPQRMatrix spqrMatrix_;
    \n-
    313 bool matrixIsLoaded_;
    \n-
    314 int verbose_;
    \n-
    315 cholmod_common* cc_;
    \n-
    316 cholmod_sparse* A_;
    \n-
    317 cholmod_dense* B_;
    \n-
    318 SuiteSparseQR_factorization<T>* spqrfactorization_;
    \n-
    319 };
    \n-
    \n-
    320
    \n-
    321 template<typename T, typename A>
    \n-
    \n-\n-
    323 {
    \n-
    324 enum {value = true};
    \n-
    325 };
    \n-
    \n-
    326
    \n-
    327 template<typename T, typename A>
    \n-
    \n-\n-
    329 {
    \n-
    330 enum {value = true};
    \n-
    331 };
    \n-
    \n-
    332
    \n-
    \n-
    333 struct SPQRCreator {
    \n-
    334 template<class> struct isValidBlock : std::false_type{};
    \n-
    335
    \n-
    336 template<typename TL, typename M>
    \n-
    337 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n-
    338 typename Dune::TypeListElement<2, TL>::type>>
    \n-
    \n-
    339 operator() (TL /*tl*/, const M& mat, const Dune::ParameterTree& config,
    \n-
    340 std::enable_if_t<
    \n-
    341 isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n-
    342 {
    \n-
    343 int verbose = config.get("verbose", 0);
    \n-
    344 return std::make_shared<Dune::SPQR<M>>(mat,verbose);
    \n-
    345 }
    \n-
    \n-
    346
    \n-
    347 // second version with SFINAE to validate the template parameters of SPQR
    \n-
    348 template<typename TL, typename M>
    \n-
    349 std::shared_ptr<Dune::InverseOperator<typename Dune::TypeListElement<1, TL>::type,
    \n-
    350 typename Dune::TypeListElement<2, TL>::type>>
    \n-
    \n-
    351 operator() (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /*config*/,
    \n-
    352 std::enable_if_t<!isValidBlock<typename Dune::TypeListElement<1, TL>::type::block_type>::value,int> = 0) const
    \n-
    353 {
    \n-
    354 DUNE_THROW(UnsupportedType,
    \n-
    355 "Unsupported Type in SPQR (only double and std::complex<double> supported)");
    \n-
    356 }
    \n-
    \n-
    357 };
    \n-
    \n-
    358 template<> struct SPQRCreator::isValidBlock<FieldVector<double,1>> : std::true_type{};
    \n-
    359 // std::complex is temporary disabled, because it fails if libc++ is used
    \n-
    360 //template<> struct SPQRCreator::isValidMatrixBlock<FieldMatrix<std::complex<double>,1,1>> : std::true_type{};
    \n-\n-
    362
    \n-
    363} // end namespace Dune
    \n-
    364
    \n-
    365
    \n-
    366#endif //HAVE_SUITESPARSE_SPQR
    \n-
    367#endif //DUNE_ISTL_SPQR_HH
    \n-
    #define DUNE_REGISTER_DIRECT_SOLVER(name,...)
    Definition solverregistry.hh:13
    \n-
    Implementations of the inverse operator interface.
    \n-\n-\n-
    Templates characterizing the type of a solver.
    \n-
    Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > matrix_type
    Definition spqr.hh:71
    \n-
    virtual ~SPQR()
    Destructor.
    Definition spqr.hh:147
    \n-
    SPQR(const Matrix &matrix, int verbose, bool)
    Constructor for compatibility with SuperLU standard constructor.
    Definition spqr.hh:113
    \n-
    virtual SolverCategory::Category category() const
    Category of the solver (see SolverCategory::Category)
    Definition spqr.hh:82
    \n-
    SPQRMatrix & getInternalMatrix()
    Return the column coppressed matrix.
    Definition spqr.hh:256
    \n-
    void setMatrix(const Matrix &matrix)
    Initialize data from given matrix.
    Definition spqr.hh:200
    \n-
    ISTL::Impl::BCCSMatrixInitializer< BCRSMatrix< FieldMatrix< T, n, m >, A >, int > MatrixInitializer
    Type of an associated initializer class.
    Definition spqr.hh:75
    \n-
    Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
    The matrix type.
    Definition spqr.hh:70
    \n-
    SPQR()
    Default constructor.
    Definition spqr.hh:137
    \n-
    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 spqr.hh:339
    \n-
    const char * name()
    Get method name.
    Definition spqr.hh:275
    \n-
    SuiteSparseQR_factorization< T > * getFactorization()
    Return the matrix factorization.
    Definition spqr.hh:247
    \n-
    void setVerbosity(int v)
    Sets the verbosity level for the solver.
    Definition spqr.hh:238
    \n-
    ISTL::Impl::BCCSMatrix< T, int > SPQRMatrix
    The corresponding SuperLU Matrix type.
    Definition spqr.hh:73
    \n-
    virtual void apply(domain_type &x, range_type &b, double reduction, InverseOperatorResult &res)
    apply inverse operator, with given convergence criteria.
    Definition spqr.hh:191
    \n-
    void free()
    Free allocated space.
    Definition spqr.hh:265
    \n-
    SPQR(const Matrix &matrix, const ParameterTree &config)
    Constructs the SPQR solver.
    Definition spqr.hh:132
    \n-
    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.
    Definition spqr.hh:79
    \n-
    void setSubMatrix(const Matrix &matrix, const S &rowIndexSet)
    Definition spqr.hh:217
    \n-
    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.
    Definition spqr.hh:77
    \n-
    virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)
    Apply inverse operator,.
    Definition spqr.hh:155
    \n-
    void setOption(unsigned int option, double value)
    Definition spqr.hh:196
    \n-
    SPQR(const Matrix &matrix, int verbose=0)
    Construct a solver object from a BCRSMatrix.
    Definition spqr.hh:95
    \n-
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    87 // Update residual for the symmetric case
    \n+
    88 // Skip residual computation as it is not needed.
    \n+
    89 //for(col=(*row).begin();col.index()<row.index(); ++col)
    \n+
    90 //col.mmv(*xIter, d[col.index()]); //d_j-=A_ij x_i
    \n+
    91 }
    \n+
    92 }
    \n+
    \n+
    93 };
    \n+
    \n+
    94 } // end namespace Amg
    \n+
    95} // end namespace Dune
    \n+
    96#endif
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n
    Definition allocator.hh:11
    \n-
    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
    \n-
    Definition matrixutils.hh:211
    \n-
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    size_type M() const
    number of columns (counted in blocks)
    Definition bcrsmatrix.hh:2007
    \n-
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n-
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n-
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n-
    Definition overlappingschwarz.hh:694
    \n-
    Definition matrixutils.hh:27
    \n-
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n-
    int iterations
    Number of iterations.
    Definition solver.hh:69
    \n-
    bool converged
    True if convergence criterion has been met.
    Definition solver.hh:75
    \n-
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n-
    Definition solverregistry.hh:77
    \n-
    Definition solvertype.hh:16
    \n-
    @ value
    Whether this is a direct solver.
    Definition solvertype.hh:24
    \n-
    Definition solvertype.hh:30
    \n-
    @ value
    whether the solver internally uses column compressed storage
    Definition solvertype.hh:36
    \n-
    Use the SPQR package to directly solve linear systems \u2013 empty default class.
    Definition spqr.hh:48
    \n-
    Definition spqr.hh:333
    \n-
    Definition spqr.hh:334
    \n+
    Definition fastamgsmoother.hh:16
    \n+
    static void apply(const M &A, X &x, Y &d, const Y &b)
    Definition fastamgsmoother.hh:19
    \n+
    Definition fastamgsmoother.hh:52
    \n+
    static void apply(const M &A, X &x, Y &d, const Y &b)
    Definition fastamgsmoother.hh:55
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,502 +1,123 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-spqr.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+fastamgsmoother.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_SPQR_HH\n-6#define DUNE_ISTL_SPQR_HH\n+5#ifndef DUNE_ISTL_FASTAMGSMOOTHER_HH\n+6#define DUNE_ISTL_FASTAMGSMOOTHER_HH\n 7\n-8#if HAVE_SUITESPARSE_SPQR || defined DOXYGEN\n+8#include \n 9\n-10#include \n-11#include \n-12\n-13#include \n+10namespace _\bD_\bu_\bn_\be\n+11{\n+12 namespace Amg\n+13 {\n 14\n-15#include \n-16\n-17#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh>\n-18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n-19#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n-20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh>\n-21\n-22namespace _\bD_\bu_\bn_\be {\n-34 // forward declarations\n-35 template\n-36 class SeqOverlappingSchwarz;\n-37\n-38 template\n-39 struct SeqOverlappingSchwarzAssemblerHelper;\n-40\n-46 template\n-_\b4_\b7 class _\bS_\bP_\bQ_\bR\n-48 {};\n-49\n-63 template\n-_\b6_\b4 class _\bS_\bP_\bQ_\bR<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx,A > >\n-65 : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br, typename std::\n-allocator_traits::template rebind_alloc > >,\n-66 BlockVector, typename std::allocator_traits::template\n-rebind_alloc > > >\n-67 {\n-68 public:\n-_\b7_\b0 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bM_\ba_\bt_\br_\bi_\bx;\n-_\b7_\b1 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bT_\b,_\bn_\b,_\bm_\b>,A> _\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be;\n-_\b7_\b3 typedef ISTL::Impl::BCCSMatrix _\bS_\bP_\bQ_\bR_\bM_\ba_\bt_\br_\bi_\bx;\n-_\b7_\b5 typedef ISTL::Impl::BCCSMatrixInitializer,A>,\n-int> _\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n-_\b7_\b7 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bm_\b>, typename std::\n-allocator_traits::template rebind_alloc > > _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-_\b7_\b9 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bF_\bi_\be_\bl_\bd_\bV_\be_\bc_\bt_\bo_\br_\b<_\bT_\b,_\bn_\b>, typename std::\n-allocator_traits::template rebind_alloc > > _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-80\n-_\b8_\b2 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-83 {\n-84 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-85 }\n+15 template\n+_\b1_\b6 struct _\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt {\n+17\n+18 template\n+_\b1_\b9 static void _\ba_\bp_\bp_\bl_\by(const M& A, X& x, Y& d,\n+20 const Y& b)\n+21 {\n+22 typedef typename M::ConstRowIterator RowIterator;\n+23 typedef typename M::ConstColIterator ColIterator;\n+24\n+25 typename Y::iterator dIter=d.begin();\n+26 typename Y::const_iterator bIter=b.begin();\n+27 typename X::iterator xIter=x.begin();\n+28\n+29 for(RowIterator row=A.begin(), end=A.end(); row != end;\n+30 ++row, ++dIter, ++xIter, ++bIter)\n+31 {\n+32 ColIterator _\bc_\bo_\bl=(*row).begin();\n+33 *dIter = *bIter;\n+34\n+35 for (; _\bc_\bo_\bl.index()solve(*xIter,*dIter);\n+42 *dIter=0; //as r=v\n+43\n+44 // Update residual for the symmetric case\n+45 for(_\bc_\bo_\bl=(*row).begin(); _\bc_\bo_\bl.index()mmv(*xIter, d[_\bc_\bo_\bl.index()]); //d_j-=A_ij x_i\n+47 }\n+48 }\n+49 };\n+50\n+51 template\n+_\b5_\b2 struct _\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt {\n+53\n+54 template\n+_\b5_\b5 static void _\ba_\bp_\bp_\bl_\by(const M& A, X& x, Y& d,\n+56 const Y& b)\n+57 {\n+58 typedef typename M::ConstRowIterator RowIterator;\n+59 typedef typename M::ConstColIterator ColIterator;\n+60 typedef typename Y::block_type YBlock;\n+61\n+62 typename Y::iterator dIter=d.beforeEnd();\n+63 typename X::iterator xIter=x.beforeEnd();\n+64 typename Y::const_iterator bIter=b.beforeEnd();\n+65\n+66 for(RowIterator row=A.beforeEnd(), end=A.beforeBegin(); row != end;\n+67 --row, --dIter, --xIter, --bIter)\n+68 {\n+69 ColIterator endCol=(*row).beforeBegin();\n+70 ColIterator _\bc_\bo_\bl=(*row).beforeEnd();\n+71 *dIter = *bIter;\n+72\n+73 for (; _\bc_\bo_\bl.index()>row.index(); --_\bc_\bo_\bl)\n+74 (*col).mmv(x[_\bc_\bo_\bl.index()],*dIter); // rhs -= sum_{i>j} a_ij * xnew_j\n+75 assert(row.index()==_\bc_\bo_\bl.index());\n+76 ColIterator diag=_\bc_\bo_\bl;\n+77 YBlock v=*dIter;\n+78 // upper diagonal matrix\n+79 for (--_\bc_\bo_\bl; _\bc_\bo_\bl!=endCol; --_\bc_\bo_\bl)\n+80 (*col).mmv(x[_\bc_\bo_\bl.index()],v); // v -= sum_{jsolve(*xIter,v);\n+84\n+85 *dIter-=v;\n 86\n-_\b9_\b5 _\bS_\bP_\bQ_\bR(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose=0) : matrixIsLoaded_(false), verbose_\n-(verbose)\n-96 {\n-97 //check whether T is a supported type\n-98 static_assert((std::is_same::value) || (std::is_same >::value),\n-99 \"Unsupported Type in SPQR (only double and std::complex\n-supported)\");\n-100 cc_ = new cholmod_common();\n-101 cholmod_l_start(cc_);\n-102 setMatrix(matrix);\n-103 }\n-104\n-_\b1_\b1_\b3 _\bS_\bP_\bQ_\bR(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, int verbose, bool) : matrixIsLoaded_(false),\n-verbose_(verbose)\n-114 {\n-115 //check whether T is a supported type\n-116 static_assert((std::is_same::value) || (std::is_same >::value),\n-117 \"Unsupported Type in SPQR (only double and std::complex\n-supported)\");\n-118 cc_ = new cholmod_common();\n-119 cholmod_l_start(cc_);\n-120 setMatrix(matrix);\n-121 }\n-122\n-_\b1_\b3_\b2 _\bS_\bP_\bQ_\bR(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const ParameterTree& config)\n-133 : _\bS_\bP_\bQ_\bR(matrix, config._\bg_\be_\bt(\"verbose\", 0))\n-134 {}\n-135\n-_\b1_\b3_\b7 _\bS_\bP_\bQ_\bR() : matrixIsLoaded_(false), verbose_(0)\n-138 {\n-139 //check whether T is a supported type\n-140 static_assert((std::is_same::value) || (std::is_same >::value),\n-141 \"Unsupported Type in SPQR (only double and std::complex\n-supported)\");\n-142 cc_ = new cholmod_common();\n-143 cholmod_l_start(cc_);\n-144 }\n-145\n-_\b1_\b4_\b7 virtual _\b~_\bS_\bP_\bQ_\bR()\n-148 {\n-149 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_)\n-150 free();\n-151 cholmod_l_finish(cc_);\n-152 }\n-153\n-_\b1_\b5_\b5 virtual void _\ba_\bp_\bp_\bl_\by(_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be& x, _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be& b, _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt&\n-res)\n-156 {\n-157 const std::size_t numRows(spqrMatrix_.N());\n-158 // fill B\n-159 for(std::size_t k = 0; k != numRows/n; ++k)\n-160 for (int l = 0; l < n; ++l)\n-161 (static_cast(B_->x))[n*k+l] = b[k][l];\n-162\n-163 cholmod_dense* BTemp = B_;\n-164 B_ = SuiteSparseQR_qmult(0, spqrfactorization_, B_, cc_);\n-165 cholmod_dense* X = SuiteSparseQR_solve(1, spqrfactorization_, B_, cc_);\n-166 cholmod_l_free_dense(&BTemp, cc_);\n-167\n-168 const std::size_t numCols(spqrMatrix_.M());\n-169 // fill x\n-170 for(std::size_t k = 0; k != numCols/m; ++k)\n-171 for (int l = 0; l < m; ++l)\n-172 x[k][l] = (static_cast(X->x))[m*k+l];\n-173\n-174 cholmod_l_free_dense(&X, cc_);\n-175 // this is a direct solver\n-176 res._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs = 1;\n-177 res._\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd = true;\n-178 if(verbose_ > 0)\n-179 {\n-180 std::cout<SPQR_flopcount<SPQR_analyze_time<<\" s\"<SPQR_factorize_time<<\" s\"<SPQR_solve_time<<\" s\"<memory_usage<<\" bytes\"<SPQR_istat[4]< 0) || matrixIsLoaded_)\n-203 free();\n-204\n-205 if (spqrMatrix_.N() + spqrMatrix_.M() + spqrMatrix_.nonzeroes() != 0)\n-206 spqrMatrix_.free();\n-207 spqrMatrix_.setSize(_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(matrix),\n-208 _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(matrix));\n-209 ISTL::Impl::BCCSMatrixInitializer initializer(spqrMatrix_);\n-210\n-211 copyToBCCSMatrix(initializer, matrix);\n-212\n-213 decompose();\n-214 }\n-215\n-216 template\n-_\b2_\b1_\b7 void _\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx(const _\bM_\ba_\bt_\br_\bi_\bx& matrix, const S& rowIndexSet)\n-218 {\n-219 if ((spqrMatrix_.N() + spqrMatrix_.M() > 0) || matrixIsLoaded_)\n-220 free();\n-221\n-222 if (spqrMatrix_.N() + spqrMatrix_.M() + spqrMatrix_.nonzeroes() != 0)\n-223 spqrMatrix_.free();\n-224\n-225 spqrMatrix_.setSize(rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n-(matrix) / matrix._\bN(),\n-226 rowIndexSet.size()*_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(matrix) / matrix._\bM());\n-227 ISTL::Impl::BCCSMatrixInitializer initializer(spqrMatrix_);\n-228\n-229 copyToBCCSMatrix(initializer, ISTL::Impl::MatrixRowSubset<_\bM_\ba_\bt_\br_\bi_\bx,std::\n-set >(matrix,rowIndexSet));\n-230\n-231 decompose();\n-232 }\n-233\n-_\b2_\b3_\b8 inline void _\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by(int v)\n-239 {\n-240 verbose_=v;\n-241 }\n-242\n-_\b2_\b4_\b7 inline SuiteSparseQR_factorization* _\bg_\be_\bt_\bF_\ba_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn()\n-248 {\n-249 return spqrfactorization_;\n-250 }\n-251\n-_\b2_\b5_\b6 inline _\bS_\bP_\bQ_\bR_\bM_\ba_\bt_\br_\bi_\bx& _\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx()\n-257 {\n-258 return spqrMatrix_;\n-259 }\n-260\n-_\b2_\b6_\b5 void _\bf_\br_\be_\be()\n-266 {\n-267 cholmod_l_free_sparse(&A_, cc_);\n-268 cholmod_l_free_dense(&B_, cc_);\n-269 SuiteSparseQR_free(&spqrfactorization_, cc_);\n-270 spqrMatrix_.free();\n-271 matrixIsLoaded_ = false;\n-272 }\n-273\n-_\b2_\b7_\b5 inline const char* _\bn_\ba_\bm_\be()\n-276 {\n-277 return \"SPQR\";\n-278 }\n-279\n-280 private:\n-281 template\n-_\b2_\b8_\b2 friend class _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz;\n-283\n-284 friend struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br<_\bS_\bP_\bQ_\bR<_\bM_\ba_\bt_\br_\bi_\bx>,true>;\n-285\n-287 void decompose()\n-288 {\n-289 const std::size_t nrows(spqrMatrix_.N());\n-290 const std::size_t ncols(spqrMatrix_.M());\n-291 const std::size_t nnz(spqrMatrix_.getColStart()[ncols]);\n-292\n-293 // initialise the matrix A (sorted, packed, unsymmetric, real entries)\n-294 A_ = cholmod_l_allocate_sparse(nrows, ncols, nnz, 1, 1, 0, 1, cc_);\n-295\n-296 // copy all the entries of Ap, Ai, Ax\n-297 for(std::size_t k = 0; k != (ncols+1); ++k)\n-298 (static_cast(A_->p))[k] = spqrMatrix_.getColStart()[k];\n-299\n-300 for(std::size_t k = 0; k != nnz; ++k)\n-301 {\n-302 (static_cast(A_->i))[k] = spqrMatrix_.getRowIndex()[k];\n-303 (static_cast(A_->x))[k] = spqrMatrix_.getValues()[k];\n-304 }\n-305\n-306 // initialise the vector B\n-307 B_ = cholmod_l_allocate_dense(nrows, 1, nrows, A_->xtype, cc_);\n-308 // compute factorization of A\n-309 spqrfactorization_=SuiteSparseQR_factorize\n-(SPQR_ORDERING_DEFAULT,SPQR_DEFAULT_TOL,A_,cc_);\n-310 }\n-311\n-312 SPQRMatrix spqrMatrix_;\n-313 bool matrixIsLoaded_;\n-314 int verbose_;\n-315 cholmod_common* cc_;\n-316 cholmod_sparse* A_;\n-317 cholmod_dense* B_;\n-318 SuiteSparseQR_factorization* spqrfactorization_;\n-319 };\n-320\n-321 template\n-_\b3_\b2_\b2 struct _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br<_\bS_\bP_\bQ_\bR<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx > >\n-323 {\n-_\b3_\b2_\b4 enum {_\bv_\ba_\bl_\bu_\be = true};\n-325 };\n-326\n-327 template\n-_\b3_\b2_\b8 struct _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd<_\bS_\bP_\bQ_\bR<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx > >\n-329 {\n-_\b3_\b3_\b0 enum {_\bv_\ba_\bl_\bu_\be = true};\n-331 };\n-332\n-_\b3_\b3_\b3 struct _\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br {\n-_\b3_\b3_\b4 template struct _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk : std::false_type{};\n-335\n-336 template\n-337 std::shared_ptr::type,\n-338 typename Dune::TypeListElement<2, TL>::type>>\n-_\b3_\b3_\b9 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& _\bm_\ba_\bt, const Dune::ParameterTree& config,\n-340 std::enable_if_t<\n-341 _\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk::type::block_type>::\n-value,int> = 0) const\n-342 {\n-343 int verbose = config.get(\"verbose\", 0);\n-344 return std::make_shared>(_\bm_\ba_\bt,verbose);\n-345 }\n-346\n-347 // second version with SFINAE to validate the template parameters of SPQR\n-348 template\n-349 std::shared_ptr::type,\n-350 typename Dune::TypeListElement<2, TL>::type>>\n-_\b3_\b5_\b1 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)_\b (TL /*tl*/, const M& /*mat*/, const Dune::ParameterTree& /\n-*config*/,\n-352 std::enable_if_t::\n-type::block_type>::value,int> = 0) const\n-353 {\n-354 DUNE_THROW(_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be,\n-355 \"Unsupported Type in SPQR (only double and std::complex\n-supported)\");\n-356 }\n-357 };\n-_\b3_\b5_\b8 template<> struct _\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk> : std::\n-true_type{};\n-359 // std::complex is temporary disabled, because it fails if libc++ is used\n-360 //template<> struct SPQRCreator::isValidMatrixBlock,1,1>> : std::true_type{};\n-_\b3_\b6_\b1 _\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR(\"spqr\", _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br());\n-362\n-363} // end namespace Dune\n-364\n-365\n-366#endif //HAVE_SUITESPARSE_SPQR\n-367#endif //DUNE_ISTL_SPQR_HH\n-_\bD_\bU_\bN_\bE_\b__\bR_\bE_\bG_\bI_\bS_\bT_\bE_\bR_\b__\bD_\bI_\bR_\bE_\bC_\bT_\b__\bS_\bO_\bL_\bV_\bE_\bR\n-#define DUNE_REGISTER_DIRECT_SOLVER(name,...)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:13\n-_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n-Implementations of the inverse operator interface.\n-_\bs_\bo_\bl_\bv_\be_\br_\bf_\ba_\bc_\bt_\bo_\br_\by_\b._\bh_\bh\n-_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\bi_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br_\b._\bh_\bh\n-_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n-Templates characterizing the type of a solver.\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be\n-Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > matrix_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\b~_\bS_\bP_\bQ_\bR\n-virtual ~SPQR()\n-Destructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:147\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bP_\bQ_\bR\n-SPQR(const Matrix &matrix, int verbose, bool)\n-Constructor for compatibility with SuperLU standard constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:113\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const\n-Category of the solver (see SolverCategory::Category)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:82\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx\n-SPQRMatrix & getInternalMatrix()\n-Return the column coppressed matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:256\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-void setMatrix(const Matrix &matrix)\n-Initialize data from given matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:200\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-ISTL::Impl::BCCSMatrixInitializer< BCRSMatrix< FieldMatrix< T, n, m >, A >, int\n-> MatrixInitializer\n-Type of an associated initializer class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n-Dune::BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix\n-The matrix type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:70\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bP_\bQ_\bR\n-SPQR()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:137\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n-std::shared_ptr< Dune::InverseOperator< typename Dune::TypeListElement< 1, TL\n->::type, typename Dune::TypeListElement< 2, TL >::type > > operator()(TL, const\n-M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock<\n-typename Dune::TypeListElement< 1, TL >::type::block_type >::value, int >=0)\n-const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:339\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bn_\ba_\bm_\be\n-const char * name()\n-Get method name.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:275\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bF_\ba_\bc_\bt_\bo_\br_\bi_\bz_\ba_\bt_\bi_\bo_\bn\n-SuiteSparseQR_factorization< T > * getFactorization()\n-Return the matrix factorization.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:247\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bV_\be_\br_\bb_\bo_\bs_\bi_\bt_\by\n-void setVerbosity(int v)\n-Sets the verbosity level for the solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:238\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bP_\bQ_\bR_\bM_\ba_\bt_\br_\bi_\bx\n-ISTL::Impl::BCCSMatrix< T, int > SPQRMatrix\n-The corresponding SuperLU Matrix type.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:73\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(domain_type &x, range_type &b, double reduction,\n-InverseOperatorResult &res)\n-apply inverse operator, with given convergence criteria.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:191\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\br_\be_\be\n-void free()\n-Free allocated space.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:265\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bP_\bQ_\bR\n-SPQR(const Matrix &matrix, const ParameterTree &config)\n-Constructs the SPQR solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:132\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Dune::BlockVector< FieldVector< T, n >, typename std::allocator_traits< A >::\n-template rebind_alloc< FieldVector< T, n > > > range_type\n-The type of the range of the solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:79\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bS_\bu_\bb_\bM_\ba_\bt_\br_\bi_\bx\n-void setSubMatrix(const Matrix &matrix, const S &rowIndexSet)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:217\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-Dune::BlockVector< FieldVector< T, m >, typename std::allocator_traits< A >::\n-template rebind_alloc< FieldVector< T, m > > > domain_type\n-The type of the domain of the solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(domain_type &x, range_type &b, InverseOperatorResult &res)\n-Apply inverse operator,.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:155\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bO_\bp_\bt_\bi_\bo_\bn\n-void setOption(unsigned int option, double value)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:196\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bP_\bQ_\bR\n-SPQR(const Matrix &matrix, int verbose=0)\n-Construct a solver object from a BCRSMatrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:95\n-_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+87 // Update residual for the symmetric case\n+88 // Skip residual computation as it is not needed.\n+89 //for(col=(*row).begin();col.index() >::Type get(const Amg::VertexVisitedTag &tag,\n-Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n-A sparse block matrix with compressed row storage.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n-size_type M() const\n-number of columns (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2007\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-size_type N() const\n-number of rows (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-A vector of blocks with memory management.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n-Sequential overlapping Schwarz preconditioner.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bA_\bs_\bs_\be_\bm_\bb_\bl_\be_\br_\bH_\be_\bl_\bp_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:694\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-Statistics about the application of an inverse operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n-int iterations\n-Number of iterations.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt_\b:_\b:_\bc_\bo_\bn_\bv_\be_\br_\bg_\be_\bd\n-bool converged\n-True if convergence criterion has been met.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Abstract base class for all solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n-_\bD_\bu_\bn_\be_\b:_\b:_\bU_\bn_\bs_\bu_\bp_\bp_\bo_\br_\bt_\be_\bd_\bT_\by_\bp_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solverregistry.hh:77\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-@ value\n-Whether this is a direct solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-@ value\n-whether the solver internally uses column compressed storage\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:36\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR\n-Use the SPQR package to directly solve linear systems \u00e2\u0080\u0093 empty default class.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:333\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bP_\bQ_\bR_\bC_\br_\be_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bB_\bl_\bo_\bc_\bk\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn spqr.hh:334\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamgsmoother.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+static void apply(const M &A, X &x, Y &d, const Y &b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamgsmoother.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamgsmoother.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bu_\bs_\bs_\bS_\be_\bi_\bd_\be_\bl_\bP_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh_\bD_\be_\bf_\be_\bc_\bt_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+static void apply(const M &A, X &x, Y &d, const Y &b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn fastamgsmoother.hh:55\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00203.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00203.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: bccsmatrixinitializer.hh File Reference\n+dune-istl: twolevelmethod.hh File Reference\n \n \n \n \n \n \n \n@@ -65,38 +65,59 @@\n \n \n \n \n \n \n \n
    \n \n-
    bccsmatrixinitializer.hh File Reference
    \n+ \n
    \n
    \n-
    #include <limits>
    \n-#include <set>
    \n-#include <dune/common/typetraits.hh>
    \n-#include <dune/common/scalarmatrixview.hh>
    \n-#include <dune/istl/bccsmatrix.hh>
    \n+\n+

    Algebraic twolevel methods. \n+More...

    \n+
    #include <tuple>
    \n+#include <dune/istl/operators.hh>
    \n+#include "amg.hh"
    \n+#include "galerkin.hh"
    \n+#include <dune/istl/solver.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+

    \n+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...
     
    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 >
     
    \n \n \n \n-\n+\n \n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::ISTL
    namespace  Dune::Amg
     
    \n-
    \n+

    Detailed Description

    \n+

    Algebraic twolevel methods.

    \n+
    Author
    Markus Blatt
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,21 +1,44 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-bccsmatrixinitializer.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+twolevelmethod.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Algebraic twolevel methods. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+#include \"_\ba_\bm_\bg_\b._\bh_\bh\"\n+#include \"_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\"\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n+C\bCl\bla\bas\bss\bse\bes\bs\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bF_\bO_\b,_\b _\bC_\bO_\b _\b>\n+\u00a0 Abstract base class for transfer between levels and creation of the\n+ coarse level system. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bO_\b,_\b _\bC_\b _\b>\n+\u00a0 A LeveTransferPolicy that used aggregation to construct the coarse\n+ level system. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bO_\b,_\b _\bS_\b,_\b _\bC_\b _\b>\n+\u00a0 A policy class for solving the coarse level system using one step of\n+ _\bA_\bM_\bG. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b<_\b _\bF_\bO_\b,_\b _\bC_\bS_\bP_\b,_\b _\bS_\b _\b>\n+\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Algebraic twolevel methods.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00203_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00203_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: bccsmatrixinitializer.hh Source File\n+dune-istl: twolevelmethod.hh Source File\n \n \n \n \n \n \n \n@@ -70,339 +70,482 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    bccsmatrixinitializer.hh
    \n+
    twolevelmethod.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH
    \n-
    6#define DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH
    \n+
    5#ifndef DUNE_ISTL_TWOLEVELMETHOD_HH
    \n+
    6#define DUNE_ISTL_TWOLEVELMETHOD_HH
    \n
    7
    \n-
    8#include <limits>
    \n-
    9#include <set>
    \n-
    10
    \n-
    11#include <dune/common/typetraits.hh>
    \n-
    12#include <dune/common/scalarmatrixview.hh>
    \n-
    13
    \n-\n-
    15
    \n-
    16namespace Dune
    \n-
    17{
    \n-
    18 template<class I, class S, class D>
    \n-
    19 class OverlappingSchwarzInitializer;
    \n-
    20}
    \n-
    21
    \n-
    22namespace Dune::ISTL::Impl
    \n+
    8#include <tuple>
    \n+
    9
    \n+\n+
    11#include"amg.hh"
    \n+
    12#include"galerkin.hh"
    \n+
    13#include<dune/istl/solver.hh>
    \n+
    14
    \n+
    22namespace Dune
    \n
    23{
    \n-
    31 template<class M, class S>
    \n-
    32 class MatrixRowSubset
    \n-
    33 {
    \n-
    34 public:
    \n-
    36 typedef M Matrix;
    \n-
    38 typedef S RowIndexSet;
    \n-
    39
    \n-
    45 MatrixRowSubset(const Matrix& m, const RowIndexSet& s)
    \n-
    46 : m_(m), s_(s)
    \n-
    47 {}
    \n-
    48
    \n-
    49 const Matrix& matrix() const
    \n-
    50 {
    \n-
    51 return m_;
    \n-
    52 }
    \n-
    53
    \n-
    54 const RowIndexSet& rowIndexSet() const
    \n-
    55 {
    \n-
    56 return s_;
    \n-
    57 }
    \n-
    58
    \n-
    60 class const_iterator
    \n-
    61 : public ForwardIteratorFacade<const_iterator, const typename Matrix::row_type>
    \n-
    62 {
    \n-
    63 public:
    \n-
    64 const_iterator(typename Matrix::const_iterator firstRow,
    \n-
    65 typename RowIndexSet::const_iterator pos)
    \n-
    66 : firstRow_(firstRow), pos_(pos)
    \n-
    67 {}
    \n-
    68
    \n-
    69
    \n-
    70 const typename Matrix::row_type& dereference() const
    \n-
    71 {
    \n-
    72 return *(firstRow_+ *pos_);
    \n-
    73 }
    \n-
    74 bool equals(const const_iterator& o) const
    \n-
    75 {
    \n-
    76 return pos_==o.pos_;
    \n-
    77 }
    \n-
    78 void increment()
    \n-
    79 {
    \n-
    80 ++pos_;
    \n-
    81 }
    \n-
    82 typename RowIndexSet::value_type index() const
    \n-
    83 {
    \n-
    84 return *pos_;
    \n-
    85 }
    \n-
    86
    \n-
    87 private:
    \n-
    89 typename Matrix::const_iterator firstRow_;
    \n-
    91 typename RowIndexSet::const_iterator pos_;
    \n-
    92 };
    \n-
    93
    \n-
    95 const_iterator begin() const
    \n-
    96 {
    \n-
    97 return const_iterator(m_.begin(), s_.begin());
    \n-
    98 }
    \n-
    100 const_iterator end() const
    \n-
    101 {
    \n-
    102 return const_iterator(m_.begin(), s_.end());
    \n-
    103 }
    \n-
    104
    \n-
    105 private:
    \n-
    107 const Matrix& m_;
    \n-
    109 const RowIndexSet& s_;
    \n-
    110 };
    \n-
    111
    \n-
    118 template<class M, class I = typename M::size_type>
    \n-
    119 class BCCSMatrixInitializer
    \n-
    120 {
    \n-
    121 template<class IList, class S, class D>
    \n-\n-
    123 public:
    \n-
    124 using Matrix = M;
    \n-
    125 using Index = I;
    \n-
    126 typedef Dune::ISTL::Impl::BCCSMatrix<typename Matrix::field_type, I> OutputMatrix;
    \n-
    127 typedef typename Matrix::size_type size_type;
    \n-
    128
    \n-
    131 BCCSMatrixInitializer(OutputMatrix& mat_)
    \n-
    132 : mat(&mat_), cols(mat_.M())
    \n-
    133 {
    \n-
    134 if constexpr (Dune::IsNumber<typename M::block_type>::value)
    \n-
    135 {
    \n-
    136 n = m = 1;
    \n-
    137 }
    \n-
    138 else
    \n-
    139 {
    \n-
    140 // WARNING: This assumes that all blocks are dense and identical
    \n-
    141 n = M::block_type::rows;
    \n-
    142 m = M::block_type::cols;
    \n-
    143 }
    \n-
    144
    \n-
    145 mat->Nnz_=0;
    \n-
    146 }
    \n-
    147
    \n-
    148 BCCSMatrixInitializer()
    \n-
    149 : mat(0), cols(0), n(0), m(0)
    \n-
    150 {}
    \n-
    151
    \n-
    152 virtual ~BCCSMatrixInitializer()
    \n-
    153 {}
    \n-
    154
    \n-
    155 template<typename Iter>
    \n-
    156 void addRowNnz(const Iter& row) const
    \n-
    157 {
    \n-
    158 mat->Nnz_+=row->getsize();
    \n-
    159 }
    \n-
    160
    \n-
    161 template<typename Iter, typename FullMatrixIndex>
    \n-
    162 void addRowNnz(const Iter& row, const std::set<FullMatrixIndex>& indices) const
    \n-
    163 {
    \n-
    164 auto siter =indices.begin();
    \n-
    165 for (auto entry=row->begin(); entry!=row->end(); ++entry)
    \n-
    166 {
    \n-
    167 for(; siter!=indices.end() && *siter<entry.index(); ++siter) ;
    \n-
    168 if(siter==indices.end())
    \n-
    169 break;
    \n-
    170 if(*siter==entry.index())
    \n-
    171 // index is in subdomain
    \n-
    172 ++mat->Nnz_;
    \n-
    173 }
    \n-
    174 }
    \n-
    175
    \n-
    176 template<typename Iter, typename SubMatrixIndex>
    \n-
    177 void addRowNnz(const Iter& row, const std::vector<SubMatrixIndex>& indices) const
    \n-
    178 {
    \n-
    179 for (auto entry=row->begin(); entry!=row->end(); ++entry)
    \n-
    180 if (indices[entry.index()]!=std::numeric_limits<SubMatrixIndex>::max())
    \n-
    181 ++mat->Nnz_;
    \n-
    182 }
    \n+
    24namespace Amg
    \n+
    25{
    \n+
    26
    \n+
    36template<class FO, class CO>
    \n+
    \n+\n+
    38{
    \n+
    39public:
    \n+
    44 typedef FO FineOperatorType;
    \n+
    48 typedef typename FineOperatorType::range_type FineRangeType;
    \n+
    52 typedef typename FineOperatorType::domain_type FineDomainType;
    \n+\n+
    61 typedef typename CoarseOperatorType::range_type CoarseRangeType;
    \n+
    65 typedef typename CoarseOperatorType::domain_type CoarseDomainType;
    \n+
    \n+
    70 std::shared_ptr<CoarseOperatorType>& getCoarseLevelOperator()
    \n+
    71 {
    \n+
    72 return operator_;
    \n+
    73 }
    \n+
    \n+
    \n+\n+
    79 {
    \n+
    80 return rhs_;
    \n+
    81 }
    \n+
    \n+
    82
    \n+
    \n+\n+
    88 {
    \n+
    89 return lhs_;
    \n+
    90 }
    \n+
    \n+
    100 virtual void moveToCoarseLevel(const FineRangeType& fineRhs)=0;
    \n+
    110 virtual void moveToFineLevel(FineDomainType& fineLhs)=0;
    \n+
    118 virtual void createCoarseLevelSystem(const FineOperatorType& fineOperator)=0;
    \n+
    119
    \n+
    121 virtual LevelTransferPolicy* clone() const =0;
    \n+
    122
    \n+\n+
    125
    \n+
    126 protected:
    \n+\n+\n+
    132 std::shared_ptr<CoarseOperatorType> operator_;
    \n+
    133};
    \n+
    \n+
    134
    \n+
    140template<class O, class C>
    \n+
    \n+\n+
    142 : public LevelTransferPolicy<O,O>
    \n+
    143{
    \n+\n+
    145public:
    \n+\n+
    147 typedef C Criterion;
    \n+\n+
    149
    \n+
    \n+\n+
    151 : criterion_(crit)
    \n+
    152 {}
    \n+
    \n+
    153
    \n+
    \n+
    154 void createCoarseLevelSystem(const O& fineOperator)
    \n+
    155 {
    \n+
    156 prolongDamp_ = criterion_.getProlongationDampingFactor();
    \n+\n+\n+\n+
    160 Dune::Amg::EdgeProperties,Dune::IdentityMap,Dune::IdentityMap> PropertiesGraph;
    \n+
    161 MatrixGraph mg(fineOperator.getmat());
    \n+
    162 PropertiesGraph pg(mg,Dune::IdentityMap(),Dune::IdentityMap());
    \n+
    163 typedef NegateSet<typename ParallelInformation::OwnerSet> OverlapFlags;
    \n+
    164
    \n+
    165 aggregatesMap_ = std::make_shared<AggregatesMap>(pg.maxVertex()+1);
    \n+
    166
    \n+
    167 int noAggregates, isoAggregates, oneAggregates, skippedAggregates;
    \n+
    168
    \n+
    169 std::tie(noAggregates, isoAggregates, oneAggregates, skippedAggregates) =
    \n+
    170 aggregatesMap_->buildAggregates(fineOperator.getmat(), pg, criterion_, true);
    \n+
    171 std::cout<<"no aggregates="<<noAggregates<<" iso="<<isoAggregates<<" one="<<oneAggregates<<" skipped="<<skippedAggregates<<std::endl;
    \n+
    172 // misuse coarsener to renumber aggregates
    \n+\n+
    174 typedef std::vector<bool>::iterator Iterator;
    \n+
    175 typedef Dune::IteratorPropertyMap<Iterator, Dune::IdentityMap> VisitedMap;
    \n+
    176 std::vector<bool> excluded(fineOperator.getmat().N(), false);
    \n+
    177 VisitedMap vm(excluded.begin(), Dune::IdentityMap());
    \n+\n+
    179 std::size_t aggregates = renumberer.coarsen(pinfo, pg, vm,
    \n+
    180 *aggregatesMap_, pinfo,
    \n+
    181 noAggregates);
    \n+
    182 std::vector<bool>& visited=excluded;
    \n
    183
    \n-
    184 void allocate()
    \n-
    185 {
    \n-
    186 allocateMatrixStorage();
    \n-
    187 allocateMarker();
    \n-
    188 }
    \n-
    189
    \n-
    190 template<typename Iter, typename CIter>
    \n-
    191 void countEntries([[maybe_unused]] const Iter& row, const CIter& col) const
    \n-
    192 {
    \n-
    193 countEntries(col.index());
    \n-
    194 }
    \n-
    195
    \n-
    196 void countEntries(size_type colindex) const
    \n-
    197 {
    \n-
    198 for(size_type i=0; i < m; ++i)
    \n-
    199 {
    \n-
    200 assert(colindex*m+i<cols);
    \n-
    201 marker[colindex*m+i]+=n;
    \n-
    202 }
    \n-
    203 }
    \n-
    204
    \n-
    205 void calcColstart() const
    \n-
    206 {
    \n-
    207 mat->colstart[0]=0;
    \n-
    208 for(size_type i=0; i < cols; ++i) {
    \n-
    209 assert(i<cols);
    \n-
    210 mat->colstart[i+1]=mat->colstart[i]+marker[i];
    \n-
    211 marker[i]=mat->colstart[i];
    \n-
    212 }
    \n-
    213 }
    \n-
    214
    \n-
    215 template<typename Iter, typename CIter>
    \n-
    216 void copyValue(const Iter& row, const CIter& col) const
    \n-
    217 {
    \n-
    218 copyValue(col, row.index(), col.index());
    \n-
    219 }
    \n-
    220
    \n-
    221 template<typename CIter>
    \n-
    222 void copyValue(const CIter& col, size_type rowindex, size_type colindex) const
    \n-
    223 {
    \n-
    224 for(size_type i=0; i<n; i++) {
    \n-
    225 for(size_type j=0; j<m; j++) {
    \n-
    226 assert(colindex*m+j<cols-1 || (size_type)marker[colindex*m+j]<(size_type)mat->colstart[colindex*m+j+1]);
    \n-
    227 assert((size_type)marker[colindex*m+j]<mat->Nnz_);
    \n-
    228 mat->rowindex[marker[colindex*m+j]]=rowindex*n+i;
    \n-
    229 mat->values[marker[colindex*m+j]] = Dune::Impl::asMatrix(*col)[i][j];
    \n-
    230 ++marker[colindex*m+j]; // index for next entry in column
    \n-
    231 }
    \n-
    232 }
    \n-
    233 }
    \n-
    234
    \n-
    235 virtual void createMatrix() const
    \n-
    236 {
    \n-
    237 marker.clear();
    \n-
    238 }
    \n-
    239
    \n-
    240 protected:
    \n-
    241
    \n-
    242 void allocateMatrixStorage() const
    \n-
    243 {
    \n-
    244 mat->Nnz_*=n*m;
    \n-
    245 // initialize data
    \n-
    246 mat->values=new typename M::field_type[mat->Nnz_];
    \n-
    247 mat->rowindex=new I[mat->Nnz_];
    \n-
    248 mat->colstart=new I[cols+1];
    \n-
    249 }
    \n-
    250
    \n-
    251 void allocateMarker()
    \n-
    252 {
    \n-
    253 marker.resize(cols);
    \n-
    254 std::fill(marker.begin(), marker.end(), 0);
    \n-
    255 }
    \n-
    256
    \n-
    257 OutputMatrix* mat;
    \n-
    258 size_type cols;
    \n-
    259
    \n-
    260 // Number of rows/columns of the matrix entries
    \n-
    261 // (assumed to be scalars or dense matrices)
    \n-
    262 size_type n, m;
    \n-
    263
    \n-
    264 mutable std::vector<size_type> marker;
    \n-
    265 };
    \n-
    266
    \n-
    267 template<class F, class Matrix>
    \n-
    268 void copyToBCCSMatrix(F& initializer, const Matrix& matrix)
    \n+
    184 typedef std::vector<bool>::iterator Iterator;
    \n+
    185
    \n+
    186 for(Iterator iter= visited.begin(), end=visited.end();
    \n+
    187 iter != end; ++iter)
    \n+
    188 *iter=false;
    \n+
    189 matrix_.reset(productBuilder.build(mg, vm,
    \n+\n+
    191 *aggregatesMap_,
    \n+
    192 aggregates,
    \n+
    193 OverlapFlags()));
    \n+
    194 productBuilder.calculate(fineOperator.getmat(), *aggregatesMap_, *matrix_, pinfo, OverlapFlags());
    \n+
    195 this->lhs_.resize(this->matrix_->M());
    \n+
    196 this->rhs_.resize(this->matrix_->N());
    \n+
    197 this->operator_ = std::make_shared<O>(*matrix_);
    \n+
    198 }
    \n+
    \n+
    199
    \n+
    \n+
    200 void moveToCoarseLevel(const typename FatherType::FineRangeType& fineRhs)
    \n+
    201 {
    \n+\n+
    203 ::restrictVector(*aggregatesMap_, this->rhs_, fineRhs, ParallelInformation());
    \n+
    204 this->lhs_=0;
    \n+
    205 }
    \n+
    \n+
    206
    \n+
    \n+\n+
    208 {
    \n+\n+
    210 ::prolongateVector(*aggregatesMap_, this->lhs_, fineLhs,
    \n+
    211 prolongDamp_, ParallelInformation());
    \n+
    212 }
    \n+
    \n+
    213
    \n+
    \n+\n+
    215 {
    \n+
    216 return new AggregationLevelTransferPolicy(*this);
    \n+
    217 }
    \n+
    \n+
    218
    \n+
    219private:
    \n+
    220 typename O::matrix_type::field_type prolongDamp_;
    \n+
    221 std::shared_ptr<AggregatesMap> aggregatesMap_;
    \n+
    222 Criterion criterion_;
    \n+
    223 std::shared_ptr<typename O::matrix_type> matrix_;
    \n+
    224};
    \n+
    \n+
    225
    \n+
    232template<class O, class S, class C>
    \n+
    \n+\n+
    234{
    \n+
    235public:
    \n+
    237 typedef O Operator;
    \n+
    239 typedef typename O::range_type X;
    \n+
    241 typedef C Criterion;
    \n+
    243 typedef S Smoother;
    \n+\n+\n+
    \n+\n+
    254 : smootherArgs_(args), criterion_(c)
    \n+
    255 {}
    \n+
    \n+
    \n+\n+
    258 : coarseOperator_(other.coarseOperator_), smootherArgs_(other.smootherArgs_),
    \n+
    259 criterion_(other.criterion_)
    \n+
    260 {}
    \n+
    \n+
    261private:
    \n+
    268 struct AMGInverseOperator : public InverseOperator<X,X>
    \n
    269 {
    \n-
    270 for (auto row=matrix.begin(); row!= matrix.end(); ++row)
    \n-
    271 initializer.addRowNnz(row);
    \n-
    272
    \n-
    273 initializer.allocate();
    \n-
    274
    \n-
    275 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {
    \n-
    276
    \n-
    277 for (auto col=row->begin(); col != row->end(); ++col)
    \n-
    278 initializer.countEntries(row, col);
    \n-
    279 }
    \n-
    280
    \n-
    281 initializer.calcColstart();
    \n-
    282
    \n-
    283 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {
    \n-
    284 for (auto col=row->begin(); col != row->end(); ++col) {
    \n-
    285 initializer.copyValue(row, col);
    \n-
    286 }
    \n-
    287
    \n-
    288 }
    \n-
    289 initializer.createMatrix();
    \n-
    290 }
    \n+
    270 AMGInverseOperator(const typename AMGType::Operator& op,
    \n+
    271 const Criterion& crit,
    \n+
    272 const typename AMGType::SmootherArgs& args)
    \n+
    273 : amg_(op, crit,args), first_(true)
    \n+
    274 {}
    \n+
    275
    \n+
    276 void apply(X& x, X& b, [[maybe_unused]] double reduction, [[maybe_unused]] InverseOperatorResult& res)
    \n+
    277 {
    \n+
    278 if(first_)
    \n+
    279 {
    \n+
    280 amg_.pre(x,b);
    \n+
    281 first_=false;
    \n+
    282 x_=x;
    \n+
    283 }
    \n+
    284 amg_.apply(x,b);
    \n+
    285 }
    \n+
    286
    \n+
    287 void apply(X& x, X& b, InverseOperatorResult& res)
    \n+
    288 {
    \n+
    289 return apply(x,b,1e-8,res);
    \n+
    290 }
    \n
    291
    \n-
    292 template<class F, class M,class S>
    \n-
    293 void copyToBCCSMatrix(F& initializer, const MatrixRowSubset<M,S>& mrs)
    \n-
    294 {
    \n-
    295 typedef MatrixRowSubset<M,S> MRS;
    \n-
    296 typedef typename MRS::RowIndexSet SIS;
    \n-
    297 typedef typename SIS::const_iterator SIter;
    \n-
    298 typedef typename MRS::const_iterator Iter;
    \n-
    299 typedef typename std::iterator_traits<Iter>::value_type row_type;
    \n-
    300 typedef typename row_type::const_iterator CIter;
    \n-
    301
    \n-
    302 typedef typename MRS::Matrix::size_type size_type;
    \n-
    303
    \n-
    304 // A vector containing the corresponding indices in
    \n-
    305 // the to create submatrix.
    \n-
    306 // If an entry is the maximum of size_type then this index will not appear in
    \n-
    307 // the submatrix.
    \n-
    308 std::vector<size_type> subMatrixIndex(mrs.matrix().N(),
    \n-
    309 std::numeric_limits<size_type>::max());
    \n-
    310 size_type s=0;
    \n-
    311 for(SIter index = mrs.rowIndexSet().begin(); index!=mrs.rowIndexSet().end(); ++index)
    \n-
    312 subMatrixIndex[*index]=s++;
    \n-
    313
    \n-
    314 // Calculate upper Bound for nonzeros
    \n-
    315 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
    \n-
    316 initializer.addRowNnz(row, subMatrixIndex);
    \n-
    317
    \n-
    318 initializer.allocate();
    \n-
    319
    \n-
    320 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
    \n-
    321 for(CIter col=row->begin(); col != row->end(); ++col) {
    \n-
    322 if(subMatrixIndex[col.index()]!=std::numeric_limits<size_type>::max())
    \n-
    323 // This column is in our subset (use submatrix column index)
    \n-
    324 initializer.countEntries(subMatrixIndex[col.index()]);
    \n-
    325 }
    \n-
    326
    \n-
    327 initializer.calcColstart();
    \n-
    328
    \n-
    329 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)
    \n-
    330 for(CIter col=row->begin(); col != row->end(); ++col) {
    \n-
    331 if(subMatrixIndex[col.index()]!=std::numeric_limits<size_type>::max())
    \n-
    332 // This value is in our submatrix -> copy (use submatrix indices
    \n-
    333 initializer.copyValue(col, subMatrixIndex[row.index()], subMatrixIndex[col.index()]);
    \n-
    334 }
    \n-
    335 initializer.createMatrix();
    \n-
    336 }
    \n-
    337
    \n-
    338}
    \n-
    339#endif
    \n-\n-
    Col col
    Definition matrixmatrix.hh:351
    \n-
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n-
    std::size_t countEntries(const BlockVector< T, A > &vector)
    Definition matrixmarket.hh:1076
    \n+
    293 virtual SolverCategory::Category category() const
    \n+
    294 {
    \n+
    295 return amg_.category();
    \n+
    296 }
    \n+
    297
    \n+
    298 ~AMGInverseOperator()
    \n+
    299 {
    \n+
    300 if(!first_)
    \n+
    301 amg_.post(x_);
    \n+
    302 }
    \n+
    303 AMGInverseOperator(const AMGInverseOperator& other)
    \n+
    304 : x_(other.x_), amg_(other.amg_), first_(other.first_)
    \n+
    305 {
    \n+
    306 }
    \n+
    307 private:
    \n+
    308 X x_;
    \n+
    309 AMGType amg_;
    \n+
    310 bool first_;
    \n+
    311 };
    \n+
    312
    \n+
    313public:
    \n+
    315 typedef AMGInverseOperator CoarseLevelSolver;
    \n+
    316
    \n+
    324 template<class P>
    \n+
    \n+\n+
    326 {
    \n+
    327 coarseOperator_=transferPolicy.getCoarseLevelOperator();
    \n+
    328 AMGInverseOperator* inv = new AMGInverseOperator(*coarseOperator_,
    \n+
    329 criterion_,
    \n+
    330 smootherArgs_);
    \n+
    331
    \n+
    332 return inv; //std::shared_ptr<InverseOperator<X,X> >(inv);
    \n+
    333
    \n+
    334 }
    \n+
    \n+
    335
    \n+
    336private:
    \n+
    338 std::shared_ptr<Operator> coarseOperator_;
    \n+
    340 SmootherArgs smootherArgs_;
    \n+
    342 Criterion criterion_;
    \n+
    343};
    \n+
    \n+
    344
    \n+
    350template<class FO, class CSP, class S>
    \n+
    \n+\n+
    352 public Preconditioner<typename FO::domain_type, typename FO::range_type>
    \n+
    353{
    \n+
    354public:
    \n+\n+
    358 typedef typename CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver;
    \n+\n+
    367 typedef typename FineOperatorType::range_type FineRangeType;
    \n+
    371 typedef typename FineOperatorType::domain_type FineDomainType;
    \n+
    376 typedef typename CSP::Operator CoarseOperatorType;
    \n+
    380 typedef typename CoarseOperatorType::range_type CoarseRangeType;
    \n+
    384 typedef typename CoarseOperatorType::domain_type CoarseDomainType;
    \n+
    388 typedef S SmootherType;
    \n+
    389
    \n+
    \n+\n+
    405 std::shared_ptr<SmootherType> smoother,
    \n+\n+
    407 CoarseOperatorType>& policy,
    \n+
    408 CoarseLevelSolverPolicy& coarsePolicy,
    \n+
    409 std::size_t preSteps=1, std::size_t postSteps=1)
    \n+
    410 : operator_(&op), smoother_(smoother),
    \n+
    411 preSteps_(preSteps), postSteps_(postSteps)
    \n+
    412 {
    \n+
    413 policy_ = policy.clone();
    \n+
    414 policy_->createCoarseLevelSystem(*operator_);
    \n+
    415 coarseSolver_=coarsePolicy.createCoarseLevelSolver(*policy_);
    \n+
    416 }
    \n+
    \n+
    417
    \n+
    \n+\n+
    419 : operator_(other.operator_), coarseSolver_(new CoarseLevelSolver(*other.coarseSolver_)),
    \n+
    420 smoother_(other.smoother_), policy_(other.policy_->clone()),
    \n+
    421 preSteps_(other.preSteps_), postSteps_(other.postSteps_)
    \n+
    422 {}
    \n+
    \n+
    423
    \n+
    \n+\n+
    425 {
    \n+
    426 // Each instance has its own policy.
    \n+
    427 delete policy_;
    \n+
    428 delete coarseSolver_;
    \n+
    429 }
    \n+
    \n+
    430
    \n+
    \n+\n+
    432 {
    \n+
    433 smoother_->pre(x,b);
    \n+
    434 }
    \n+
    \n+
    435
    \n+
    \n+
    436 void post([[maybe_unused]] FineDomainType& x)
    \n+
    437 {}
    \n+
    \n+
    438
    \n+
    \n+\n+
    440 {
    \n+
    441 FineDomainType u(v);
    \n+
    442 FineRangeType rhs(d);
    \n+
    443 LevelContext context;
    \n+\n+
    445 context.pinfo=&info;
    \n+
    446 context.lhs=&u;
    \n+
    447 context.update=&v;
    \n+
    448 context.smoother=smoother_;
    \n+
    449 context.rhs=&rhs;
    \n+
    450 context.matrix=operator_;
    \n+
    451 // Presmoothing
    \n+
    452 presmooth(context, preSteps_);
    \n+
    453 //Coarse grid correction
    \n+
    454 policy_->moveToCoarseLevel(*context.rhs);
    \n+\n+
    456 coarseSolver_->apply(policy_->getCoarseLevelLhs(), policy_->getCoarseLevelRhs(), res);
    \n+
    457 *context.lhs=0;
    \n+
    458 policy_->moveToFineLevel(*context.lhs);
    \n+
    459 *context.update += *context.lhs;
    \n+
    460 // Postsmoothing
    \n+
    461 postsmooth(context, postSteps_);
    \n+
    462
    \n+
    463 }
    \n+
    \n+
    464
    \n+
    \n+\n+
    467 {
    \n+\n+
    469 }
    \n+
    \n+
    470
    \n+
    471private:
    \n+
    475 struct LevelContext
    \n+
    476 {
    \n+
    478 typedef S SmootherType;
    \n+
    480 std::shared_ptr<SmootherType> smoother;
    \n+
    482 FineDomainType* lhs;
    \n+
    483 /*
    \n+
    484 * @brief The right hand side holding the current residual.
    \n+
    485 *
    \n+
    486 * This is passed to the smoother as the right hand side.
    \n+
    487 */
    \n+
    488 FineRangeType* rhs;
    \n+
    494 FineDomainType* update;
    \n+\n+
    502 const FineOperatorType* matrix;
    \n+
    503 };
    \n+
    504 const FineOperatorType* operator_;
    \n+
    506 CoarseLevelSolver* coarseSolver_;
    \n+
    508 std::shared_ptr<S> smoother_;
    \n+
    510 LevelTransferPolicy<FO,typename CSP::Operator>* policy_;
    \n+
    512 std::size_t preSteps_;
    \n+
    514 std::size_t postSteps_;
    \n+
    515};
    \n+
    \n+
    516}// end namespace Amg
    \n+
    517}// end namespace Dune
    \n+
    518
    \n+
    520#endif
    \n+
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n+
    Define general, extensible interface for inverse operators.
    \n+
    Provides a class for building the galerkin product based on a aggregation scheme.
    \n+
    The AMG preconditioner.
    \n+
    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
    \n+
    SmootherTraits< Smoother >::Arguments SmootherArgs
    The argument type for the construction of the smoother.
    Definition amg.hh:100
    \n+
    Operator Operator
    The matrix operator type.
    Definition amg.hh:73
    \n+
    void presmooth(LevelContext &levelContext, size_t steps)
    Apply pre smoothing on the current level.
    Definition smoother.hh:406
    \n+
    void postsmooth(LevelContext &levelContext, size_t steps)
    Apply post smoothing on the current level.
    Definition smoother.hh:428
    \n+
    void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const I &pinfo, const O &copy)
    Calculate the galerkin product.
    \n
    Definition allocator.hh:11
    \n-
    Initializer for SuperLU Matrices representing the subdomains.
    Definition overlappingschwarz.hh:47
    \n-
    A::size_type size_type
    Type for indices and sizes.
    Definition matrix.hh:577
    \n-
    MatrixImp::DenseMatrixBase< T, A >::window_type row_type
    The type implementing a matrix row.
    Definition matrix.hh:574
    \n+
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n+
    Parallel algebraic multigrid based on agglomeration.
    Definition amg.hh:65
    \n+
    Class representing the properties of an edge in the matrix graph.
    Definition dependency.hh:39
    \n+
    Class representing a node in the matrix graph.
    Definition dependency.hh:126
    \n+
    Definition galerkin.hh:118
    \n+
    The (undirected) graph of a matrix.
    Definition graph.hh:51
    \n+
    Attaches properties to the edges and vertices of a graph.
    Definition graph.hh:978
    \n+
    VertexDescriptor maxVertex() const
    Get the maximal vertex descriptor.
    \n+
    Definition indicescoarsener.hh:36
    \n+
    Definition pinfo.hh:28
    \n+
    The default class for the smoother arguments.
    Definition smoother.hh:38
    \n+
    Definition transfer.hh:32
    \n+
    Abstract base class for transfer between levels and creation of the coarse level system.
    Definition twolevelmethod.hh:38
    \n+
    CO CoarseOperatorType
    The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
    Definition twolevelmethod.hh:57
    \n+
    virtual void moveToCoarseLevel(const FineRangeType &fineRhs)=0
    Transfers the data to the coarse level.
    \n+
    FineOperatorType::range_type FineRangeType
    The type of the range of the fine level operator.
    Definition twolevelmethod.hh:48
    \n+
    virtual void createCoarseLevelSystem(const FineOperatorType &fineOperator)=0
    Algebraically creates the coarse level system.
    \n+
    CoarseOperatorType::range_type CoarseRangeType
    The type of the range of the coarse level operator.
    Definition twolevelmethod.hh:61
    \n+
    virtual ~LevelTransferPolicy()
    Destructor.
    Definition twolevelmethod.hh:124
    \n+
    CoarseDomainType lhs_
    The coarse level lhs.
    Definition twolevelmethod.hh:130
    \n+
    virtual LevelTransferPolicy * clone() const =0
    Clone the current object.
    \n+
    CoarseDomainType & getCoarseLevelLhs()
    Get the coarse level left hand side.
    Definition twolevelmethod.hh:87
    \n+
    std::shared_ptr< CoarseOperatorType > operator_
    the coarse level linear operator.
    Definition twolevelmethod.hh:132
    \n+
    CoarseRangeType rhs_
    The coarse level rhs.
    Definition twolevelmethod.hh:128
    \n+
    virtual void moveToFineLevel(FineDomainType &fineLhs)=0
    Updates the fine level linear system after the correction of the coarse levels system.
    \n+
    std::shared_ptr< CoarseOperatorType > & getCoarseLevelOperator()
    Get the coarse level operator.
    Definition twolevelmethod.hh:70
    \n+
    CoarseRangeType & getCoarseLevelRhs()
    Get the coarse level right hand side.
    Definition twolevelmethod.hh:78
    \n+
    FO FineOperatorType
    The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
    Definition twolevelmethod.hh:44
    \n+
    CoarseOperatorType::domain_type CoarseDomainType
    The type of the domain of the coarse level operator.
    Definition twolevelmethod.hh:65
    \n+
    FineOperatorType::domain_type FineDomainType
    The type of the domain of the fine level operator.
    Definition twolevelmethod.hh:52
    \n+
    A LeveTransferPolicy that used aggregation to construct the coarse level system.
    Definition twolevelmethod.hh:143
    \n+
    C Criterion
    Definition twolevelmethod.hh:147
    \n+
    AggregationLevelTransferPolicy(const Criterion &crit)
    Definition twolevelmethod.hh:150
    \n+
    AggregationLevelTransferPolicy * clone() const
    Clone the current object.
    Definition twolevelmethod.hh:214
    \n+
    void moveToFineLevel(typename FatherType::FineDomainType &fineLhs)
    Updates the fine level linear system after the correction of the coarse levels system.
    Definition twolevelmethod.hh:207
    \n+
    void moveToCoarseLevel(const typename FatherType::FineRangeType &fineRhs)
    Definition twolevelmethod.hh:200
    \n+
    SequentialInformation ParallelInformation
    Definition twolevelmethod.hh:148
    \n+
    LevelTransferPolicy< O, O > FatherType
    Definition twolevelmethod.hh:146
    \n+
    void createCoarseLevelSystem(const O &fineOperator)
    Algebraically creates the coarse level system.
    Definition twolevelmethod.hh:154
    \n+
    A policy class for solving the coarse level system using one step of AMG.
    Definition twolevelmethod.hh:234
    \n+
    OneStepAMGCoarseSolverPolicy(const SmootherArgs &args, const Criterion &c)
    Constructs the coarse solver policy.
    Definition twolevelmethod.hh:253
    \n+
    AMGInverseOperator CoarseLevelSolver
    The type of solver constructed for the coarse level.
    Definition twolevelmethod.hh:315
    \n+
    OneStepAMGCoarseSolverPolicy(const OneStepAMGCoarseSolverPolicy &other)
    Copy constructor.
    Definition twolevelmethod.hh:257
    \n+
    O::range_type X
    The type of the range and domain of the operator.
    Definition twolevelmethod.hh:239
    \n+
    C Criterion
    The type of the crition used for the aggregation within AMG.
    Definition twolevelmethod.hh:241
    \n+
    Dune::Amg::SmootherTraits< S >::Arguments SmootherArgs
    The type of the arguments used for constructing the smoother.
    Definition twolevelmethod.hh:245
    \n+
    O Operator
    The type of the linear operator used.
    Definition twolevelmethod.hh:237
    \n+
    AMG< Operator, X, Smoother > AMGType
    The type of the AMG construct on the coarse level.
    Definition twolevelmethod.hh:247
    \n+
    CoarseLevelSolver * createCoarseLevelSolver(P &transferPolicy)
    Constructs a coarse level solver.
    Definition twolevelmethod.hh:325
    \n+
    S Smoother
    The type of the smoother used in AMG.
    Definition twolevelmethod.hh:243
    \n+
    Definition twolevelmethod.hh:353
    \n+
    CoarseOperatorType::range_type CoarseRangeType
    The type of the range of the coarse level operator.
    Definition twolevelmethod.hh:380
    \n+
    FineOperatorType::domain_type FineDomainType
    The type of the domain of the fine level operator.
    Definition twolevelmethod.hh:371
    \n+
    TwoLevelMethod(const TwoLevelMethod &other)
    Definition twolevelmethod.hh:418
    \n+
    void pre(FineDomainType &x, FineRangeType &b)
    Definition twolevelmethod.hh:431
    \n+
    FO FineOperatorType
    The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
    Definition twolevelmethod.hh:363
    \n+
    CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver
    The type of the coarse level solver.
    Definition twolevelmethod.hh:358
    \n+
    void apply(FineDomainType &v, const FineRangeType &d)
    Definition twolevelmethod.hh:439
    \n+
    CSP CoarseLevelSolverPolicy
    The type of the policy for constructing the coarse level solver.
    Definition twolevelmethod.hh:356
    \n+
    CoarseOperatorType::domain_type CoarseDomainType
    The type of the domain of the coarse level operator.
    Definition twolevelmethod.hh:384
    \n+
    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
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition twolevelmethod.hh:466
    \n+
    FineOperatorType::range_type FineRangeType
    The type of the range of the fine level operator.
    Definition twolevelmethod.hh:367
    \n+
    ~TwoLevelMethod()
    Definition twolevelmethod.hh:424
    \n+
    CSP::Operator CoarseOperatorType
    The linear operator of the finel level system. Has to be derived from AssembledLinearOperator.
    Definition twolevelmethod.hh:376
    \n+
    void post(FineDomainType &x)
    Definition twolevelmethod.hh:436
    \n+
    S SmootherType
    The type of the fine level smoother.
    Definition twolevelmethod.hh:388
    \n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n+
    virtual void apply(X &x, X &b, InverseOperatorResult &res)=0
    Apply inverse operator,.
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,353 +1,663 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-bccsmatrixinitializer.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+twolevelmethod.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH\n-6#define DUNE_ISTL_BCCSMATRIX_INITIALIZER_HH\n+5#ifndef DUNE_ISTL_TWOLEVELMETHOD_HH\n+6#define DUNE_ISTL_TWOLEVELMETHOD_HH\n 7\n-8#include \n-9#include \n-10\n-11#include \n-12#include \n-13\n-14#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n-15\n-16namespace _\bD_\bu_\bn_\be\n-17{\n-18 template\n-19 class OverlappingSchwarzInitializer;\n-20}\n-21\n-22namespace Dune::ISTL::Impl\n+8#include \n+9\n+10#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+11#include\"_\ba_\bm_\bg_\b._\bh_\bh\"\n+12#include\"_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\"\n+13#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh>\n+14\n+22namespace _\bD_\bu_\bn_\be\n 23{\n-31 template\n-32 class MatrixRowSubset\n-33 {\n-34 public:\n-36 typedef M Matrix;\n-38 typedef S RowIndexSet;\n-39\n-45 MatrixRowSubset(const Matrix& m, const RowIndexSet& s)\n-46 : m_(m), s_(s)\n-47 {}\n-48\n-49 const Matrix& matrix() const\n-50 {\n-51 return m_;\n-52 }\n-53\n-54 const RowIndexSet& rowIndexSet() const\n-55 {\n-56 return s_;\n-57 }\n-58\n-60 class const_iterator\n-61 : public ForwardIteratorFacade\n-62 {\n-63 public:\n-64 const_iterator(typename Matrix::const_iterator firstRow,\n-65 typename RowIndexSet::const_iterator pos)\n-66 : firstRow_(firstRow), pos_(pos)\n-67 {}\n-68\n-69\n-70 const typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be& dereference() const\n+24namespace Amg\n+25{\n+26\n+36template\n+_\b3_\b7class _\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+38{\n+39public:\n+_\b4_\b4 typedef FO _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be;\n+_\b4_\b8 typedef typename FineOperatorType::range_type _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n+_\b5_\b2 typedef typename FineOperatorType::domain_type _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n+_\b5_\b7 typedef CO _\bC_\bo_\ba_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be;\n+_\b6_\b1 typedef typename CoarseOperatorType::range_type _\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n+_\b6_\b5 typedef typename CoarseOperatorType::domain_type _\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n+_\b7_\b0 std::shared_ptr& _\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br()\n 71 {\n-72 return *(firstRow_+ *pos_);\n+72 return _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n 73 }\n-74 bool equals(const const_iterator& o) const\n-75 {\n-76 return pos_==o.pos_;\n-77 }\n-78 void increment()\n+_\b7_\b8 _\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& _\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bR_\bh_\bs()\n 79 {\n-80 ++pos_;\n+80 return _\br_\bh_\bs_\b_;\n 81 }\n-82 typename RowIndexSet::value_type index() const\n-83 {\n-84 return *pos_;\n-85 }\n-86\n-87 private:\n-89 typename Matrix::const_iterator firstRow_;\n-91 typename RowIndexSet::const_iterator pos_;\n-92 };\n-93\n-95 const_iterator begin() const\n-96 {\n-97 return const_iterator(m_.begin(), s_.begin());\n-98 }\n-100 const_iterator end() const\n-101 {\n-102 return const_iterator(m_.begin(), s_.end());\n-103 }\n-104\n-105 private:\n-107 const Matrix& m_;\n-109 const RowIndexSet& s_;\n-110 };\n-111\n-118 template\n-119 class BCCSMatrixInitializer\n-120 {\n-121 template\n-122 friend class _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br;\n-123 public:\n-124 using Matrix = M;\n-125 using Index = I;\n-126 typedef Dune::ISTL::Impl::BCCSMatrix\n-OutputMatrix;\n-127 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size_type;\n-128\n-131 BCCSMatrixInitializer(OutputMatrix& mat_)\n-132 : _\bm_\ba_\bt(&mat_), cols(mat_.M())\n-133 {\n-134 if constexpr (Dune::IsNumber::value)\n-135 {\n-136 n = m = 1;\n-137 }\n-138 else\n-139 {\n-140 // WARNING: This assumes that all blocks are dense and identical\n-141 n = M::block_type::rows;\n-142 m = M::block_type::cols;\n-143 }\n-144\n-145 _\bm_\ba_\bt->Nnz_=0;\n-146 }\n-147\n-148 BCCSMatrixInitializer()\n-149 : _\bm_\ba_\bt(0), cols(0), n(0), m(0)\n-150 {}\n-151\n-152 virtual ~BCCSMatrixInitializer()\n-153 {}\n-154\n-155 template\n-156 void addRowNnz(const Iter& row) const\n-157 {\n-158 _\bm_\ba_\bt->Nnz_+=row->getsize();\n-159 }\n-160\n-161 template\n-162 void addRowNnz(const Iter& row, const std::set& indices)\n-const\n-163 {\n-164 auto siter =indices.begin();\n-165 for (auto entry=row->begin(); entry!=row->end(); ++entry)\n-166 {\n-167 for(; siter!=indices.end() && *siterNnz_;\n-173 }\n-174 }\n-175\n-176 template\n-177 void addRowNnz(const Iter& row, const std::vector& indices)\n-const\n-178 {\n-179 for (auto entry=row->begin(); entry!=row->end(); ++entry)\n-180 if (indices[entry.index()]!=std::numeric_limits::max())\n-181 ++_\bm_\ba_\bt->Nnz_;\n-182 }\n+82\n+_\b8_\b7 _\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& _\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bL_\bh_\bs()\n+88 {\n+89 return _\bl_\bh_\bs_\b_;\n+90 }\n+_\b1_\b0_\b0 virtual void _\bm_\bo_\bv_\be_\bT_\bo_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl(const _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& fineRhs)=0;\n+_\b1_\b1_\b0 virtual void _\bm_\bo_\bv_\be_\bT_\bo_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl(_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& fineLhs)=0;\n+_\b1_\b1_\b8 virtual void _\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\by_\bs_\bt_\be_\bm(const _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be&\n+fineOperator)=0;\n+119\n+_\b1_\b2_\b1 virtual _\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by* _\bc_\bl_\bo_\bn_\be() const =0;\n+122\n+_\b1_\b2_\b4 virtual _\b~_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by(){}\n+125\n+126 protected:\n+_\b1_\b2_\b8 _\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be _\br_\bh_\bs_\b_;\n+_\b1_\b3_\b0 _\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be _\bl_\bh_\bs_\b_;\n+_\b1_\b3_\b2 std::shared_ptr _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n+133};\n+134\n+140template\n+_\b1_\b4_\b1class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+142 : public _\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+143{\n+144 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be_\b>\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp;\n+145public:\n+_\b1_\b4_\b6 typedef _\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b<_\bO_\b,_\bO_\b> _\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be;\n+_\b1_\b4_\b7 typedef C _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn;\n+_\b1_\b4_\b8 typedef _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n+149\n+_\b1_\b5_\b0 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by(const _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn& crit)\n+151 : criterion_(crit)\n+152 {}\n+153\n+_\b1_\b5_\b4 void _\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\by_\bs_\bt_\be_\bm(const O& fineOperator)\n+155 {\n+156 prolongDamp_ = criterion_.getProlongationDampingFactor();\n+157 _\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b<_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b> productBuilder;\n+158 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bO_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b>\n+_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh;\n+159 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh,_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,\n+160 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs,Dune::IdentityMap,Dune::IdentityMap>\n+_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh;\n+161 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh mg(fineOperator.getmat());\n+162 _\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh pg(mg,Dune::IdentityMap(),Dune::IdentityMap());\n+163 typedef NegateSet OverlapFlags;\n+164\n+165 aggregatesMap_ = std::make_shared(pg._\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx()+1);\n+166\n+167 int noAggregates, isoAggregates, oneAggregates, skippedAggregates;\n+168\n+169 std::tie(noAggregates, isoAggregates, oneAggregates, skippedAggregates) =\n+170 aggregatesMap_->buildAggregates(fineOperator.getmat(), pg, criterion_,\n+true);\n+171 std::cout<<\"no aggregates=\"<\n+renumberer;\n+174 typedef std::vector::iterator Iterator;\n+175 typedef Dune::IteratorPropertyMap VisitedMap;\n+176 std::vector excluded(fineOperator.getmat().N(), false);\n+177 VisitedMap vm(excluded.begin(), Dune::IdentityMap());\n+178 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn pinfo;\n+179 std::size_t aggregates = renumberer.coarsen(pinfo, pg, vm,\n+180 *aggregatesMap_, pinfo,\n+181 noAggregates);\n+182 std::vector& visited=excluded;\n 183\n-184 void allocate()\n-185 {\n-186 allocateMatrixStorage();\n-187 allocateMarker();\n-188 }\n-189\n-190 template\n-191 void _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs([[maybe_unused]] const Iter& row, const CIter& _\bc_\bo_\bl) const\n-192 {\n-193 _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(_\bc_\bo_\bl.index());\n-194 }\n-195\n-196 void _\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs(size_type colindex) const\n-197 {\n-198 for(size_type i=0; i < m; ++i)\n-199 {\n-200 assert(colindex*m+icolstart[0]=0;\n-208 for(size_type i=0; i < cols; ++i) {\n-209 assert(icolstart[i+1]=_\bm_\ba_\bt->colstart[i]+marker[i];\n-211 marker[i]=_\bm_\ba_\bt->colstart[i];\n+184 typedef std::vector::iterator Iterator;\n+185\n+186 for(Iterator iter= visited.begin(), end=visited.end();\n+187 iter != end; ++iter)\n+188 *iter=false;\n+189 matrix_.reset(productBuilder._\bb_\bu_\bi_\bl_\bd(mg, vm,\n+190 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(),\n+191 *aggregatesMap_,\n+192 aggregates,\n+193 OverlapFlags()));\n+194 productBuilder._\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be(fineOperator.getmat(), *aggregatesMap_, *matrix_,\n+pinfo, OverlapFlags());\n+195 this->_\bl_\bh_\bs_\b_.resize(this->matrix_->M());\n+196 this->_\br_\bh_\bs_\b_.resize(this->matrix_->N());\n+197 this->_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b_ = std::make_shared(*matrix_);\n+198 }\n+199\n+_\b2_\b0_\b0 void _\bm_\bo_\bv_\be_\bT_\bo_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl(const typename _\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b:_\b:_\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& fineRhs)\n+201 {\n+202 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b:_\b:\n+_\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>\n+203_\b _\b:_\b:_\br_\be_\bs_\bt_\br_\bi_\bc_\bt_\bV_\be_\bc_\bt_\bo_\br(*aggregatesMap_, this->_\br_\bh_\bs_\b_, fineRhs, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+());\n+204 this->_\bl_\bh_\bs_\b_=0;\n+205 }\n+206\n+_\b2_\b0_\b7 void _\bm_\bo_\bv_\be_\bT_\bo_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl(typename _\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b:_\b:_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& fineLhs)\n+208 {\n+209 _\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\b<_\bs_\bt_\bd_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\b,_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b:_\b:\n+_\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be_\b,_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>\n+210_\b _\b:_\b:_\bp_\br_\bo_\bl_\bo_\bn_\bg_\ba_\bt_\be_\bV_\be_\bc_\bt_\bo_\br(*aggregatesMap_, this->_\bl_\bh_\bs_\b_, fineLhs,\n+211 prolongDamp_, _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n 212 }\n-213 }\n-214\n-215 template\n-216 void copyValue(const Iter& row, const CIter& _\bc_\bo_\bl) const\n-217 {\n-218 copyValue(_\bc_\bo_\bl, row.index(), _\bc_\bo_\bl.index());\n-219 }\n-220\n-221 template\n-222 void copyValue(const CIter& _\bc_\bo_\bl, size_type rowindex, size_type colindex)\n-const\n-223 {\n-224 for(size_type i=0; icolstart[colindex*m+j+1]);\n-227 assert((size_type)marker[colindex*m+j]<_\bm_\ba_\bt->Nnz_);\n-228 _\bm_\ba_\bt->rowindex[marker[colindex*m+j]]=rowindex*n+i;\n-229 _\bm_\ba_\bt->values[marker[colindex*m+j]] = Dune::Impl::asMatrix(*_\bc_\bo_\bl)[i][j];\n-230 ++marker[colindex*m+j]; // index for next entry in column\n-231 }\n-232 }\n-233 }\n-234\n-235 virtual void createMatrix() const\n-236 {\n-237 marker.clear();\n-238 }\n-239\n-240 protected:\n-241\n-242 void allocateMatrixStorage() const\n-243 {\n-244 _\bm_\ba_\bt->Nnz_*=n*m;\n-245 // initialize data\n-246 _\bm_\ba_\bt->values=new typename M::field_type[_\bm_\ba_\bt->Nnz_];\n-247 _\bm_\ba_\bt->rowindex=new I[_\bm_\ba_\bt->Nnz_];\n-248 _\bm_\ba_\bt->colstart=new I[cols+1];\n-249 }\n-250\n-251 void allocateMarker()\n-252 {\n-253 marker.resize(cols);\n-254 std::fill(marker.begin(), marker.end(), 0);\n-255 }\n-256\n-257 OutputMatrix* _\bm_\ba_\bt;\n-258 size_type cols;\n-259\n-260 // Number of rows/columns of the matrix entries\n-261 // (assumed to be scalars or dense matrices)\n-262 size_type n, m;\n-263\n-264 mutable std::vector marker;\n-265 };\n-266\n-267 template\n-268 void copyToBCCSMatrix(F& initializer, const Matrix& matrix)\n+213\n+_\b2_\b1_\b4 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by* _\bc_\bl_\bo_\bn_\be() const\n+215 {\n+216 return new _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by(*this);\n+217 }\n+218\n+219private:\n+220 typename O::matrix_type::field_type prolongDamp_;\n+221 std::shared_ptr aggregatesMap_;\n+222 _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn criterion_;\n+223 std::shared_ptr matrix_;\n+224};\n+225\n+232template\n+_\b2_\b3_\b3class _\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+234{\n+235public:\n+_\b2_\b3_\b7 typedef O _\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n+_\b2_\b3_\b9 typedef typename O::range_type _\bX;\n+_\b2_\b4_\b1 typedef C _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn;\n+_\b2_\b4_\b3 typedef S _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n+_\b2_\b4_\b5 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n+_\b2_\b4_\b7 typedef _\bA_\bM_\bG_\b<_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\bX_\b,_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b> _\bA_\bM_\bG_\bT_\by_\bp_\be;\n+_\b2_\b5_\b3 _\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by(const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& args, const _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn& c)\n+254 : smootherArgs_(args), criterion_(c)\n+255 {}\n+_\b2_\b5_\b7 _\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by(const _\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by& other)\n+258 : coarseOperator_(other.coarseOperator_), smootherArgs_\n+(other.smootherArgs_),\n+259 criterion_(other.criterion_)\n+260 {}\n+261private:\n+268 struct AMGInverseOperator : public _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n 269 {\n-270 for (auto row=matrix.begin(); row!= matrix.end(); ++row)\n-271 initializer.addRowNnz(row);\n-272\n-273 initializer.allocate();\n-274\n-275 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {\n-276\n-277 for (auto _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl)\n-278 initializer.countEntries(row, _\bc_\bo_\bl);\n-279 }\n-280\n-281 initializer.calcColstart();\n-282\n-283 for (auto row=matrix.begin(); row!= matrix.end(); ++row) {\n-284 for (auto _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl) {\n-285 initializer.copyValue(row, _\bc_\bo_\bl);\n-286 }\n-287\n-288 }\n-289 initializer.createMatrix();\n+270 AMGInverseOperator(const typename _\bA_\bM_\bG_\bT_\by_\bp_\be_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br& op,\n+271 const _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn& crit,\n+272 const typename _\bA_\bM_\bG_\bT_\by_\bp_\be_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& args)\n+273 : amg_(op, crit,args), first_(true)\n+274 {}\n+275\n+276 void apply(_\bX& x, _\bX& b, [[maybe_unused]] double reduction, [[maybe_unused]]\n+_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt& res)\n+277 {\n+278 if(first_)\n+279 {\n+280 amg_.pre(x,b);\n+281 first_=false;\n+282 x_=x;\n+283 }\n+284 amg_.apply(x,b);\n+285 }\n+286\n+287 void _\ba_\bp_\bp_\bl_\by(_\bX& x, _\bX& b, InverseOperatorResult& res)\n+288 {\n+289 return _\ba_\bp_\bp_\bl_\by(x,b,1e-8,res);\n 290 }\n 291\n-292 template\n-293 void copyToBCCSMatrix(F& initializer, const MatrixRowSubset& mrs)\n+293 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category() const\n 294 {\n-295 typedef MatrixRowSubset MRS;\n-296 typedef typename MRS::RowIndexSet SIS;\n-297 typedef typename SIS::const_iterator SIter;\n-298 typedef typename MRS::const_iterator Iter;\n-299 typedef typename std::iterator_traits::value_type row_type;\n-300 typedef typename row_type::const_iterator CIter;\n-301\n-302 typedef typename MRS::Matrix::size_type size_type;\n-303\n-304 // A vector containing the corresponding indices in\n-305 // the to create submatrix.\n-306 // If an entry is the maximum of size_type then this index will not appear\n-in\n-307 // the submatrix.\n-308 std::vector subMatrixIndex(mrs.matrix().N(),\n-309 std::numeric_limits::max());\n-310 size_type s=0;\n-311 for(SIter index = mrs.rowIndexSet().begin(); index!=mrs.rowIndexSet().end\n-(); ++index)\n-312 subMatrixIndex[*index]=s++;\n-313\n-314 // Calculate upper Bound for nonzeros\n-315 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)\n-316 initializer.addRowNnz(row, subMatrixIndex);\n-317\n-318 initializer.allocate();\n-319\n-320 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)\n-321 for(CIter _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl) {\n-322 if(subMatrixIndex[_\bc_\bo_\bl.index()]!=std::numeric_limits::max())\n-323 // This column is in our subset (use submatrix column index)\n-324 initializer.countEntries(subMatrixIndex[_\bc_\bo_\bl.index()]);\n-325 }\n-326\n-327 initializer.calcColstart();\n-328\n-329 for(Iter row=mrs.begin(); row!= mrs.end(); ++row)\n-330 for(CIter _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl != row->end(); ++_\bc_\bo_\bl) {\n-331 if(subMatrixIndex[_\bc_\bo_\bl.index()]!=std::numeric_limits::max())\n-332 // This value is in our submatrix -> copy (use submatrix indices\n-333 initializer.copyValue(_\bc_\bo_\bl, subMatrixIndex[row.index()], subMatrixIndex\n-[_\bc_\bo_\bl.index()]);\n+295 return amg_.category();\n+296 }\n+297\n+298 ~AMGInverseOperator()\n+299 {\n+300 if(!first_)\n+301 amg_.post(x_);\n+302 }\n+303 AMGInverseOperator(const AMGInverseOperator& other)\n+304 : x_(other.x_), amg_(other.amg_), first_(other.first_)\n+305 {\n+306 }\n+307 private:\n+308 _\bX x_;\n+309 _\bA_\bM_\bG_\bT_\by_\bp_\be amg_;\n+310 bool first_;\n+311 };\n+312\n+313public:\n+_\b3_\b1_\b5 typedef AMGInverseOperator _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br;\n+316\n+324 template\n+_\b3_\b2_\b5 _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br* _\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br(P& transferPolicy)\n+326 {\n+327 coarseOperator_=transferPolicy.getCoarseLevelOperator();\n+328 AMGInverseOperator* inv = new AMGInverseOperator(*coarseOperator_,\n+329 criterion_,\n+330 smootherArgs_);\n+331\n+332 return inv; //std::shared_ptr >(inv);\n+333\n 334 }\n-335 initializer.createMatrix();\n-336 }\n-337\n-338}\n-339#endif\n-_\bb_\bc_\bc_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n-_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bE_\bn_\bt_\br_\bi_\be_\bs\n-std::size_t countEntries(const BlockVector< T, A > &vector)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1076\n+335\n+336private:\n+338 std::shared_ptr coarseOperator_;\n+340 _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs smootherArgs_;\n+342 _\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn criterion_;\n+343};\n+344\n+350template\n+_\b3_\b5_\b1class _\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd :\n+352 public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+353{\n+354public:\n+_\b3_\b5_\b6 typedef CSP _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by;\n+_\b3_\b5_\b8 typedef typename CoarseLevelSolverPolicy::CoarseLevelSolver\n+_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br;\n+_\b3_\b6_\b3 typedef FO _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be;\n+_\b3_\b6_\b7 typedef typename FineOperatorType::range_type _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n+_\b3_\b7_\b1 typedef typename FineOperatorType::domain_type _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n+_\b3_\b7_\b6 typedef typename CSP::Operator _\bC_\bo_\ba_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be;\n+_\b3_\b8_\b0 typedef typename CoarseOperatorType::range_type _\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be;\n+_\b3_\b8_\b4 typedef typename CoarseOperatorType::domain_type _\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be;\n+_\b3_\b8_\b8 typedef S _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be;\n+389\n+_\b4_\b0_\b4 _\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd(const _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be& op,\n+405 std::shared_ptr smoother,\n+406 const _\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by<_\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be,\n+407 _\bC_\bo_\ba_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be>& policy,\n+408 _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by& coarsePolicy,\n+409 std::size_t preSteps=1, std::size_t postSteps=1)\n+410 : operator_(&op), smoother_(smoother),\n+411 preSteps_(preSteps), postSteps_(postSteps)\n+412 {\n+413 policy_ = policy._\bc_\bl_\bo_\bn_\be();\n+414 policy_->_\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\by_\bs_\bt_\be_\bm(*operator_);\n+415 coarseSolver_=coarsePolicy.createCoarseLevelSolver(*policy_);\n+416 }\n+417\n+_\b4_\b1_\b8 _\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd(const _\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd& other)\n+419 : operator_(other.operator_), coarseSolver_(new _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n+(*other.coarseSolver_)),\n+420 smoother_(other.smoother_), policy_(other.policy_->clone()),\n+421 preSteps_(other.preSteps_), postSteps_(other.postSteps_)\n+422 {}\n+423\n+_\b4_\b2_\b4 _\b~_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd()\n+425 {\n+426 // Each instance has its own policy.\n+427 delete policy_;\n+428 delete coarseSolver_;\n+429 }\n+430\n+_\b4_\b3_\b1 void _\bp_\br_\be(_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& x, _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& b)\n+432 {\n+433 smoother_->pre(x,b);\n+434 }\n+435\n+_\b4_\b3_\b6 void _\bp_\bo_\bs_\bt([[maybe_unused]] _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& x)\n+437 {}\n+438\n+_\b4_\b3_\b9 void _\ba_\bp_\bp_\bl_\by(_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be& v, const _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be& d)\n+440 {\n+441 _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be u(v);\n+442 _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be rhs(d);\n+443 LevelContext context;\n+444 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn info;\n+445 context.pinfo=&info;\n+446 context.lhs=&u;\n+447 context.update=&v;\n+448 context.smoother=smoother_;\n+449 context.rhs=&rhs;\n+450 context.matrix=operator_;\n+451 // Presmoothing\n+452 _\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh(context, preSteps_);\n+453 //Coarse grid correction\n+454 policy_->_\bm_\bo_\bv_\be_\bT_\bo_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl(*context.rhs);\n+455 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt res;\n+456 coarseSolver_->apply(policy_->_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bL_\bh_\bs(), policy_-\n+>_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bR_\bh_\bs(), res);\n+457 *context.lhs=0;\n+458 policy_->_\bm_\bo_\bv_\be_\bT_\bo_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl(*context.lhs);\n+459 *context.update += *context.lhs;\n+460 // Postsmoothing\n+461 _\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh(context, postSteps_);\n+462\n+463 }\n+464\n+_\b4_\b6_\b6 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+467 {\n+468 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+469 }\n+470\n+471private:\n+475 struct LevelContext\n+476 {\n+478 typedef S SmootherType;\n+480 std::shared_ptr smoother;\n+482 _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be* lhs;\n+483 /*\n+484 * @brief The right hand side holding the current residual.\n+485 *\n+486 * This is passed to the smoother as the right hand side.\n+487 */\n+488 _\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be* rhs;\n+494 _\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be* update;\n+496 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn* pinfo;\n+502 const _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be* matrix;\n+503 };\n+504 const _\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be* operator_;\n+506 _\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br* coarseSolver_;\n+508 std::shared_ptr smoother_;\n+510 LevelTransferPolicy* policy_;\n+512 std::size_t preSteps_;\n+514 std::size_t postSteps_;\n+515};\n+516}// end namespace Amg\n+517}// end namespace Dune\n+518\n+520#endif\n+_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n+Define general, extensible interface for operators. The available\n+implementation wraps a matrix.\n+_\bs_\bo_\bl_\bv_\be_\br_\b._\bh_\bh\n+Define general, extensible interface for inverse operators.\n+_\bg_\ba_\bl_\be_\br_\bk_\bi_\bn_\b._\bh_\bh\n+Provides a class for building the galerkin product based on a aggregation\n+scheme.\n+_\ba_\bm_\bg_\b._\bh_\bh\n+The AMG preconditioner.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bb_\bu_\bi_\bl_\bd\n+G::MutableMatrix * build(G &fineGraph, V &visitedMap, const ParallelInformation\n+&pinfo, AggregatesMap< typename G::VertexDescriptor > &aggregates, const\n+typename G::Matrix::size_type &size, const Set ©)\n+Calculates the coarse matrix via a Galerkin product.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:563\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b<_\b _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bX_\b,_\b _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b _\b>_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+SmootherTraits< Smoother >::Arguments SmootherArgs\n+The argument type for the construction of the smoother.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b<_\b _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b,_\b _\bX_\b,_\b _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b _\b>_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Operator Operator\n+The matrix operator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh\n+void presmooth(LevelContext &levelContext, size_t steps)\n+Apply pre smoothing on the current level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:406\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh\n+void postsmooth(LevelContext &levelContext, size_t steps)\n+Apply post smoothing on the current level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:428\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bB_\ba_\bs_\be_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt_\b:_\b:_\bc_\ba_\bl_\bc_\bu_\bl_\ba_\bt_\be\n+void calculate(const M &fine, const AggregatesMap< V > &aggregates, M &coarse,\n+const I &pinfo, const O ©)\n+Calculate the galerkin product.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bI_\bn_\bi_\bt_\bi_\ba_\bl_\bi_\bz_\be_\br\n-Initializer for SuperLU Matrices representing the subdomains.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-Type for indices and sizes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:577\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n-MatrixImp::DenseMatrixBase< T, A >::window_type row_type\n-The type implementing a matrix row.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:574\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+Class providing information about the mapping of the vertices onto aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG\n+Parallel algebraic multigrid based on agglomeration.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bE_\bd_\bg_\be_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+Class representing the properties of an edge in the matrix graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:39\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs\n+Class representing a node in the matrix graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bG_\ba_\bl_\be_\br_\bk_\bi_\bn_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn galerkin.hh:118\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+The (undirected) graph of a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh\n+Attaches properties to the edges and vertices of a graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:978\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bm_\ba_\bx_\bV_\be_\br_\bt_\be_\bx\n+VertexDescriptor maxVertex() const\n+Get the maximal vertex descriptor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+The default class for the smoother arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\br_\ba_\bn_\bs_\bf_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn transfer.hh:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+Abstract base class for transfer between levels and creation of the coarse\n+level system.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be\n+CO CoarseOperatorType\n+The linear operator of the finel level system. Has to be derived from\n+AssembledLinearOperator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bm_\bo_\bv_\be_\bT_\bo_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl\n+virtual void moveToCoarseLevel(const FineRangeType &fineRhs)=0\n+Transfers the data to the coarse level.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n+FineOperatorType::range_type FineRangeType\n+The type of the range of the fine level operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\by_\bs_\bt_\be_\bm\n+virtual void createCoarseLevelSystem(const FineOperatorType &fineOperator)=0\n+Algebraically creates the coarse level system.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n+CoarseOperatorType::range_type CoarseRangeType\n+The type of the range of the coarse level operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\b~_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+virtual ~LevelTransferPolicy()\n+Destructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:124\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bl_\bh_\bs_\b_\n+CoarseDomainType lhs_\n+The coarse level lhs.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:130\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bc_\bl_\bo_\bn_\be\n+virtual LevelTransferPolicy * clone() const =0\n+Clone the current object.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bL_\bh_\bs\n+CoarseDomainType & getCoarseLevelLhs()\n+Get the coarse level left hand side.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b_\n+std::shared_ptr< CoarseOperatorType > operator_\n+the coarse level linear operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\br_\bh_\bs_\b_\n+CoarseRangeType rhs_\n+The coarse level rhs.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bm_\bo_\bv_\be_\bT_\bo_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl\n+virtual void moveToFineLevel(FineDomainType &fineLhs)=0\n+Updates the fine level linear system after the correction of the coarse levels\n+system.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+std::shared_ptr< CoarseOperatorType > & getCoarseLevelOperator()\n+Get the coarse level operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bg_\be_\bt_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bR_\bh_\bs\n+CoarseRangeType & getCoarseLevelRhs()\n+Get the coarse level right hand side.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:78\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be\n+FO FineOperatorType\n+The linear operator of the finel level system. Has to be derived from\n+AssembledLinearOperator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:44\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n+CoarseOperatorType::domain_type CoarseDomainType\n+The type of the domain of the coarse level operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n+FineOperatorType::domain_type FineDomainType\n+The type of the domain of the fine level operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+A LeveTransferPolicy that used aggregation to construct the coarse level\n+system.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:143\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+C Criterion\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:147\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+AggregationLevelTransferPolicy(const Criterion &crit)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:150\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bc_\bl_\bo_\bn_\be\n+AggregationLevelTransferPolicy * clone() const\n+Clone the current object.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:214\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bm_\bo_\bv_\be_\bT_\bo_\bF_\bi_\bn_\be_\bL_\be_\bv_\be_\bl\n+void moveToFineLevel(typename FatherType::FineDomainType &fineLhs)\n+Updates the fine level linear system after the correction of the coarse levels\n+system.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:207\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bm_\bo_\bv_\be_\bT_\bo_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl\n+void moveToCoarseLevel(const typename FatherType::FineRangeType &fineRhs)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:200\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+SequentialInformation ParallelInformation\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:148\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bF_\ba_\bt_\bh_\be_\br_\bT_\by_\bp_\be\n+LevelTransferPolicy< O, O > FatherType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:146\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bL_\be_\bv_\be_\bl_\bT_\br_\ba_\bn_\bs_\bf_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\by_\bs_\bt_\be_\bm\n+void createCoarseLevelSystem(const O &fineOperator)\n+Algebraically creates the coarse level system.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:154\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+A policy class for solving the coarse level system using one step of AMG.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:234\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+OneStepAMGCoarseSolverPolicy(const SmootherArgs &args, const Criterion &c)\n+Constructs the coarse solver policy.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:253\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n+AMGInverseOperator CoarseLevelSolver\n+The type of solver constructed for the coarse level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:315\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+OneStepAMGCoarseSolverPolicy(const OneStepAMGCoarseSolverPolicy &other)\n+Copy constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:257\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bX\n+O::range_type X\n+The type of the range and domain of the operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:239\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+C Criterion\n+The type of the crition used for the aggregation within AMG.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:241\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+Dune::Amg::SmootherTraits< S >::Arguments SmootherArgs\n+The type of the arguments used for constructing the smoother.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:245\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+O Operator\n+The type of the linear operator used.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:237\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bA_\bM_\bG_\bT_\by_\bp_\be\n+AMG< Operator, X, Smoother > AMGType\n+The type of the AMG construct on the coarse level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:247\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n+CoarseLevelSolver * createCoarseLevelSolver(P &transferPolicy)\n+Constructs a coarse level solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:325\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bO_\bn_\be_\bS_\bt_\be_\bp_\bA_\bM_\bG_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n+S Smoother\n+The type of the smoother used in AMG.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:243\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:353\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n+CoarseOperatorType::range_type CoarseRangeType\n+The type of the range of the coarse level operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:380\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bF_\bi_\bn_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n+FineOperatorType::domain_type FineDomainType\n+The type of the domain of the fine level operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:371\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd\n+TwoLevelMethod(const TwoLevelMethod &other)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:418\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bp_\br_\be\n+void pre(FineDomainType &x, FineRangeType &b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:431\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bF_\bi_\bn_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be\n+FO FineOperatorType\n+The linear operator of the finel level system. Has to be derived from\n+AssembledLinearOperator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:363\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br\n+CoarseLevelSolverPolicy::CoarseLevelSolver CoarseLevelSolver\n+The type of the coarse level solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:358\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(FineDomainType &v, const FineRangeType &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:439\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bL_\be_\bv_\be_\bl_\bS_\bo_\bl_\bv_\be_\br_\bP_\bo_\bl_\bi_\bc_\by\n+CSP CoarseLevelSolverPolicy\n+The type of the policy for constructing the coarse level solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:356\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bD_\bo_\bm_\ba_\bi_\bn_\bT_\by_\bp_\be\n+CoarseOperatorType::domain_type CoarseDomainType\n+The type of the domain of the coarse level operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:384\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd\n+TwoLevelMethod(const FineOperatorType &op, std::shared_ptr< SmootherType >\n+smoother, const LevelTransferPolicy< FineOperatorType, CoarseOperatorType >\n+&policy, CoarseLevelSolverPolicy &coarsePolicy, std::size_t preSteps=1, std::\n+size_t postSteps=1)\n+Constructs a two level method.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:404\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bF_\bi_\bn_\be_\bR_\ba_\bn_\bg_\be_\bT_\by_\bp_\be\n+FineOperatorType::range_type FineRangeType\n+The type of the range of the fine level operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:367\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\b~_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd\n+~TwoLevelMethod()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:424\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bT_\by_\bp_\be\n+CSP::Operator CoarseOperatorType\n+The linear operator of the finel level system. Has to be derived from\n+AssembledLinearOperator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:376\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bp_\bo_\bs_\bt\n+void post(FineDomainType &x)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:436\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bT_\bw_\bo_\bL_\be_\bv_\be_\bl_\bM_\be_\bt_\bh_\bo_\bd_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be\n+S SmootherType\n+The type of the fine level smoother.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn twolevelmethod.hh:388\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Abstract base class for all solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b _\bX_\b,_\b _\bX_\b _\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(X &x, X &b, InverseOperatorResult &res)=0\n+Apply inverse operator,.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00206.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00206.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: vbvector.hh File Reference\n+dune-istl: smoother.hh File Reference\n \n \n \n \n \n \n \n@@ -65,59 +65,126 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n \n-
    vbvector.hh File Reference
    \n+Namespaces |\n+Functions
    \n+ \n \n
    \n \n-

    ??? \n+

    Classes for the generic construction and application of the smoothers. \n More...

    \n-
    #include <cmath>
    \n-#include <complex>
    \n-#include <iostream>
    \n-#include <iterator>
    \n-#include <memory>
    \n+
    #include <dune/istl/paamg/construction.hh>
    \n+#include <dune/istl/paamg/aggregates.hh>
    \n+#include <dune/istl/preconditioners.hh>
    \n+#include <dune/istl/schwarz.hh>
    \n+#include <dune/istl/novlpschwarz.hh>
    \n+#include <dune/common/propertymap.hh>
    \n #include <dune/common/ftraits.hh>
    \n-#include <dune/common/indexediterator.hh>
    \n-#include <dune/common/iteratorfacades.hh>
    \n-#include "istlexception.hh"
    \n-#include "bvector.hh"
    \n-#include <dune/istl/blocklevel.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::VariableBlockVector< B, A >
     A Vector of blocks with different blocksizes. More...
    struct  Dune::Amg::DefaultSmootherArgs< T >
     The default class for the smoother arguments. More...
     
    class  Dune::VariableBlockVector< B, A >::CreateIterator
     Iterator class for sequential creation of blocks. More...
    struct  Dune::Amg::SmootherTraits< T >
     Traits class for getting the attribute class of a smoother. More...
     
    struct  Dune::FieldTraits< VariableBlockVector< B, A > >
    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 > >
     
    \n \n \n \n+\n+\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+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.
     
    \n

    Detailed Description

    \n-

    ???

    \n+

    Classes for the generic construction and application of the smoothers.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,37 +1,111 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-vbvector.hh File Reference\n-??? _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+smoother.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Classes for the generic construction and application of the smoothers. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n+#include \n #include \n-#include \n-#include \n-#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n-\u00a0 A Vector of blocks with different blocksizes. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\b _\bT_\b _\b>\n+\u00a0 The default class for the smoother arguments. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-\u00a0 Iterator class for sequential creation of blocks. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bT_\b _\b>\n+\u00a0 Traits class for getting the attribute class of a smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bT_\b _\b>\n+\u00a0 Construction Arguments for the default smoothers. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bT_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bT_\b,_\b _\bC_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>\n+\u00a0 Policy for the construction of the _\bS_\be_\bq_\bS_\bS_\bO_\bR smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>\n+\u00a0 Policy for the construction of the _\bS_\be_\bq_\bS_\bO_\bR smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bJ_\ba_\bc_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>\n+\u00a0 Policy for the construction of the _\bS_\be_\bq_\bJ_\ba_\bc smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n+\u00a0 Policy for the construction of the _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n+\u00a0 Policy for the construction of the _\bS_\be_\bq_\bI_\bL_\bU smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bP_\ba_\br_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>\n+\u00a0 Policy for the construction of the _\bP_\ba_\br_\bS_\bS_\bO_\bR smoother. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bT\n+ _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bT_\b _\b>\n+\u00a0 Helper class for applying the smoothers. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,\n+ _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,\n+ _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n+ _\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\b _\bT_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>\n+ _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA\n+ _\b>_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh (LevelContext &levelContext, size_t steps)\n+\u00a0 Apply pre smoothing on the current level.\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh (LevelContext &levelContext, size_t steps)\n+\u00a0 Apply post smoothing on the current level.\n+\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-???\n+Classes for the generic construction and application of the smoothers.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00206_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00206_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: vbvector.hh Source File\n+dune-istl: smoother.hh Source File\n \n \n \n \n \n \n \n@@ -70,611 +70,1130 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    vbvector.hh
    \n+
    smoother.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_VBVECTOR_HH
    \n-
    6#define DUNE_ISTL_VBVECTOR_HH
    \n+
    5#ifndef DUNE_AMGSMOOTHER_HH
    \n+
    6#define DUNE_AMGSMOOTHER_HH
    \n
    7
    \n-
    8#include <cmath>
    \n-
    9#include <complex>
    \n-
    10#include <iostream>
    \n-
    11#include <iterator>
    \n-
    12#include <memory>
    \n-
    13
    \n+\n+\n+\n+
    11#include <dune/istl/schwarz.hh>
    \n+\n+
    13#include <dune/common/propertymap.hh>
    \n
    14#include <dune/common/ftraits.hh>
    \n-
    15#include <dune/common/indexediterator.hh>
    \n-
    16#include <dune/common/iteratorfacades.hh>
    \n-
    17#include "istlexception.hh"
    \n-
    18#include "bvector.hh"
    \n-
    19
    \n-\n-
    21
    \n-
    26namespace Dune {
    \n-
    27
    \n-
    43 template<class B, class A=std::allocator<B> >
    \n-
    \n-
    44 class VariableBlockVector : public Imp::block_vector_unmanaged<B,typename A::size_type>
    \n-
    45 // this derivation gives us all the blas level 1 and norms
    \n-
    46 // on the large array. However, access operators have to be
    \n-
    47 // overwritten.
    \n-
    48 {
    \n-
    49 using Base = Imp::block_vector_unmanaged<B,typename A::size_type>;
    \n-
    50
    \n-
    51 // just a shorthand
    \n-
    52 using window_type = Imp::BlockVectorWindow<B,A>;
    \n-
    53
    \n-
    54 // data-structure holding the windows (but not the actual data)
    \n-
    55 using VectorWindows = std::vector<window_type, typename std::allocator_traits<A>::template rebind_alloc<window_type>>;
    \n-
    56
    \n-
    57 // block type bool is not supported since std::vector<bool> is used for storage
    \n-
    58 static_assert(not std::is_same_v<B,bool>, "Block type 'bool' not supported by VariableBlockVector.");
    \n-
    59
    \n-
    60 public:
    \n-
    61
    \n-
    62 //===== type definitions and constants
    \n-
    63
    \n-
    65 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n-
    66
    \n-
    68 using allocator_type = A;
    \n-
    69
    \n-
    74 using reference = window_type&;
    \n+
    15
    \n+
    16namespace Dune
    \n+
    17{
    \n+
    18 namespace Amg
    \n+
    19 {
    \n+
    20
    \n+
    36 template<class T>
    \n+
    \n+\n+
    38 {
    \n+
    42 typedef typename FieldTraits<T>::real_type RelaxationFactor;
    \n+
    43
    \n+\n+\n+
    52
    \n+
    \n+\n+\n+
    58 {}
    \n+
    \n+
    59 };
    \n+
    \n+
    60
    \n+
    64 template<class T>
    \n+\n+
    70
    \n+
    71 template<class X, class Y>
    \n+
    \n+\n+
    73 {
    \n+\n
    75
    \n-
    80 using const_reference = const window_type&;
    \n-
    81
    \n-
    83 using size_type = typename A::size_type;
    \n-
    84
    \n-\n-
    91
    \n-\n+
    76 };
    \n+
    \n+
    77
    \n+
    78 template<class X, class Y, class C, class T>
    \n+
    \n+\n+
    80 : public SmootherTraits<T>
    \n+
    81 {};
    \n+
    \n+
    82
    \n+
    83 template<class C, class T>
    \n+
    \n+\n+
    85 : public SmootherTraits<T>
    \n+
    86 {};
    \n+
    \n+
    87
    \n+
    91 template<class T>
    \n+
    \n+\n+
    93 {
    \n+
    94 typedef typename T::matrix_type Matrix;
    \n
    95
    \n-
    96 //===== constructors and such
    \n+\n
    97
    \n-
    \n-\n-
    103 Base()
    \n-
    104 {}
    \n-
    \n-
    105
    \n-
    \n-
    112 explicit VariableBlockVector (size_type numBlocks) :
    \n-
    113 Base(),
    \n-
    114 block(numBlocks)
    \n-
    115 {}
    \n+\n+
    99
    \n+
    100 public:
    \n+
    \n+\n+
    102 {}
    \n+
    \n+
    103
    \n+
    \n+
    104 void setMatrix(const Matrix& matrix)
    \n+
    105 {
    \n+
    106 matrix_=&matrix;
    \n+
    107 }
    \n+
    \n+
    \n+
    108 virtual void setMatrix(const Matrix& matrix, [[maybe_unused]] const AggregatesMap& amap)
    \n+
    109 {
    \n+
    110 setMatrix(matrix);
    \n+
    111 }
    \n+
    \n+
    112
    \n+
    113
    \n+
    \n+
    114 const Matrix& getMatrix() const
    \n+
    115 {
    \n+
    116 return *matrix_;
    \n+
    117 }
    \n+
    \n+
    118
    \n+
    \n+
    119 void setArgs(const SmootherArgs& args)
    \n+
    120 {
    \n+
    121 args_=&args;
    \n+
    122 }
    \n
    \n-
    116
    \n+
    123
    \n+
    124 template<class T1>
    \n
    \n-
    125 VariableBlockVector (size_type numBlocks, size_type blockSize) :
    \n-
    126 Base(),
    \n-
    127 block(numBlocks),
    \n-
    128 storage_(numBlocks*blockSize)
    \n-
    129 {
    \n-
    130 // and we can allocate the big array in the base class
    \n-
    131 syncBaseArray();
    \n-
    132
    \n-
    133 // set the windows into the big array
    \n-
    134 for (size_type i=0; i<numBlocks; ++i)
    \n-
    135 block[i].set(blockSize,this->p+(i*blockSize));
    \n-
    136
    \n-
    137 // and the vector is usable
    \n-
    138 initialized = true;
    \n-
    139 }
    \n-
    \n-
    140
    \n-
    \n-\n-
    143 Base(static_cast<const Base&>(a)),
    \n-
    144 block(a.block),
    \n-
    145 storage_(a.storage_)
    \n-
    146 {
    \n-
    147 syncBaseArray();
    \n-
    148
    \n-
    149 // and we must set the windows
    \n-
    150 if (block.size()>0) {
    \n-
    151 block[0].set(block[0].getsize(),this->p); // first block
    \n-
    152 for (size_type i=1; i<block.size(); ++i) // and the rest
    \n-
    153 block[i].set(block[i].getsize(),block[i-1].getptr()+block[i-1].getsize());
    \n-
    154 }
    \n-
    155
    \n-
    156 // and we have a usable vector
    \n-
    157 initialized = a.initialized;
    \n-
    158 }
    \n-
    \n-
    159
    \n-
    \n-\n-
    162 Base()
    \n-
    163 {
    \n-
    164 tmp.swap(*this);
    \n-
    165 }
    \n-
    \n-
    166
    \n-\n-
    168
    \n-
    169
    \n-
    \n-\n-
    172 {
    \n-
    173 tmp.swap(*this);
    \n-
    174 return *this;
    \n-
    175 }
    \n+
    125 void setComm([[maybe_unused]] T1& comm)
    \n+
    126 {}
    \n
    \n+
    127
    \n+
    \n+\n+
    129 {
    \n+
    130 return comm_;
    \n+
    131 }
    \n+
    \n+
    132
    \n+
    \n+
    133 const SmootherArgs getArgs() const
    \n+
    134 {
    \n+
    135 return *args_;
    \n+
    136 }
    \n+
    \n+
    137
    \n+
    138 protected:
    \n+
    139 const Matrix* matrix_;
    \n+
    140 private:
    \n+
    141 const SmootherArgs* args_;
    \n+\n+
    143 };
    \n+
    \n+
    144
    \n+
    145 template<class T>
    \n+
    \n+\n+
    147 : public DefaultConstructionArgs<T>
    \n+
    148 {};
    \n+
    \n+
    149
    \n+
    150 template<class T, class C=SequentialInformation>
    \n+
    \n+\n+
    152 : public ConstructionArgs<T>
    \n+
    153 {
    \n+
    154 public:
    \n+
    \n+\n+
    156 {}
    \n+
    \n+
    157
    \n+
    \n+
    158 void setComm(const C& comm)
    \n+
    159 {
    \n+
    160 comm_ = &comm;
    \n+
    161 }
    \n+
    \n+
    162
    \n+
    \n+
    163 const C& getComm() const
    \n+
    164 {
    \n+
    165 return *comm_;
    \n+
    166 }
    \n+
    \n+
    167 private:
    \n+
    168 const C* comm_;
    \n+
    169 };
    \n+
    \n+
    170
    \n+
    171
    \n+
    172 template<class X, class Y>
    \n+
    \n+\n+
    174 {
    \n+
    175 typedef Richardson<X,Y> T;
    \n
    176
    \n-
    \n-
    178 void swap (VariableBlockVector& other) noexcept
    \n-
    179 {
    \n-
    180 using std::swap;
    \n-
    181 swap(storage_, other.storage_);
    \n-
    182 swap(block, other.block);
    \n-
    183 swap(initialized, other.initialized);
    \n-
    184
    \n-
    185 other.syncBaseArray();
    \n-
    186 syncBaseArray();
    \n-
    187 }
    \n-
    \n-
    188
    \n-
    \n-
    190 friend void swap (VariableBlockVector& lhs, VariableBlockVector& rhs) noexcept
    \n-
    191 {
    \n-
    192 lhs.swap(rhs);
    \n-
    193 }
    \n+\n+
    178
    \n+
    179 public:
    \n+
    \n+\n+
    181 {}
    \n+
    \n+
    182
    \n+
    183 template <class... Args>
    \n+
    \n+
    184 void setMatrix(const Args&...)
    \n+
    185 {}
    \n+
    \n+
    186
    \n+
    \n+
    187 void setArgs(const SmootherArgs& args)
    \n+
    188 {
    \n+
    189 args_=&args;
    \n+
    190 }
    \n+
    \n+
    191
    \n+
    192 template<class T1>
    \n+
    \n+
    193 void setComm([[maybe_unused]] T1& comm)
    \n+
    194 {}
    \n
    \n-
    194
    \n+
    195
    \n
    \n-
    196 void resize (size_type numBlocks)
    \n-
    197 {
    \n-
    198 storage_.clear();
    \n-
    199
    \n-
    200 syncBaseArray();
    \n-
    201
    \n-
    202 // we can allocate the windows now
    \n-
    203 block.resize(numBlocks);
    \n-
    204
    \n-
    205 // and the vector not fully usable
    \n-
    206 initialized = false;
    \n-
    207 }
    \n-
    \n-
    208
    \n-
    \n-
    210 void resize (size_type numBlocks, size_type blockSize)
    \n-
    211 {
    \n-
    212 // and we can allocate the big array in the base class
    \n-
    213 storage_.resize(numBlocks*blockSize);
    \n-
    214 block.resize(numBlocks);
    \n-
    215 syncBaseArray();
    \n-
    216
    \n-
    217 // set the windows into the big array
    \n-
    218 for (size_type i=0; i<block.size(); ++i)
    \n-
    219 block[i].set(blockSize,this->p+(i*blockSize));
    \n-
    220
    \n-
    221 // and the vector is usable
    \n-
    222 initialized = true;
    \n-
    223 }
    \n-
    \n-
    224
    \n-
    225 //===== assignment from scalar
    \n-
    226
    \n-
    \n-\n-
    229 {
    \n-
    230 (static_cast<Imp::block_vector_unmanaged<B,size_type>&>(*this)) = k;
    \n-
    231 return *this;
    \n-
    232 }
    \n-
    \n-
    233
    \n-
    234
    \n-
    235 //===== the creation interface
    \n-
    236
    \n-
    237 class CreateIterator;
    \n-
    238
    \n-
    239#ifndef DOXYGEN
    \n-
    240
    \n-
    241 // The window_type does not hand out a reference to its size,
    \n-
    242 // so in order to provide a valid iterator, we need a workaround
    \n-
    243 // to make assignment possible. This proxy enables just that by
    \n-
    244 // implicitly converting to the stored size for read access and
    \n-
    245 // tunneling assignment to the accessor method of the window.
    \n-
    246 struct SizeProxy
    \n-
    247 {
    \n-
    248
    \n-
    249 operator size_type () const
    \n-
    250 {
    \n-
    251 return target->getsize();
    \n-
    252 }
    \n-
    253
    \n-
    254 SizeProxy& operator= (size_type size)
    \n-
    255 {
    \n-
    256 target->setsize(size);
    \n-
    257 return *this;
    \n-
    258 }
    \n-
    259
    \n-
    260 private:
    \n-
    261
    \n-
    262 friend class CreateIterator;
    \n-
    263
    \n-
    264 SizeProxy (window_type& t) :
    \n-
    265 target(&t)
    \n-
    266 {}
    \n-
    267
    \n-
    268 window_type* target;
    \n-
    269 };
    \n+\n+
    197 {
    \n+
    198 return comm_;
    \n+
    199 }
    \n+
    \n+
    200
    \n+
    \n+
    201 const SmootherArgs getArgs() const
    \n+
    202 {
    \n+
    203 return *args_;
    \n+
    204 }
    \n+
    \n+
    205
    \n+
    206 private:
    \n+
    207 const SmootherArgs* args_;
    \n+\n+
    209 };
    \n+
    \n+
    210
    \n+
    211
    \n+
    212
    \n+
    213 template<class T>
    \n+
    214 struct ConstructionTraits;
    \n+
    215
    \n+
    219 template<class M, class X, class Y, int l>
    \n+
    \n+
    220 struct ConstructionTraits<SeqSSOR<M,X,Y,l> >
    \n+
    221 {
    \n+\n+
    223
    \n+
    \n+
    224 static inline std::shared_ptr<SeqSSOR<M,X,Y,l>> construct(Arguments& args)
    \n+
    225 {
    \n+
    226 return std::make_shared<SeqSSOR<M,X,Y,l>>
    \n+
    227 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
    \n+
    228 }
    \n+
    \n+
    229 };
    \n+
    \n+
    230
    \n+
    231
    \n+
    235 template<class M, class X, class Y, int l>
    \n+
    \n+
    236 struct ConstructionTraits<SeqSOR<M,X,Y,l> >
    \n+
    237 {
    \n+\n+
    239
    \n+
    \n+
    240 static inline std::shared_ptr<SeqSOR<M,X,Y,l>> construct(Arguments& args)
    \n+
    241 {
    \n+
    242 return std::make_shared<SeqSOR<M,X,Y,l>>
    \n+
    243 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
    \n+
    244 }
    \n+
    \n+
    245 };
    \n+
    \n+
    246
    \n+
    247
    \n+
    251 template<class M, class X, class Y, int l>
    \n+
    \n+
    252 struct ConstructionTraits<SeqJac<M,X,Y,l> >
    \n+
    253 {
    \n+\n+
    255
    \n+
    \n+
    256 static inline std::shared_ptr<SeqJac<M,X,Y,l>> construct(Arguments& args)
    \n+
    257 {
    \n+
    258 return std::make_shared<SeqJac<M,X,Y,l>>
    \n+
    259 (args.getMatrix(), args.getArgs().iterations, args.getArgs().relaxationFactor);
    \n+
    260 }
    \n+
    \n+
    261 };
    \n+
    \n+
    262
    \n+
    266 template<class X, class Y>
    \n+
    \n+
    267 struct ConstructionTraits<Richardson<X,Y> >
    \n+
    268 {
    \n+\n
    270
    \n-
    271#endif // DOXYGEN
    \n-
    272
    \n-
    \n-\n-
    275 {
    \n-
    276 public:
    \n-
    278 using iterator_category = std::output_iterator_tag;
    \n-
    279
    \n-\n-
    282
    \n-
    289 using difference_type = void;
    \n-
    290
    \n-\n-
    293
    \n-
    295 using reference = SizeProxy;
    \n-
    296
    \n-
    \n-
    298 CreateIterator (VariableBlockVector& _v, int _i, bool _isEnd) :
    \n-
    299 v(_v),
    \n-
    300 i(_i),
    \n-
    301 isEnd(_isEnd)
    \n-
    302 {}
    \n-
    \n-
    303
    \n-
    \n-\n-
    305 {
    \n-
    306 // When the iterator gets destructed, we allocate the memory
    \n-
    307 // for the VariableBlockVector if
    \n-
    308 // 1. the current iterator was not created as enditerator
    \n-
    309 // 2. we're at the last block
    \n-
    310 // 3. the vector hasn't been initialized earlier
    \n-
    311 if (not isEnd && i==v.block.size() && not v.initialized)
    \n-
    312 v.allocate();
    \n-
    313 }
    \n-
    \n-
    314
    \n-
    \n-\n-
    317 {
    \n-
    318 // go to next block
    \n-
    319 ++i;
    \n-
    320
    \n-
    321 return *this;
    \n-
    322 }
    \n-
    \n-
    323
    \n-
    \n-\n-
    326 {
    \n-
    327 CreateIterator tmp(*this);
    \n-
    328 this->operator++();
    \n-
    329 return tmp;
    \n-
    330 }
    \n-
    \n-
    331
    \n-
    \n-
    333 bool operator!= (const CreateIterator& it) const
    \n-
    334 {
    \n-
    335 return (i!=it.i) || (&v!=&it.v);
    \n-
    336 }
    \n-
    \n-
    337
    \n+
    \n+
    271 static inline std::shared_ptr<Richardson<X,Y>> construct(Arguments& args)
    \n+
    272 {
    \n+
    273 return std::make_shared<Richardson<X,Y>>
    \n+
    274 (args.getArgs().relaxationFactor);
    \n+
    275 }
    \n+
    \n+
    276 };
    \n+
    \n+
    277
    \n+
    278
    \n+
    279 template<class M, class X, class Y>
    \n+
    \n+\n+
    281 : public DefaultConstructionArgs<SeqILU<M,X,Y> >
    \n+
    282 {
    \n+
    283 public:
    \n+
    \n+\n+
    285 : n_(n)
    \n+
    286 {}
    \n+
    \n+
    287
    \n+
    \n+
    288 void setN(int n)
    \n+
    289 {
    \n+
    290 n_ = n;
    \n+
    291 }
    \n+
    \n+
    292
    \n+
    \n+
    293 int getN()
    \n+
    294 {
    \n+
    295 return n_;
    \n+
    296 }
    \n+
    \n+
    297
    \n+
    298 private:
    \n+
    299 int n_;
    \n+
    300 };
    \n+
    \n+
    301
    \n+
    302
    \n+
    306 template<class M, class X, class Y>
    \n+
    \n+
    307 struct ConstructionTraits<SeqILU<M,X,Y> >
    \n+
    308 {
    \n+\n+
    310
    \n+
    \n+
    311 static inline std::shared_ptr<SeqILU<M,X,Y>> construct(Arguments& args)
    \n+
    312 {
    \n+
    313 return std::make_shared<SeqILU<M,X,Y>>
    \n+
    314 (args.getMatrix(), args.getN(), args.getArgs().relaxationFactor);
    \n+
    315 }
    \n+
    \n+
    316 };
    \n+
    \n+
    317
    \n+
    321 template<class M, class X, class Y, class C>
    \n+
    \n+
    322 struct ConstructionTraits<ParSSOR<M,X,Y,C> >
    \n+
    323 {
    \n+\n+
    325
    \n+
    \n+
    326 static inline std::shared_ptr<ParSSOR<M,X,Y,C>> construct(Arguments& args)
    \n+
    327 {
    \n+
    328 return std::make_shared<ParSSOR<M,X,Y,C>>
    \n+
    329 (args.getMatrix(), args.getArgs().iterations,
    \n+
    330 args.getArgs().relaxationFactor, args.getComm());
    \n+
    331 }
    \n+
    \n+
    332 };
    \n+
    \n+
    333
    \n+
    334 template<class X, class Y, class C, class T>
    \n+
    \n+
    335 struct ConstructionTraits<BlockPreconditioner<X,Y,C,T> >
    \n+
    336 {
    \n+\n+
    338 typedef ConstructionTraits<T> SeqConstructionTraits;
    \n
    \n-
    339 bool operator== (const CreateIterator& it) const
    \n-
    340 {
    \n-
    341 return (i==it.i) && (&v==&it.v);
    \n-
    342 }
    \n-
    \n-
    343
    \n-
    \n-\n-
    346 {
    \n-
    347 return i;
    \n-
    348 }
    \n-
    \n-
    349
    \n+
    339 static inline std::shared_ptr<BlockPreconditioner<X,Y,C,T>> construct(Arguments& args)
    \n+
    340 {
    \n+
    341 auto seqPrec = SeqConstructionTraits::construct(args);
    \n+
    342 return std::make_shared<BlockPreconditioner<X,Y,C,T>> (seqPrec, args.getComm());
    \n+
    343 }
    \n+
    \n+
    344 };
    \n+
    \n+
    345
    \n+
    346 template<class C, class T>
    \n+
    \n+
    347 struct ConstructionTraits<NonoverlappingBlockPreconditioner<C,T> >
    \n+
    348 {
    \n+\n+
    350 typedef ConstructionTraits<T> SeqConstructionTraits;
    \n
    \n-\n+
    351 static inline std::shared_ptr<NonoverlappingBlockPreconditioner<C,T>> construct(Arguments& args)
    \n
    352 {
    \n-
    353 v.block[i].setsize(_k);
    \n-
    354 }
    \n+
    353 auto seqPrec = SeqConstructionTraits::construct(args);
    \n+
    354 return std::make_shared<NonoverlappingBlockPreconditioner<C,T>> (seqPrec, args.getComm());
    \n+
    355 }
    \n+
    \n+
    356 };
    \n+
    \n+
    357
    \n+
    368 template<class T>
    \n+
    \n+\n+
    370 {
    \n+
    371 typedef T Smoother;
    \n+
    372 typedef typename Smoother::range_type Range;
    \n+
    373 typedef typename Smoother::domain_type Domain;
    \n+
    374
    \n+
    \n+
    382 static void preSmooth(Smoother& smoother, Domain& v, const Range& d)
    \n+
    383 {
    \n+
    384 smoother.apply(v,d);
    \n+
    385 }
    \n+
    \n+
    386
    \n+
    \n+
    394 static void postSmooth(Smoother& smoother, Domain& v, const Range& d)
    \n+
    395 {
    \n+
    396 smoother.apply(v,d);
    \n+
    397 }
    \n
    \n-
    355
    \n-
    357#ifdef DOXYGEN
    \n-
    358 size_type&
    \n-
    359#else
    \n-
    360 SizeProxy
    \n-
    361#endif
    \n-
    \n-\n-
    363 {
    \n-
    364 return {v.block[i]};
    \n-
    365 }
    \n-
    \n-
    366
    \n-
    367 private:
    \n-
    368 VariableBlockVector& v; // my vector
    \n-
    369 size_type i; // current block to be defined
    \n-
    370 const bool isEnd; // flag if this object was created as the end iterator.
    \n-
    371 };
    \n-
    \n-
    372
    \n-
    373 // CreateIterator wants to set all the arrays ...
    \n-
    374 friend class CreateIterator;
    \n-
    375
    \n-
    \n-\n-
    378 {
    \n-
    379#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    380 if (initialized) DUNE_THROW(ISTLError,"no CreateIterator in initialized state");
    \n-
    381#endif
    \n-
    382 return CreateIterator(*this, 0, false);
    \n-
    383 }
    \n-
    \n-
    384
    \n-
    \n-\n-
    387 {
    \n-
    388 return CreateIterator(*this, block.size(), true);
    \n-
    389 }
    \n-
    \n-
    390
    \n-
    391
    \n-
    392 //===== access to components
    \n-
    393 // has to be overwritten from base class because it must
    \n-
    394 // return access to the windows
    \n-
    395
    \n-
    \n-
    397 window_type& operator[] (size_type i)
    \n-
    398 {
    \n-
    399#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    400 if (i>=block.size()) DUNE_THROW(ISTLError,"index out of range");
    \n-
    401#endif
    \n-
    402 return block[i];
    \n-
    403 }
    \n+
    398 };
    \n
    \n-
    404
    \n+
    399
    \n+
    405 template<typename LevelContext>
    \n
    \n-
    406 const window_type& operator[] (size_type i) const
    \n-
    407 {
    \n-
    408#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    409 if (i<0 || i>=block.size()) DUNE_THROW(ISTLError,"index out of range");
    \n-
    410#endif
    \n-
    411 return block[i];
    \n-
    412 }
    \n-
    \n-
    413
    \n-
    414 using Iterator = IndexedIterator<typename VectorWindows::iterator>;
    \n+
    406 void presmooth(LevelContext& levelContext, size_t steps)
    \n+
    407 {
    \n+
    408 for(std::size_t i=0; i < steps; ++i) {
    \n+
    409 *levelContext.lhs=0;
    \n+\n+
    411 ::preSmooth(*levelContext.smoother, *levelContext.lhs,
    \n+
    412 *levelContext.rhs);
    \n+
    413 // Accumulate update
    \n+
    414 *levelContext.update += *levelContext.lhs;
    \n
    415
    \n-
    \n-\n-
    418 {
    \n-
    419 return Iterator{block.begin()};
    \n+
    416 // update defect
    \n+
    417 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs, *levelContext.rhs);
    \n+
    418 levelContext.pinfo->project(*levelContext.rhs);
    \n+
    419 }
    \n
    420 }
    \n
    \n
    421
    \n-
    \n-\n-
    424 {
    \n-
    425 return Iterator{block.end()};
    \n-
    426 }
    \n-
    \n-
    427
    \n-
    \n-\n-
    431 {
    \n-
    432 return Iterator{--block.end()};
    \n-
    433 }
    \n-
    \n-
    434
    \n-
    \n-\n-
    438 {
    \n-
    439 return Iterator{--block.begin()};
    \n-
    440 }
    \n-
    \n-
    441
    \n-\n-
    444
    \n-
    446 using ConstIterator = IndexedIterator<typename VectorWindows::const_iterator>;
    \n-
    447
    \n-\n-
    450
    \n-
    \n-\n-
    453 {
    \n-
    454 return ConstIterator{block.begin()};
    \n-
    455 }
    \n-
    \n-
    456
    \n-
    \n-\n-
    459 {
    \n-
    460 return ConstIterator{block.end()};
    \n-
    461 }
    \n-
    \n-
    462
    \n-
    \n-\n-
    466 {
    \n-
    467 return ConstIterator{--block.end()};
    \n-
    468 }
    \n-
    \n-
    469
    \n-
    \n-\n-
    473 {
    \n-
    474 return ConstIterator{--block.begin()};
    \n-
    475 }
    \n-
    \n-
    476
    \n-
    \n-\n-
    479 {
    \n-
    480 return ConstIterator{block.rend()};
    \n-
    481 }
    \n-
    \n-
    482
    \n-
    \n-\n-
    485 {
    \n-
    486 Iterator tmp = block.begin();
    \n-
    487 tmp+=std::min(i, block.size());
    \n-
    488 return tmp;
    \n-
    489 }
    \n-
    \n-
    490
    \n-
    \n-\n-
    493 {
    \n-
    494 ConstIterator tmp = block.begin();
    \n-
    495 tmp+=std::min(i, block.size());
    \n-
    496 return tmp;
    \n-
    497 }
    \n-
    \n-
    498
    \n-
    499 //===== sizes
    \n-
    500
    \n-
    \n-
    502 size_type N () const noexcept
    \n-
    503 {
    \n-
    504 return block.size();
    \n-
    505 }
    \n-
    \n-
    506
    \n-
    \n-
    511 size_type size () const noexcept
    \n-
    512 {
    \n-
    513 return block.size();
    \n-
    514 }
    \n-
    \n-
    515
    \n-
    516
    \n-
    517 private:
    \n-
    518
    \n-
    519 void allocate ()
    \n-
    520 {
    \n-
    521 if (this->initialized)
    \n-
    522 DUNE_THROW(ISTLError, "Attempt to re-allocate already initialized VariableBlockVector");
    \n+
    427 template<typename LevelContext>
    \n+
    \n+
    428 void postsmooth(LevelContext& levelContext, size_t steps)
    \n+
    429 {
    \n+
    430 for(std::size_t i=0; i < steps; ++i) {
    \n+
    431 // update defect
    \n+
    432 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs,
    \n+
    433 *levelContext.rhs);
    \n+
    434 *levelContext.lhs=0;
    \n+
    435 levelContext.pinfo->project(*levelContext.rhs);
    \n+\n+
    437 ::postSmooth(*levelContext.smoother, *levelContext.lhs, *levelContext.rhs);
    \n+
    438 // Accumulate update
    \n+
    439 *levelContext.update += *levelContext.lhs;
    \n+
    440 }
    \n+
    441 }
    \n+
    \n+
    442
    \n+
    443 template<class M, class X, class Y, int l>
    \n+
    \n+
    444 struct SmootherApplier<SeqSOR<M,X,Y,l> >
    \n+
    445 {
    \n+\n+
    447 typedef typename Smoother::range_type Range;
    \n+\n+
    449
    \n+
    \n+
    450 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
    \n+
    451 {
    \n+
    452 smoother.template apply<true>(v,d);
    \n+
    453 }
    \n+
    \n+
    454
    \n+
    455
    \n+
    \n+
    456 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
    \n+
    457 {
    \n+
    458 smoother.template apply<false>(v,d);
    \n+
    459 }
    \n+
    \n+
    460 };
    \n+
    \n+
    461
    \n+
    462 template<class M, class X, class Y, class C, int l>
    \n+
    \n+\n+
    464 {
    \n+\n+
    466 typedef typename Smoother::range_type Range;
    \n+\n+
    468
    \n+
    \n+
    469 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
    \n+
    470 {
    \n+
    471 smoother.template apply<true>(v,d);
    \n+
    472 }
    \n+
    \n+
    473
    \n+
    474
    \n+
    \n+
    475 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
    \n+
    476 {
    \n+
    477 smoother.template apply<false>(v,d);
    \n+
    478 }
    \n+
    \n+
    479 };
    \n+
    \n+
    480
    \n+
    481 template<class M, class X, class Y, class C, int l>
    \n+
    \n+\n+
    483 {
    \n+\n+
    485 typedef typename Smoother::range_type Range;
    \n+\n+
    487
    \n+
    \n+
    488 static void preSmooth(Smoother& smoother, Domain& v, Range& d)
    \n+
    489 {
    \n+
    490 smoother.template apply<true>(v,d);
    \n+
    491 }
    \n+
    \n+
    492
    \n+
    493
    \n+
    \n+
    494 static void postSmooth(Smoother& smoother, Domain& v, Range& d)
    \n+
    495 {
    \n+
    496 smoother.template apply<false>(v,d);
    \n+
    497 }
    \n+
    \n+
    498 };
    \n+
    \n+
    499
    \n+
    500 } // end namespace Amg
    \n+
    501
    \n+
    502 // forward declarations
    \n+
    503 template<class M, class X, class MO, class MS, class A>
    \n+
    504 class SeqOverlappingSchwarz;
    \n+
    505
    \n+
    506 struct MultiplicativeSchwarzMode;
    \n+
    507
    \n+
    508 namespace Amg
    \n+
    509 {
    \n+
    510 template<class M, class X, class MS, class TA>
    \n+
    \n+\n+
    512 MS,TA> >
    \n+
    513 {
    \n+\n+
    515 typedef typename Smoother::range_type Range;
    \n+\n+
    517
    \n+
    \n+
    518 static void preSmooth(Smoother& smoother, Domain& v, const Range& d)
    \n+
    519 {
    \n+
    520 smoother.template apply<true>(v,d);
    \n+
    521 }
    \n+
    \n+
    522
    \n
    523
    \n-
    524 // calculate space needed:
    \n-
    525 size_type storageNeeded = 0;
    \n-
    526 for(size_type i = 0; i < block.size(); i++)
    \n-
    527 storageNeeded += block[i].size();
    \n-
    528
    \n-
    529 storage_.resize(storageNeeded);
    \n-
    530 syncBaseArray();
    \n-
    531
    \n-
    532 // and we set the window pointers
    \n-
    533 block[0].setptr(this->p); // pointer to first block
    \n-
    534 for (size_type j=1; j<block.size(); ++j) // and the rest
    \n-
    535 block[j].setptr(block[j-1].getptr()+block[j-1].getsize());
    \n-
    536
    \n-
    537 // and the vector is ready
    \n-
    538 this->initialized = true;
    \n-
    539 }
    \n-
    540
    \n-
    541 void syncBaseArray () noexcept
    \n-
    542 {
    \n-
    543 this->p = storage_.data();
    \n-
    544 this->n = storage_.size();
    \n-
    545 }
    \n-
    546
    \n-
    547 VectorWindows block = {}; // vector of blocks pointing to the array in the base class
    \n-
    548 std::vector<B, A> storage_ = {};
    \n-
    549 bool initialized = false; // true if vector has been initialized
    \n-
    550 };
    \n+
    \n+
    524 static void postSmooth(Smoother& smoother, Domain& v, const Range& d)
    \n+
    525 {
    \n+
    526 smoother.template apply<false>(v,d);
    \n+
    527
    \n+
    528 }
    \n+
    \n+
    529 };
    \n+
    \n+
    530
    \n+
    531 // template<class M, class X, class TM, class TA>
    \n+
    532 // class SeqOverlappingSchwarz;
    \n+
    533
    \n+
    534 template<class T>
    \n+
    \n+\n+
    536 : public DefaultSmootherArgs<T>
    \n+
    537 {
    \n+\n+
    539
    \n+\n+\n+
    542
    \n+
    \n+\n+
    544 bool onthefly_=false)
    \n+
    545 : overlap(overlap_), onthefly(onthefly_)
    \n+
    546 {}
    \n+
    \n+
    547 };
    \n+
    \n+
    548
    \n+
    549 template<class M, class X, class TM, class TS, class TA>
    \n+\n-
    551
    \n-
    555 template<class B, class A>
    \n+
    554
    \n+
    555 template<class M, class X, class TM, class TS, class TA>
    \n
    \n-
    556 struct FieldTraits< VariableBlockVector<B, A> >
    \n-
    557 {
    \n-
    558 typedef typename FieldTraits<B>::field_type field_type;
    \n-
    559 typedef typename FieldTraits<B>::real_type real_type;
    \n-
    560 };
    \n-
    \n-
    568} // end namespace
    \n-
    569
    \n-
    570#endif
    \n-
    Helper functions for determining the vector/matrix block level.
    \n-\n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n+\n+
    557 : public DefaultConstructionArgs<SeqOverlappingSchwarz<M,X,TM,TS,TA> >
    \n+
    558 {
    \n+\n+
    560
    \n+
    561 public:
    \n+\n+\n+\n+\n+
    566 typedef typename Vector::value_type Subdomain;
    \n+
    567
    \n+
    \n+
    568 virtual void setMatrix(const M& matrix, const AggregatesMap& amap)
    \n+
    569 {
    \n+
    570 Father::setMatrix(matrix);
    \n+
    571
    \n+
    572 std::vector<bool> visited(amap.noVertices(), false);
    \n+
    573 typedef IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap> VisitedMapType;
    \n+
    574 VisitedMapType visitedMap(visited.begin());
    \n+
    575
    \n+
    576 MatrixGraph<const M> graph(matrix);
    \n+
    577
    \n+\n+
    579
    \n+
    580 switch(Father::getArgs().overlap) {
    \n+
    581 case SmootherArgs::vertex :
    \n+
    582 {
    \n+
    583 VertexAdder visitor(subdomains, amap);
    \n+
    584 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n+
    585 }
    \n+
    586 break;
    \n+
    587 case SmootherArgs::pairwise :
    \n+
    588 {
    \n+
    589 createPairDomains(graph);
    \n+
    590 }
    \n+
    591 break;
    \n+
    592 case SmootherArgs::aggregate :
    \n+
    593 {
    \n+
    594 AggregateAdder<VisitedMapType> visitor(subdomains, amap, graph, visitedMap);
    \n+
    595 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n+
    596 }
    \n+
    597 break;
    \n+
    598 case SmootherArgs::none :
    \n+
    599 NoneAdder visitor;
    \n+
    600 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n+
    601 break;
    \n+
    602 default :
    \n+
    603 DUNE_THROW(NotImplemented, "This overlapping scheme is not supported!");
    \n+
    604 }
    \n+
    605 }
    \n+
    \n+
    \n+
    606 void setMatrix(const M& matrix)
    \n+
    607 {
    \n+
    608 Father::setMatrix(matrix);
    \n+
    609
    \n+
    610 /* Create aggregates map where each aggregate is just one vertex. */
    \n+
    611 AggregatesMap amap(matrix.N());
    \n+\n+
    613 for(typename AggregatesMap::iterator iter=amap.begin();
    \n+
    614 iter!=amap.end(); ++iter)
    \n+
    615 *iter=v++;
    \n+
    616
    \n+
    617 std::vector<bool> visited(amap.noVertices(), false);
    \n+
    618 typedef IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap> VisitedMapType;
    \n+
    619 VisitedMapType visitedMap(visited.begin());
    \n+
    620
    \n+
    621 MatrixGraph<const M> graph(matrix);
    \n+
    622
    \n+\n+
    624
    \n+
    625 switch(Father::getArgs().overlap) {
    \n+
    626 case SmootherArgs::vertex :
    \n+
    627 {
    \n+
    628 VertexAdder visitor(subdomains, amap);
    \n+
    629 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n+
    630 }
    \n+
    631 break;
    \n+
    632 case SmootherArgs::aggregate :
    \n+
    633 {
    \n+
    634 DUNE_THROW(NotImplemented, "Aggregate overlap is not supported yet");
    \n+
    635 /*
    \n+
    636 AggregateAdder<VisitedMapType> visitor(subdomains, amap, graph, visitedMap);
    \n+
    637 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n+
    638 */
    \n+
    639 }
    \n+
    640 break;
    \n+
    641 case SmootherArgs::pairwise :
    \n+
    642 {
    \n+
    643 createPairDomains(graph);
    \n+
    644 }
    \n+
    645 break;
    \n+
    646 case SmootherArgs::none :
    \n+
    647 NoneAdder visitor;
    \n+
    648 createSubdomains(matrix, graph, amap, visitor, visitedMap);
    \n+
    649
    \n+
    650 }
    \n+
    651 }
    \n+
    \n+
    652
    \n+
    \n+\n+
    654 {
    \n+
    655 return subdomains;
    \n+
    656 }
    \n+
    \n+
    657
    \n+
    658 private:
    \n+
    659 struct VertexAdder
    \n+
    660 {
    \n+
    \n+
    661 VertexAdder(Vector& subdomains_, const AggregatesMap& aggregates_)
    \n+
    662 : subdomains(subdomains_), max(-1), subdomain(-1), aggregates(aggregates_)
    \n+
    663 {}
    \n+
    \n+
    664 template<class T>
    \n+
    \n+
    665 void operator()(const T& edge)
    \n+
    666 {
    \n+
    667 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED)
    \n+
    668 subdomains[subdomain].insert(edge.target());
    \n+
    669 }
    \n+
    \n+
    \n+
    670 int setAggregate(const AggregateDescriptor& aggregate_)
    \n+
    671 {
    \n+
    672 subdomain=aggregate_;
    \n+
    673 max = std::max(subdomain, aggregate_);
    \n+
    674 return subdomain;
    \n+
    675 }
    \n+
    \n+
    \n+
    676 int noSubdomains() const
    \n+
    677 {
    \n+
    678 return max+1;
    \n+
    679 }
    \n+
    \n+
    680 private:
    \n+
    681 Vector& subdomains;
    \n+\n+
    683 AggregateDescriptor subdomain;
    \n+
    684 const AggregatesMap& aggregates;
    \n+
    685 };
    \n+
    686 struct NoneAdder
    \n+
    687 {
    \n+
    688 template<class T>
    \n+
    \n+
    689 void operator()(const T& edge)
    \n+
    690 {}
    \n+
    \n+
    \n+
    691 int setAggregate(const AggregateDescriptor& aggregate_)
    \n+
    692 {
    \n+
    693 return -1;
    \n+
    694 }
    \n+
    \n+
    \n+
    695 int noSubdomains() const
    \n+
    696 {
    \n+
    697 return -1;
    \n+
    698 }
    \n+
    \n+
    699 };
    \n+
    700
    \n+
    701 template<class VM>
    \n+
    702 struct AggregateAdder
    \n+
    703 {
    \n+
    \n+
    704 AggregateAdder(Vector& subdomains_, const AggregatesMap& aggregates_,
    \n+
    705 const MatrixGraph<const M>& graph_, VM& visitedMap_)
    \n+
    706 : subdomains(subdomains_), subdomain(-1), aggregates(aggregates_),
    \n+
    707 adder(subdomains_, aggregates_), graph(graph_), visitedMap(visitedMap_)
    \n+
    708 {}
    \n+
    \n+
    709 template<class T>
    \n+
    \n+
    710 void operator()(const T& edge)
    \n+
    711 {
    \n+
    712 subdomains[subdomain].insert(edge.target());
    \n+
    713 // If we (the neighbouring vertex of the aggregate)
    \n+
    714 // are not isolated, add the aggregate we belong to
    \n+
    715 // to the same subdomain using the OneOverlapAdder
    \n+
    716 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED) {
    \n+
    717 assert(aggregates[edge.target()]!=aggregate);
    \n+
    718 typename AggregatesMap::VertexList vlist;
    \n+
    719 aggregates.template breadthFirstSearch<true,false>(edge.target(), aggregate,
    \n+
    720 graph, vlist, adder, adder,
    \n+
    721 visitedMap);
    \n+
    722 }
    \n+
    723 }
    \n+
    \n+
    724
    \n+
    \n+
    725 int setAggregate(const AggregateDescriptor& aggregate_)
    \n+
    726 {
    \n+
    727 adder.setAggregate(aggregate_);
    \n+
    728 aggregate=aggregate_;
    \n+
    729 return ++subdomain;
    \n+
    730 }
    \n+
    \n+
    \n+
    731 int noSubdomains() const
    \n+
    732 {
    \n+
    733 return subdomain+1;
    \n+
    734 }
    \n+
    \n+
    735
    \n+
    736 private:
    \n+
    737 AggregateDescriptor aggregate;
    \n+
    738 Vector& subdomains;
    \n+
    739 int subdomain;
    \n+
    740 const AggregatesMap& aggregates;
    \n+
    741 VertexAdder adder;
    \n+
    742 const MatrixGraph<const M>& graph;
    \n+
    743 VM& visitedMap;
    \n+
    744 };
    \n+
    745
    \n+
    746 void createPairDomains(const MatrixGraph<const M>& graph)
    \n+
    747 {
    \n+
    748 typedef typename MatrixGraph<const M>::ConstVertexIterator VIter;
    \n+
    749 typedef typename MatrixGraph<const M>::ConstEdgeIterator EIter;
    \n+
    750 typedef typename M::size_type size_type;
    \n+
    751
    \n+
    752 std::set<std::pair<size_type,size_type> > pairs;
    \n+
    753 int total=0;
    \n+
    754 for(VIter v=graph.begin(), ve=graph.end(); ve != v; ++v)
    \n+
    755 for(EIter e = v.begin(), ee=v.end(); ee!=e; ++e)
    \n+
    756 {
    \n+
    757 ++total;
    \n+
    758 if(e.source()<e.target())
    \n+
    759 pairs.insert(std::make_pair(e.source(),e.target()));
    \n+
    760 else
    \n+
    761 pairs.insert(std::make_pair(e.target(),e.source()));
    \n+
    762 }
    \n+
    763
    \n+
    764
    \n+
    765 subdomains.resize(pairs.size());
    \n+
    766 Dune::dinfo <<std::endl<< "Created "<<pairs.size()<<" ("<<total<<") pair domains"<<std::endl<<std::endl;
    \n+
    767 typedef typename std::set<std::pair<size_type,size_type> >::const_iterator SIter;
    \n+
    768 typename Vector::iterator subdomain=subdomains.begin();
    \n+
    769
    \n+
    770 for(SIter s=pairs.begin(), se =pairs.end(); se!=s; ++s)
    \n+
    771 {
    \n+
    772 subdomain->insert(s->first);
    \n+
    773 subdomain->insert(s->second);
    \n+
    774 ++subdomain;
    \n+
    775 }
    \n+
    776 std::size_t minsize=10000;
    \n+
    777 std::size_t maxsize=0;
    \n+
    778 int sum=0;
    \n+
    779 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {
    \n+
    780 sum+=subdomains[i].size();
    \n+
    781 minsize=std::min(minsize, subdomains[i].size());
    \n+
    782 maxsize=std::max(maxsize, subdomains[i].size());
    \n+
    783 }
    \n+
    784 Dune::dinfo<<"Subdomain size: min="<<minsize<<" max="<<maxsize<<" avg="<<(sum/subdomains.size())
    \n+
    785 <<" no="<<subdomains.size()<<std::endl;
    \n+
    786 }
    \n+
    787
    \n+
    788 template<class Visitor>
    \n+
    789 void createSubdomains(const M& matrix, const MatrixGraph<const M>& graph,
    \n+
    790 const AggregatesMap& amap, Visitor& overlapVisitor,
    \n+
    791 IteratorPropertyMap<std::vector<bool>::iterator,IdentityMap>& visitedMap )
    \n+
    792 {
    \n+
    793 // count number ag aggregates. We assume that the
    \n+
    794 // aggregates are numbered consecutively from 0 except
    \n+
    795 // for the isolated ones. All isolated vertices form
    \n+
    796 // one aggregate, here.
    \n+
    797 int isolated=0;
    \n+
    798 AggregateDescriptor maxAggregate=0;
    \n+
    799
    \n+
    800 for(std::size_t i=0; i < amap.noVertices(); ++i)
    \n+
    801 if(amap[i]==AggregatesMap::ISOLATED)
    \n+
    802 isolated++;
    \n+
    803 else
    \n+
    804 maxAggregate = std::max(maxAggregate, amap[i]);
    \n+
    805
    \n+
    806 subdomains.resize(maxAggregate+1+isolated);
    \n+
    807
    \n+
    808 // reset the subdomains
    \n+
    809 for(typename Vector::size_type i=0; i < subdomains.size(); ++i)
    \n+
    810 subdomains[i].clear();
    \n+
    811
    \n+
    812 // Create the subdomains from the aggregates mapping.
    \n+
    813 // For each aggregate we mark all entries and the
    \n+
    814 // neighbouring vertices as belonging to the same subdomain
    \n+
    815 VertexAdder aggregateVisitor(subdomains, amap);
    \n+
    816
    \n+
    817 for(VertexDescriptor i=0; i < amap.noVertices(); ++i)
    \n+
    818 if(!get(visitedMap, i)) {
    \n+
    819 AggregateDescriptor aggregate=amap[i];
    \n+
    820
    \n+
    821 if(amap[i]==AggregatesMap::ISOLATED) {
    \n+
    822 // isolated vertex gets its own aggregate
    \n+
    823 subdomains.push_back(Subdomain());
    \n+
    824 aggregate=subdomains.size()-1;
    \n+
    825 }
    \n+
    826 overlapVisitor.setAggregate(aggregate);
    \n+
    827 aggregateVisitor.setAggregate(aggregate);
    \n+
    828 subdomains[aggregate].insert(i);
    \n+
    829 typename AggregatesMap::VertexList vlist;
    \n+
    830 amap.template breadthFirstSearch<false,false>(i, aggregate, graph, vlist, aggregateVisitor,
    \n+
    831 overlapVisitor, visitedMap);
    \n+
    832 }
    \n+
    833
    \n+
    834 std::size_t minsize=10000;
    \n+
    835 std::size_t maxsize=0;
    \n+
    836 int sum=0;
    \n+
    837 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {
    \n+
    838 sum+=subdomains[i].size();
    \n+
    839 minsize=std::min(minsize, subdomains[i].size());
    \n+
    840 maxsize=std::max(maxsize, subdomains[i].size());
    \n+
    841 }
    \n+
    842 Dune::dinfo<<"Subdomain size: min="<<minsize<<" max="<<maxsize<<" avg="<<(sum/subdomains.size())
    \n+
    843 <<" no="<<subdomains.size()<<" isolated="<<isolated<<std::endl;
    \n+
    844
    \n+
    845
    \n+
    846
    \n+
    847 }
    \n+
    848 Vector subdomains;
    \n+
    849 };
    \n+
    \n+
    850
    \n+
    851
    \n+
    852 template<class M, class X, class TM, class TS, class TA>
    \n+
    \n+
    853 struct ConstructionTraits<SeqOverlappingSchwarz<M,X,TM,TS,TA> >
    \n+
    854 {
    \n+\n+
    856
    \n+
    \n+
    857 static inline std::shared_ptr<SeqOverlappingSchwarz<M,X,TM,TS,TA>> construct(Arguments& args)
    \n+
    858 {
    \n+
    859 return std::make_shared<SeqOverlappingSchwarz<M,X,TM,TS,TA>>
    \n+
    860 (args.getMatrix(),
    \n+
    861 args.getSubDomains(),
    \n+\n+
    863 args.getArgs().onthefly);
    \n+
    864 }
    \n+
    \n+
    865 };
    \n+
    \n+
    866
    \n+
    867
    \n+
    868 } // namespace Amg
    \n+
    869} // namespace Dune
    \n+
    870
    \n+
    871
    \n+
    872
    \n+
    873#endif
    \n+\n+
    Define general preconditioner interface.
    \n+\n+
    Helper classes for the construction of classes without empty constructor.
    \n+
    Provides classes for the Coloring process of AMG.
    \n+
    DefaultSmootherArgs< typename X::field_type > Arguments
    Definition smoother.hh:74
    \n+
    static void postSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:494
    \n+\n+
    static void preSmooth(Smoother &smoother, Domain &v, const Range &d)
    Definition smoother.hh:518
    \n+
    static std::shared_ptr< SeqJac< M, X, Y, l > > construct(Arguments &args)
    Definition smoother.hh:256
    \n+
    ConstructionArgs< SeqILU< M, X, Y > > Arguments
    Definition smoother.hh:309
    \n+
    const Matrix & getMatrix() const
    Definition smoother.hh:114
    \n+\n+
    int setAggregate(const AggregateDescriptor &aggregate_)
    Definition smoother.hh:691
    \n+
    DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments
    Definition smoother.hh:67
    \n+
    int setAggregate(const AggregateDescriptor &aggregate_)
    Definition smoother.hh:670
    \n+
    ConstructionTraits< T > SeqConstructionTraits
    Definition smoother.hh:350
    \n+
    void setArgs(const SmootherArgs &args)
    Definition smoother.hh:119
    \n+
    ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Arguments
    Definition smoother.hh:855
    \n+
    NonoverlappingBlockPreconditioner< C, SeqSOR< M, X, Y, l > > Smoother
    Definition smoother.hh:484
    \n+
    static void postSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:456
    \n+
    AggregateAdder(Vector &subdomains_, const AggregatesMap &aggregates_, const MatrixGraph< const M > &graph_, VM &visitedMap_)
    Definition smoother.hh:704
    \n+\n+
    void setComm(const C &comm)
    Definition smoother.hh:158
    \n+
    DefaultConstructionArgs< Richardson< X, Y > > Arguments
    Definition smoother.hh:269
    \n+
    virtual ~DefaultConstructionArgs()
    Definition smoother.hh:180
    \n+
    SeqOverlappingSchwarzSmootherArgs< typename M::field_type > Arguments
    Definition smoother.hh:552
    \n+\n+
    static void preSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:488
    \n+
    int getN()
    Definition smoother.hh:293
    \n+\n+
    SeqSOR< M, X, Y, l > Smoother
    Definition smoother.hh:446
    \n+\n+
    static std::shared_ptr< SeqSSOR< M, X, Y, l > > construct(Arguments &args)
    Definition smoother.hh:224
    \n+
    AggregatesMap::AggregateDescriptor AggregateDescriptor
    Definition smoother.hh:564
    \n+
    bool onthefly
    Definition smoother.hh:541
    \n+
    DefaultConstructionArgs< SeqSOR< M, X, Y, l > > Arguments
    Definition smoother.hh:238
    \n+
    virtual void setMatrix(const M &matrix, const AggregatesMap &amap)
    Definition smoother.hh:568
    \n+
    void setMatrix(const Args &...)
    Definition smoother.hh:184
    \n+
    DefaultConstructionArgs< SeqJac< M, X, Y, l > > Arguments
    Definition smoother.hh:254
    \n+
    DefaultConstructionArgs< SeqSSOR< M, X, Y, l > > Arguments
    Definition smoother.hh:222
    \n+
    const SmootherArgs getArgs() const
    Definition smoother.hh:133
    \n+
    VertexAdder(Vector &subdomains_, const AggregatesMap &aggregates_)
    Definition smoother.hh:661
    \n+\n+
    SeqOverlappingSchwarz< M, X, TM, TS, TA >::subdomain_vector Vector
    Definition smoother.hh:565
    \n+
    static std::shared_ptr< SeqOverlappingSchwarz< M, X, TM, TS, TA > > construct(Arguments &args)
    Definition smoother.hh:857
    \n+
    static void preSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:469
    \n+
    const_iterator begin() const
    Definition aggregates.hh:725
    \n+
    void setMatrix(const Matrix &matrix)
    Definition smoother.hh:104
    \n+
    T Smoother
    Definition smoother.hh:371
    \n+
    static void preSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:450
    \n+
    BlockPreconditioner< X, Y, C, SeqSOR< M, X, Y, l > > Smoother
    Definition smoother.hh:465
    \n+
    void setComm(T1 &comm)
    Definition smoother.hh:193
    \n+\n+
    AggregateDescriptor * iterator
    Definition aggregates.hh:735
    \n+
    void presmooth(LevelContext &levelContext, size_t steps)
    Apply pre smoothing on the current level.
    Definition smoother.hh:406
    \n+\n+
    SeqOverlappingSchwarzSmootherArgs(Overlap overlap_=vertex, bool onthefly_=false)
    Definition smoother.hh:543
    \n+
    DefaultParallelConstructionArgs< T, C > Arguments
    Definition smoother.hh:337
    \n+
    DefaultParallelConstructionArgs< T, C > Arguments
    Definition smoother.hh:349
    \n+
    const Matrix * matrix_
    Definition smoother.hh:139
    \n+
    const_iterator end() const
    Definition aggregates.hh:730
    \n+
    const SequentialInformation & getComm()
    Definition smoother.hh:128
    \n+
    V AggregateDescriptor
    The aggregate descriptor type.
    Definition aggregates.hh:580
    \n+
    static const V ISOLATED
    Identifier of isolated vertices.
    Definition aggregates.hh:571
    \n+
    DefaultSmootherArgs()
    Default constructor.
    Definition smoother.hh:56
    \n+
    void setMatrix(const M &matrix)
    Definition smoother.hh:606
    \n+
    std::size_t noVertices() const
    Get the number of vertices.
    \n+\n+
    static void postSmooth(Smoother &smoother, Domain &v, const Range &d)
    apply post smoothing in forward direction
    Definition smoother.hh:394
    \n+
    FieldTraits< T >::real_type RelaxationFactor
    The type of the relaxation factor.
    Definition smoother.hh:42
    \n+\n+
    Smoother::domain_type Domain
    Definition smoother.hh:373
    \n+
    void setN(int n)
    Definition smoother.hh:288
    \n+
    static std::shared_ptr< BlockPreconditioner< X, Y, C, T > > construct(Arguments &args)
    Definition smoother.hh:339
    \n+
    SLList< VertexDescriptor, Allocator > VertexList
    The type of a single linked list of vertex descriptors.
    Definition aggregates.hh:592
    \n+
    static std::shared_ptr< NonoverlappingBlockPreconditioner< C, T > > construct(Arguments &args)
    Definition smoother.hh:351
    \n+
    SeqOverlappingSchwarz< M, X, MultiplicativeSchwarzMode, MS, TA > Smoother
    Definition smoother.hh:514
    \n+
    static std::shared_ptr< ParSSOR< M, X, Y, C > > construct(Arguments &args)
    Definition smoother.hh:326
    \n+
    MatrixGraph< M >::VertexDescriptor VertexDescriptor
    Definition smoother.hh:562
    \n+
    static std::shared_ptr< SeqILU< M, X, Y > > construct(Arguments &args)
    Definition smoother.hh:311
    \n+\n+
    const SequentialInformation & getComm()
    Definition smoother.hh:196
    \n+
    static std::shared_ptr< SeqSOR< M, X, Y, l > > construct(Arguments &args)
    Definition smoother.hh:240
    \n+
    static std::shared_ptr< Richardson< X, Y > > construct(Arguments &args)
    Definition smoother.hh:271
    \n+
    virtual void setMatrix(const Matrix &matrix, const AggregatesMap &amap)
    Definition smoother.hh:108
    \n+\n+
    void postsmooth(LevelContext &levelContext, size_t steps)
    Apply post smoothing on the current level.
    Definition smoother.hh:428
    \n+
    Dune::Amg::AggregatesMap< VertexDescriptor > AggregatesMap
    Definition smoother.hh:563
    \n+
    const SmootherArgs getArgs() const
    Definition smoother.hh:201
    \n+
    void setComm(T1 &comm)
    Definition smoother.hh:125
    \n+
    static void postSmooth(Smoother &smoother, Domain &v, const Range &d)
    Definition smoother.hh:524
    \n+
    DefaultParallelConstructionArgs< M, C > Arguments
    Definition smoother.hh:324
    \n+
    RelaxationFactor relaxationFactor
    The relaxation factor to use.
    Definition smoother.hh:51
    \n+
    virtual ~DefaultParallelConstructionArgs()
    Definition smoother.hh:155
    \n+
    Smoother::domain_type Domain
    Definition smoother.hh:448
    \n+
    int setAggregate(const AggregateDescriptor &aggregate_)
    Definition smoother.hh:725
    \n+
    Smoother::range_type Range
    Definition smoother.hh:447
    \n+
    const C & getComm() const
    Definition smoother.hh:163
    \n+
    virtual ~DefaultConstructionArgs()
    Definition smoother.hh:101
    \n+
    static void preSmooth(Smoother &smoother, Domain &v, const Range &d)
    apply pre smoothing in forward direction
    Definition smoother.hh:382
    \n+
    static void postSmooth(Smoother &smoother, Domain &v, Range &d)
    Definition smoother.hh:475
    \n+
    ConstructionTraits< T > SeqConstructionTraits
    Definition smoother.hh:338
    \n+
    ConstructionArgs(int n=0)
    Definition smoother.hh:284
    \n+\n+
    void setArgs(const SmootherArgs &args)
    Definition smoother.hh:187
    \n+
    int iterations
    The number of iterations to perform.
    Definition smoother.hh:47
    \n+
    Smoother::range_type Range
    Definition smoother.hh:372
    \n+
    Overlap overlap
    Definition smoother.hh:540
    \n+\n+
    @ aggregate
    Definition smoother.hh:538
    \n+\n+
    @ pairwise
    Definition smoother.hh:538
    \n+\n
    Definition allocator.hh:11
    \n-
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n-
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    A Vector of blocks with different blocksizes.
    Definition vbvector.hh:48
    \n-
    VariableBlockVector(size_type numBlocks, size_type blockSize)
    Construct a vector with given number of blocks each having a constant size.
    Definition vbvector.hh:125
    \n-
    VariableBlockVector()
    Constructor without arguments makes an empty vector.
    Definition vbvector.hh:102
    \n-
    friend void swap(VariableBlockVector &lhs, VariableBlockVector &rhs) noexcept
    Free function to swap the storage and internal state of lhs with rhs.
    Definition vbvector.hh:190
    \n-
    Iterator iterator
    Export the iterator type using std naming rules.
    Definition vbvector.hh:443
    \n-
    VariableBlockVector & operator=(VariableBlockVector tmp)
    Copy and move assignment.
    Definition vbvector.hh:171
    \n-
    VariableBlockVector(size_type numBlocks)
    Construct a vector with given number of blocks, but size of each block is not yet known.
    Definition vbvector.hh:112
    \n-
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition vbvector.hh:65
    \n-
    typename A::size_type size_type
    The size type for the index access.
    Definition vbvector.hh:83
    \n-
    size_type N() const noexcept
    number of blocks in the vector (are of variable size here)
    Definition vbvector.hh:502
    \n-
    VariableBlockVector(const VariableBlockVector &a)
    Copy constructor, has copy semantics.
    Definition vbvector.hh:142
    \n-
    window_type & operator[](size_type i)
    random access to blocks
    Definition vbvector.hh:397
    \n-
    A allocator_type
    export the allocator type
    Definition vbvector.hh:68
    \n-
    CreateIterator createend()
    get create iterator pointing to one after the last block
    Definition vbvector.hh:386
    \n-
    VariableBlockVector(VariableBlockVector &&tmp)
    Move constructor:
    Definition vbvector.hh:161
    \n-
    CreateIterator createbegin()
    get initial create iterator
    Definition vbvector.hh:377
    \n-
    ConstIterator const_iterator
    Export the const iterator type using std naming rules.
    Definition vbvector.hh:449
    \n-
    window_type & reference
    Export type used for references to container entries.
    Definition vbvector.hh:74
    \n-
    ConstIterator rend() const
    end ConstIterator
    Definition vbvector.hh:478
    \n-
    const window_type & const_reference
    Export type used for const references to container entries.
    Definition vbvector.hh:80
    \n-
    ConstIterator find(size_type i) const
    random access returning iterator (end if not contained)
    Definition vbvector.hh:492
    \n-
    ConstIterator beforeEnd() const
    Definition vbvector.hh:465
    \n-
    Iterator find(size_type i)
    random access returning iterator (end if not contained)
    Definition vbvector.hh:484
    \n-
    IndexedIterator< typename VectorWindows::const_iterator > ConstIterator
    Const iterator.
    Definition vbvector.hh:446
    \n-\n-
    ConstIterator beforeBegin() const
    Definition vbvector.hh:472
    \n-
    void resize(size_type numBlocks)
    same effect as constructor with same argument
    Definition vbvector.hh:196
    \n-
    Iterator end()
    end Iterator
    Definition vbvector.hh:423
    \n-
    void swap(VariableBlockVector &other) noexcept
    Exchange the storage and internal state with other.
    Definition vbvector.hh:178
    \n-
    ConstIterator begin() const
    begin ConstIterator
    Definition vbvector.hh:452
    \n-
    size_type size() const noexcept
    Definition vbvector.hh:511
    \n-
    void resize(size_type numBlocks, size_type blockSize)
    same effect as constructor with same argument
    Definition vbvector.hh:210
    \n-
    IndexedIterator< typename VectorWindows::iterator > Iterator
    Definition vbvector.hh:414
    \n-
    ConstIterator end() const
    end ConstIterator
    Definition vbvector.hh:458
    \n-
    Iterator beforeBegin()
    Definition vbvector.hh:437
    \n-
    Iterator beforeEnd()
    Definition vbvector.hh:430
    \n-
    Iterator begin()
    begin Iterator
    Definition vbvector.hh:417
    \n-
    Iterator class for sequential creation of blocks.
    Definition vbvector.hh:275
    \n-
    bool operator==(const CreateIterator &it) const
    equality
    Definition vbvector.hh:339
    \n-
    size_type index() const
    dereferencing
    Definition vbvector.hh:345
    \n-
    SizeProxy reference
    reference type
    Definition vbvector.hh:295
    \n-
    size_type * pointer
    pointer type
    Definition vbvector.hh:292
    \n-
    bool operator!=(const CreateIterator &it) const
    inequality
    Definition vbvector.hh:333
    \n-
    ~CreateIterator()
    Definition vbvector.hh:304
    \n-
    size_type value_type
    value type
    Definition vbvector.hh:281
    \n-
    CreateIterator(VariableBlockVector &_v, int _i, bool _isEnd)
    constructor
    Definition vbvector.hh:298
    \n-
    void setblocksize(size_type _k)
    set size of current block
    Definition vbvector.hh:351
    \n-
    size_type & operator*()
    Access size of current block.
    Definition vbvector.hh:362
    \n-
    std::output_iterator_tag iterator_category
    iterator category
    Definition vbvector.hh:278
    \n-
    CreateIterator & operator++()
    prefix increment
    Definition vbvector.hh:316
    \n-
    void difference_type
    difference type (unused)
    Definition vbvector.hh:289
    \n-
    FieldTraits< B >::real_type real_type
    Definition vbvector.hh:559
    \n-
    FieldTraits< B >::field_type field_type
    Definition vbvector.hh:558
    \n+
    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
    \n+
    Sequential overlapping Schwarz preconditioner.
    Definition overlappingschwarz.hh:755
    \n+
    X range_type
    The range type of the preconditioner.
    Definition overlappingschwarz.hh:770
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition overlappingschwarz.hh:765
    \n+
    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
    \n+
    Nonoverlapping parallel preconditioner.
    Definition novlpschwarz.hh:276
    \n+
    P::range_type range_type
    The range type of the preconditioner.
    Definition novlpschwarz.hh:284
    \n+
    P::domain_type domain_type
    The domain type of the preconditioner.
    Definition novlpschwarz.hh:282
    \n+
    Tag that tells the Schwarz method to be multiplicative.
    Definition overlappingschwarz.hh:126
    \n+
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n+
    The (undirected) graph of a matrix.
    Definition graph.hh:51
    \n+
    VertexIterator end()
    Get an iterator over the vertices.
    \n+
    M::size_type VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:73
    \n+
    VertexIterator begin()
    Get an iterator over the vertices.
    \n+
    Iterator over all edges starting from a vertex.
    Definition graph.hh:95
    \n+
    The vertex iterator type of the graph.
    Definition graph.hh:209
    \n+
    Definition pinfo.hh:28
    \n+
    The default class for the smoother arguments.
    Definition smoother.hh:38
    \n+
    Traits class for getting the attribute class of a smoother.
    Definition smoother.hh:66
    \n+
    Construction Arguments for the default smoothers.
    Definition smoother.hh:93
    \n+
    Definition smoother.hh:148
    \n+\n+\n+\n+
    Helper class for applying the smoothers.
    Definition smoother.hh:370
    \n+\n+\n+
    Sequential SSOR preconditioner.
    Definition preconditioners.hh:142
    \n+
    Sequential SOR preconditioner.
    Definition preconditioners.hh:262
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition preconditioners.hh:267
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition preconditioners.hh:269
    \n+
    The sequential jacobian preconditioner.
    Definition preconditioners.hh:413
    \n+
    Sequential ILU preconditioner.
    Definition preconditioners.hh:697
    \n+
    Richardson preconditioner.
    Definition preconditioners.hh:878
    \n+
    A parallel SSOR preconditioner.
    Definition schwarz.hh:175
    \n+
    Block parallel preconditioner.
    Definition schwarz.hh:278
    \n+
    X domain_type
    The domain type of the preconditioner.
    Definition schwarz.hh:285
    \n+
    Y range_type
    The range type of the preconditioner.
    Definition schwarz.hh:290
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,685 +1,1343 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-vbvector.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+smoother.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_VBVECTOR_HH\n-6#define DUNE_ISTL_VBVECTOR_HH\n+5#ifndef DUNE_AMGSMOOTHER_HH\n+6#define DUNE_AMGSMOOTHER_HH\n 7\n-8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13\n+8#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+9#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh>\n+10#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n+11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n+12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh>\n+13#include \n 14#include \n-15#include \n-16#include \n-17#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-18#include \"_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n-19\n-20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n-21\n-26namespace _\bD_\bu_\bn_\be {\n-27\n-43 template >\n-_\b4_\b4 class _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br : public Imp::block_vector_unmanaged\n-45 // this derivation gives us all the blas level 1 and norms\n-46 // on the large array. However, access operators have to be\n-47 // overwritten.\n-48 {\n-49 using Base = Imp::block_vector_unmanaged;\n-50\n-51 // just a shorthand\n-52 using window_type = Imp::BlockVectorWindow;\n-53\n-54 // data-structure holding the windows (but not the actual data)\n-55 using VectorWindows = std::vector::template rebind_alloc>;\n-56\n-57 // block type bool is not supported since std::vector is used for\n-storage\n-58 static_assert(not std::is_same_v, \"Block type 'bool' not supported\n-by VariableBlockVector.\");\n-59\n-60 public:\n-61\n-62 //===== type definitions and constants\n-63\n-_\b6_\b5 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n-66\n-_\b6_\b8 using _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be = A;\n-69\n-_\b7_\b4 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = window_type&;\n+15\n+16namespace _\bD_\bu_\bn_\be\n+17{\n+18 namespace Amg\n+19 {\n+20\n+36 template\n+_\b3_\b7 struct _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+38 {\n+_\b4_\b2 typedef typename FieldTraits::real_type _\bR_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br;\n+43\n+_\b4_\b7 int _\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs;\n+_\b5_\b1 _\bR_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br _\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br;\n+52\n+_\b5_\b6 _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs()\n+57 : _\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs(1), _\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br(1.0)\n+58 {}\n+59 };\n+60\n+64 template\n+_\b6_\b5 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs\n+66 {\n+_\b6_\b7 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bT_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b__\bt_\by_\bp_\be_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+68\n+69 };\n+70\n+71 template\n+_\b7_\b2 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs<_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn>\n+73 {\n+_\b7_\b4 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bX_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n 75\n-_\b8_\b0 using _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = const window_type&;\n-81\n-_\b8_\b3 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = typename A::size_type;\n-84\n-_\b9_\b0 using _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be = _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bB_\b,_\bA_\b>;\n-91\n-_\b9_\b4 using _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be = _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bB_\b,_\bA_\b>;\n+76 };\n+77\n+78 template\n+_\b7_\b9 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs<_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\n+80 : public _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs\n+81 {};\n+82\n+83 template\n+_\b8_\b4 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\n+85 : public _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs\n+86 {};\n+87\n+91 template\n+_\b9_\b2 class _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+93 {\n+94 typedef typename T::matrix_type Matrix;\n 95\n-96 //===== constructors and such\n+96 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n 97\n-_\b1_\b0_\b2 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br () :\n-103 Base()\n-104 {}\n-105\n-_\b1_\b1_\b2 explicit _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be numBlocks) :\n-113 Base(),\n-114 block(numBlocks)\n-115 {}\n-116\n-_\b1_\b2_\b5 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be numBlocks, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be blockSize) :\n-126 Base(),\n-127 block(numBlocks),\n-128 storage_(numBlocks*blockSize)\n+98 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br> _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp;\n+99\n+100 public:\n+_\b1_\b0_\b1 virtual _\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs()\n+102 {}\n+103\n+_\b1_\b0_\b4 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const Matrix& matrix)\n+105 {\n+106 _\bm_\ba_\bt_\br_\bi_\bx_\b_=&matrix;\n+107 }\n+_\b1_\b0_\b8 virtual void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const Matrix& matrix, [[maybe_unused]] const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& amap)\n+109 {\n+110 _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(matrix);\n+111 }\n+112\n+113\n+_\b1_\b1_\b4 const Matrix& _\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx() const\n+115 {\n+116 return *_\bm_\ba_\bt_\br_\bi_\bx_\b_;\n+117 }\n+118\n+_\b1_\b1_\b9 void _\bs_\be_\bt_\bA_\br_\bg_\bs(const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& args)\n+120 {\n+121 args_=&args;\n+122 }\n+123\n+124 template\n+_\b1_\b2_\b5 void _\bs_\be_\bt_\bC_\bo_\bm_\bm([[maybe_unused]] T1& comm)\n+126 {}\n+127\n+_\b1_\b2_\b8 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& _\bg_\be_\bt_\bC_\bo_\bm_\bm()\n 129 {\n-130 // and we can allocate the big array in the base class\n-131 syncBaseArray();\n+130 return comm_;\n+131 }\n 132\n-133 // set the windows into the big array\n-134 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; ip+(i*blockSize));\n-136\n-137 // and the vector is usable\n-138 initialized = true;\n-139 }\n-140\n-_\b1_\b4_\b2 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (const _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& a) :\n-143 Base(static_cast(a)),\n-144 block(a.block),\n-145 storage_(a.storage_)\n-146 {\n-147 syncBaseArray();\n-148\n-149 // and we must set the windows\n-150 if (block.size()>0) {\n-151 block[0].set(block[0].getsize(),this->p); // first block\n-152 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=1; i\n+_\b1_\b4_\b6 struct _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+147 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+148 {};\n+149\n+150 template\n+_\b1_\b5_\b1 class _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+152 : public _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+153 {\n+154 public:\n+_\b1_\b5_\b5 virtual _\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs()\n+156 {}\n+157\n+_\b1_\b5_\b8 void _\bs_\be_\bt_\bC_\bo_\bm_\bm(const C& comm)\n+159 {\n+160 comm_ = &comm;\n+161 }\n+162\n+_\b1_\b6_\b3 const C& _\bg_\be_\bt_\bC_\bo_\bm_\bm() const\n+164 {\n+165 return *comm_;\n+166 }\n+167 private:\n+168 const C* comm_;\n+169 };\n+170\n+171\n+172 template\n+_\b1_\b7_\b3 class _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs<_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn>\n+174 {\n+175 typedef _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\bX_\b,_\bY_\b> _\bT;\n 176\n-_\b1_\b7_\b8 void _\bs_\bw_\ba_\bp (_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& other) noexcept\n-179 {\n-180 using std::swap;\n-181 _\bs_\bw_\ba_\bp(storage_, other.storage_);\n-182 _\bs_\bw_\ba_\bp(block, other.block);\n-183 _\bs_\bw_\ba_\bp(initialized, other.initialized);\n-184\n-185 other.syncBaseArray();\n-186 syncBaseArray();\n-187 }\n-188\n-_\b1_\b9_\b0 friend void _\bs_\bw_\ba_\bp (_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& lhs, _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& rhs)\n-noexcept\n-191 {\n-192 lhs.swap(rhs);\n-193 }\n-194\n-_\b1_\b9_\b6 void _\br_\be_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be numBlocks)\n+177 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bT_\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n+178\n+179 public:\n+_\b1_\b8_\b0 virtual _\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs()\n+181 {}\n+182\n+183 template \n+_\b1_\b8_\b4 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const Args&...)\n+185 {}\n+186\n+_\b1_\b8_\b7 void _\bs_\be_\bt_\bA_\br_\bg_\bs(const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& args)\n+188 {\n+189 args_=&args;\n+190 }\n+191\n+192 template\n+_\b1_\b9_\b3 void _\bs_\be_\bt_\bC_\bo_\bm_\bm([[maybe_unused]] T1& comm)\n+194 {}\n+195\n+_\b1_\b9_\b6 const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& _\bg_\be_\bt_\bC_\bo_\bm_\bm()\n 197 {\n-198 storage_.clear();\n-199\n-200 syncBaseArray();\n-201\n-202 // we can allocate the windows now\n-203 block.resize(numBlocks);\n-204\n-205 // and the vector not fully usable\n-206 initialized = false;\n-207 }\n-208\n-_\b2_\b1_\b0 void _\br_\be_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be numBlocks, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be blockSize)\n-211 {\n-212 // and we can allocate the big array in the base class\n-213 storage_.resize(numBlocks*blockSize);\n-214 block.resize(numBlocks);\n-215 syncBaseArray();\n-216\n-217 // set the windows into the big array\n-218 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; ip+(i*blockSize));\n-220\n-221 // and the vector is usable\n-222 initialized = true;\n-223 }\n-224\n-225 //===== assignment from scalar\n-226\n-_\b2_\b2_\b8 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n-229 {\n-230 (static_cast&>(*this)) = k;\n-231 return *this;\n-232 }\n-233\n-234\n-235 //===== the creation interface\n-236\n-237 class CreateIterator;\n-238\n-239#ifndef DOXYGEN\n-240\n-241 // The window_type does not hand out a reference to its size,\n-242 // so in order to provide a valid iterator, we need a workaround\n-243 // to make assignment possible. This proxy enables just that by\n-244 // implicitly converting to the stored size for read access and\n-245 // tunneling assignment to the accessor method of the window.\n-246 struct SizeProxy\n-247 {\n-248\n-249 operator size_type () const\n-250 {\n-251 return target->getsize();\n-252 }\n-253\n-254 SizeProxy& operator= (size_type size)\n-255 {\n-256 target->setsize(size);\n-257 return *this;\n-258 }\n-259\n-260 private:\n-261\n-262 friend class CreateIterator;\n-263\n-264 SizeProxy (window_type& t) :\n-265 target(&t)\n-266 {}\n-267\n-268 window_type* target;\n-269 };\n+198 return comm_;\n+199 }\n+200\n+_\b2_\b0_\b1 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs _\bg_\be_\bt_\bA_\br_\bg_\bs() const\n+202 {\n+203 return *args_;\n+204 }\n+205\n+206 private:\n+207 const SmootherArgs* args_;\n+208 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn comm_;\n+209 };\n+210\n+211\n+212\n+213 template\n+214 struct ConstructionTraits;\n+215\n+219 template\n+_\b2_\b2_\b0 struct ConstructionTraits<_\bS_\be_\bq_\bS_\bS_\bO_\bR >\n+221 {\n+_\b2_\b2_\b2 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bS_\bS_\bO_\bR_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+223\n+_\b2_\b2_\b4 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+225 {\n+226 return std::make_shared>\n+227 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(), args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs, args._\bg_\be_\bt_\bA_\br_\bg_\bs\n+()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br);\n+228 }\n+229 };\n+230\n+231\n+235 template\n+_\b2_\b3_\b6 struct ConstructionTraits<_\bS_\be_\bq_\bS_\bO_\bR >\n+237 {\n+_\b2_\b3_\b8 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bS_\bO_\bR_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+239\n+_\b2_\b4_\b0 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+241 {\n+242 return std::make_shared>\n+243 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(), args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs, args._\bg_\be_\bt_\bA_\br_\bg_\bs\n+()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br);\n+244 }\n+245 };\n+246\n+247\n+251 template\n+_\b2_\b5_\b2 struct ConstructionTraits<_\bS_\be_\bq_\bJ_\ba_\bc >\n+253 {\n+_\b2_\b5_\b4 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bJ_\ba_\bc_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+255\n+_\b2_\b5_\b6 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+257 {\n+258 return std::make_shared>\n+259 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(), args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs, args._\bg_\be_\bt_\bA_\br_\bg_\bs\n+()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br);\n+260 }\n+261 };\n+262\n+266 template\n+_\b2_\b6_\b7 struct ConstructionTraits<_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn >\n+268 {\n+_\b2_\b6_\b9 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\bX_\b,_\bY_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n 270\n-271#endif // DOXYGEN\n-272\n-_\b2_\b7_\b4 class _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-275 {\n-276 public:\n-_\b2_\b7_\b8 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by = std::output_iterator_tag;\n-279\n-_\b2_\b8_\b1 using _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be = _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-282\n-_\b2_\b8_\b9 using _\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be = void;\n-290\n-_\b2_\b9_\b2 using _\bp_\bo_\bi_\bn_\bt_\be_\br = _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be*;\n-293\n-_\b2_\b9_\b5 using _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be = SizeProxy;\n-296\n-_\b2_\b9_\b8 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br (_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& _v, int _i, bool _isEnd) :\n-299 v(_v),\n-300 i(_i),\n-301 isEnd(_isEnd)\n-302 {}\n-303\n-_\b3_\b0_\b4 _\b~_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ()\n-305 {\n-306 // When the iterator gets destructed, we allocate the memory\n-307 // for the VariableBlockVector if\n-308 // 1. the current iterator was not created as enditerator\n-309 // 2. we're at the last block\n-310 // 3. the vector hasn't been initialized earlier\n-311 if (not isEnd && i==v.block.size() && not v.initialized)\n-312 v.allocate();\n-313 }\n-314\n-_\b3_\b1_\b6 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+()\n-317 {\n-318 // go to next block\n-319 ++i;\n-320\n-321 return *this;\n-322 }\n-323\n-_\b3_\b2_\b5 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+_\b (int)\n-326 {\n-327 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br tmp(*this);\n-328 this->_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n-329 return tmp;\n-330 }\n-331\n-_\b3_\b3_\b3 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=_\b (const _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n-334 {\n-335 return (i!=it.i) || (&v!=&it.v);\n-336 }\n-337\n-_\b3_\b3_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=_\b (const _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& it) const\n+_\b2_\b7_\b1 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+272 {\n+273 return std::make_shared>\n+274 (args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br);\n+275 }\n+276 };\n+277\n+278\n+279 template\n+_\b2_\b8_\b0 class _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs<_\bS_\be_\bq_\bI_\bL_\bU >\n+281 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs >\n+282 {\n+283 public:\n+_\b2_\b8_\b4 _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs(int n=0)\n+285 : n_(n)\n+286 {}\n+287\n+_\b2_\b8_\b8 void _\bs_\be_\bt_\bN(int n)\n+289 {\n+290 n_ = n;\n+291 }\n+292\n+_\b2_\b9_\b3 int _\bg_\be_\bt_\bN()\n+294 {\n+295 return n_;\n+296 }\n+297\n+298 private:\n+299 int n_;\n+300 };\n+301\n+302\n+306 template\n+_\b3_\b0_\b7 struct ConstructionTraits<_\bS_\be_\bq_\bI_\bL_\bU >\n+308 {\n+_\b3_\b0_\b9 typedef _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bI_\bL_\bU_\b<_\bM_\b,_\bX_\b,_\bY_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+310\n+_\b3_\b1_\b1 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+312 {\n+313 return std::make_shared>\n+314 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(), args._\bg_\be_\bt_\bN(), args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br);\n+315 }\n+316 };\n+317\n+321 template\n+_\b3_\b2_\b2 struct ConstructionTraits<_\bP_\ba_\br_\bS_\bS_\bO_\bR >\n+323 {\n+_\b3_\b2_\b4 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bM_\b,_\bC_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+325\n+_\b3_\b2_\b6 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+327 {\n+328 return std::make_shared>\n+329 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(), args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs,\n+330 args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br, args._\bg_\be_\bt_\bC_\bo_\bm_\bm());\n+331 }\n+332 };\n+333\n+334 template\n+_\b3_\b3_\b5 struct ConstructionTraits<_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\n+336 {\n+_\b3_\b3_\b7 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bT_\b,_\bC_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+_\b3_\b3_\b8 typedef ConstructionTraits _\bS_\be_\bq_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs;\n+_\b3_\b3_\b9 static inline std::shared_ptr> _\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n 340 {\n-341 return (i==it.i) && (&v==&it.v);\n-342 }\n-343\n-_\b3_\b4_\b5 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bi_\bn_\bd_\be_\bx () const\n-346 {\n-347 return i;\n-348 }\n-349\n-_\b3_\b5_\b1 void _\bs_\be_\bt_\bb_\bl_\bo_\bc_\bk_\bs_\bi_\bz_\be (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _k)\n+341 auto seqPrec = SeqConstructionTraits::construct(args);\n+342 return std::make_shared> (seqPrec,\n+args._\bg_\be_\bt_\bC_\bo_\bm_\bm());\n+343 }\n+344 };\n+345\n+346 template\n+_\b3_\b4_\b7 struct ConstructionTraits<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br >\n+348 {\n+_\b3_\b4_\b9 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bT_\b,_\bC_\b> _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+_\b3_\b5_\b0 typedef ConstructionTraits _\bS_\be_\bq_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs;\n+_\b3_\b5_\b1 static inline std::shared_ptr>\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n 352 {\n-353 v.block[i].setsize(_k);\n-354 }\n-355\n-357#ifdef DOXYGEN\n-358 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be&\n-359#else\n-360 SizeProxy\n-361#endif\n-_\b3_\b6_\b2 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*()\n-363 {\n-364 return {v.block[i]};\n-365 }\n-366\n-367 private:\n-368 _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& v; // my vector\n-369 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i; // current block to be defined\n-370 const bool isEnd; // flag if this object was created as the end iterator.\n-371 };\n-372\n-373 // CreateIterator wants to set all the arrays ...\n-_\b3_\b7_\b4 friend class _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-375\n-_\b3_\b7_\b7 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn ()\n-378 {\n-379#ifdef DUNE_ISTL_WITH_CHECKING\n-380 if (initialized) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"no CreateIterator in initialized\n-state\");\n-381#endif\n-382 return _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this, 0, false);\n-383 }\n-384\n-_\b3_\b8_\b6 _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd ()\n-387 {\n-388 return _\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(*this, block.size(), true);\n-389 }\n-390\n-391\n-392 //===== access to components\n-393 // has to be overwritten from base class because it must\n-394 // return access to the windows\n-395\n-_\b3_\b9_\b7 window_type& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-398 {\n-399#ifdef DUNE_ISTL_WITH_CHECKING\n-400 if (i>=block.size()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n-401#endif\n-402 return block[i];\n-403 }\n-404\n-_\b4_\b0_\b6 const window_type& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]_\b (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n+353 auto seqPrec = SeqConstructionTraits::construct(args);\n+354 return std::make_shared> (seqPrec,\n+args._\bg_\be_\bt_\bC_\bo_\bm_\bm());\n+355 }\n+356 };\n+357\n+368 template\n+_\b3_\b6_\b9 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br\n+370 {\n+_\b3_\b7_\b1 typedef T _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n+_\b3_\b7_\b2 typedef typename Smoother::range_type _\bR_\ba_\bn_\bg_\be;\n+_\b3_\b7_\b3 typedef typename Smoother::domain_type _\bD_\bo_\bm_\ba_\bi_\bn;\n+374\n+_\b3_\b8_\b2 static void _\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n+383 {\n+384 smoother.apply(v,d);\n+385 }\n+386\n+_\b3_\b9_\b4 static void _\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n+395 {\n+396 smoother.apply(v,d);\n+397 }\n+398 };\n+399\n+405 template\n+_\b4_\b0_\b6 void _\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh(LevelContext& levelContext, size_t steps)\n 407 {\n-408#ifdef DUNE_ISTL_WITH_CHECKING\n-409 if (i<0 || i>=block.size()) DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"index out of range\");\n-410#endif\n-411 return block[i];\n-412 }\n-413\n-_\b4_\b1_\b4 using _\bI_\bt_\be_\br_\ba_\bt_\bo_\br = IndexedIterator;\n+408 for(std::size_t i=0; i < steps; ++i) {\n+409 *levelContext.lhs=0;\n+410 _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b>\n+411_\b _\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(*levelContext.smoother, *levelContext.lhs,\n+412 *levelContext.rhs);\n+413 // Accumulate update\n+414 *levelContext.update += *levelContext.lhs;\n 415\n-_\b4_\b1_\b7 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n-418 {\n-419 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br{block.begin()};\n+416 // update defect\n+417 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs,\n+*levelContext.rhs);\n+418 levelContext.pinfo->project(*levelContext.rhs);\n+419 }\n 420 }\n 421\n-_\b4_\b2_\b3 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n-424 {\n-425 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br{block.end()};\n-426 }\n-427\n-_\b4_\b3_\b0 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n-431 {\n-432 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br{--block.end()};\n-433 }\n-434\n-_\b4_\b3_\b7 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n-438 {\n-439 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br{--block.begin()};\n+427 template\n+_\b4_\b2_\b8 void _\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh(LevelContext& levelContext, size_t steps)\n+429 {\n+430 for(std::size_t i=0; i < steps; ++i) {\n+431 // update defect\n+432 levelContext.matrix->applyscaleadd(-1, *levelContext.lhs,\n+433 *levelContext.rhs);\n+434 *levelContext.lhs=0;\n+435 levelContext.pinfo->project(*levelContext.rhs);\n+436 _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\by_\bp_\be_\b>\n+437_\b _\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(*levelContext.smoother, *levelContext.lhs, *levelContext.rhs);\n+438 // Accumulate update\n+439 *levelContext.update += *levelContext.lhs;\n 440 }\n-441\n-_\b4_\b4_\b3 using _\bi_\bt_\be_\br_\ba_\bt_\bo_\br = _\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-444\n-_\b4_\b4_\b6 using _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br = IndexedIterator;\n-447\n-_\b4_\b4_\b9 using _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br = _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-450\n-_\b4_\b5_\b2 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n-453 {\n-454 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br{block.begin()};\n-455 }\n-456\n-_\b4_\b5_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n-459 {\n-460 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br{block.end()};\n-461 }\n-462\n-_\b4_\b6_\b5 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd () const\n-466 {\n-467 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br{--block.end()};\n-468 }\n-469\n-_\b4_\b7_\b2 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n-473 {\n-474 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br{--block.begin()};\n-475 }\n-476\n-_\b4_\b7_\b8 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\br_\be_\bn_\bd () const\n-479 {\n-480 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br{block.rend()};\n-481 }\n-482\n-_\b4_\b8_\b4 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n-485 {\n-486 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br tmp = block.begin();\n-487 tmp+=std::min(i, block.size());\n-488 return tmp;\n-489 }\n-490\n-_\b4_\b9_\b2 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bf_\bi_\bn_\bd (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-493 {\n-494 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br tmp = block.begin();\n-495 tmp+=std::min(i, block.size());\n-496 return tmp;\n+441 }\n+442\n+443 template\n+_\b4_\b4_\b4 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br<_\bS_\be_\bq_\bS_\bO_\bR >\n+445 {\n+_\b4_\b4_\b6 typedef _\bS_\be_\bq_\bS_\bO_\bR_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n+_\b4_\b4_\b7 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be _\bR_\ba_\bn_\bg_\be;\n+_\b4_\b4_\b8 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be _\bD_\bo_\bm_\ba_\bi_\bn;\n+449\n+_\b4_\b5_\b0 static void _\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n+451 {\n+452 smoother.template apply(v,d);\n+453 }\n+454\n+455\n+_\b4_\b5_\b6 static void _\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n+457 {\n+458 smoother.template apply(v,d);\n+459 }\n+460 };\n+461\n+462 template\n+_\b4_\b6_\b3 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br<_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br > >\n+464 {\n+_\b4_\b6_\b5 typedef _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bX_\b,_\bY_\b,_\bC_\b,_\bS_\be_\bq_\bS_\bO_\bR_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> > _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n+_\b4_\b6_\b6 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be _\bR_\ba_\bn_\bg_\be;\n+_\b4_\b6_\b7 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be _\bD_\bo_\bm_\ba_\bi_\bn;\n+468\n+_\b4_\b6_\b9 static void _\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n+470 {\n+471 smoother.template apply(v,d);\n+472 }\n+473\n+474\n+_\b4_\b7_\b5 static void _\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n+476 {\n+477 smoother.template apply(v,d);\n+478 }\n+479 };\n+480\n+481 template\n+_\b4_\b8_\b2 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br<_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+> >\n+483 {\n+_\b4_\b8_\b4 typedef _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\bC_\b,_\bS_\be_\bq_\bS_\bO_\bR_\b<_\bM_\b,_\bX_\b,_\bY_\b,_\bl_\b> > _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n+_\b4_\b8_\b5 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be _\bR_\ba_\bn_\bg_\be;\n+_\b4_\b8_\b6 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be _\bD_\bo_\bm_\ba_\bi_\bn;\n+487\n+_\b4_\b8_\b8 static void _\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n+489 {\n+490 smoother.template apply(v,d);\n+491 }\n+492\n+493\n+_\b4_\b9_\b4 static void _\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, _\bR_\ba_\bn_\bg_\be& d)\n+495 {\n+496 smoother.template apply(v,d);\n 497 }\n-498\n-499 //===== sizes\n-500\n-_\b5_\b0_\b2 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bN () const noexcept\n-503 {\n-504 return block.size();\n-505 }\n-506\n-_\b5_\b1_\b1 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be () const noexcept\n-512 {\n-513 return block.size();\n-514 }\n-515\n-516\n-517 private:\n-518\n-519 void allocate ()\n-520 {\n-521 if (this->initialized)\n-522 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Attempt to re-allocate already initialized\n-VariableBlockVector\");\n+498 };\n+499\n+500 } // end namespace Amg\n+501\n+502 // forward declarations\n+503 template\n+504 class SeqOverlappingSchwarz;\n+505\n+506 struct MultiplicativeSchwarzMode;\n+507\n+508 namespace Amg\n+509 {\n+510 template\n+_\b5_\b1_\b1 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz >\n+513 {\n+_\b5_\b1_\b4 typedef _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\bM_\bS_\b,_\bT_\bA_\b>\n+_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br;\n+_\b5_\b1_\b5 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be _\bR_\ba_\bn_\bg_\be;\n+_\b5_\b1_\b6 typedef typename _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be _\bD_\bo_\bm_\ba_\bi_\bn;\n+517\n+_\b5_\b1_\b8 static void _\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n+519 {\n+520 smoother.template apply(v,d);\n+521 }\n+522\n 523\n-524 // calculate space needed:\n-525 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be storageNeeded = 0;\n-526 for(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0; i < block.size(); i++)\n-527 storageNeeded += block[i]._\bs_\bi_\bz_\be();\n-528\n-529 storage_.resize(storageNeeded);\n-530 syncBaseArray();\n-531\n-532 // and we set the window pointers\n-533 block[0].setptr(this->p); // pointer to first block\n-534 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j=1; jinitialized = true;\n-539 }\n-540\n-541 void syncBaseArray () noexcept\n-542 {\n-543 this->p = storage_.data();\n-544 this->n = storage_.size();\n-545 }\n-546\n-547 VectorWindows block = {}; // vector of blocks pointing to the array in the\n-base class\n-548 std::vector storage_ = {};\n-549 bool initialized = false; // true if vector has been initialized\n-550 };\n-551\n-555 template\n-_\b5_\b5_\b6 struct FieldTraits< _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n-557 {\n-_\b5_\b5_\b8 typedef typename FieldTraits::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b5_\b5_\b9 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-560 };\n-568} // end namespace\n-569\n-570#endif\n-_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n-Helper functions for determining the vector/matrix block level.\n-_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-This file implements a vector space as a tensor product of a given vector\n-space. The number of compon...\n+_\b5_\b2_\b4 static void _\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh(_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br& smoother, _\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n+525 {\n+526 smoother.template apply(v,d);\n+527\n+528 }\n+529 };\n+530\n+531 // template\n+532 // class SeqOverlappingSchwarz;\n+533\n+534 template\n+_\b5_\b3_\b5 struct _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+536 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+537 {\n+_\b5_\b3_\b8 enum _\bO_\bv_\be_\br_\bl_\ba_\bp {_\bv_\be_\br_\bt_\be_\bx, _\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be, _\bp_\ba_\bi_\br_\bw_\bi_\bs_\be, _\bn_\bo_\bn_\be};\n+539\n+_\b5_\b4_\b0 _\bO_\bv_\be_\br_\bl_\ba_\bp _\bo_\bv_\be_\br_\bl_\ba_\bp;\n+_\b5_\b4_\b1 bool _\bo_\bn_\bt_\bh_\be_\bf_\bl_\by;\n+542\n+_\b5_\b4_\b3 _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs(_\bO_\bv_\be_\br_\bl_\ba_\bp overlap_=_\bv_\be_\br_\bt_\be_\bx,\n+544 bool onthefly_=false)\n+545 : _\bo_\bv_\be_\br_\bl_\ba_\bp(overlap_), _\bo_\bn_\bt_\bh_\be_\bf_\bl_\by(onthefly_)\n+546 {}\n+547 };\n+548\n+549 template\n+_\b5_\b5_\b0 struct _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz >\n+551 {\n+_\b5_\b5_\b2 typedef _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>\n+_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+553 };\n+554\n+555 template\n+_\b5_\b5_\b6 class _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz >\n+557 : public _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs >\n+558 {\n+559 typedef _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bS_\b,_\bT_\bA_\b> >\n+_\bF_\ba_\bt_\bh_\be_\br;\n+560\n+561 public:\n+_\b5_\b6_\b2 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bM_\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+_\b5_\b6_\b3 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b> _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp;\n+_\b5_\b6_\b4 typedef typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+_\b5_\b6_\b5 typedef typename _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bS_\b,_\bT_\bA_\b>_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n+_\bV_\be_\bc_\bt_\bo_\br;\n+_\b5_\b6_\b6 typedef typename Vector::value_type _\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn;\n+567\n+_\b5_\b6_\b8 virtual void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const M& matrix, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& amap)\n+569 {\n+570 Father::setMatrix(matrix);\n+571\n+572 std::vector visited(amap._\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs(), false);\n+573 typedef IteratorPropertyMap::iterator,IdentityMap>\n+VisitedMapType;\n+574 VisitedMapType visitedMap(visited.begin());\n+575\n+576 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b> graph(matrix);\n+577\n+578 typedef _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>\n+_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n+579\n+580 switch(Father::getArgs().overlap) {\n+581 case SmootherArgs::vertex :\n+582 {\n+583 VertexAdder visitor(subdomains, amap);\n+584 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n+585 }\n+586 break;\n+587 case SmootherArgs::pairwise :\n+588 {\n+589 createPairDomains(graph);\n+590 }\n+591 break;\n+592 case SmootherArgs::aggregate :\n+593 {\n+594 AggregateAdder visitor(subdomains, amap, graph,\n+visitedMap);\n+595 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n+596 }\n+597 break;\n+598 case SmootherArgs::none :\n+599 NoneAdder visitor;\n+600 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n+601 break;\n+602 default :\n+603 DUNE_THROW(NotImplemented, \"This overlapping scheme is not supported!\");\n+604 }\n+605 }\n+_\b6_\b0_\b6 void _\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(const M& matrix)\n+607 {\n+608 Father::setMatrix(matrix);\n+609\n+610 /* Create aggregates map where each aggregate is just one vertex. */\n+611 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp amap(matrix.N());\n+612 _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br v=0;\n+613 for(typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br iter=amap._\bb_\be_\bg_\bi_\bn();\n+614 iter!=amap._\be_\bn_\bd(); ++iter)\n+615 *iter=v++;\n+616\n+617 std::vector visited(amap._\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs(), false);\n+618 typedef IteratorPropertyMap::iterator,IdentityMap>\n+VisitedMapType;\n+619 VisitedMapType visitedMap(visited.begin());\n+620\n+621 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b> graph(matrix);\n+622\n+623 typedef _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bM_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be_\b>\n+_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n+624\n+625 switch(Father::getArgs().overlap) {\n+626 case SmootherArgs::vertex :\n+627 {\n+628 VertexAdder visitor(subdomains, amap);\n+629 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n+630 }\n+631 break;\n+632 case SmootherArgs::aggregate :\n+633 {\n+634 DUNE_THROW(NotImplemented, \"Aggregate overlap is not supported yet\");\n+635 /*\n+636 AggregateAdder visitor(subdomains, amap, graph,\n+visitedMap);\n+637 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n+638 */\n+639 }\n+640 break;\n+641 case SmootherArgs::pairwise :\n+642 {\n+643 createPairDomains(graph);\n+644 }\n+645 break;\n+646 case SmootherArgs::none :\n+647 NoneAdder visitor;\n+648 createSubdomains(matrix, graph, amap, visitor, visitedMap);\n+649\n+650 }\n+651 }\n+652\n+_\b6_\b5_\b3 const _\bV_\be_\bc_\bt_\bo_\br& _\bg_\be_\bt_\bS_\bu_\bb_\bD_\bo_\bm_\ba_\bi_\bn_\bs()\n+654 {\n+655 return subdomains;\n+656 }\n+657\n+658 private:\n+659 struct VertexAdder\n+660 {\n+_\b6_\b6_\b1 _\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br(_\bV_\be_\bc_\bt_\bo_\br& subdomains_, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& aggregates_)\n+662 : subdomains(subdomains_), max(-1), subdomain(-1), aggregates(aggregates_)\n+663 {}\n+664 template\n+_\b6_\b6_\b5 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T& edge)\n+666 {\n+667 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED)\n+668 subdomains[subdomain].insert(edge.target());\n+669 }\n+_\b6_\b7_\b0 int _\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate_)\n+671 {\n+672 subdomain=aggregate_;\n+673 max = std::max(subdomain, aggregate_);\n+674 return subdomain;\n+675 }\n+_\b6_\b7_\b6 int _\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs() const\n+677 {\n+678 return max+1;\n+679 }\n+680 private:\n+681 _\bV_\be_\bc_\bt_\bo_\br& subdomains;\n+682 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br max;\n+683 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br subdomain;\n+684 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& aggregates;\n+685 };\n+686 struct NoneAdder\n+687 {\n+688 template\n+_\b6_\b8_\b9 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T& edge)\n+690 {}\n+_\b6_\b9_\b1 int _\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate_)\n+692 {\n+693 return -1;\n+694 }\n+_\b6_\b9_\b5 int _\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs() const\n+696 {\n+697 return -1;\n+698 }\n+699 };\n+700\n+701 template\n+702 struct AggregateAdder\n+703 {\n+_\b7_\b0_\b4 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br(_\bV_\be_\bc_\bt_\bo_\br& subdomains_, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& aggregates_,\n+705 const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b>& graph_, VM& visitedMap_)\n+706 : subdomains(subdomains_), subdomain(-1), aggregates(aggregates_),\n+707 adder(subdomains_, aggregates_), graph(graph_), visitedMap(visitedMap_)\n+708 {}\n+709 template\n+_\b7_\b1_\b0 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T& edge)\n+711 {\n+712 subdomains[subdomain].insert(edge.target());\n+713 // If we (the neighbouring vertex of the aggregate)\n+714 // are not isolated, add the aggregate we belong to\n+715 // to the same subdomain using the OneOverlapAdder\n+716 if(aggregates[edge.target()]!=AggregatesMap::ISOLATED) {\n+717 assert(aggregates[edge.target()]!=aggregate);\n+718 typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bL_\bi_\bs_\bt vlist;\n+719 aggregates.template breadthFirstSearch(edge.target(),\n+aggregate,\n+720 graph, vlist, adder, adder,\n+721 visitedMap);\n+722 }\n+723 }\n+724\n+_\b7_\b2_\b5 int _\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate_)\n+726 {\n+727 adder.setAggregate(aggregate_);\n+728 aggregate=aggregate_;\n+729 return ++subdomain;\n+730 }\n+_\b7_\b3_\b1 int _\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs() const\n+732 {\n+733 return subdomain+1;\n+734 }\n+735\n+736 private:\n+737 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br aggregate;\n+738 _\bV_\be_\bc_\bt_\bo_\br& subdomains;\n+739 int subdomain;\n+740 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp& aggregates;\n+741 VertexAdder adder;\n+742 const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b>& graph;\n+743 VM& visitedMap;\n+744 };\n+745\n+746 void createPairDomains(const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b>& graph)\n+747 {\n+748 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br VIter;\n+749 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b<_\bc_\bo_\bn_\bs_\bt_\b _\bM_\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br EIter;\n+750 typedef typename M::size_type size_type;\n+751\n+752 std::set > pairs;\n+753 int total=0;\n+754 for(VIter v=graph._\bb_\be_\bg_\bi_\bn(), ve=graph._\be_\bn_\bd(); ve != v; ++v)\n+755 for(EIter e = v.begin(), ee=v.end(); ee!=e; ++e)\n+756 {\n+757 ++total;\n+758 if(e.source() >::const_iterator\n+SIter;\n+768 typename Vector::iterator subdomain=subdomains.begin();\n+769\n+770 for(SIter s=pairs.begin(), se =pairs.end(); se!=s; ++s)\n+771 {\n+772 subdomain->insert(s->first);\n+773 subdomain->insert(s->second);\n+774 ++subdomain;\n+775 }\n+776 std::size_t minsize=10000;\n+777 std::size_t maxsize=0;\n+778 int sum=0;\n+779 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {\n+780 sum+=subdomains[i].size();\n+781 minsize=std::min(minsize, subdomains[i].size());\n+782 maxsize=std::max(maxsize, subdomains[i].size());\n+783 }\n+784 Dune::dinfo<<\"Subdomain size: min=\"<\n+789 void createSubdomains(const M& matrix, const MatrixGraph& graph,\n+790 const AggregatesMap& amap, Visitor& overlapVisitor,\n+791 IteratorPropertyMap::iterator,IdentityMap>& visitedMap )\n+792 {\n+793 // count number ag aggregates. We assume that the\n+794 // aggregates are numbered consecutively from 0 except\n+795 // for the isolated ones. All isolated vertices form\n+796 // one aggregate, here.\n+797 int isolated=0;\n+798 AggregateDescriptor maxAggregate=0;\n+799\n+800 for(std::size_t i=0; i < amap.noVertices(); ++i)\n+801 if(amap[i]==_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n+802 isolated++;\n+803 else\n+804 maxAggregate = std::max(maxAggregate, amap[i]);\n+805\n+806 subdomains.resize(maxAggregate+1+isolated);\n+807\n+808 // reset the subdomains\n+809 for(typename Vector::size_type i=0; i < subdomains.size(); ++i)\n+810 subdomains[i].clear();\n+811\n+812 // Create the subdomains from the aggregates mapping.\n+813 // For each aggregate we mark all entries and the\n+814 // neighbouring vertices as belonging to the same subdomain\n+815 VertexAdder aggregateVisitor(subdomains, amap);\n+816\n+817 for(VertexDescriptor i=0; i < amap.noVertices(); ++i)\n+818 if(!_\bg_\be_\bt(visitedMap, i)) {\n+819 AggregateDescriptor aggregate=amap[i];\n+820\n+821 if(amap[i]==_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD) {\n+822 // isolated vertex gets its own aggregate\n+823 subdomains.push_back(Subdomain());\n+824 aggregate=subdomains.size()-1;\n+825 }\n+826 overlapVisitor.setAggregate(aggregate);\n+827 aggregateVisitor.setAggregate(aggregate);\n+828 subdomains[aggregate].insert(i);\n+829 typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bL_\bi_\bs_\bt vlist;\n+830 amap.template breadthFirstSearch(i, aggregate, graph, vlist,\n+aggregateVisitor,\n+831 overlapVisitor, visitedMap);\n+832 }\n+833\n+834 std::size_t minsize=10000;\n+835 std::size_t maxsize=0;\n+836 int sum=0;\n+837 for(typename Vector::size_type i=0; i < subdomains.size(); ++i) {\n+838 sum+=subdomains[i].size();\n+839 minsize=std::min(minsize, subdomains[i].size());\n+840 maxsize=std::max(maxsize, subdomains[i].size());\n+841 }\n+842 Dune::dinfo<<\"Subdomain size: min=\"<\n+_\b8_\b5_\b3 struct ConstructionTraits<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz >\n+854 {\n+_\b8_\b5_\b5 typedef _\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\bM_\b,_\bX_\b,_\bT_\bM_\b,_\bT_\bS_\b,_\bT_\bA_\b> > _\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs;\n+856\n+_\b8_\b5_\b7 static inline std::shared_ptr>\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs& args)\n+858 {\n+859 return std::make_shared>\n+860 (args._\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx(),\n+861 args._\bg_\be_\bt_\bS_\bu_\bb_\bD_\bo_\bm_\ba_\bi_\bn_\bs(),\n+862 args._\bg_\be_\bt_\bA_\br_\bg_\bs()._\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br,\n+863 args._\bg_\be_\bt_\bA_\br_\bg_\bs().onthefly);\n+864 }\n+865 };\n+866\n+867\n+868 } // namespace Amg\n+869} // namespace Dune\n+870\n+871\n+872\n+873#endif\n+_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh\n+_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n+Define general preconditioner interface.\n+_\bn_\bo_\bv_\bl_\bp_\bs_\bc_\bh_\bw_\ba_\br_\bz_\b._\bh_\bh\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+Helper classes for the construction of classes without empty constructor.\n+_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b._\bh_\bh\n+Provides classes for the Coloring process of AMG.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+DefaultSmootherArgs< typename X::field_type > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh\n+static void postSmooth(Smoother &smoother, Domain &v, Range &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:494\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bN_\bo_\bn_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const T &edge)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:689\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh\n+static void preSmooth(Smoother &smoother, Domain &v, const Range &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:518\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bJ_\ba_\bc_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< SeqJac< M, X, Y, l > > construct(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:256\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+ConstructionArgs< SeqILU< M, X, Y > > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:309\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bg_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+const Matrix & getMatrix() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:114\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bR_\ba_\bn_\bg_\be\n+Smoother::range_type Range\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:515\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bN_\bo_\bn_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n+int setAggregate(const AggregateDescriptor &aggregate_)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:691\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:67\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br_\b:_\b:_\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n+int setAggregate(const AggregateDescriptor &aggregate_)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:670\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:\n+_\bS_\be_\bq_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs\n+ConstructionTraits< T > SeqConstructionTraits\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:350\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bs_\be_\bt_\bA_\br_\bg_\bs\n+void setArgs(const SmootherArgs &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:119\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:855\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n+NonoverlappingBlockPreconditioner< C, SeqSOR< M, X, Y, l > > Smoother\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:484\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh\n+static void postSmooth(Smoother &smoother, Domain &v, Range &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:456\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br\n+AggregateAdder(Vector &subdomains_, const AggregatesMap &aggregates_, const\n+MatrixGraph< const M > &graph_, VM &visitedMap_)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:704\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bO_\bv_\be_\br_\bl_\ba_\bp\n+Overlap\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:538\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bs_\be_\bt_\bC_\bo_\bm_\bm\n+void setComm(const C &comm)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:158\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+DefaultConstructionArgs< Richardson< X, Y > > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:269\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:\n+_\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+virtual ~DefaultConstructionArgs()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:180\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+SeqOverlappingSchwarzSmootherArgs< typename M::field_type > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:552\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn\n+Vector::value_type Subdomain\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:566\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh\n+static void preSmooth(Smoother &smoother, Domain &v, Range &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:488\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bN\n+int getN()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bR_\ba_\bn_\bg_\be\n+Smoother::range_type Range\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:485\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n+SeqSOR< M, X, Y, l > Smoother\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:446\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const T &edge)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:710\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< SeqSSOR< M, X, Y, l > > construct(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:224\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+AggregatesMap::AggregateDescriptor AggregateDescriptor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:564\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bo_\bn_\bt_\bh_\be_\bf_\bl_\by\n+bool onthefly\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:541\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+DefaultConstructionArgs< SeqSOR< M, X, Y, l > > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:238\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+virtual void setMatrix(const M &matrix, const AggregatesMap &amap)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:568\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+void setMatrix(const Args &...)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:184\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bJ_\ba_\bc_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+DefaultConstructionArgs< SeqJac< M, X, Y, l > > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:254\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+DefaultConstructionArgs< SeqSSOR< M, X, Y, l > > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:222\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bg_\be_\bt_\bA_\br_\bg_\bs\n+const SmootherArgs getArgs() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:133\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br\n+VertexAdder(Vector &subdomains_, const AggregatesMap &aggregates_)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:661\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bg_\be_\bt_\bS_\bu_\bb_\bD_\bo_\bm_\ba_\bi_\bn_\bs\n+const Vector & getSubDomains()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:653\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bV_\be_\bc_\bt_\bo_\br\n+SeqOverlappingSchwarz< M, X, TM, TS, TA >::subdomain_vector Vector\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:565\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< SeqOverlappingSchwarz< M, X, TM, TS, TA > > construct\n+(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:857\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n+_\b>_\b _\b>_\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh\n+static void preSmooth(Smoother &smoother, Domain &v, Range &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:469\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+const_iterator begin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:725\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+void setMatrix(const Matrix &matrix)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:104\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n+T Smoother\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:371\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh\n+static void preSmooth(Smoother &smoother, Domain &v, Range &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:450\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n+_\b>_\b _\b>_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n+BlockPreconditioner< X, Y, C, SeqSOR< M, X, Y, l > > Smoother\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:465\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bC_\bo_\bm_\bm\n+void setComm(T1 &comm)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:193\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br_\b:_\b:_\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs\n+int noSubdomains() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:676\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+AggregateDescriptor * iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:735\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh\n+void presmooth(LevelContext &levelContext, size_t steps)\n+Apply pre smoothing on the current level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:406\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n+Smoother::domain_type Domain\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:516\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+SeqOverlappingSchwarzSmootherArgs(Overlap overlap_=vertex, bool\n+onthefly_=false)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:543\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+DefaultParallelConstructionArgs< T, C > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:337\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+DefaultParallelConstructionArgs< T, C > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:349\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n+const Matrix * matrix_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:139\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n+const_iterator end() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:730\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm\n+const SequentialInformation & getComm()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:128\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+V AggregateDescriptor\n+The aggregate descriptor type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:580\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD\n+static const V ISOLATED\n+Identifier of isolated vertices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:571\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+DefaultSmootherArgs()\n+Default constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+void setMatrix(const M &matrix)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:606\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n+std::size_t noVertices() const\n+Get the number of vertices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bA_\bd_\bd_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const T &edge)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:665\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh\n+static void postSmooth(Smoother &smoother, Domain &v, const Range &d)\n+apply post smoothing in forward direction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:394\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bR_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br\n+FieldTraits< T >::real_type RelaxationFactor\n+The type of the relaxation factor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:42\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b _\b>_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n+Smoother::domain_type Domain\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:486\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n+Smoother::domain_type Domain\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:373\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bN\n+void setN(int n)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:288\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< BlockPreconditioner< X, Y, C, T > > construct(Arguments\n+&args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:339\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bL_\bi_\bs_\bt\n+SLList< VertexDescriptor, Allocator > VertexList\n+The type of a single linked list of vertex descriptors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:592\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:\n+_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< NonoverlappingBlockPreconditioner< C, T > > construct\n+(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:351\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br\n+SeqOverlappingSchwarz< M, X, MultiplicativeSchwarzMode, MS, TA > Smoother\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:514\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bP_\ba_\br_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< ParSSOR< M, X, Y, C > > construct(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:326\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+MatrixGraph< M >::VertexDescriptor VertexDescriptor\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:562\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< SeqILU< M, X, Y > > construct(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:311\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs\n+int noSubdomains() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:731\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm\n+const SequentialInformation & getComm()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:196\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< SeqSOR< M, X, Y, l > > construct(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:240\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+static std::shared_ptr< Richardson< X, Y > > construct(Arguments &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:271\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+virtual void setMatrix(const Matrix &matrix, const AggregatesMap &amap)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:108\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bN_\bo_\bn_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bn_\bo_\bS_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\bs\n+int noSubdomains() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:695\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh\n+void postsmooth(LevelContext &levelContext, size_t steps)\n+Apply post smoothing on the current level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:428\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+Dune::Amg::AggregatesMap< VertexDescriptor > AggregatesMap\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:563\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bA_\br_\bg_\bs\n+const SmootherArgs getArgs() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:201\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bs_\be_\bt_\bC_\bo_\bm_\bm\n+void setComm(T1 &comm)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:125\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,\n+_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be_\b,_\b _\bM_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh\n+static void postSmooth(Smoother &smoother, Domain &v, const Range &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:524\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bP_\ba_\br_\bS_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b _\b>_\b _\b>_\b:_\b:_\bA_\br_\bg_\bu_\bm_\be_\bn_\bt_\bs\n+DefaultParallelConstructionArgs< M, C > Arguments\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:324\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\br_\be_\bl_\ba_\bx_\ba_\bt_\bi_\bo_\bn_\bF_\ba_\bc_\bt_\bo_\br\n+RelaxationFactor relaxationFactor\n+The relaxation factor to use.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+virtual ~DefaultParallelConstructionArgs()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n+Smoother::domain_type Domain\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:448\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bA_\bd_\bd_\be_\br_\b:_\b:_\bs_\be_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n+int setAggregate(const AggregateDescriptor &aggregate_)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:725\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>_\b _\b>_\b:_\b:_\bR_\ba_\bn_\bg_\be\n+Smoother::range_type Range\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:447\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bm_\bm\n+const C & getComm() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:163\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b:_\b:_\b~_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+virtual ~DefaultConstructionArgs()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bp_\br_\be_\bS_\bm_\bo_\bo_\bt_\bh\n+static void preSmooth(Smoother &smoother, Domain &v, const Range &d)\n+apply pre smoothing in forward direction\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:382\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n+_\b>_\b _\b>_\b:_\b:_\bp_\bo_\bs_\bt_\bS_\bm_\bo_\bo_\bt_\bh\n+static void postSmooth(Smoother &smoother, Domain &v, Range &d)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:475\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bT_\b _\b>_\b _\b>_\b:_\b:\n+_\bS_\be_\bq_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs\n+ConstructionTraits< T > SeqConstructionTraits\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:338\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+ConstructionArgs(int n=0)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:284\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n+_\b>_\b _\b>_\b:_\b:_\bR_\ba_\bn_\bg_\be\n+Smoother::range_type Range\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>_\b:_\b:_\bs_\be_\bt_\bA_\br_\bg_\bs\n+void setArgs(const SmootherArgs &args)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:187\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs\n+int iterations\n+The number of iterations to perform.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:47\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b:_\b:_\bR_\ba_\bn_\bg_\be\n+Smoother::range_type Range\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:372\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp\n+Overlap overlap\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:540\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b<_\b _\bX_\b,_\b _\bY_\b,_\b _\bC_\b,_\b _\bS_\be_\bq_\bS_\bO_\bR_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b,_\b _\bl_\b _\b>\n+_\b>_\b _\b>_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n+Smoother::domain_type Domain\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:467\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\ba_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n+@ aggregate\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:538\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bn_\bo_\bn_\be\n+@ none\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:538\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bp_\ba_\bi_\br_\bw_\bi_\bs_\be\n+@ pairwise\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:538\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs_\b:_\b:_\bv_\be_\br_\bt_\be_\bx\n+@ vertex\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:538\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-A vector of blocks with memory management.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-derive error class from the base class in common\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-A Vector of blocks with different blocksizes.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-VariableBlockVector(size_type numBlocks, size_type blockSize)\n-Construct a vector with given number of blocks each having a constant size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-VariableBlockVector()\n-Constructor without arguments makes an empty vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:102\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bw_\ba_\bp\n-friend void swap(VariableBlockVector &lhs, VariableBlockVector &rhs) noexcept\n-Free function to swap the storage and internal state of lhs with rhs.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:190\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator iterator\n-Export the iterator type using std naming rules.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:443\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-VariableBlockVector & operator=(VariableBlockVector tmp)\n-Copy and move assignment.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:171\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-VariableBlockVector(size_type numBlocks)\n-Construct a vector with given number of blocks, but size of each block is not\n-yet known.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< B >::field_type field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:65\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-typename A::size_type size_type\n-The size type for the index access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bN\n-size_type N() const noexcept\n-number of blocks in the vector (are of variable size here)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:502\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-VariableBlockVector(const VariableBlockVector &a)\n-Copy constructor, has copy semantics.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-window_type & operator[](size_type i)\n-random access to blocks\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:397\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n-A allocator_type\n-export the allocator type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:68\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\be_\bn_\bd\n-CreateIterator createend()\n-get create iterator pointing to one after the last block\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:386\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-VariableBlockVector(VariableBlockVector &&tmp)\n-Move constructor:\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:161\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\br_\be_\ba_\bt_\be_\bb_\be_\bg_\bi_\bn\n-CreateIterator createbegin()\n-get initial create iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:377\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator const_iterator\n-Export the const iterator type using std naming rules.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:449\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-window_type & reference\n-Export type used for references to container entries.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bn_\bd\n-ConstIterator rend() const\n-end ConstIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:478\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-const window_type & const_reference\n-Export type used for const references to container entries.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\bn_\bd\n-ConstIterator find(size_type i) const\n-random access returning iterator (end if not contained)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:492\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-ConstIterator beforeEnd() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:465\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\bn_\bd\n-Iterator find(size_type i)\n-random access returning iterator (end if not contained)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:484\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-IndexedIterator< typename VectorWindows::const_iterator > ConstIterator\n-Const iterator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:446\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\b~_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-~VariableBlockVector()=default\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-ConstIterator beforeBegin() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:472\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-void resize(size_type numBlocks)\n-same effect as constructor with same argument\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:196\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n-Iterator end()\n-end Iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:423\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bw_\ba_\bp\n-void swap(VariableBlockVector &other) noexcept\n-Exchange the storage and internal state with other.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:178\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-ConstIterator begin() const\n-begin ConstIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:452\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be\n-size_type size() const noexcept\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:511\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-void resize(size_type numBlocks, size_type blockSize)\n-same effect as constructor with same argument\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:210\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-IndexedIterator< typename VectorWindows::iterator > Iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:414\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\be_\bn_\bd\n-ConstIterator end() const\n-end ConstIterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:458\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-Iterator beforeBegin()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:437\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-Iterator beforeEnd()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:430\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-Iterator begin()\n-begin Iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:417\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator class for sequential creation of blocks.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:275\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const CreateIterator &it) const\n-equality\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:339\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bn_\bd_\be_\bx\n-size_type index() const\n-dereferencing\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:345\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-SizeProxy reference\n-reference type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:295\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bp_\bo_\bi_\bn_\bt_\be_\br\n-size_type * pointer\n-pointer type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:292\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const CreateIterator &it) const\n-inequality\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:333\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\b~_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-~CreateIterator()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:304\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-size_type value_type\n-value type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:281\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-CreateIterator(VariableBlockVector &_v, int _i, bool _isEnd)\n-constructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:298\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bs_\be_\bt_\bb_\bl_\bo_\bc_\bk_\bs_\bi_\bz_\be\n-void setblocksize(size_type _k)\n-set size of current block\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:351\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-size_type & operator*()\n-Access size of current block.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:362\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br_\b__\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-std::output_iterator_tag iterator_category\n-iterator category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:278\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n-CreateIterator & operator++()\n-prefix increment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:316\n-_\bD_\bu_\bn_\be_\b:_\b:_\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\br_\be_\ba_\bt_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bi_\bf_\bf_\be_\br_\be_\bn_\bc_\be_\b__\bt_\by_\bp_\be\n-void difference_type\n-difference type (unused)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:289\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< B >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:559\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< B >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn vbvector.hh:558\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz\n+Sequential overlapping Schwarz preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:755\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+X range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:770\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:765\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b:_\b:_\bs_\bu_\bb_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bv_\be_\bc_\bt_\bo_\br\n+std::vector< subdomain_type, typename std::allocator_traits< TA >::template\n+rebind_alloc< subdomain_type > > subdomain_vector\n+The vector type containing the subdomain to row index mapping.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:797\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Nonoverlapping parallel preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:276\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+P::range_type range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:284\n+_\bD_\bu_\bn_\be_\b:_\b:_\bN_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+P::domain_type domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn novlpschwarz.hh:282\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bv_\be_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bM_\bo_\bd_\be\n+Tag that tells the Schwarz method to be multiplicative.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn overlappingschwarz.hh:126\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+Class providing information about the mapping of the vertices onto aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+The (undirected) graph of a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\be_\bn_\bd\n+VertexIterator end()\n+Get an iterator over the vertices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+M::size_type VertexDescriptor\n+The vertex descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+VertexIterator begin()\n+Get an iterator over the vertices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+Iterator over all edges starting from a vertex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+The vertex iterator type of the graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:209\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+The default class for the smoother arguments.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bT_\br_\ba_\bi_\bt_\bs\n+Traits class for getting the attribute class of a smoother.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+Construction Arguments for the default smoothers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:93\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:148\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn_\b<_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:174\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bI_\bL_\bU_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bY_\b _\b>_\b _\b>\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:282\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\bp_\bp_\bl_\bi_\be_\br\n+Helper class for applying the smoothers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:370\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:537\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt_\bi_\bo_\bn_\bA_\br_\bg_\bs_\b<_\b _\bS_\be_\bq_\bO_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg_\bS_\bc_\bh_\bw_\ba_\br_\bz_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bT_\bM_\b,_\b _\bT_\bS_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:558\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bS_\bO_\bR\n+Sequential SSOR preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:142\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR\n+Sequential SOR preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:262\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:267\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bS_\bO_\bR_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:269\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bJ_\ba_\bc\n+The sequential jacobian preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:413\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\be_\bq_\bI_\bL_\bU\n+Sequential ILU preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:697\n+_\bD_\bu_\bn_\be_\b:_\b:_\bR_\bi_\bc_\bh_\ba_\br_\bd_\bs_\bo_\bn\n+Richardson preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioners.hh:878\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\ba_\br_\bS_\bS_\bO_\bR\n+A parallel SSOR preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:175\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Block parallel preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:278\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The domain type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:285\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The range type of the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn schwarz.hh:290\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00209.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00209.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: scaledidmatrix.hh File Reference\n+dune-istl: aggregates.hh File Reference\n \n \n \n \n \n \n \n@@ -65,55 +65,117 @@\n
    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n \n-
    scaledidmatrix.hh File Reference
    \n+Namespaces |\n+Functions
    \n+ \n \n
    \n \n-

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

    Provides classes for the Coloring process of AMG. \n More...

    \n-
    #include <cmath>
    \n-#include <cstddef>
    \n-#include <complex>
    \n-#include <iostream>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/fmatrix.hh>
    \n-#include <dune/common/diagonalmatrix.hh>
    \n+
    #include "parameters.hh"
    \n+#include "graph.hh"
    \n+#include "properties.hh"
    \n+#include "combinedfunctor.hh"
    \n+#include <dune/common/timer.hh>
    \n+#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/poolallocator.hh>
    \n+#include <dune/common/sllist.hh>
    \n #include <dune/common/ftraits.hh>
    \n+#include <dune/common/scalarmatrixview.hh>
    \n+#include <utility>
    \n+#include <set>
    \n+#include <algorithm>
    \n+#include <complex>
    \n+#include <limits>
    \n+#include <ostream>
    \n+#include <tuple>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n-\n+\n \n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::ScaledIdentityMatrix< K, n >
     A multiple of the identity matrix of static size. More...
    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...
     
    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::DenseMatrixAssigner< DenseMatrix, ScaledIdentityMatrix< field, N > >
    struct  Dune::Amg::FrobeniusNorm
     
    struct  Dune::FieldTraits< ScaledIdentityMatrix< K, n > >
    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...
     
    \n \n \n \n+\n+\n+

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Amg
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+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)
     
    \n

    Detailed Description

    \n-

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

    \n+

    Provides classes for the Coloring process of AMG.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,36 +1,104 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-scaledidmatrix.hh File Reference\n-This file implements a quadratic matrix of fixed size which is a multiple of\n-the identity. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+aggregates.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Provides classes for the Coloring process of AMG. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \"_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\bh_\bh\"\n+#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n+#include \"_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b._\bh_\bh\"\n+#include \"_\bc_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bf_\bu_\bn_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+#include \n+#include \n+#include \n+#include \n #include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>\n-\u00a0 A multiple of the identity matrix of static size. _\bM_\bo_\br_\be_\b._\b._\b.\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\b _\bT_\b _\b>\n+\u00a0 Base class of all aggregation criterions. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\b _\bM_\b,_\b _\bN_\b _\b>\n+\u00a0 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by policy for symmetric matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\b _\bM_\b,_\b _\bN_\b _\b>\n+\u00a0 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by policy for symmetric matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\b _\bM_\b,_\b _\bN_\b _\b>\n+\u00a0 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by policy for symmetric matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b<_\b _\bN_\b _\b>\n+\u00a0 Norm that uses only the [N][N] entry of the block to determine\n+ couplings. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\bi_\br_\bs_\bt_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+\u00a0 Norm that uses only the [0][0] entry of the block to determine\n+ couplings. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\bo_\bw_\bS_\bu_\bm\n+\u00a0 Functor using the row sum (infinity) norm to determine strong\n+ couplings. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bf_\bi_\be_\bl_\bd_\b,_\b _\bN\n- _\b>_\b _\b>\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\b _\bM_\b,_\b _\bN_\bo_\br_\bm_\b _\b>\n+\u00a0 Criterion taking advantage of symmetric matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\b _\bM_\b,_\b _\bN_\bo_\br_\bm_\b _\b>\n+\u00a0 Criterion suitable for unsymmetric matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bV_\b _\b>\n+\u00a0 Class providing information about the mapping of the vertices onto\n+ aggregates. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\b _\bV_\b _\b>_\b:_\b:_\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+\u00a0 A Dummy visitor that does nothing for each visited edge. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\b _\bG_\b,_\b _\bS_\b _\b>\n+\u00a0 A class for temporarily storing the vertices of an aggregate in.\n+ _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+ class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\b _\bG_\b _\b>\n+\u00a0 Class for building the aggregates. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n+\u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &os, const\n+ _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn< T > &criterion)\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by (G &graph, const typename C::Matrix\n+ &matrix, C criterion, bool finestLevel)\n+\u00a0 Build the dependency of the matrix graph.\n+\u00a0\n+template\n+ void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b2_\bd (const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp< V >\n+ &aggregates, int n, int m, std::ostream &os)\n+\u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-This file implements a quadratic matrix of fixed size which is a multiple of\n-the identity.\n+Provides classes for the Coloring process of AMG.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00209_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00209_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: scaledidmatrix.hh Source File\n+dune-istl: aggregates.hh Source File\n \n \n \n \n \n \n \n@@ -70,626 +70,2259 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    scaledidmatrix.hh
    \n+
    aggregates.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_SCALEDIDMATRIX_HH
    \n-
    6#define DUNE_ISTL_SCALEDIDMATRIX_HH
    \n+
    5#ifndef DUNE_AMG_AGGREGATES_HH
    \n+
    6#define DUNE_AMG_AGGREGATES_HH
    \n
    7
    \n-
    14#include <cmath>
    \n-
    15#include <cstddef>
    \n-
    16#include <complex>
    \n-
    17#include <iostream>
    \n-
    18#include <dune/common/exceptions.hh>
    \n-
    19#include <dune/common/fmatrix.hh>
    \n-
    20#include <dune/common/diagonalmatrix.hh>
    \n-
    21#include <dune/common/ftraits.hh>
    \n-
    22
    \n-
    23namespace Dune {
    \n-
    24
    \n-
    28 template<class K, int n>
    \n-
    \n-\n-
    30 {
    \n-
    31 typedef DiagonalMatrixWrapper< ScaledIdentityMatrix<K,n> > WrapperType;
    \n-
    32
    \n-
    33 public:
    \n-
    34 //===== type definitions and constants
    \n-
    35
    \n-
    37 typedef K field_type;
    \n-
    38
    \n-
    40 typedef K block_type;
    \n-
    41
    \n-
    43 typedef std::size_t size_type;
    \n-
    44
    \n-
    46 typedef DiagonalRowVector<K,n> row_type;
    \n-\n-
    48 typedef DiagonalRowVectorConst<K,n> const_row_type;
    \n-\n+
    8
    \n+
    9#include "parameters.hh"
    \n+
    10#include "graph.hh"
    \n+
    11#include "properties.hh"
    \n+
    12#include "combinedfunctor.hh"
    \n+
    13
    \n+
    14#include <dune/common/timer.hh>
    \n+
    15#include <dune/common/stdstreams.hh>
    \n+
    16#include <dune/common/poolallocator.hh>
    \n+
    17#include <dune/common/sllist.hh>
    \n+
    18#include <dune/common/ftraits.hh>
    \n+
    19#include <dune/common/scalarmatrixview.hh>
    \n+
    20
    \n+
    21#include <utility>
    \n+
    22#include <set>
    \n+
    23#include <algorithm>
    \n+
    24#include <complex>
    \n+
    25#include <limits>
    \n+
    26#include <ostream>
    \n+
    27#include <tuple>
    \n+
    28
    \n+
    29namespace Dune
    \n+
    30{
    \n+
    31 namespace Amg
    \n+
    32 {
    \n+
    33
    \n+
    47 template<class T>
    \n+
    \n+
    48 class AggregationCriterion : public T
    \n+
    49 {
    \n
    50
    \n-
    52 enum {
    \n-
    54 rows = n,
    \n-
    56 cols = n
    \n-
    57 };
    \n-
    58
    \n-
    59 //===== constructors
    \n-\n-
    63
    \n+
    51 public:
    \n+\n+
    56
    \n
    \n-\n-
    67 : p_(k)
    \n-
    68 {}
    \n+\n+
    67 : T()
    \n+
    68 {}
    \n
    \n
    69
    \n-
    70 //===== assignment from scalar
    \n-
    \n-\n-
    72 {
    \n-
    73 p_ = k;
    \n-
    74 return *this;
    \n-
    75 }
    \n-
    \n-
    76
    \n-
    77 // check if matrix is identical to other matrix (not only identical values)
    \n-
    \n-
    78 bool identical(const ScaledIdentityMatrix<K,n>& other) const
    \n-
    79 {
    \n-
    80 return (this==&other);
    \n-
    81 }
    \n-
    \n-
    82
    \n-
    83 //===== iterator interface to rows of the matrix
    \n-
    85 typedef ContainerWrapperIterator<const WrapperType, reference, reference> Iterator;
    \n-\n-\n-
    91 typedef typename row_type::Iterator ColIterator;
    \n-
    92
    \n-
    \n-\n-
    95 {
    \n-
    96 return Iterator(WrapperType(this),0);
    \n-
    97 }
    \n-
    \n-
    98
    \n-
    \n-\n-
    101 {
    \n-
    102 return Iterator(WrapperType(this),n);
    \n-
    103 }
    \n-
    \n-
    104
    \n-
    \n-\n-
    108 {
    \n-
    109 return Iterator(WrapperType(this),n-1);
    \n-
    110 }
    \n+
    \n+\n+
    71 : T(parms)
    \n+
    72 {}
    \n+
    \n+
    \n+
    82 void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
    \n+
    83 {
    \n+
    84 this->setMaxDistance(diameter-1);
    \n+
    85 std::size_t csize=1;
    \n+
    86
    \n+
    87 for(; dim>0; dim--) {
    \n+
    88 csize*=diameter;
    \n+
    89 this->setMaxDistance(this->maxDistance()+diameter-1);
    \n+
    90 }
    \n+
    91 this->setMinAggregateSize(csize);
    \n+
    92 this->setMaxAggregateSize(static_cast<std::size_t>(csize*1.5));
    \n+
    93 }
    \n+
    \n+
    94
    \n+
    \n+
    105 void setDefaultValuesAnisotropic(std::size_t dim,std::size_t diameter=2)
    \n+
    106 {
    \n+
    107 setDefaultValuesIsotropic(dim, diameter);
    \n+
    108 this->setMaxDistance(this->maxDistance()+dim-1);
    \n+
    109 }
    \n
    \n-
    111
    \n-
    \n-\n-
    115 {
    \n-
    116 return Iterator(WrapperType(this),-1);
    \n-
    117 }
    \n-
    \n-
    118
    \n-
    119
    \n-
    121 typedef ContainerWrapperIterator<const WrapperType, const_reference, const_reference> ConstIterator;
    \n-\n-\n-
    127 typedef typename const_row_type::ConstIterator ConstColIterator;
    \n-
    128
    \n-
    \n-\n-
    131 {
    \n-
    132 return ConstIterator(WrapperType(this),0);
    \n-
    133 }
    \n-
    \n-
    134
    \n-
    \n-\n-
    137 {
    \n-
    138 return ConstIterator(WrapperType(this),n);
    \n-
    139 }
    \n+
    110 };
    \n
    \n+
    111
    \n+
    112 template<class T>
    \n+
    \n+
    113 std::ostream& operator<<(std::ostream& os, const AggregationCriterion<T>& criterion)
    \n+
    114 {
    \n+
    115 os<<"{ maxdistance="<<criterion.maxDistance()<<" minAggregateSize="
    \n+
    116 <<criterion.minAggregateSize()<< " maxAggregateSize="<<criterion.maxAggregateSize()
    \n+
    117 <<" connectivity="<<criterion.maxConnectivity()<<" debugLevel="<<criterion.debugLevel()<<"}";
    \n+
    118 return os;
    \n+
    119 }
    \n+
    \n+
    120
    \n+
    132 template<class M, class N>
    \n+
    \n+\n+
    134 {
    \n+
    135 public:
    \n+
    139 typedef M Matrix;
    \n
    140
    \n-
    \n-\n-
    144 {
    \n-
    145 return ConstIterator(WrapperType(this),n-1);
    \n-
    146 }
    \n-
    \n-
    147
    \n-
    \n-\n-
    151 {
    \n-
    152 return ConstIterator(WrapperType(this),-1);
    \n-
    153 }
    \n-
    \n-
    154
    \n-
    155 //===== vector space arithmetic
    \n-
    156
    \n-
    \n-\n-
    159 {
    \n-
    160 p_ += y.p_;
    \n-
    161 return *this;
    \n-
    162 }
    \n-
    \n-
    163
    \n-
    \n-\n-
    166 {
    \n-
    167 p_ -= y.p_;
    \n-
    168 return *this;
    \n-
    169 }
    \n-
    \n-
    170
    \n-
    \n-\n-
    173 {
    \n-
    174 p_ += k;
    \n-
    175 return *this;
    \n-
    176 }
    \n-
    \n-
    177
    \n-
    \n-\n-
    180 {
    \n-
    181 p_ -= k;
    \n-
    182 return *this;
    \n-
    183 }
    \n-
    \n-
    \n-\n-
    186 {
    \n-
    187 p_ *= k;
    \n-
    188 return *this;
    \n-
    189 }
    \n-
    \n+
    144 typedef N Norm;
    \n+
    145
    \n+
    149 typedef typename Matrix::row_type Row;
    \n+
    150
    \n+\n+
    155
    \n+
    156 void init(const Matrix* matrix);
    \n+
    157
    \n+
    158 void initRow(const Row& row, int index);
    \n+
    159
    \n+
    160 void examine(const ColIter& col);
    \n+
    161
    \n+
    162 template<class G>
    \n+
    163 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
    \n+
    164
    \n+
    165 bool isIsolated();
    \n+
    166
    \n+
    167
    \n+
    \n+\n+
    169 : Parameters(parms)
    \n+
    170 {}
    \n+
    \n+
    \n+\n+
    172 : Parameters()
    \n+
    173 {}
    \n+
    \n+
    174
    \n+
    175 protected:
    \n+\n+\n+
    180 typedef typename FieldTraits<field_type>::real_type real_type;
    \n+\n+\n+
    185 int row_;
    \n+\n+
    188 std::vector<real_type> vals_;
    \n+
    189 typename std::vector<real_type>::iterator valIter_;
    \n
    190
    \n-
    \n-\n-
    193 {
    \n-
    194 p_ /= k;
    \n-
    195 return *this;
    \n-
    196 }
    \n+
    191 };
    \n
    \n-
    197
    \n-
    198 //===== binary operators
    \n-
    199
    \n-
    201 template <class Scalar,
    \n-
    202 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
    \n-
    \n-
    203 friend auto operator* ( const ScaledIdentityMatrix& matrix, Scalar scalar)
    \n-
    204 {
    \n-\n-
    206 }
    \n+
    192
    \n+
    193
    \n+
    194 template<class M, class N>
    \n+
    \n+\n+
    196 {
    \n+
    197 matrix_ = matrix;
    \n+
    198 }
    \n
    \n+
    199
    \n+
    200 template<class M, class N>
    \n+
    \n+
    201 inline void SymmetricMatrixDependency<M,N>::initRow(const Row& row, int index)
    \n+
    202 {
    \n+
    203 using std::min;
    \n+
    204 vals_.assign(row.size(), 0.0);
    \n+
    205 assert(vals_.size()==row.size());
    \n+
    206 valIter_=vals_.begin();
    \n
    207
    \n-
    209 template <class Scalar,
    \n-
    210 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
    \n-
    \n-
    211 friend auto operator* (Scalar scalar, const ScaledIdentityMatrix& matrix)
    \n-
    212 {
    \n-\n-
    214 }
    \n-
    \n-
    215
    \n-
    216 //===== comparison ops
    \n-
    217
    \n-
    \n-
    219 bool operator==(const ScaledIdentityMatrix& other) const
    \n-
    220 {
    \n-
    221 return p_==other.scalar();
    \n-
    222 }
    \n-
    \n-
    223
    \n-
    \n-
    225 bool operator!=(const ScaledIdentityMatrix& other) const
    \n-
    226 {
    \n-
    227 return p_!=other.scalar();
    \n-
    228 }
    \n-
    \n-
    229
    \n-
    230 //===== linear maps
    \n-
    231
    \n-
    233 template<class X, class Y>
    \n-
    \n-
    234 void mv (const X& x, Y& y) const
    \n-
    235 {
    \n-
    236#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    237 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    238 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    239#endif
    \n-
    240 for (size_type i=0; i<n; ++i)
    \n-
    241 y[i] = p_ * x[i];
    \n-
    242 }
    \n-
    \n-
    243
    \n-
    245 template<class X, class Y>
    \n-
    \n-
    246 void mtv (const X& x, Y& y) const
    \n-
    247 {
    \n-
    248 mv(x, y);
    \n-
    249 }
    \n-
    \n-
    250
    \n-
    252 template<class X, class Y>
    \n-
    \n-
    253 void umv (const X& x, Y& y) const
    \n-
    254 {
    \n-
    255#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    256 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    257 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    258#endif
    \n-
    259 for (size_type i=0; i<n; ++i)
    \n-
    260 y[i] += p_ * x[i];
    \n-
    261 }
    \n-
    \n-
    262
    \n-
    264 template<class X, class Y>
    \n-
    \n-
    265 void umtv (const X& x, Y& y) const
    \n-
    266 {
    \n-
    267#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    268 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    269 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    270#endif
    \n-
    271 for (size_type i=0; i<n; ++i)
    \n-
    272 y[i] += p_ * x[i];
    \n-
    273 }
    \n-
    \n+
    208 maxValue_ = min(- std::numeric_limits<real_type>::max(), std::numeric_limits<real_type>::min());
    \n+
    209 diagonal_=norm_(row[index]);
    \n+
    210 row_ = index;
    \n+
    211 }
    \n+
    \n+
    212
    \n+
    213 template<class M, class N>
    \n+
    \n+\n+
    215 {
    \n+
    216 using std::max;
    \n+
    217 // skip positive offdiagonals if norm preserves sign of them.
    \n+
    218 real_type eij = norm_(*col);
    \n+
    219 if(!N::is_sign_preserving || eij<0) // || eji<0)
    \n+
    220 {
    \n+
    221 *valIter_ = eij/diagonal_*eij/norm_(matrix_->operator[](col.index())[col.index()]);
    \n+
    222 maxValue_ = max(maxValue_, *valIter_);
    \n+
    223 }else
    \n+
    224 *valIter_ =0;
    \n+
    225 ++valIter_;
    \n+
    226 }
    \n+
    \n+
    227
    \n+
    228 template<class M, class N>
    \n+
    229 template<class G>
    \n+
    \n+
    230 inline void SymmetricMatrixDependency<M,N>::examine(G&, const typename G::EdgeIterator& edge, const ColIter&)
    \n+
    231 {
    \n+
    232 if(*valIter_ > alpha() * maxValue_) {
    \n+
    233 edge.properties().setDepends();
    \n+
    234 edge.properties().setInfluences();
    \n+
    235 }
    \n+
    236 ++valIter_;
    \n+
    237 }
    \n+
    \n+
    238
    \n+
    239 template<class M, class N>
    \n+
    \n+\n+
    241 {
    \n+
    242 if(diagonal_==0)
    \n+
    243 DUNE_THROW(Dune::ISTLError, "No diagonal entry for row "<<row_<<".");
    \n+
    244 valIter_=vals_.begin();
    \n+
    245 return maxValue_ < beta();
    \n+
    246 }
    \n+
    \n+
    247
    \n+
    251 template<class M, class N>
    \n+
    \n+
    252 class Dependency : public Parameters
    \n+
    253 {
    \n+
    254 public:
    \n+
    258 typedef M Matrix;
    \n+
    259
    \n+
    263 typedef N Norm;
    \n+
    264
    \n+
    268 typedef typename Matrix::row_type Row;
    \n+
    269
    \n+\n
    274
    \n-
    276 template<class X, class Y>
    \n-
    \n-
    277 void umhv (const X& x, Y& y) const
    \n-
    278 {
    \n-
    279#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    280 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    281 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    282#endif
    \n-
    283 for (size_type i=0; i<n; i++)
    \n-
    284 y[i] += conjugateComplex(p_)*x[i];
    \n-
    285 }
    \n-
    \n-
    286
    \n-
    288 template<class X, class Y>
    \n-
    \n-
    289 void mmv (const X& x, Y& y) const
    \n-
    290 {
    \n-
    291#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    292 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    293 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    294#endif
    \n-
    295 for (size_type i=0; i<n; ++i)
    \n-
    296 y[i] -= p_ * x[i];
    \n-
    297 }
    \n-
    \n-
    298
    \n-
    300 template<class X, class Y>
    \n-
    \n-
    301 void mmtv (const X& x, Y& y) const
    \n-
    302 {
    \n-
    303#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    304 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    305 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    306#endif
    \n-
    307 for (size_type i=0; i<n; ++i)
    \n-
    308 y[i] -= p_ * x[i];
    \n-
    309 }
    \n-
    \n-
    310
    \n-
    312 template<class X, class Y>
    \n-
    \n-
    313 void mmhv (const X& x, Y& y) const
    \n-
    314 {
    \n-
    315#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    316 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    317 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    318#endif
    \n-
    319 for (size_type i=0; i<n; i++)
    \n-
    320 y[i] -= conjugateComplex(p_)*x[i];
    \n-
    321 }
    \n-
    \n-
    322
    \n-
    324 template<class X, class Y>
    \n-
    \n-
    325 void usmv (const K& alpha, const X& x, Y& y) const
    \n-
    326 {
    \n-
    327#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    328 if (x.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    329 if (y.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    330#endif
    \n-
    331 for (size_type i=0; i<n; i++)
    \n-
    332 y[i] += alpha * p_ * x[i];
    \n-
    333 }
    \n-
    \n-
    334
    \n-
    336 template<class X, class Y>
    \n-
    \n-
    337 void usmtv (const K& alpha, const X& x, Y& y) const
    \n-
    338 {
    \n-
    339#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    340 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    341 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    342#endif
    \n-
    343 for (size_type i=0; i<n; i++)
    \n-
    344 y[i] += alpha * p_ * x[i];
    \n-
    345 }
    \n-
    \n+
    275 void init(const Matrix* matrix);
    \n+
    276
    \n+
    277 void initRow(const Row& row, int index);
    \n+
    278
    \n+
    279 void examine(const ColIter& col);
    \n+
    280
    \n+
    281 template<class G>
    \n+
    282 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
    \n+
    283
    \n+\n+
    285
    \n+
    \n+
    286 Dependency(const Parameters& parms)
    \n+
    287 : Parameters(parms)
    \n+
    288 {}
    \n+
    \n+
    289
    \n+
    \n+\n+
    291 : Parameters()
    \n+
    292 {}
    \n+
    \n+
    293
    \n+
    294 protected:
    \n+\n+\n+
    299 typedef typename FieldTraits<field_type>::real_type real_type;
    \n+\n+\n+
    304 int row_;
    \n+\n+
    307 };
    \n+
    \n+
    308
    \n+
    312 template<class M, class N>
    \n+
    \n+\n+
    314 {
    \n+
    315 public:
    \n+
    319 typedef M Matrix;
    \n+
    320
    \n+
    324 typedef N Norm;
    \n+
    325
    \n+
    329 typedef typename Matrix::row_type Row;
    \n+
    330
    \n+\n+
    335
    \n+
    336 void init(const Matrix* matrix);
    \n+
    337
    \n+
    338 void initRow(const Row& row, int index);
    \n+
    339
    \n+
    340 void examine(const ColIter& col);
    \n+
    341
    \n+
    342 template<class G>
    \n+
    343 void examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col);
    \n+
    344
    \n+\n
    346
    \n-
    348 template<class X, class Y>
    \n-
    \n-
    349 void usmhv (const K& alpha, const X& x, Y& y) const
    \n-
    350 {
    \n-
    351#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    352 if (x.N()!=N()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    353 if (y.N()!=M()) DUNE_THROW(FMatrixError,"index out of range");
    \n-
    354#endif
    \n-
    355 for (size_type i=0; i<n; i++)
    \n-
    356 y[i] += alpha * conjugateComplex(p_) * x[i];
    \n-
    357 }
    \n-
    \n-
    358
    \n-
    359 //===== norms
    \n-
    360
    \n-
    \n-
    362 typename FieldTraits<field_type>::real_type frobenius_norm () const
    \n-
    363 {
    \n-
    364 return fvmeta::sqrt(n*p_*p_);
    \n-
    365 }
    \n-
    \n-
    366
    \n-
    \n-
    368 typename FieldTraits<field_type>::real_type frobenius_norm2 () const
    \n-
    369 {
    \n-
    370 return n*p_*p_;
    \n-
    371 }
    \n+
    347
    \n+
    \n+\n+
    349 : Parameters(parms)
    \n+
    350 {}
    \n+
    \n+
    \n+\n+
    352 : Parameters()
    \n+
    353 {}
    \n+
    \n+
    354
    \n+
    355 protected:
    \n+\n+\n+
    360 typedef typename FieldTraits<field_type>::real_type real_type;
    \n+\n+\n+
    365 int row_;
    \n+\n+
    368 private:
    \n+
    369 void initRow(const Row& row, int index, const std::true_type&);
    \n+
    370 void initRow(const Row& row, int index, const std::false_type&);
    \n+
    371 };
    \n
    \n
    372
    \n-
    \n-
    374 typename FieldTraits<field_type>::real_type infinity_norm () const
    \n-
    375 {
    \n-
    376 return std::abs(p_);
    \n-
    377 }
    \n-
    \n-
    378
    \n-
    \n-
    380 typename FieldTraits<field_type>::real_type infinity_norm_real () const
    \n-
    381 {
    \n-
    382 return fvmeta::absreal(p_);
    \n-
    383 }
    \n-
    \n+
    377 template<int N>
    \n+
    \n+\n+
    379 {
    \n+
    380 public:
    \n+
    381 enum { /* @brief We preserve the sign.*/
    \n+
    382 is_sign_preserving = true
    \n+
    383 };
    \n
    384
    \n-
    385 //===== solve
    \n-
    386
    \n-
    389 template<class V>
    \n+
    389 template<class M>
    \n
    \n-
    390 void solve (V& x, const V& b) const
    \n-
    391 {
    \n-
    392 for (int i=0; i<n; i++)
    \n-
    393 x[i] = b[i]/p_;
    \n-
    394 }
    \n-
    \n-
    395
    \n-
    \n-
    398 void invert()
    \n-
    399 {
    \n-
    400 p_ = 1/p_;
    \n-
    401 }
    \n-
    \n-
    402
    \n-
    \n-
    404 K determinant () const {
    \n-
    405 return std::pow(p_,n);
    \n-
    406 }
    \n-
    \n-
    407
    \n-
    408 //===== sizes
    \n-
    409
    \n-
    \n-
    411 size_type N () const
    \n-
    412 {
    \n-
    413 return n;
    \n-
    414 }
    \n+
    390 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m,
    \n+
    391 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr) const
    \n+
    392 {
    \n+
    393 typedef typename M::field_type field_type;
    \n+
    394 typedef typename FieldTraits<field_type>::real_type real_type;
    \n+
    395 static_assert( std::is_convertible<field_type, real_type >::value,
    \n+
    396 "use of diagonal norm in AMG not implemented for complex field_type");
    \n+
    397 return m[N][N];
    \n+
    398 // possible implementation for complex types: return signed_abs(m[N][N]);
    \n+
    399 }
    \n+
    \n+
    400
    \n+
    405 template<class M>
    \n+
    \n+
    406 auto operator()(const M& m,
    \n+
    407 typename std::enable_if_t<Dune::IsNumber<M>::value>* sfinae = nullptr) const
    \n+
    408 {
    \n+
    409 typedef typename FieldTraits<M>::real_type real_type;
    \n+
    410 static_assert( std::is_convertible<M, real_type >::value,
    \n+
    411 "use of diagonal norm in AMG not implemented for complex field_type");
    \n+
    412 return m;
    \n+
    413 // possible implementation for complex types: return signed_abs(m[N][N]);
    \n+
    414 }
    \n
    \n
    415
    \n-
    \n-
    417 size_type M () const
    \n-
    418 {
    \n-
    419 return n;
    \n-
    420 }
    \n-
    \n-
    421
    \n-
    422 //===== query
    \n-
    423
    \n-
    \n-
    425 bool exists (size_type i, size_type j) const
    \n-
    426 {
    \n-
    427#ifdef DUNE_FMatrix_WITH_CHECKING
    \n-
    428 if (i<0 || i>=n) DUNE_THROW(FMatrixError,"row index out of range");
    \n-
    429 if (j<0 || j>=n) DUNE_THROW(FMatrixError,"column index out of range");
    \n-
    430#endif
    \n-
    431 return i==j;
    \n-
    432 }
    \n-
    \n+
    416 private:
    \n+
    417
    \n+
    419 template<typename T>
    \n+
    420 static T signed_abs(const T & v)
    \n+
    421 {
    \n+
    422 return v;
    \n+
    423 }
    \n+
    424
    \n+
    426 template<typename T>
    \n+
    427 static T signed_abs(const std::complex<T> & v)
    \n+
    428 {
    \n+
    429 // return sign * abs_value
    \n+
    430 // in case of complex numbers this extends to using the csgn function to determine the sign
    \n+
    431 return csgn(v) * std::abs(v);
    \n+
    432 }
    \n
    433
    \n-
    434 //===== conversion operator
    \n-
    435
    \n-
    \n-
    437 friend std::ostream& operator<< (std::ostream& s, const ScaledIdentityMatrix<K,n>& a)
    \n-
    438 {
    \n-
    439 for (size_type i=0; i<n; i++) {
    \n-
    440 for (size_type j=0; j<n; j++)
    \n-
    441 s << ((i==j) ? a.p_ : 0) << " ";
    \n-
    442 s << std::endl;
    \n-
    443 }
    \n-
    444 return s;
    \n-
    445 }
    \n-
    \n-
    446
    \n-
    \n-\n-
    449 {
    \n-
    450 return reference(const_cast<K*>(&p_), i);
    \n-
    451 }
    \n-
    \n-
    452
    \n-
    \n-\n-
    455 {
    \n-
    456 return const_reference(const_cast<K*>(&p_), i);
    \n-
    457 }
    \n-
    \n-
    458
    \n-
    \n-
    460 const K& diagonal(size_type /*i*/) const
    \n-
    461 {
    \n-
    462 return p_;
    \n-
    463 }
    \n-
    \n+
    435 template<typename T>
    \n+
    436 static T csgn(const T & v)
    \n+
    437 {
    \n+
    438 return (T(0) < v) - (v < T(0));
    \n+
    439 }
    \n+
    440
    \n+
    442 template<typename T>
    \n+
    443 static T csgn(std::complex<T> a)
    \n+
    444 {
    \n+
    445 return csgn(a.real())+(a.real() == 0.0)*csgn(a.imag());
    \n+
    446 }
    \n+
    447
    \n+
    448 };
    \n+
    \n+
    449
    \n+
    \n+
    454 class FirstDiagonal : public Diagonal<0>
    \n+
    455 {};
    \n+
    \n+
    456
    \n+
    \n+
    462 struct RowSum
    \n+
    463 {
    \n
    464
    \n-
    \n-\n-
    467 {
    \n-
    468 return p_;
    \n-
    469 }
    \n-
    \n-
    470
    \n+
    465 enum { /* @brief We preserve the sign.*/
    \n+
    466 is_sign_preserving = false
    \n+
    467 };
    \n+
    472 template<class M>
    \n
    \n-
    473 const K& scalar() const
    \n-
    474 {
    \n-
    475 return p_;
    \n-
    476 }
    \n-
    \n-
    477
    \n-
    \n-\n-
    481 {
    \n-
    482 return p_;
    \n-
    483 }
    \n-
    \n-
    484
    \n-
    485 private:
    \n-
    486 // the data, very simply a single number
    \n-
    487 K p_;
    \n-
    488
    \n-
    489 };
    \n-
    \n-
    490
    \n-
    491 template <class DenseMatrix, class field, int N>
    \n-
    \n-
    492 struct DenseMatrixAssigner<DenseMatrix, ScaledIdentityMatrix<field, N>> {
    \n-
    \n-
    493 static void apply(DenseMatrix& denseMatrix,
    \n-\n-
    495 assert(denseMatrix.M() == N);
    \n-
    496 assert(denseMatrix.N() == N);
    \n-
    497 denseMatrix = field(0);
    \n-
    498 for (int i = 0; i < N; ++i)
    \n-
    499 denseMatrix[i][i] = rhs.scalar();
    \n-
    500 }
    \n-
    \n-
    501 };
    \n-
    \n-
    502
    \n-
    503 template<class K, int n>
    \n-
    \n-
    504 struct FieldTraits< ScaledIdentityMatrix<K, n> >
    \n-
    505 {
    \n-\n-
    507 using real_type = typename FieldTraits<field_type>::real_type;
    \n-
    508 };
    \n-
    \n-
    509
    \n-
    510} // end namespace
    \n-
    511
    \n-
    512#endif
    \n+
    473 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
    \n+
    474 {
    \n+
    475 return m.infinity_norm();
    \n+
    476 }
    \n+
    \n+
    477 };
    \n+
    \n+
    478
    \n+
    \n+\n+
    480 {
    \n+
    481
    \n+
    482 enum { /* @brief We preserve the sign.*/
    \n+
    483 is_sign_preserving = false
    \n+
    484 };
    \n+
    489 template<class M>
    \n+
    \n+
    490 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
    \n+
    491 {
    \n+
    492 return m.frobenius_norm();
    \n+
    493 }
    \n+
    \n+
    494 };
    \n+
    \n+
    \n+\n+
    496 {
    \n+
    497
    \n+
    498 enum { /* @brief We preserve the sign.*/
    \n+
    499 is_sign_preserving = false
    \n+
    500 };
    \n+
    505 template<class M>
    \n+
    \n+
    506 typename FieldTraits<typename M::field_type>::real_type operator()(const M& m) const
    \n+
    507 {
    \n+
    508 return 1;
    \n+
    509 }
    \n+
    \n+
    510 };
    \n+
    \n+
    517 template<class M, class Norm>
    \n+
    \n+
    518 class SymmetricCriterion : public AggregationCriterion<SymmetricDependency<M,Norm> >
    \n+
    519 {
    \n+
    520 public:
    \n+
    \n+\n+\n+
    523 {}
    \n+
    \n+
    \n+\n+
    525 {}
    \n+
    \n+
    526 };
    \n+
    \n+
    527
    \n+
    528
    \n+
    537 template<class M, class Norm>
    \n+
    \n+
    538 class UnSymmetricCriterion : public AggregationCriterion<Dependency<M,Norm> >
    \n+
    539 {
    \n+
    540 public:
    \n+
    \n+\n+\n+
    543 {}
    \n+
    \n+
    \n+\n+
    545 {}
    \n+
    \n+
    546 };
    \n+
    \n+
    547 // forward declaration
    \n+
    548 template<class G> class Aggregator;
    \n+
    549
    \n+
    550
    \n+
    558 template<class V>
    \n+
    \n+\n+
    560 {
    \n+
    561 public:
    \n+
    562
    \n+
    566 static const V UNAGGREGATED;
    \n+
    567
    \n+
    571 static const V ISOLATED;
    \n+\n+
    576
    \n+\n+
    581
    \n+
    586 typedef PoolAllocator<VertexDescriptor,100> Allocator;
    \n+
    587
    \n+
    592 typedef SLList<VertexDescriptor,Allocator> VertexList;
    \n+
    593
    \n+
    \n+\n+
    598 {
    \n+
    599 public:
    \n+
    600 template<class EdgeIterator>
    \n+
    \n+
    601 void operator()([[maybe_unused]] const EdgeIterator& edge) const
    \n+
    602 {}
    \n+
    \n+
    603 };
    \n+
    \n+
    604
    \n+
    605
    \n+\n+
    610
    \n+\n+
    617
    \n+\n+
    622
    \n+
    634 template<class M, class G, class C>
    \n+
    635 std::tuple<int,int,int,int> buildAggregates(const M& matrix, G& graph, const C& criterion,
    \n+
    636 bool finestLevel);
    \n+
    637
    \n+
    655 template<bool reset, class G, class F, class VM>
    \n+
    656 std::size_t breadthFirstSearch(const VertexDescriptor& start,
    \n+
    657 const AggregateDescriptor& aggregate,
    \n+
    658 const G& graph,
    \n+
    659 F& aggregateVisitor,
    \n+
    660 VM& visitedMap) const;
    \n+
    661
    \n+
    685 template<bool remove, bool reset, class G, class L, class F1, class F2, class VM>
    \n+
    686 std::size_t breadthFirstSearch(const VertexDescriptor& start,
    \n+
    687 const AggregateDescriptor& aggregate,
    \n+
    688 const G& graph, L& visited, F1& aggregateVisitor,
    \n+
    689 F2& nonAggregateVisitor,
    \n+
    690 VM& visitedMap) const;
    \n+
    691
    \n+
    697 void allocate(std::size_t noVertices);
    \n+
    698
    \n+
    702 std::size_t noVertices() const;
    \n+
    703
    \n+
    707 void free();
    \n+
    708
    \n+\n+
    715
    \n+\n+
    722
    \n+\n+
    724
    \n+
    \n+\n+
    726 {
    \n+
    727 return aggregates_;
    \n+
    728 }
    \n+
    \n+
    729
    \n+
    \n+\n+
    731 {
    \n+
    732 return aggregates_+noVertices();
    \n+
    733 }
    \n+
    \n+
    734
    \n+\n+
    736
    \n+
    \n+\n+
    738 {
    \n+
    739 return aggregates_;
    \n+
    740 }
    \n+
    \n+
    741
    \n+
    \n+\n+
    743 {
    \n+
    744 return aggregates_+noVertices();
    \n+
    745 }
    \n+
    \n+
    746 private:
    \n+
    748 AggregatesMap(const AggregatesMap<V>&) = delete;
    \n+
    750 AggregatesMap<V>& operator=(const AggregatesMap<V>&) = delete;
    \n+
    751
    \n+
    755 AggregateDescriptor* aggregates_;
    \n+
    756
    \n+
    760 std::size_t noVertices_;
    \n+
    761 };
    \n+
    \n+
    762
    \n+
    766 template<class G, class C>
    \n+
    767 void buildDependency(G& graph,
    \n+
    768 const typename C::Matrix& matrix,
    \n+
    769 C criterion,
    \n+
    770 bool finestLevel);
    \n+
    771
    \n+
    776 template<class G, class S>
    \n+
    \n+\n+
    778 {
    \n+
    779
    \n+
    780 public:
    \n+
    781
    \n+
    782 /***
    \n+
    783 * @brief The type of the matrix graph we work with.
    \n+
    784 */
    \n+
    785 typedef G MatrixGraph;
    \n+\n+
    790
    \n+
    795 typedef PoolAllocator<Vertex,100> Allocator;
    \n+
    796
    \n+
    801 typedef S VertexSet;
    \n+
    802
    \n+
    804 typedef typename VertexSet::const_iterator const_iterator;
    \n+
    805
    \n+
    809 typedef std::size_t* SphereMap;
    \n+
    810
    \n+\n+
    820 VertexSet& connectivity, std::vector<Vertex>& front_);
    \n+
    821
    \n+
    \n+\n+
    823 {
    \n+
    824 --id_;
    \n+
    825 }
    \n+
    \n+
    826
    \n+
    833 void reconstruct(const Vertex& vertex);
    \n+
    834
    \n+
    838 void seed(const Vertex& vertex);
    \n+
    839
    \n+
    843 void add(const Vertex& vertex);
    \n+
    844
    \n+
    845 void add(std::vector<Vertex>& vertex);
    \n+
    849 void clear();
    \n+
    850
    \n+
    854 typename VertexSet::size_type size();
    \n+
    858 typename VertexSet::size_type connectSize();
    \n+
    859
    \n+
    863 int id();
    \n+
    864
    \n+\n+
    867
    \n+\n+
    870
    \n+
    871 private:
    \n+
    875 VertexSet vertices_;
    \n+
    876
    \n+
    881 int id_;
    \n+
    882
    \n+
    886 MatrixGraph& graph_;
    \n+
    887
    \n+
    891 AggregatesMap<Vertex>& aggregates_;
    \n+
    892
    \n+
    896 VertexSet& connected_;
    \n+
    897
    \n+
    901 std::vector<Vertex>& front_;
    \n+
    902 };
    \n+
    \n+
    903
    \n+
    907 template<class G>
    \n+
    \n+\n+
    909 {
    \n+
    910 public:
    \n+
    911
    \n+
    915 typedef G MatrixGraph;
    \n+
    916
    \n+\n+
    921
    \n+\n+
    924
    \n+\n+
    929
    \n+\n+
    934
    \n+
    951 template<class M, class C>
    \n+
    952 std::tuple<int,int,int,int> build(const M& m, G& graph,
    \n+
    953 AggregatesMap<Vertex>& aggregates, const C& c,
    \n+
    954 bool finestLevel);
    \n+
    955 private:
    \n+
    960 typedef PoolAllocator<Vertex,100> Allocator;
    \n+
    961
    \n+
    965 typedef SLList<Vertex,Allocator> VertexList;
    \n+
    966
    \n+
    970 typedef std::set<Vertex,std::less<Vertex>,Allocator> VertexSet;
    \n+
    971
    \n+
    975 typedef std::size_t* SphereMap;
    \n+
    976
    \n+
    980 MatrixGraph* graph_;
    \n+
    981
    \n+\n+
    986
    \n+
    990 std::vector<Vertex> front_;
    \n+
    991
    \n+
    995 VertexSet connected_;
    \n+
    996
    \n+
    1000 int size_;
    \n+
    1001
    \n+
    1005 class Stack
    \n+
    1006 {
    \n+
    1007 public:
    \n+
    1008 static const Vertex NullEntry;
    \n+
    1009
    \n+
    1010 Stack(const MatrixGraph& graph,
    \n+
    1011 const Aggregator<G>& aggregatesBuilder,
    \n+
    1012 const AggregatesMap<Vertex>& aggregates);
    \n+\n+\n+
    1015 private:
    \n+
    1016 enum { N = 1300000 };
    \n+
    1017
    \n+
    1019 const MatrixGraph& graph_;
    \n+
    1021 const Aggregator<G>& aggregatesBuilder_;
    \n+
    1023 const AggregatesMap<Vertex>& aggregates_;
    \n+
    1025 int size_;
    \n+
    1026 Vertex maxSize_;
    \n+
    1028 typename MatrixGraph::ConstVertexIterator begin_;
    \n+\n+
    1030
    \n+
    1032 Vertex* vals_;
    \n+
    1033
    \n+
    1034 };
    \n+
    1035
    \n+
    1036 friend class Stack;
    \n+
    1037
    \n+
    1048 template<class V>
    \n+
    1049 void visitAggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate,
    \n+
    1050 const AggregatesMap<Vertex>& aggregates,
    \n+
    1051 V& visitor) const;
    \n+
    1052
    \n+
    1057 template<class V>
    \n+
    1058 class AggregateVisitor
    \n+
    1059 {
    \n+
    1060 public:
    \n+
    1064 typedef V Visitor;
    \n+\n+
    1073 Visitor& visitor);
    \n+
    1074
    \n+
    1081 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n+
    1082
    \n+
    1083 private:
    \n+
    1085 const AggregatesMap<Vertex>& aggregates_;
    \n+
    1087 AggregateDescriptor aggregate_;
    \n+
    1089 Visitor* visitor_;
    \n+
    1090 };
    \n+
    1091
    \n+
    1095 class Counter
    \n+
    1096 {
    \n+
    1097 public:
    \n+\n+
    1101 int value();
    \n+
    1102
    \n+
    1103 protected:
    \n+\n+\n+
    1108
    \n+
    1109 private:
    \n+
    1110 int count_;
    \n+
    1111 };
    \n+
    1112
    \n+
    1113
    \n+
    1118 class FrontNeighbourCounter : public Counter
    \n+
    1119 {
    \n+
    1120 public:
    \n+\n+
    1126
    \n+
    1127 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n+
    1128
    \n+
    1129 private:
    \n+
    1130 const MatrixGraph& graph_;
    \n+
    1131 };
    \n+
    1132
    \n+
    1137 int noFrontNeighbours(const Vertex& vertex) const;
    \n+
    1138
    \n+
    1142 class TwoWayCounter : public Counter
    \n+
    1143 {
    \n+
    1144 public:
    \n+
    1145 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n+
    1146 };
    \n+
    1147
    \n+
    1159 int twoWayConnections(const Vertex&, const AggregateDescriptor& aggregate,
    \n+
    1160 const AggregatesMap<Vertex>& aggregates) const;
    \n+
    1161
    \n+
    1165 class OneWayCounter : public Counter
    \n+
    1166 {
    \n+
    1167 public:
    \n+
    1168 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n+
    1169 };
    \n+
    1170
    \n+
    1182 int oneWayConnections(const Vertex&, const AggregateDescriptor& aggregate,
    \n+
    1183 const AggregatesMap<Vertex>& aggregates) const;
    \n+
    1184
    \n+
    1191 class ConnectivityCounter : public Counter
    \n+
    1192 {
    \n+
    1193 public:
    \n+
    1200 ConnectivityCounter(const VertexSet& connected, const AggregatesMap<Vertex>& aggregates);
    \n+
    1201
    \n+
    1202 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n+
    1203
    \n+
    1204 private:
    \n+
    1206 const VertexSet& connected_;
    \n+
    1208 const AggregatesMap<Vertex>& aggregates_;
    \n+
    1209
    \n+
    1210 };
    \n+
    1211
    \n+
    1223 double connectivity(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
    \n+
    1231 bool connected(const Vertex& vertex, const AggregateDescriptor& aggregate,
    \n+
    1232 const AggregatesMap<Vertex>& aggregates) const;
    \n+
    1233
    \n+
    1241 bool connected(const Vertex& vertex, const SLList<AggregateDescriptor>& aggregateList,
    \n+
    1242 const AggregatesMap<Vertex>& aggregates) const;
    \n+
    1243
    \n+
    1251 class DependencyCounter : public Counter
    \n+
    1252 {
    \n+
    1253 public:
    \n+\n+
    1258
    \n+
    1259 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n+
    1260 };
    \n+
    1261
    \n+
    1268 class FrontMarker
    \n+
    1269 {
    \n+
    1270 public:
    \n+
    1277 FrontMarker(std::vector<Vertex>& front, MatrixGraph& graph);
    \n+
    1278
    \n+
    1279 void operator()(const typename MatrixGraph::ConstEdgeIterator& edge);
    \n+
    1280
    \n+
    1281 private:
    \n+
    1283 std::vector<Vertex>& front_;
    \n+
    1285 MatrixGraph& graph_;
    \n+
    1286 };
    \n+
    1287
    \n+
    1291 void unmarkFront();
    \n+
    1292
    \n+
    1307 int unusedNeighbours(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
    \n+
    1308
    \n+
    1322 std::pair<int,int> neighbours(const Vertex& vertex,
    \n+
    1323 const AggregateDescriptor& aggregate,
    \n+
    1324 const AggregatesMap<Vertex>& aggregates) const;
    \n+
    1341 int aggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const;
    \n+
    1342
    \n+
    1350 bool admissible(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const;
    \n+
    1351
    \n+
    1359 std::size_t distance(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates);
    \n+
    1360
    \n+
    1369 Vertex mergeNeighbour(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const;
    \n+
    1370
    \n+
    1379 void nonisoNeighbourAggregate(const Vertex& vertex,
    \n+
    1380 const AggregatesMap<Vertex>& aggregates,
    \n+
    1381 SLList<Vertex>& neighbours) const;
    \n+
    1382
    \n+
    1390 template<class C>
    \n+
    1391 void growAggregate(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates, const C& c);
    \n+
    1392 template<class C>
    \n+
    1393 void growIsolatedAggregate(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates, const C& c);
    \n+
    1394 };
    \n+
    \n+
    1395
    \n+
    1396#ifndef DOXYGEN
    \n+
    1397
    \n+
    1398 template<class M, class N>
    \n+
    1399 inline void SymmetricDependency<M,N>::init(const Matrix* matrix)
    \n+
    1400 {
    \n+
    1401 matrix_ = matrix;
    \n+
    1402 }
    \n+
    1403
    \n+
    1404 template<class M, class N>
    \n+
    1405 inline void SymmetricDependency<M,N>::initRow(const Row& row, int index)
    \n+
    1406 {
    \n+
    1407 initRow(row, index, std::is_convertible<field_type, real_type>());
    \n+
    1408 }
    \n+
    1409
    \n+
    1410 template<class M, class N>
    \n+
    1411 inline void SymmetricDependency<M,N>::initRow(const Row& row, int index, const std::false_type&)
    \n+
    1412 {
    \n+
    1413 DUNE_THROW(InvalidStateException, "field_type needs to convertible to real_type");
    \n+
    1414 }
    \n+
    1415
    \n+
    1416 template<class M, class N>
    \n+
    1417 inline void SymmetricDependency<M,N>::initRow([[maybe_unused]] const Row& row, int index, const std::true_type&)
    \n+
    1418 {
    \n+
    1419 using std::min;
    \n+
    1420 maxValue_ = min(- std::numeric_limits<typename Matrix::field_type>::max(), std::numeric_limits<typename Matrix::field_type>::min());
    \n+
    1421 row_ = index;
    \n+
    1422 diagonal_ = norm_(matrix_->operator[](row_)[row_]);
    \n+
    1423 }
    \n+
    1424
    \n+
    1425 template<class M, class N>
    \n+
    1426 inline void SymmetricDependency<M,N>::examine(const ColIter& col)
    \n+
    1427 {
    \n+
    1428 using std::max;
    \n+
    1429 real_type eij = norm_(*col);
    \n+
    1430 typename Matrix::ConstColIterator opposite_entry =
    \n+
    1431 matrix_->operator[](col.index()).find(row_);
    \n+
    1432 if ( opposite_entry == matrix_->operator[](col.index()).end() )
    \n+
    1433 {
    \n+
    1434 // Consider this a weak connection we disregard.
    \n+
    1435 return;
    \n+
    1436 }
    \n+
    1437 real_type eji = norm_(*opposite_entry);
    \n+
    1438
    \n+
    1439 // skip positive offdiagonals if norm preserves sign of them.
    \n+
    1440 if(!N::is_sign_preserving || eij<0 || eji<0)
    \n+
    1441 maxValue_ = max(maxValue_,
    \n+
    1442 eij /diagonal_ * eji/
    \n+
    1443 norm_(matrix_->operator[](col.index())[col.index()]));
    \n+
    1444 }
    \n+
    1445
    \n+
    1446 template<class M, class N>
    \n+
    1447 template<class G>
    \n+
    1448 inline void SymmetricDependency<M,N>::examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col)
    \n+
    1449 {
    \n+
    1450 real_type eij = norm_(*col);
    \n+
    1451 typename Matrix::ConstColIterator opposite_entry =
    \n+
    1452 matrix_->operator[](col.index()).find(row_);
    \n+
    1453
    \n+
    1454 if ( opposite_entry == matrix_->operator[](col.index()).end() )
    \n+
    1455 {
    \n+
    1456 // Consider this as a weak connection we disregard.
    \n+
    1457 return;
    \n+
    1458 }
    \n+
    1459 real_type eji = norm_(*opposite_entry);
    \n+
    1460 // skip positive offdiagonals if norm preserves sign of them.
    \n+
    1461 if(!N::is_sign_preserving || (eij<0 || eji<0))
    \n+
    1462 if(eji / norm_(matrix_->operator[](edge.target())[edge.target()]) *
    \n+
    1463 eij/ diagonal_ > alpha() * maxValue_) {
    \n+
    1464 edge.properties().setDepends();
    \n+
    1465 edge.properties().setInfluences();
    \n+
    1466 typename G::EdgeProperties& other = graph.getEdgeProperties(edge.target(), edge.source());
    \n+
    1467 other.setInfluences();
    \n+
    1468 other.setDepends();
    \n+
    1469 }
    \n+
    1470 }
    \n+
    1471
    \n+
    1472 template<class M, class N>
    \n+\n+
    1474 {
    \n+
    1475 return maxValue_ < beta();
    \n+
    1476 }
    \n+
    1477
    \n+
    1478
    \n+
    1479 template<class M, class N>
    \n+
    1480 inline void Dependency<M,N>::init(const Matrix* matrix)
    \n+
    1481 {
    \n+
    1482 matrix_ = matrix;
    \n+
    1483 }
    \n+
    1484
    \n+
    1485 template<class M, class N>
    \n+
    1486 inline void Dependency<M,N>::initRow([[maybe_unused]] const Row& row, int index)
    \n+
    1487 {
    \n+
    1488 using std::min;
    \n+
    1489 maxValue_ = min(- std::numeric_limits<real_type>::max(), std::numeric_limits<real_type>::min());
    \n+
    1490 row_ = index;
    \n+
    1491 diagonal_ = norm_(matrix_->operator[](row_)[row_]);
    \n+
    1492 }
    \n+
    1493
    \n+
    1494 template<class M, class N>
    \n+
    1495 inline void Dependency<M,N>::examine(const ColIter& col)
    \n+
    1496 {
    \n+
    1497 using std::max;
    \n+
    1498 maxValue_ = max(maxValue_, -norm_(*col));
    \n+
    1499 }
    \n+
    1500
    \n+
    1501 template<class M, class N>
    \n+
    1502 template<class G>
    \n+
    1503 inline void Dependency<M,N>::examine(G& graph, const typename G::EdgeIterator& edge, const ColIter& col)
    \n+
    1504 {
    \n+
    1505 if(-norm_(*col) >= maxValue_ * alpha()) {
    \n+
    1506 edge.properties().setDepends();
    \n+
    1507 typedef typename G::EdgeDescriptor ED;
    \n+
    1508 ED e= graph.findEdge(edge.target(), edge.source());
    \n+
    1509 if(e!=std::numeric_limits<ED>::max())
    \n+
    1510 {
    \n+
    1511 typename G::EdgeProperties& other = graph.getEdgeProperties(e);
    \n+
    1512 other.setInfluences();
    \n+
    1513 }
    \n+
    1514 }
    \n+
    1515 }
    \n+
    1516
    \n+
    1517 template<class M, class N>
    \n+
    1518 inline bool Dependency<M,N>::isIsolated()
    \n+
    1519 {
    \n+
    1520 return maxValue_ < beta() * diagonal_;
    \n+
    1521 }
    \n+
    1522
    \n+
    1523 template<class G,class S>
    \n+
    1524 Aggregate<G,S>::Aggregate(MatrixGraph& graph, AggregatesMap<Vertex>& aggregates,
    \n+
    1525 VertexSet& connected, std::vector<Vertex>& front)
    \n+
    1526 : vertices_(), id_(-1), graph_(graph), aggregates_(aggregates),
    \n+
    1527 connected_(connected), front_(front)
    \n+
    1528 {}
    \n+
    1529
    \n+
    1530 template<class G,class S>
    \n+
    1531 void Aggregate<G,S>::reconstruct(const Vertex& vertex)
    \n+
    1532 {
    \n+
    1533 /*
    \n+
    1534 vertices_.push_back(vertex);
    \n+
    1535 typedef typename VertexList::const_iterator iterator;
    \n+
    1536 iterator begin = vertices_.begin();
    \n+
    1537 iterator end = vertices_.end();*/
    \n+
    1538 throw "Not yet implemented";
    \n+
    1539
    \n+
    1540 // while(begin!=end){
    \n+
    1541 //for();
    \n+
    1542 // }
    \n+
    1543
    \n+
    1544 }
    \n+
    1545
    \n+
    1546 template<class G,class S>
    \n+
    1547 inline void Aggregate<G,S>::seed(const Vertex& vertex)
    \n+
    1548 {
    \n+
    1549 dvverb<<"Connected cleared"<<std::endl;
    \n+
    1550 connected_.clear();
    \n+
    1551 vertices_.clear();
    \n+
    1552 connected_.insert(vertex);
    \n+
    1553 dvverb << " Inserting "<<vertex<<" size="<<connected_.size();
    \n+
    1554 ++id_ ;
    \n+
    1555 add(vertex);
    \n+
    1556 }
    \n+
    1557
    \n+
    1558
    \n+
    1559 template<class G,class S>
    \n+
    1560 inline void Aggregate<G,S>::add(const Vertex& vertex)
    \n+
    1561 {
    \n+
    1562 vertices_.insert(vertex);
    \n+
    1563 aggregates_[vertex]=id_;
    \n+
    1564 if(front_.size())
    \n+
    1565 front_.erase(std::lower_bound(front_.begin(), front_.end(), vertex));
    \n+
    1566
    \n+
    1567
    \n+
    1568 typedef typename MatrixGraph::ConstEdgeIterator iterator;
    \n+
    1569 const iterator end = graph_.endEdges(vertex);
    \n+
    1570 for(iterator edge = graph_.beginEdges(vertex); edge != end; ++edge) {
    \n+
    1571 dvverb << " Inserting "<<aggregates_[edge.target()];
    \n+
    1572 connected_.insert(aggregates_[edge.target()]);
    \n+
    1573 dvverb <<" size="<<connected_.size();
    \n+
    1574 if(aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED &&
    \n+
    1575 !graph_.getVertexProperties(edge.target()).front())
    \n+
    1576 {
    \n+
    1577 front_.push_back(edge.target());
    \n+
    1578 graph_.getVertexProperties(edge.target()).setFront();
    \n+
    1579 }
    \n+
    1580 }
    \n+
    1581 dvverb <<std::endl;
    \n+
    1582 std::sort(front_.begin(), front_.end());
    \n+
    1583 }
    \n+
    1584
    \n+
    1585 template<class G,class S>
    \n+
    1586 inline void Aggregate<G,S>::add(std::vector<Vertex>& vertices)
    \n+
    1587 {
    \n+
    1588#ifndef NDEBUG
    \n+
    1589 std::size_t oldsize = vertices_.size();
    \n+
    1590#endif
    \n+
    1591 typedef typename std::vector<Vertex>::iterator Iterator;
    \n+
    1592
    \n+
    1593 typedef typename VertexSet::iterator SIterator;
    \n+
    1594
    \n+
    1595 SIterator pos=vertices_.begin();
    \n+
    1596 std::vector<Vertex> newFront;
    \n+
    1597 newFront.reserve(front_.capacity());
    \n+
    1598
    \n+
    1599 std::set_difference(front_.begin(), front_.end(), vertices.begin(), vertices.end(),
    \n+
    1600 std::back_inserter(newFront));
    \n+
    1601 front_=newFront;
    \n+
    1602
    \n+
    1603 for(Iterator vertex=vertices.begin(); vertex != vertices.end(); ++vertex)
    \n+
    1604 {
    \n+
    1605 pos=vertices_.insert(pos,*vertex);
    \n+
    1606 vertices_.insert(*vertex);
    \n+
    1607 graph_.getVertexProperties(*vertex).resetFront(); // Not a front node any more.
    \n+
    1608 aggregates_[*vertex]=id_;
    \n+
    1609
    \n+
    1610 typedef typename MatrixGraph::ConstEdgeIterator iterator;
    \n+
    1611 const iterator end = graph_.endEdges(*vertex);
    \n+
    1612 for(iterator edge = graph_.beginEdges(*vertex); edge != end; ++edge) {
    \n+
    1613 dvverb << " Inserting "<<aggregates_[edge.target()];
    \n+
    1614 connected_.insert(aggregates_[edge.target()]);
    \n+
    1615 if(aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED &&
    \n+
    1616 !graph_.getVertexProperties(edge.target()).front())
    \n+
    1617 {
    \n+
    1618 front_.push_back(edge.target());
    \n+
    1619 graph_.getVertexProperties(edge.target()).setFront();
    \n+
    1620 }
    \n+
    1621 dvverb <<" size="<<connected_.size();
    \n+
    1622 }
    \n+
    1623 dvverb <<std::endl;
    \n+
    1624 }
    \n+
    1625 std::sort(front_.begin(), front_.end());
    \n+
    1626 assert(oldsize+vertices.size()==vertices_.size());
    \n+
    1627 }
    \n+
    1628 template<class G,class S>
    \n+
    1629 inline void Aggregate<G,S>::clear()
    \n+
    1630 {
    \n+
    1631 vertices_.clear();
    \n+
    1632 connected_.clear();
    \n+
    1633 id_=-1;
    \n+
    1634 }
    \n+
    1635
    \n+
    1636 template<class G,class S>
    \n+
    1637 inline typename Aggregate<G,S>::VertexSet::size_type
    \n+\n+
    1639 {
    \n+
    1640 return vertices_.size();
    \n+
    1641 }
    \n+
    1642
    \n+
    1643 template<class G,class S>
    \n+
    1644 inline typename Aggregate<G,S>::VertexSet::size_type
    \n+\n+
    1646 {
    \n+
    1647 return connected_.size();
    \n+
    1648 }
    \n+
    1649
    \n+
    1650 template<class G,class S>
    \n+
    1651 inline int Aggregate<G,S>::id()
    \n+
    1652 {
    \n+
    1653 return id_;
    \n+
    1654 }
    \n+
    1655
    \n+
    1656 template<class G,class S>
    \n+\n+
    1658 {
    \n+
    1659 return vertices_.begin();
    \n+
    1660 }
    \n+
    1661
    \n+
    1662 template<class G,class S>
    \n+\n+
    1664 {
    \n+
    1665 return vertices_.end();
    \n+
    1666 }
    \n+
    1667
    \n+
    1668 template<class V>
    \n+
    1669 const V AggregatesMap<V>::UNAGGREGATED = std::numeric_limits<V>::max();
    \n+
    1670
    \n+
    1671 template<class V>
    \n+
    1672 const V AggregatesMap<V>::ISOLATED = std::numeric_limits<V>::max()-1;
    \n+
    1673
    \n+
    1674 template<class V>
    \n+\n+
    1676 : aggregates_(0)
    \n+
    1677 {}
    \n+
    1678
    \n+
    1679 template<class V>
    \n+\n+
    1681 {
    \n+
    1682 if(aggregates_!=0)
    \n+
    1683 delete[] aggregates_;
    \n+
    1684 }
    \n+
    1685
    \n+
    1686
    \n+
    1687 template<class V>
    \n+
    1688 inline AggregatesMap<V>::AggregatesMap(std::size_t noVertices)
    \n+
    1689 {
    \n+
    1690 allocate(noVertices);
    \n+
    1691 }
    \n+
    1692
    \n+
    1693 template<class V>
    \n+
    1694 inline std::size_t AggregatesMap<V>::noVertices() const
    \n+
    1695 {
    \n+
    1696 return noVertices_;
    \n+
    1697 }
    \n+
    1698
    \n+
    1699 template<class V>
    \n+
    1700 inline void AggregatesMap<V>::allocate(std::size_t noVertices)
    \n+
    1701 {
    \n+
    1702 aggregates_ = new AggregateDescriptor[noVertices];
    \n+
    1703 noVertices_ = noVertices;
    \n+
    1704
    \n+
    1705 for(std::size_t i=0; i < noVertices; i++)
    \n+
    1706 aggregates_[i]=UNAGGREGATED;
    \n+
    1707 }
    \n+
    1708
    \n+
    1709 template<class V>
    \n+
    1710 inline void AggregatesMap<V>::free()
    \n+
    1711 {
    \n+
    1712 assert(aggregates_ != 0);
    \n+
    1713 delete[] aggregates_;
    \n+
    1714 aggregates_=0;
    \n+
    1715 }
    \n+
    1716
    \n+
    1717 template<class V>
    \n+\n+
    1719 AggregatesMap<V>::operator[](const VertexDescriptor& v)
    \n+
    1720 {
    \n+
    1721 return aggregates_[v];
    \n+
    1722 }
    \n+
    1723
    \n+
    1724 template<class V>
    \n+
    1725 inline const typename AggregatesMap<V>::AggregateDescriptor&
    \n+
    1726 AggregatesMap<V>::operator[](const VertexDescriptor& v) const
    \n+
    1727 {
    \n+
    1728 return aggregates_[v];
    \n+
    1729 }
    \n+
    1730
    \n+
    1731 template<class V>
    \n+
    1732 template<bool reset, class G, class F,class VM>
    \n+
    1733 inline std::size_t AggregatesMap<V>::breadthFirstSearch(const V& start,
    \n+
    1734 const AggregateDescriptor& aggregate,
    \n+
    1735 const G& graph, F& aggregateVisitor,
    \n+
    1736 VM& visitedMap) const
    \n+
    1737 {
    \n+
    1738 VertexList vlist;
    \n+
    1739
    \n+
    1740 DummyEdgeVisitor dummy;
    \n+
    1741 return breadthFirstSearch<true,reset>(start, aggregate, graph, vlist, aggregateVisitor, dummy, visitedMap);
    \n+
    1742 }
    \n+
    1743
    \n+
    1744 template<class V>
    \n+
    1745 template<bool remove, bool reset, class G, class L, class F1, class F2, class VM>
    \n+
    1746 std::size_t AggregatesMap<V>::breadthFirstSearch(const V& start,
    \n+
    1747 const AggregateDescriptor& aggregate,
    \n+
    1748 const G& graph,
    \n+
    1749 L& visited,
    \n+
    1750 F1& aggregateVisitor,
    \n+
    1751 F2& nonAggregateVisitor,
    \n+
    1752 VM& visitedMap) const
    \n+
    1753 {
    \n+
    1754 typedef typename L::const_iterator ListIterator;
    \n+
    1755 int visitedSpheres = 0;
    \n+
    1756
    \n+
    1757 visited.push_back(start);
    \n+
    1758 put(visitedMap, start, true);
    \n+
    1759
    \n+
    1760 ListIterator current = visited.begin();
    \n+
    1761 ListIterator end = visited.end();
    \n+
    1762 std::size_t i=0, size=visited.size();
    \n+
    1763
    \n+
    1764 // visit the neighbours of all vertices of the
    \n+
    1765 // current sphere.
    \n+
    1766 while(current != end) {
    \n+
    1767
    \n+
    1768 for(; i<size; ++current, ++i) {
    \n+
    1769 typedef typename G::ConstEdgeIterator EdgeIterator;
    \n+
    1770 const EdgeIterator endEdge = graph.endEdges(*current);
    \n+
    1771
    \n+
    1772 for(EdgeIterator edge = graph.beginEdges(*current);
    \n+
    1773 edge != endEdge; ++edge) {
    \n+
    1774
    \n+
    1775 if(aggregates_[edge.target()]==aggregate) {
    \n+
    1776 if(!get(visitedMap, edge.target())) {
    \n+
    1777 put(visitedMap, edge.target(), true);
    \n+
    1778 visited.push_back(edge.target());
    \n+
    1779 aggregateVisitor(edge);
    \n+
    1780 }
    \n+
    1781 }else
    \n+
    1782 nonAggregateVisitor(edge);
    \n+
    1783 }
    \n+
    1784 }
    \n+
    1785 end = visited.end();
    \n+
    1786 size = visited.size();
    \n+
    1787 if(current != end)
    \n+
    1788 visitedSpheres++;
    \n+
    1789 }
    \n+
    1790
    \n+
    1791 if(reset)
    \n+
    1792 for(current = visited.begin(); current != end; ++current)
    \n+
    1793 put(visitedMap, *current, false);
    \n+
    1794
    \n+
    1795
    \n+
    1796 if(remove)
    \n+
    1797 visited.clear();
    \n+
    1798
    \n+
    1799 return visitedSpheres;
    \n+
    1800 }
    \n+
    1801
    \n+
    1802 template<class G>
    \n+\n+
    1804 : graph_(0), aggregate_(0), front_(), connected_(), size_(-1)
    \n+
    1805 {}
    \n+
    1806
    \n+
    1807 template<class G>
    \n+\n+
    1809 {
    \n+
    1810 size_=-1;
    \n+
    1811 }
    \n+
    1812
    \n+
    1813 template<class G, class C>
    \n+
    1814 void buildDependency(G& graph,
    \n+
    1815 const typename C::Matrix& matrix,
    \n+
    1816 C criterion, bool firstlevel)
    \n+
    1817 {
    \n+
    1818 // assert(graph.isBuilt());
    \n+
    1819 typedef typename C::Matrix Matrix;
    \n+
    1820 typedef typename G::VertexIterator VertexIterator;
    \n+
    1821
    \n+
    1822 criterion.init(&matrix);
    \n+
    1823
    \n+
    1824 for(VertexIterator vertex = graph.begin(); vertex != graph.end(); ++vertex) {
    \n+
    1825 typedef typename Matrix::row_type Row;
    \n+
    1826
    \n+
    1827 const Row& row = matrix[*vertex];
    \n+
    1828
    \n+
    1829 // Tell the criterion what row we will examine now
    \n+
    1830 // This might for example be used for calculating the
    \n+
    1831 // maximum offdiagonal value
    \n+
    1832 criterion.initRow(row, *vertex);
    \n+
    1833
    \n+
    1834 // On a first path all columns are examined. After this
    \n+
    1835 // the calculator should know whether the vertex is isolated.
    \n+
    1836 typedef typename Matrix::ConstColIterator ColIterator;
    \n+
    1837 ColIterator end = row.end();
    \n+
    1838 typename FieldTraits<typename Matrix::field_type>::real_type absoffdiag=0.;
    \n+
    1839
    \n+
    1840 using std::max;
    \n+
    1841 if(firstlevel) {
    \n+
    1842 for(ColIterator col = row.begin(); col != end; ++col)
    \n+
    1843 if(col.index()!=*vertex) {
    \n+
    1844 criterion.examine(col);
    \n+
    1845 absoffdiag = max(absoffdiag, Impl::asMatrix(*col).frobenius_norm());
    \n+
    1846 }
    \n+
    1847
    \n+
    1848 if(absoffdiag==0)
    \n+
    1849 vertex.properties().setExcludedBorder();
    \n+
    1850 }
    \n+
    1851 else
    \n+
    1852 for(ColIterator col = row.begin(); col != end; ++col)
    \n+
    1853 if(col.index()!=*vertex)
    \n+
    1854 criterion.examine(col);
    \n+
    1855
    \n+
    1856 // reset the vertex properties
    \n+
    1857 //vertex.properties().reset();
    \n+
    1858
    \n+
    1859 // Check whether the vertex is isolated.
    \n+
    1860 if(criterion.isIsolated()) {
    \n+
    1861 //std::cout<<"ISOLATED: "<<*vertex<<std::endl;
    \n+
    1862 vertex.properties().setIsolated();
    \n+
    1863 }else{
    \n+
    1864 // Examine all the edges beginning at this vertex.
    \n+
    1865 auto eEnd = vertex.end();
    \n+
    1866 auto col = matrix[*vertex].begin();
    \n+
    1867
    \n+
    1868 for(auto edge = vertex.begin(); edge!= eEnd; ++edge, ++col) {
    \n+
    1869 // Move to the right column.
    \n+
    1870 while(col.index()!=edge.target())
    \n+
    1871 ++col;
    \n+
    1872 criterion.examine(graph, edge, col);
    \n+
    1873 }
    \n+
    1874 }
    \n+
    1875
    \n+
    1876 }
    \n+
    1877 }
    \n+
    1878
    \n+
    1879
    \n+
    1880 template<class G>
    \n+
    1881 template<class V>
    \n+
    1882 inline Aggregator<G>::AggregateVisitor<V>::AggregateVisitor(const AggregatesMap<Vertex>& aggregates,
    \n+
    1883 const AggregateDescriptor& aggregate, V& visitor)
    \n+
    1884 : aggregates_(aggregates), aggregate_(aggregate), visitor_(&visitor)
    \n+
    1885 {}
    \n+
    1886
    \n+
    1887 template<class G>
    \n+
    1888 template<class V>
    \n+\n+
    1890 {
    \n+
    1891 if(aggregates_[edge.target()]==aggregate_)
    \n+
    1892 visitor_->operator()(edge);
    \n+
    1893 }
    \n+
    1894
    \n+
    1895 template<class G>
    \n+
    1896 template<class V>
    \n+
    1897 inline void Aggregator<G>::visitAggregateNeighbours(const Vertex& vertex,
    \n+
    1898 const AggregateDescriptor& aggregate,
    \n+
    1899 const AggregatesMap<Vertex>& aggregates,
    \n+
    1900 V& visitor) const
    \n+
    1901 {
    \n+
    1902 // Only evaluates for edge pointing to the aggregate
    \n+
    1903 AggregateVisitor<V> v(aggregates, aggregate, visitor);
    \n+
    1904 visitNeighbours(*graph_, vertex, v);
    \n+
    1905 }
    \n+
    1906
    \n+
    1907
    \n+
    1908 template<class G>
    \n+\n+
    1910 : count_(0)
    \n+
    1911 {}
    \n+
    1912
    \n+
    1913 template<class G>
    \n+\n+
    1915 {
    \n+
    1916 ++count_;
    \n+
    1917 }
    \n+
    1918
    \n+
    1919 template<class G>
    \n+\n+
    1921 {
    \n+
    1922 --count_;
    \n+
    1923 }
    \n+
    1924 template<class G>
    \n+\n+
    1926 {
    \n+
    1927 return count_;
    \n+
    1928 }
    \n+
    1929
    \n+
    1930 template<class G>
    \n+\n+
    1932 {
    \n+
    1933 if(edge.properties().isTwoWay())
    \n+\n+
    1935 }
    \n+
    1936
    \n+
    1937 template<class G>
    \n+
    1938 int Aggregator<G>::twoWayConnections(const Vertex& vertex, const AggregateDescriptor& aggregate,
    \n+
    1939 const AggregatesMap<Vertex>& aggregates) const
    \n+
    1940 {
    \n+
    1941 TwoWayCounter counter;
    \n+
    1942 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
    \n+
    1943 return counter.value();
    \n+
    1944 }
    \n+
    1945
    \n+
    1946 template<class G>
    \n+
    1947 int Aggregator<G>::oneWayConnections(const Vertex& vertex, const AggregateDescriptor& aggregate,
    \n+
    1948 const AggregatesMap<Vertex>& aggregates) const
    \n+
    1949 {
    \n+
    1950 OneWayCounter counter;
    \n+
    1951 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
    \n+
    1952 return counter.value();
    \n+
    1953 }
    \n+
    1954
    \n+
    1955 template<class G>
    \n+\n+
    1957 {
    \n+
    1958 if(edge.properties().isOneWay())
    \n+\n+
    1960 }
    \n+
    1961
    \n+
    1962 template<class G>
    \n+
    1963 inline Aggregator<G>::ConnectivityCounter::ConnectivityCounter(const VertexSet& connected,
    \n+
    1964 const AggregatesMap<Vertex>& aggregates)
    \n+
    1965 : Counter(), connected_(connected), aggregates_(aggregates)
    \n+
    1966 {}
    \n+
    1967
    \n+
    1968
    \n+
    1969 template<class G>
    \n+\n+
    1971 {
    \n+
    1972 if(connected_.find(aggregates_[edge.target()]) == connected_.end() || aggregates_[edge.target()]==AggregatesMap<Vertex>::UNAGGREGATED)
    \n+
    1973 // Would be a new connection
    \n+\n+
    1975 else{
    \n+\n+\n+
    1978 }
    \n+
    1979 }
    \n+
    1980
    \n+
    1981 template<class G>
    \n+
    1982 inline double Aggregator<G>::connectivity(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
    \n+
    1983 {
    \n+
    1984 ConnectivityCounter counter(connected_, aggregates);
    \n+
    1985 double noNeighbours=visitNeighbours(*graph_, vertex, counter);
    \n+
    1986 return (double)counter.value()/noNeighbours;
    \n+
    1987 }
    \n+
    1988
    \n+
    1989 template<class G>
    \n+\n+
    1991 : Counter()
    \n+
    1992 {}
    \n+
    1993
    \n+
    1994 template<class G>
    \n+\n+
    1996 {
    \n+
    1997 if(edge.properties().depends())
    \n+\n+
    1999 if(edge.properties().influences())
    \n+\n+
    2001 }
    \n+
    2002
    \n+
    2003 template<class G>
    \n+
    2004 int Aggregator<G>::unusedNeighbours(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
    \n+
    2005 {
    \n+
    2006 return aggregateNeighbours(vertex, AggregatesMap<Vertex>::UNAGGREGATED, aggregates);
    \n+
    2007 }
    \n+
    2008
    \n+
    2009 template<class G>
    \n+
    2010 std::pair<int,int> Aggregator<G>::neighbours(const Vertex& vertex,
    \n+
    2011 const AggregateDescriptor& aggregate,
    \n+
    2012 const AggregatesMap<Vertex>& aggregates) const
    \n+
    2013 {
    \n+
    2014 DependencyCounter unused, aggregated;
    \n+
    2015 typedef AggregateVisitor<DependencyCounter> CounterT;
    \n+
    2016 typedef std::tuple<CounterT,CounterT> CounterTuple;
    \n+
    2017 CombinedFunctor<CounterTuple> visitors(CounterTuple(CounterT(aggregates, AggregatesMap<Vertex>::UNAGGREGATED, unused), CounterT(aggregates, aggregate, aggregated)));
    \n+
    2018 visitNeighbours(*graph_, vertex, visitors);
    \n+
    2019 return std::make_pair(unused.value(), aggregated.value());
    \n+
    2020 }
    \n+
    2021
    \n+
    2022
    \n+
    2023 template<class G>
    \n+
    2024 int Aggregator<G>::aggregateNeighbours(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const
    \n+
    2025 {
    \n+
    2026 DependencyCounter counter;
    \n+
    2027 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);
    \n+
    2028 return counter.value();
    \n+
    2029 }
    \n+
    2030
    \n+
    2031 template<class G>
    \n+
    2032 std::size_t Aggregator<G>::distance(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates)
    \n+
    2033 {
    \n+
    2034 return 0;
    \n+
    2035 typename PropertyMapTypeSelector<VertexVisitedTag,G>::Type visitedMap = get(VertexVisitedTag(), *graph_);
    \n+
    2036 VertexList vlist;
    \n+
    2037 typename AggregatesMap<Vertex>::DummyEdgeVisitor dummy;
    \n+
    2038 return aggregates.template breadthFirstSearch<true,true>(vertex,
    \n+
    2039 aggregate_->id(), *graph_,
    \n+
    2040 vlist, dummy, dummy, visitedMap);
    \n+
    2041 }
    \n+
    2042
    \n+
    2043 template<class G>
    \n+
    2044 inline Aggregator<G>::FrontMarker::FrontMarker(std::vector<Vertex>& front, MatrixGraph& graph)
    \n+
    2045 : front_(front), graph_(graph)
    \n+
    2046 {}
    \n+
    2047
    \n+
    2048 template<class G>
    \n+\n+
    2050 {
    \n+
    2051 Vertex target = edge.target();
    \n+
    2052
    \n+
    2053 if(!graph_.getVertexProperties(target).front()) {
    \n+
    2054 front_.push_back(target);
    \n+
    2055 graph_.getVertexProperties(target).setFront();
    \n+
    2056 }
    \n+
    2057 }
    \n+
    2058
    \n+
    2059 template<class G>
    \n+
    2060 inline bool Aggregator<G>::admissible(const Vertex& vertex, const AggregateDescriptor& aggregate, const AggregatesMap<Vertex>& aggregates) const
    \n+
    2061 {
    \n+
    2062 // Todo
    \n+
    2063 Dune::dvverb<<" Admissible not yet implemented!"<<std::endl;
    \n+
    2064 return true;
    \n+
    2065 //Situation 1: front node depends on two nodes. Then these
    \n+
    2066 // have to be strongly connected to each other
    \n+
    2067
    \n+
    2068 // Iterate over all all neighbours of front node
    \n+
    2069 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
    \n+
    2070 Iterator vend = graph_->endEdges(vertex);
    \n+
    2071 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {
    \n+
    2072 // if(edge.properties().depends() && !edge.properties().influences()
    \n+
    2073 if(edge.properties().isStrong()
    \n+
    2074 && aggregates[edge.target()]==aggregate)
    \n+
    2075 {
    \n+
    2076 // Search for another link to the aggregate
    \n+
    2077 Iterator edge1 = edge;
    \n+
    2078 for(++edge1; edge1 != vend; ++edge1) {
    \n+
    2079 //if(edge1.properties().depends() && !edge1.properties().influences()
    \n+
    2080 if(edge1.properties().isStrong()
    \n+
    2081 && aggregates[edge.target()]==aggregate)
    \n+
    2082 {
    \n+
    2083 //Search for an edge connecting the two vertices that is
    \n+
    2084 //strong
    \n+
    2085 bool found=false;
    \n+
    2086 Iterator v2end = graph_->endEdges(edge.target());
    \n+
    2087 for(Iterator edge2 = graph_->beginEdges(edge.target()); edge2 != v2end; ++edge2) {
    \n+
    2088 if(edge2.target()==edge1.target() &&
    \n+
    2089 edge2.properties().isStrong()) {
    \n+
    2090 found =true;
    \n+
    2091 break;
    \n+
    2092 }
    \n+
    2093 }
    \n+
    2094 if(found)
    \n+
    2095 {
    \n+
    2096 return true;
    \n+
    2097 }
    \n+
    2098 }
    \n+
    2099 }
    \n+
    2100 }
    \n+
    2101 }
    \n+
    2102
    \n+
    2103 // Situation 2: cluster node depends on front node and other cluster node
    \n+
    2105 vend = graph_->endEdges(vertex);
    \n+
    2106 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {
    \n+
    2107 //if(!edge.properties().depends() && edge.properties().influences()
    \n+
    2108 if(edge.properties().isStrong()
    \n+
    2109 && aggregates[edge.target()]==aggregate)
    \n+
    2110 {
    \n+
    2111 // Search for a link from target that stays within the aggregate
    \n+
    2112 Iterator v1end = graph_->endEdges(edge.target());
    \n+
    2113
    \n+
    2114 for(Iterator edge1=graph_->beginEdges(edge.target()); edge1 != v1end; ++edge1) {
    \n+
    2115 //if(edge1.properties().depends() && !edge1.properties().influences()
    \n+
    2116 if(edge1.properties().isStrong()
    \n+
    2117 && aggregates[edge1.target()]==aggregate)
    \n+
    2118 {
    \n+
    2119 bool found=false;
    \n+
    2120 // Check if front node is also connected to this one
    \n+
    2121 Iterator v2end = graph_->endEdges(vertex);
    \n+
    2122 for(Iterator edge2 = graph_->beginEdges(vertex); edge2 != v2end; ++edge2) {
    \n+
    2123 if(edge2.target()==edge1.target()) {
    \n+
    2124 if(edge2.properties().isStrong())
    \n+
    2125 found=true;
    \n+
    2126 break;
    \n+
    2127 }
    \n+
    2128 }
    \n+
    2129 if(found)
    \n+
    2130 {
    \n+
    2131 return true;
    \n+
    2132 }
    \n+
    2133 }
    \n+
    2134 }
    \n+
    2135 }
    \n+
    2136 }
    \n+
    2137 return false;
    \n+
    2138 }
    \n+
    2139
    \n+
    2140 template<class G>
    \n+
    2141 void Aggregator<G>::unmarkFront()
    \n+
    2142 {
    \n+
    2143 typedef typename std::vector<Vertex>::const_iterator Iterator;
    \n+
    2144
    \n+
    2145 for(Iterator vertex=front_.begin(); vertex != front_.end(); ++vertex)
    \n+
    2146 graph_->getVertexProperties(*vertex).resetFront();
    \n+
    2147
    \n+
    2148 front_.clear();
    \n+
    2149 }
    \n+
    2150
    \n+
    2151 template<class G>
    \n+
    2152 inline void
    \n+
    2153 Aggregator<G>::nonisoNeighbourAggregate(const Vertex& vertex,
    \n+
    2154 const AggregatesMap<Vertex>& aggregates,
    \n+
    2155 SLList<Vertex>& neighbours) const
    \n+
    2156 {
    \n+
    2157 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
    \n+
    2158 Iterator end=graph_->beginEdges(vertex);
    \n+
    2159 neighbours.clear();
    \n+
    2160
    \n+
    2161 for(Iterator edge=graph_->beginEdges(vertex); edge!=end; ++edge)
    \n+
    2162 {
    \n+
    2163 if(aggregates[edge.target()]!=AggregatesMap<Vertex>::UNAGGREGATED && graph_->getVertexProperties(edge.target()).isolated())
    \n+
    2164 neighbours.push_back(aggregates[edge.target()]);
    \n+
    2165 }
    \n+
    2166 }
    \n+
    2167
    \n+
    2168 template<class G>
    \n+
    2169 inline typename G::VertexDescriptor Aggregator<G>::mergeNeighbour(const Vertex& vertex, const AggregatesMap<Vertex>& aggregates) const
    \n+
    2170 {
    \n+
    2171 typedef typename MatrixGraph::ConstEdgeIterator Iterator;
    \n+
    2172
    \n+
    2173 Iterator end = graph_->endEdges(vertex);
    \n+
    2174 for(Iterator edge = graph_->beginEdges(vertex); edge != end; ++edge) {
    \n+
    2175 if(aggregates[edge.target()] != AggregatesMap<Vertex>::UNAGGREGATED &&
    \n+
    2176 graph_->getVertexProperties(edge.target()).isolated() == graph_->getVertexProperties(edge.source()).isolated()) {
    \n+
    2177 if( graph_->getVertexProperties(vertex).isolated() ||
    \n+
    2178 ((edge.properties().depends() || edge.properties().influences())
    \n+
    2179 && admissible(vertex, aggregates[edge.target()], aggregates)))
    \n+
    2180 return edge.target();
    \n+
    2181 }
    \n+
    2182 }
    \n+
    2183 return AggregatesMap<Vertex>::UNAGGREGATED;
    \n+
    2184 }
    \n+
    2185
    \n+
    2186 template<class G>
    \n+\n+
    2188 : Counter(), graph_(graph)
    \n+
    2189 {}
    \n+
    2190
    \n+
    2191 template<class G>
    \n+\n+
    2193 {
    \n+
    2194 if(graph_.getVertexProperties(edge.target()).front())
    \n+\n+
    2196 }
    \n+
    2197
    \n+
    2198 template<class G>
    \n+
    2199 int Aggregator<G>::noFrontNeighbours(const Vertex& vertex) const
    \n+
    2200 {
    \n+
    2201 FrontNeighbourCounter counter(*graph_);
    \n+
    2202 visitNeighbours(*graph_, vertex, counter);
    \n+
    2203 return counter.value();
    \n+
    2204 }
    \n+
    2205 template<class G>
    \n+
    2206 inline bool Aggregator<G>::connected(const Vertex& vertex,
    \n+
    2207 const AggregateDescriptor& aggregate,
    \n+
    2208 const AggregatesMap<Vertex>& aggregates) const
    \n+
    2209 {
    \n+
    2210 typedef typename G::ConstEdgeIterator iterator;
    \n+
    2211 const iterator end = graph_->endEdges(vertex);
    \n+
    2212 for(iterator edge = graph_->beginEdges(vertex); edge != end; ++edge)
    \n+
    2213 if(aggregates[edge.target()]==aggregate)
    \n+
    2214 return true;
    \n+
    2215 return false;
    \n+
    2216 }
    \n+
    2217 template<class G>
    \n+
    2218 inline bool Aggregator<G>::connected(const Vertex& vertex,
    \n+
    2219 const SLList<AggregateDescriptor>& aggregateList,
    \n+
    2220 const AggregatesMap<Vertex>& aggregates) const
    \n+
    2221 {
    \n+
    2222 typedef typename SLList<AggregateDescriptor>::const_iterator Iter;
    \n+
    2223 for(Iter i=aggregateList.begin(); i!=aggregateList.end(); ++i)
    \n+
    2224 if(connected(vertex, *i, aggregates))
    \n+
    2225 return true;
    \n+
    2226 return false;
    \n+
    2227 }
    \n+
    2228
    \n+
    2229 template<class G>
    \n+
    2230 template<class C>
    \n+
    2231 void Aggregator<G>::growIsolatedAggregate(const Vertex& seed, const AggregatesMap<Vertex>& aggregates, const C& c)
    \n+
    2232 {
    \n+
    2233 SLList<Vertex> connectedAggregates;
    \n+
    2234 nonisoNeighbourAggregate(seed, aggregates,connectedAggregates);
    \n+
    2235
    \n+
    2236 while(aggregate_->size()< c.minAggregateSize() && aggregate_->connectSize() < c.maxConnectivity()) {
    \n+
    2237 double maxCon=-1;
    \n+
    2238 std::size_t maxFrontNeighbours=0;
    \n+
    2239
    \n+
    2240 Vertex candidate=AggregatesMap<Vertex>::UNAGGREGATED;
    \n+
    2241
    \n+
    2242 typedef typename std::vector<Vertex>::const_iterator Iterator;
    \n+
    2243
    \n+
    2244 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
    \n+
    2245 if(distance(*vertex, aggregates)>c.maxDistance())
    \n+
    2246 continue; // distance of proposes aggregate too big
    \n+
    2247
    \n+
    2248 if(connectedAggregates.size()>0) {
    \n+
    2249 // there is already a neighbour cluster
    \n+
    2250 // front node must be connected to same neighbour cluster
    \n+
    2251
    \n+
    2252 if(!connected(*vertex, connectedAggregates, aggregates))
    \n+
    2253 continue;
    \n+
    2254 }
    \n+
    2255
    \n+
    2256 double con = connectivity(*vertex, aggregates);
    \n+
    2257
    \n+
    2258 if(con == maxCon) {
    \n+
    2259 std::size_t frontNeighbours = noFrontNeighbours(*vertex);
    \n+
    2260
    \n+
    2261 if(frontNeighbours >= maxFrontNeighbours) {
    \n+
    2262 maxFrontNeighbours = frontNeighbours;
    \n+
    2263 candidate = *vertex;
    \n+
    2264 }
    \n+
    2265 }else if(con > maxCon) {
    \n+
    2266 maxCon = con;
    \n+
    2267 maxFrontNeighbours = noFrontNeighbours(*vertex);
    \n+
    2268 candidate = *vertex;
    \n+
    2269 }
    \n+
    2270 }
    \n+
    2271
    \n+
    2272 if(candidate==AggregatesMap<Vertex>::UNAGGREGATED)
    \n+
    2273 break;
    \n+
    2274
    \n+
    2275 aggregate_->add(candidate);
    \n+
    2276 }
    \n+
    2277 }
    \n+
    2278
    \n+
    2279 template<class G>
    \n+
    2280 template<class C>
    \n+
    2281 void Aggregator<G>::growAggregate(const Vertex& seed, const AggregatesMap<Vertex>& aggregates, const C& c)
    \n+
    2282 {
    \n+
    2283 using std::min;
    \n+
    2284
    \n+
    2285 std::size_t distance_ =0;
    \n+
    2286 while(aggregate_->size() < c.minAggregateSize()&& distance_<c.maxDistance()) {
    \n+
    2287 int maxTwoCons=0, maxOneCons=0, maxNeighbours=-1;
    \n+
    2288 double maxCon=-1;
    \n+
    2289
    \n+
    2290 std::vector<Vertex> candidates;
    \n+
    2291 candidates.reserve(30);
    \n+
    2292
    \n+
    2293 typedef typename std::vector<Vertex>::const_iterator Iterator;
    \n+
    2294
    \n+
    2295 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
    \n+
    2296 // Only nonisolated nodes are considered
    \n+
    2297 if(graph_->getVertexProperties(*vertex).isolated())
    \n+
    2298 continue;
    \n+
    2299
    \n+
    2300 int twoWayCons = twoWayConnections(*vertex, aggregate_->id(), aggregates);
    \n+
    2301
    \n+
    2302 /* The case of two way connections. */
    \n+
    2303 if( maxTwoCons == twoWayCons && twoWayCons > 0) {
    \n+
    2304 double con = connectivity(*vertex, aggregates);
    \n+
    2305
    \n+
    2306 if(con == maxCon) {
    \n+
    2307 int neighbours = noFrontNeighbours(*vertex);
    \n+
    2308
    \n+
    2309 if(neighbours > maxNeighbours) {
    \n+
    2310 maxNeighbours = neighbours;
    \n+
    2311 candidates.clear();
    \n+
    2312 candidates.push_back(*vertex);
    \n+
    2313 }else{
    \n+
    2314 candidates.push_back(*vertex);
    \n+
    2315 }
    \n+
    2316 }else if( con > maxCon) {
    \n+
    2317 maxCon = con;
    \n+
    2318 maxNeighbours = noFrontNeighbours(*vertex);
    \n+
    2319 candidates.clear();
    \n+
    2320 candidates.push_back(*vertex);
    \n+
    2321 }
    \n+
    2322 }else if(twoWayCons > maxTwoCons) {
    \n+
    2323 maxTwoCons = twoWayCons;
    \n+
    2324 maxCon = connectivity(*vertex, aggregates);
    \n+
    2325 maxNeighbours = noFrontNeighbours(*vertex);
    \n+
    2326 candidates.clear();
    \n+
    2327 candidates.push_back(*vertex);
    \n+
    2328
    \n+
    2329 // two way connections precede
    \n+
    2330 maxOneCons = std::numeric_limits<int>::max();
    \n+
    2331 }
    \n+
    2332
    \n+
    2333 if(twoWayCons > 0)
    \n+
    2334 {
    \n+
    2335 continue; // THis is a two-way node, skip tests for one way nodes
    \n+
    2336 }
    \n+
    2337
    \n+
    2338 /* The one way case */
    \n+
    2339 int oneWayCons = oneWayConnections(*vertex, aggregate_->id(), aggregates);
    \n+
    2340
    \n+
    2341 if(oneWayCons==0)
    \n+
    2342 continue; // No strong connections, skip the tests.
    \n+
    2343
    \n+
    2344 if(!admissible(*vertex, aggregate_->id(), aggregates))
    \n+
    2345 continue;
    \n+
    2346
    \n+
    2347 if( maxOneCons == oneWayCons && oneWayCons > 0) {
    \n+
    2348 double con = connectivity(*vertex, aggregates);
    \n+
    2349
    \n+
    2350 if(con == maxCon) {
    \n+
    2351 int neighbours = noFrontNeighbours(*vertex);
    \n+
    2352
    \n+
    2353 if(neighbours > maxNeighbours) {
    \n+
    2354 maxNeighbours = neighbours;
    \n+
    2355 candidates.clear();
    \n+
    2356 candidates.push_back(*vertex);
    \n+
    2357 }else{
    \n+
    2358 if(neighbours==maxNeighbours)
    \n+
    2359 {
    \n+
    2360 candidates.push_back(*vertex);
    \n+
    2361 }
    \n+
    2362 }
    \n+
    2363 }else if( con > maxCon) {
    \n+
    2364 maxCon = con;
    \n+
    2365 maxNeighbours = noFrontNeighbours(*vertex);
    \n+
    2366 candidates.clear();
    \n+
    2367 candidates.push_back(*vertex);
    \n+
    2368 }
    \n+
    2369 }else if(oneWayCons > maxOneCons) {
    \n+
    2370 maxOneCons = oneWayCons;
    \n+
    2371 maxCon = connectivity(*vertex, aggregates);
    \n+
    2372 maxNeighbours = noFrontNeighbours(*vertex);
    \n+
    2373 candidates.clear();
    \n+
    2374 candidates.push_back(*vertex);
    \n+
    2375 }
    \n+
    2376 }
    \n+
    2377
    \n+
    2378
    \n+
    2379 if(!candidates.size())
    \n+
    2380 break; // No more candidates found
    \n+
    2381 distance_=distance(seed, aggregates);
    \n+
    2382 candidates.resize(min(candidates.size(), c.maxAggregateSize()-
    \n+
    2383 aggregate_->size()));
    \n+
    2384 aggregate_->add(candidates);
    \n+
    2385 }
    \n+
    2386 }
    \n+
    2387
    \n+
    2388 template<typename V>
    \n+
    2389 template<typename M, typename G, typename C>
    \n+
    2390 std::tuple<int,int,int,int> AggregatesMap<V>::buildAggregates(const M& matrix, G& graph, const C& criterion,
    \n+
    2391 bool finestLevel)
    \n+
    2392 {
    \n+
    2393 Aggregator<G> aggregator;
    \n+
    2394 return aggregator.build(matrix, graph, *this, criterion, finestLevel);
    \n+
    2395 }
    \n+
    2396
    \n+
    2397 template<class G>
    \n+
    2398 template<class M, class C>
    \n+
    2399 std::tuple<int,int,int,int> Aggregator<G>::build(const M& m, G& graph, AggregatesMap<Vertex>& aggregates, const C& c,
    \n+
    2400 bool finestLevel)
    \n+
    2401 {
    \n+
    2402 using std::max;
    \n+
    2403 using std::min;
    \n+
    2404 // Stack for fast vertex access
    \n+
    2405 Stack stack_(graph, *this, aggregates);
    \n+
    2406
    \n+
    2407 graph_ = &graph;
    \n+
    2408
    \n+
    2409 aggregate_ = new Aggregate<G,VertexSet>(graph, aggregates, connected_, front_);
    \n+
    2410
    \n+
    2411 Timer watch;
    \n+
    2412 watch.reset();
    \n+
    2413
    \n+
    2414 buildDependency(graph, m, c, finestLevel);
    \n+
    2415
    \n+
    2416 dverb<<"Build dependency took "<< watch.elapsed()<<" seconds."<<std::endl;
    \n+
    2417 int noAggregates, conAggregates, isoAggregates, oneAggregates;
    \n+
    2418 std::size_t maxA=0, minA=1000000, avg=0;
    \n+
    2419 int skippedAggregates;
    \n+
    2420 noAggregates = conAggregates = isoAggregates = oneAggregates =
    \n+
    2421 skippedAggregates = 0;
    \n+
    2422
    \n+
    2423 while(true) {
    \n+
    2424 Vertex seed = stack_.pop();
    \n+
    2425
    \n+
    2426 if(seed == Stack::NullEntry)
    \n+
    2427 // No more unaggregated vertices. We are finished!
    \n+
    2428 break;
    \n+
    2429
    \n+
    2430 // Debugging output
    \n+
    2431 if((noAggregates+1)%10000 == 0)
    \n+
    2432 Dune::dverb<<"c";
    \n+
    2433 unmarkFront();
    \n+
    2434
    \n+
    2435 if(graph.getVertexProperties(seed).excludedBorder()) {
    \n+
    2436 aggregates[seed]=AggregatesMap<Vertex>::ISOLATED;
    \n+
    2437 ++skippedAggregates;
    \n+
    2438 continue;
    \n+
    2439 }
    \n+
    2440
    \n+
    2441 if(graph.getVertexProperties(seed).isolated()) {
    \n+
    2442 if(c.skipIsolated()) {
    \n+
    2443 // isolated vertices are not aggregated but skipped on the coarser levels.
    \n+
    2444 aggregates[seed]=AggregatesMap<Vertex>::ISOLATED;
    \n+
    2445 ++skippedAggregates;
    \n+
    2446 // skip rest as no agglomeration is done.
    \n+
    2447 continue;
    \n+
    2448 }else{
    \n+
    2449 aggregate_->seed(seed);
    \n+
    2450 growIsolatedAggregate(seed, aggregates, c);
    \n+
    2451 }
    \n+
    2452 }else{
    \n+
    2453 aggregate_->seed(seed);
    \n+
    2454 growAggregate(seed, aggregates, c);
    \n+
    2455 }
    \n+
    2456
    \n+
    2457 /* The rounding step. */
    \n+
    2458 while(!(graph.getVertexProperties(seed).isolated()) && aggregate_->size() < c.maxAggregateSize()) {
    \n+
    2459
    \n+
    2460 std::vector<Vertex> candidates;
    \n+
    2461 candidates.reserve(30);
    \n+
    2462
    \n+
    2463 typedef typename std::vector<Vertex>::const_iterator Iterator;
    \n+
    2464
    \n+
    2465 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {
    \n+
    2466
    \n+
    2467 if(graph.getVertexProperties(*vertex).isolated())
    \n+
    2468 continue; // No isolated nodes here
    \n+
    2469
    \n+
    2470 if(twoWayConnections( *vertex, aggregate_->id(), aggregates) == 0 &&
    \n+
    2471 (oneWayConnections( *vertex, aggregate_->id(), aggregates) == 0 ||
    \n+
    2472 !admissible( *vertex, aggregate_->id(), aggregates) ))
    \n+
    2473 continue;
    \n+
    2474
    \n+
    2475 std::pair<int,int> neighbourPair=neighbours(*vertex, aggregate_->id(),
    \n+
    2476 aggregates);
    \n+
    2477
    \n+
    2478 //if(aggregateNeighbours(*vertex, aggregate_->id(), aggregates) <= unusedNeighbours(*vertex, aggregates))
    \n+
    2479 // continue;
    \n+
    2480
    \n+
    2481 if(neighbourPair.first >= neighbourPair.second)
    \n+
    2482 continue;
    \n+
    2483
    \n+
    2484 if(distance(*vertex, aggregates) > c.maxDistance())
    \n+
    2485 continue; // Distance too far
    \n+
    2486 candidates.push_back(*vertex);
    \n+
    2487 break;
    \n+
    2488 }
    \n+
    2489
    \n+
    2490 if(!candidates.size()) break; // no more candidates found.
    \n+
    2491
    \n+
    2492 candidates.resize(min(candidates.size(), c.maxAggregateSize()-
    \n+
    2493 aggregate_->size()));
    \n+
    2494 aggregate_->add(candidates);
    \n+
    2495
    \n+
    2496 }
    \n+
    2497
    \n+
    2498 // try to merge aggregates consisting of only one nonisolated vertex with other aggregates
    \n+
    2499 if(aggregate_->size()==1 && c.maxAggregateSize()>1) {
    \n+
    2500 if(!graph.getVertexProperties(seed).isolated()) {
    \n+
    2501 Vertex mergedNeighbour = mergeNeighbour(seed, aggregates);
    \n+
    2502
    \n+
    2503 if(mergedNeighbour != AggregatesMap<Vertex>::UNAGGREGATED) {
    \n+
    2504 // assign vertex to the neighbouring cluster
    \n+
    2505 aggregates[seed] = aggregates[mergedNeighbour];
    \n+
    2506 aggregate_->invalidate();
    \n+
    2507 }else{
    \n+
    2508 ++avg;
    \n+
    2509 minA=min(minA,static_cast<std::size_t>(1));
    \n+
    2510 maxA=max(maxA,static_cast<std::size_t>(1));
    \n+
    2511 ++oneAggregates;
    \n+
    2512 ++conAggregates;
    \n+
    2513 }
    \n+
    2514 }else{
    \n+
    2515 ++avg;
    \n+
    2516 minA=min(minA,static_cast<std::size_t>(1));
    \n+
    2517 maxA=max(maxA,static_cast<std::size_t>(1));
    \n+
    2518 ++oneAggregates;
    \n+
    2519 ++isoAggregates;
    \n+
    2520 }
    \n+
    2521 ++avg;
    \n+
    2522 }else{
    \n+
    2523 avg+=aggregate_->size();
    \n+
    2524 minA=min(minA,aggregate_->size());
    \n+
    2525 maxA=max(maxA,aggregate_->size());
    \n+
    2526 if(graph.getVertexProperties(seed).isolated())
    \n+
    2527 ++isoAggregates;
    \n+
    2528 else
    \n+
    2529 ++conAggregates;
    \n+
    2530 }
    \n+
    2531
    \n+
    2532 }
    \n+
    2533
    \n+
    2534 Dune::dinfo<<"connected aggregates: "<<conAggregates;
    \n+
    2535 Dune::dinfo<<" isolated aggregates: "<<isoAggregates;
    \n+
    2536 if(conAggregates+isoAggregates>0)
    \n+
    2537 Dune::dinfo<<" one node aggregates: "<<oneAggregates<<" min size="
    \n+
    2538 <<minA<<" max size="<<maxA
    \n+
    2539 <<" avg="<<avg/(conAggregates+isoAggregates)<<std::endl;
    \n+
    2540
    \n+
    2541 delete aggregate_;
    \n+
    2542 return std::make_tuple(conAggregates+isoAggregates,isoAggregates,
    \n+
    2543 oneAggregates,skippedAggregates);
    \n+
    2544 }
    \n+
    2545
    \n+
    2546
    \n+
    2547 template<class G>
    \n+
    2548 Aggregator<G>::Stack::Stack(const MatrixGraph& graph, const Aggregator<G>& aggregatesBuilder,
    \n+
    2549 const AggregatesMap<Vertex>& aggregates)
    \n+
    2550 : graph_(graph), aggregatesBuilder_(aggregatesBuilder), aggregates_(aggregates), begin_(graph.begin()), end_(graph.end())
    \n+
    2551 {
    \n+
    2552 //vals_ = new Vertex[N];
    \n+
    2553 }
    \n+
    2554
    \n+
    2555 template<class G>
    \n+\n+
    2557 {
    \n+
    2558 //Dune::dverb << "Max stack size was "<<maxSize_<<" filled="<<filled_<<std::endl;
    \n+
    2559 //delete[] vals_;
    \n+
    2560 }
    \n+
    2561
    \n+
    2562 template<class G>
    \n+\n+
    2564 = std::numeric_limits<typename G::VertexDescriptor>::max();
    \n+
    2565
    \n+
    2566 template<class G>
    \n+
    2567 inline typename G::VertexDescriptor Aggregator<G>::Stack::pop()
    \n+
    2568 {
    \n+
    2569 for(; begin_!=end_ && aggregates_[*begin_] != AggregatesMap<Vertex>::UNAGGREGATED; ++begin_) ;
    \n+
    2570
    \n+
    2571 if(begin_!=end_)
    \n+
    2572 {
    \n+
    2573 typename G::VertexDescriptor current=*begin_;
    \n+
    2574 ++begin_;
    \n+
    2575 return current;
    \n+
    2576 }else
    \n+
    2577 return NullEntry;
    \n+
    2578 }
    \n+
    2579
    \n+
    2580#endif // DOXYGEN
    \n+
    2581
    \n+
    2582 template<class V>
    \n+
    \n+
    2583 void printAggregates2d(const AggregatesMap<V>& aggregates, int n, int m, std::ostream& os)
    \n+
    2584 {
    \n+
    2585 using std::max;
    \n+
    2586
    \n+
    2587 std::ios_base::fmtflags oldOpts=os.flags();
    \n+
    2588
    \n+
    2589 os.setf(std::ios_base::right, std::ios_base::adjustfield);
    \n+
    2590
    \n+
    2591 V maxVal=0;
    \n+
    2592 int width=1;
    \n+
    2593
    \n+
    2594 for(int i=0; i< n*m; i++)
    \n+
    2595 maxVal=max(maxVal, aggregates[i]);
    \n+
    2596
    \n+
    2597 for(int i=10; i < 1000000; i*=10)
    \n+
    2598 if(maxVal/i>0)
    \n+
    2599 width++;
    \n+
    2600 else
    \n+
    2601 break;
    \n+
    2602
    \n+
    2603 for(int j=0, entry=0; j < m; j++) {
    \n+
    2604 for(int i=0; i<n; i++, entry++) {
    \n+
    2605 os.width(width);
    \n+
    2606 os<<aggregates[entry]<<" ";
    \n+
    2607 }
    \n+
    2608
    \n+
    2609 os<<std::endl;
    \n+
    2610 }
    \n+
    2611 os<<std::endl;
    \n+
    2612 os.flags(oldOpts);
    \n+
    2613 }
    \n+
    \n+
    2614
    \n+
    2615
    \n+
    2616 } // namespace Amg
    \n+
    2617
    \n+
    2618} // namespace Dune
    \n+
    2619
    \n+
    2620
    \n+
    2621#endif
    \n+
    Provides classes for building the matrix graph.
    \n+
    Provides classes for handling internal properties in a graph.
    \n+
    Parameter classes for customizing AMG.
    \n+\n+
    Col col
    Definition matrixmatrix.hh:351
    \n+
    Matrix::ConstColIterator ColIter
    Constant column iterator of the matrix.
    Definition aggregates.hh:273
    \n+
    std::vector< real_type >::iterator valIter_
    Definition aggregates.hh:189
    \n+
    Matrix::ConstColIterator ColIter
    Constant column iterator of the matrix.
    Definition aggregates.hh:154
    \n+
    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.
    \n+
    PoolAllocator< VertexDescriptor, 100 > Allocator
    The allocator we use for our lists and the set.
    Definition aggregates.hh:586
    \n+
    iterator begin()
    Definition aggregates.hh:737
    \n+
    int id()
    Get the id identifying the aggregate.
    \n+
    Norm norm_
    The functor for calculating the norm.
    Definition aggregates.hh:302
    \n+
    MatrixGraph::VertexDescriptor Vertex
    The vertex identifier.
    Definition aggregates.hh:920
    \n+
    AggregationCriterion()
    Constructor.
    Definition aggregates.hh:66
    \n+
    const Matrix * matrix_
    The matrix we work on.
    Definition aggregates.hh:357
    \n+
    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
    \n+
    void initRow(const Row &row, int index)
    \n+
    SymmetricMatrixDependency(const Parameters &parms)
    Definition aggregates.hh:168
    \n+
    M Matrix
    The matrix type we build the dependency of.
    Definition aggregates.hh:258
    \n+\n+
    G MatrixGraph
    The matrix graph type used.
    Definition aggregates.hh:915
    \n+
    Norm norm_
    The functor for calculating the norm.
    Definition aggregates.hh:363
    \n+
    void operator()(const EdgeIterator &edge) const
    Definition aggregates.hh:601
    \n+
    SymmetricCriterion()
    Definition aggregates.hh:524
    \n+
    Dependency()
    Definition aggregates.hh:290
    \n+
    void examine(const ColIter &col)
    \n+
    M Matrix
    The matrix type we build the dependency of.
    Definition aggregates.hh:319
    \n+
    real_type diagonal_
    The norm of the current diagonal.
    Definition aggregates.hh:187
    \n+
    N Norm
    The norm to use for examining the matrix entries.
    Definition aggregates.hh:263
    \n+
    iterator end()
    Definition aggregates.hh:742
    \n+
    UnSymmetricCriterion(const Parameters &parms)
    Definition aggregates.hh:541
    \n+
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n+
    void initRow(const Row &row, int index)
    Definition aggregates.hh:201
    \n+\n+
    static const Vertex NullEntry
    Definition aggregates.hh:1008
    \n+
    void examine(const ColIter &col)
    Definition aggregates.hh:214
    \n+
    Dependency(const Parameters &parms)
    Definition aggregates.hh:286
    \n+
    int row_
    index of the currently evaluated row.
    Definition aggregates.hh:185
    \n+
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n+
    std::tuple< int, int, int, int > build(const M &m, G &graph, AggregatesMap< Vertex > &aggregates, const C &c, bool finestLevel)
    Build the aggregates.
    \n+
    FrontNeighbourCounter(const MatrixGraph &front)
    Constructor.
    \n+
    Matrix::row_type Row
    Constant Row iterator of the matrix.
    Definition aggregates.hh:329
    \n+
    const Matrix * matrix_
    The matrix we work on.
    Definition aggregates.hh:296
    \n+
    const AggregateDescriptor & operator[](const VertexDescriptor &v) const
    Get the aggregate a vertex belongs to.
    \n+
    void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter &col)
    \n+
    AggregateVisitor(const AggregatesMap< Vertex > &aggregates, const AggregateDescriptor &aggregate, Visitor &visitor)
    Constructor.
    \n+
    Matrix::ConstColIterator ColIter
    Constant column iterator of the matrix.
    Definition aggregates.hh:334
    \n+
    ~AggregatesMap()
    Destructor.
    \n+
    Matrix::field_type field_type
    The current max value.
    Definition aggregates.hh:179
    \n+
    void decrement()
    Decrement counter.
    \n+
    Aggregate(MatrixGraph &graph, AggregatesMap< Vertex > &aggregates, VertexSet &connectivity, std::vector< Vertex > &front_)
    Constructor.
    \n+
    V Visitor
    The type of the adapted visitor.
    Definition aggregates.hh:1064
    \n+
    std::size_t * SphereMap
    Type of the mapping of aggregate members onto distance spheres.
    Definition aggregates.hh:809
    \n+
    AggregationCriterion(const Parameters &parms)
    Definition aggregates.hh:70
    \n+
    Matrix::row_type Row
    Constant Row iterator of the matrix.
    Definition aggregates.hh:268
    \n+
    VertexSet::size_type connectSize()
    Get the number of connections to other aggregates.
    \n+
    std::vector< real_type > vals_
    Definition aggregates.hh:188
    \n+
    N Norm
    The norm to use for examining the matrix entries.
    Definition aggregates.hh:324
    \n+
    void printAggregates2d(const AggregatesMap< V > &aggregates, int n, int m, std::ostream &os)
    Definition aggregates.hh:2583
    \n+
    void invalidate()
    Definition aggregates.hh:822
    \n+
    const_iterator begin() const
    Definition aggregates.hh:725
    \n+
    real_type maxValue_
    Definition aggregates.hh:181
    \n+
    Norm norm_
    The functor for calculating the norm.
    Definition aggregates.hh:183
    \n+
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n+
    VertexSet::const_iterator const_iterator
    Const iterator over a vertex list.
    Definition aggregates.hh:804
    \n+
    SymmetricCriterion(const Parameters &parms)
    Definition aggregates.hh:521
    \n+
    MatrixGraph::VertexDescriptor AggregateDescriptor
    The type of the aggregate descriptor.
    Definition aggregates.hh:923
    \n+
    real_type maxValue_
    Definition aggregates.hh:361
    \n+
    void init(const Matrix *matrix)
    Definition aggregates.hh:195
    \n+
    real_type diagonal_
    The norm of the current diagonal.
    Definition aggregates.hh:367
    \n+
    AggregateDescriptor * iterator
    Definition aggregates.hh:735
    \n+
    SymmetricDependency(const Parameters &parms)
    Definition aggregates.hh:348
    \n+
    FieldTraits< field_type >::real_type real_type
    Definition aggregates.hh:360
    \n+
    ~Aggregator()
    Destructor.
    \n+
    void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter &col)
    \n+
    void add(const Vertex &vertex)
    Add a vertex to the aggregate.
    \n+
    T DependencyPolicy
    The policy for calculating the dependency graph.
    Definition aggregates.hh:55
    \n+
    void add(std::vector< Vertex > &vertex)
    \n+
    void examine(const ColIter &col)
    \n+
    Aggregator()
    Constructor.
    \n+
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    Examine an edge.
    \n+
    FrontMarker(std::vector< Vertex > &front, MatrixGraph &graph)
    Constructor.
    \n+
    FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
    compute the norm of a matrix.
    Definition aggregates.hh:506
    \n+
    void init(const Matrix *matrix)
    \n+
    int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex, V &visitor)
    Visit all neighbour vertices of a vertex in a graph.
    \n+
    void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)
    Sets reasonable default values for an isotropic problem.
    Definition aggregates.hh:82
    \n+
    const_iterator end() const
    Definition aggregates.hh:730
    \n+
    V AggregateDescriptor
    The aggregate descriptor type.
    Definition aggregates.hh:580
    \n+
    static const V ISOLATED
    Identifier of isolated vertices.
    Definition aggregates.hh:571
    \n+
    int row_
    index of the currently evaluated row.
    Definition aggregates.hh:365
    \n+
    SymmetricMatrixDependency()
    Definition aggregates.hh:171
    \n+\n+\n+
    real_type diagonal_
    The norm of the current diagonal.
    Definition aggregates.hh:306
    \n+
    std::size_t noVertices() const
    Get the number of vertices.
    \n+
    void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2)
    Sets reasonable default values for an aisotropic problem.
    Definition aggregates.hh:105
    \n+
    AggregatesMap(std::size_t noVertices)
    Constructs with allocating memory.
    \n+
    Matrix::field_type field_type
    The current max value.
    Definition aggregates.hh:359
    \n+
    AggregateDescriptor & operator[](const VertexDescriptor &v)
    Get the aggregate a vertex belongs to.
    \n+
    AggregatesMap()
    Constructs without allocating memory.
    \n+
    int value()
    Access the current count.
    \n+
    SLList< VertexDescriptor, Allocator > VertexList
    The type of a single linked list of vertex descriptors.
    Definition aggregates.hh:592
    \n+\n+
    ConnectivityCounter(const VertexSet &connected, const AggregatesMap< Vertex > &aggregates)
    Constructor.
    \n+
    VertexSet::size_type size()
    Get the size of the aggregate.
    \n+
    const_iterator end() const
    get an iterator over the vertices of the aggregate.
    \n+
    void init(const Matrix *matrix)
    \n+
    UnSymmetricCriterion()
    Definition aggregates.hh:544
    \n+
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n+
    const AggregateDescriptor * const_iterator
    Definition aggregates.hh:723
    \n+
    int row_
    index of the currently evaluated row.
    Definition aggregates.hh:304
    \n+
    Stack(const MatrixGraph &graph, const Aggregator< G > &aggregatesBuilder, const AggregatesMap< Vertex > &aggregates)
    \n+
    FieldTraits< field_type >::real_type real_type
    Definition aggregates.hh:180
    \n+
    void initRow(const Row &row, int index)
    \n+
    M Matrix
    The matrix type we build the dependency of.
    Definition aggregates.hh:139
    \n+
    FieldTraits< field_type >::real_type real_type
    Definition aggregates.hh:299
    \n+
    const Matrix * matrix_
    The matrix we work on.
    Definition aggregates.hh:177
    \n+
    S VertexSet
    The type of a single linked list of vertex descriptors.
    Definition aggregates.hh:801
    \n+
    FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
    compute the norm of a matrix.
    Definition aggregates.hh:490
    \n+
    static const V UNAGGREGATED
    Identifier of not yet aggregated vertices.
    Definition aggregates.hh:566
    \n+
    std::size_t breadthFirstSearch(const VertexDescriptor &start, const AggregateDescriptor &aggregate, const G &graph, F &aggregateVisitor, VM &visitedMap) const
    Breadth first search within an aggregate.
    \n+
    Matrix::field_type field_type
    The current max value.
    Definition aggregates.hh:298
    \n+
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n+
    std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T > &criterion)
    Definition aggregates.hh:113
    \n+
    bool isIsolated()
    Definition aggregates.hh:240
    \n+
    void allocate(std::size_t noVertices)
    Allocate memory for holding the information.
    \n+
    N Norm
    The norm to use for examining the matrix entries.
    Definition aggregates.hh:144
    \n+
    FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const
    compute the norm of a matrix.
    Definition aggregates.hh:473
    \n+
    void reconstruct(const Vertex &vertex)
    Reconstruct the aggregat from an seed node.
    \n+
    const_iterator begin() const
    get an iterator over the vertices of the aggregate.
    \n+
    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
    \n+
    MatrixGraph::VertexDescriptor Vertex
    The vertex descriptor type.
    Definition aggregates.hh:789
    \n+
    void seed(const Vertex &vertex)
    Initialize the aggregate with one vertex.
    \n+\n+
    SymmetricDependency()
    Definition aggregates.hh:351
    \n+
    void clear()
    Clear the aggregate.
    \n+
    void free()
    Free the allocated memory.
    \n+
    void increment()
    Increment counter.
    \n+
    void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion, bool finestLevel)
    Build the dependency of the matrix graph.
    \n+
    V VertexDescriptor
    The vertex descriptor type.
    Definition aggregates.hh:575
    \n+
    real_type maxValue_
    Definition aggregates.hh:300
    \n+
    std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph, const C &criterion, bool finestLevel)
    Build the aggregates.
    \n+
    Matrix::row_type Row
    Constant Row iterator of the matrix.
    Definition aggregates.hh:149
    \n+
    PoolAllocator< Vertex, 100 > Allocator
    The allocator we use for our lists and the set.
    Definition aggregates.hh:795
    \n+
    G MatrixGraph
    Definition aggregates.hh:785
    \n+
    void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)
    \n+
    @ is_sign_preserving
    Definition aggregates.hh:483
    \n+
    @ is_sign_preserving
    Definition aggregates.hh:382
    \n+
    @ is_sign_preserving
    Definition aggregates.hh:499
    \n+
    @ is_sign_preserving
    Definition aggregates.hh:466
    \n
    Definition allocator.hh:11
    \n-
    A multiple of the identity matrix of static size.
    Definition scaledidmatrix.hh:30
    \n-
    void usmhv(const K &alpha, const X &x, Y &y) const
    y += alpha A^H x
    Definition scaledidmatrix.hh:349
    \n-
    void mmtv(const X &x, Y &y) const
    y -= A^T x
    Definition scaledidmatrix.hh:301
    \n-
    ScaledIdentityMatrix & operator-=(const ScaledIdentityMatrix &y)
    vector space subtraction
    Definition scaledidmatrix.hh:165
    \n-
    const_row_type::ConstIterator ConstColIterator
    rename the iterators for easier access
    Definition scaledidmatrix.hh:127
    \n-
    ConstIterator end() const
    end iterator
    Definition scaledidmatrix.hh:136
    \n-
    Iterator beforeBegin()
    Definition scaledidmatrix.hh:114
    \n-
    bool operator!=(const ScaledIdentityMatrix &other) const
    incomparison operator
    Definition scaledidmatrix.hh:225
    \n-
    void mmv(const X &x, Y &y) const
    y -= A x
    Definition scaledidmatrix.hh:289
    \n-
    std::size_t size_type
    The type used for the index access and size operations.
    Definition scaledidmatrix.hh:43
    \n-
    void usmv(const K &alpha, const X &x, Y &y) const
    y += alpha A x
    Definition scaledidmatrix.hh:325
    \n-
    row_type::Iterator ColIterator
    rename the iterators for easier access
    Definition scaledidmatrix.hh:91
    \n-
    const_row_type const_reference
    Definition scaledidmatrix.hh:49
    \n-
    void mv(const X &x, Y &y) const
    y = A x
    Definition scaledidmatrix.hh:234
    \n-
    void umtv(const X &x, Y &y) const
    y += A^T x
    Definition scaledidmatrix.hh:265
    \n-
    void umhv(const X &x, Y &y) const
    y += A^H x
    Definition scaledidmatrix.hh:277
    \n-
    DiagonalRowVector< K, n > row_type
    Each row is implemented by a field vector.
    Definition scaledidmatrix.hh:46
    \n-
    ContainerWrapperIterator< const WrapperType, reference, reference > Iterator
    Iterator class for sequential access.
    Definition scaledidmatrix.hh:85
    \n-
    Iterator beforeEnd()
    Definition scaledidmatrix.hh:107
    \n-
    K determinant() const
    calculates the determinant of this matrix
    Definition scaledidmatrix.hh:404
    \n-
    K field_type
    export the type representing the field
    Definition scaledidmatrix.hh:37
    \n-
    void usmtv(const K &alpha, const X &x, Y &y) const
    y += alpha A^T x
    Definition scaledidmatrix.hh:337
    \n-
    Iterator end()
    end iterator
    Definition scaledidmatrix.hh:100
    \n-
    Iterator iterator
    typedef for stl compliant access
    Definition scaledidmatrix.hh:87
    \n-
    const K & scalar() const
    Get const reference to the scalar diagonal value.
    Definition scaledidmatrix.hh:473
    \n-
    void umv(const X &x, Y &y) const
    y += A x
    Definition scaledidmatrix.hh:253
    \n-
    const K & diagonal(size_type) const
    Get const reference to diagonal entry.
    Definition scaledidmatrix.hh:460
    \n-
    @ rows
    The number of rows.
    Definition scaledidmatrix.hh:54
    \n-
    @ cols
    The number of columns.
    Definition scaledidmatrix.hh:56
    \n-
    ScaledIdentityMatrix & operator=(const K &k)
    Definition scaledidmatrix.hh:71
    \n-
    ContainerWrapperIterator< const WrapperType, const_reference, const_reference > ConstIterator
    Iterator class for sequential access.
    Definition scaledidmatrix.hh:121
    \n-
    K & diagonal(size_type)
    Get reference to diagonal entry.
    Definition scaledidmatrix.hh:466
    \n-
    void solve(V &x, const V &b) const
    Solve system A x = b.
    Definition scaledidmatrix.hh:390
    \n-
    bool exists(size_type i, size_type j) const
    return true when (i,j) is in pattern
    Definition scaledidmatrix.hh:425
    \n-
    Iterator RowIterator
    rename the iterators for easier access
    Definition scaledidmatrix.hh:89
    \n-
    ConstIterator const_iterator
    typedef for stl compliant access
    Definition scaledidmatrix.hh:123
    \n-
    ScaledIdentityMatrix()
    Default constructor.
    Definition scaledidmatrix.hh:62
    \n-
    bool operator==(const ScaledIdentityMatrix &other) const
    comparison operator
    Definition scaledidmatrix.hh:219
    \n-
    ConstIterator beforeBegin() const
    Definition scaledidmatrix.hh:150
    \n-
    ScaledIdentityMatrix & operator/=(const K &k)
    vector space division by scalar
    Definition scaledidmatrix.hh:192
    \n-
    friend std::ostream & operator<<(std::ostream &s, const ScaledIdentityMatrix< K, n > &a)
    Sends the matrix to an output stream.
    Definition scaledidmatrix.hh:437
    \n-
    FieldTraits< field_type >::real_type frobenius_norm2() const
    square of frobenius norm, need for block recursion
    Definition scaledidmatrix.hh:368
    \n-
    FieldTraits< field_type >::real_type frobenius_norm() const
    frobenius norm: sqrt(sum over squared values of entries)
    Definition scaledidmatrix.hh:362
    \n-
    FieldTraits< field_type >::real_type infinity_norm() const
    infinity norm (row sum norm, how to generalize for blocks?)
    Definition scaledidmatrix.hh:374
    \n-
    ConstIterator ConstRowIterator
    rename the iterators for easier access
    Definition scaledidmatrix.hh:125
    \n-
    ConstIterator beforeEnd() const
    Definition scaledidmatrix.hh:143
    \n-
    size_type M() const
    number of blocks in column direction
    Definition scaledidmatrix.hh:417
    \n-
    const_reference operator[](size_type i) const
    Return const_reference object as row replacement.
    Definition scaledidmatrix.hh:454
    \n-
    ScaledIdentityMatrix(const K &k)
    Constructor initializing the whole matrix with a scalar.
    Definition scaledidmatrix.hh:66
    \n-
    friend auto operator*(const ScaledIdentityMatrix &matrix, Scalar scalar)
    vector space multiplication with scalar
    Definition scaledidmatrix.hh:203
    \n-
    FieldTraits< field_type >::real_type infinity_norm_real() const
    simplified infinity norm (uses Manhattan norm for complex values)
    Definition scaledidmatrix.hh:380
    \n-
    ScaledIdentityMatrix & operator*=(const K &k)
    vector space multiplication with scalar
    Definition scaledidmatrix.hh:185
    \n-
    bool identical(const ScaledIdentityMatrix< K, n > &other) const
    Definition scaledidmatrix.hh:78
    \n-
    void invert()
    Compute inverse.
    Definition scaledidmatrix.hh:398
    \n-
    Iterator begin()
    begin iterator
    Definition scaledidmatrix.hh:94
    \n-
    K & scalar()
    Get reference to the scalar diagonal value.
    Definition scaledidmatrix.hh:480
    \n-
    row_type reference
    Definition scaledidmatrix.hh:47
    \n-
    K block_type
    export the type representing the components
    Definition scaledidmatrix.hh:40
    \n-
    void mmhv(const X &x, Y &y) const
    y -= A^H x
    Definition scaledidmatrix.hh:313
    \n-
    ScaledIdentityMatrix & operator+=(const ScaledIdentityMatrix &y)
    vector space addition
    Definition scaledidmatrix.hh:158
    \n-
    DiagonalRowVectorConst< K, n > const_row_type
    Definition scaledidmatrix.hh:48
    \n-
    void mtv(const X &x, Y &y) const
    y = A^T x
    Definition scaledidmatrix.hh:246
    \n-
    reference operator[](size_type i)
    Return reference object as row replacement.
    Definition scaledidmatrix.hh:448
    \n-
    ConstIterator begin() const
    begin iterator
    Definition scaledidmatrix.hh:130
    \n-
    size_type N() const
    number of blocks in row direction
    Definition scaledidmatrix.hh:411
    \n-
    static void apply(DenseMatrix &denseMatrix, ScaledIdentityMatrix< field, N > const &rhs)
    Definition scaledidmatrix.hh:493
    \n-
    typename ScaledIdentityMatrix< K, n >::field_type field_type
    Definition scaledidmatrix.hh:506
    \n-
    typename FieldTraits< field_type >::real_type real_type
    Definition scaledidmatrix.hh:507
    \n+
    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
    \n+
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    typename Imp::BlockTraits< T >::field_type field_type
    Export the type representing the underlying field.
    Definition matrix.hh:565
    \n+
    row_type::const_iterator ConstColIterator
    Const iterator for the entries of each row.
    Definition matrix.hh:589
    \n+
    MatrixImp::DenseMatrixBase< T, A >::window_type row_type
    The type implementing a matrix row.
    Definition matrix.hh:574
    \n+
    Base class of all aggregation criterions.
    Definition aggregates.hh:49
    \n+
    Dependency policy for symmetric matrices.
    Definition aggregates.hh:134
    \n+
    Dependency policy for symmetric matrices.
    Definition aggregates.hh:253
    \n+
    Dependency policy for symmetric matrices.
    Definition aggregates.hh:314
    \n+
    Norm that uses only the [N][N] entry of the block to determine couplings.
    Definition aggregates.hh:379
    \n+
    Norm that uses only the [0][0] entry of the block to determine couplings.
    Definition aggregates.hh:455
    \n+
    Functor using the row sum (infinity) norm to determine strong couplings.
    Definition aggregates.hh:463
    \n+
    Definition aggregates.hh:480
    \n+
    Definition aggregates.hh:496
    \n+
    Criterion taking advantage of symmetric matrices.
    Definition aggregates.hh:519
    \n+
    Criterion suitable for unsymmetric matrices.
    Definition aggregates.hh:539
    \n+
    Class for building the aggregates.
    Definition aggregates.hh:909
    \n+
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n+
    A Dummy visitor that does nothing for each visited edge.
    Definition aggregates.hh:598
    \n+
    A class for temporarily storing the vertices of an aggregate in.
    Definition aggregates.hh:778
    \n+
    M::size_type VertexDescriptor
    The vertex descriptor.
    Definition graph.hh:73
    \n+
    EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator
    The constant edge iterator type.
    Definition graph.hh:298
    \n+
    Iterator over all edges starting from a vertex.
    Definition graph.hh:95
    \n+
    The vertex iterator type of the graph.
    Definition graph.hh:209
    \n+
    All parameters for AMG.
    Definition parameters.hh:416
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,711 +1,2654 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-scaledidmatrix.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+aggregates.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_SCALEDIDMATRIX_HH\n-6#define DUNE_ISTL_SCALEDIDMATRIX_HH\n+5#ifndef DUNE_AMG_AGGREGATES_HH\n+6#define DUNE_AMG_AGGREGATES_HH\n 7\n-14#include \n-15#include \n-16#include \n-17#include \n-18#include \n-19#include \n-20#include \n-21#include \n-22\n-23namespace _\bD_\bu_\bn_\be {\n-24\n-28 template\n-_\b2_\b9 class _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx\n-30 {\n-31 typedef DiagonalMatrixWrapper< ScaledIdentityMatrix > WrapperType;\n-32\n-33 public:\n-34 //===== type definitions and constants\n-35\n-_\b3_\b7 typedef K _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-38\n-_\b4_\b0 typedef K _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-41\n-_\b4_\b3 typedef std::size_t _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-44\n-_\b4_\b6 typedef DiagonalRowVector _\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n-_\b4_\b7 typedef _\br_\bo_\bw_\b__\bt_\by_\bp_\be _\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n-_\b4_\b8 typedef DiagonalRowVectorConst _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\bt_\by_\bp_\be;\n-_\b4_\b9 typedef _\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be;\n+8\n+9#include \"_\bp_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs_\b._\bh_\bh\"\n+10#include \"_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\"\n+11#include \"_\bp_\br_\bo_\bp_\be_\br_\bt_\bi_\be_\bs_\b._\bh_\bh\"\n+12#include \"_\bc_\bo_\bm_\bb_\bi_\bn_\be_\bd_\bf_\bu_\bn_\bc_\bt_\bo_\br_\b._\bh_\bh\"\n+13\n+14#include \n+15#include \n+16#include \n+17#include \n+18#include \n+19#include \n+20\n+21#include \n+22#include \n+23#include \n+24#include \n+25#include \n+26#include \n+27#include \n+28\n+29namespace _\bD_\bu_\bn_\be\n+30{\n+31 namespace Amg\n+32 {\n+33\n+47 template\n+_\b4_\b8 class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn : public T\n+49 {\n 50\n-52 enum {\n-_\b5_\b4 _\br_\bo_\bw_\bs = n,\n-56 _\bc_\bo_\bl_\bs = n\n-_\b5_\b7 };\n-58\n-59 //===== constructors\n-_\b6_\b2 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx () {}\n-63\n-_\b6_\b6 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx (const K& k)\n-67 : p_(k)\n+51 public:\n+_\b5_\b5 typedef T _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\bo_\bl_\bi_\bc_\by;\n+56\n+_\b6_\b6 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn()\n+67 : T()\n 68 {}\n 69\n-70 //===== assignment from scalar\n-_\b7_\b1 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const K& k)\n-72 {\n-73 p_ = k;\n-74 return *this;\n-75 }\n-76\n-77 // check if matrix is identical to other matrix (not only identical values)\n-_\b7_\b8 bool _\bi_\bd_\be_\bn_\bt_\bi_\bc_\ba_\bl(const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b>& other) const\n-79 {\n-80 return (this==&other);\n-81 }\n-82\n-83 //===== iterator interface to rows of the matrix\n-_\b8_\b5 typedef ContainerWrapperIterator\n-_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b8_\b7 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b8_\b9 typedef _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b9_\b1 typedef typename row_type::Iterator _\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-92\n-_\b9_\b4 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn ()\n-95 {\n-96 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),0);\n-97 }\n-98\n-_\b1_\b0_\b0 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd ()\n-101 {\n-102 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),n);\n-103 }\n-104\n-_\b1_\b0_\b7 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd ()\n-108 {\n-109 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),n-1);\n-110 }\n+_\b7_\b0 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n+71 : T(parms)\n+72 {}\n+_\b8_\b2 void _\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bI_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc(std::size_t dim, std::size_t diameter=2)\n+83 {\n+84 this->setMaxDistance(diameter-1);\n+85 std::size_t csize=1;\n+86\n+87 for(; dim>0; dim--) {\n+88 csize*=diameter;\n+89 this->setMaxDistance(this->maxDistance()+diameter-1);\n+90 }\n+91 this->setMinAggregateSize(csize);\n+92 this->setMaxAggregateSize(static_cast(csize*1.5));\n+93 }\n+94\n+_\b1_\b0_\b5 void _\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bA_\bn_\bi_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc(std::size_t dim,std::size_t diameter=2)\n+106 {\n+107 _\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bI_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc(dim, diameter);\n+108 this->setMaxDistance(this->maxDistance()+dim-1);\n+109 }\n+110 };\n 111\n-_\b1_\b1_\b4 _\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn ()\n-115 {\n-116 return _\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),-1);\n-117 }\n-118\n-119\n-_\b1_\b2_\b1 typedef ContainerWrapperIterator _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b1_\b2_\b3 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b1_\b2_\b5 typedef _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-_\b1_\b2_\b7 typedef typename const_row_type::ConstIterator _\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-128\n-_\b1_\b3_\b0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn () const\n-131 {\n-132 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),0);\n-133 }\n-134\n-_\b1_\b3_\b6 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd () const\n-137 {\n-138 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),n);\n-139 }\n+112 template\n+_\b1_\b1_\b3 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<(std::ostream& os, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b<_\bT_\b>&\n+criterion)\n+114 {\n+115 os<<\"{ maxdistance=\"<\n+_\b1_\b3_\b3 class _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by : public _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+134 {\n+135 public:\n+_\b1_\b3_\b9 typedef M _\bM_\ba_\bt_\br_\bi_\bx;\n 140\n-_\b1_\b4_\b3 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd() const\n-144 {\n-145 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),n-1);\n-146 }\n-147\n-_\b1_\b5_\b0 _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn () const\n-151 {\n-152 return _\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br(WrapperType(this),-1);\n-153 }\n-154\n-155 //===== vector space arithmetic\n-156\n-_\b1_\b5_\b8 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& y)\n-159 {\n-160 p_ += y.p_;\n-161 return *this;\n-162 }\n-163\n-_\b1_\b6_\b5 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& y)\n-166 {\n-167 p_ -= y.p_;\n-168 return *this;\n-169 }\n-170\n-_\b1_\b7_\b2 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=_\b (const K& k)\n-173 {\n-174 p_ += k;\n-175 return *this;\n-176 }\n-177\n-_\b1_\b7_\b9 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=_\b (const K& k)\n-180 {\n-181 p_ -= k;\n-182 return *this;\n-183 }\n-_\b1_\b8_\b5 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=_\b (const K& k)\n-186 {\n-187 p_ *= k;\n-188 return *this;\n-189 }\n+_\b1_\b4_\b4 typedef N _\bN_\bo_\br_\bm;\n+145\n+_\b1_\b4_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bR_\bo_\bw;\n+150\n+_\b1_\b5_\b4 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bl_\bI_\bt_\be_\br;\n+155\n+156 void _\bi_\bn_\bi_\bt(const _\bM_\ba_\bt_\br_\bi_\bx* matrix);\n+157\n+158 void _\bi_\bn_\bi_\bt_\bR_\bo_\bw(const _\bR_\bo_\bw& row, int index);\n+159\n+160 void _\be_\bx_\ba_\bm_\bi_\bn_\be(const _\bC_\bo_\bl_\bI_\bt_\be_\br& _\bc_\bo_\bl);\n+161\n+162 template\n+163 void _\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph, const typename G::EdgeIterator& edge, const _\bC_\bo_\bl_\bI_\bt_\be_\br&\n+_\bc_\bo_\bl);\n+164\n+165 bool _\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd();\n+166\n+167\n+_\b1_\b6_\b8 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n+169 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(parms)\n+170 {}\n+_\b1_\b7_\b1 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by()\n+172 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs()\n+173 {}\n+174\n+175 protected:\n+_\b1_\b7_\b7 const _\bM_\ba_\bt_\br_\bi_\bx* _\bm_\ba_\bt_\br_\bi_\bx_\b_;\n+_\b1_\b7_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b1_\b8_\b0 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+_\b1_\b8_\b1 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_;\n+_\b1_\b8_\b3 _\bN_\bo_\br_\bm _\bn_\bo_\br_\bm_\b_;\n+_\b1_\b8_\b5 int _\br_\bo_\bw_\b_;\n+_\b1_\b8_\b7 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_;\n+_\b1_\b8_\b8 std::vector _\bv_\ba_\bl_\bs_\b_;\n+_\b1_\b8_\b9 typename std::vector::iterator _\bv_\ba_\bl_\bI_\bt_\be_\br_\b_;\n 190\n-_\b1_\b9_\b2 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=_\b (const K& k)\n-193 {\n-194 p_ /= k;\n-195 return *this;\n-196 }\n-197\n-198 //===== binary operators\n+191 };\n+192\n+193\n+194 template\n+_\b1_\b9_\b5 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt(const _\bM_\ba_\bt_\br_\bi_\bx* matrix)\n+196 {\n+197 matrix_ = matrix;\n+198 }\n 199\n-201 template ::value, int> = 0>\n-_\b2_\b0_\b3 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b ( const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& matrix, Scalar _\bs_\bc_\ba_\bl_\ba_\br)\n-204 {\n-205 return _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bK_\b,_\bS_\bc_\ba_\bl_\ba_\br_\b>_\b:_\b:\n-_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be, n>{matrix._\bs_\bc_\ba_\bl_\ba_\br()*_\bs_\bc_\ba_\bl_\ba_\br};\n-206 }\n+200 template\n+_\b2_\b0_\b1 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw(const _\bR_\bo_\bw& row, int\n+index)\n+202 {\n+203 using std::min;\n+204 vals_.assign(row.size(), 0.0);\n+205 assert(vals_.size()==row.size());\n+206 valIter_=vals_.begin();\n 207\n-209 template ::value, int> = 0>\n-_\b2_\b1_\b1 friend auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b (Scalar _\bs_\bc_\ba_\bl_\ba_\br, const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& matrix)\n-212 {\n-213 return _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bP_\br_\bo_\bm_\bo_\bt_\bi_\bo_\bn_\bT_\br_\ba_\bi_\bt_\bs_\b<_\bS_\bc_\ba_\bl_\ba_\br_\b,_\bK_\b>_\b:_\b:\n-_\bP_\br_\bo_\bm_\bo_\bt_\be_\bd_\bT_\by_\bp_\be, n>{_\bs_\bc_\ba_\bl_\ba_\br*matrix._\bs_\bc_\ba_\bl_\ba_\br()};\n-214 }\n-215\n-216 //===== comparison ops\n-217\n-_\b2_\b1_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=(const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& other) const\n+208 maxValue_ = min(- std::numeric_limits::max(), std::\n+numeric_limits::min());\n+209 diagonal_=norm_(row[index]);\n+210 row_ = index;\n+211 }\n+212\n+213 template\n+_\b2_\b1_\b4 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(const _\bC_\bo_\bl_\bI_\bt_\be_\br& _\bc_\bo_\bl)\n+215 {\n+216 using std::max;\n+217 // skip positive offdiagonals if norm preserves sign of them.\n+218 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be eij = norm_(*_\bc_\bo_\bl);\n+219 if(!N::is_sign_preserving || eij<0) // || eji<0)\n 220 {\n-221 return p_==other._\bs_\bc_\ba_\bl_\ba_\br();\n-222 }\n-223\n-_\b2_\b2_\b5 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=(const _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx& other) const\n-226 {\n-227 return p_!=other._\bs_\bc_\ba_\bl_\ba_\br();\n-228 }\n-229\n-230 //===== linear maps\n-231\n-233 template\n-_\b2_\b3_\b4 void _\bm_\bv (const X& x, Y& y) const\n-235 {\n-236#ifdef DUNE_FMatrix_WITH_CHECKING\n-237 if (x.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n-238 if (y.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n-239#endif\n-240 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b2_\b4_\b6 void _\bm_\bt_\bv (const X& x, Y& y) const\n-247 {\n-248 _\bm_\bv(x, y);\n-249 }\n-250\n-252 template\n-_\b2_\b5_\b3 void _\bu_\bm_\bv (const X& x, Y& y) const\n-254 {\n-255#ifdef DUNE_FMatrix_WITH_CHECKING\n-256 if (x.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n-257 if (y.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n-258#endif\n-259 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b2_\b6_\b5 void _\bu_\bm_\bt_\bv (const X& x, Y& y) const\n-266 {\n-267#ifdef DUNE_FMatrix_WITH_CHECKING\n-268 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n-269 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n-270#endif\n-271 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; ioperator[](_\bc_\bo_\bl.index())\n+[_\bc_\bo_\bl.index()]);\n+222 maxValue_ = max(maxValue_, *valIter_);\n+223 }else\n+224 *valIter_ =0;\n+225 ++valIter_;\n+226 }\n+227\n+228 template\n+229 template\n+_\b2_\b3_\b0 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(G&, const typename G::\n+EdgeIterator& edge, const _\bC_\bo_\bl_\bI_\bt_\be_\br&)\n+231 {\n+232 if(*valIter_ > alpha() * maxValue_) {\n+233 edge.properties().setDepends();\n+234 edge.properties().setInfluences();\n+235 }\n+236 ++valIter_;\n+237 }\n+238\n+239 template\n+_\b2_\b4_\b0 inline bool _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd()\n+241 {\n+242 if(diagonal_==0)\n+243 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"No diagonal entry for row \"<\n+_\b2_\b5_\b2 class _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by : public _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+253 {\n+254 public:\n+_\b2_\b5_\b8 typedef M _\bM_\ba_\bt_\br_\bi_\bx;\n+259\n+_\b2_\b6_\b3 typedef N _\bN_\bo_\br_\bm;\n+264\n+_\b2_\b6_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be _\bR_\bo_\bw;\n+269\n+_\b2_\b7_\b3 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br _\bC_\bo_\bl_\bI_\bt_\be_\br;\n 274\n-276 template\n-_\b2_\b7_\b7 void _\bu_\bm_\bh_\bv (const X& x, Y& y) const\n-278 {\n-279#ifdef DUNE_FMatrix_WITH_CHECKING\n-280 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n-281 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n-282#endif\n-283 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b2_\b8_\b9 void _\bm_\bm_\bv (const X& x, Y& y) const\n-290 {\n-291#ifdef DUNE_FMatrix_WITH_CHECKING\n-292 if (x.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n-293 if (y.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n-294#endif\n-295 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b3_\b0_\b1 void _\bm_\bm_\bt_\bv (const X& x, Y& y) const\n-302 {\n-303#ifdef DUNE_FMatrix_WITH_CHECKING\n-304 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n-305 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n-306#endif\n-307 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b3_\b1_\b3 void _\bm_\bm_\bh_\bv (const X& x, Y& y) const\n+_\b2_\b7_\b5 void _\bi_\bn_\bi_\bt(const _\bM_\ba_\bt_\br_\bi_\bx* matrix);\n+276\n+_\b2_\b7_\b7 void _\bi_\bn_\bi_\bt_\bR_\bo_\bw(const _\bR_\bo_\bw& row, int index);\n+278\n+_\b2_\b7_\b9 void _\be_\bx_\ba_\bm_\bi_\bn_\be(const _\bC_\bo_\bl_\bI_\bt_\be_\br& _\bc_\bo_\bl);\n+280\n+281 template\n+_\b2_\b8_\b2 void _\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph, const typename G::EdgeIterator& edge, const _\bC_\bo_\bl_\bI_\bt_\be_\br&\n+_\bc_\bo_\bl);\n+283\n+_\b2_\b8_\b4 bool _\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd();\n+285\n+_\b2_\b8_\b6 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n+287 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(parms)\n+288 {}\n+289\n+_\b2_\b9_\b0 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by()\n+291 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs()\n+292 {}\n+293\n+294 protected:\n+_\b2_\b9_\b6 const _\bM_\ba_\bt_\br_\bi_\bx* _\bm_\ba_\bt_\br_\bi_\bx_\b_;\n+_\b2_\b9_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b2_\b9_\b9 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+_\b3_\b0_\b0 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_;\n+_\b3_\b0_\b2 _\bN_\bo_\br_\bm _\bn_\bo_\br_\bm_\b_;\n+_\b3_\b0_\b4 int _\br_\bo_\bw_\b_;\n+_\b3_\b0_\b6 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_;\n+307 };\n+308\n+312 template\n+_\b3_\b1_\b3 class _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by : public _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n 314 {\n-315#ifdef DUNE_FMatrix_WITH_CHECKING\n-316 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n-317 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n-318#endif\n-319 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b3_\b2_\b5 void _\bu_\bs_\bm_\bv (const K& alpha, const X& x, Y& y) const\n-326 {\n-327#ifdef DUNE_FMatrix_WITH_CHECKING\n-328 if (x.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n-329 if (y.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n-330#endif\n-331 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n-_\b3_\b3_\b7 void _\bu_\bs_\bm_\bt_\bv (const K& alpha, const X& x, Y& y) const\n-338 {\n-339#ifdef DUNE_FMatrix_WITH_CHECKING\n-340 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n-341 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n-342#endif\n-343 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b3_\b4_\b3 void _\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph, const typename G::EdgeIterator& edge, const _\bC_\bo_\bl_\bI_\bt_\be_\br&\n+_\bc_\bo_\bl);\n+344\n+_\b3_\b4_\b5 bool _\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd();\n 346\n-348 template\n-_\b3_\b4_\b9 void _\bu_\bs_\bm_\bh_\bv (const K& alpha, const X& x, Y& y) const\n-350 {\n-351#ifdef DUNE_FMatrix_WITH_CHECKING\n-352 if (x.N()!=_\bN()) DUNE_THROW(FMatrixError,\"index out of range\");\n-353 if (y.N()!=_\bM()) DUNE_THROW(FMatrixError,\"index out of range\");\n-354#endif\n-355 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm () const\n-363 {\n-364 return fvmeta::sqrt(n*p_*p_);\n-365 }\n-366\n-_\b3_\b6_\b8 typename FieldTraits::real_type _\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2 () const\n-369 {\n-370 return n*p_*p_;\n-371 }\n+347\n+_\b3_\b4_\b8 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n+349 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs(parms)\n+350 {}\n+_\b3_\b5_\b1 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by()\n+352 : _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs()\n+353 {}\n+354\n+355 protected:\n+_\b3_\b5_\b7 const _\bM_\ba_\bt_\br_\bi_\bx* _\bm_\ba_\bt_\br_\bi_\bx_\b_;\n+_\b3_\b5_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+_\b3_\b6_\b0 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n+_\b3_\b6_\b1 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_;\n+_\b3_\b6_\b3 _\bN_\bo_\br_\bm _\bn_\bo_\br_\bm_\b_;\n+_\b3_\b6_\b5 int _\br_\bo_\bw_\b_;\n+_\b3_\b6_\b7 _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_;\n+368 private:\n+369 void _\bi_\bn_\bi_\bt_\bR_\bo_\bw(const _\bR_\bo_\bw& row, int index, const std::true_type&);\n+370 void _\bi_\bn_\bi_\bt_\bR_\bo_\bw(const _\bR_\bo_\bw& row, int index, const std::false_type&);\n+371 };\n 372\n-_\b3_\b7_\b4 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm () const\n-375 {\n-376 return std::abs(p_);\n-377 }\n-378\n-_\b3_\b8_\b0 typename FieldTraits::real_type _\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl () const\n-381 {\n-382 return fvmeta::absreal(p_);\n-383 }\n+377 template\n+_\b3_\b7_\b8 class _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+379 {\n+380 public:\n+381 enum { /* @brief We preserve the sign.*/\n+382 _\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg = true\n+_\b3_\b8_\b3 };\n 384\n-385 //===== solve\n-386\n-389 template\n-_\b3_\b9_\b0 void _\bs_\bo_\bl_\bv_\be (V& x, const V& b) const\n-391 {\n-392 for (int i=0; i\n+_\b3_\b9_\b0 typename FieldTraits::real_type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const M&\n+m,\n+391 [[maybe_unused]] typename std::enable_if_t::value>*\n+sfinae = nullptr) const\n+392 {\n+393 typedef typename M::field_type field_type;\n+394 typedef typename FieldTraits::real_type real_type;\n+395 static_assert( std::is_convertible::value,\n+396 \"use of diagonal norm in AMG not implemented for complex field_type\");\n+397 return m[N][N];\n+398 // possible implementation for complex types: return signed_abs(m[N][N]);\n+399 }\n+400\n+405 template\n+_\b4_\b0_\b6 auto _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const M& m,\n+407 typename std::enable_if_t::value>* sfinae = nullptr)\n+const\n+408 {\n+409 typedef typename FieldTraits::real_type real_type;\n+410 static_assert( std::is_convertible::value,\n+411 \"use of diagonal norm in AMG not implemented for complex field_type\");\n+412 return m;\n+413 // possible implementation for complex types: return signed_abs(m[N][N]);\n 414 }\n 415\n-_\b4_\b1_\b7 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bM () const\n-418 {\n-419 return n;\n-420 }\n-421\n-422 //===== query\n-423\n-_\b4_\b2_\b5 bool _\be_\bx_\bi_\bs_\bt_\bs (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be j) const\n-426 {\n-427#ifdef DUNE_FMatrix_WITH_CHECKING\n-428 if (i<0 || i>=n) DUNE_THROW(FMatrixError,\"row index out of range\");\n-429 if (j<0 || j>=n) DUNE_THROW(FMatrixError,\"column index out of range\");\n-430#endif\n-431 return i==j;\n+416 private:\n+417\n+419 template\n+420 static T signed_abs(const T & v)\n+421 {\n+422 return v;\n+423 }\n+424\n+426 template\n+427 static T signed_abs(const std::complex & v)\n+428 {\n+429 // return sign * abs_value\n+430 // in case of complex numbers this extends to using the csgn function to\n+determine the sign\n+431 return csgn(v) * std::abs(v);\n 432 }\n 433\n-434 //===== conversion operator\n-435\n-_\b4_\b3_\b7 friend std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const\n-_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b>& a)\n-438 {\n-439 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i(&p_), i);\n-451 }\n-452\n-_\b4_\b5_\b4 _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i) const\n-455 {\n-456 return _\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be(const_cast(&p_), i);\n-457 }\n-458\n-_\b4_\b6_\b0 const K& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*i*/) const\n-461 {\n-462 return p_;\n-463 }\n+435 template\n+436 static T csgn(const T & v)\n+437 {\n+438 return (T(0) < v) - (v < T(0));\n+439 }\n+440\n+442 template\n+443 static T csgn(std::complex a)\n+444 {\n+445 return csgn(a.real())+(a.real() == 0.0)*csgn(a.imag());\n+446 }\n+447\n+448 };\n+449\n+_\b4_\b5_\b4 class _\bF_\bi_\br_\bs_\bt_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl : public _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl<0>\n+455 {};\n+456\n+_\b4_\b6_\b2 struct _\bR_\bo_\bw_\bS_\bu_\bm\n+463 {\n 464\n-_\b4_\b6_\b6 K& _\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*i*/)\n-467 {\n-468 return p_;\n-469 }\n-470\n-_\b4_\b7_\b3 const K& _\bs_\bc_\ba_\bl_\ba_\br() const\n+465 enum { /* @brief We preserve the sign.*/\n+466 _\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg = false\n+_\b4_\b6_\b7 };\n+472 template\n+_\b4_\b7_\b3 typename FieldTraits::real_type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const M&\n+m) const\n 474 {\n-475 return p_;\n+475 return m.infinity_norm();\n 476 }\n-477\n-_\b4_\b8_\b0 K& _\bs_\bc_\ba_\bl_\ba_\br()\n-481 {\n-482 return p_;\n-483 }\n-484\n-485 private:\n-486 // the data, very simply a single number\n-487 K p_;\n-488\n-489 };\n-490\n-491 template \n-_\b4_\b9_\b2 struct DenseMatrixAssigner> {\n-_\b4_\b9_\b3 static void _\ba_\bp_\bp_\bl_\by(DenseMatrix& denseMatrix,\n-494 _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bf_\bi_\be_\bl_\bd_\b,_\b _\bN_\b> const& rhs) {\n-495 assert(denseMatrix.M() == N);\n-496 assert(denseMatrix.N() == N);\n-497 denseMatrix = field(0);\n-498 for (int i = 0; i < N; ++i)\n-499 denseMatrix[i][i] = rhs._\bs_\bc_\ba_\bl_\ba_\br();\n-500 }\n-501 };\n-502\n-503 template\n-_\b5_\b0_\b4 struct FieldTraits< _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx >\n-505 {\n-_\b5_\b0_\b6 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\b _\bn_\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b5_\b0_\b7 using _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be = typename FieldTraits::real_type;\n-508 };\n-509\n-510} // end namespace\n-511\n-512#endif\n+477 };\n+478\n+_\b4_\b7_\b9 struct _\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm\n+480 {\n+481\n+482 enum { /* @brief We preserve the sign.*/\n+483 _\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg = false\n+_\b4_\b8_\b4 };\n+489 template\n+_\b4_\b9_\b0 typename FieldTraits::real_type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const M&\n+m) const\n+491 {\n+492 return m.frobenius_norm();\n+493 }\n+494 };\n+_\b4_\b9_\b5 struct _\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm\n+496 {\n+497\n+498 enum { /* @brief We preserve the sign.*/\n+499 _\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg = false\n+_\b5_\b0_\b0 };\n+505 template\n+_\b5_\b0_\b6 typename FieldTraits::real_type _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const M&\n+m) const\n+507 {\n+508 return 1;\n+509 }\n+510 };\n+517 template\n+_\b5_\b1_\b8 class _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn : public\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn >\n+519 {\n+520 public:\n+_\b5_\b2_\b1 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n+522 : _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn<_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by >(parms)\n+523 {}\n+_\b5_\b2_\b4 _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn()\n+525 {}\n+526 };\n+527\n+528\n+537 template\n+_\b5_\b3_\b8 class _\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn : public _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+>\n+539 {\n+540 public:\n+_\b5_\b4_\b1 _\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn(const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms)\n+542 : _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn<_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by >(parms)\n+543 {}\n+_\b5_\b4_\b4 _\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn()\n+545 {}\n+546 };\n+547 // forward declaration\n+548 template class Aggregator;\n+549\n+550\n+558 template\n+_\b5_\b5_\b9 class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+560 {\n+561 public:\n+562\n+_\b5_\b6_\b6 static const V _\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD;\n+567\n+_\b5_\b7_\b1 static const V _\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD;\n+_\b5_\b7_\b5 typedef V _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+576\n+_\b5_\b8_\b0 typedef V _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+581\n+_\b5_\b8_\b6 typedef PoolAllocator _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n+587\n+_\b5_\b9_\b2 typedef SLList _\bV_\be_\br_\bt_\be_\bx_\bL_\bi_\bs_\bt;\n+593\n+_\b5_\b9_\b7 class _\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+598 {\n+599 public:\n+600 template\n+_\b6_\b0_\b1 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)([[maybe_unused]] const EdgeIterator& edge) const\n+602 {}\n+603 };\n+604\n+605\n+_\b6_\b0_\b9 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp();\n+610\n+_\b6_\b1_\b6 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs);\n+617\n+_\b6_\b2_\b1 _\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp();\n+622\n+634 template\n+_\b6_\b3_\b5 std::tuple _\bb_\bu_\bi_\bl_\bd_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs(const M& matrix, G& graph,\n+const C& criterion,\n+636 bool finestLevel);\n+637\n+655 template\n+_\b6_\b5_\b6 std::size_t _\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& start,\n+657 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+658 const G& graph,\n+659 F& aggregateVisitor,\n+660 VM& visitedMap) const;\n+661\n+685 template\n+_\b6_\b8_\b6 std::size_t _\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh(const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& start,\n+687 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+688 const G& graph, L& visited, F1& aggregateVisitor,\n+689 F2& nonAggregateVisitor,\n+690 VM& visitedMap) const;\n+691\n+_\b6_\b9_\b7 void _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs);\n+698\n+_\b7_\b0_\b2 std::size_t _\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const;\n+703\n+_\b7_\b0_\b7 void _\bf_\br_\be_\be();\n+708\n+_\b7_\b1_\b4 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& v);\n+715\n+_\b7_\b2_\b1 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const _\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& v) const;\n+722\n+_\b7_\b2_\b3 typedef const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+724\n+_\b7_\b2_\b5 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const\n+726 {\n+727 return aggregates_;\n+728 }\n+729\n+_\b7_\b3_\b0 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const\n+731 {\n+732 return aggregates_+_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs();\n+733 }\n+734\n+_\b7_\b3_\b5 typedef _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* _\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+736\n+_\b7_\b3_\b7 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn()\n+738 {\n+739 return aggregates_;\n+740 }\n+741\n+_\b7_\b4_\b2 _\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd()\n+743 {\n+744 return aggregates_+_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs();\n+745 }\n+746 private:\n+748 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>&) = delete;\n+750 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>& operator=(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>&) = delete;\n+751\n+755 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br* aggregates_;\n+756\n+760 std::size_t noVertices_;\n+761 };\n+762\n+766 template\n+_\b7_\b6_\b7 void _\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(G& graph,\n+768 const typename C::Matrix& matrix,\n+769 C criterion,\n+770 bool finestLevel);\n+771\n+776 template\n+_\b7_\b7_\b7 class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n+778 {\n+779\n+780 public:\n+781\n+782 /***\n+783 * @brief The type of the matrix graph we work with.\n+784 */\n+_\b7_\b8_\b5 typedef G _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh;\n+_\b7_\b8_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bV_\be_\br_\bt_\be_\bx;\n+790\n+_\b7_\b9_\b5 typedef PoolAllocator _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br;\n+796\n+_\b8_\b0_\b1 typedef S _\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt;\n+802\n+_\b8_\b0_\b4 typedef typename VertexSet::const_iterator _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br;\n+805\n+_\b8_\b0_\b9 typedef std::size_t* _\bS_\bp_\bh_\be_\br_\be_\bM_\ba_\bp;\n+810\n+_\b8_\b1_\b9 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be(_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph, _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+820 _\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt& connectivity, std::vector& front_);\n+821\n+_\b8_\b2_\b2 void _\bi_\bn_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be()\n+823 {\n+824 --id_;\n+825 }\n+826\n+_\b8_\b3_\b3 void _\br_\be_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(const _\bV_\be_\br_\bt_\be_\bx& vertex);\n+834\n+_\b8_\b3_\b8 void _\bs_\be_\be_\bd(const _\bV_\be_\br_\bt_\be_\bx& vertex);\n+839\n+_\b8_\b4_\b3 void _\ba_\bd_\bd(const _\bV_\be_\br_\bt_\be_\bx& vertex);\n+844\n+_\b8_\b4_\b5 void _\ba_\bd_\bd(std::vector& vertex);\n+_\b8_\b4_\b9 void _\bc_\bl_\be_\ba_\br();\n+850\n+_\b8_\b5_\b4 typename VertexSet::size_type _\bs_\bi_\bz_\be();\n+_\b8_\b5_\b8 typename VertexSet::size_type _\bc_\bo_\bn_\bn_\be_\bc_\bt_\bS_\bi_\bz_\be();\n+859\n+_\b8_\b6_\b3 int _\bi_\bd();\n+864\n+_\b8_\b6_\b6 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bb_\be_\bg_\bi_\bn() const;\n+867\n+_\b8_\b6_\b9 _\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\be_\bn_\bd() const;\n+870\n+871 private:\n+875 _\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt vertices_;\n+876\n+881 int id_;\n+882\n+886 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph_;\n+887\n+891 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n+892\n+896 _\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt& connected_;\n+897\n+901 std::vector& front_;\n+902 };\n+903\n+907 template\n+_\b9_\b0_\b8 class _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br\n+909 {\n+910 public:\n+911\n+_\b9_\b1_\b5 typedef G _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh;\n+916\n+_\b9_\b2_\b0 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bV_\be_\br_\bt_\be_\bx;\n+921\n+_\b9_\b2_\b3 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br;\n+924\n+_\b9_\b2_\b8 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br();\n+929\n+_\b9_\b3_\b3 _\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br();\n+934\n+951 template\n+_\b9_\b5_\b2 std::tuple _\bb_\bu_\bi_\bl_\bd(const M& m, G& graph,\n+953 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, const C& c,\n+954 bool finestLevel);\n+955 private:\n+960 typedef PoolAllocator Allocator;\n+961\n+965 typedef SLList VertexList;\n+966\n+970 typedef std::set,Allocator> VertexSet;\n+971\n+975 typedef std::size_t* SphereMap;\n+976\n+980 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh* graph_;\n+981\n+985 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b,_\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt_\b>* aggregate_;\n+986\n+990 std::vector front_;\n+991\n+995 VertexSet connected_;\n+996\n+1000 int size_;\n+1001\n+1005 class Stack\n+1006 {\n+1007 public:\n+_\b1_\b0_\b0_\b8 static const _\bV_\be_\br_\bt_\be_\bx _\bN_\bu_\bl_\bl_\bE_\bn_\bt_\br_\by;\n+1009\n+_\b1_\b0_\b1_\b0 _\bS_\bt_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph,\n+1011 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>& aggregatesBuilder,\n+1012 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates);\n+_\b1_\b0_\b1_\b3 _\b~_\bS_\bt_\ba_\bc_\bk();\n+_\b1_\b0_\b1_\b4 _\bV_\be_\br_\bt_\be_\bx _\bp_\bo_\bp();\n+1015 private:\n+1016 enum { N = 1300000 };\n+1017\n+1019 const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph_;\n+1021 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>& aggregatesBuilder_;\n+1023 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n+1025 int size_;\n+1026 _\bV_\be_\br_\bt_\be_\bx maxSize_;\n+1028 typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br begin_;\n+1029 typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br end_;\n+1030\n+1032 _\bV_\be_\br_\bt_\be_\bx* vals_;\n+1033\n+1034 };\n+1035\n+_\b1_\b0_\b3_\b6 friend class Stack;\n+1037\n+1048 template\n+1049 void visitAggregateNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+1050 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+1051 V& visitor) const;\n+1052\n+1057 template\n+1058 class AggregateVisitor\n+1059 {\n+1060 public:\n+_\b1_\b0_\b6_\b4 typedef V _\bV_\bi_\bs_\bi_\bt_\bo_\br;\n+_\b1_\b0_\b7_\b2 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+1073 _\bV_\bi_\bs_\bi_\bt_\bo_\br& visitor);\n+1074\n+_\b1_\b0_\b8_\b1 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n+1082\n+1083 private:\n+1085 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n+1087 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br aggregate_;\n+1089 _\bV_\bi_\bs_\bi_\bt_\bo_\br* visitor_;\n+1090 };\n+1091\n+1095 class Counter\n+1096 {\n+1097 public:\n+_\b1_\b0_\b9_\b9 _\bC_\bo_\bu_\bn_\bt_\be_\br();\n+_\b1_\b1_\b0_\b1 int _\bv_\ba_\bl_\bu_\be();\n+1102\n+1103 protected:\n+_\b1_\b1_\b0_\b5 void _\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+_\b1_\b1_\b0_\b7 void _\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt();\n+1108\n+1109 private:\n+1110 int count_;\n+1111 };\n+1112\n+1113\n+1118 class FrontNeighbourCounter : public Counter\n+1119 {\n+1120 public:\n+_\b1_\b1_\b2_\b5 _\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br(const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& front);\n+1126\n+_\b1_\b1_\b2_\b7 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n+1128\n+1129 private:\n+1130 const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph_;\n+1131 };\n+1132\n+1137 int noFrontNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex) const;\n+1138\n+1142 class TwoWayCounter : public Counter\n+1143 {\n+1144 public:\n+_\b1_\b1_\b4_\b5 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n+1146 };\n+1147\n+1159 int twoWayConnections(const _\bV_\be_\br_\bt_\be_\bx&, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+1160 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n+1161\n+1165 class OneWayCounter : public Counter\n+1166 {\n+1167 public:\n+_\b1_\b1_\b6_\b8 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n+1169 };\n+1170\n+1182 int oneWayConnections(const _\bV_\be_\br_\bt_\be_\bx&, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+1183 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n+1184\n+1191 class ConnectivityCounter : public Counter\n+1192 {\n+1193 public:\n+_\b1_\b2_\b0_\b0 _\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br(const VertexSet& connected, const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates);\n+1201\n+_\b1_\b2_\b0_\b2 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n+1203\n+1204 private:\n+1206 const VertexSet& connected_;\n+1208 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates_;\n+1209\n+1210 };\n+1211\n+1223 double connectivity(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n+aggregates) const;\n+1231 bool connected(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+1232 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n+1233\n+1241 bool connected(const _\bV_\be_\br_\bt_\be_\bx& vertex, const SLList&\n+aggregateList,\n+1242 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n+1243\n+1251 class DependencyCounter : public Counter\n+1252 {\n+1253 public:\n+_\b1_\b2_\b5_\b7 _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br();\n+1258\n+_\b1_\b2_\b5_\b9 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n+1260 };\n+1261\n+1268 class FrontMarker\n+1269 {\n+1270 public:\n+_\b1_\b2_\b7_\b7 _\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br(std::vector& front, _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph);\n+1278\n+_\b1_\b2_\b7_\b9 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge);\n+1280\n+1281 private:\n+1283 std::vector& front_;\n+1285 _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph_;\n+1286 };\n+1287\n+1291 void unmarkFront();\n+1292\n+1307 int unusedNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n+aggregates) const;\n+1308\n+1322 std::pair neighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n+1323 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+1324 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n+1341 int aggregateNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n+aggregate, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n+1342\n+1350 bool admissible(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n+aggregate, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates) const;\n+1351\n+1359 std::size_t distance(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n+aggregates);\n+1360\n+1369 _\bV_\be_\br_\bt_\be_\bx mergeNeighbour(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n+aggregates) const;\n+1370\n+1379 void nonisoNeighbourAggregate(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n+1380 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates,\n+1381 SLList& neighbours) const;\n+1382\n+1390 template\n+1391 void growAggregate(const _\bV_\be_\br_\bt_\be_\bx& vertex, const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>&\n+aggregates, const C& c);\n+1392 template\n+1393 void growIsolatedAggregate(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, const C& c);\n+1394 };\n+1395\n+1396#ifndef DOXYGEN\n+1397\n+1398 template\n+1399 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt(const _\bM_\ba_\bt_\br_\bi_\bx* matrix)\n+1400 {\n+1401 matrix_ = matrix;\n+1402 }\n+1403\n+1404 template\n+1405 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw(const Row& row, int index)\n+1406 {\n+1407 initRow(row, index, std::is_convertible());\n+1408 }\n+1409\n+1410 template\n+1411 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw(const Row& row, int index,\n+const std::false_type&)\n+1412 {\n+1413 DUNE_THROW(InvalidStateException, \"field_type needs to convertible to\n+real_type\");\n+1414 }\n+1415\n+1416 template\n+1417 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw([[maybe_unused]] const Row&\n+row, int index, const std::true_type&)\n+1418 {\n+1419 using std::min;\n+1420 maxValue_ = min(- std::numeric_limits::max(),\n+std::numeric_limits::min());\n+1421 row_ = index;\n+1422 diagonal_ = norm_(matrix_->operator[](row_)[row_]);\n+1423 }\n+1424\n+1425 template\n+1426 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(const ColIter& _\bc_\bo_\bl)\n+1427 {\n+1428 using std::max;\n+1429 real_type eij = norm_(*_\bc_\bo_\bl);\n+1430 typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br opposite_entry =\n+1431 matrix_->operator[](_\bc_\bo_\bl.index()).find(row_);\n+1432 if ( opposite_entry == matrix_->operator[](_\bc_\bo_\bl.index()).end() )\n+1433 {\n+1434 // Consider this a weak connection we disregard.\n+1435 return;\n+1436 }\n+1437 real_type eji = norm_(*opposite_entry);\n+1438\n+1439 // skip positive offdiagonals if norm preserves sign of them.\n+1440 if(!N::is_sign_preserving || eij<0 || eji<0)\n+1441 maxValue_ = max(maxValue_,\n+1442 eij /diagonal_ * eji/\n+1443 norm_(matrix_->operator[](_\bc_\bo_\bl.index())[_\bc_\bo_\bl.index()]));\n+1444 }\n+1445\n+1446 template\n+1447 template\n+1448 inline void _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph, const typename G::\n+EdgeIterator& edge, const ColIter& _\bc_\bo_\bl)\n+1449 {\n+1450 real_type eij = norm_(*_\bc_\bo_\bl);\n+1451 typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br opposite_entry =\n+1452 matrix_->operator[](_\bc_\bo_\bl.index()).find(row_);\n+1453\n+1454 if ( opposite_entry == matrix_->operator[](_\bc_\bo_\bl.index()).end() )\n+1455 {\n+1456 // Consider this as a weak connection we disregard.\n+1457 return;\n+1458 }\n+1459 real_type eji = norm_(*opposite_entry);\n+1460 // skip positive offdiagonals if norm preserves sign of them.\n+1461 if(!N::is_sign_preserving || (eij<0 || eji<0))\n+1462 if(eji / norm_(matrix_->operator[](edge.target())[edge.target()]) *\n+1463 eij/ diagonal_ > alpha() * maxValue_) {\n+1464 edge.properties().setDepends();\n+1465 edge.properties().setInfluences();\n+1466 typename G::EdgeProperties& other = graph.getEdgeProperties(edge.target(),\n+edge.source());\n+1467 other.setInfluences();\n+1468 other.setDepends();\n+1469 }\n+1470 }\n+1471\n+1472 template\n+1473 inline bool _\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd()\n+1474 {\n+1475 return maxValue_ < beta();\n+1476 }\n+1477\n+1478\n+1479 template\n+1480 inline void _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt(const Matrix* matrix)\n+1481 {\n+1482 matrix_ = matrix;\n+1483 }\n+1484\n+1485 template\n+1486 inline void _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw([[maybe_unused]] const Row& row, int\n+index)\n+1487 {\n+1488 using std::min;\n+1489 maxValue_ = min(- std::numeric_limits::max(), std::\n+numeric_limits::min());\n+1490 row_ = index;\n+1491 diagonal_ = norm_(matrix_->operator[](row_)[row_]);\n+1492 }\n+1493\n+1494 template\n+1495 inline void _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(const ColIter& _\bc_\bo_\bl)\n+1496 {\n+1497 using std::max;\n+1498 maxValue_ = max(maxValue_, -norm_(*_\bc_\bo_\bl));\n+1499 }\n+1500\n+1501 template\n+1502 template\n+1503 inline void _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be(G& graph, const typename G::\n+EdgeIterator& edge, const ColIter& _\bc_\bo_\bl)\n+1504 {\n+1505 if(-norm_(*_\bc_\bo_\bl) >= maxValue_ * alpha()) {\n+1506 edge.properties().setDepends();\n+1507 typedef typename G::EdgeDescriptor ED;\n+1508 ED e= graph.findEdge(edge.target(), edge.source());\n+1509 if(e!=std::numeric_limits::max())\n+1510 {\n+1511 typename G::EdgeProperties& other = graph.getEdgeProperties(e);\n+1512 other.setInfluences();\n+1513 }\n+1514 }\n+1515 }\n+1516\n+1517 template\n+1518 inline bool _\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b<_\bM_\b,_\bN_\b>_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd()\n+1519 {\n+1520 return maxValue_ < beta() * diagonal_;\n+1521 }\n+1522\n+1523 template\n+1524 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be(MatrixGraph& graph, AggregatesMap&\n+aggregates,\n+1525 VertexSet& connected, std::vector& front)\n+1526 : vertices_(), id_(-1), graph_(graph), aggregates_(aggregates),\n+1527 connected_(connected), front_(front)\n+1528 {}\n+1529\n+1530 template\n+1531 void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\br_\be_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt(const _\bV_\be_\br_\bt_\be_\bx& vertex)\n+1532 {\n+1533 /*\n+1534 vertices_.push_back(vertex);\n+1535 typedef typename VertexList::const_iterator iterator;\n+1536 iterator begin = vertices_.begin();\n+1537 iterator end = vertices_.end();*/\n+1538 throw \"Not yet implemented\";\n+1539\n+1540 // while(begin!=end){\n+1541 //for();\n+1542 // }\n+1543\n+1544 }\n+1545\n+1546 template\n+1547 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bs_\be_\be_\bd(const _\bV_\be_\br_\bt_\be_\bx& vertex)\n+1548 {\n+1549 dvverb<<\"Connected cleared\"<\n+1560 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\ba_\bd_\bd(const _\bV_\be_\br_\bt_\be_\bx& vertex)\n+1561 {\n+1562 vertices_.insert(vertex);\n+1563 aggregates_[vertex]=id_;\n+1564 if(front_.size())\n+1565 front_.erase(std::lower_bound(front_.begin(), front_.end(), vertex));\n+1566\n+1567\n+1568 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iterator;\n+1569 const iterator end = graph_.endEdges(vertex);\n+1570 for(iterator edge = graph_.beginEdges(vertex); edge != end; ++edge) {\n+1571 dvverb << \" Inserting \"<::UNAGGREGATED &&\n+1575 !graph_.getVertexProperties(edge.target()).front())\n+1576 {\n+1577 front_.push_back(edge.target());\n+1578 graph_.getVertexProperties(edge.target()).setFront();\n+1579 }\n+1580 }\n+1581 dvverb <\n+1586 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\ba_\bd_\bd(std::vector& vertices)\n+1587 {\n+1588#ifndef NDEBUG\n+1589 std::size_t oldsize = vertices_.size();\n+1590#endif\n+1591 typedef typename std::vector::iterator Iterator;\n+1592\n+1593 typedef typename VertexSet::iterator SIterator;\n+1594\n+1595 SIterator pos=vertices_.begin();\n+1596 std::vector newFront;\n+1597 newFront.reserve(front_.capacity());\n+1598\n+1599 std::set_difference(front_.begin(), front_.end(), vertices.begin(),\n+vertices.end(),\n+1600 std::back_inserter(newFront));\n+1601 front_=newFront;\n+1602\n+1603 for(Iterator vertex=vertices.begin(); vertex != vertices.end(); ++vertex)\n+1604 {\n+1605 pos=vertices_.insert(pos,*vertex);\n+1606 vertices_.insert(*vertex);\n+1607 graph_.getVertexProperties(*vertex).resetFront(); // Not a front node any\n+more.\n+1608 aggregates_[*vertex]=id_;\n+1609\n+1610 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br iterator;\n+1611 const iterator end = graph_.endEdges(*vertex);\n+1612 for(iterator edge = graph_.beginEdges(*vertex); edge != end; ++edge) {\n+1613 dvverb << \" Inserting \"<::UNAGGREGATED &&\n+1616 !graph_.getVertexProperties(edge.target()).front())\n+1617 {\n+1618 front_.push_back(edge.target());\n+1619 graph_.getVertexProperties(edge.target()).setFront();\n+1620 }\n+1621 dvverb <<\" size=\"<\n+1629 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bc_\bl_\be_\ba_\br()\n+1630 {\n+1631 vertices_.clear();\n+1632 connected_.clear();\n+1633 id_=-1;\n+1634 }\n+1635\n+1636 template\n+1637 inline typename Aggregate::VertexSet::size_type\n+1638 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bs_\bi_\bz_\be()\n+1639 {\n+1640 return vertices_.size();\n+1641 }\n+1642\n+1643 template\n+1644 inline typename Aggregate::VertexSet::size_type\n+1645 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bc_\bo_\bn_\bn_\be_\bc_\bt_\bS_\bi_\bz_\be()\n+1646 {\n+1647 return connected_.size();\n+1648 }\n+1649\n+1650 template\n+1651 inline int _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bi_\bd()\n+1652 {\n+1653 return id_;\n+1654 }\n+1655\n+1656 template\n+1657 inline typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bb_\be_\bg_\bi_\bn()\n+const\n+1658 {\n+1659 return vertices_.begin();\n+1660 }\n+1661\n+1662 template\n+1663 inline typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b<_\bG_\b,_\bS_\b>_\b:_\b:_\be_\bn_\bd() const\n+1664 {\n+1665 return vertices_.end();\n+1666 }\n+1667\n+1668 template\n+1669 const V _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD = std::numeric_limits::max();\n+1670\n+1671 template\n+1672 const V _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD = std::numeric_limits::max()-1;\n+1673\n+1674 template\n+1675 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp()\n+1676 : aggregates_(0)\n+1677 {}\n+1678\n+1679 template\n+1680 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp()\n+1681 {\n+1682 if(aggregates_!=0)\n+1683 delete[] aggregates_;\n+1684 }\n+1685\n+1686\n+1687 template\n+1688 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp(std::size_t noVertices)\n+1689 {\n+1690 allocate(noVertices);\n+1691 }\n+1692\n+1693 template\n+1694 inline std::size_t _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs() const\n+1695 {\n+1696 return noVertices_;\n+1697 }\n+1698\n+1699 template\n+1700 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be(std::size_t noVertices)\n+1701 {\n+1702 aggregates_ = new _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br[noVertices];\n+1703 noVertices_ = noVertices;\n+1704\n+1705 for(std::size_t i=0; i < noVertices; i++)\n+1706 aggregates_[i]=UNAGGREGATED;\n+1707 }\n+1708\n+1709 template\n+1710 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bf_\br_\be_\be()\n+1711 {\n+1712 assert(aggregates_ != 0);\n+1713 delete[] aggregates_;\n+1714 aggregates_=0;\n+1715 }\n+1716\n+1717 template\n+1718 inline typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n+1719 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const VertexDescriptor& v)\n+1720 {\n+1721 return aggregates_[v];\n+1722 }\n+1723\n+1724 template\n+1725 inline const typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br&\n+1726 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b](const VertexDescriptor& v) const\n+1727 {\n+1728 return aggregates_[v];\n+1729 }\n+1730\n+1731 template\n+1732 template\n+1733 inline std::size_t _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh(const V& start,\n+1734 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+1735 const G& graph, F& aggregateVisitor,\n+1736 VM& visitedMap) const\n+1737 {\n+1738 VertexList vlist;\n+1739\n+1740 DummyEdgeVisitor dummy;\n+1741 return breadthFirstSearch(start, aggregate, graph, vlist,\n+aggregateVisitor, dummy, visitedMap);\n+1742 }\n+1743\n+1744 template\n+1745 template\n+1746 std::size_t _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh(const V& start,\n+1747 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+1748 const G& graph,\n+1749 L& visited,\n+1750 F1& aggregateVisitor,\n+1751 F2& nonAggregateVisitor,\n+1752 VM& visitedMap) const\n+1753 {\n+1754 typedef typename L::const_iterator ListIterator;\n+1755 int visitedSpheres = 0;\n+1756\n+1757 visited.push_back(start);\n+1758 put(visitedMap, start, true);\n+1759\n+1760 ListIterator current = visited.begin();\n+1761 ListIterator end = visited.end();\n+1762 std::size_t i=0, size=visited.size();\n+1763\n+1764 // visit the neighbours of all vertices of the\n+1765 // current sphere.\n+1766 while(current != end) {\n+1767\n+1768 for(; i\n+1803 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br()\n+1804 : graph_(0), aggregate_(0), front_(), connected_(), size_(-1)\n+1805 {}\n+1806\n+1807 template\n+1808 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br()\n+1809 {\n+1810 size_=-1;\n+1811 }\n+1812\n+1813 template\n+1814 void _\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(G& graph,\n+1815 const typename C::Matrix& matrix,\n+1816 C criterion, bool firstlevel)\n+1817 {\n+1818 // assert(graph.isBuilt());\n+1819 typedef typename C::Matrix Matrix;\n+1820 typedef typename G::VertexIterator VertexIterator;\n+1821\n+1822 criterion.init(&matrix);\n+1823\n+1824 for(VertexIterator vertex = graph.begin(); vertex != graph.end();\n+++vertex) {\n+1825 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be Row;\n+1826\n+1827 const Row& row = matrix[*vertex];\n+1828\n+1829 // Tell the criterion what row we will examine now\n+1830 // This might for example be used for calculating the\n+1831 // maximum offdiagonal value\n+1832 criterion.initRow(row, *vertex);\n+1833\n+1834 // On a first path all columns are examined. After this\n+1835 // the calculator should know whether the vertex is isolated.\n+1836 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br ColIterator;\n+1837 ColIterator end = row.end();\n+1838 typename FieldTraits::real_type\n+absoffdiag=0.;\n+1839\n+1840 using std::max;\n+1841 if(firstlevel) {\n+1842 for(ColIterator _\bc_\bo_\bl = row.begin(); _\bc_\bo_\bl != end; ++_\bc_\bo_\bl)\n+1843 if(_\bc_\bo_\bl.index()!=*vertex) {\n+1844 criterion.examine(_\bc_\bo_\bl);\n+1845 absoffdiag = max(absoffdiag, Impl::asMatrix(*col).frobenius_norm());\n+1846 }\n+1847\n+1848 if(absoffdiag==0)\n+1849 vertex.properties().setExcludedBorder();\n+1850 }\n+1851 else\n+1852 for(ColIterator _\bc_\bo_\bl = row.begin(); _\bc_\bo_\bl != end; ++_\bc_\bo_\bl)\n+1853 if(_\bc_\bo_\bl.index()!=*vertex)\n+1854 criterion.examine(_\bc_\bo_\bl);\n+1855\n+1856 // reset the vertex properties\n+1857 //vertex.properties().reset();\n+1858\n+1859 // Check whether the vertex is isolated.\n+1860 if(criterion.isIsolated()) {\n+1861 //std::cout<<\"ISOLATED: \"<<*vertex<\n+1881 template\n+1882 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b<_\bV_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br(const\n+AggregatesMap& aggregates,\n+1883 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate, V& visitor)\n+1884 : aggregates_(aggregates), aggregate_(aggregate), visitor_(&visitor)\n+1885 {}\n+1886\n+1887 template\n+1888 template\n+1889 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b<_\bV_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n+_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n+1890 {\n+1891 if(aggregates_[edge.target()]==aggregate_)\n+1892 visitor_->operator()(edge);\n+1893 }\n+1894\n+1895 template\n+1896 template\n+1897 inline void Aggregator::visitAggregateNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n+1898 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+1899 const AggregatesMap& aggregates,\n+1900 V& visitor) const\n+1901 {\n+1902 // Only evaluates for edge pointing to the aggregate\n+1903 AggregateVisitor v(aggregates, aggregate, visitor);\n+1904 _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(*graph_, vertex, v);\n+1905 }\n+1906\n+1907\n+1908 template\n+1909 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br()\n+1910 : count_(0)\n+1911 {}\n+1912\n+1913 template\n+1914 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt()\n+1915 {\n+1916 ++count_;\n+1917 }\n+1918\n+1919 template\n+1920 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt()\n+1921 {\n+1922 --count_;\n+1923 }\n+1924 template\n+1925 inline int _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be()\n+1926 {\n+1927 return count_;\n+1928 }\n+1929\n+1930 template\n+1931 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bT_\bw_\bo_\bW_\ba_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n+_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n+1932 {\n+1933 if(edge.properties().isTwoWay())\n+1934 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+1935 }\n+1936\n+1937 template\n+1938 int Aggregator::twoWayConnections(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+1939 const AggregatesMap& aggregates) const\n+1940 {\n+1941 TwoWayCounter counter;\n+1942 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);\n+1943 return counter.value();\n+1944 }\n+1945\n+1946 template\n+1947 int Aggregator::oneWayConnections(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+1948 const AggregatesMap& aggregates) const\n+1949 {\n+1950 OneWayCounter counter;\n+1951 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);\n+1952 return counter.value();\n+1953 }\n+1954\n+1955 template\n+1956 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bO_\bn_\be_\bW_\ba_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n+_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n+1957 {\n+1958 if(edge.properties().isOneWay())\n+1959 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+1960 }\n+1961\n+1962 template\n+1963 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br(const\n+VertexSet& connected,\n+1964 const AggregatesMap& aggregates)\n+1965 : Counter(), connected_(connected), aggregates_(aggregates)\n+1966 {}\n+1967\n+1968\n+1969 template\n+1970 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n+_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n+1971 {\n+1972 if(connected_.find(aggregates_[edge.target()]) == connected_.end() ||\n+aggregates_[edge.target()]==AggregatesMap::UNAGGREGATED)\n+1973 // Would be a new connection\n+1974 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+1975 else{\n+1976 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+1977 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+1978 }\n+1979 }\n+1980\n+1981 template\n+1982 inline double Aggregator::connectivity(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n+AggregatesMap& aggregates) const\n+1983 {\n+1984 ConnectivityCounter counter(connected_, aggregates);\n+1985 double noNeighbours=_\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(*graph_, vertex, counter);\n+1986 return (double)counter.value()/noNeighbours;\n+1987 }\n+1988\n+1989 template\n+1990 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br()\n+1991 : Counter()\n+1992 {}\n+1993\n+1994 template\n+1995 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n+_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n+1996 {\n+1997 if(edge.properties().depends())\n+1998 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+1999 if(edge.properties().influences())\n+2000 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+2001 }\n+2002\n+2003 template\n+2004 int Aggregator::unusedNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n+AggregatesMap& aggregates) const\n+2005 {\n+2006 return aggregateNeighbours(vertex, AggregatesMap::UNAGGREGATED,\n+aggregates);\n+2007 }\n+2008\n+2009 template\n+2010 std::pair Aggregator::neighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n+2011 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+2012 const AggregatesMap& aggregates) const\n+2013 {\n+2014 DependencyCounter unused, aggregated;\n+2015 typedef AggregateVisitor CounterT;\n+2016 typedef std::tuple CounterTuple;\n+2017 CombinedFunctor visitors(CounterTuple(CounterT(aggregates,\n+AggregatesMap::UNAGGREGATED, unused), CounterT(aggregates, aggregate,\n+aggregated)));\n+2018 _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(*graph_, vertex, visitors);\n+2019 return std::make_pair(unused.value(), aggregated.value());\n+2020 }\n+2021\n+2022\n+2023 template\n+2024 int Aggregator::aggregateNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate, const AggregatesMap& aggregates) const\n+2025 {\n+2026 DependencyCounter counter;\n+2027 visitAggregateNeighbours(vertex, aggregate, aggregates, counter);\n+2028 return counter.value();\n+2029 }\n+2030\n+2031 template\n+2032 std::size_t Aggregator::distance(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n+AggregatesMap& aggregates)\n+2033 {\n+2034 return 0;\n+2035 typename PropertyMapTypeSelector::Type visitedMap =\n+_\bg_\be_\bt(VertexVisitedTag(), *graph_);\n+2036 VertexList vlist;\n+2037 typename AggregatesMap::DummyEdgeVisitor dummy;\n+2038 return aggregates.template breadthFirstSearch(vertex,\n+2039 aggregate_->_\bi_\bd(), *graph_,\n+2040 vlist, dummy, dummy, visitedMap);\n+2041 }\n+2042\n+2043 template\n+2044 inline _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br(std::vector& front,\n+_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph)\n+2045 : front_(front), graph_(graph)\n+2046 {}\n+2047\n+2048 template\n+2049 inline void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n+_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n+2050 {\n+2051 _\bV_\be_\br_\bt_\be_\bx target = edge.target();\n+2052\n+2053 if(!graph_.getVertexProperties(target).front()) {\n+2054 front_.push_back(target);\n+2055 graph_.getVertexProperties(target).setFront();\n+2056 }\n+2057 }\n+2058\n+2059 template\n+2060 inline bool Aggregator::admissible(const _\bV_\be_\br_\bt_\be_\bx& vertex, const\n+_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate, const AggregatesMap& aggregates) const\n+2061 {\n+2062 // Todo\n+2063 Dune::dvverb<<\" Admissible not yet implemented!\"<endEdges(vertex);\n+2071 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {\n+2072 // if(edge.properties().depends() && !edge.properties().influences()\n+2073 if(edge.properties().isStrong()\n+2074 && aggregates[edge.target()]==aggregate)\n+2075 {\n+2076 // Search for another link to the aggregate\n+2077 Iterator edge1 = edge;\n+2078 for(++edge1; edge1 != vend; ++edge1) {\n+2079 //if(edge1.properties().depends() && !edge1.properties().influences()\n+2080 if(edge1.properties().isStrong()\n+2081 && aggregates[edge.target()]==aggregate)\n+2082 {\n+2083 //Search for an edge connecting the two vertices that is\n+2084 //strong\n+2085 bool found=false;\n+2086 Iterator v2end = graph_->endEdges(edge.target());\n+2087 for(Iterator edge2 = graph_->beginEdges(edge.target()); edge2 != v2end;\n+++edge2) {\n+2088 if(edge2.target()==edge1.target() &&\n+2089 edge2.properties().isStrong()) {\n+2090 found =true;\n+2091 break;\n+2092 }\n+2093 }\n+2094 if(found)\n+2095 {\n+2096 return true;\n+2097 }\n+2098 }\n+2099 }\n+2100 }\n+2101 }\n+2102\n+2103 // Situation 2: cluster node depends on front node and other cluster node\n+2105 vend = graph_->endEdges(vertex);\n+2106 for(Iterator edge = graph_->beginEdges(vertex); edge != vend; ++edge) {\n+2107 //if(!edge.properties().depends() && edge.properties().influences()\n+2108 if(edge.properties().isStrong()\n+2109 && aggregates[edge.target()]==aggregate)\n+2110 {\n+2111 // Search for a link from target that stays within the aggregate\n+2112 Iterator v1end = graph_->endEdges(edge.target());\n+2113\n+2114 for(Iterator edge1=graph_->beginEdges(edge.target()); edge1 != v1end;\n+++edge1) {\n+2115 //if(edge1.properties().depends() && !edge1.properties().influences()\n+2116 if(edge1.properties().isStrong()\n+2117 && aggregates[edge1.target()]==aggregate)\n+2118 {\n+2119 bool found=false;\n+2120 // Check if front node is also connected to this one\n+2121 Iterator v2end = graph_->endEdges(vertex);\n+2122 for(Iterator edge2 = graph_->beginEdges(vertex); edge2 != v2end; ++edge2)\n+{\n+2123 if(edge2.target()==edge1.target()) {\n+2124 if(edge2.properties().isStrong())\n+2125 found=true;\n+2126 break;\n+2127 }\n+2128 }\n+2129 if(found)\n+2130 {\n+2131 return true;\n+2132 }\n+2133 }\n+2134 }\n+2135 }\n+2136 }\n+2137 return false;\n+2138 }\n+2139\n+2140 template\n+2141 void Aggregator::unmarkFront()\n+2142 {\n+2143 typedef typename std::vector::const_iterator Iterator;\n+2144\n+2145 for(Iterator vertex=front_.begin(); vertex != front_.end(); ++vertex)\n+2146 graph_->getVertexProperties(*vertex).resetFront();\n+2147\n+2148 front_.clear();\n+2149 }\n+2150\n+2151 template\n+2152 inline void\n+2153 Aggregator::nonisoNeighbourAggregate(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n+2154 const AggregatesMap& aggregates,\n+2155 SLList& neighbours) const\n+2156 {\n+2157 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n+2158 Iterator end=graph_->beginEdges(vertex);\n+2159 neighbours.clear();\n+2160\n+2161 for(Iterator edge=graph_->beginEdges(vertex); edge!=end; ++edge)\n+2162 {\n+2163 if(aggregates[edge.target()]!=AggregatesMap::UNAGGREGATED &&\n+graph_->getVertexProperties(edge.target()).isolated())\n+2164 neighbours.push_back(aggregates[edge.target()]);\n+2165 }\n+2166 }\n+2167\n+2168 template\n+2169 inline typename G::VertexDescriptor Aggregator::mergeNeighbour(const\n+_\bV_\be_\br_\bt_\be_\bx& vertex, const AggregatesMap& aggregates) const\n+2170 {\n+2171 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Iterator;\n+2172\n+2173 Iterator end = graph_->endEdges(vertex);\n+2174 for(Iterator edge = graph_->beginEdges(vertex); edge != end; ++edge) {\n+2175 if(aggregates[edge.target()] != AggregatesMap::UNAGGREGATED &&\n+2176 graph_->getVertexProperties(edge.target()).isolated() == graph_-\n+>getVertexProperties(edge.source()).isolated()) {\n+2177 if( graph_->getVertexProperties(vertex).isolated() ||\n+2178 ((edge.properties().depends() || edge.properties().influences())\n+2179 && admissible(vertex, aggregates[edge.target()], aggregates)))\n+2180 return edge.target();\n+2181 }\n+2182 }\n+2183 return AggregatesMap::UNAGGREGATED;\n+2184 }\n+2185\n+2186 template\n+2187 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br(const\n+_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph)\n+2188 : Counter(), graph_(graph)\n+2189 {}\n+2190\n+2191 template\n+2192 void _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename\n+_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br& edge)\n+2193 {\n+2194 if(graph_.getVertexProperties(edge.target()).front())\n+2195 _\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt();\n+2196 }\n+2197\n+2198 template\n+2199 int Aggregator::noFrontNeighbours(const _\bV_\be_\br_\bt_\be_\bx& vertex) const\n+2200 {\n+2201 FrontNeighbourCounter counter(*graph_);\n+2202 _\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs(*graph_, vertex, counter);\n+2203 return counter.value();\n+2204 }\n+2205 template\n+2206 inline bool Aggregator::connected(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n+2207 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br& aggregate,\n+2208 const AggregatesMap& aggregates) const\n+2209 {\n+2210 typedef typename G::ConstEdgeIterator iterator;\n+2211 const iterator end = graph_->endEdges(vertex);\n+2212 for(iterator edge = graph_->beginEdges(vertex); edge != end; ++edge)\n+2213 if(aggregates[edge.target()]==aggregate)\n+2214 return true;\n+2215 return false;\n+2216 }\n+2217 template\n+2218 inline bool Aggregator::connected(const _\bV_\be_\br_\bt_\be_\bx& vertex,\n+2219 const SLList& aggregateList,\n+2220 const AggregatesMap& aggregates) const\n+2221 {\n+2222 typedef typename SLList::const_iterator Iter;\n+2223 for(Iter i=aggregateList.begin(); i!=aggregateList.end(); ++i)\n+2224 if(connected(vertex, *i, aggregates))\n+2225 return true;\n+2226 return false;\n+2227 }\n+2228\n+2229 template\n+2230 template\n+2231 void Aggregator::growIsolatedAggregate(const _\bV_\be_\br_\bt_\be_\bx& seed, const\n+AggregatesMap& aggregates, const C& c)\n+2232 {\n+2233 SLList connectedAggregates;\n+2234 nonisoNeighbourAggregate(seed, aggregates,connectedAggregates);\n+2235\n+2236 while(aggregate_->_\bs_\bi_\bz_\be()< c.minAggregateSize() && aggregate_->_\bc_\bo_\bn_\bn_\be_\bc_\bt_\bS_\bi_\bz_\be\n+() < c.maxConnectivity()) {\n+2237 double maxCon=-1;\n+2238 std::size_t maxFrontNeighbours=0;\n+2239\n+2240 _\bV_\be_\br_\bt_\be_\bx candidate=AggregatesMap::UNAGGREGATED;\n+2241\n+2242 typedef typename std::vector::const_iterator Iterator;\n+2243\n+2244 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {\n+2245 if(distance(*vertex, aggregates)>c.maxDistance())\n+2246 continue; // distance of proposes aggregate too big\n+2247\n+2248 if(connectedAggregates.size()>0) {\n+2249 // there is already a neighbour cluster\n+2250 // front node must be connected to same neighbour cluster\n+2251\n+2252 if(!connected(*vertex, connectedAggregates, aggregates))\n+2253 continue;\n+2254 }\n+2255\n+2256 double con = connectivity(*vertex, aggregates);\n+2257\n+2258 if(con == maxCon) {\n+2259 std::size_t frontNeighbours = noFrontNeighbours(*vertex);\n+2260\n+2261 if(frontNeighbours >= maxFrontNeighbours) {\n+2262 maxFrontNeighbours = frontNeighbours;\n+2263 candidate = *vertex;\n+2264 }\n+2265 }else if(con > maxCon) {\n+2266 maxCon = con;\n+2267 maxFrontNeighbours = noFrontNeighbours(*vertex);\n+2268 candidate = *vertex;\n+2269 }\n+2270 }\n+2271\n+2272 if(candidate==AggregatesMap::UNAGGREGATED)\n+2273 break;\n+2274\n+2275 aggregate_->_\ba_\bd_\bd(candidate);\n+2276 }\n+2277 }\n+2278\n+2279 template\n+2280 template\n+2281 void Aggregator::growAggregate(const _\bV_\be_\br_\bt_\be_\bx& seed, const\n+AggregatesMap& aggregates, const C& c)\n+2282 {\n+2283 using std::min;\n+2284\n+2285 std::size_t distance_ =0;\n+2286 while(aggregate_->_\bs_\bi_\bz_\be() < c.minAggregateSize()&& distance_ candidates;\n+2291 candidates.reserve(30);\n+2292\n+2293 typedef typename std::vector::const_iterator Iterator;\n+2294\n+2295 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {\n+2296 // Only nonisolated nodes are considered\n+2297 if(graph_->getVertexProperties(*vertex).isolated())\n+2298 continue;\n+2299\n+2300 int twoWayCons = twoWayConnections(*vertex, aggregate_->_\bi_\bd(), aggregates);\n+2301\n+2302 /* The case of two way connections. */\n+2303 if( maxTwoCons == twoWayCons && twoWayCons > 0) {\n+2304 double con = connectivity(*vertex, aggregates);\n+2305\n+2306 if(con == maxCon) {\n+2307 int neighbours = noFrontNeighbours(*vertex);\n+2308\n+2309 if(neighbours > maxNeighbours) {\n+2310 maxNeighbours = neighbours;\n+2311 candidates.clear();\n+2312 candidates.push_back(*vertex);\n+2313 }else{\n+2314 candidates.push_back(*vertex);\n+2315 }\n+2316 }else if( con > maxCon) {\n+2317 maxCon = con;\n+2318 maxNeighbours = noFrontNeighbours(*vertex);\n+2319 candidates.clear();\n+2320 candidates.push_back(*vertex);\n+2321 }\n+2322 }else if(twoWayCons > maxTwoCons) {\n+2323 maxTwoCons = twoWayCons;\n+2324 maxCon = connectivity(*vertex, aggregates);\n+2325 maxNeighbours = noFrontNeighbours(*vertex);\n+2326 candidates.clear();\n+2327 candidates.push_back(*vertex);\n+2328\n+2329 // two way connections precede\n+2330 maxOneCons = std::numeric_limits::max();\n+2331 }\n+2332\n+2333 if(twoWayCons > 0)\n+2334 {\n+2335 continue; // THis is a two-way node, skip tests for one way nodes\n+2336 }\n+2337\n+2338 /* The one way case */\n+2339 int oneWayCons = oneWayConnections(*vertex, aggregate_->_\bi_\bd(), aggregates);\n+2340\n+2341 if(oneWayCons==0)\n+2342 continue; // No strong connections, skip the tests.\n+2343\n+2344 if(!admissible(*vertex, aggregate_->_\bi_\bd(), aggregates))\n+2345 continue;\n+2346\n+2347 if( maxOneCons == oneWayCons && oneWayCons > 0) {\n+2348 double con = connectivity(*vertex, aggregates);\n+2349\n+2350 if(con == maxCon) {\n+2351 int neighbours = noFrontNeighbours(*vertex);\n+2352\n+2353 if(neighbours > maxNeighbours) {\n+2354 maxNeighbours = neighbours;\n+2355 candidates.clear();\n+2356 candidates.push_back(*vertex);\n+2357 }else{\n+2358 if(neighbours==maxNeighbours)\n+2359 {\n+2360 candidates.push_back(*vertex);\n+2361 }\n+2362 }\n+2363 }else if( con > maxCon) {\n+2364 maxCon = con;\n+2365 maxNeighbours = noFrontNeighbours(*vertex);\n+2366 candidates.clear();\n+2367 candidates.push_back(*vertex);\n+2368 }\n+2369 }else if(oneWayCons > maxOneCons) {\n+2370 maxOneCons = oneWayCons;\n+2371 maxCon = connectivity(*vertex, aggregates);\n+2372 maxNeighbours = noFrontNeighbours(*vertex);\n+2373 candidates.clear();\n+2374 candidates.push_back(*vertex);\n+2375 }\n+2376 }\n+2377\n+2378\n+2379 if(!candidates.size())\n+2380 break; // No more candidates found\n+2381 distance_=distance(seed, aggregates);\n+2382 candidates.resize(min(candidates.size(), c.maxAggregateSize()-\n+2383 aggregate_->_\bs_\bi_\bz_\be()));\n+2384 aggregate_->_\ba_\bd_\bd(candidates);\n+2385 }\n+2386 }\n+2387\n+2388 template\n+2389 template\n+2390 std::tuple _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs(const M&\n+matrix, G& graph, const C& criterion,\n+2391 bool finestLevel)\n+2392 {\n+2393 Aggregator aggregator;\n+2394 return aggregator.build(matrix, graph, *this, criterion, finestLevel);\n+2395 }\n+2396\n+2397 template\n+2398 template\n+2399 std::tuple _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd(const M& m, G& graph,\n+AggregatesMap& aggregates, const C& c,\n+2400 bool finestLevel)\n+2401 {\n+2402 using std::max;\n+2403 using std::min;\n+2404 // Stack for fast vertex access\n+2405 Stack stack_(graph, *this, aggregates);\n+2406\n+2407 graph_ = &graph;\n+2408\n+2409 aggregate_ = new Aggregate(graph, aggregates, connected_,\n+front_);\n+2410\n+2411 Timer watch;\n+2412 watch.reset();\n+2413\n+2414 _\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by(graph, m, c, finestLevel);\n+2415\n+2416 dverb<<\"Build dependency took \"<< watch.elapsed()<<\" seconds.\"<::ISOLATED;\n+2437 ++skippedAggregates;\n+2438 continue;\n+2439 }\n+2440\n+2441 if(graph.getVertexProperties(seed).isolated()) {\n+2442 if(c.skipIsolated()) {\n+2443 // isolated vertices are not aggregated but skipped on the coarser levels.\n+2444 aggregates[seed]=AggregatesMap::ISOLATED;\n+2445 ++skippedAggregates;\n+2446 // skip rest as no agglomeration is done.\n+2447 continue;\n+2448 }else{\n+2449 aggregate_->_\bs_\be_\be_\bd(seed);\n+2450 growIsolatedAggregate(seed, aggregates, c);\n+2451 }\n+2452 }else{\n+2453 aggregate_->_\bs_\be_\be_\bd(seed);\n+2454 growAggregate(seed, aggregates, c);\n+2455 }\n+2456\n+2457 /* The rounding step. */\n+2458 while(!(graph.getVertexProperties(seed).isolated()) && aggregate_->_\bs_\bi_\bz_\be()\n+< c.maxAggregateSize()) {\n+2459\n+2460 std::vector candidates;\n+2461 candidates.reserve(30);\n+2462\n+2463 typedef typename std::vector::const_iterator Iterator;\n+2464\n+2465 for(Iterator vertex = front_.begin(); vertex != front_.end(); ++vertex) {\n+2466\n+2467 if(graph.getVertexProperties(*vertex).isolated())\n+2468 continue; // No isolated nodes here\n+2469\n+2470 if(twoWayConnections( *vertex, aggregate_->_\bi_\bd(), aggregates) == 0 &&\n+2471 (oneWayConnections( *vertex, aggregate_->_\bi_\bd(), aggregates) == 0 ||\n+2472 !admissible( *vertex, aggregate_->_\bi_\bd(), aggregates) ))\n+2473 continue;\n+2474\n+2475 std::pair neighbourPair=neighbours(*vertex, aggregate_->_\bi_\bd(),\n+2476 aggregates);\n+2477\n+2478 //if(aggregateNeighbours(*vertex, aggregate_->id(), aggregates) <=\n+unusedNeighbours(*vertex, aggregates))\n+2479 // continue;\n+2480\n+2481 if(neighbourPair.first >= neighbourPair.second)\n+2482 continue;\n+2483\n+2484 if(distance(*vertex, aggregates) > c.maxDistance())\n+2485 continue; // Distance too far\n+2486 candidates.push_back(*vertex);\n+2487 break;\n+2488 }\n+2489\n+2490 if(!candidates.size()) break; // no more candidates found.\n+2491\n+2492 candidates.resize(min(candidates.size(), c.maxAggregateSize()-\n+2493 aggregate_->_\bs_\bi_\bz_\be()));\n+2494 aggregate_->_\ba_\bd_\bd(candidates);\n+2495\n+2496 }\n+2497\n+2498 // try to merge aggregates consisting of only one nonisolated vertex with\n+other aggregates\n+2499 if(aggregate_->_\bs_\bi_\bz_\be()==1 && c.maxAggregateSize()>1) {\n+2500 if(!graph.getVertexProperties(seed).isolated()) {\n+2501 _\bV_\be_\br_\bt_\be_\bx mergedNeighbour = mergeNeighbour(seed, aggregates);\n+2502\n+2503 if(mergedNeighbour != AggregatesMap::UNAGGREGATED) {\n+2504 // assign vertex to the neighbouring cluster\n+2505 aggregates[seed] = aggregates[mergedNeighbour];\n+2506 aggregate_->_\bi_\bn_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be();\n+2507 }else{\n+2508 ++avg;\n+2509 minA=min(minA,static_cast(1));\n+2510 maxA=max(maxA,static_cast(1));\n+2511 ++oneAggregates;\n+2512 ++conAggregates;\n+2513 }\n+2514 }else{\n+2515 ++avg;\n+2516 minA=min(minA,static_cast(1));\n+2517 maxA=max(maxA,static_cast(1));\n+2518 ++oneAggregates;\n+2519 ++isoAggregates;\n+2520 }\n+2521 ++avg;\n+2522 }else{\n+2523 avg+=aggregate_->_\bs_\bi_\bz_\be();\n+2524 minA=min(minA,aggregate_->_\bs_\bi_\bz_\be());\n+2525 maxA=max(maxA,aggregate_->_\bs_\bi_\bz_\be());\n+2526 if(graph.getVertexProperties(seed).isolated())\n+2527 ++isoAggregates;\n+2528 else\n+2529 ++conAggregates;\n+2530 }\n+2531\n+2532 }\n+2533\n+2534 Dune::dinfo<<\"connected aggregates: \"<0)\n+2537 Dune::dinfo<<\" one node aggregates: \"<\n+2548 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bS_\bt_\ba_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh& graph, const Aggregator&\n+aggregatesBuilder,\n+2549 const AggregatesMap& aggregates)\n+2550 : graph_(graph), aggregatesBuilder_(aggregatesBuilder), aggregates_\n+(aggregates), begin_(graph.begin()), end_(graph.end())\n+2551 {\n+2552 //vals_ = new Vertex[N];\n+2553 }\n+2554\n+2555 template\n+2556 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\b~_\bS_\bt_\ba_\bc_\bk()\n+2557 {\n+2558 //Dune::dverb << \"Max stack size was \"<\n+2563 const typename _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bV_\be_\br_\bt_\be_\bx _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bN_\bu_\bl_\bl_\bE_\bn_\bt_\br_\by\n+2564 = std::numeric_limits::max();\n+2565\n+2566 template\n+2567 inline typename G::VertexDescriptor _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b<_\bG_\b>_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bp_\bo_\bp()\n+2568 {\n+2569 for(; begin_!=end_ && aggregates_[*begin_] != AggregatesMap::\n+UNAGGREGATED; ++begin_) ;\n+2570\n+2571 if(begin_!=end_)\n+2572 {\n+2573 typename G::VertexDescriptor current=*begin_;\n+2574 ++begin_;\n+2575 return current;\n+2576 }else\n+2577 return NullEntry;\n+2578 }\n+2579\n+2580#endif // DOXYGEN\n+2581\n+2582 template\n+_\b2_\b5_\b8_\b3 void _\bp_\br_\bi_\bn_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b2_\bd(const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\b>& aggregates, int n, int m,\n+std::ostream& os)\n+2584 {\n+2585 using std::max;\n+2586\n+2587 std::ios_base::fmtflags oldOpts=os.flags();\n+2588\n+2589 os.setf(std::ios_base::right, std::ios_base::adjustfield);\n+2590\n+2591 V maxVal=0;\n+2592 int width=1;\n+2593\n+2594 for(int i=0; i< n*m; i++)\n+2595 maxVal=max(maxVal, aggregates[i]);\n+2596\n+2597 for(int i=10; i < 1000000; i*=10)\n+2598 if(maxVal/i>0)\n+2599 width++;\n+2600 else\n+2601 break;\n+2602\n+2603 for(int j=0, entry=0; j < m; j++) {\n+2604 for(int i=0; i::iterator valIter_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:189\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br\n+Matrix::ConstColIterator ColIter\n+Constant column iterator of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:154\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh\n+std::size_t breadthFirstSearch(const VertexDescriptor &start, const\n+AggregateDescriptor &aggregate, const G &graph, L &visited, F1\n+&aggregateVisitor, F2 &nonAggregateVisitor, VM &visitedMap) const\n+Breadth first search within an aggregate.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+PoolAllocator< VertexDescriptor, 100 > Allocator\n+The allocator we use for our lists and the set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:586\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+iterator begin()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:737\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bi_\bd\n+int id()\n+Get the id identifying the aggregate.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bn_\bo_\br_\bm_\b_\n+Norm norm_\n+The functor for calculating the norm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:302\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+MatrixGraph::VertexDescriptor Vertex\n+The vertex identifier.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:920\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+AggregationCriterion()\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n+const Matrix * matrix_\n+The matrix we work on.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:357\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+auto operator()(const M &m, typename std::enable_if_t< Dune::IsNumber< M >::\n+value > *sfinae=nullptr) const\n+Compute the norm of a scalar.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:406\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw\n+void initRow(const Row &row, int index)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n+SymmetricMatrixDependency(const Parameters &parms)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:168\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+M Matrix\n+The matrix type we build the dependency of.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:258\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br\n+Counter()\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+G MatrixGraph\n+The matrix graph type used.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:915\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bn_\bo_\br_\bm_\b_\n+Norm norm_\n+The functor for calculating the norm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:363\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const EdgeIterator &edge) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:601\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+SymmetricCriterion()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:524\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n+Dependency()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:290\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n+void examine(const ColIter &col)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+M Matrix\n+The matrix type we build the dependency of.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:319\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_\n+real_type diagonal_\n+The norm of the current diagonal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:187\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bN_\bo_\br_\bm\n+N Norm\n+The norm to use for examining the matrix entries.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:263\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n+iterator end()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:742\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+UnSymmetricCriterion(const Parameters &parms)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:541\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bT_\bw_\bo_\bW_\ba_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw\n+void initRow(const Row &row, int index)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:201\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n+bool isIsolated()\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bN_\bu_\bl_\bl_\bE_\bn_\bt_\br_\by\n+static const Vertex NullEntry\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:1008\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n+void examine(const ColIter &col)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:214\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n+Dependency(const Parameters &parms)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:286\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\bo_\bw_\b_\n+int row_\n+index of the currently evaluated row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:185\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bb_\bu_\bi_\bl_\bd\n+std::tuple< int, int, int, int > build(const M &m, G &graph, AggregatesMap<\n+Vertex > &aggregates, const C &c, bool finestLevel)\n+Build the aggregates.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br\n+FrontNeighbourCounter(const MatrixGraph &front)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bR_\bo_\bw\n+Matrix::row_type Row\n+Constant Row iterator of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:329\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n+const Matrix * matrix_\n+The matrix we work on.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:296\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+const AggregateDescriptor & operator[](const VertexDescriptor &v) const\n+Get the aggregate a vertex belongs to.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n+void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter\n+&col)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+AggregateVisitor(const AggregatesMap< Vertex > &aggregates, const\n+AggregateDescriptor &aggregate, Visitor &visitor)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br\n+Matrix::ConstColIterator ColIter\n+Constant column iterator of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:334\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+~AggregatesMap()\n+Destructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Matrix::field_type field_type\n+The current max value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:179\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bd_\be_\bc_\br_\be_\bm_\be_\bn_\bt\n+void decrement()\n+Decrement counter.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n+Aggregate(MatrixGraph &graph, AggregatesMap< Vertex > &aggregates, VertexSet\n+&connectivity, std::vector< Vertex > &front_)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+V Visitor\n+The type of the adapted visitor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:1064\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bS_\bp_\bh_\be_\br_\be_\bM_\ba_\bp\n+std::size_t * SphereMap\n+Type of the mapping of aggregate members onto distance spheres.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:809\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+AggregationCriterion(const Parameters &parms)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bR_\bo_\bw\n+Matrix::row_type Row\n+Constant Row iterator of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:268\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bc_\bo_\bn_\bn_\be_\bc_\bt_\bS_\bi_\bz_\be\n+VertexSet::size_type connectSize()\n+Get the number of connections to other aggregates.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bv_\ba_\bl_\bs_\b_\n+std::vector< real_type > vals_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:188\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bN_\bo_\br_\bm\n+N Norm\n+The norm to use for examining the matrix entries.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:324\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\b2_\bd\n+void printAggregates2d(const AggregatesMap< V > &aggregates, int n, int m,\n+std::ostream &os)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:2583\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bi_\bn_\bv_\ba_\bl_\bi_\bd_\ba_\bt_\be\n+void invalidate()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:822\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+const_iterator begin() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:725\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_\n+real_type maxValue_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:181\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bn_\bo_\br_\bm_\b_\n+Norm norm_\n+The functor for calculating the norm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:183\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+VertexSet::const_iterator const_iterator\n+Const iterator over a vertex list.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:804\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+SymmetricCriterion(const Parameters &parms)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:521\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+MatrixGraph::VertexDescriptor AggregateDescriptor\n+The type of the aggregate descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:923\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_\n+real_type maxValue_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:361\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt\n+void init(const Matrix *matrix)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:195\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_\n+real_type diagonal_\n+The norm of the current diagonal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:367\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+AggregateDescriptor * iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:735\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n+SymmetricDependency(const Parameters &parms)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:348\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< field_type >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:360\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\b~_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br\n+~Aggregator()\n+Destructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n+void examine(G &graph, const typename G::EdgeIterator &edge, const ColIter\n+&col)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\ba_\bd_\bd\n+void add(const Vertex &vertex)\n+Add a vertex to the aggregate.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bP_\bo_\bl_\bi_\bc_\by\n+T DependencyPolicy\n+The policy for calculating the dependency graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\ba_\bd_\bd\n+void add(std::vector< Vertex > &vertex)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\be_\bx_\ba_\bm_\bi_\bn_\be\n+void examine(const ColIter &col)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br\n+Aggregator()\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n+Examine an edge.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bM_\ba_\br_\bk_\be_\br\n+FrontMarker(std::vector< Vertex > &front, MatrixGraph &graph)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const\n+compute the norm of a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:506\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt\n+void init(const Matrix *matrix)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bv_\bi_\bs_\bi_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bs\n+int visitNeighbours(const G &graph, const typename G::VertexDescriptor &vertex,\n+V &visitor)\n+Visit all neighbour vertices of a vertex in a graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bI_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc\n+void setDefaultValuesIsotropic(std::size_t dim, std::size_t diameter=2)\n+Sets reasonable default values for an isotropic problem.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:82\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\be_\bn_\bd\n+const_iterator end() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:730\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+V AggregateDescriptor\n+The aggregate descriptor type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:580\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD\n+static const V ISOLATED\n+Identifier of isolated vertices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:571\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\bo_\bw_\b_\n+int row_\n+index of the currently evaluated row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:365\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n+SymmetricMatrixDependency()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:171\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br\n+DependencyCounter()\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bp_\bo_\bp\n+Vertex pop()\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b_\n+real_type diagonal_\n+The norm of the current diagonal.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:306\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bn_\bo_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n+std::size_t noVertices() const\n+Get the number of vertices.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bD_\be_\bf_\ba_\bu_\bl_\bt_\bV_\ba_\bl_\bu_\be_\bs_\bA_\bn_\bi_\bs_\bo_\bt_\br_\bo_\bp_\bi_\bc\n+void setDefaultValuesAnisotropic(std::size_t dim, std::size_t diameter=2)\n+Sets reasonable default values for an aisotropic problem.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:105\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+AggregatesMap(std::size_t noVertices)\n+Constructs with allocating memory.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Matrix::field_type field_type\n+The current max value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:359\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n+AggregateDescriptor & operator[](const VertexDescriptor &v)\n+Get the aggregate a vertex belongs to.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+AggregatesMap()\n+Constructs without allocating memory.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+int value()\n+Access the current count.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bL_\bi_\bs_\bt\n+SLList< VertexDescriptor, Allocator > VertexList\n+The type of a single linked list of vertex descriptors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:592\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\b~_\bS_\bt_\ba_\bc_\bk\n+~Stack()\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bn_\be_\bc_\bt_\bi_\bv_\bi_\bt_\by_\bC_\bo_\bu_\bn_\bt_\be_\br\n+ConnectivityCounter(const VertexSet &connected, const AggregatesMap< Vertex >\n+&aggregates)\n+Constructor.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bs_\bi_\bz_\be\n+VertexSet::size_type size()\n+Get the size of the aggregate.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\be_\bn_\bd\n+const_iterator end() const\n+get an iterator over the vertices of the aggregate.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt\n+void init(const Matrix *matrix)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+UnSymmetricCriterion()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:544\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bF_\br_\bo_\bn_\bt_\bN_\be_\bi_\bg_\bh_\bb_\bo_\bu_\br_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n+const AggregateDescriptor * const_iterator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:723\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\bo_\bw_\b_\n+int row_\n+index of the currently evaluated row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:304\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bS_\bt_\ba_\bc_\bk_\b:_\b:_\bS_\bt_\ba_\bc_\bk\n+Stack(const MatrixGraph &graph, const Aggregator< G > &aggregatesBuilder, const\n+AggregatesMap< Vertex > &aggregates)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< field_type >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:180\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bn_\bi_\bt_\bR_\bo_\bw\n+void initRow(const Row &row, int index)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+M Matrix\n+The matrix type we build the dependency of.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:139\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n+FieldTraits< field_type >::real_type real_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:299\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\b_\n+const Matrix * matrix_\n+The matrix we work on.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:177\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bS_\be_\bt\n+S VertexSet\n+The type of a single linked list of vertex descriptors.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:801\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const\n+compute the norm of a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:490\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bU_\bN_\bA_\bG_\bG_\bR_\bE_\bG_\bA_\bT_\bE_\bD\n+static const V UNAGGREGATED\n+Identifier of not yet aggregated vertices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:566\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\br_\be_\ba_\bd_\bt_\bh_\bF_\bi_\br_\bs_\bt_\bS_\be_\ba_\br_\bc_\bh\n+std::size_t breadthFirstSearch(const VertexDescriptor &start, const\n+AggregateDescriptor &aggregate, const G &graph, F &aggregateVisitor, VM\n+&visitedMap) const\n+Breadth first search within an aggregate.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+Matrix::field_type field_type\n+The current max value.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:298\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bO_\bn_\be_\bW_\ba_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n+std::ostream & operator<<(std::ostream &os, const AggregationCriterion< T >\n+&criterion)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:113\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n+bool isIsolated()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:240\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\be\n+void allocate(std::size_t noVertices)\n+Allocate memory for holding the information.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bN_\bo_\br_\bm\n+N Norm\n+The norm to use for examining the matrix entries.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:144\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\bo_\bw_\bS_\bu_\bm_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+FieldTraits< typenameM::field_type >::real_type operator()(const M &m) const\n+compute the norm of a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:473\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\br_\be_\bc_\bo_\bn_\bs_\bt_\br_\bu_\bc_\bt\n+void reconstruct(const Vertex &vertex)\n+Reconstruct the aggregat from an seed node.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+const_iterator begin() const\n+get an iterator over the vertices of the aggregate.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+FieldTraits< typenameM::field_type >::real_type operator()(const M &m, typename\n+std::enable_if_t::value > *sfinae=nullptr) const\n+compute the norm of a matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:390\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bV_\be_\br_\bt_\be_\bx\n+MatrixGraph::VertexDescriptor Vertex\n+The vertex descriptor type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:789\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bs_\be_\be_\bd\n+void seed(const Vertex &vertex)\n+Initialize the aggregate with one vertex.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bi_\bs_\bI_\bs_\bo_\bl_\ba_\bt_\be_\bd\n+bool isIsolated()\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n+SymmetricDependency()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:351\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bc_\bl_\be_\ba_\br\n+void clear()\n+Clear the aggregate.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bf_\br_\be_\be\n+void free()\n+Free the allocated memory.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt\n+void increment()\n+Increment counter.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n+void buildDependency(G &graph, const typename C::Matrix &matrix, C criterion,\n+bool finestLevel)\n+Build the dependency of the matrix graph.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+V VertexDescriptor\n+The vertex descriptor type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:575\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bm_\ba_\bx_\bV_\ba_\bl_\bu_\be_\b_\n+real_type maxValue_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:300\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs\n+std::tuple< int, int, int, int > buildAggregates(const M &matrix, G &graph,\n+const C &criterion, bool finestLevel)\n+Build the aggregates.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\b:_\b:_\bR_\bo_\bw\n+Matrix::row_type Row\n+Constant Row iterator of the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br\n+PoolAllocator< Vertex, 100 > Allocator\n+The allocator we use for our lists and the set.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:795\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n+G MatrixGraph\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:785\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by_\bC_\bo_\bu_\bn_\bt_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const typename MatrixGraph::ConstEdgeIterator &edge)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm_\b:_\b:_\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg\n+@ is_sign_preserving\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:483\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\b:_\b:_\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg\n+@ is_sign_preserving\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:382\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm_\b:_\b:_\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg\n+@ is_sign_preserving\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:499\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\bo_\bw_\bS_\bu_\bm_\b:_\b:_\bi_\bs_\b__\bs_\bi_\bg_\bn_\b__\bp_\br_\be_\bs_\be_\br_\bv_\bi_\bn_\bg\n+@ is_sign_preserving\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:466\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx\n-A multiple of the identity matrix of static size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bh_\bv\n-void usmhv(const K &alpha, const X &x, Y &y) const\n-y += alpha A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:349\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bt_\bv\n-void mmtv(const X &x, Y &y) const\n-y -= A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:301\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b-_\b=\n-ScaledIdentityMatrix & operator-=(const ScaledIdentityMatrix &y)\n-vector space subtraction\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:165\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-const_row_type::ConstIterator ConstColIterator\n-rename the iterators for easier access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:127\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-ConstIterator end() const\n-end iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-Iterator beforeBegin()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:114\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b!_\b=\n-bool operator!=(const ScaledIdentityMatrix &other) const\n-incomparison operator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:225\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bv\n-void mmv(const X &x, Y &y) const\n-y -= A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:289\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-std::size_t size_type\n-The type used for the index access and size operations.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:43\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bv\n-void usmv(const K &alpha, const X &x, Y &y) const\n-y += alpha A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:325\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-row_type::Iterator ColIterator\n-rename the iterators for easier access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:91\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-const_row_type const_reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:49\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n-void mv(const X &x, Y &y) const\n-y = A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:234\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bt_\bv\n-void umtv(const X &x, Y &y) const\n-y += A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:265\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bh_\bv\n-void umhv(const X &x, Y &y) const\n-y += A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:277\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n-DiagonalRowVector< K, n > row_type\n-Each row is implemented by a field vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:46\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ContainerWrapperIterator< const WrapperType, reference, reference > Iterator\n-Iterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:85\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-Iterator beforeEnd()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:107\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\be_\bt_\be_\br_\bm_\bi_\bn_\ba_\bn_\bt\n-K determinant() const\n-calculates the determinant of this matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:404\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-K field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:37\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bs_\bm_\bt_\bv\n-void usmtv(const K &alpha, const X &x, Y &y) const\n-y += alpha A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:337\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n-Iterator end()\n-end iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:100\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator iterator\n-typedef for stl compliant access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:87\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br\n-const K & scalar() const\n-Get const reference to the scalar diagonal value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:473\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bu_\bm_\bv\n-void umv(const X &x, Y &y) const\n-y += A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:253\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n-const K & diagonal(size_type) const\n-Get const reference to diagonal entry.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:460\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\bs\n-@ rows\n-The number of rows.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:54\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bl_\bs\n-@ cols\n-The number of columns.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:56\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-ScaledIdentityMatrix & operator=(const K &k)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ContainerWrapperIterator< const WrapperType, const_reference, const_reference >\n-ConstIterator\n-Iterator class for sequential access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:121\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bd_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n-K & diagonal(size_type)\n-Get reference to diagonal entry.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bo_\bl_\bv_\be\n-void solve(V &x, const V &b) const\n-Solve system A x = b.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:390\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bx_\bi_\bs_\bt_\bs\n-bool exists(size_type i, size_type j) const\n-return true when (i,j) is in pattern\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:425\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Iterator RowIterator\n-rename the iterators for easier access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:89\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\bi_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator const_iterator\n-typedef for stl compliant access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:123\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx\n-ScaledIdentityMatrix()\n-Default constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:62\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b=\n-bool operator==(const ScaledIdentityMatrix &other) const\n-comparison operator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bB_\be_\bg_\bi_\bn\n-ConstIterator beforeBegin() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b/_\b=\n-ScaledIdentityMatrix & operator/=(const K &k)\n-vector space division by scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:192\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-friend std::ostream & operator<<(std::ostream &s, const ScaledIdentityMatrix<\n-K, n > &a)\n-Sends the matrix to an output stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:437\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm_\b2\n-FieldTraits< field_type >::real_type frobenius_norm2() const\n-square of frobenius norm, need for block recursion\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:368\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\b__\bn_\bo_\br_\bm\n-FieldTraits< field_type >::real_type frobenius_norm() const\n-frobenius norm: sqrt(sum over squared values of entries)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:362\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm\n-FieldTraits< field_type >::real_type infinity_norm() const\n-infinity norm (row sum norm, how to generalize for blocks?)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:374\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-ConstIterator ConstRowIterator\n-rename the iterators for easier access\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:125\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bf_\bo_\br_\be_\bE_\bn_\bd\n-ConstIterator beforeEnd() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:143\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n-size_type M() const\n-number of blocks in column direction\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:417\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-const_reference operator[](size_type i) const\n-Return const_reference object as row replacement.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:454\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx\n-ScaledIdentityMatrix(const K &k)\n-Constructor initializing the whole matrix with a scalar.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:66\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*\n-friend auto operator*(const ScaledIdentityMatrix &matrix, Scalar scalar)\n-vector space multiplication with scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:203\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bf_\bi_\bn_\bi_\bt_\by_\b__\bn_\bo_\br_\bm_\b__\br_\be_\ba_\bl\n-FieldTraits< field_type >::real_type infinity_norm_real() const\n-simplified infinity norm (uses Manhattan norm for complex values)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:380\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b*_\b=\n-ScaledIdentityMatrix & operator*=(const K &k)\n-vector space multiplication with scalar\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:185\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bd_\be_\bn_\bt_\bi_\bc_\ba_\bl\n-bool identical(const ScaledIdentityMatrix< K, n > &other) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bi_\bn_\bv_\be_\br_\bt\n-void invert()\n-Compute inverse.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:398\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-Iterator begin()\n-begin iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:94\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bc_\ba_\bl_\ba_\br\n-K & scalar()\n-Get reference to the scalar diagonal value.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:480\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be\n-row_type reference\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-K block_type\n-export the type representing the components\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:40\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bm_\bh_\bv\n-void mmhv(const X &x, Y &y) const\n-y -= A^H x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:313\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b=\n-ScaledIdentityMatrix & operator+=(const ScaledIdentityMatrix &y)\n-vector space addition\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bc_\bo_\bn_\bs_\bt_\b__\br_\bo_\bw_\b__\bt_\by_\bp_\be\n-DiagonalRowVectorConst< K, n > const_row_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:48\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bt_\bv\n-void mtv(const X &x, Y &y) const\n-y = A^T x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:246\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b[_\b]\n-reference operator[](size_type i)\n-Return reference object as row replacement.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:448\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n-ConstIterator begin() const\n-begin iterator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:130\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-size_type N() const\n-number of blocks in row direction\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:411\n-_\bD_\bu_\bn_\be_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bs_\bs_\bi_\bg_\bn_\be_\br_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bf_\bi_\be_\bl_\bd_\b,_\b _\bN_\b _\b>_\b _\b>_\b:_\b:\n-_\ba_\bp_\bp_\bl_\by\n-static void apply(DenseMatrix &denseMatrix, ScaledIdentityMatrix< field, N >\n-const &rhs)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:493\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename ScaledIdentityMatrix< K, n >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:506\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-typename FieldTraits< field_type >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:507\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+derive error class from the base class in common\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+A generic dynamic dense matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< T >::field_type field_type\n+Export the type representing the underlying field.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:565\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::const_iterator ConstColIterator\n+Const iterator for the entries of each row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:589\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\br_\bo_\bw_\b__\bt_\by_\bp_\be\n+MatrixImp::DenseMatrixBase< T, A >::window_type row_type\n+The type implementing a matrix row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:574\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bi_\bo_\bn_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+Base class of all aggregation criterions.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n+Dependency policy for symmetric matrices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:134\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n+Dependency policy for symmetric matrices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:253\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bD_\be_\bp_\be_\bn_\bd_\be_\bn_\bc_\by\n+Dependency policy for symmetric matrices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:314\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+Norm that uses only the [N][N] entry of the block to determine couplings.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:379\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\bi_\br_\bs_\bt_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl\n+Norm that uses only the [0][0] entry of the block to determine couplings.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:455\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bR_\bo_\bw_\bS_\bu_\bm\n+Functor using the row sum (infinity) norm to determine strong couplings.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:463\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bF_\br_\bo_\bb_\be_\bn_\bi_\bu_\bs_\bN_\bo_\br_\bm\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:480\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bl_\bw_\ba_\by_\bs_\bO_\bn_\be_\bN_\bo_\br_\bm\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:496\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+Criterion taking advantage of symmetric matrices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:519\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bU_\bn_\bS_\by_\bm_\bm_\be_\bt_\br_\bi_\bc_\bC_\br_\bi_\bt_\be_\br_\bi_\bo_\bn\n+Criterion suitable for unsymmetric matrices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:539\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\bo_\br\n+Class for building the aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:909\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+Class providing information about the mapping of the vertices onto aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bD_\bu_\bm_\bm_\by_\bE_\bd_\bg_\be_\bV_\bi_\bs_\bi_\bt_\bo_\br\n+A Dummy visitor that does nothing for each visited edge.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:598\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be\n+A class for temporarily storing the vertices of an aggregate in.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:778\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br\n+M::size_type VertexDescriptor\n+The vertex descriptor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+EdgeIteratorT< const MatrixGraph< Matrix > > ConstEdgeIterator\n+The constant edge iterator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:298\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bE_\bd_\bg_\be_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+Iterator over all edges starting from a vertex.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bI_\bt_\be_\br_\ba_\bt_\bo_\br_\bT\n+The vertex iterator type of the graph.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:209\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+All parameters for AMG.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00212.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00212.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: repartition.hh File Reference\n+dune-istl: pinfo.hh File Reference\n \n \n \n \n \n \n \n@@ -65,107 +65,47 @@\n
    \n
    \n
    \n
    \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n \n-
    repartition.hh File Reference
    \n+Namespaces
    \n+
    pinfo.hh File Reference
    \n \n
    \n-\n-

    Functionality for redistributing a parallel index set using graph partitioning. \n-More...

    \n-
    #include <cassert>
    \n-#include <map>
    \n-#include <utility>
    \n-#include <cmath>
    \n-#include <dune/common/timer.hh>
    \n+
    #include <dune/common/parallel/communication.hh>
    \n #include <dune/common/enumset.hh>
    \n-#include <dune/common/stdstreams.hh>
    \n+#include <dune/common/parallel/mpicommunication.hh>
    \n #include <dune/common/parallel/mpitraits.hh>
    \n-#include <dune/common/parallel/communicator.hh>
    \n-#include <dune/common/parallel/indexset.hh>
    \n-#include <dune/common/parallel/indicessyncer.hh>
    \n #include <dune/common/parallel/remoteindices.hh>
    \n-#include <dune/common/rangeutilities.hh>
    \n-#include <dune/istl/owneroverlapcopy.hh>
    \n-#include <dune/istl/paamg/graph.hh>
    \n+#include <dune/common/parallel/interface.hh>
    \n+#include <dune/common/parallel/communicator.hh>
    \n+#include <dune/istl/solvercategory.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n+\n \n

    \n Classes

    struct  Dune::RedistributeInterface
    class  Dune::Amg::SequentialInformation
     
    \n \n \n \n-\n+\n \n-

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::Metis
    namespace  Dune::Amg
     
    \n-\n-\n-\n-\n-\n-

    \n-Typedefs

    using Dune::Metis::real_t = float
     
    using Dune::Metis::idx_t = std::size_t
     
    \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n

    \n-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.
     
    \n-

    Detailed Description

    \n-

    Functionality for redistributing a parallel index set using graph partitioning.

    \n-

    Refactored version of an intern.

    Author
    Markus Blatt
    \n-

    Variable Documentation

    \n-\n-

    ◆ globalOwnerVertices

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

    & outcomm,\n-1871 R& redistInf,\n-1872 bool v=false)\n-1873 {\n-1874 if(nparts!=oocomm.size())\n-1875 DUNE_THROW(NotImplemented, \"only available for MPI programs\");\n-1876 }\n-1877\n-1878\n-1879 template\n-1880 bool _\bc_\bo_\bm_\bm_\bG_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn(const G& graph, P& oocomm, int nparts,\n-1881 std::shared_ptr

    & outcomm,\n-1882 R& redistInf,\n-1883 bool v=false)\n-1884 {\n-1885 if(nparts!=oocomm.size())\n-1886 DUNE_THROW(NotImplemented, \"only available for MPI programs\");\n-1887 }\n-1888#endif // HAVE_MPI\n-1889} // end of namespace Dune\n-1890#endif\n-_\bg_\br_\ba_\bp_\bh_\b._\bh_\bh\n-Provides classes for building the matrix graph.\n-_\bg_\bl_\bo_\bb_\ba_\bl_\bO_\bw_\bn_\be_\br_\bV_\be_\br_\bt_\bi_\bc_\be_\bs\n-int globalOwnerVertices\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:175\n-_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n-Classes providing communication interfaces for overlapping Schwarz methods.\n-_\bm_\ba_\bt\n-Matrix & mat\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\b5_\b6 void _\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp(std::size_t){}\n+57\n+_\b5_\b8 void _\bf_\br_\be_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp(){}\n+59\n+_\b6_\b0 const _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bg_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp() const\n+61 {\n+62 return gli;\n+63 }\n+64\n+65 template\n+_\b6_\b6 void _\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl([[maybe_unused]] V& v, [[maybe_unused]] V& v1) const\n+67 {}\n+68\n+69 template\n+_\b7_\b0 void _\bp_\br_\bo_\bj_\be_\bc_\bt([[maybe_unused]] V& v) const\n+71 {}\n+72\n+73 template\n+_\b7_\b4 void _\bd_\bo_\bt (const T1& x, const T1& y, T2& result) const\n+75 {\n+76 result = x.dot(y);\n+77 }\n+78\n+79 template\n+_\b8_\b0 typename FieldTraits::real_type _\bn_\bo_\br_\bm (const T1& x)\n+const\n+81 {\n+82 return x.two_norm();\n+83 }\n+84\n+85 template\n+_\b8_\b6 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(const Communication&)\n+87 {}\n+88\n+_\b8_\b9 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn()\n+90 {}\n+91\n+_\b9_\b2 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn(const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn&)\n+93 {}\n+94 private:\n+95 _\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br comm_{};\n+96 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt gli{};\n+97 };\n+98\n+99\n+100 } // namespace Amg\n+101} //namespace Dune\n+102#endif\n+_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-bool buildCommunication(const G &graph, std::vector< int > &realparts, Dune::\n-OwnerOverlapCopyCommunication< T1, T2 > &oocomm, std::shared_ptr< Dune::\n-OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface\n-&redistInf, bool verbose=false)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:1449\n-_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bi_\bl_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\bH_\bo_\bl_\be_\bs\n-void fillIndexSetHoles(const G &graph, Dune::OwnerOverlapCopyCommunication< T1,\n-T2 > &oocomm)\n-Fills the holes in an index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:83\n-_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bm_\bm_\bG_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn\n-bool commGraphRepartition(const M &mat, Dune::OwnerOverlapCopyCommunication<\n-T1, T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::\n-OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface\n-&redistInf, bool verbose=false)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:822\n-_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\b__\bc_\ba_\br_\br_\ba_\by\n-void print_carray(S &os, T *array, std::size_t l)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:771\n-_\bD_\bu_\bn_\be_\b:_\b:_\bi_\bs_\bV_\ba_\bl_\bi_\bd_\bG_\br_\ba_\bp_\bh\n-bool isValidGraph(std::size_t noVtx, std::size_t gnoVtx, S noEdges, T *xadj, T\n-*adjncy, bool checkSymmetry)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:778\n-_\bD_\bu_\bn_\be_\b:_\b:_\bg_\br_\ba_\bp_\bh_\bR_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn\n-bool graphRepartition(const G &graph, Dune::OwnerOverlapCopyCommunication< T1,\n-T2 > &oocomm, Metis::idx_t nparts, std::shared_ptr< Dune::\n-OwnerOverlapCopyCommunication< T1, T2 > > &outcomm, RedistributeInterface\n-&redistInf, bool verbose=false)\n-execute a graph repartition for a giving graph and indexset.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:1228\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\be_\bt_\bi_\bs_\b:_\b:_\br_\be_\ba_\bl_\b__\bt\n-float real_t\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:53\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\be_\bt_\bi_\bs_\b:_\b:_\bi_\bd_\bx_\b__\bt\n-std::size_t idx_t\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:63\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br\n-@ owner\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-A class setting up standard communication for a two-valued attribute set with\n-owner/overlap/copy sema...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+SequentialInformation()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bS_\bu_\bm\n+T globalSum(const T &t) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:49\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bF_\bl_\ba_\bg_\bs\n+EmptySet< int > CopyFlags\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:31\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bd_\bo_\bt\n+void dot(const T1 &x, const T1 &y, T2 &result) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n+AllSet< int > OwnerSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:32\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl\n+void copyOwnerToAll(V &v, V &v1) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+MPICommunicator communicator() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:38\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n+void buildGlobalLookup(std::size_t)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:56\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bj_\be_\bc_\bt\n+void project(V &v) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bM_\bP_\bI_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n+Communication< void * > MPICommunicator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+SequentialInformation(const Communication< T > &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:86\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n const GlobalLookupIndexSet & globalLookup() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:526\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bn_\bd_\be_\bx_\bS_\be_\bt\n-const ParallelIndexSet & indexSet() const\n-Get the underlying parallel index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:462\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl\n-void copyCopyToAll(const T &source, T &dest) const\n-Communicate values from copy data points to all other data points.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:328\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet\n-The type of the reverse lookup of indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:456\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n-void buildGlobalLookup()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:495\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-const Communication< MPI_Comm > & communicator() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl\n-void copyOwnerToAll(const T &source, T &dest) const\n-Communicate values from owner data points to all other data points.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:311\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-const RemoteIndices & remoteIndices() const\n-Get the underlying remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:471\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bf_\br_\be_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+SequentialInformation(const SequentialInformation &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:92\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bn_\bo_\br_\bm\n+FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:80\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bf_\br_\be_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n void freeGlobalLookup()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:520\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet\n-The type of the parallel index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:449\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bG_\br_\ba_\bp_\bh\n-The (undirected) graph of a matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn graph.hh:51\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:260\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\br_\be_\bs_\be_\br_\bv_\be_\bS_\bp_\ba_\bc_\be_\bF_\bo_\br_\bR_\be_\bc_\be_\bi_\bv_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-void reserveSpaceForReceiveInterface(int proc, int size)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:284\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bR_\be_\bc_\be_\bi_\bv_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-void buildReceiveInterface(std::vector< std::pair< TG, int > > &indices)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:293\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bs_\be_\bt_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-void setCommunicator(MPI_Comm comm)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:261\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bS_\be_\bn_\bd_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-void buildSendInterface(const std::vector< int > &toPart, const IS &idxset)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:266\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be_\b:_\b:_\ba_\bd_\bd_\bR_\be_\bc_\be_\bi_\bv_\be_\bI_\bn_\bd_\be_\bx\n-void addReceiveIndex(int proc, std::size_t idx)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:288\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+int GlobalLookupIndexSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:54\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+SolverCategory::Category category() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bc_\bs\n+int procs() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00215.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00215.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: owneroverlapcopy.hh File Reference\n+dune-istl: indicescoarsener.hh File Reference\n \n \n \n \n \n \n \n@@ -65,101 +65,58 @@\n

    \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n \n+ \n \n
    \n \n-

    Classes providing communication interfaces for overlapping Schwarz methods. \n+

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

    \n-
    #include <new>
    \n-#include <iostream>
    \n+
    #include <dune/common/parallel/indicessyncer.hh>
    \n #include <vector>
    \n-#include <list>
    \n-#include <map>
    \n-#include <set>
    \n-#include <tuple>
    \n-#include <cmath>
    \n-#include <mpi.h>
    \n-#include <dune/common/enumset.hh>
    \n-#include <dune/common/parallel/indexset.hh>
    \n-#include <dune/common/parallel/communicator.hh>
    \n-#include <dune/common/parallel/remoteindices.hh>
    \n-#include <dune/common/parallel/mpicommunication.hh>
    \n-#include "solvercategory.hh"
    \n-#include "istlexception.hh"
    \n-#include <dune/common/parallel/communication.hh>
    \n-#include <dune/istl/matrixmarket.hh>
    \n+#include "renumberer.hh"
    \n+#include <dune/istl/owneroverlapcopy.hh>
    \n+#include "pinfo.hh"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n \n-\n-\n+\n \n-\n-\n+\n+\n \n-\n-\n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::OwnerOverlapCopyAttributeSet
     Attribute set for overlapping Schwarz. More...
    class  Dune::Amg::IndicesCoarsener< T, E >
     
    class  Dune::IndexInfoFromGrid< G, L >
     Information about the index distribution. More...
    class  Dune::Amg::ParallelIndicesCoarsener< T, E >
     
    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::Amg::IndicesCoarsener< OwnerOverlapCopyCommunication< G, L >, E >
     Coarsen Indices in the parallel case. More...
     
    struct  Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::CopyGatherScatter< T >
     gather/scatter callback for communication More...
     
    struct  Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::AddGatherScatter< T >
    class  Dune::Amg::IndicesCoarsener< SequentialInformation, E >
     Coarsen Indices in the sequential case. More...
     
    \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n-\n+\n+\n

    \n-Functions

    template<int dim, template< class, class > class Comm>
    void testRedistributed (int s)
     
    namespace  Dune::Amg
     
    \n

    Detailed Description

    \n-

    Classes providing communication interfaces for overlapping Schwarz methods.

    \n-
    Author
    Peter Bastian
    \n-

    Function Documentation

    \n-\n-

    ◆ testRedistributed()

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

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

    \n+
    Author
    Markus Blatt
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,65 +1,42 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-owneroverlapcopy.hh File Reference\n-_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b _\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-Classes providing communication interfaces for overlapping Schwarz methods.\n-_\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+indicescoarsener.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Provides a class for building the index set and remote indices on the coarse\n+level. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n #include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n-#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bm_\ba_\br_\bk_\be_\bt_\b._\bh_\bh>\n+#include \"_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\"\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n+#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt\n-\u00a0 Attribute set for overlapping Schwarz. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\b _\bT_\b,_\b _\bE_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b<_\b _\bG_\b,_\b _\bL_\b _\b>\n-\u00a0 Information about the index distribution. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\b _\bT_\b,_\b _\bE_\b _\b>\n \u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,_\b _\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b _\b>\n-\u00a0 A class setting up standard communication for a two-valued attribute\n- set with owner/overlap/copy semantics. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,_\b _\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b _\b>_\b:_\b:\n- _\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bT_\b _\b>\n-\u00a0 gather/scatter callback for communication _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bG_\b,_\b _\bL_\b _\b>_\b,_\b _\bE_\b _\b>\n+\u00a0 Coarsen Indices in the parallel case. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,_\b _\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b _\b>_\b:_\b:\n- _\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bT_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\b _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bE_\b _\b>\n+\u00a0 Coarsen Indices in the sequential case. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template class Comm>\n-void\u00a0 _\bt_\be_\bs_\bt_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd (int s)\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Classes providing communication interfaces for overlapping Schwarz methods.\n+Provides a class for building the index set and remote indices on the coarse\n+level.\n Author\n- Peter Bastian\n-*\b**\b**\b**\b**\b* F\bFu\bun\bnc\bct\bti\bio\bon\bn D\bDo\boc\bcu\bum\bme\ben\bnt\bta\bat\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-*\b**\b**\b**\b**\b* _\b?\b\u25c6_\b?\b\u00a0t\bte\bes\bst\btR\bRe\bed\bdi\bis\bst\btr\bri\bib\bbu\but\bte\bed\bd(\b()\b) *\b**\b**\b**\b**\b*\n-template class Comm>\n-void testRedistributed ( int\u00a0 s\bs )\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00215_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00215_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: owneroverlapcopy.hh Source File\n+dune-istl: indicescoarsener.hh Source File\n \n \n \n \n \n \n \n@@ -70,714 +70,446 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    owneroverlapcopy.hh
    \n+
    indicescoarsener.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_OWNEROVERLAPCOPY_HH
    \n-
    6#define DUNE_ISTL_OWNEROVERLAPCOPY_HH
    \n+
    5#ifndef DUNE_AMG_INDICESCOARSENER_HH
    \n+
    6#define DUNE_AMG_INDICESCOARSENER_HH
    \n
    7
    \n-
    8#include <new>
    \n-
    9#include <iostream>
    \n-
    10#include <vector>
    \n-
    11#include <list>
    \n-
    12#include <map>
    \n-
    13#include <set>
    \n-
    14#include <tuple>
    \n+
    8#include <dune/common/parallel/indicessyncer.hh>
    \n+
    9#include <vector>
    \n+
    10#include "renumberer.hh"
    \n+
    11
    \n+
    12#if HAVE_MPI
    \n+\n+
    14#endif
    \n
    15
    \n-
    16#include <cmath>
    \n+
    16#include "pinfo.hh"
    \n
    17
    \n-
    18// MPI header
    \n-
    19#if HAVE_MPI
    \n-
    20#include <mpi.h>
    \n-
    21#endif
    \n+
    18namespace Dune
    \n+
    19{
    \n+
    20 namespace Amg
    \n+
    21 {
    \n
    22
    \n-
    23#include <dune/common/enumset.hh>
    \n-
    24
    \n-
    25#if HAVE_MPI
    \n-
    26#include <dune/common/parallel/indexset.hh>
    \n-
    27#include <dune/common/parallel/communicator.hh>
    \n-
    28#include <dune/common/parallel/remoteindices.hh>
    \n-
    29#include <dune/common/parallel/mpicommunication.hh>
    \n-
    30#endif
    \n-
    31
    \n-
    32#include "solvercategory.hh"
    \n-
    33#include "istlexception.hh"
    \n-
    34#include <dune/common/parallel/communication.hh>
    \n-\n-
    36
    \n-
    37template<int dim, template<class,class> class Comm>
    \n-\n-
    39
    \n+
    34 template<typename T, typename E>
    \n+
    \n+\n+
    36 {};
    \n+
    \n+
    37
    \n+
    38
    \n+
    39#if HAVE_MPI
    \n
    40
    \n-
    41namespace Dune {
    \n-
    42
    \n-
    \n-\n-
    59 {
    \n-
    \n-\n-\n-
    62 };
    \n-
    \n-
    63 };
    \n-
    \n-
    64
    \n-
    76 template <class G, class L>
    \n-
    \n-\n-
    78 {
    \n-
    79 public:
    \n-
    81 typedef G GlobalIdType;
    \n-
    82
    \n-
    84 typedef L LocalIdType;
    \n-
    85
    \n-
    92 typedef std::tuple<GlobalIdType,LocalIdType,int> IndexTripel;
    \n-
    99 typedef std::tuple<int,GlobalIdType,int> RemoteIndexTripel;
    \n-
    100
    \n-
    \n-\n-
    107 {
    \n-
    108 if (std::get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
    \n-\n-\n-
    111 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
    \n-
    112 localindices.insert(x);
    \n-
    113 }
    \n-
    \n-
    114
    \n-
    \n-\n-
    121 {
    \n-
    122 if (std::get<2>(x)!=OwnerOverlapCopyAttributeSet::owner &&
    \n-\n-\n-
    125 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
    \n-
    126 remoteindices.insert(x);
    \n-
    127 }
    \n-
    \n-
    128
    \n-
    \n-
    133 const std::set<IndexTripel>& localIndices () const
    \n-
    134 {
    \n-
    135 return localindices;
    \n-
    136 }
    \n-
    \n-
    137
    \n-
    \n-
    142 const std::set<RemoteIndexTripel>& remoteIndices () const
    \n-
    143 {
    \n-
    144 return remoteindices;
    \n-
    145 }
    \n-
    \n-
    146
    \n-
    \n-
    150 void clear ()
    \n-
    151 {
    \n-
    152 localindices.clear();
    \n-
    153 remoteindices.clear();
    \n-
    154 }
    \n-
    \n-
    155
    \n-
    156 private:
    \n-
    158 std::set<IndexTripel> localindices;
    \n-
    160 std::set<RemoteIndexTripel> remoteindices;
    \n-
    161 };
    \n-
    \n-
    162
    \n-
    163
    \n-
    164#if HAVE_MPI
    \n-
    165
    \n-
    172 template <class GlobalIdType, class LocalIdType=int>
    \n-
    \n-\n-
    174 {
    \n-
    175 template<typename M, typename G, typename L>
    \n-
    176 friend void loadMatrixMarket(M&,
    \n-
    177 const std::string&,
    \n-\n-
    179 bool);
    \n-
    180 // used types
    \n-\n-\n-
    183 typedef typename std::set<IndexTripel>::const_iterator localindex_iterator;
    \n-
    184 typedef typename std::set<RemoteIndexTripel>::const_iterator remoteindex_iterator;
    \n-\n-
    186 typedef Dune::ParallelLocalIndex<AttributeSet> LI;
    \n-
    187 public:
    \n-
    188 typedef Dune::ParallelIndexSet<GlobalIdType,LI,512> PIS;
    \n-
    189 typedef Dune::RemoteIndices<PIS> RI;
    \n-
    190 typedef Dune::RemoteIndexListModifier<PIS,typename RI::Allocator,false> RILM;
    \n-
    191 typedef typename RI::RemoteIndex RX;
    \n-
    192 typedef Dune::BufferedCommunicator BC;
    \n-
    193 typedef Dune::Interface IF;
    \n-
    194 typedef EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner> OwnerSet;
    \n-
    195 typedef EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy> CopySet;
    \n-
    196 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> OwnerOverlapSet;
    \n-
    197 typedef Dune::AllSet<AttributeSet> AllSet;
    \n-
    198 protected:
    \n+
    41 template<typename T, typename E>
    \n+
    \n+\n+
    43 {
    \n+
    44 public:
    \n+\n+
    49
    \n+\n+
    54
    \n+
    55 typedef typename ParallelInformation::ParallelIndexSet ParallelIndexSet;
    \n+
    56
    \n+
    60 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex;
    \n+
    61
    \n+
    65 typedef typename ParallelIndexSet::LocalIndex LocalIndex;
    \n+
    66
    \n+
    70 typedef typename LocalIndex::Attribute Attribute;
    \n+
    71
    \n+
    75 typedef Dune::RemoteIndices<ParallelIndexSet> RemoteIndices;
    \n+
    76
    \n+
    92 template<typename Graph, typename VM>
    \n+
    93 static typename Graph::VertexDescriptor
    \n+
    \n+\n+
    95 Graph& fineGraph,
    \n+
    96 VM& visitedMap,
    \n+\n+
    98 ParallelInformation& coarseInfo,
    \n+
    99 typename Graph::VertexDescriptor noAggregates,
    \n+
    100 bool useFixedOrder = false);
    \n+
    101
    \n+
    102 private:
    \n+
    103 template<typename G, typename I>
    \n+
    104 class ParallelAggregateRenumberer : public AggregateRenumberer<G>
    \n+
    105 {
    \n+
    106 typedef typename G::VertexDescriptor Vertex;
    \n+
    107
    \n+
    108 typedef I GlobalLookupIndexSet;
    \n+
    109
    \n+
    110 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;
    \n+
    111
    \n+
    112 typedef typename IndexPair::GlobalIndex GlobalIndex;
    \n+
    113
    \n+
    114 public:
    \n+
    \n+\n+
    116 : AggregateRenumberer<G>(aggregates), isPublic_(false), lookup_(lookup),
    \n+
    117 globalIndex_(std::numeric_limits<GlobalIndex>::max())
    \n+
    118 {}
    \n+
    \n+
    119
    \n+
    120
    \n+
    \n+
    121 void operator()(const typename G::ConstEdgeIterator& edge)
    \n+
    122 {
    \n+\n+
    124 const IndexPair* pair= lookup_.pair(edge.target());
    \n+
    125 if(pair!=0) {
    \n+
    126 globalIndex(pair->global());
    \n+
    127 attribute(pair->local().attribute());
    \n+
    128 isPublic(pair->local().isPublic());
    \n+
    129 }
    \n+
    130 }
    \n+
    \n+
    131
    \n+
    \n+
    132 Vertex operator()([[maybe_unused]] const GlobalIndex& global)
    \n+
    133 {
    \n+
    134 Vertex current = this->number_;
    \n+
    135 this->operator++();
    \n+
    136 return current;
    \n+
    137 }
    \n+
    \n+
    138
    \n+
    \n+
    139 bool isPublic()
    \n+
    140 {
    \n+
    141 return isPublic_;
    \n+
    142 }
    \n+
    \n+
    143
    \n+
    \n+
    144 void isPublic(bool b)
    \n+
    145 {
    \n+
    146 isPublic_ = isPublic_ || b;
    \n+
    147 }
    \n+
    \n+
    148
    \n+
    \n+
    149 void reset()
    \n+
    150 {
    \n+
    151 globalIndex_ = std::numeric_limits<GlobalIndex>::max();
    \n+
    152 isPublic_=false;
    \n+
    153 }
    \n+
    \n+
    154
    \n+
    \n+\n+
    156 {
    \n+
    157 attribute_=attribute;
    \n+
    158 }
    \n+
    \n+
    159
    \n+
    \n+\n+
    161 {
    \n+
    162 return attribute_;
    \n+
    163 }
    \n+
    \n+
    164
    \n+
    \n+
    165 const GlobalIndex& globalIndex() const
    \n+
    166 {
    \n+
    167 return globalIndex_;
    \n+
    168 }
    \n+
    \n+
    169
    \n+
    \n+
    170 void globalIndex(const GlobalIndex& global)
    \n+
    171 {
    \n+
    172 globalIndex_ = global;
    \n+
    173 }
    \n+
    \n+
    174
    \n+
    175 private:
    \n+
    176 bool isPublic_;
    \n+
    177 Attribute attribute_;
    \n+
    178 const GlobalLookupIndexSet& lookup_;
    \n+
    179 GlobalIndex globalIndex_;
    \n+
    180 };
    \n+
    181
    \n+
    182 template<typename Graph, typename VM, typename I>
    \n+
    183 static void buildCoarseIndexSet(const ParallelInformation& pinfo,
    \n+
    184 Graph& fineGraph,
    \n+
    185 VM& visitedMap,
    \n+\n+
    187 ParallelIndexSet& coarseIndices,
    \n+
    188 ParallelAggregateRenumberer<Graph,I>& renumberer);
    \n+
    189
    \n+
    190 template<typename Graph,typename I>
    \n+
    191 static void buildCoarseRemoteIndices(const RemoteIndices& fineRemote,
    \n+\n+
    193 ParallelIndexSet& coarseIndices,
    \n+
    194 RemoteIndices& coarseRemote,
    \n+
    195 ParallelAggregateRenumberer<Graph,I>& renumberer,
    \n+
    196 bool useFixedOrder);
    \n+
    197
    \n+
    198 };
    \n
    199
    \n-
    200
    \n-
    202 template<typename T>
    \n-
    \n-\n-
    204 {
    \n-
    205 typedef typename CommPolicy<T>::IndexedType V;
    \n-
    206
    \n-
    \n-
    207 static V gather(const T& a, std::size_t i)
    \n-
    208 {
    \n-
    209 return a[i];
    \n-
    210 }
    \n-
    \n-
    211
    \n-
    \n-
    212 static void scatter(T& a, V v, std::size_t i)
    \n-
    213 {
    \n-
    214 a[i] = v;
    \n-
    215 }
    \n-
    \n-
    216 };
    \n-
    \n-
    217 template<typename T>
    \n+
    203 template<typename G, typename L, typename E>
    \n+
    \n+\n+
    205 : public ParallelIndicesCoarsener<OwnerOverlapCopyCommunication<G,L>,E>
    \n+
    206 {};
    \n+
    \n+
    207
    \n+
    208
    \n+
    209#endif
    \n+
    210
    \n+
    217 template<typename E>
    \n
    \n-\n+\n
    219 {
    \n-
    220 typedef typename CommPolicy<T>::IndexedType V;
    \n-
    221
    \n-
    \n-
    222 static V gather(const T& a, std::size_t i)
    \n-
    223 {
    \n-
    224 return a[i];
    \n-
    225 }
    \n-
    \n-
    226
    \n-
    \n-
    227 static void scatter(T& a, V v, std::size_t i)
    \n-
    228 {
    \n-
    229 a[i] += v;
    \n-
    230 }
    \n-
    \n-
    231 };
    \n-
    \n-
    232
    \n-
    \n-\n-
    234 {
    \n-
    235 if (OwnerOverlapToAllInterfaceBuilt)
    \n-
    236 OwnerOverlapToAllInterface.free();
    \n-
    237 OwnerOverlapSet sourceFlags;
    \n-
    238 Combine<OwnerOverlapSet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet>
    \n-
    239 destFlags;
    \n-
    240 OwnerOverlapToAllInterface.build(ri,sourceFlags,destFlags);
    \n-
    241 OwnerOverlapToAllInterfaceBuilt = true;
    \n-
    242 }
    \n-
    \n-
    243
    \n-
    \n-\n-
    245 {
    \n-
    246 if (OwnerToAllInterfaceBuilt)
    \n-
    247 OwnerToAllInterface.free();
    \n-
    248 OwnerSet sourceFlags;
    \n-
    249 AllSet destFlags;
    \n-
    250 OwnerToAllInterface.build(ri,sourceFlags,destFlags);
    \n-
    251 OwnerToAllInterfaceBuilt = true;
    \n-
    252 }
    \n-
    \n-
    253
    \n-
    \n-\n-
    255 {
    \n-
    256 if (OwnerCopyToAllInterfaceBuilt)
    \n-
    257 OwnerCopyToAllInterface.free();
    \n-
    258
    \n-
    259 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
    \n-
    260 OwnerCopySet sourceFlags;
    \n-
    261 Combine<OwnerCopySet,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::overlap>,AttributeSet> destFlags;
    \n-
    262 OwnerCopyToAllInterface.build(ri,sourceFlags,destFlags);
    \n-
    263 OwnerCopyToAllInterfaceBuilt = true;
    \n-
    264 }
    \n-
    \n-
    265
    \n-
    \n-\n-
    267 {
    \n-
    268 if (OwnerCopyToOwnerCopyInterfaceBuilt)
    \n-
    269 OwnerCopyToOwnerCopyInterface.free();
    \n-
    270
    \n+
    220 public:
    \n+
    221 template<typename Graph, typename VM>
    \n+
    222 static typename Graph::VertexDescriptor
    \n+
    223 coarsen(const SequentialInformation & fineInfo,
    \n+
    224 Graph& fineGraph,
    \n+
    225 VM& visitedMap,
    \n+\n+
    227 SequentialInformation& coarseInfo,
    \n+
    228 typename Graph::VertexDescriptor noAggregates,
    \n+
    229 bool useFixedOrder = false);
    \n+
    230 };
    \n+
    \n+
    231
    \n+
    232#if HAVE_MPI
    \n+
    233 template<typename T, typename E>
    \n+
    234 template<typename Graph, typename VM>
    \n+
    235 inline typename Graph::VertexDescriptor
    \n+
    \n+\n+
    237 Graph& fineGraph,
    \n+
    238 VM& visitedMap,
    \n+\n+
    240 ParallelInformation& coarseInfo,
    \n+
    241 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates,
    \n+
    242 bool useFixedOrder)
    \n+
    243 {
    \n+
    244 ParallelAggregateRenumberer<Graph,typename ParallelInformation::GlobalLookupIndexSet> renumberer(aggregates, fineInfo.globalLookup());
    \n+
    245 buildCoarseIndexSet(fineInfo, fineGraph, visitedMap, aggregates,
    \n+
    246 coarseInfo.indexSet(), renumberer);
    \n+
    247 buildCoarseRemoteIndices(fineInfo.remoteIndices(), aggregates, coarseInfo.indexSet(),
    \n+
    248 coarseInfo.remoteIndices(), renumberer, useFixedOrder);
    \n+
    249
    \n+
    250 return renumberer;
    \n+
    251 }
    \n+
    \n+
    \n+
    252
    \n+
    253 template<typename T, typename E>
    \n+
    254 template<typename Graph, typename VM, typename I>
    \n+
    255 void ParallelIndicesCoarsener<T,E>::buildCoarseIndexSet(const ParallelInformation& pinfo,
    \n+
    256 Graph& fineGraph,
    \n+
    257 VM& visitedMap,
    \n+\n+
    259 ParallelIndexSet& coarseIndices,
    \n+
    260 ParallelAggregateRenumberer<Graph,I>& renumberer)
    \n+
    261 {
    \n+
    262 // fineGraph is the local subgraph corresponding to the vertices the process owns.
    \n+
    263 // i.e. no overlap/copy vertices can be visited traversing the graph
    \n+
    264 typedef typename Graph::ConstVertexIterator Iterator;
    \n+
    265 typedef typename ParallelInformation::GlobalLookupIndexSet GlobalLookupIndexSet;
    \n+
    266
    \n+
    267 Iterator end = fineGraph.end();
    \n+
    268 const GlobalLookupIndexSet& lookup = pinfo.globalLookup();
    \n+
    269
    \n+
    270 coarseIndices.beginResize();
    \n
    271
    \n-
    272 typedef Combine<EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::owner>,EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy>,AttributeSet> OwnerCopySet;
    \n-
    273 OwnerCopySet sourceFlags;
    \n-
    274 OwnerCopySet destFlags;
    \n-
    275 OwnerCopyToOwnerCopyInterface.build(ri,sourceFlags,destFlags);
    \n-
    276 OwnerCopyToOwnerCopyInterfaceBuilt = true;
    \n-
    277 }
    \n-
    \n-
    278
    \n-
    \n-\n-
    280 {
    \n-
    281 if (CopyToAllInterfaceBuilt)
    \n-
    282 CopyToAllInterface.free();
    \n-
    283 CopySet sourceFlags;
    \n-
    284 AllSet destFlags;
    \n-
    285 CopyToAllInterface.build(ri,sourceFlags,destFlags);
    \n-
    286 CopyToAllInterfaceBuilt = true;
    \n-
    287 }
    \n-
    \n-
    288
    \n-
    289 public:
    \n-
    290
    \n-
    \n-\n-
    296 return category_;
    \n-
    297 }
    \n-
    \n-
    298
    \n-
    \n-
    299 const Communication<MPI_Comm>& communicator() const
    \n-
    300 {
    \n-
    301 return cc;
    \n-
    302 }
    \n-
    \n-
    303
    \n-
    310 template<class T>
    \n-
    \n-
    311 void copyOwnerToAll (const T& source, T& dest) const
    \n-
    312 {
    \n-
    313 if (!OwnerToAllInterfaceBuilt)
    \n-\n-\n-
    316 communicator.template build<T>(OwnerToAllInterface);
    \n-
    317 communicator.template forward<CopyGatherScatter<T> >(source,dest);
    \n-
    318 communicator.free();
    \n-
    319 }
    \n-
    \n-
    320
    \n-
    327 template<class T>
    \n-
    \n-
    328 void copyCopyToAll (const T& source, T& dest) const
    \n-
    329 {
    \n-
    330 if (!CopyToAllInterfaceBuilt)
    \n-\n-\n-
    333 communicator.template build<T>(CopyToAllInterface);
    \n-
    334 communicator.template forward<CopyGatherScatter<T> >(source,dest);
    \n-
    335 communicator.free();
    \n-
    336 }
    \n-
    \n-
    337
    \n-
    344 template<class T>
    \n-
    \n-
    345 void addOwnerOverlapToAll (const T& source, T& dest) const
    \n-
    346 {
    \n-
    347 if (!OwnerOverlapToAllInterfaceBuilt)
    \n-\n-\n-
    350 communicator.template build<T>(OwnerOverlapToAllInterface);
    \n-
    351 communicator.template forward<AddGatherScatter<T> >(source,dest);
    \n-
    352 communicator.free();
    \n-
    353 }
    \n-
    \n-
    354
    \n-
    361 template<class T>
    \n-
    \n-
    362 void addOwnerCopyToAll (const T& source, T& dest) const
    \n-
    363 {
    \n-
    364 if (!OwnerCopyToAllInterfaceBuilt)
    \n-\n-\n-
    367 communicator.template build<T>(OwnerCopyToAllInterface);
    \n-
    368 communicator.template forward<AddGatherScatter<T> >(source,dest);
    \n-
    369 communicator.free();
    \n-
    370 }
    \n-
    \n+
    272 // Setup the coarse index set and renumber the aggregate consecutively
    \n+
    273 // ascending from zero according to the minimum global index belonging
    \n+
    274 // to the aggregate
    \n+
    275 for(Iterator index = fineGraph.begin(); index != end; ++index) {
    \n+\n+
    277 // Isolated vertices will not be represented on the next level.
    \n+
    278 // These should only be there if skipIsolated is activiated in
    \n+
    279 // the coarsening criterion as otherwise they will be aggregated
    \n+
    280 // and should have real aggregate number in the map right now.
    \n+
    281 if(!get(visitedMap, *index)) {
    \n+
    282 // This vertex was not visited by breadthFirstSearch yet.
    \n+
    283 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;
    \n+
    284 const IndexPair* pair= lookup.pair(*index);
    \n+
    285
    \n+
    286 renumberer.reset(); // reset attribute and global index.
    \n+
    287 if(pair!=0) {
    \n+
    288 // vertex is in the index set. Note that not all vertices have
    \n+
    289 // to be in the index set, just the ones where communication
    \n+
    290 // will happen.
    \n+
    291 assert(!ExcludedAttributes::contains(pair->local().attribute()));
    \n+
    292 renumberer.attribute(pair->local().attribute());
    \n+
    293 renumberer.isPublic(pair->local().isPublic());
    \n+
    294 renumberer.globalIndex(pair->global());
    \n+
    295 }
    \n+
    296
    \n+
    297 // Reconstruct aggregate and mark vertices as visited
    \n+
    298 aggregates.template breadthFirstSearch<false>(*index, aggregates[*index],
    \n+
    299 fineGraph, renumberer, visitedMap);
    \n+
    300
    \n+
    301 if(renumberer.globalIndex()!=std::numeric_limits<GlobalIndex>::max()) {
    \n+
    302 // vertex is in the index set.
    \n+
    303 //std::cout <<" Adding global="<< renumberer.globalIndex()<<" local="<<static_cast<std::size_t>(renumberer)<<std::endl;
    \n+
    304 coarseIndices.add(renumberer.globalIndex(),
    \n+
    305 LocalIndex(renumberer, renumberer.attribute(),
    \n+
    306 renumberer.isPublic()));
    \n+
    307 }
    \n+
    308
    \n+
    309 aggregates[*index] = renumberer;
    \n+
    310 ++renumberer;
    \n+
    311 }
    \n+
    312 }
    \n+
    313
    \n+
    314 coarseIndices.endResize();
    \n+
    315
    \n+
    316 assert(static_cast<std::size_t>(renumberer) >= coarseIndices.size());
    \n+
    317
    \n+
    318 // Reset the visited flags
    \n+
    319 for(Iterator vertex=fineGraph.begin(); vertex != end; ++vertex)
    \n+
    320 put(visitedMap, *vertex, false);
    \n+
    321 }
    \n+
    322
    \n+
    323 template<typename T, typename E>
    \n+
    324 template<typename Graph, typename I>
    \n+
    325 void ParallelIndicesCoarsener<T,E>::buildCoarseRemoteIndices(const RemoteIndices& fineRemote,
    \n+
    326 const AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
    \n+
    327 ParallelIndexSet& coarseIndices,
    \n+
    328 RemoteIndices& coarseRemote,
    \n+
    329 ParallelAggregateRenumberer<Graph,I>& renumberer,
    \n+
    330 bool useFixedOrder)
    \n+
    331 {
    \n+
    332 std::vector<char> attributes(static_cast<std::size_t>(renumberer));
    \n+
    333
    \n+
    334 GlobalLookupIndexSet<ParallelIndexSet> coarseLookup(coarseIndices, static_cast<std::size_t>(renumberer));
    \n+
    335
    \n+
    336 typedef typename RemoteIndices::const_iterator Iterator;
    \n+
    337 Iterator end = fineRemote.end();
    \n+
    338
    \n+
    339 for(Iterator neighbour = fineRemote.begin();
    \n+
    340 neighbour != end; ++neighbour) {
    \n+
    341 int process = neighbour->first;
    \n+
    342
    \n+
    343 assert(neighbour->second.first==neighbour->second.second);
    \n+
    344
    \n+
    345 // Mark all as not known
    \n+
    346 typedef typename std::vector<char>::iterator CIterator;
    \n+
    347
    \n+
    348 for(CIterator iter=attributes.begin(); iter!= attributes.end(); ++iter)
    \n+
    349 *iter = std::numeric_limits<char>::max();
    \n+
    350
    \n+
    351 auto riEnd = neighbour->second.second->end();
    \n+
    352
    \n+
    353 for(auto index = neighbour->second.second->begin();
    \n+
    354 index != riEnd; ++index) {
    \n+
    355 if(!E::contains(index->localIndexPair().local().attribute()) &&
    \n+
    356 aggregates[index->localIndexPair().local()] !=
    \n+\n+
    358 {
    \n+
    359 assert(aggregates[index->localIndexPair().local()]<attributes.size());
    \n+
    360 if (attributes[aggregates[index->localIndexPair().local()]] != 3)
    \n+
    361 attributes[aggregates[index->localIndexPair().local()]] = index->attribute();
    \n+
    362 }
    \n+
    363 }
    \n+
    364
    \n+
    365 // Build remote index list
    \n+
    366 typedef RemoteIndexListModifier<ParallelIndexSet,typename RemoteIndices::Allocator,false> Modifier;
    \n+
    367 typedef typename RemoteIndices::RemoteIndex RemoteIndex;
    \n+
    368 typedef typename ParallelIndexSet::const_iterator IndexIterator;
    \n+
    369
    \n+
    370 Modifier coarseList = coarseRemote.template getModifier<false,true>(process);
    \n
    371
    \n-
    378 template<class T>
    \n-
    \n-
    379 void addOwnerCopyToOwnerCopy (const T& source, T& dest) const
    \n-
    380 {
    \n-
    381 if (!OwnerCopyToOwnerCopyInterfaceBuilt)
    \n-\n-\n-
    384 communicator.template build<T>(OwnerCopyToOwnerCopyInterface);
    \n-
    385 communicator.template forward<AddGatherScatter<T> >(source,dest);
    \n-
    386 communicator.free();
    \n-
    387 }
    \n-
    \n+
    372 IndexIterator iend = coarseIndices.end();
    \n+
    373 for(IndexIterator index = coarseIndices.begin(); index != iend; ++index)
    \n+
    374 if(attributes[index->local()] != std::numeric_limits<char>::max()) {
    \n+
    375 // remote index is present
    \n+
    376 coarseList.insert(RemoteIndex(Attribute(attributes[index->local()]), &(*index)));
    \n+
    377 }
    \n+
    378 //std::cout<<coarseRemote<<std::endl;
    \n+
    379 }
    \n+
    380
    \n+
    381 // The number of neighbours should not change!
    \n+
    382 assert(coarseRemote.neighbours()==fineRemote.neighbours());
    \n+
    383
    \n+
    384 // sync the index set and the remote indices to recompute missing
    \n+
    385 // indices
    \n+
    386 IndicesSyncer<ParallelIndexSet> syncer(coarseIndices, coarseRemote);
    \n+
    387 syncer.sync(renumberer, useFixedOrder);
    \n
    388
    \n-
    389
    \n-
    397 template<class T1, class T2>
    \n-
    \n-
    398 void dot (const T1& x, const T1& y, T2& result) const
    \n-
    399 {
    \n-
    400 using real_type = typename FieldTraits<typename T1::field_type>::real_type;
    \n-
    401 // set up mask vector
    \n-
    402 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
    \n-
    403 {
    \n-
    404 mask.resize(x.size());
    \n-
    405 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
    \n-
    406 mask[i] = 1;
    \n-
    407 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
    \n-
    408 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
    \n-
    409 mask[i->local().local()] = 0;
    \n-
    410 }
    \n-
    411 result = T2(0.0);
    \n-
    412
    \n-
    413 for (typename T1::size_type i=0; i<x.size(); i++)
    \n-
    414 result += (x[i]*(y[i]))*static_cast<real_type>(mask[i]);
    \n-
    415 result = cc.sum(result);
    \n-
    416 }
    \n-
    \n-
    417
    \n-
    424 template<class T1>
    \n-
    \n-
    425 typename FieldTraits<typename T1::field_type>::real_type norm (const T1& x) const
    \n-
    426 {
    \n-
    427 using real_type = typename FieldTraits<typename T1::field_type>::real_type;
    \n-
    428
    \n-
    429 // set up mask vector
    \n-
    430 if (mask.size()!=static_cast<typename std::vector<double>::size_type>(x.size()))
    \n-
    431 {
    \n-
    432 mask.resize(x.size());
    \n-
    433 for (typename std::vector<double>::size_type i=0; i<mask.size(); i++)
    \n-
    434 mask[i] = 1;
    \n-
    435 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
    \n-
    436 if (i->local().attribute()!=OwnerOverlapCopyAttributeSet::owner)
    \n-
    437 mask[i->local().local()] = 0;
    \n-
    438 }
    \n-
    439 auto result = real_type(0.0);
    \n-
    440 for (typename T1::size_type i=0; i<x.size(); i++)
    \n-
    441 result += Impl::asVector(x[i]).two_norm2()*mask[i];
    \n-
    442 using std::sqrt;
    \n-
    443 return sqrt(cc.sum(result));
    \n-
    444 }
    \n-
    \n-
    445
    \n-
    446 typedef Dune::EnumItem<AttributeSet,OwnerOverlapCopyAttributeSet::copy> CopyFlags;
    \n-
    447
    \n-
    449 typedef Dune::ParallelIndexSet<GlobalIdType,LI,512> ParallelIndexSet;
    \n-
    450
    \n-
    452 typedef Dune::RemoteIndices<PIS> RemoteIndices;
    \n-
    453
    \n-
    456 typedef Dune::GlobalLookupIndexSet<ParallelIndexSet> GlobalLookupIndexSet;
    \n-
    457
    \n-
    \n-\n-
    463 {
    \n-
    464 return pis;
    \n-
    465 }
    \n-
    \n-
    466
    \n-
    \n-\n-
    472 {
    \n-
    473 return ri;
    \n-
    474 }
    \n-
    \n-
    475
    \n-
    \n-\n-
    481 {
    \n-
    482 return pis;
    \n-
    483 }
    \n-
    \n-
    484
    \n-
    485
    \n-
    \n-\n-
    491 {
    \n-
    492 return ri;
    \n-
    493 }
    \n-
    \n-
    494
    \n-
    \n-\n-
    496 {
    \n-
    497 if(globalLookup_) {
    \n-
    498 if(pis.seqNo()==oldseqNo)
    \n-
    499 // Nothing changed!
    \n-
    500 return;
    \n-
    501 delete globalLookup_;
    \n-
    502 }
    \n-
    503
    \n-
    504 globalLookup_ = new GlobalLookupIndexSet(pis);
    \n-
    505 oldseqNo = pis.seqNo();
    \n-
    506 }
    \n-
    \n-
    507
    \n-
    \n-
    508 void buildGlobalLookup(std::size_t size)
    \n-
    509 {
    \n-
    510 if(globalLookup_) {
    \n-
    511 if(pis.seqNo()==oldseqNo)
    \n-
    512 // Nothing changed!
    \n-
    513 return;
    \n-
    514 delete globalLookup_;
    \n-
    515 }
    \n-
    516 globalLookup_ = new GlobalLookupIndexSet(pis, size);
    \n-
    517 oldseqNo = pis.seqNo();
    \n-
    518 }
    \n-
    \n-
    519
    \n-
    \n-\n-
    521 {
    \n-
    522 delete globalLookup_;
    \n-
    523 globalLookup_=0;
    \n-
    524 }
    \n-
    \n-
    525
    \n-
    \n-\n-
    527 {
    \n-
    528 assert(globalLookup_ != 0);
    \n-
    529 return *globalLookup_;
    \n-
    530 }
    \n-
    \n-
    531
    \n-
    537 template<class T1>
    \n-
    \n-
    538 void project (T1& x) const
    \n-
    539 {
    \n-
    540 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)
    \n-
    541 if (i->local().attribute()==OwnerOverlapCopyAttributeSet::copy)
    \n-
    542 x[i->local().local()] = 0;
    \n-
    543 }
    \n-
    \n-
    544
    \n-
    \n-\n-\n-
    556 bool freecomm_ = false)
    \n-
    557 : comm(comm_), cc(comm_), pis(), ri(pis,pis,comm_),
    \n-
    558 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
    \n-
    559 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
    \n-
    560 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_),
    \n-
    561 freecomm(freecomm_)
    \n-
    562 {}
    \n-
    \n-
    563
    \n-
    \n-\n-
    573 : comm(MPI_COMM_WORLD), cc(MPI_COMM_WORLD), pis(), ri(pis,pis,MPI_COMM_WORLD),
    \n-
    574 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),
    \n-
    575 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt(false),
    \n-
    576 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), freecomm(false)
    \n-
    577 {}
    \n-
    \n-
    578
    \n-
    \n-\n-
    587 MPI_Comm comm_,
    \n-\n-
    589 bool freecomm_ = false)
    \n-
    590 : comm(comm_), cc(comm_), OwnerToAllInterfaceBuilt(false),
    \n-
    591 OwnerOverlapToAllInterfaceBuilt(false), OwnerCopyToAllInterfaceBuilt(false),
    \n-
    592 OwnerCopyToOwnerCopyInterfaceBuilt(false), CopyToAllInterfaceBuilt(false),
    \n-
    593 globalLookup_(0), category_(cat_), freecomm(freecomm_)
    \n-
    594 {
    \n-
    595 // set up an ISTL index set
    \n-
    596 pis.beginResize();
    \n-
    597 for (localindex_iterator i=indexinfo.localIndices().begin(); i!=indexinfo.localIndices().end(); ++i)
    \n-
    598 {
    \n-
    599 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
    \n-
    600 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::owner,true));
    \n-
    601 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
    \n-
    602 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::overlap,true));
    \n-
    603 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
    \n-
    604 pis.add(std::get<0>(*i),LI(std::get<1>(*i),OwnerOverlapCopyAttributeSet::copy,true));
    \n-
    605 // std::cout << cc.rank() << ": adding index " << std::get<0>(*i) << " " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl;
    \n-
    606 }
    \n-
    607 pis.endResize();
    \n-
    608
    \n-
    609 // build remote indices WITHOUT communication
    \n-
    610 // std::cout << cc.rank() << ": build remote indices" << std::endl;
    \n-
    611 ri.setIndexSets(pis,pis,cc);
    \n-
    612 if (indexinfo.remoteIndices().size()>0)
    \n-
    613 {
    \n-
    614 remoteindex_iterator i=indexinfo.remoteIndices().begin();
    \n-
    615 int p = std::get<0>(*i);
    \n-
    616 RILM modifier = ri.template getModifier<false,true>(p);
    \n-
    617 typename PIS::const_iterator pi=pis.begin();
    \n-
    618 for ( ; i!=indexinfo.remoteIndices().end(); ++i)
    \n-
    619 {
    \n-
    620 // handle processor change
    \n-
    621 if (p!=std::get<0>(*i))
    \n-
    622 {
    \n-
    623 p = std::get<0>(*i);
    \n-
    624 modifier = ri.template getModifier<false,true>(p);
    \n-
    625 pi=pis.begin();
    \n-
    626 }
    \n-
    627
    \n-
    628 // position to correct entry in parallel index set
    \n-
    629 while (pi->global()!=std::get<1>(*i) && pi!=pis.end())
    \n-
    630 ++pi;
    \n-
    631 if (pi==pis.end())
    \n-
    632 DUNE_THROW(ISTLError,"OwnerOverlapCopyCommunication: global index not in index set");
    \n-
    633
    \n-
    634 // insert entry
    \n-
    635 // std::cout << cc.rank() << ": adding remote index " << std::get<0>(*i) << " " << std::get<1>(*i) << " " << std::get<2>(*i) << std::endl;
    \n-
    636 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::owner)
    \n-
    637 modifier.insert(RX(OwnerOverlapCopyAttributeSet::owner,&(*pi)));
    \n-
    638 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::overlap)
    \n-
    639 modifier.insert(RX(OwnerOverlapCopyAttributeSet::overlap,&(*pi)));
    \n-
    640 if (std::get<2>(*i)==OwnerOverlapCopyAttributeSet::copy)
    \n-
    641 modifier.insert(RX(OwnerOverlapCopyAttributeSet::copy,&(*pi)));
    \n-
    642 }
    \n-
    643 }else{
    \n-
    644 // Force remote indices to be synced!
    \n-
    645 ri.template getModifier<false,true>(0);
    \n-
    646 }
    \n-
    647 }
    \n-
    \n-
    648
    \n-
    649 // destructor: free memory in some objects
    \n-
    \n-\n-
    651 {
    \n-
    652 ri.free();
    \n-
    653 if (OwnerToAllInterfaceBuilt) OwnerToAllInterface.free();
    \n-
    654 if (OwnerOverlapToAllInterfaceBuilt) OwnerOverlapToAllInterface.free();
    \n-
    655 if (OwnerCopyToAllInterfaceBuilt) OwnerCopyToAllInterface.free();
    \n-
    656 if (OwnerCopyToOwnerCopyInterfaceBuilt) OwnerCopyToOwnerCopyInterface.free();
    \n-
    657 if (CopyToAllInterfaceBuilt) CopyToAllInterface.free();
    \n-
    658 if (globalLookup_) delete globalLookup_;
    \n-
    659 if (freecomm && (comm != MPI_COMM_NULL))
    \n-
    660 {
    \n-
    661 // If it is possible to query whether MPI_Finalize
    \n-
    662 // was called, only free the communicator before
    \n-
    663 // calling MPI_Finalize.
    \n-
    664 int wasFinalized = 0;
    \n-
    665 MPI_Finalized(&wasFinalized);
    \n-
    666 if (!wasFinalized) {
    \n-
    667 MPI_Comm_free(&comm);
    \n-
    668 }
    \n-
    669 }
    \n-
    670 }
    \n-
    \n-
    671
    \n-
    672 private:
    \n-\n-
    674 {}
    \n-
    675 MPI_Comm comm;
    \n-
    676 Communication<MPI_Comm> cc;
    \n-
    677 PIS pis;
    \n-
    678 RI ri;
    \n-
    679 mutable IF OwnerToAllInterface;
    \n-
    680 mutable bool OwnerToAllInterfaceBuilt;
    \n-
    681 mutable IF OwnerOverlapToAllInterface;
    \n-
    682 mutable bool OwnerOverlapToAllInterfaceBuilt;
    \n-
    683 mutable IF OwnerCopyToAllInterface;
    \n-
    684 mutable bool OwnerCopyToAllInterfaceBuilt;
    \n-
    685 mutable IF OwnerCopyToOwnerCopyInterface;
    \n-
    686 mutable bool OwnerCopyToOwnerCopyInterfaceBuilt;
    \n-
    687 mutable IF CopyToAllInterface;
    \n-
    688 mutable bool CopyToAllInterfaceBuilt;
    \n-
    689 mutable std::vector<double> mask;
    \n-
    690 int oldseqNo;
    \n-
    691 GlobalLookupIndexSet* globalLookup_;
    \n-
    692 const SolverCategory::Category category_;
    \n-
    693 bool freecomm;
    \n-
    694 };
    \n-
    \n-
    695
    \n-
    696#endif
    \n-
    697
    \n-
    698
    \n-
    701} // end namespace
    \n-
    702
    \n-
    703#endif
    \n-\n-\n-
    Provides classes for reading and writing MatrixMarket Files with an extension for parallel matrices.
    \n-
    void testRedistributed(int s)
    \n+
    389 }
    \n+
    390
    \n+
    391#endif
    \n+
    392
    \n+
    393 template<typename E>
    \n+
    394 template<typename Graph, typename VM>
    \n+
    395 typename Graph::VertexDescriptor
    \n+
    \n+\n+
    397 [[maybe_unused]] const SequentialInformation& fineInfo,
    \n+
    398 [[maybe_unused]] Graph& fineGraph,
    \n+
    399 [[maybe_unused]] VM& visitedMap,
    \n+
    400 [[maybe_unused]] AggregatesMap<typename Graph::VertexDescriptor>& aggregates,
    \n+
    401 [[maybe_unused]] SequentialInformation& coarseInfo,
    \n+
    402 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates,
    \n+
    403 [[maybe_unused]] bool useFixedOrder)
    \n+
    404 {
    \n+
    405 return noAggregates;
    \n+
    406 }
    \n+
    \n+
    407
    \n+
    408 } //namespace Amg
    \n+
    409} // namespace Dune
    \n+
    410#endif
    \n+
    \n+
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n+\n+\n+\n+
    LocalIndex::Attribute Attribute
    The type of the attribute.
    Definition indicescoarsener.hh:70
    \n+
    void operator()(const typename G::ConstEdgeIterator &edge)
    Definition indicescoarsener.hh:121
    \n+
    void isPublic(bool b)
    Definition indicescoarsener.hh:144
    \n+
    ParallelInformation::ParallelIndexSet ParallelIndexSet
    Definition indicescoarsener.hh:55
    \n+\n+
    ParallelIndexSet::LocalIndex LocalIndex
    The type of the local index.
    Definition indicescoarsener.hh:65
    \n+
    T ParallelInformation
    The type of the parallel information.
    Definition indicescoarsener.hh:53
    \n+
    Attribute attribute()
    Definition indicescoarsener.hh:160
    \n+
    Vertex operator()(const GlobalIndex &global)
    Definition indicescoarsener.hh:132
    \n+
    static const V ISOLATED
    Identifier of isolated vertices.
    Definition aggregates.hh:571
    \n+
    ParallelIndexSet::GlobalIndex GlobalIndex
    The type of the global index.
    Definition indicescoarsener.hh:60
    \n+
    void attribute(const Attribute &attribute)
    Definition indicescoarsener.hh:155
    \n+
    E ExcludedAttributes
    The set of excluded attributes.
    Definition indicescoarsener.hh:48
    \n+
    void globalIndex(const GlobalIndex &global)
    Definition indicescoarsener.hh:170
    \n+
    Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
    The type of the remote indices.
    Definition indicescoarsener.hh:75
    \n+
    static Graph::VertexDescriptor coarsen(ParallelInformation &fineInfo, Graph &fineGraph, VM &visitedMap, AggregatesMap< typename Graph::VertexDescriptor > &aggregates, ParallelInformation &coarseInfo, typename Graph::VertexDescriptor noAggregates, bool useFixedOrder=false)
    Build the coarse index set after the aggregatio.
    Definition indicescoarsener.hh:236
    \n+
    ParallelAggregateRenumberer(AggregatesMap< Vertex > &aggregates, const I &lookup)
    Definition indicescoarsener.hh:115
    \n+
    const GlobalIndex & globalIndex() const
    Definition indicescoarsener.hh:165
    \n+
    STL namespace.
    \n
    Definition allocator.hh:11
    \n-
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    Attribute set for overlapping Schwarz.
    Definition owneroverlapcopy.hh:59
    \n-
    AttributeSet
    Definition owneroverlapcopy.hh:60
    \n-
    @ owner
    Definition owneroverlapcopy.hh:61
    \n-
    @ copy
    Definition owneroverlapcopy.hh:61
    \n-
    @ overlap
    Definition owneroverlapcopy.hh:61
    \n-
    Information about the index distribution.
    Definition owneroverlapcopy.hh:78
    \n-
    std::tuple< GlobalIdType, LocalIdType, int > IndexTripel
    A triple describing a local index.
    Definition owneroverlapcopy.hh:92
    \n-
    void addRemoteIndex(const RemoteIndexTripel &x)
    Add a new remote index triple to the set of remote indices.
    Definition owneroverlapcopy.hh:120
    \n-
    G GlobalIdType
    The type of the global index.
    Definition owneroverlapcopy.hh:81
    \n-
    const std::set< IndexTripel > & localIndices() const
    Get the set of indices local to the process.
    Definition owneroverlapcopy.hh:133
    \n-
    const std::set< RemoteIndexTripel > & remoteIndices() const
    Get the set of remote indices.
    Definition owneroverlapcopy.hh:142
    \n-
    L LocalIdType
    The type of the local index.
    Definition owneroverlapcopy.hh:84
    \n-
    void clear()
    Remove all indices from the sets.
    Definition owneroverlapcopy.hh:150
    \n-
    void addLocalIndex(const IndexTripel &x)
    Add a new index triple to the set of local indices.
    Definition owneroverlapcopy.hh:106
    \n-
    std::tuple< int, GlobalIdType, int > RemoteIndexTripel
    A triple describing a remote index.
    Definition owneroverlapcopy.hh:99
    \n+
    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
    \n
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n-
    EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopySet
    Definition owneroverlapcopy.hh:195
    \n-
    const GlobalLookupIndexSet & globalLookup() const
    Definition owneroverlapcopy.hh:526
    \n-
    FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const
    Compute the global Euclidean norm of a vector.
    Definition owneroverlapcopy.hh:425
    \n-
    void buildOwnerOverlapToAllInterface() const
    Definition owneroverlapcopy.hh:233
    \n-
    Dune::ParallelIndexSet< GlobalIdType, LI, 512 > PIS
    Definition owneroverlapcopy.hh:188
    \n-
    void buildOwnerCopyToAllInterface() const
    Definition owneroverlapcopy.hh:254
    \n-
    void buildOwnerCopyToOwnerCopyInterface() const
    Definition owneroverlapcopy.hh:266
    \n-
    OwnerOverlapCopyCommunication(const IndexInfoFromGrid< GlobalIdType, LocalIdType > &indexinfo, MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
    Constructor.
    Definition owneroverlapcopy.hh:586
    \n-
    SolverCategory::Category category() const
    Get Solver Category.
    Definition owneroverlapcopy.hh:295
    \n-
    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
    \n-
    void buildCopyToAllInterface() const
    Definition owneroverlapcopy.hh:279
    \n-
    Dune::EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopyFlags
    Definition owneroverlapcopy.hh:446
    \n-
    RemoteIndices & remoteIndices()
    Get the underlying remote indices.
    Definition owneroverlapcopy.hh:490
    \n-
    const ParallelIndexSet & indexSet() const
    Get the underlying parallel index set.
    Definition owneroverlapcopy.hh:462
    \n-
    Dune::RemoteIndices< PIS > RI
    Definition owneroverlapcopy.hh:189
    \n-
    void buildGlobalLookup(std::size_t size)
    Definition owneroverlapcopy.hh:508
    \n-
    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
    \n-
    Dune::RemoteIndices< PIS > RemoteIndices
    The type of the remote indices.
    Definition owneroverlapcopy.hh:452
    \n-
    void project(T1 &x) const
    Set vector to zero at copy dofs.
    Definition owneroverlapcopy.hh:538
    \n-
    Dune::AllSet< AttributeSet > AllSet
    Definition owneroverlapcopy.hh:197
    \n-
    Combine< EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner >, EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::overlap >, AttributeSet > OwnerOverlapSet
    Definition owneroverlapcopy.hh:196
    \n-
    void copyCopyToAll(const T &source, T &dest) const
    Communicate values from copy data points to all other data points.
    Definition owneroverlapcopy.hh:328
    \n-
    Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet
    The type of the reverse lookup of indices.
    Definition owneroverlapcopy.hh:456
    \n-
    Dune::Interface IF
    Definition owneroverlapcopy.hh:193
    \n-
    ~OwnerOverlapCopyCommunication()
    Definition owneroverlapcopy.hh:650
    \n-
    void buildGlobalLookup()
    Definition owneroverlapcopy.hh:495
    \n-
    Dune::BufferedCommunicator BC
    Definition owneroverlapcopy.hh:192
    \n-
    OwnerOverlapCopyCommunication(MPI_Comm comm_, SolverCategory::Category cat_=SolverCategory::overlapping, bool freecomm_=false)
    Construct the communication without any indices.
    Definition owneroverlapcopy.hh:554
    \n-
    ParallelIndexSet & indexSet()
    Get the underlying parallel index set.
    Definition owneroverlapcopy.hh:480
    \n-
    void dot(const T1 &x, const T1 &y, T2 &result) const
    Compute a global dot product of two vectors.
    Definition owneroverlapcopy.hh:398
    \n-
    const Communication< MPI_Comm > & communicator() const
    Definition owneroverlapcopy.hh:299
    \n-
    OwnerOverlapCopyCommunication(SolverCategory::Category cat_=SolverCategory::overlapping)
    Construct the communication without any indices using MPI_COMM_WORLD.
    Definition owneroverlapcopy.hh:572
    \n-
    EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet
    Definition owneroverlapcopy.hh:194
    \n-
    void copyOwnerToAll(const T &source, T &dest) const
    Communicate values from owner data points to all other data points.
    Definition owneroverlapcopy.hh:311
    \n-
    const RemoteIndices & remoteIndices() const
    Get the underlying remote indices.
    Definition owneroverlapcopy.hh:471
    \n-
    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
    \n-
    RI::RemoteIndex RX
    Definition owneroverlapcopy.hh:191
    \n-
    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
    \n-
    void freeGlobalLookup()
    Definition owneroverlapcopy.hh:520
    \n-
    Dune::RemoteIndexListModifier< PIS, typename RI::Allocator, false > RILM
    Definition owneroverlapcopy.hh:190
    \n-
    Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet
    The type of the parallel index set.
    Definition owneroverlapcopy.hh:449
    \n-
    void buildOwnerToAllInterface() const
    Definition owneroverlapcopy.hh:244
    \n-
    gather/scatter callback for communication
    Definition owneroverlapcopy.hh:204
    \n-
    static V gather(const T &a, std::size_t i)
    Definition owneroverlapcopy.hh:207
    \n-
    static void scatter(T &a, V v, std::size_t i)
    Definition owneroverlapcopy.hh:212
    \n-
    CommPolicy< T >::IndexedType V
    Definition owneroverlapcopy.hh:205
    \n-\n-
    CommPolicy< T >::IndexedType V
    Definition owneroverlapcopy.hh:220
    \n-
    static V gather(const T &a, std::size_t i)
    Definition owneroverlapcopy.hh:222
    \n-
    static void scatter(T &a, V v, std::size_t i)
    Definition owneroverlapcopy.hh:227
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ overlapping
    Category for overlapping solvers.
    Definition solvercategory.hh:29
    \n+
    Class providing information about the mapping of the vertices onto aggregates.
    Definition aggregates.hh:560
    \n+
    Definition indicescoarsener.hh:36
    \n+
    Definition indicescoarsener.hh:43
    \n+
    Definition pinfo.hh:28
    \n+
    Definition renumberer.hh:16
    \n+
    void operator++()
    Definition renumberer.hh:57
    \n+
    void operator()(const typename G::ConstEdgeIterator &edge)
    Definition renumberer.hh:51
    \n+
    Vertex number_
    Definition renumberer.hh:35
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,837 +1,491 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-owneroverlapcopy.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+indicescoarsener.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_OWNEROVERLAPCOPY_HH\n-6#define DUNE_ISTL_OWNEROVERLAPCOPY_HH\n+5#ifndef DUNE_AMG_INDICESCOARSENER_HH\n+6#define DUNE_AMG_INDICESCOARSENER_HH\n 7\n-8#include \n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n+8#include \n+9#include \n+10#include \"_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\"\n+11\n+12#if HAVE_MPI\n+13#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n+14#endif\n 15\n-16#include \n+16#include \"_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\"\n 17\n-18// MPI header\n-19#if HAVE_MPI\n-20#include \n-21#endif\n+18namespace _\bD_\bu_\bn_\be\n+19{\n+20 namespace Amg\n+21 {\n 22\n-23#include \n-24\n-25#if HAVE_MPI\n-26#include \n-27#include \n-28#include \n-29#include \n-30#endif\n-31\n-32#include \"_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\"\n-33#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-34#include \n-35#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bm_\ba_\bt_\br_\bi_\bx_\bm_\ba_\br_\bk_\be_\bt_\b._\bh_\bh>\n-36\n-37template class Comm>\n-_\b3_\b8void _\bt_\be_\bs_\bt_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd(int s);\n-39\n+34 template\n+_\b3_\b5 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n+36 {};\n+37\n+38\n+39#if HAVE_MPI\n 40\n-41namespace _\bD_\bu_\bn_\be {\n-42\n-_\b5_\b8 struct _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt\n-59 {\n-_\b6_\b0 enum _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt {\n-_\b6_\b1 _\bo_\bw_\bn_\be_\br=1, _\bo_\bv_\be_\br_\bl_\ba_\bp=2, _\bc_\bo_\bp_\by=3\n-_\b6_\b2 };\n-63 };\n-64\n-76 template \n-_\b7_\b7 class _\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd\n-78 {\n-79 public:\n-_\b8_\b1 typedef G _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be;\n-82\n-_\b8_\b4 typedef L _\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be;\n-85\n-_\b9_\b2 typedef std::tuple _\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl;\n-_\b9_\b9 typedef std::tuple _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl;\n-100\n-_\b1_\b0_\b6 void _\ba_\bd_\bd_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx (const _\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl& x)\n-107 {\n-108 if (std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br &&\n-109 std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp &&\n-110 std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n-111 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"OwnerOverlapCopyCommunication: global index not in\n-index set\");\n-112 localindices.insert(x);\n-113 }\n-114\n-_\b1_\b2_\b0 void _\ba_\bd_\bd_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx (const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl& x)\n-121 {\n-122 if (std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br &&\n-123 std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp &&\n-124 std::get<2>(x)!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n-125 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"OwnerOverlapCopyCommunication: global index not in\n-index set\");\n-126 remoteindices.insert(x);\n-127 }\n-128\n-_\b1_\b3_\b3 const std::set& _\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs () const\n-134 {\n-135 return localindices;\n-136 }\n-137\n-_\b1_\b4_\b2 const std::set& _\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs () const\n-143 {\n-144 return remoteindices;\n-145 }\n-146\n-_\b1_\b5_\b0 void _\bc_\bl_\be_\ba_\br ()\n-151 {\n-152 localindices.clear();\n-153 remoteindices.clear();\n-154 }\n-155\n-156 private:\n-158 std::set localindices;\n-160 std::set remoteindices;\n-161 };\n-162\n-163\n-164#if HAVE_MPI\n-165\n-172 template \n-_\b1_\b7_\b3 class _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-174 {\n-175 template\n-176 friend void _\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt(M&,\n-177 const std::string&,\n-178 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bG_\b,_\bL_\b>&,\n-179 bool);\n-180 // used types\n-181 typedef typename _\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,_\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl\n-IndexTripel;\n-182 typedef typename _\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,_\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b>_\b:_\b:\n-_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl RemoteIndexTripel;\n-183 typedef typename std::set::const_iterator localindex_iterator;\n-184 typedef typename std::set::const_iterator\n-remoteindex_iterator;\n-185 typedef typename _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt;\n-186 typedef Dune::ParallelLocalIndex LI;\n-187 public:\n-_\b1_\b8_\b8 typedef Dune::ParallelIndexSet _\bP_\bI_\bS;\n-_\b1_\b8_\b9 typedef Dune::RemoteIndices _\bR_\bI;\n-_\b1_\b9_\b0 typedef Dune::RemoteIndexListModifier\n-_\bR_\bI_\bL_\bM;\n-_\b1_\b9_\b1 typedef typename RI::RemoteIndex _\bR_\bX;\n-_\b1_\b9_\b2 typedef Dune::BufferedCommunicator _\bB_\bC;\n-_\b1_\b9_\b3 typedef Dune::Interface _\bI_\bF;\n-_\b1_\b9_\b4 typedef EnumItem\n-_\bO_\bw_\bn_\be_\br_\bS_\be_\bt;\n-_\b1_\b9_\b5 typedef EnumItem _\bC_\bo_\bp_\by_\bS_\be_\bt;\n-_\b1_\b9_\b6 typedef Combine,EnumItem,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt> _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bS_\be_\bt;\n-_\b1_\b9_\b7 typedef Dune::AllSet _\bA_\bl_\bl_\bS_\be_\bt;\n-198 protected:\n+41 template\n+_\b4_\b2 class _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n+43 {\n+44 public:\n+_\b4_\b8 typedef E _\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bs;\n+49\n+_\b5_\b3 typedef T _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n+54\n+_\b5_\b5 typedef typename ParallelInformation::ParallelIndexSet _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n+56\n+_\b6_\b0 typedef typename ParallelIndexSet::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+61\n+_\b6_\b5 typedef typename ParallelIndexSet::LocalIndex _\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+66\n+_\b7_\b0 typedef typename LocalIndex::Attribute _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+71\n+_\b7_\b5 typedef Dune::RemoteIndices _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n+76\n+92 template\n+93 static typename Graph::VertexDescriptor\n+_\b9_\b4 _\bc_\bo_\ba_\br_\bs_\be_\bn(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& fineInfo,\n+95 Graph& fineGraph,\n+96 VM& visitedMap,\n+97 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+98 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& coarseInfo,\n+99 typename Graph::VertexDescriptor noAggregates,\n+100 bool useFixedOrder = false);\n+101\n+102 private:\n+103 template\n+104 class ParallelAggregateRenumberer : public _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n+105 {\n+106 typedef typename G::VertexDescriptor Vertex;\n+107\n+108 typedef I GlobalLookupIndexSet;\n+109\n+110 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;\n+111\n+112 typedef typename IndexPair::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n+113\n+114 public:\n+_\b1_\b1_\b5 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br(_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bV_\be_\br_\bt_\be_\bx_\b>& aggregates, const I&\n+lookup)\n+116 : _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br(aggregates), isPublic_(false), lookup_(lookup),\n+117 globalIndex_(_\bs_\bt_\bd::numeric_limits::max())\n+118 {}\n+119\n+120\n+_\b1_\b2_\b1 void _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const typename G::ConstEdgeIterator& edge)\n+122 {\n+123 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b<_\bG_\b>_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(edge);\n+124 const IndexPair* pair= lookup_.pair(edge.target());\n+125 if(pair!=0) {\n+126 _\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx(pair->global());\n+127 _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(pair->local().attribute());\n+128 _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc(pair->local().isPublic());\n+129 }\n+130 }\n+131\n+_\b1_\b3_\b2 Vertex _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)([[maybe_unused]] const GlobalIndex& global)\n+133 {\n+134 Vertex current = this->_\bn_\bu_\bm_\bb_\be_\br_\b_;\n+135 this->_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+();\n+136 return current;\n+137 }\n+138\n+_\b1_\b3_\b9 bool _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc()\n+140 {\n+141 return isPublic_;\n+142 }\n+143\n+_\b1_\b4_\b4 void _\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc(bool b)\n+145 {\n+146 isPublic_ = isPublic_ || b;\n+147 }\n+148\n+_\b1_\b4_\b9 void _\br_\be_\bs_\be_\bt()\n+150 {\n+151 globalIndex_ = std::numeric_limits::max();\n+152 isPublic_=false;\n+153 }\n+154\n+_\b1_\b5_\b5 void _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be(const _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be& _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be)\n+156 {\n+157 attribute_=_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be;\n+158 }\n+159\n+_\b1_\b6_\b0 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be _\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be()\n+161 {\n+162 return attribute_;\n+163 }\n+164\n+_\b1_\b6_\b5 const GlobalIndex& _\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx() const\n+166 {\n+167 return globalIndex_;\n+168 }\n+169\n+_\b1_\b7_\b0 void _\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx(const GlobalIndex& global)\n+171 {\n+172 globalIndex_ = global;\n+173 }\n+174\n+175 private:\n+176 bool isPublic_;\n+177 _\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be attribute_;\n+178 const GlobalLookupIndexSet& lookup_;\n+179 _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx globalIndex_;\n+180 };\n+181\n+182 template\n+183 static void buildCoarseIndexSet(const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo,\n+184 Graph& fineGraph,\n+185 VM& visitedMap,\n+186 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+187 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& coarseIndices,\n+188 ParallelAggregateRenumberer& renumberer);\n+189\n+190 template\n+191 static void buildCoarseRemoteIndices(const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& fineRemote,\n+192 const _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+193 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& coarseIndices,\n+194 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& coarseRemote,\n+195 ParallelAggregateRenumberer& renumberer,\n+196 bool useFixedOrder);\n+197\n+198 };\n 199\n-200\n-202 template\n-_\b2_\b0_\b3 struct _\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-204 {\n-_\b2_\b0_\b5 typedef typename CommPolicy::IndexedType _\bV;\n-206\n-_\b2_\b0_\b7 static _\bV _\bg_\ba_\bt_\bh_\be_\br(const T& a, std::size_t i)\n-208 {\n-209 return a[i];\n-210 }\n-211\n-_\b2_\b1_\b2 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(T& a, _\bV v, std::size_t i)\n-213 {\n-214 a[i] = v;\n-215 }\n-216 };\n-217 template\n-_\b2_\b1_\b8 struct _\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n+203 template\n+_\b2_\b0_\b4 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br<_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn,E>\n+205 : public _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br,E>\n+206 {};\n+207\n+208\n+209#endif\n+210\n+217 template\n+_\b2_\b1_\b8 class _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn,E>\n 219 {\n-_\b2_\b2_\b0 typedef typename CommPolicy::IndexedType _\bV;\n-221\n-_\b2_\b2_\b2 static _\bV _\bg_\ba_\bt_\bh_\be_\br(const T& a, std::size_t i)\n-223 {\n-224 return a[i];\n-225 }\n-226\n-_\b2_\b2_\b7 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(T& a, _\bV v, std::size_t i)\n-228 {\n-229 a[i] += v;\n-230 }\n-231 };\n-232\n-_\b2_\b3_\b3 void _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be () const\n-234 {\n-235 if (OwnerOverlapToAllInterfaceBuilt)\n-236 OwnerOverlapToAllInterface.free();\n-237 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bS_\be_\bt sourceFlags;\n-238\n-Combine,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt>\n-239 destFlags;\n-240 OwnerOverlapToAllInterface.build(ri,sourceFlags,destFlags);\n-241 OwnerOverlapToAllInterfaceBuilt = true;\n-242 }\n-243\n-_\b2_\b4_\b4 void _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be () const\n-245 {\n-246 if (OwnerToAllInterfaceBuilt)\n-247 OwnerToAllInterface.free();\n-248 _\bO_\bw_\bn_\be_\br_\bS_\be_\bt sourceFlags;\n-249 _\bA_\bl_\bl_\bS_\be_\bt destFlags;\n-250 OwnerToAllInterface.build(ri,sourceFlags,destFlags);\n-251 OwnerToAllInterfaceBuilt = true;\n-252 }\n-253\n-_\b2_\b5_\b4 void _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be () const\n-255 {\n-256 if (OwnerCopyToAllInterfaceBuilt)\n-257 OwnerCopyToAllInterface.free();\n-258\n-259 typedef Combine,EnumItem,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt>\n-OwnerCopySet;\n-260 OwnerCopySet sourceFlags;\n-261 Combine,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt> destFlags;\n-262 OwnerCopyToAllInterface.build(ri,sourceFlags,destFlags);\n-263 OwnerCopyToAllInterfaceBuilt = true;\n-264 }\n-265\n-_\b2_\b6_\b6 void _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be () const\n-267 {\n-268 if (OwnerCopyToOwnerCopyInterfaceBuilt)\n-269 OwnerCopyToOwnerCopyInterface.free();\n-270\n+220 public:\n+221 template\n+222 static typename Graph::VertexDescriptor\n+223 coarsen(const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn & fineInfo,\n+224 Graph& fineGraph,\n+225 VM& visitedMap,\n+226 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+227 _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& coarseInfo,\n+228 typename Graph::VertexDescriptor noAggregates,\n+229 bool useFixedOrder = false);\n+230 };\n+231\n+232#if HAVE_MPI\n+233 template\n+234 template\n+235 inline typename Graph::VertexDescriptor\n+_\b2_\b3_\b6 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\bT_\b,_\bE_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn(_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& fineInfo,\n+237 Graph& fineGraph,\n+238 VM& visitedMap,\n+239 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+240 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& coarseInfo,\n+241 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates,\n+242 bool useFixedOrder)\n+243 {\n+244 ParallelAggregateRenumberer renumberer(aggregates, fineInfo.globalLookup());\n+245 buildCoarseIndexSet(fineInfo, fineGraph, visitedMap, aggregates,\n+246 coarseInfo.indexSet(), renumberer);\n+247 buildCoarseRemoteIndices(fineInfo.remoteIndices(), aggregates,\n+coarseInfo.indexSet(),\n+248 coarseInfo.remoteIndices(), renumberer, useFixedOrder);\n+249\n+250 return renumberer;\n+251 }\n+252\n+253 template\n+254 template\n+255 void _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\bT_\b,_\bE_\b>_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bC_\bo_\ba_\br_\bs_\be_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(const\n+ParallelInformation& pinfo,\n+256 Graph& fineGraph,\n+257 VM& visitedMap,\n+258 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>& aggregates,\n+259 ParallelIndexSet& coarseIndices,\n+260 ParallelAggregateRenumberer& renumberer)\n+261 {\n+262 // fineGraph is the local subgraph corresponding to the vertices the\n+process owns.\n+263 // i.e. no overlap/copy vertices can be visited traversing the graph\n+264 typedef typename Graph::ConstVertexIterator Iterator;\n+265 typedef typename ParallelInformation::GlobalLookupIndexSet\n+GlobalLookupIndexSet;\n+266\n+267 Iterator end = fineGraph.end();\n+268 const GlobalLookupIndexSet& lookup = pinfo.globalLookup();\n+269\n+270 coarseIndices.beginResize();\n 271\n-272 typedef Combine,EnumItem,_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt>\n-OwnerCopySet;\n-273 OwnerCopySet sourceFlags;\n-274 OwnerCopySet destFlags;\n-275 OwnerCopyToOwnerCopyInterface.build(ri,sourceFlags,destFlags);\n-276 OwnerCopyToOwnerCopyInterfaceBuilt = true;\n-277 }\n-278\n-_\b2_\b7_\b9 void _\bb_\bu_\bi_\bl_\bd_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be () const\n-280 {\n-281 if (CopyToAllInterfaceBuilt)\n-282 CopyToAllInterface.free();\n-283 _\bC_\bo_\bp_\by_\bS_\be_\bt sourceFlags;\n-284 _\bA_\bl_\bl_\bS_\be_\bt destFlags;\n-285 CopyToAllInterface.build(ri,sourceFlags,destFlags);\n-286 CopyToAllInterfaceBuilt = true;\n-287 }\n-288\n-289 public:\n-290\n-_\b2_\b9_\b5 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by () const {\n-296 return category_;\n-297 }\n-298\n-_\b2_\b9_\b9 const Communication& _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br() const\n-300 {\n-301 return cc;\n-302 }\n-303\n-310 template\n-_\b3_\b1_\b1 void _\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl (const T& source, T& dest) const\n-312 {\n-313 if (!OwnerToAllInterfaceBuilt)\n-314 _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be ();\n-315 _\bB_\bC _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n-316 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template build(OwnerToAllInterface);\n-317 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template forward >(source,dest);\n-318 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.free();\n-319 }\n-320\n-327 template\n-_\b3_\b2_\b8 void _\bc_\bo_\bp_\by_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl (const T& source, T& dest) const\n-329 {\n-330 if (!CopyToAllInterfaceBuilt)\n-331 _\bb_\bu_\bi_\bl_\bd_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be ();\n-332 _\bB_\bC _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n-333 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template build(CopyToAllInterface);\n-334 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template forward >(source,dest);\n-335 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.free();\n-336 }\n-337\n-344 template\n-_\b3_\b4_\b5 void _\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bT_\bo_\bA_\bl_\bl (const T& source, T& dest) const\n-346 {\n-347 if (!OwnerOverlapToAllInterfaceBuilt)\n-348 _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be ();\n-349 _\bB_\bC _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n-350 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template build(OwnerOverlapToAllInterface);\n-351 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template forward >(source,dest);\n-352 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.free();\n-353 }\n-354\n-361 template\n-_\b3_\b6_\b2 void _\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl (const T& source, T& dest) const\n-363 {\n-364 if (!OwnerCopyToAllInterfaceBuilt)\n-365 _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be ();\n-366 _\bB_\bC _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n-367 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template build(OwnerCopyToAllInterface);\n-368 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template forward >(source,dest);\n-369 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.free();\n-370 }\n+272 // Setup the coarse index set and renumber the aggregate consecutively\n+273 // ascending from zero according to the minimum global index belonging\n+274 // to the aggregate\n+275 for(Iterator index = fineGraph.begin(); index != end; ++index) {\n+276 if(aggregates[*index]!=_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:\n+_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n+277 // Isolated vertices will not be represented on the next level.\n+278 // These should only be there if skipIsolated is activiated in\n+279 // the coarsening criterion as otherwise they will be aggregated\n+280 // and should have real aggregate number in the map right now.\n+281 if(!_\bg_\be_\bt(visitedMap, *index)) {\n+282 // This vertex was not visited by breadthFirstSearch yet.\n+283 typedef typename GlobalLookupIndexSet::IndexPair IndexPair;\n+284 const IndexPair* pair= lookup.pair(*index);\n+285\n+286 renumberer.reset(); // reset attribute and global index.\n+287 if(pair!=0) {\n+288 // vertex is in the index set. Note that not all vertices have\n+289 // to be in the index set, just the ones where communication\n+290 // will happen.\n+291 assert(!ExcludedAttributes::contains(pair->local().attribute()));\n+292 renumberer.attribute(pair->local().attribute());\n+293 renumberer.isPublic(pair->local().isPublic());\n+294 renumberer.globalIndex(pair->global());\n+295 }\n+296\n+297 // Reconstruct aggregate and mark vertices as visited\n+298 aggregates.template breadthFirstSearch(*index, aggregates[*index],\n+299 fineGraph, renumberer, visitedMap);\n+300\n+301 if(renumberer.globalIndex()!=std::numeric_limits::max()) {\n+302 // vertex is in the index set.\n+303 //std::cout <<\" Adding global=\"<< renumberer.globalIndex()<<\"\n+local=\"<(renumberer)<(renumberer) >= coarseIndices.size());\n+317\n+318 // Reset the visited flags\n+319 for(Iterator vertex=fineGraph.begin(); vertex != end; ++vertex)\n+320 put(visitedMap, *vertex, false);\n+321 }\n+322\n+323 template\n+324 template\n+325 void ParallelIndicesCoarsener::buildCoarseRemoteIndices(const\n+RemoteIndices& fineRemote,\n+326 const AggregatesMap& aggregates,\n+327 ParallelIndexSet& coarseIndices,\n+328 RemoteIndices& coarseRemote,\n+329 ParallelAggregateRenumberer& renumberer,\n+330 bool useFixedOrder)\n+331 {\n+332 std::vector attributes(static_cast(renumberer));\n+333\n+334 GlobalLookupIndexSet coarseLookup(coarseIndices,\n+static_cast(renumberer));\n+335\n+336 typedef typename RemoteIndices::const_iterator Iterator;\n+337 Iterator end = fineRemote.end();\n+338\n+339 for(Iterator neighbour = fineRemote.begin();\n+340 neighbour != end; ++neighbour) {\n+341 int process = neighbour->first;\n+342\n+343 assert(neighbour->second.first==neighbour->second.second);\n+344\n+345 // Mark all as not known\n+346 typedef typename std::vector::iterator CIterator;\n+347\n+348 for(CIterator iter=attributes.begin(); iter!= attributes.end(); ++iter)\n+349 *iter = std::numeric_limits::max();\n+350\n+351 auto riEnd = neighbour->second.second->end();\n+352\n+353 for(auto index = neighbour->second.second->begin();\n+354 index != riEnd; ++index) {\n+355 if(!E::contains(index->localIndexPair().local().attribute()) &&\n+356 aggregates[index->localIndexPair().local()] !=\n+357 _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD)\n+358 {\n+359 assert(aggregates[index->localIndexPair().local()]localIndexPair().local()]] != 3)\n+361 attributes[aggregates[index->localIndexPair().local()]] = index->attribute\n+();\n+362 }\n+363 }\n+364\n+365 // Build remote index list\n+366 typedef RemoteIndexListModifier Modifier;\n+367 typedef typename RemoteIndices::RemoteIndex RemoteIndex;\n+368 typedef typename ParallelIndexSet::const_iterator IndexIterator;\n+369\n+370 Modifier coarseList = coarseRemote.template getModifier\n+(process);\n 371\n-378 template\n-_\b3_\b7_\b9 void _\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by (const T& source, T& dest) const\n-380 {\n-381 if (!OwnerCopyToOwnerCopyInterfaceBuilt)\n-382 _\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be ();\n-383 _\bB_\bC _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br;\n-384 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template build(OwnerCopyToOwnerCopyInterface);\n-385 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.template forward >(source,dest);\n-386 _\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br.free();\n-387 }\n+372 IndexIterator iend = coarseIndices.end();\n+373 for(IndexIterator index = coarseIndices.begin(); index != iend; ++index)\n+374 if(attributes[index->local()] != std::numeric_limits::max()) {\n+375 // remote index is present\n+376 coarseList.insert(RemoteIndex(Attribute(attributes[index->local()]), &\n+(*index)));\n+377 }\n+378 //std::cout< syncer(coarseIndices, coarseRemote);\n+387 syncer.sync(renumberer, useFixedOrder);\n 388\n-389\n-397 template\n-_\b3_\b9_\b8 void _\bd_\bo_\bt (const T1& x, const T1& y, T2& result) const\n-399 {\n-400 using real_type = typename FieldTraits::real_type;\n-401 // set up mask vector\n-402 if (mask.size()!=static_cast::size_type>\n-(x.size()))\n-403 {\n-404 mask.resize(x.size());\n-405 for (typename std::vector::size_type i=0; ilocal().attribute()!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br)\n-409 mask[i->local().local()] = 0;\n-410 }\n-411 result = T2(0.0);\n-412\n-413 for (typename T1::size_type i=0; i(mask[i]);\n-415 result = cc.sum(result);\n-416 }\n-417\n-424 template\n-_\b4_\b2_\b5 typename FieldTraits::real_type _\bn_\bo_\br_\bm (const T1& x)\n-const\n-426 {\n-427 using real_type = typename FieldTraits::real_type;\n-428\n-429 // set up mask vector\n-430 if (mask.size()!=static_cast::size_type>\n-(x.size()))\n-431 {\n-432 mask.resize(x.size());\n-433 for (typename std::vector::size_type i=0; ilocal().attribute()!=_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br)\n-437 mask[i->local().local()] = 0;\n-438 }\n-439 auto result = real_type(0.0);\n-440 for (typename T1::size_type i=0; i\n-_\bC_\bo_\bp_\by_\bF_\bl_\ba_\bg_\bs;\n-447\n-_\b4_\b4_\b9 typedef Dune::ParallelIndexSet _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-450\n-_\b4_\b5_\b2 typedef Dune::RemoteIndices _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs;\n-453\n-_\b4_\b5_\b6 typedef Dune::GlobalLookupIndexSet _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-457\n-_\b4_\b6_\b2 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bi_\bn_\bd_\be_\bx_\bS_\be_\bt() const\n-463 {\n-464 return pis;\n-465 }\n-466\n-_\b4_\b7_\b1 const _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& _\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs() const\n-472 {\n-473 return ri;\n-474 }\n-475\n-_\b4_\b8_\b0 _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bi_\bn_\bd_\be_\bx_\bS_\be_\bt()\n-481 {\n-482 return pis;\n-483 }\n-484\n-485\n-_\b4_\b9_\b0 _\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs& _\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs()\n-491 {\n-492 return ri;\n-493 }\n-494\n-_\b4_\b9_\b5 void _\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp()\n-496 {\n-497 if(globalLookup_) {\n-498 if(pis.seqNo()==oldseqNo)\n-499 // Nothing changed!\n-500 return;\n-501 delete globalLookup_;\n-502 }\n-503\n-504 globalLookup_ = new _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(pis);\n-505 oldseqNo = pis.seqNo();\n-506 }\n-507\n-_\b5_\b0_\b8 void _\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp(std::size_t size)\n-509 {\n-510 if(globalLookup_) {\n-511 if(pis.seqNo()==oldseqNo)\n-512 // Nothing changed!\n-513 return;\n-514 delete globalLookup_;\n-515 }\n-516 globalLookup_ = new _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt(pis, size);\n-517 oldseqNo = pis.seqNo();\n-518 }\n-519\n-_\b5_\b2_\b0 void _\bf_\br_\be_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp()\n-521 {\n-522 delete globalLookup_;\n-523 globalLookup_=0;\n-524 }\n-525\n-_\b5_\b2_\b6 const _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt& _\bg_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp() const\n-527 {\n-528 assert(globalLookup_ != 0);\n-529 return *globalLookup_;\n-530 }\n-531\n-537 template\n-_\b5_\b3_\b8 void _\bp_\br_\bo_\bj_\be_\bc_\bt (T1& x) const\n-539 {\n-540 for (typename PIS::const_iterator i=pis.begin(); i!=pis.end(); ++i)\n-541 if (i->local().attribute()==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n-542 x[i->local().local()] = 0;\n-543 }\n-544\n-_\b5_\b5_\b4 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (MPI_Comm comm_,\n-555 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by cat_ = _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg,\n-556 bool freecomm_ = false)\n-557 : comm(comm_), cc(comm_), pis(), ri(pis,pis,comm_),\n-558 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),\n-559 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt\n-(false),\n-560 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_),\n-561 freecomm(freecomm_)\n-562 {}\n-563\n-_\b5_\b7_\b2 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by cat_ =\n-_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg)\n-573 : comm(MPI_COMM_WORLD), cc(MPI_COMM_WORLD), pis(), ri\n-(pis,pis,MPI_COMM_WORLD),\n-574 OwnerToAllInterfaceBuilt(false), OwnerOverlapToAllInterfaceBuilt(false),\n-575 OwnerCopyToAllInterfaceBuilt(false), OwnerCopyToOwnerCopyInterfaceBuilt\n-(false),\n-576 CopyToAllInterfaceBuilt(false), globalLookup_(0), category_(cat_), freecomm\n-(false)\n-577 {}\n-578\n-_\b5_\b8_\b6 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (const _\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b<_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b,\n-_\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be_\b>& indexinfo,\n-587 MPI_Comm comm_,\n-588 _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by cat_ = _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg,\n-589 bool freecomm_ = false)\n-590 : comm(comm_), cc(comm_), OwnerToAllInterfaceBuilt(false),\n-591 OwnerOverlapToAllInterfaceBuilt(false), OwnerCopyToAllInterfaceBuilt\n-(false),\n-592 OwnerCopyToOwnerCopyInterfaceBuilt(false), CopyToAllInterfaceBuilt(false),\n-593 globalLookup_(0), category_(cat_), freecomm(freecomm_)\n-594 {\n-595 // set up an ISTL index set\n-596 pis.beginResize();\n-597 for (localindex_iterator i=indexinfo._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs().begin();\n-i!=indexinfo._\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs().end(); ++i)\n-598 {\n-599 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br)\n-600 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:\n-_\bo_\bw_\bn_\be_\br,true));\n-601 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp)\n-602 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:\n-_\bo_\bv_\be_\br_\bl_\ba_\bp,true));\n-603 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n-604 pis.add(std::get<0>(*i),LI(std::get<1>(*i),_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:\n-_\bc_\bo_\bp_\by,true));\n-605 // std::cout << cc.rank() << \": adding index \" << std::get<0>(*i) << \" \" <<\n-std::get<1>(*i) << \" \" << std::get<2>(*i) << std::endl;\n-606 }\n-607 pis.endResize();\n-608\n-609 // build remote indices WITHOUT communication\n-610 // std::cout << cc.rank() << \": build remote indices\" << std::endl;\n-611 ri.setIndexSets(pis,pis,cc);\n-612 if (indexinfo._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().size()>0)\n-613 {\n-614 remoteindex_iterator i=indexinfo._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().begin();\n-615 int p = std::get<0>(*i);\n-616 _\bR_\bI_\bL_\bM modifier = ri.template getModifier(p);\n-617 typename PIS::const_iterator pi=pis.begin();\n-618 for ( ; i!=indexinfo._\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs().end(); ++i)\n-619 {\n-620 // handle processor change\n-621 if (p!=std::get<0>(*i))\n-622 {\n-623 p = std::get<0>(*i);\n-624 modifier = ri.template getModifier(p);\n-625 pi=pis.begin();\n-626 }\n-627\n-628 // position to correct entry in parallel index set\n-629 while (pi->global()!=std::get<1>(*i) && pi!=pis.end())\n-630 ++pi;\n-631 if (pi==pis.end())\n-632 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"OwnerOverlapCopyCommunication: global index not in\n-index set\");\n-633\n-634 // insert entry\n-635 // std::cout << cc.rank() << \": adding remote index \" << std::get<0>(*i) <<\n-\" \" << std::get<1>(*i) << \" \" << std::get<2>(*i) << std::endl;\n-636 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br)\n-637 modifier.insert(_\bR_\bX(_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br,&(*pi)));\n-638 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp)\n-639 modifier.insert(_\bR_\bX(_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp,&(*pi)));\n-640 if (std::get<2>(*i)==_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by)\n-641 modifier.insert(_\bR_\bX(_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by,&(*pi)));\n-642 }\n-643 }else{\n-644 // Force remote indices to be synced!\n-645 ri.template getModifier(0);\n-646 }\n-647 }\n-648\n-649 // destructor: free memory in some objects\n-_\b6_\b5_\b0 _\b~_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn ()\n-651 {\n-652 ri.free();\n-653 if (OwnerToAllInterfaceBuilt) OwnerToAllInterface.free();\n-654 if (OwnerOverlapToAllInterfaceBuilt) OwnerOverlapToAllInterface.free();\n-655 if (OwnerCopyToAllInterfaceBuilt) OwnerCopyToAllInterface.free();\n-656 if (OwnerCopyToOwnerCopyInterfaceBuilt) OwnerCopyToOwnerCopyInterface.free\n-();\n-657 if (CopyToAllInterfaceBuilt) CopyToAllInterface.free();\n-658 if (globalLookup_) delete globalLookup_;\n-659 if (freecomm && (comm != MPI_COMM_NULL))\n-660 {\n-661 // If it is possible to query whether MPI_Finalize\n-662 // was called, only free the communicator before\n-663 // calling MPI_Finalize.\n-664 int wasFinalized = 0;\n-665 MPI_Finalized(&wasFinalized);\n-666 if (!wasFinalized) {\n-667 MPI_Comm_free(&comm);\n-668 }\n-669 }\n-670 }\n-671\n-672 private:\n-673 _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn (const _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn&)\n-674 {}\n-675 MPI_Comm comm;\n-676 Communication cc;\n-677 _\bP_\bI_\bS pis;\n-678 _\bR_\bI ri;\n-679 mutable _\bI_\bF OwnerToAllInterface;\n-680 mutable bool OwnerToAllInterfaceBuilt;\n-681 mutable _\bI_\bF OwnerOverlapToAllInterface;\n-682 mutable bool OwnerOverlapToAllInterfaceBuilt;\n-683 mutable _\bI_\bF OwnerCopyToAllInterface;\n-684 mutable bool OwnerCopyToAllInterfaceBuilt;\n-685 mutable _\bI_\bF OwnerCopyToOwnerCopyInterface;\n-686 mutable bool OwnerCopyToOwnerCopyInterfaceBuilt;\n-687 mutable _\bI_\bF CopyToAllInterface;\n-688 mutable bool CopyToAllInterfaceBuilt;\n-689 mutable std::vector mask;\n-690 int oldseqNo;\n-691 _\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt* globalLookup_;\n-692 const _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by category_;\n-693 bool freecomm;\n-694 };\n-695\n-696#endif\n-697\n-698\n-701} // end namespace\n-702\n-703#endif\n-_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n-_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bm_\ba_\bt_\br_\bi_\bx_\bm_\ba_\br_\bk_\be_\bt_\b._\bh_\bh\n-Provides classes for reading and writing MatrixMarket Files with an extension\n-for parallel matrices.\n-_\bt_\be_\bs_\bt_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bd\n-void testRedistributed(int s)\n+389 }\n+390\n+391#endif\n+392\n+393 template\n+394 template\n+395 typename Graph::VertexDescriptor\n+_\b3_\b9_\b6 _\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b<_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\bE_\b>_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn(\n+397 [[maybe_unused]] const _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& fineInfo,\n+398 [[maybe_unused]] Graph& fineGraph,\n+399 [[maybe_unused]] VM& visitedMap,\n+400 [[maybe_unused]] _\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b<_\bt_\by_\bp_\be_\bn_\ba_\bm_\be_\b _\bG_\br_\ba_\bp_\bh_\b:_\b:_\bV_\be_\br_\bt_\be_\bx_\bD_\be_\bs_\bc_\br_\bi_\bp_\bt_\bo_\br_\b>&\n+aggregates,\n+401 [[maybe_unused]] _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& coarseInfo,\n+402 [[maybe_unused]] typename Graph::VertexDescriptor noAggregates,\n+403 [[maybe_unused]] bool useFixedOrder)\n+404 {\n+405 return noAggregates;\n+406 }\n+407\n+408 } //namespace Amg\n+409} // namespace Dune\n+410#endif\n+_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n+Classes providing communication interfaces for overlapping Schwarz methods.\n+_\br_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b._\bh_\bh\n+_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\br_\be_\bs_\be_\bt\n+void reset()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+LocalIndex::Attribute Attribute\n+The type of the attribute.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:70\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const typename G::ConstEdgeIterator &edge)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:121\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc\n+void isPublic(bool b)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:144\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n+ParallelInformation::ParallelIndexSet ParallelIndexSet\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:55\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bi_\bs_\bP_\bu_\bb_\bl_\bi_\bc\n+bool isPublic()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:139\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::LocalIndex LocalIndex\n+The type of the local index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+T ParallelInformation\n+The type of the parallel information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+Attribute attribute()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:160\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+Vertex operator()(const GlobalIndex &global)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp_\b:_\b:_\bI_\bS_\bO_\bL_\bA_\bT_\bE_\bD\n+static const V ISOLATED\n+Identifier of isolated vertices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:571\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+ParallelIndexSet::GlobalIndex GlobalIndex\n+The type of the global index.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:60\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\ba_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be\n+void attribute(const Attribute &attribute)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bE_\bx_\bc_\bl_\bu_\bd_\be_\bd_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bs\n+E ExcludedAttributes\n+The set of excluded attributes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+void globalIndex(const GlobalIndex &global)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:170\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n+Dune::RemoteIndices< ParallelIndexSet > RemoteIndices\n+The type of the remote indices.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bn\n+static Graph::VertexDescriptor coarsen(ParallelInformation &fineInfo, Graph\n+&fineGraph, VM &visitedMap, AggregatesMap< typename Graph::VertexDescriptor >\n+&aggregates, ParallelInformation &coarseInfo, typename Graph::VertexDescriptor\n+noAggregates, bool useFixedOrder=false)\n+Build the coarse index set after the aggregatio.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:236\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n+ParallelAggregateRenumberer(AggregatesMap< Vertex > &aggregates, const I\n+&lookup)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:115\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n+const GlobalIndex & globalIndex() const\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:165\n+_\bs_\bt_\bd\n+STL namespace.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-derive error class from the base class in common\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt\n-Attribute set for overlapping Schwarz.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:59\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt\n-AttributeSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:60\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bw_\bn_\be_\br\n-@ owner\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bc_\bo_\bp_\by\n-@ copy\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bA_\bt_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\be_\bt_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp\n-@ overlap\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:61\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd\n-Information about the index distribution.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:78\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl\n-std::tuple< GlobalIdType, LocalIdType, int > IndexTripel\n-A triple describing a local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:92\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\ba_\bd_\bd_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx\n-void addRemoteIndex(const RemoteIndexTripel &x)\n-Add a new remote index triple to the set of remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:120\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be\n-G GlobalIdType\n-The type of the global index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:81\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bl_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-const std::set< IndexTripel > & localIndices() const\n-Get the set of indices local to the process.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:133\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-const std::set< RemoteIndexTripel > & remoteIndices() const\n-Get the set of remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:142\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bL_\bo_\bc_\ba_\bl_\bI_\bd_\bT_\by_\bp_\be\n-L LocalIdType\n-The type of the local index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:84\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bc_\bl_\be_\ba_\br\n-void clear()\n-Remove all indices from the sets.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\ba_\bd_\bd_\bL_\bo_\bc_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-void addLocalIndex(const IndexTripel &x)\n-Add a new index triple to the set of local indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bd_\be_\bx_\bI_\bn_\bf_\bo_\bF_\br_\bo_\bm_\bG_\br_\bi_\bd_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\be_\bx_\bT_\br_\bi_\bp_\be_\bl\n-std::tuple< int, GlobalIdType, int > RemoteIndexTripel\n-A triple describing a remote index.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:99\n+_\bD_\bu_\bn_\be_\b:_\b:_\bg_\be_\bt\n+PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::\n+VertexProperties, EP, VM, EM > >::Type get(const Amg::VertexVisitedTag &tag,\n+Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > &graph)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn dependency.hh:293\n _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n A class setting up standard communication for a two-valued attribute set with\n owner/overlap/copy sema...\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bS_\be_\bt\n-EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopySet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:195\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n-const GlobalLookupIndexSet & globalLookup() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:526\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bn_\bo_\br_\bm\n-FieldTraits< typenameT1::field_type >::real_type norm(const T1 &x) const\n-Compute the global Euclidean norm of a vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:425\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-void buildOwnerOverlapToAllInterface() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:233\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\bI_\bS\n-Dune::ParallelIndexSet< GlobalIdType, LI, 512 > PIS\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-void buildOwnerCopyToAllInterface() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:254\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-void buildOwnerCopyToOwnerCopyInterface() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:266\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-OwnerOverlapCopyCommunication(const IndexInfoFromGrid< GlobalIdType,\n-LocalIdType > &indexinfo, MPI_Comm comm_, SolverCategory::Category\n-cat_=SolverCategory::overlapping, bool freecomm_=false)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:586\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-SolverCategory::Category category() const\n-Get Solver Category.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:295\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by\n-void addOwnerCopyToOwnerCopy(const T &source, T &dest) const\n-Communicate values from owner and copy data points to owner and copy data\n-points and add them to thos...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:379\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-void buildCopyToAllInterface() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:279\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bF_\bl_\ba_\bg_\bs\n-Dune::EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::copy > CopyFlags\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:446\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-RemoteIndices & remoteIndices()\n-Get the underlying remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:490\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bn_\bd_\be_\bx_\bS_\be_\bt\n-const ParallelIndexSet & indexSet() const\n-Get the underlying parallel index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:462\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bR_\bI\n-Dune::RemoteIndices< PIS > RI\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:189\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n-void buildGlobalLookup(std::size_t size)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:508\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bT_\bo_\bA_\bl_\bl\n-void addOwnerOverlapToAll(const T &source, T &dest) const\n-Communicate values from owner data points to all other data points and add them\n-to those values.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:345\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bR_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-Dune::RemoteIndices< PIS > RemoteIndices\n-The type of the remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:452\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bp_\br_\bo_\bj_\be_\bc_\bt\n-void project(T1 &x) const\n-Set vector to zero at copy dofs.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:538\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bl_\bl_\bS_\be_\bt\n-Dune::AllSet< AttributeSet > AllSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:197\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bS_\be_\bt\n-Combine< EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner >,\n-EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::overlap >, AttributeSet >\n-OwnerOverlapSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:196\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl\n-void copyCopyToAll(const T &source, T &dest) const\n-Communicate values from copy data points to all other data points.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:328\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Dune::GlobalLookupIndexSet< ParallelIndexSet > GlobalLookupIndexSet\n-The type of the reverse lookup of indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:456\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bI_\bF\n-Dune::Interface IF\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:193\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\b~_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-~OwnerOverlapCopyCommunication()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:650\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n-void buildGlobalLookup()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:495\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bB_\bC\n-Dune::BufferedCommunicator BC\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:192\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-OwnerOverlapCopyCommunication(MPI_Comm comm_, SolverCategory::Category\n-cat_=SolverCategory::overlapping, bool freecomm_=false)\n-Construct the communication without any indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:554\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bn_\bd_\be_\bx_\bS_\be_\bt\n-ParallelIndexSet & indexSet()\n-Get the underlying parallel index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:480\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bd_\bo_\bt\n-void dot(const T1 &x, const T1 &y, T2 &result) const\n-Compute a global dot product of two vectors.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:398\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bo_\br\n-const Communication< MPI_Comm > & communicator() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:299\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-OwnerOverlapCopyCommunication(SolverCategory::Category cat_=SolverCategory::\n-overlapping)\n-Construct the communication without any indices using MPI_COMM_WORLD.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:572\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n-EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:194\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bp_\by_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl\n-void copyOwnerToAll(const T &source, T &dest) const\n-Communicate values from owner data points to all other data points.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:311\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bm_\bo_\bt_\be_\bI_\bn_\bd_\bi_\bc_\be_\bs\n-const RemoteIndices & remoteIndices() const\n-Get the underlying remote indices.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:471\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bl_\bo_\ba_\bd_\bM_\ba_\bt_\br_\bi_\bx_\bM_\ba_\br_\bk_\be_\bt\n-friend void loadMatrixMarket(M &, const std::string &,\n-OwnerOverlapCopyCommunication< G, L > &, bool)\n-Load a parallel matrix/vector stored in matrix market format.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmarket.hh:1269\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bR_\bX\n-RI::RemoteIndex RX\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:191\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\ba_\bd_\bd_\bO_\bw_\bn_\be_\br_\bC_\bo_\bp_\by_\bT_\bo_\bA_\bl_\bl\n-void addOwnerCopyToAll(const T &source, T &dest) const\n-Communicate values from owner and copy data points to all other data points and\n-add them to those val...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:362\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bf_\br_\be_\be_\bG_\bl_\bo_\bb_\ba_\bl_\bL_\bo_\bo_\bk_\bu_\bp\n-void freeGlobalLookup()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:520\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bR_\bI_\bL_\bM\n-Dune::RemoteIndexListModifier< PIS, typename RI::Allocator, false > RILM\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:190\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Dune::ParallelIndexSet< GlobalIdType, LI, 512 > ParallelIndexSet\n-The type of the parallel index set.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:449\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bb_\bu_\bi_\bl_\bd_\bO_\bw_\bn_\be_\br_\bT_\bo_\bA_\bl_\bl_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-void buildOwnerToAllInterface() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:244\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-gather/scatter callback for communication\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:204\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n-static V gather(const T &a, std::size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:207\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n-static void scatter(T &a, V v, std::size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:212\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bC_\bo_\bp_\by_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bV\n-CommPolicy< T >::IndexedType V\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:205\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bV\n-CommPolicy< T >::IndexedType V\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:220\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n-static V gather(const T &a, std::size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:222\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bA_\bd_\bd_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n-static void scatter(T &a, V v, std::size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:227\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n-@ overlapping\n-Category for overlapping solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:29\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bs_\bM_\ba_\bp\n+Class providing information about the mapping of the vertices onto aggregates.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn aggregates.hh:560\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bd_\bi_\bc_\be_\bs_\bC_\bo_\ba_\br_\bs_\be_\bn_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn indicescoarsener.hh:43\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:16\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b+_\b+\n+void operator++()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:57\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+void operator()(const typename G::ConstEdgeIterator &edge)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:51\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bg_\bg_\br_\be_\bg_\ba_\bt_\be_\bR_\be_\bn_\bu_\bm_\bb_\be_\br_\be_\br_\b:_\b:_\bn_\bu_\bm_\bb_\be_\br_\b_\n+Vertex number_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn renumberer.hh:35\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00218.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00218.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: bvector.hh File Reference\n+dune-istl: kamg.hh File Reference\n \n \n \n \n \n \n \n@@ -65,71 +65,51 @@\n \n \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n \n-
    bvector.hh File Reference
    \n+Namespaces
    \n+ \n \n
    \n \n-

    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. \n+

    Provides an algebraic multigrid using a Krylov cycle. \n More...

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

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n-\n+\n+\n \n

    \n Classes

    class  Dune::BlockVector< B, A >
     A vector of blocks with memory management. More...
    class  Dune::Amg::KAmgTwoGrid< AMG >
     Two grid operator for AMG with Krylov cycle. More...
     
    struct  Dune::FieldTraits< BlockVector< B, A > >
    class  Dune::Amg::KAMG< M, X, S, PI, K, A >
     an algebraic multigrid method using a Krylov-cycle. More...
     
    \n \n \n \n-

    \n Namespaces

    namespace  Dune
     
    \n-\n-\n-\n-\n-\n+\n+\n

    \n-Functions

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

    Detailed Description

    \n-

    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.

    \n+

    Provides an algebraic multigrid using a Krylov cycle.

    \n+
    Author
    Markus Blatt
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,49 +1,33 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-bvector.hh File Reference\n-This file implements a vector space as a tensor product of a given vector\n-space. The number of components can be given at run-time. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n-#include \"_\bb_\ba_\bs_\be_\ba_\br_\br_\ba_\by_\b._\bh_\bh\"\n-#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+ * _\bp_\ba_\ba_\bm_\bg\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n+kamg.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs \u00bb _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs\n+\u00bb _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\b _\bA_\bl_\bg_\be_\bb_\br_\ba_\bi_\bc_\b _\bM_\bu_\bl_\bt_\bi_\bg_\br_\bi_\bd\n+Provides an algebraic multigrid using a Krylov cycle. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n+#include \"_\ba_\bm_\bg_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>\n-\u00a0 A vector of blocks with memory management. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\b _\bA_\bM_\bG_\b _\b>\n+\u00a0 Two grid operator for _\bA_\bM_\bG with Krylov cycle. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b<_\b _\bM_\b,_\b _\bX_\b,_\b _\bS_\b,_\b _\bP_\bI_\b,_\b _\bK_\b,_\b _\bA_\b _\b>\n+\u00a0 an algebraic multigrid method using a Krylov-cycle. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-std::ostream &\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b< (std::ostream &s, const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br< K, A >\n- &v)\n-\u00a0 Send _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br to an output stream.\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg\n \u00a0\n *\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-This file implements a vector space as a tensor product of a given vector\n-space. The number of components can be given at run-time.\n+Provides an algebraic multigrid using a Krylov cycle.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00218_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00218_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: bvector.hh Source File\n+dune-istl: kamg.hh Source File\n \n \n \n \n \n \n \n@@ -70,949 +70,336 @@\n
    \n
    \n \n \n \n
    \n \n+
  • dune
  • istl
  • paamg
  • \n
    \n \n
    \n-
    bvector.hh
    \n+
    kamg.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5
    \n-
    6#ifndef DUNE_ISTL_BVECTOR_HH
    \n-
    7#define DUNE_ISTL_BVECTOR_HH
    \n-
    8
    \n-
    9#include <algorithm>
    \n-
    10#include <cmath>
    \n-
    11#include <complex>
    \n-
    12#include <initializer_list>
    \n-
    13#include <limits>
    \n-
    14#include <memory>
    \n-
    15#include <utility>
    \n-
    16#include <vector>
    \n-
    17
    \n-
    18#include <dune/common/dotproduct.hh>
    \n-
    19#include <dune/common/ftraits.hh>
    \n-
    20#include <dune/common/fmatrix.hh>
    \n-
    21#include <dune/common/fvector.hh>
    \n-
    22#include <dune/common/promotiontraits.hh>
    \n-
    23#include <dune/common/typetraits.hh>
    \n-
    24#include <dune/common/scalarvectorview.hh>
    \n-
    25
    \n-\n-
    27
    \n-
    28#include "basearray.hh"
    \n-
    29#include "istlexception.hh"
    \n-
    30
    \n-
    38namespace Dune {
    \n+
    5#ifndef DUNE_AMG_KAMG_HH
    \n+
    6#define DUNE_AMG_KAMG_HH
    \n+
    7
    \n+\n+
    9#include "amg.hh"
    \n+
    10
    \n+
    11namespace Dune
    \n+
    12{
    \n+
    13 namespace Amg
    \n+
    14 {
    \n+
    15
    \n+
    30 template<class AMG>
    \n+
    \n+\n+
    32 : public Preconditioner<typename AMG::Domain,typename AMG::Range>
    \n+
    33 {
    \n+
    35 typedef typename AMG::Domain Domain;
    \n+
    37 typedef typename AMG::Range Range;
    \n+
    38 public:
    \n
    39
    \n-
    41namespace Imp {
    \n-
    42
    \n-
    48 template <class B, bool isNumber>
    \n-
    49 class BlockTraitsImp;
    \n-
    50
    \n-
    51 template <class B>
    \n-
    52 class BlockTraitsImp<B,true>
    \n-
    53 {
    \n-
    54 public:
    \n-
    55 using field_type = B;
    \n-
    56 };
    \n-
    57
    \n-
    58 template <class B>
    \n-
    59 class BlockTraitsImp<B,false>
    \n-
    60 {
    \n-
    61 public:
    \n-
    62 using field_type = typename B::field_type;
    \n-
    63 };
    \n+
    \n+\n+
    42 {
    \n+
    43 return amg_.category();
    \n+
    44 };
    \n+
    \n+
    45
    \n+
    \n+\n+
    54 : amg_(amg), coarseSolver_(coarseSolver)
    \n+
    55 {}
    \n+
    \n+
    56
    \n+
    \n+
    58 void pre([[maybe_unused]] typename AMG::Domain& x, [[maybe_unused]] typename AMG::Range& b)
    \n+
    59 {}
    \n+
    \n+
    60
    \n+
    \n+
    62 void post([[maybe_unused]] typename AMG::Domain& x)
    \n+
    63 {}
    \n+
    \n
    64
    \n-
    67 template <class B>
    \n-
    68 using BlockTraits = BlockTraitsImp<B,IsNumber<B>::value>;
    \n-
    69
    \n-
    83 template<class B, class ST=std::size_t >
    \n-
    84 class block_vector_unmanaged : public base_array_unmanaged<B,ST>
    \n-
    85 {
    \n-
    86 public:
    \n-
    87
    \n-
    88 //===== type definitions and constants
    \n-
    89 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n+
    \n+
    66 void apply(typename AMG::Domain& v, const typename AMG::Range& d)
    \n+
    67 {
    \n+
    68 // Copy data
    \n+
    69 *levelContext_->update=0;
    \n+
    70 *levelContext_->rhs = d;
    \n+
    71 *levelContext_->lhs = v;
    \n+
    72
    \n+
    73 presmooth(*levelContext_, amg_.preSteps_);
    \n+
    74 bool processFineLevel =
    \n+
    75 amg_.moveToCoarseLevel(*levelContext_);
    \n+
    76
    \n+
    77 if(processFineLevel) {
    \n+
    78 typename AMG::Range b=*levelContext_->rhs;
    \n+
    79 typename AMG::Domain x=*levelContext_->update;
    \n+\n+
    81 coarseSolver_->apply(x, b, res);
    \n+
    82 *levelContext_->update=x;
    \n+
    83 }
    \n+
    84
    \n+
    85 amg_.moveToFineLevel(*levelContext_, processFineLevel);
    \n+
    86
    \n+
    87 postsmooth(*levelContext_, amg_.postSteps_);
    \n+
    88 v=*levelContext_->update;
    \n+
    89 }
    \n+
    \n
    90
    \n-
    92 typedef B block_type;
    \n-
    93
    \n-
    95 typedef ST size_type;
    \n-
    96
    \n-
    98 typedef typename base_array_unmanaged<B,ST>::iterator Iterator;
    \n+
    \n+\n+
    96 {
    \n+
    97 return coarseSolver_;
    \n+
    98 }
    \n+
    \n
    99
    \n-
    101 typedef typename base_array_unmanaged<B,ST>::const_iterator ConstIterator;
    \n-
    102
    \n-
    104 typedef B value_type;
    \n-
    105
    \n-
    107 typedef B& reference;
    \n+
    \n+
    104 void setLevelContext(std::shared_ptr<typename AMG::LevelContext> p)
    \n+
    105 {
    \n+
    106 levelContext_=p;
    \n+
    107 }
    \n+
    \n
    108
    \n-
    110 typedef const B& const_reference;
    \n-
    111
    \n-
    112 //===== assignment from scalar
    \n-
    114
    \n-
    115 block_vector_unmanaged& operator= (const field_type& k)
    \n-
    116 {
    \n-
    117 for (size_type i=0; i<this->n; i++)
    \n-
    118 (*this)[i] = k;
    \n-
    119 return *this;
    \n-
    120 }
    \n+
    \n+\n+
    111 {}
    \n+
    \n+
    112
    \n+
    113 private:
    \n+
    115 AMG& amg_;
    \n+
    117 std::shared_ptr<InverseOperator<Domain,Range> > coarseSolver_;
    \n+
    119 std::shared_ptr<typename AMG::LevelContext> levelContext_;
    \n+
    120 };
    \n+
    \n
    121
    \n-
    122 //===== vector space arithmetic
    \n-
    124 block_vector_unmanaged& operator+= (const block_vector_unmanaged& y)
    \n-
    125 {
    \n-
    126#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    127 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n-
    128#endif
    \n-
    129 for (size_type i=0; i<this->n; ++i) (*this)[i] += y[i];
    \n-
    130 return *this;
    \n-
    131 }
    \n-
    132
    \n-
    134 block_vector_unmanaged& operator-= (const block_vector_unmanaged& y)
    \n-
    135 {
    \n-
    136#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    137 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n-
    138#endif
    \n-
    139 for (size_type i=0; i<this->n; ++i) (*this)[i] -= y[i];
    \n-
    140 return *this;
    \n-
    141 }
    \n-
    142
    \n-
    144 block_vector_unmanaged& operator*= (const field_type& k)
    \n-
    145 {
    \n-
    146 for (size_type i=0; i<this->n; ++i) (*this)[i] *= k;
    \n-
    147 return *this;
    \n-
    148 }
    \n-
    149
    \n-
    151 block_vector_unmanaged& operator/= (const field_type& k)
    \n-
    152 {
    \n-
    153 for (size_type i=0; i<this->n; ++i) (*this)[i] /= k;
    \n-
    154 return *this;
    \n-
    155 }
    \n-
    156
    \n-
    158 block_vector_unmanaged& axpy (const field_type& a, const block_vector_unmanaged& y)
    \n-
    159 {
    \n-
    160#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    161 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n-
    162#endif
    \n-
    163 for (size_type i=0; i<this->n; ++i)
    \n-
    164 Impl::asVector((*this)[i]).axpy(a,Impl::asVector(y[i]));
    \n-
    165
    \n-
    166 return *this;
    \n-
    167 }
    \n-
    168
    \n-
    169
    \n-
    177 template<class OtherB, class OtherST>
    \n-
    178 auto operator* (const block_vector_unmanaged<OtherB,OtherST>& y) const
    \n-
    179 {
    \n-
    180 typedef typename PromotionTraits<field_type,typename BlockTraits<OtherB>::field_type>::PromotedType PromotedType;
    \n-
    181 PromotedType sum(0);
    \n-
    182#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    183 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n-
    184#endif
    \n-
    185 for (size_type i=0; i<this->n; ++i) {
    \n-
    186 sum += PromotedType(((*this)[i])*y[i]);
    \n-
    187 }
    \n-
    188 return sum;
    \n-
    189 }
    \n-
    190
    \n-
    198 template<class OtherB, class OtherST>
    \n-
    199 auto dot(const block_vector_unmanaged<OtherB,OtherST>& y) const
    \n-
    200 {
    \n-
    201 typedef typename PromotionTraits<field_type,typename BlockTraits<OtherB>::field_type>::PromotedType PromotedType;
    \n-
    202 PromotedType sum(0);
    \n-
    203#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    204 if (this->n!=y.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n-
    205#endif
    \n-
    206
    \n-
    207 for (size_type i=0; i<this->n; ++i)
    \n-
    208 sum += Impl::asVector((*this)[i]).dot(Impl::asVector(y[i]));
    \n-
    209
    \n-
    210 return sum;
    \n-
    211 }
    \n-
    212
    \n-
    213 //===== norms
    \n-
    214
    \n-
    216 typename FieldTraits<field_type>::real_type one_norm () const
    \n-
    217 {
    \n-
    218 typename FieldTraits<field_type>::real_type sum=0;
    \n-
    219 for (size_type i=0; i<this->n; ++i)
    \n-
    220 sum += Impl::asVector((*this)[i]).one_norm();
    \n-
    221 return sum;
    \n-
    222 }
    \n+
    122
    \n+
    123
    \n+
    137 template<class M, class X, class S, class PI=SequentialInformation,
    \n+
    138 class K=GeneralizedPCGSolver<X>, class A=std::allocator<X> >
    \n+
    \n+
    139 class KAMG : public Preconditioner<X,X>
    \n+
    140 {
    \n+
    141 public:
    \n+\n+
    145 typedef K KrylovSolver;
    \n+\n+\n+\n+\n+
    155 typedef typename Amg::Operator Operator;
    \n+
    157 typedef typename Amg::Domain Domain;
    \n+
    159 typedef typename Amg::Range Range;
    \n+\n+\n+
    164
    \n+
    \n+\n+
    167 {
    \n+
    168 return amg.category();
    \n+
    169 };
    \n+
    \n+
    170
    \n+
    182 KAMG(OperatorHierarchy& matrices, CoarseSolver& coarseSolver,
    \n+
    183 const SmootherArgs& smootherArgs, const Parameters& parms,
    \n+
    184 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1);
    \n+
    185
    \n+
    199 template<class C>
    \n+
    200 KAMG(const Operator& fineOperator, const C& criterion,
    \n+
    201 const SmootherArgs& smootherArgs=SmootherArgs(),
    \n+
    202 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1,
    \n+\n+
    204
    \n+
    206 void pre(Domain& x, Range& b);
    \n+
    208 void post(Domain& x);
    \n+
    210 void apply(Domain& v, const Range& d);
    \n+
    211
    \n+
    212 std::size_t maxlevels();
    \n+
    213
    \n+
    214 private:
    \n+
    216 Amg amg;
    \n+
    217
    \n+
    219 std::size_t maxLevelKrylovSteps;
    \n+
    220
    \n+
    222 double levelDefectReduction;
    \n
    223
    \n-
    225 typename FieldTraits<field_type>::real_type one_norm_real () const
    \n-
    226 {
    \n-
    227 typename FieldTraits<field_type>::real_type sum=0;
    \n-
    228 for (size_type i=0; i<this->n; ++i)
    \n-
    229 sum += Impl::asVector((*this)[i]).one_norm_real();
    \n-
    230 return sum;
    \n-
    231 }
    \n-
    232
    \n-
    234 typename FieldTraits<field_type>::real_type two_norm () const
    \n-
    235 {
    \n-
    236 using std::sqrt;
    \n-
    237 return sqrt(two_norm2());
    \n-
    238 }
    \n+
    225 std::vector<std::shared_ptr<typename Amg::ScalarProduct> > scalarproducts;
    \n+
    226
    \n+
    228 std::vector<std::shared_ptr<KAmgTwoGrid<Amg> > > ksolvers;
    \n+
    229 };
    \n+
    \n+
    230
    \n+
    231
    \n+
    232 template<class M, class X, class S, class P, class K, class A>
    \n+
    \n+\n+
    234 const SmootherArgs& smootherArgs, const Parameters& params,
    \n+
    235 std::size_t ksteps, double reduction)
    \n+
    236 : amg(matrices, coarseSolver, smootherArgs, params),
    \n+
    237 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
    \n+
    238 {}
    \n+
    \n
    239
    \n-
    241 typename FieldTraits<field_type>::real_type two_norm2 () const
    \n-
    242 {
    \n-
    243 typename FieldTraits<field_type>::real_type sum=0;
    \n-
    244 for (size_type i=0; i<this->n; ++i)
    \n-
    245 sum += Impl::asVector((*this)[i]).two_norm2();
    \n-
    246 return sum;
    \n-
    247 }
    \n-
    248
    \n-
    250 template <typename ft = field_type,
    \n-
    251 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n-
    252 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n-
    253 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    254 using std::max;
    \n-
    255
    \n-
    256 real_type norm = 0;
    \n-
    257 for (auto const &xi : *this) {
    \n-
    258 real_type const a = Impl::asVector(xi).infinity_norm();
    \n-
    259 norm = max(a, norm);
    \n-
    260 }
    \n-
    261 return norm;
    \n-
    262 }
    \n-
    263
    \n-
    265 template <typename ft = field_type,
    \n-
    266 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n-
    267 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n-
    268 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    269 using std::max;
    \n-
    270
    \n-
    271 real_type norm = 0;
    \n-
    272 for (auto const &xi : *this) {
    \n-
    273 real_type const a = Impl::asVector(xi).infinity_norm_real();
    \n-
    274 norm = max(a, norm);
    \n-
    275 }
    \n-
    276 return norm;
    \n-
    277 }
    \n-
    278
    \n-
    280 template <typename ft = field_type,
    \n-
    281 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n-
    282 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n-
    283 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    284 using std::max;
    \n-
    285 using std::abs;
    \n-
    286
    \n-
    287 real_type norm = 0;
    \n-
    288 real_type isNaN = 1;
    \n-
    289
    \n-
    290 for (auto const &xi : *this) {
    \n-
    291 real_type const a = Impl::asVector(xi).infinity_norm();
    \n-
    292 norm = max(a, norm);
    \n-
    293 isNaN += a;
    \n-
    294 }
    \n-
    295 return norm * (isNaN / isNaN);
    \n-
    296 }
    \n-
    297
    \n-
    299 template <typename ft = field_type,
    \n-
    300 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n-
    301 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n-
    302 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    303 using std::max;
    \n-
    304
    \n-
    305 real_type norm = 0;
    \n-
    306 real_type isNaN = 1;
    \n-
    307
    \n-
    308 for (auto const &xi : *this) {
    \n-
    309 real_type const a = Impl::asVector(xi).infinity_norm_real();
    \n-
    310 norm = max(a, norm);
    \n-
    311 isNaN += a;
    \n-
    312 }
    \n-
    313
    \n-
    314 return norm * (isNaN / isNaN);
    \n-
    315 }
    \n-
    316
    \n-
    317 //===== sizes
    \n+
    240
    \n+
    241 template<class M, class X, class S, class P, class K, class A>
    \n+
    242 template<class C>
    \n+
    \n+
    243 KAMG<M,X,S,P,K,A>::KAMG(const Operator& fineOperator, const C& criterion,
    \n+
    244 const SmootherArgs& smootherArgs,
    \n+
    245 std::size_t ksteps, double reduction,
    \n+
    246 const ParallelInformation& pinfo)
    \n+
    247 : amg(fineOperator, criterion, smootherArgs, pinfo),
    \n+
    248 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)
    \n+
    249 {}
    \n+
    \n+
    250
    \n+
    251
    \n+
    252 template<class M, class X, class S, class P, class K, class A>
    \n+
    \n+\n+
    254 {
    \n+
    255 amg.pre(x,b);
    \n+
    256 scalarproducts.reserve(amg.levels());
    \n+
    257 ksolvers.reserve(amg.levels());
    \n+
    258
    \n+
    259 typename OperatorHierarchy::ParallelMatrixHierarchy::Iterator
    \n+
    260 matrix = amg.matrices_->matrices().coarsest();
    \n+\n+
    262 pinfo = amg.matrices_->parallelInformation().coarsest();
    \n+
    263 bool hasCoarsest=(amg.levels()==amg.maxlevels());
    \n+
    264
    \n+
    265 if(hasCoarsest) {
    \n+
    266 if(matrix==amg.matrices_->matrices().finest())
    \n+
    267 return;
    \n+
    268 --matrix;
    \n+
    269 --pinfo;
    \n+
    270 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, amg.solver_)));
    \n+
    271 }else
    \n+
    272 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, std::shared_ptr<InverseOperator<Domain,Range> >())));
    \n+
    273
    \n+
    274 std::ostringstream s;
    \n+
    275
    \n+
    276 if(matrix!=amg.matrices_->matrices().finest())
    \n+
    277 while(true) {
    \n+
    278 scalarproducts.push_back(createScalarProduct<X>(*pinfo,category()));
    \n+
    279 std::shared_ptr<InverseOperator<Domain,Range> > ks =
    \n+
    280 std::shared_ptr<InverseOperator<Domain,Range> >(new KrylovSolver(*matrix, *(scalarproducts.back()),
    \n+
    281 *(ksolvers.back()), levelDefectReduction,
    \n+
    282 maxLevelKrylovSteps, 0));
    \n+
    283 ksolvers.push_back(std::shared_ptr<KAmgTwoGrid<Amg> >(new KAmgTwoGrid<Amg>(amg, ks)));
    \n+
    284 --matrix;
    \n+
    285 --pinfo;
    \n+
    286 if(matrix==amg.matrices_->matrices().finest())
    \n+
    287 break;
    \n+
    288 }
    \n+
    289 }
    \n+
    \n+
    290
    \n+
    291
    \n+
    292 template<class M, class X, class S, class P, class K, class A>
    \n+
    \n+\n+
    294 {
    \n+
    295 amg.post(x);
    \n+
    296
    \n+
    297 }
    \n+
    \n+
    298
    \n+
    299 template<class M, class X, class S, class P, class K, class A>
    \n+
    \n+\n+
    301 {
    \n+
    302 if(ksolvers.size()==0)
    \n+
    303 {
    \n+
    304 Range td=d;
    \n+\n+
    306 amg.solver_->apply(v,td,res);
    \n+
    307 }else
    \n+
    308 {
    \n+
    309 typedef typename Amg::LevelContext LevelContext;
    \n+
    310 std::shared_ptr<LevelContext> levelContext(new LevelContext);
    \n+
    311 amg.initIteratorsWithFineLevel(*levelContext);
    \n+
    312 typedef typename std::vector<std::shared_ptr<KAmgTwoGrid<Amg> > >::iterator Iter;
    \n+
    313 for(Iter solver=ksolvers.begin(); solver!=ksolvers.end(); ++solver)
    \n+
    314 (*solver)->setLevelContext(levelContext);
    \n+
    315 ksolvers.back()->apply(v,d);
    \n+
    316 }
    \n+
    317 }
    \n+
    \n
    318
    \n-
    320 size_type N () const
    \n-
    321 {
    \n-
    322 return this->n;
    \n+
    319 template<class M, class X, class S, class P, class K, class A>
    \n+
    \n+\n+
    321 {
    \n+
    322 return amg.maxlevels();
    \n
    323 }
    \n+
    \n
    324
    \n-
    326 size_type dim () const
    \n-
    327 {
    \n-
    328 size_type d=0;
    \n-
    329
    \n-
    330 for (size_type i=0; i<this->n; i++)
    \n-
    331 d += Impl::asVector((*this)[i]).dim();
    \n-
    332
    \n-
    333 return d;
    \n-
    334 }
    \n-
    335
    \n-
    336 protected:
    \n-
    338 block_vector_unmanaged () : base_array_unmanaged<B,ST>()
    \n-
    339 { }
    \n-
    340 };
    \n-
    341
    \n-
    343
    \n-
    348 template<class F>
    \n-
    349 class ScopeGuard {
    \n-
    350 F cleanupFunc_;
    \n-
    351 public:
    \n-
    352 ScopeGuard(F cleanupFunc) : cleanupFunc_(std::move(cleanupFunc)) {}
    \n-
    353 ScopeGuard(const ScopeGuard &) = delete;
    \n-
    354 ScopeGuard(ScopeGuard &&) = delete;
    \n-
    355 ScopeGuard &operator=(ScopeGuard) = delete;
    \n-
    356 ~ScopeGuard() { cleanupFunc_(); }
    \n-
    357 };
    \n-
    358
    \n-
    360
    \n-
    369 template<class F>
    \n-
    370 ScopeGuard<F> makeScopeGuard(F cleanupFunc)
    \n-
    371 {
    \n-
    372 return { std::move(cleanupFunc) };
    \n-
    373 }
    \n-
    374
    \n-
    375} // end namespace Imp
    \n-
    390 template<class B, class A=std::allocator<B> >
    \n-
    \n-
    391 class BlockVector : public Imp::block_vector_unmanaged<B,typename A::size_type>
    \n-
    392 {
    \n-
    393 public:
    \n-
    394
    \n-
    395 //===== type definitions and constants
    \n-
    396
    \n-
    398 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n-
    399
    \n-
    401 typedef B block_type;
    \n-
    402
    \n-
    404 typedef A allocator_type;
    \n-
    405
    \n-
    407 typedef typename A::size_type size_type;
    \n-
    408
    \n-
    410 typedef typename Imp::block_vector_unmanaged<B,size_type>::Iterator Iterator;
    \n-
    411
    \n-
    413 typedef typename Imp::block_vector_unmanaged<B,size_type>::ConstIterator ConstIterator;
    \n-
    414
    \n-
    415 //===== constructors and such
    \n-
    416
    \n-
    \n-\n-
    419 {
    \n-
    420 syncBaseArray();
    \n-
    421 }
    \n-
    \n-
    422
    \n-
    \n-
    424 explicit BlockVector (size_type _n) : storage_(_n)
    \n-
    425 {
    \n-
    426 syncBaseArray();
    \n-
    427 }
    \n-
    \n-
    428
    \n-
    \n-
    430 BlockVector (std::initializer_list<B> const &l) : storage_(l)
    \n-
    431 {
    \n-
    432 syncBaseArray();
    \n-
    433 }
    \n-
    \n-
    434
    \n-
    435
    \n-
    447 template<typename S>
    \n-
    \n-
    448 BlockVector (size_type _n, S _capacity)
    \n-
    449 {
    \n-
    450 static_assert(std::numeric_limits<S>::is_integer,
    \n-
    451 "capacity must be an unsigned integral type (be aware, that this constructor does not set the default value!)" );
    \n-
    452 if((size_type)_capacity > _n)
    \n-
    453 storage_.reserve(_capacity);
    \n-
    454 storage_.resize(_n);
    \n-
    455 syncBaseArray();
    \n-
    456 }
    \n-
    \n-
    457
    \n-
    458
    \n-
    \n-\n-
    469 {
    \n-
    470 [[maybe_unused]] const auto &guard =
    \n-
    471 Imp::makeScopeGuard([this]{ syncBaseArray(); });
    \n-
    472 storage_.reserve(capacity);
    \n-
    473 }
    \n-
    \n-
    474
    \n-
    \n-\n-
    482 {
    \n-
    483 return storage_.capacity();
    \n-
    484 }
    \n-
    \n-
    485
    \n-
    \n-
    496 void resize(size_type size)
    \n-
    497 {
    \n-
    498 [[maybe_unused]] const auto &guard =
    \n-
    499 Imp::makeScopeGuard([this]{ syncBaseArray(); });
    \n-
    500 storage_.resize(size);
    \n-
    501 }
    \n-
    \n-
    502
    \n-
    \n-\n-
    505 noexcept(noexcept(std::declval<BlockVector>().storage_ = a.storage_))
    \n-
    506 {
    \n-
    507 storage_ = a.storage_;
    \n-
    508 syncBaseArray();
    \n-
    509 }
    \n-
    \n-
    510
    \n-
    \n-\n-
    513 noexcept(noexcept(std::declval<BlockVector>().swap(a)))
    \n-
    514 {
    \n-
    515 swap(a);
    \n-
    516 }
    \n-
    \n-
    517
    \n-
    \n-\n-
    520 noexcept(noexcept(std::declval<BlockVector>().storage_ = a.storage_))
    \n-
    521 {
    \n-
    522 [[maybe_unused]] const auto &guard =
    \n-
    523 Imp::makeScopeGuard([this]{ syncBaseArray(); });
    \n-
    524 storage_ = a.storage_;
    \n-
    525 return *this;
    \n-
    526 }
    \n-
    \n-
    527
    \n-
    \n-\n-
    530 noexcept(noexcept(std::declval<BlockVector>().swap(a)))
    \n-
    531 {
    \n-
    532 swap(a);
    \n-
    533 return *this;
    \n-
    534 }
    \n-
    \n-
    535
    \n-
    \n-
    537 void swap(BlockVector &other)
    \n-
    538 noexcept(noexcept(
    \n-
    539 std::declval<BlockVector&>().storage_.swap(other.storage_)))
    \n-
    540 {
    \n-
    541 [[maybe_unused]] const auto &guard = Imp::makeScopeGuard([&]{
    \n-
    542 syncBaseArray();
    \n-
    543 other.syncBaseArray();
    \n-
    544 });
    \n-
    545 storage_.swap(other.storage_);
    \n-
    546 }
    \n-
    \n-
    547
    \n-
    \n-\n-
    550 {
    \n-
    551 // forward to operator= in base class
    \n-
    552 (static_cast<Imp::block_vector_unmanaged<B,size_type>&>(*this)) = k;
    \n-
    553 return *this;
    \n-
    554 }
    \n-
    \n-
    555
    \n-
    556 private:
    \n-
    557 void syncBaseArray() noexcept
    \n-
    558 {
    \n-
    559 this->p = storage_.data();
    \n-
    560 this->n = storage_.size();
    \n-
    561 }
    \n-
    562
    \n-
    563 std::vector<B, A> storage_;
    \n-
    564 };
    \n-
    \n-
    565
    \n-
    571 template<class B, class A>
    \n-
    \n-
    572 struct FieldTraits< BlockVector<B, A> >
    \n-
    573 {
    \n-
    574 typedef typename FieldTraits<B>::field_type field_type;
    \n-
    575 typedef typename FieldTraits<B>::real_type real_type;
    \n-
    576 };
    \n-
    \n-
    582 template<class K, class A>
    \n-
    \n-
    583 std::ostream& operator<< (std::ostream& s, const BlockVector<K, A>& v)
    \n-
    584 {
    \n-
    585 typedef typename BlockVector<K, A>::size_type size_type;
    \n-
    586
    \n-
    587 for (size_type i=0; i<v.size(); i++)
    \n-
    588 s << v[i] << std::endl;
    \n-
    589
    \n-
    590 return s;
    \n-
    591 }
    \n-
    \n-
    592
    \n-
    594namespace Imp {
    \n-
    595
    \n-
    614#ifndef DOXYGEN
    \n-
    615 template<class B, class A>
    \n-
    616#else
    \n-
    617 template<class B, class A=std::allocator<B> >
    \n-
    618#endif
    \n-
    619 class BlockVectorWindow : public Imp::block_vector_unmanaged<B,typename A::size_type>
    \n-
    620 {
    \n-
    621 public:
    \n-
    622
    \n-
    623 //===== type definitions and constants
    \n-
    624
    \n-
    626 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n-
    627
    \n-
    629 typedef B block_type;
    \n-
    630
    \n-
    632 typedef A allocator_type;
    \n-
    633
    \n-
    635 typedef typename A::size_type size_type;
    \n-
    636
    \n-
    638 typedef typename Imp::block_vector_unmanaged<B,size_type>::Iterator Iterator;
    \n-
    639
    \n-
    641 typedef typename Imp::block_vector_unmanaged<B,size_type>::ConstIterator ConstIterator;
    \n-
    642
    \n-
    643
    \n-
    644 //===== constructors and such
    \n-
    646 BlockVectorWindow () : Imp::block_vector_unmanaged<B,size_type>()
    \n-
    647 { }
    \n-
    648
    \n-
    650 BlockVectorWindow (B* _p, size_type _n)
    \n-
    651 {
    \n-
    652 this->n = _n;
    \n-
    653 this->p = _p;
    \n-
    654 }
    \n-
    655
    \n-
    657 BlockVectorWindow (const BlockVectorWindow& a)
    \n-
    658 {
    \n-
    659 this->n = a.n;
    \n-
    660 this->p = a.p;
    \n-
    661 }
    \n-
    662
    \n-
    664 BlockVectorWindow& operator= (const BlockVectorWindow& a)
    \n-
    665 {
    \n-
    666 // check correct size
    \n-
    667#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    668 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n-
    669#endif
    \n-
    670
    \n-
    671 if (&a!=this) // check if this and a are different objects
    \n-
    672 {
    \n-
    673 // copy data
    \n-
    674 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
    \n-
    675 }
    \n-
    676 return *this;
    \n-
    677 }
    \n-
    678
    \n-
    680 BlockVectorWindow& operator= (const field_type& k)
    \n-
    681 {
    \n-
    682 (static_cast<Imp::block_vector_unmanaged<B,size_type>&>(*this)) = k;
    \n-
    683 return *this;
    \n-
    684 }
    \n-
    685
    \n-
    687 operator BlockVector<B, A>() const {
    \n-
    688 auto bv = BlockVector<B, A>(this->n);
    \n-
    689
    \n-
    690 std::copy(this->begin(), this->end(), bv.begin());
    \n-
    691
    \n-
    692 return bv;
    \n-
    693 }
    \n-
    694
    \n-
    695 //===== window manipulation methods
    \n-
    696
    \n-
    698 void set (size_type _n, B* _p)
    \n-
    699 {
    \n-
    700 this->n = _n;
    \n-
    701 this->p = _p;
    \n-
    702 }
    \n-
    703
    \n-
    705 void setsize (size_type _n)
    \n-
    706 {
    \n-
    707 this->n = _n;
    \n-
    708 }
    \n-
    709
    \n-
    711 void setptr (B* _p)
    \n-
    712 {
    \n-
    713 this->p = _p;
    \n-
    714 }
    \n-
    715
    \n-
    717 B* getptr ()
    \n-
    718 {
    \n-
    719 return this->p;
    \n-
    720 }
    \n-
    721
    \n-
    723 size_type getsize () const
    \n-
    724 {
    \n-
    725 return this->n;
    \n-
    726 }
    \n-
    727 };
    \n-
    728
    \n-
    729
    \n-
    730
    \n-
    741 template<class B, class ST=std::size_t >
    \n-
    742 class compressed_block_vector_unmanaged : public compressed_base_array_unmanaged<B,ST>
    \n-
    743 {
    \n-
    744 public:
    \n-
    745
    \n-
    746 //===== type definitions and constants
    \n-
    747
    \n-
    749 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n-
    750
    \n-
    752 typedef B block_type;
    \n-
    753
    \n-
    755 typedef typename compressed_base_array_unmanaged<B,ST>::iterator Iterator;
    \n-
    756
    \n-
    758 typedef typename compressed_base_array_unmanaged<B,ST>::const_iterator ConstIterator;
    \n-
    759
    \n-
    761 typedef ST size_type;
    \n-
    762
    \n-
    763 //===== assignment from scalar
    \n-
    764
    \n-
    765 compressed_block_vector_unmanaged& operator= (const field_type& k)
    \n-
    766 {
    \n-
    767 for (size_type i=0; i<this->n; i++)
    \n-
    768 (this->p)[i] = k;
    \n-
    769 return *this;
    \n-
    770 }
    \n-
    771
    \n-
    772
    \n-
    773 //===== vector space arithmetic
    \n-
    774
    \n-
    776 template<class V>
    \n-
    777 compressed_block_vector_unmanaged& operator+= (const V& y)
    \n-
    778 {
    \n-
    779#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    780 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
    \n-
    781#endif
    \n-
    782 for (size_type i=0; i<y.n; ++i) this->operator[](y.j[i]) += y.p[i];
    \n-
    783 return *this;
    \n-
    784 }
    \n-
    785
    \n-
    787 template<class V>
    \n-
    788 compressed_block_vector_unmanaged& operator-= (const V& y)
    \n-
    789 {
    \n-
    790#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    791 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
    \n-
    792#endif
    \n-
    793 for (size_type i=0; i<y.n; ++i) this->operator[](y.j[i]) -= y.p[i];
    \n-
    794 return *this;
    \n-
    795 }
    \n-
    796
    \n-
    798 template<class V>
    \n-
    799 compressed_block_vector_unmanaged& axpy (const field_type& a, const V& y)
    \n-
    800 {
    \n-
    801#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    802 if (!includesindexset(y)) DUNE_THROW(ISTLError,"index set mismatch");
    \n-
    803#endif
    \n-
    804 for (size_type i=0; i<y.n; ++i)
    \n-
    805 Impl::asVector((*this)[y.j[i]]).axpy(a,Impl::asVector(y.p[i]));
    \n-
    806 return *this;
    \n-
    807 }
    \n-
    808
    \n-
    810 compressed_block_vector_unmanaged& operator*= (const field_type& k)
    \n-
    811 {
    \n-
    812 for (size_type i=0; i<this->n; ++i) (this->p)[i] *= k;
    \n-
    813 return *this;
    \n-
    814 }
    \n-
    815
    \n-
    817 compressed_block_vector_unmanaged& operator/= (const field_type& k)
    \n-
    818 {
    \n-
    819 for (size_type i=0; i<this->n; ++i) (this->p)[i] /= k;
    \n-
    820 return *this;
    \n-
    821 }
    \n-
    822
    \n-
    823
    \n-
    824 //===== Euclidean scalar product
    \n-
    825
    \n-
    827 field_type operator* (const compressed_block_vector_unmanaged& y) const
    \n-
    828 {
    \n-
    829#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    830 if (!includesindexset(y) || !y.includesindexset(*this) )
    \n-
    831 DUNE_THROW(ISTLError,"index set mismatch");
    \n-
    832#endif
    \n-
    833 field_type sum=0;
    \n-
    834 for (size_type i=0; i<this->n; ++i)
    \n-
    835 sum += (this->p)[i] * y[(this->j)[i]];
    \n-
    836 return sum;
    \n-
    837 }
    \n-
    838
    \n-
    839
    \n-
    840 //===== norms
    \n-
    841
    \n-
    843 typename FieldTraits<field_type>::real_type one_norm () const
    \n-
    844 {
    \n-
    845 typename FieldTraits<field_type>::real_type sum=0;
    \n-
    846 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].one_norm();
    \n-
    847 return sum;
    \n-
    848 }
    \n-
    849
    \n-
    851 typename FieldTraits<field_type>::real_type one_norm_real () const
    \n-
    852 {
    \n-
    853 typename FieldTraits<field_type>::real_type sum=0;
    \n-
    854 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].one_norm_real();
    \n-
    855 return sum;
    \n-
    856 }
    \n-
    857
    \n-
    859 typename FieldTraits<field_type>::real_type two_norm () const
    \n-
    860 {
    \n-
    861 using std::sqrt;
    \n-
    862 typename FieldTraits<field_type>::real_type sum=0;
    \n-
    863 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].two_norm2();
    \n-
    864 return sqrt(sum);
    \n-
    865 }
    \n-
    866
    \n-
    868 typename FieldTraits<field_type>::real_type two_norm2 () const
    \n-
    869 {
    \n-
    870 typename FieldTraits<field_type>::real_type sum=0;
    \n-
    871 for (size_type i=0; i<this->n; ++i) sum += (this->p)[i].two_norm2();
    \n-
    872 return sum;
    \n-
    873 }
    \n-
    874
    \n-
    876 template <typename ft = field_type,
    \n-
    877 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n-
    878 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n-
    879 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    880 using std::max;
    \n-
    881
    \n-
    882 real_type norm = 0;
    \n-
    883 for (auto const &x : *this) {
    \n-
    884 real_type const a = x.infinity_norm();
    \n-
    885 norm = max(a, norm);
    \n-
    886 }
    \n-
    887 return norm;
    \n-
    888 }
    \n-
    889
    \n-
    891 template <typename ft = field_type,
    \n-
    892 typename std::enable_if<!HasNaN<ft>::value, int>::type = 0>
    \n-
    893 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n-
    894 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    895 using std::max;
    \n-
    896
    \n-
    897 real_type norm = 0;
    \n-
    898 for (auto const &x : *this) {
    \n-
    899 real_type const a = x.infinity_norm_real();
    \n-
    900 norm = max(a, norm);
    \n-
    901 }
    \n-
    902 return norm;
    \n-
    903 }
    \n-
    904
    \n-
    906 template <typename ft = field_type,
    \n-
    907 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n-
    908 typename FieldTraits<ft>::real_type infinity_norm() const {
    \n-
    909 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    910 using std::max;
    \n-
    911
    \n-
    912 real_type norm = 0;
    \n-
    913 real_type isNaN = 1;
    \n-
    914 for (auto const &x : *this) {
    \n-
    915 real_type const a = x.infinity_norm();
    \n-
    916 norm = max(a, norm);
    \n-
    917 isNaN += a;
    \n-
    918 }
    \n-
    919 return norm * (isNaN / isNaN);
    \n-
    920 }
    \n-
    921
    \n-
    923 template <typename ft = field_type,
    \n-
    924 typename std::enable_if<HasNaN<ft>::value, int>::type = 0>
    \n-
    925 typename FieldTraits<ft>::real_type infinity_norm_real() const {
    \n-
    926 using real_type = typename FieldTraits<ft>::real_type;
    \n-
    927 using std::max;
    \n-
    928
    \n-
    929 real_type norm = 0;
    \n-
    930 real_type isNaN = 1;
    \n-
    931 for (auto const &x : *this) {
    \n-
    932 real_type const a = x.infinity_norm_real();
    \n-
    933 norm = max(a, norm);
    \n-
    934 isNaN += a;
    \n-
    935 }
    \n-
    936 return norm * (isNaN / isNaN);
    \n-
    937 }
    \n-
    938
    \n-
    939 //===== sizes
    \n-
    940
    \n-
    942 size_type N () const
    \n-
    943 {
    \n-
    944 return this->n;
    \n-
    945 }
    \n-
    946
    \n-
    948 size_type dim () const
    \n-
    949 {
    \n-
    950 size_type d=0;
    \n-
    951 for (size_type i=0; i<this->n; i++)
    \n-
    952 d += (this->p)[i].dim();
    \n-
    953 return d;
    \n-
    954 }
    \n-
    955
    \n-
    956 protected:
    \n-
    958 compressed_block_vector_unmanaged () : compressed_base_array_unmanaged<B,ST>()
    \n-
    959 { }
    \n-
    960
    \n-
    962 template<class V>
    \n-
    963 bool includesindexset (const V& y)
    \n-
    964 {
    \n-
    965 typename V::ConstIterator e=this->end();
    \n-
    966 for (size_type i=0; i<y.n; i++)
    \n-
    967 if (this->find(y.j[i])==e)
    \n-
    968 return false;
    \n-
    969 return true;
    \n-
    970 }
    \n-
    971 };
    \n-
    972
    \n-
    973
    \n-
    992 template<class B, class ST=std::size_t >
    \n-
    993 class CompressedBlockVectorWindow : public compressed_block_vector_unmanaged<B,ST>
    \n-
    994 {
    \n-
    995 public:
    \n-
    996
    \n-
    997 //===== type definitions and constants
    \n-
    998
    \n-
    1000 using field_type = typename Imp::BlockTraits<B>::field_type;
    \n-
    1001
    \n-
    1003 typedef B block_type;
    \n-
    1004
    \n-
    1006 typedef ST size_type;
    \n-
    1007
    \n-
    1009 typedef typename compressed_block_vector_unmanaged<B,ST>::Iterator Iterator;
    \n-
    1010
    \n-
    1012 typedef typename compressed_block_vector_unmanaged<B,ST>::ConstIterator ConstIterator;
    \n-
    1013
    \n-
    1014
    \n-
    1015 //===== constructors and such
    \n-
    1017 CompressedBlockVectorWindow () : compressed_block_vector_unmanaged<B,ST>()
    \n-
    1018 { }
    \n-
    1019
    \n-
    1021 CompressedBlockVectorWindow (B* _p, size_type* _j, size_type _n)
    \n-
    1022 {
    \n-
    1023 this->n = _n;
    \n-
    1024 this->p = _p;
    \n-
    1025 this->j = _j;
    \n-
    1026 }
    \n-
    1027
    \n-
    1029 CompressedBlockVectorWindow (const CompressedBlockVectorWindow& a)
    \n-
    1030 {
    \n-
    1031 this->n = a.n;
    \n-
    1032 this->p = a.p;
    \n-
    1033 this->j = a.j;
    \n-
    1034 }
    \n-
    1035
    \n-
    1037 CompressedBlockVectorWindow& operator= (const CompressedBlockVectorWindow& a)
    \n-
    1038 {
    \n-
    1039 // check correct size
    \n-
    1040#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    1041 if (this->n!=a.N()) DUNE_THROW(ISTLError,"vector size mismatch");
    \n-
    1042#endif
    \n-
    1043
    \n-
    1044 if (&a!=this) // check if this and a are different objects
    \n-
    1045 {
    \n-
    1046 // copy data
    \n-
    1047 for (size_type i=0; i<this->n; i++) this->p[i]=a.p[i];
    \n-
    1048 for (size_type i=0; i<this->n; i++) this->j[i]=a.j[i];
    \n-
    1049 }
    \n-
    1050 return *this;
    \n-
    1051 }
    \n-
    1052
    \n-
    1054 CompressedBlockVectorWindow& operator= (const field_type& k)
    \n-
    1055 {
    \n-
    1056 (static_cast<compressed_block_vector_unmanaged<B,ST>&>(*this)) = k;
    \n-
    1057 return *this;
    \n-
    1058 }
    \n-
    1059
    \n-
    1060
    \n-
    1061 //===== window manipulation methods
    \n-
    1062
    \n-
    1064 void set (size_type _n, B* _p, size_type* _j)
    \n-
    1065 {
    \n-
    1066 this->n = _n;
    \n-
    1067 this->p = _p;
    \n-
    1068 this->j = _j;
    \n-
    1069 }
    \n-
    1070
    \n-
    1072 void setsize (size_type _n)
    \n-
    1073 {
    \n-
    1074 this->n = _n;
    \n-
    1075 }
    \n-
    1076
    \n-
    1078 void setptr (B* _p)
    \n-
    1079 {
    \n-
    1080 this->p = _p;
    \n-
    1081 }
    \n-
    1082
    \n-
    1084 void setindexptr (size_type* _j)
    \n-
    1085 {
    \n-
    1086 this->j = _j;
    \n-
    1087 }
    \n-
    1088
    \n-
    1090 B* getptr ()
    \n-
    1091 {
    \n-
    1092 return this->p;
    \n-
    1093 }
    \n-
    1094
    \n-
    1096 size_type* getindexptr ()
    \n-
    1097 {
    \n-
    1098 return this->j;
    \n-
    1099 }
    \n-
    1100
    \n-
    1102 const B* getptr () const
    \n-
    1103 {
    \n-
    1104 return this->p;
    \n-
    1105 }
    \n-
    1106
    \n-
    1108 const size_type* getindexptr () const
    \n-
    1109 {
    \n-
    1110 return this->j;
    \n-
    1111 }
    \n-
    1113 size_type getsize () const
    \n-
    1114 {
    \n-
    1115 return this->n;
    \n-
    1116 }
    \n-
    1117 };
    \n-
    1118
    \n-
    1119} // end namespace 'Imp'
    \n-
    1120
    \n-
    1121
    \n-
    1123 template<typename B, typename A>
    \n-
    1124 struct AutonomousValueType<Imp::BlockVectorWindow<B,A>>
    \n-
    1125 {
    \n-
    1126 using type = BlockVector<B, A>;
    \n-
    1127 };
    \n-
    1128
    \n-
    1129
    \n-
    1130} // end namespace 'Dune'
    \n-
    1131
    \n-
    1132#endif
    \n-
    Implements several basic array containers.
    \n-
    Helper functions for determining the vector/matrix block level.
    \n-\n-
    STL namespace.
    \n+
    326 } // Amg
    \n+
    327} // Dune
    \n+
    328
    \n+
    329#endif
    \n+
    Define general preconditioner interface.
    \n+
    The AMG preconditioner.
    \n+
    void apply(Domain &v, const Range &d)
    Apply one step of the preconditioner to the system A(v)=d.
    Definition kamg.hh:300
    \n+
    X Domain
    The domain type.
    Definition amg.hh:87
    \n+
    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
    \n+
    std::size_t maxlevels()
    Definition kamg.hh:320
    \n+
    SmootherTraits< Smoother >::Arguments SmootherArgs
    The argument type for the construction of the smoother.
    Definition amg.hh:100
    \n+
    M Operator
    The matrix operator type.
    Definition amg.hh:73
    \n+
    void post(Domain &x)
    Clean up.
    Definition kamg.hh:293
    \n+
    X Range
    The range type.
    Definition amg.hh:89
    \n+
    void presmooth(LevelContext &levelContext, size_t steps)
    Apply pre smoothing on the current level.
    Definition smoother.hh:406
    \n+
    void postsmooth(LevelContext &levelContext, size_t steps)
    Apply post smoothing on the current level.
    Definition smoother.hh:428
    \n+
    void pre(Domain &x, Range &b)
    Prepare the preconditioner.
    Definition kamg.hh:253
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition amg.hh:194
    \n+
    PI ParallelInformation
    The type of the parallel information. Either OwnerOverlapCommunication or another type describing the...
    Definition amg.hh:80
    \n
    Definition allocator.hh:11
    \n-
    std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)
    Send BlockVector to an output stream.
    Definition bvector.hh:583
    \n-
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n-
    BlockVector()
    makes empty vector
    Definition bvector.hh:418
    \n-
    Imp::block_vector_unmanaged< B, size_type >::ConstIterator ConstIterator
    make iterators available as types
    Definition bvector.hh:413
    \n-
    void reserve(size_type capacity)
    Reserve space.
    Definition bvector.hh:468
    \n-
    BlockVector(BlockVector &&a) noexcept(noexcept(std::declval< BlockVector >().swap(a)))
    move constructor
    Definition bvector.hh:512
    \n-
    BlockVector(size_type _n)
    make vector with _n components
    Definition bvector.hh:424
    \n-
    void resize(size_type size)
    Resize the vector.
    Definition bvector.hh:496
    \n-
    Imp::block_vector_unmanaged< B, size_type >::Iterator Iterator
    make iterators available as types
    Definition bvector.hh:410
    \n-
    BlockVector(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector >().storage_=a.storage_))
    copy constructor
    Definition bvector.hh:504
    \n-
    A allocator_type
    export the allocator type
    Definition bvector.hh:404
    \n-
    BlockVector & operator=(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector >().storage_=a.storage_))
    assignment
    Definition bvector.hh:519
    \n-
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bvector.hh:398
    \n-
    A::size_type size_type
    The type for the index access.
    Definition bvector.hh:407
    \n-
    BlockVector(std::initializer_list< B > const &l)
    Construct from a std::initializer_list.
    Definition bvector.hh:430
    \n-
    size_type capacity() const
    Get the capacity of the vector.
    Definition bvector.hh:481
    \n-
    BlockVector(size_type _n, S _capacity)
    Make vector with _n components but preallocating capacity components.
    Definition bvector.hh:448
    \n-
    B block_type
    export the type representing the components
    Definition bvector.hh:401
    \n-
    void swap(BlockVector &other) noexcept(noexcept(std::declval< BlockVector & >().storage_.swap(other.storage_)))
    swap operation
    Definition bvector.hh:537
    \n-
    FieldTraits< B >::real_type real_type
    Definition bvector.hh:575
    \n-
    FieldTraits< B >::field_type field_type
    Definition bvector.hh:574
    \n+
    an algebraic multigrid method using a Krylov-cycle.
    Definition kamg.hh:140
    \n+
    Amg::Domain Domain
    the type of the domain.
    Definition kamg.hh:157
    \n+
    Amg::SmootherArgs SmootherArgs
    The type of the arguments for construction of the smoothers.
    Definition kamg.hh:153
    \n+
    Amg::ParallelInformation ParallelInformation
    the type of the parallelinformation to use.
    Definition kamg.hh:151
    \n+
    Amg::CoarseSolver CoarseSolver
    The type of the coarse solver.
    Definition kamg.hh:149
    \n+
    Amg::OperatorHierarchy OperatorHierarchy
    The type of the hierarchy of operators.
    Definition kamg.hh:147
    \n+
    Amg::Range Range
    The type of the range.
    Definition kamg.hh:159
    \n+
    Amg::ScalarProduct ScalarProduct
    The type of the scalar product.
    Definition kamg.hh:163
    \n+
    AMG< M, X, S, PI, A > Amg
    The type of the underlying AMG.
    Definition kamg.hh:143
    \n+
    Amg::Operator Operator
    the type of the lineatr operator.
    Definition kamg.hh:155
    \n+
    Amg::ParallelInformationHierarchy ParallelInformationHierarchy
    The type of the hierarchy of parallel information.
    Definition kamg.hh:161
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition kamg.hh:166
    \n+
    K KrylovSolver
    The type of the Krylov solver for the cycle.
    Definition kamg.hh:145
    \n+
    Two grid operator for AMG with Krylov cycle.
    Definition kamg.hh:33
    \n+
    void pre(typename AMG::Domain &x, typename AMG::Range &b)
    Prepare the preconditioner.
    Definition kamg.hh:58
    \n+
    KAmgTwoGrid(AMG &amg, std::shared_ptr< InverseOperator< Domain, Range > > coarseSolver)
    Constructor.
    Definition kamg.hh:53
    \n+
    ~KAmgTwoGrid()
    Destructor.
    Definition kamg.hh:110
    \n+
    void post(typename AMG::Domain &x)
    Clean up.
    Definition kamg.hh:62
    \n+
    virtual SolverCategory::Category category() const
    Category of the preconditioner (see SolverCategory::Category)
    Definition kamg.hh:41
    \n+
    void setLevelContext(std::shared_ptr< typename AMG::LevelContext > p)
    Set the level context pointer.
    Definition kamg.hh:104
    \n+
    InverseOperator< Domain, Range > * coarseSolver()
    Get a pointer to the coarse grid solver.
    Definition kamg.hh:95
    \n+
    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
    \n+
    Parallel algebraic multigrid based on agglomeration.
    Definition amg.hh:65
    \n+\n+
    LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation > Iterator
    Type of the mutable iterator.
    Definition hierarchy.hh:216
    \n+
    The hierarchies build by the coarsening process.
    Definition matrixhierarchy.hh:61
    \n+
    All parameters for AMG.
    Definition parameters.hh:416
    \n+
    Base class for matrix free definition of preconditioners.
    Definition preconditioner.hh:33
    \n+
    Base class for scalar product and norm computation.
    Definition scalarproducts.hh:52
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    Abstract base class for all solvers.
    Definition solver.hh:101
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    Generalized preconditioned conjugate gradient solver.
    Definition solvers.hh:1307
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,992 +1,433 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-bvector.hh\n+ * _\bp_\ba_\ba_\bm_\bg\n+kamg.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5\n-6#ifndef DUNE_ISTL_BVECTOR_HH\n-7#define DUNE_ISTL_BVECTOR_HH\n-8\n-9#include \n-10#include \n-11#include \n-12#include \n-13#include \n-14#include \n-15#include \n-16#include \n-17\n-18#include \n-19#include \n-20#include \n-21#include \n-22#include \n-23#include \n-24#include \n-25\n-26#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n-27\n-28#include \"_\bb_\ba_\bs_\be_\ba_\br_\br_\ba_\by_\b._\bh_\bh\"\n-29#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-30\n-38namespace _\bD_\bu_\bn_\be {\n+5#ifndef DUNE_AMG_KAMG_HH\n+6#define DUNE_AMG_KAMG_HH\n+7\n+8#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh>\n+9#include \"_\ba_\bm_\bg_\b._\bh_\bh\"\n+10\n+11namespace _\bD_\bu_\bn_\be\n+12{\n+13 namespace Amg\n+14 {\n+15\n+30 template\n+_\b3_\b1 class _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd\n+32 : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+33 {\n+35 typedef typename _\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn Domain;\n+37 typedef typename _\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be Range;\n+38 public:\n 39\n-41namespace Imp {\n-42\n-48 template \n-49 class BlockTraitsImp;\n-50\n-51 template \n-52 class BlockTraitsImp\n-53 {\n-54 public:\n-55 using field_type = B;\n-56 };\n-57\n-58 template \n-59 class BlockTraitsImp\n-60 {\n-61 public:\n-62 using field_type = typename B::field_type;\n-63 };\n+_\b4_\b1 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+42 {\n+43 return amg_._\bc_\ba_\bt_\be_\bg_\bo_\br_\by();\n+44 };\n+45\n+_\b5_\b3 _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd(_\bA_\bM_\bG& amg, std::shared_ptr<_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bR_\ba_\bn_\bg_\be_\b> >\n+_\bc_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br)\n+54 : amg_(amg), coarseSolver_(_\bc_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br)\n+55 {}\n+56\n+_\b5_\b8 void _\bp_\br_\be([[maybe_unused]] typename _\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn& x, [[maybe_unused]] typename\n+_\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be& b)\n+59 {}\n+60\n+_\b6_\b2 void _\bp_\bo_\bs_\bt([[maybe_unused]] typename _\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn& x)\n+63 {}\n 64\n-67 template \n-68 using BlockTraits = BlockTraitsImp::value>;\n-69\n-83 template\n-84 class block_vector_unmanaged : public base_array_unmanaged\n-85 {\n-86 public:\n-87\n-88 //===== type definitions and constants\n-89 using field_type = typename Imp::BlockTraits::field_type;\n+_\b6_\b6 void _\ba_\bp_\bp_\bl_\by(typename _\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn& v, const typename _\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be& d)\n+67 {\n+68 // Copy data\n+69 *levelContext_->update=0;\n+70 *levelContext_->rhs = d;\n+71 *levelContext_->lhs = v;\n+72\n+73 _\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh(*levelContext_, amg_.preSteps_);\n+74 bool processFineLevel =\n+75 amg_.moveToCoarseLevel(*levelContext_);\n+76\n+77 if(processFineLevel) {\n+78 typename _\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be b=*levelContext_->rhs;\n+79 typename _\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn x=*levelContext_->update;\n+80 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt res;\n+81 coarseSolver_->apply(x, b, res);\n+82 *levelContext_->update=x;\n+83 }\n+84\n+85 amg_.moveToFineLevel(*levelContext_, processFineLevel);\n+86\n+87 _\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh(*levelContext_, amg_.postSteps_);\n+88 v=*levelContext_->update;\n+89 }\n 90\n-92 typedef B block_type;\n-93\n-95 typedef ST size_type;\n-96\n-98 typedef typename base_array_unmanaged::iterator Iterator;\n+_\b9_\b5 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bR_\ba_\bn_\bg_\be_\b>* _\bc_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br()\n+96 {\n+97 return coarseSolver_;\n+98 }\n 99\n-101 typedef typename base_array_unmanaged::const_iterator ConstIterator;\n-102\n-104 typedef B value_type;\n-105\n-107 typedef B& reference;\n+_\b1_\b0_\b4 void _\bs_\be_\bt_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt(std::shared_ptr p)\n+105 {\n+106 levelContext_=p;\n+107 }\n 108\n-110 typedef const B& const_reference;\n-111\n-112 //===== assignment from scalar\n-114\n-115 block_vector_unmanaged& operator= (const field_type& k)\n-116 {\n-117 for (size_type i=0; in; i++)\n-118 (*this)[i] = k;\n-119 return *this;\n-120 }\n+_\b1_\b1_\b0 _\b~_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd()\n+111 {}\n+112\n+113 private:\n+115 _\bA_\bM_\bG& amg_;\n+117 std::shared_ptr > coarseSolver_;\n+119 std::shared_ptr levelContext_;\n+120 };\n 121\n-122 //===== vector space arithmetic\n-124 block_vector_unmanaged& operator+= (const block_vector_unmanaged& y)\n-125 {\n-126#ifdef DUNE_ISTL_WITH_CHECKING\n-127 if (this->n!=y.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n-128#endif\n-129 for (size_type i=0; in; ++i) (*this)[i] += y[i];\n-130 return *this;\n-131 }\n-132\n-134 block_vector_unmanaged& operator-= (const block_vector_unmanaged& y)\n-135 {\n-136#ifdef DUNE_ISTL_WITH_CHECKING\n-137 if (this->n!=y.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n-138#endif\n-139 for (size_type i=0; in; ++i) (*this)[i] -= y[i];\n-140 return *this;\n-141 }\n-142\n-144 block_vector_unmanaged& operator*= (const field_type& k)\n-145 {\n-146 for (size_type i=0; in; ++i) (*this)[i] *= k;\n-147 return *this;\n-148 }\n-149\n-151 block_vector_unmanaged& operator/= (const field_type& k)\n-152 {\n-153 for (size_type i=0; in; ++i) (*this)[i] /= k;\n-154 return *this;\n-155 }\n-156\n-158 block_vector_unmanaged& axpy (const field_type& a, const\n-block_vector_unmanaged& y)\n-159 {\n-160#ifdef DUNE_ISTL_WITH_CHECKING\n-161 if (this->n!=y.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n-162#endif\n-163 for (size_type i=0; in; ++i)\n-164 Impl::asVector((*this)[i]).axpy(a,Impl::asVector(y[i]));\n-165\n-166 return *this;\n-167 }\n-168\n-169\n-177 template\n-178 auto operator* (const block_vector_unmanaged& y) const\n-179 {\n-180 typedef typename PromotionTraits::\n-field_type>::PromotedType PromotedType;\n-181 PromotedType sum(0);\n-182#ifdef DUNE_ISTL_WITH_CHECKING\n-183 if (this->n!=y.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n-184#endif\n-185 for (size_type i=0; in; ++i) {\n-186 sum += PromotedType(((*this)[i])*y[i]);\n-187 }\n-188 return sum;\n-189 }\n-190\n-198 template\n-199 auto dot(const block_vector_unmanaged& y) const\n-200 {\n-201 typedef typename PromotionTraits::\n-field_type>::PromotedType PromotedType;\n-202 PromotedType sum(0);\n-203#ifdef DUNE_ISTL_WITH_CHECKING\n-204 if (this->n!=y.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n-205#endif\n-206\n-207 for (size_type i=0; in; ++i)\n-208 sum += Impl::asVector((*this)[i]).dot(Impl::asVector(y[i]));\n-209\n-210 return sum;\n-211 }\n-212\n-213 //===== norms\n-214\n-216 typename FieldTraits::real_type one_norm () const\n-217 {\n-218 typename FieldTraits::real_type sum=0;\n-219 for (size_type i=0; in; ++i)\n-220 sum += Impl::asVector((*this)[i]).one_norm();\n-221 return sum;\n-222 }\n+122\n+123\n+137 template, class A=std::allocator >\n+_\b1_\b3_\b9 class _\bK_\bA_\bM_\bG : public _\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+140 {\n+141 public:\n+_\b1_\b4_\b3 typedef _\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\bI_\b,_\bA_\b> _\bA_\bm_\bg;\n+_\b1_\b4_\b5 typedef K _\bK_\br_\by_\bl_\bo_\bv_\bS_\bo_\bl_\bv_\be_\br;\n+_\b1_\b4_\b7 typedef typename _\bA_\bm_\bg_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n+_\b1_\b4_\b9 typedef typename _\bA_\bm_\bg_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br;\n+_\b1_\b5_\b1 typedef typename _\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn;\n+_\b1_\b5_\b3 typedef typename _\bA_\bm_\bg_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs;\n+_\b1_\b5_\b5 typedef typename _\bA_\bm_\bg_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br _\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b5_\b7 typedef typename _\bA_\bm_\bg_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn _\bD_\bo_\bm_\ba_\bi_\bn;\n+_\b1_\b5_\b9 typedef typename _\bA_\bm_\bg_\b:_\b:_\bR_\ba_\bn_\bg_\be _\bR_\ba_\bn_\bg_\be;\n+_\b1_\b6_\b1 typedef typename _\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by;\n+_\b1_\b6_\b3 typedef typename _\bA_\bm_\bg_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt _\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt;\n+164\n+_\b1_\b6_\b6 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+167 {\n+168 return amg._\bc_\ba_\bt_\be_\bg_\bo_\br_\by();\n+169 };\n+170\n+182 _\bK_\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br& coarseSolver,\n+183 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs, const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& parms,\n+184 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1);\n+185\n+199 template\n+200 _\bK_\bA_\bM_\bG(const _\bO_\bp_\be_\br_\ba_\bt_\bo_\br& fineOperator, const C& criterion,\n+201 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs=_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs(),\n+202 std::size_t maxLevelKrylovSteps=3, double minDefectReduction=1e-1,\n+203 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo=_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn());\n+204\n+206 void _\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b);\n+208 void _\bp_\bo_\bs_\bt(_\bD_\bo_\bm_\ba_\bi_\bn& x);\n+210 void _\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d);\n+211\n+212 std::size_t _\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs();\n+213\n+214 private:\n+216 _\bA_\bm_\bg amg;\n+217\n+219 std::size_t maxLevelKrylovSteps;\n+220\n+222 double levelDefectReduction;\n 223\n-225 typename FieldTraits::real_type one_norm_real () const\n-226 {\n-227 typename FieldTraits::real_type sum=0;\n-228 for (size_type i=0; in; ++i)\n-229 sum += Impl::asVector((*this)[i]).one_norm_real();\n-230 return sum;\n-231 }\n-232\n-234 typename FieldTraits::real_type two_norm () const\n-235 {\n-236 using std::sqrt;\n-237 return sqrt(two_norm2());\n-238 }\n+225 std::vector > scalarproducts;\n+226\n+228 std::vector > > ksolvers;\n+229 };\n+230\n+231\n+232 template\n+_\b2_\b3_\b3 _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\bK_\bA_\bM_\bG(_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by& matrices, _\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br&\n+coarseSolver,\n+234 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs, const _\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs& params,\n+235 std::size_t ksteps, double reduction)\n+236 : amg(matrices, coarseSolver, smootherArgs, params),\n+237 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)\n+238 {}\n 239\n-241 typename FieldTraits::real_type two_norm2 () const\n-242 {\n-243 typename FieldTraits::real_type sum=0;\n-244 for (size_type i=0; in; ++i)\n-245 sum += Impl::asVector((*this)[i]).two_norm2();\n-246 return sum;\n-247 }\n-248\n-250 template ::value, int>::type = 0>\n-252 typename FieldTraits::real_type infinity_norm() const {\n-253 using real_type = typename FieldTraits::real_type;\n-254 using std::max;\n-255\n-256 real_type norm = 0;\n-257 for (auto const &xi : *this) {\n-258 real_type const a = Impl::asVector(xi).infinity_norm();\n-259 norm = max(a, norm);\n-260 }\n-261 return norm;\n-262 }\n-263\n-265 template ::value, int>::type = 0>\n-267 typename FieldTraits::real_type infinity_norm_real() const {\n-268 using real_type = typename FieldTraits::real_type;\n-269 using std::max;\n-270\n-271 real_type norm = 0;\n-272 for (auto const &xi : *this) {\n-273 real_type const a = Impl::asVector(xi).infinity_norm_real();\n-274 norm = max(a, norm);\n-275 }\n-276 return norm;\n-277 }\n-278\n-280 template ::value, int>::type = 0>\n-282 typename FieldTraits::real_type infinity_norm() const {\n-283 using real_type = typename FieldTraits::real_type;\n-284 using std::max;\n-285 using std::abs;\n-286\n-287 real_type norm = 0;\n-288 real_type isNaN = 1;\n-289\n-290 for (auto const &xi : *this) {\n-291 real_type const a = Impl::asVector(xi).infinity_norm();\n-292 norm = max(a, norm);\n-293 isNaN += a;\n-294 }\n-295 return norm * (isNaN / isNaN);\n-296 }\n-297\n-299 template ::value, int>::type = 0>\n-301 typename FieldTraits::real_type infinity_norm_real() const {\n-302 using real_type = typename FieldTraits::real_type;\n-303 using std::max;\n-304\n-305 real_type norm = 0;\n-306 real_type isNaN = 1;\n-307\n-308 for (auto const &xi : *this) {\n-309 real_type const a = Impl::asVector(xi).infinity_norm_real();\n-310 norm = max(a, norm);\n-311 isNaN += a;\n-312 }\n-313\n-314 return norm * (isNaN / isNaN);\n-315 }\n-316\n-317 //===== sizes\n+240\n+241 template\n+242 template\n+_\b2_\b4_\b3 _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\bK_\bA_\bM_\bG(const _\bO_\bp_\be_\br_\ba_\bt_\bo_\br& fineOperator, const C& criterion,\n+244 const _\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs& smootherArgs,\n+245 std::size_t ksteps, double reduction,\n+246 const _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& pinfo)\n+247 : amg(fineOperator, criterion, smootherArgs, pinfo),\n+248 maxLevelKrylovSteps(ksteps), levelDefectReduction(reduction)\n+249 {}\n+250\n+251\n+252 template\n+_\b2_\b5_\b3 void _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\bp_\br_\be(_\bD_\bo_\bm_\ba_\bi_\bn& x, _\bR_\ba_\bn_\bg_\be& b)\n+254 {\n+255 amg.pre(x,b);\n+256 scalarproducts.reserve(amg.levels());\n+257 ksolvers.reserve(amg.levels());\n+258\n+259 typename OperatorHierarchy::ParallelMatrixHierarchy::Iterator\n+260 matrix = amg.matrices_->matrices().coarsest();\n+261 typename _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+262 pinfo = amg.matrices_->parallelInformation().coarsest();\n+263 bool hasCoarsest=(amg.levels()==amg.maxlevels());\n+264\n+265 if(hasCoarsest) {\n+266 if(matrix==amg.matrices_->matrices().finest())\n+267 return;\n+268 --matrix;\n+269 --pinfo;\n+270 ksolvers.push_back(std::shared_ptr<_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b> >(new _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b>\n+(amg, amg.solver_)));\n+271 }else\n+272 ksolvers.push_back(std::shared_ptr<_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b> >(new _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b>\n+(amg, std::shared_ptr<_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\b,_\bR_\ba_\bn_\bg_\be_\b> >())));\n+273\n+274 std::ostringstream s;\n+275\n+276 if(matrix!=amg.matrices_->matrices().finest())\n+277 while(true) {\n+278 scalarproducts.push_back(createScalarProduct(*pinfo,category()));\n+279 std::shared_ptr > ks =\n+280 std::shared_ptr >(new _\bK_\br_\by_\bl_\bo_\bv_\bS_\bo_\bl_\bv_\be_\br(*matrix, *\n+(scalarproducts.back()),\n+281 *(ksolvers.back()), levelDefectReduction,\n+282 maxLevelKrylovSteps, 0));\n+283 ksolvers.push_back(std::shared_ptr<_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b> >(new _\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b<_\bA_\bm_\bg_\b>\n+(amg, ks)));\n+284 --matrix;\n+285 --pinfo;\n+286 if(matrix==amg.matrices_->matrices().finest())\n+287 break;\n+288 }\n+289 }\n+290\n+291\n+292 template\n+_\b2_\b9_\b3 void _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\bp_\bo_\bs_\bt(_\bD_\bo_\bm_\ba_\bi_\bn& x)\n+294 {\n+295 amg.post(x);\n+296\n+297 }\n+298\n+299 template\n+_\b3_\b0_\b0 void _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\ba_\bp_\bp_\bl_\by(_\bD_\bo_\bm_\ba_\bi_\bn& v, const _\bR_\ba_\bn_\bg_\be& d)\n+301 {\n+302 if(ksolvers.size()==0)\n+303 {\n+304 _\bR_\ba_\bn_\bg_\be td=d;\n+305 _\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt res;\n+306 amg.solver_->apply(v,td,res);\n+307 }else\n+308 {\n+309 typedef typename Amg::LevelContext LevelContext;\n+310 std::shared_ptr levelContext(new LevelContext);\n+311 amg.initIteratorsWithFineLevel(*levelContext);\n+312 typedef typename std::vector > >::iterator\n+Iter;\n+313 for(Iter solver=ksolvers.begin(); solver!=ksolvers.end(); ++solver)\n+314 (*solver)->setLevelContext(levelContext);\n+315 ksolvers.back()->apply(v,d);\n+316 }\n+317 }\n 318\n-320 size_type N () const\n+319 template\n+_\b3_\b2_\b0 std::size_t _\bK_\bA_\bM_\bG_\b<_\bM_\b,_\bX_\b,_\bS_\b,_\bP_\b,_\bK_\b,_\bA_\b>_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs()\n 321 {\n-322 return this->n;\n+322 return amg.maxlevels();\n 323 }\n 324\n-326 size_type dim () const\n-327 {\n-328 size_type d=0;\n-329\n-330 for (size_type i=0; in; i++)\n-331 d += Impl::asVector((*this)[i]).dim();\n-332\n-333 return d;\n-334 }\n-335\n-336 protected:\n-338 block_vector_unmanaged () : base_array_unmanaged()\n-339 { }\n-340 };\n-341\n-343\n-348 template\n-349 class ScopeGuard {\n-350 F cleanupFunc_;\n-351 public:\n-352 ScopeGuard(F cleanupFunc) : cleanupFunc_(_\bs_\bt_\bd::move(cleanupFunc)) {}\n-353 ScopeGuard(const ScopeGuard &) = delete;\n-354 ScopeGuard(ScopeGuard &&) = delete;\n-355 ScopeGuard &operator=(ScopeGuard) = delete;\n-356 ~ScopeGuard() { cleanupFunc_(); }\n-357 };\n-358\n-360\n-369 template\n-370 ScopeGuard makeScopeGuard(F cleanupFunc)\n-371 {\n-372 return { std::move(cleanupFunc) };\n-373 }\n-374\n-375} // end namespace Imp\n-390 template >\n-_\b3_\b9_\b1 class _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br : public Imp::block_vector_unmanaged\n-392 {\n-393 public:\n-394\n-395 //===== type definitions and constants\n-396\n-_\b3_\b9_\b8 using _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be = typename Imp::BlockTraits::field_type;\n-399\n-_\b4_\b0_\b1 typedef B _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n-402\n-_\b4_\b0_\b4 typedef A _\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be;\n-405\n-_\b4_\b0_\b7 typedef typename A::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-408\n-_\b4_\b1_\b0 typedef typename Imp::block_vector_unmanaged::Iterator\n-_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-411\n-_\b4_\b1_\b3 typedef typename Imp::block_vector_unmanaged::ConstIterator\n-_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br;\n-414\n-415 //===== constructors and such\n-416\n-_\b4_\b1_\b8 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br ()\n-419 {\n-420 syncBaseArray();\n-421 }\n-422\n-_\b4_\b2_\b4 explicit _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n) : storage_(_n)\n-425 {\n-426 syncBaseArray();\n-427 }\n-428\n-_\b4_\b3_\b0 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (std::initializer_list const &l) : storage_(l)\n-431 {\n-432 syncBaseArray();\n-433 }\n-434\n-435\n-447 template\n-_\b4_\b4_\b8 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _n, S _capacity)\n-449 {\n-450 static_assert(std::numeric_limits::is_integer,\n-451 \"capacity must be an unsigned integral type (be aware, that this\n-constructor does not set the default value!)\" );\n-452 if((_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be)_capacity > _n)\n-453 storage_.reserve(_capacity);\n-454 storage_.resize(_n);\n-455 syncBaseArray();\n-456 }\n-457\n-458\n-_\b4_\b6_\b8 void _\br_\be_\bs_\be_\br_\bv_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by)\n-469 {\n-470 [[maybe_unused]] const auto &guard =\n-471 Imp::makeScopeGuard([this]{ syncBaseArray(); });\n-472 storage_.reserve(_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by);\n-473 }\n-474\n-_\b4_\b8_\b1 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by() const\n-482 {\n-483 return storage_.capacity();\n-484 }\n-485\n-_\b4_\b9_\b6 void _\br_\be_\bs_\bi_\bz_\be(_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size)\n-497 {\n-498 [[maybe_unused]] const auto &guard =\n-499 Imp::makeScopeGuard([this]{ syncBaseArray(); });\n-500 storage_.resize(size);\n-501 }\n-502\n-_\b5_\b0_\b4 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br(const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br &a)\n-505 noexcept(noexcept(std::declval().storage_ = a.storage_))\n-506 {\n-507 storage_ = a.storage_;\n-508 syncBaseArray();\n-509 }\n-510\n-_\b5_\b1_\b2 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br(_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br &&a)\n-513 noexcept(noexcept(std::declval().swap(a)))\n-514 {\n-515 _\bs_\bw_\ba_\bp(a);\n-516 }\n-517\n-_\b5_\b1_\b9 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& a)\n-520 noexcept(noexcept(std::declval().storage_ = a.storage_))\n-521 {\n-522 [[maybe_unused]] const auto &guard =\n-523 Imp::makeScopeGuard([this]{ syncBaseArray(); });\n-524 storage_ = a.storage_;\n-525 return *this;\n-526 }\n-527\n-_\b5_\b2_\b9 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br&& a)\n-530 noexcept(noexcept(std::declval().swap(a)))\n-531 {\n-532 _\bs_\bw_\ba_\bp(a);\n-533 return *this;\n-534 }\n-535\n-_\b5_\b3_\b7 void _\bs_\bw_\ba_\bp(_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br &other)\n-538 noexcept(noexcept(\n-539 std::declval().storage_.swap(other.storage_)))\n-540 {\n-541 [[maybe_unused]] const auto &guard = Imp::makeScopeGuard([&]{\n-542 syncBaseArray();\n-543 other.syncBaseArray();\n-544 });\n-545 storage_.swap(other.storage_);\n-546 }\n-547\n-_\b5_\b4_\b9 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be& k)\n-550 {\n-551 // forward to operator= in base class\n-552 (static_cast&>(*this)) = k;\n-553 return *this;\n-554 }\n-555\n-556 private:\n-557 void syncBaseArray() noexcept\n-558 {\n-559 this->p = storage_.data();\n-560 this->n = storage_.size();\n-561 }\n-562\n-563 std::vector storage_;\n-564 };\n-565\n-571 template\n-_\b5_\b7_\b2 struct FieldTraits< _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br >\n-573 {\n-_\b5_\b7_\b4 typedef typename FieldTraits::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-_\b5_\b7_\b5 typedef typename FieldTraits::real_type _\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be;\n-576 };\n-582 template\n-_\b5_\b8_\b3 std::ostream& _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<_\b (std::ostream& s, const _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bA_\b>& v)\n-584 {\n-585 typedef typename _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bK_\b,_\b _\bA_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be size_type;\n-586\n-587 for (size_type i=0; i\n-616#else\n-617 template >\n-618#endif\n-619 class BlockVectorWindow : public Imp::block_vector_unmanaged\n-620 {\n-621 public:\n-622\n-623 //===== type definitions and constants\n-624\n-626 using field_type = typename Imp::BlockTraits::field_type;\n-627\n-629 typedef B block_type;\n-630\n-632 typedef A allocator_type;\n-633\n-635 typedef typename A::size_type size_type;\n-636\n-638 typedef typename Imp::block_vector_unmanaged::Iterator\n-Iterator;\n-639\n-641 typedef typename Imp::block_vector_unmanaged::ConstIterator\n-ConstIterator;\n-642\n-643\n-644 //===== constructors and such\n-646 BlockVectorWindow () : Imp::block_vector_unmanaged()\n-647 { }\n-648\n-650 BlockVectorWindow (B* _p, size_type _n)\n-651 {\n-652 this->n = _n;\n-653 this->p = _p;\n-654 }\n-655\n-657 BlockVectorWindow (const BlockVectorWindow& a)\n-658 {\n-659 this->n = a.n;\n-660 this->p = a.p;\n-661 }\n-662\n-664 BlockVectorWindow& operator= (const BlockVectorWindow& a)\n-665 {\n-666 // check correct size\n-667#ifdef DUNE_ISTL_WITH_CHECKING\n-668 if (this->n!=a.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n-669#endif\n-670\n-671 if (&a!=this) // check if this and a are different objects\n-672 {\n-673 // copy data\n-674 for (size_type i=0; in; i++) this->p[i]=a.p[i];\n-675 }\n-676 return *this;\n-677 }\n-678\n-680 BlockVectorWindow& operator= (const field_type& k)\n-681 {\n-682 (static_cast&>(*this)) = k;\n-683 return *this;\n-684 }\n-685\n-687 operator BlockVector() const {\n-688 auto bv = BlockVector(this->n);\n-689\n-690 std::copy(this->begin(), this->end(), bv.begin());\n-691\n-692 return bv;\n-693 }\n-694\n-695 //===== window manipulation methods\n-696\n-698 void set (size_type _n, B* _p)\n-699 {\n-700 this->n = _n;\n-701 this->p = _p;\n-702 }\n-703\n-705 void setsize (size_type _n)\n-706 {\n-707 this->n = _n;\n-708 }\n-709\n-711 void setptr (B* _p)\n-712 {\n-713 this->p = _p;\n-714 }\n-715\n-717 B* getptr ()\n-718 {\n-719 return this->p;\n-720 }\n-721\n-723 size_type getsize () const\n-724 {\n-725 return this->n;\n-726 }\n-727 };\n-728\n-729\n-730\n-741 template\n-742 class compressed_block_vector_unmanaged : public\n-compressed_base_array_unmanaged\n-743 {\n-744 public:\n-745\n-746 //===== type definitions and constants\n-747\n-749 using field_type = typename Imp::BlockTraits::field_type;\n-750\n-752 typedef B block_type;\n-753\n-755 typedef typename compressed_base_array_unmanaged::iterator Iterator;\n-756\n-758 typedef typename compressed_base_array_unmanaged::const_iterator\n-ConstIterator;\n-759\n-761 typedef ST size_type;\n-762\n-763 //===== assignment from scalar\n-764\n-765 compressed_block_vector_unmanaged& operator= (const field_type& k)\n-766 {\n-767 for (size_type i=0; in; i++)\n-768 (this->p)[i] = k;\n-769 return *this;\n-770 }\n-771\n-772\n-773 //===== vector space arithmetic\n-774\n-776 template\n-777 compressed_block_vector_unmanaged& operator+= (const V& y)\n-778 {\n-779#ifdef DUNE_ISTL_WITH_CHECKING\n-780 if (!includesindexset(y)) DUNE_THROW(ISTLError,\"index set mismatch\");\n-781#endif\n-782 for (size_type i=0; ioperator[](y.j[i]) += y.p[i];\n-783 return *this;\n-784 }\n-785\n-787 template\n-788 compressed_block_vector_unmanaged& operator-= (const V& y)\n-789 {\n-790#ifdef DUNE_ISTL_WITH_CHECKING\n-791 if (!includesindexset(y)) DUNE_THROW(ISTLError,\"index set mismatch\");\n-792#endif\n-793 for (size_type i=0; ioperator[](y.j[i]) -= y.p[i];\n-794 return *this;\n-795 }\n-796\n-798 template\n-799 compressed_block_vector_unmanaged& axpy (const field_type& a, const V& y)\n-800 {\n-801#ifdef DUNE_ISTL_WITH_CHECKING\n-802 if (!includesindexset(y)) DUNE_THROW(ISTLError,\"index set mismatch\");\n-803#endif\n-804 for (size_type i=0; in; ++i) (this->p)[i] *= k;\n-813 return *this;\n-814 }\n-815\n-817 compressed_block_vector_unmanaged& operator/= (const field_type& k)\n-818 {\n-819 for (size_type i=0; in; ++i) (this->p)[i] /= k;\n-820 return *this;\n-821 }\n-822\n-823\n-824 //===== Euclidean scalar product\n-825\n-827 field_type operator* (const compressed_block_vector_unmanaged& y) const\n-828 {\n-829#ifdef DUNE_ISTL_WITH_CHECKING\n-830 if (!includesindexset(y) || !y.includesindexset(*this) )\n-831 DUNE_THROW(ISTLError,\"index set mismatch\");\n-832#endif\n-833 field_type sum=0;\n-834 for (size_type i=0; in; ++i)\n-835 sum += (this->p)[i] * y[(this->j)[i]];\n-836 return sum;\n-837 }\n-838\n-839\n-840 //===== norms\n-841\n-843 typename FieldTraits::real_type one_norm () const\n-844 {\n-845 typename FieldTraits::real_type sum=0;\n-846 for (size_type i=0; in; ++i) sum += (this->p)[i].one_norm();\n-847 return sum;\n-848 }\n-849\n-851 typename FieldTraits::real_type one_norm_real () const\n-852 {\n-853 typename FieldTraits::real_type sum=0;\n-854 for (size_type i=0; in; ++i) sum += (this->p)[i].one_norm_real();\n-855 return sum;\n-856 }\n-857\n-859 typename FieldTraits::real_type two_norm () const\n-860 {\n-861 using std::sqrt;\n-862 typename FieldTraits::real_type sum=0;\n-863 for (size_type i=0; in; ++i) sum += (this->p)[i].two_norm2();\n-864 return sqrt(sum);\n-865 }\n-866\n-868 typename FieldTraits::real_type two_norm2 () const\n-869 {\n-870 typename FieldTraits::real_type sum=0;\n-871 for (size_type i=0; in; ++i) sum += (this->p)[i].two_norm2();\n-872 return sum;\n-873 }\n-874\n-876 template ::value, int>::type = 0>\n-878 typename FieldTraits::real_type infinity_norm() const {\n-879 using real_type = typename FieldTraits::real_type;\n-880 using std::max;\n-881\n-882 real_type norm = 0;\n-883 for (auto const &x : *this) {\n-884 real_type const a = x.infinity_norm();\n-885 norm = max(a, norm);\n-886 }\n-887 return norm;\n-888 }\n-889\n-891 template ::value, int>::type = 0>\n-893 typename FieldTraits::real_type infinity_norm_real() const {\n-894 using real_type = typename FieldTraits::real_type;\n-895 using std::max;\n-896\n-897 real_type norm = 0;\n-898 for (auto const &x : *this) {\n-899 real_type const a = x.infinity_norm_real();\n-900 norm = max(a, norm);\n-901 }\n-902 return norm;\n-903 }\n-904\n-906 template ::value, int>::type = 0>\n-908 typename FieldTraits::real_type infinity_norm() const {\n-909 using real_type = typename FieldTraits::real_type;\n-910 using std::max;\n-911\n-912 real_type norm = 0;\n-913 real_type isNaN = 1;\n-914 for (auto const &x : *this) {\n-915 real_type const a = x.infinity_norm();\n-916 norm = max(a, norm);\n-917 isNaN += a;\n-918 }\n-919 return norm * (isNaN / isNaN);\n-920 }\n-921\n-923 template ::value, int>::type = 0>\n-925 typename FieldTraits::real_type infinity_norm_real() const {\n-926 using real_type = typename FieldTraits::real_type;\n-927 using std::max;\n-928\n-929 real_type norm = 0;\n-930 real_type isNaN = 1;\n-931 for (auto const &x : *this) {\n-932 real_type const a = x.infinity_norm_real();\n-933 norm = max(a, norm);\n-934 isNaN += a;\n-935 }\n-936 return norm * (isNaN / isNaN);\n-937 }\n-938\n-939 //===== sizes\n-940\n-942 size_type N () const\n-943 {\n-944 return this->n;\n-945 }\n-946\n-948 size_type dim () const\n-949 {\n-950 size_type d=0;\n-951 for (size_type i=0; in; i++)\n-952 d += (this->p)[i].dim();\n-953 return d;\n-954 }\n-955\n-956 protected:\n-958 compressed_block_vector_unmanaged () :\n-compressed_base_array_unmanaged()\n-959 { }\n-960\n-962 template\n-963 bool includesindexset (const V& y)\n-964 {\n-965 typename V::ConstIterator e=this->end();\n-966 for (size_type i=0; ifind(y.j[i])==e)\n-968 return false;\n-969 return true;\n-970 }\n-971 };\n-972\n-973\n-992 template\n-993 class CompressedBlockVectorWindow : public\n-compressed_block_vector_unmanaged\n-994 {\n-995 public:\n-996\n-997 //===== type definitions and constants\n-998\n-1000 using field_type = typename Imp::BlockTraits::field_type;\n-1001\n-1003 typedef B block_type;\n-1004\n-1006 typedef ST size_type;\n-1007\n-1009 typedef typename compressed_block_vector_unmanaged::Iterator\n-Iterator;\n-1010\n-1012 typedef typename compressed_block_vector_unmanaged::ConstIterator\n-ConstIterator;\n-1013\n-1014\n-1015 //===== constructors and such\n-1017 CompressedBlockVectorWindow () : compressed_block_vector_unmanaged()\n-1018 { }\n-1019\n-1021 CompressedBlockVectorWindow (B* _p, size_type* _j, size_type _n)\n-1022 {\n-1023 this->n = _n;\n-1024 this->p = _p;\n-1025 this->j = _j;\n-1026 }\n-1027\n-1029 CompressedBlockVectorWindow (const CompressedBlockVectorWindow& a)\n-1030 {\n-1031 this->n = a.n;\n-1032 this->p = a.p;\n-1033 this->j = a.j;\n-1034 }\n-1035\n-1037 CompressedBlockVectorWindow& operator= (const CompressedBlockVectorWindow&\n-a)\n-1038 {\n-1039 // check correct size\n-1040#ifdef DUNE_ISTL_WITH_CHECKING\n-1041 if (this->n!=a.N()) DUNE_THROW(ISTLError,\"vector size mismatch\");\n-1042#endif\n-1043\n-1044 if (&a!=this) // check if this and a are different objects\n-1045 {\n-1046 // copy data\n-1047 for (size_type i=0; in; i++) this->p[i]=a.p[i];\n-1048 for (size_type i=0; in; i++) this->j[i]=a.j[i];\n-1049 }\n-1050 return *this;\n-1051 }\n-1052\n-1054 CompressedBlockVectorWindow& operator= (const field_type& k)\n-1055 {\n-1056 (static_cast&>(*this)) = k;\n-1057 return *this;\n-1058 }\n-1059\n-1060\n-1061 //===== window manipulation methods\n-1062\n-1064 void set (size_type _n, B* _p, size_type* _j)\n-1065 {\n-1066 this->n = _n;\n-1067 this->p = _p;\n-1068 this->j = _j;\n-1069 }\n-1070\n-1072 void setsize (size_type _n)\n-1073 {\n-1074 this->n = _n;\n-1075 }\n-1076\n-1078 void setptr (B* _p)\n-1079 {\n-1080 this->p = _p;\n-1081 }\n-1082\n-1084 void setindexptr (size_type* _j)\n-1085 {\n-1086 this->j = _j;\n-1087 }\n-1088\n-1090 B* getptr ()\n-1091 {\n-1092 return this->p;\n-1093 }\n-1094\n-1096 size_type* getindexptr ()\n-1097 {\n-1098 return this->j;\n-1099 }\n-1100\n-1102 const B* getptr () const\n-1103 {\n-1104 return this->p;\n-1105 }\n-1106\n-1108 const size_type* getindexptr () const\n-1109 {\n-1110 return this->j;\n-1111 }\n-1113 size_type getsize () const\n-1114 {\n-1115 return this->n;\n-1116 }\n-1117 };\n-1118\n-1119} // end namespace 'Imp'\n-1120\n-1121\n-1123 template\n-1124 struct AutonomousValueType>\n-1125 {\n-1126 using type = BlockVector;\n-1127 };\n-1128\n-1129\n-1130} // end namespace 'Dune'\n-1131\n-1132#endif\n-_\bb_\ba_\bs_\be_\ba_\br_\br_\ba_\by_\b._\bh_\bh\n-Implements several basic array containers.\n-_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n-Helper functions for determining the vector/matrix block level.\n-_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bs_\bt_\bd\n-STL namespace.\n+326 } // Amg\n+327} // Dune\n+328\n+329#endif\n+_\bp_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br_\bs_\b._\bh_\bh\n+Define general preconditioner interface.\n+_\ba_\bm_\bg_\b._\bh_\bh\n+The AMG preconditioner.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(Domain &v, const Range &d)\n+Apply one step of the preconditioner to the system A(v)=d.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:300\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n+X Domain\n+The domain type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:87\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bK_\bA_\bM_\bG\n+KAMG(OperatorHierarchy &matrices, CoarseSolver &coarseSolver, const\n+SmootherArgs &smootherArgs, const Parameters &parms, std::size_t\n+maxLevelKrylovSteps=3, double minDefectReduction=1e-1)\n+Construct a new amg with a specific coarse solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:233\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bm_\ba_\bx_\bl_\be_\bv_\be_\bl_\bs\n+std::size_t maxlevels()\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:320\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+SmootherTraits< Smoother >::Arguments SmootherArgs\n+The argument type for the construction of the smoother.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:100\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+M Operator\n+The matrix operator type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:73\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bp_\bo_\bs_\bt\n+void post(Domain &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:293\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be\n+X Range\n+The range type.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:89\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\br_\be_\bs_\bm_\bo_\bo_\bt_\bh\n+void presmooth(LevelContext &levelContext, size_t steps)\n+Apply pre smoothing on the current level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:406\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bp_\bo_\bs_\bt_\bs_\bm_\bo_\bo_\bt_\bh\n+void postsmooth(LevelContext &levelContext, size_t steps)\n+Apply post smoothing on the current level.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn smoother.hh:428\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bp_\br_\be\n+void pre(Domain &x, Range &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:253\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:194\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+PI ParallelInformation\n+The type of the parallel information. Either OwnerOverlapCommunication or\n+another type describing the...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:80\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b<_\b<\n-std::ostream & operator<<(std::ostream &s, const BlockVector< K, A > &v)\n-Send BlockVector to an output stream.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:583\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-A vector of blocks with memory management.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-BlockVector()\n-makes empty vector\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:418\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Imp::block_vector_unmanaged< B, size_type >::ConstIterator ConstIterator\n-make iterators available as types\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:413\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\be_\br_\bv_\be\n-void reserve(size_type capacity)\n-Reserve space.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:468\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-BlockVector(BlockVector &&a) noexcept(noexcept(std::declval< BlockVector >\n-().swap(a)))\n-move constructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:512\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-BlockVector(size_type _n)\n-make vector with _n components\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:424\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\br_\be_\bs_\bi_\bz_\be\n-void resize(size_type size)\n-Resize the vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:496\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n-Imp::block_vector_unmanaged< B, size_type >::Iterator Iterator\n-make iterators available as types\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:410\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-BlockVector(const BlockVector &a) noexcept(noexcept(std::declval< BlockVector >\n-().storage_=a.storage_))\n-copy constructor\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:504\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\ba_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b__\bt_\by_\bp_\be\n-A allocator_type\n-export the allocator type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:404\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-BlockVector & operator=(const BlockVector &a) noexcept(noexcept(std::declval<\n-BlockVector >().storage_=a.storage_))\n-assignment\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:519\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< B >::field_type field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:398\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-The type for the index access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:407\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-BlockVector(std::initializer_list< B > const &l)\n-Construct from a std::initializer_list.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:430\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bp_\ba_\bc_\bi_\bt_\by\n-size_type capacity() const\n-Get the capacity of the vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:481\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-BlockVector(size_type _n, S _capacity)\n-Make vector with _n components but preallocating capacity components.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:448\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n-B block_type\n-export the type representing the components\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:401\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bw_\ba_\bp\n-void swap(BlockVector &other) noexcept(noexcept(std::declval< BlockVector & >\n-().storage_.swap(other.storage_)))\n-swap operation\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:537\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\be_\ba_\bl_\b__\bt_\by_\bp_\be\n-FieldTraits< B >::real_type real_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:575\n-_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bT_\br_\ba_\bi_\bt_\bs_\b<_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\b _\bB_\b,_\b _\bA_\b _\b>_\b _\b>_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-FieldTraits< B >::field_type field_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:574\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG\n+an algebraic multigrid method using a Krylov-cycle.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:140\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bD_\bo_\bm_\ba_\bi_\bn\n+Amg::Domain Domain\n+the type of the domain.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:157\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bS_\bm_\bo_\bo_\bt_\bh_\be_\br_\bA_\br_\bg_\bs\n+Amg::SmootherArgs SmootherArgs\n+The type of the arguments for construction of the smoothers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:153\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n+Amg::ParallelInformation ParallelInformation\n+the type of the parallelinformation to use.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:151\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bC_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br\n+Amg::CoarseSolver CoarseSolver\n+The type of the coarse solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:149\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+Amg::OperatorHierarchy OperatorHierarchy\n+The type of the hierarchy of operators.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:147\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bR_\ba_\bn_\bg_\be\n+Amg::Range Range\n+The type of the range.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:159\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Amg::ScalarProduct ScalarProduct\n+The type of the scalar product.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:163\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bA_\bm_\bg\n+AMG< M, X, S, PI, A > Amg\n+The type of the underlying AMG.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:143\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Amg::Operator Operator\n+the type of the lineatr operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:155\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+Amg::ParallelInformationHierarchy ParallelInformationHierarchy\n+The type of the hierarchy of parallel information.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:161\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:166\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bM_\bG_\b:_\b:_\bK_\br_\by_\bl_\bo_\bv_\bS_\bo_\bl_\bv_\be_\br\n+K KrylovSolver\n+The type of the Krylov solver for the cycle.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:145\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd\n+Two grid operator for AMG with Krylov cycle.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bp_\br_\be\n+void pre(typename AMG::Domain &x, typename AMG::Range &b)\n+Prepare the preconditioner.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:58\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd\n+KAmgTwoGrid(AMG &amg, std::shared_ptr< InverseOperator< Domain, Range > >\n+coarseSolver)\n+Constructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\b~_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd\n+~KAmgTwoGrid()\n+Destructor.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:110\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bp_\bo_\bs_\bt\n+void post(typename AMG::Domain &x)\n+Clean up.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:62\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const\n+Category of the preconditioner (see SolverCategory::Category)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:41\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bs_\be_\bt_\bL_\be_\bv_\be_\bl_\bC_\bo_\bn_\bt_\be_\bx_\bt\n+void setLevelContext(std::shared_ptr< typename AMG::LevelContext > p)\n+Set the level context pointer.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:104\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\bc_\bo_\ba_\br_\bs_\be_\bS_\bo_\bl_\bv_\be_\br\n+InverseOperator< Domain, Range > * coarseSolver()\n+Get a pointer to the coarse grid solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bK_\bA_\bm_\bg_\bT_\bw_\bo_\bG_\br_\bi_\bd_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+void apply(typename AMG::Domain &v, const typename AMG::Range &d)\n+Apply one step of the preconditioner to the system A(v)=d.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn kamg.hh:66\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bA_\bM_\bG\n+Parallel algebraic multigrid based on agglomeration.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn amg.hh:65\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by_\b<_\b _\bP_\ba_\br_\ba_\bl_\bl_\be_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b,_\b _\bA_\bl_\bl_\bo_\bc_\ba_\bt_\bo_\br_\b _\b>_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+LevelIterator< Hierarchy< ParallelInformation, Allocator >, ParallelInformation\n+> Iterator\n+Type of the mutable iterator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn hierarchy.hh:216\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bH_\bi_\be_\br_\ba_\br_\bc_\bh_\by\n+The hierarchies build by the coarsening process.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixhierarchy.hh:61\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bP_\ba_\br_\ba_\bm_\be_\bt_\be_\br_\bs\n+All parameters for AMG.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn parameters.hh:416\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\br_\be_\bc_\bo_\bn_\bd_\bi_\bt_\bi_\bo_\bn_\be_\br\n+Base class for matrix free definition of preconditioners.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn preconditioner.hh:33\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\ba_\br_\bP_\br_\bo_\bd_\bu_\bc_\bt\n+Base class for scalar product and norm computation.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scalarproducts.hh:52\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Abstract base class for all solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:101\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bG_\be_\bn_\be_\br_\ba_\bl_\bi_\bz_\be_\bd_\bP_\bC_\bG_\bS_\bo_\bl_\bv_\be_\br\n+Generalized preconditioned conjugate gradient solver.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvers.hh:1307\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00221.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00221.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: solvertype.hh File Reference\n+dune-istl: poweriteration.hh File Reference\n \n \n \n \n \n \n \n@@ -65,44 +65,55 @@\n \n \n \n \n \n \n \n
    \n \n-
    solvertype.hh File Reference
    \n+
    poweriteration.hh File Reference
    \n
    \n
    \n-\n-

    Templates characterizing the type of a solver. \n-More...

    \n-\n+
    #include <cstddef>
    \n+#include <cmath>
    \n+#include <type_traits>
    \n+#include <iostream>
    \n+#include <limits>
    \n+#include <ios>
    \n+#include <iomanip>
    \n+#include <memory>
    \n+#include <string>
    \n+#include <dune/common/exceptions.hh>
    \n+#include <dune/istl/blocklevel.hh>
    \n+#include <dune/istl/operators.hh>
    \n+#include <dune/istl/solvercategory.hh>
    \n+#include <dune/istl/solvertype.hh>
    \n+#include <dune/istl/istlexception.hh>
    \n+#include <dune/istl/io.hh>
    \n+#include <dune/istl/solvers.hh>
    \n+
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n-\n+\n+\n \n

    \n Classes

    struct  Dune::IsDirectSolver< Solver >
     
    struct  Dune::StoresColumnCompressed< Solver >
    class  Dune::PowerIteration_Algorithms< BCRSMatrix, BlockVector >
     Iterative eigenvalue algorithms based on power iteration. More...
     
    \n \n \n \n

    \n Namespaces

    namespace  Dune
     
    \n-

    Detailed Description

    \n-

    Templates characterizing the type of a solver.

    \n-
    \n+\n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,22 +1,36 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n+ * _\be_\bi_\bg_\be_\bn_\bv_\ba_\bl_\bu_\be\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-solvertype.hh File Reference\n-Templates characterizing the type of a solver. _\bM_\bo_\br_\be_\b._\b._\b.\n+poweriteration.hh File Reference\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bo_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b<_\b _\bS_\bo_\bl_\bv_\be_\br_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b<_\b _\bS_\bo_\bl_\bv_\be_\br_\b _\b>\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b _\b>\n+\u00a0 Iterative eigenvalue algorithms based on power iteration. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Templates characterizing the type of a solver.\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00221_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00221_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: solvertype.hh Source File\n+dune-istl: poweriteration.hh Source File\n \n \n \n \n \n \n \n@@ -70,58 +70,875 @@\n \n \n \n \n \n \n \n
    \n-
    solvertype.hh
    \n+
    poweriteration.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_SOLVERTYPE_HH
    \n-
    6#define DUNE_ISTL_SOLVERTYPE_HH
    \n+
    5#ifndef DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
    \n+
    6#define DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
    \n
    7
    \n-
    12namespace Dune
    \n-
    13{
    \n-
    14 template<typename Solver>
    \n-
    \n-\n-
    16 {
    \n-
    17 enum
    \n-
    18 {
    \n-
    24 value =false
    \n-
    25 };
    \n-
    26 };
    \n-
    \n-
    27
    \n-
    28 template<typename Solver>
    \n-
    \n-\n-
    30 {
    \n-
    31 enum
    \n-
    32 {
    \n-
    36 value = false
    \n-
    37 };
    \n-
    38 };
    \n+
    8#include <cstddef> // provides std::size_t
    \n+
    9#include <cmath> // provides std::sqrt, std::abs
    \n+
    10
    \n+
    11#include <type_traits> // provides std::is_same
    \n+
    12#include <iostream> // provides std::cout, std::endl
    \n+
    13#include <limits> // provides std::numeric_limits
    \n+
    14#include <ios> // provides std::left, std::ios::left
    \n+
    15#include <iomanip> // provides std::setw, std::resetiosflags
    \n+
    16#include <memory> // provides std::unique_ptr
    \n+
    17#include <string> // provides std::string
    \n+
    18
    \n+
    19#include <dune/common/exceptions.hh> // provides DUNE_THROW(...)
    \n+
    20
    \n+
    21#include <dune/istl/blocklevel.hh> // provides Dune::blockLevel
    \n+
    22#include <dune/istl/operators.hh> // provides Dune::LinearOperator
    \n+
    23#include <dune/istl/solvercategory.hh> // provides Dune::SolverCategory::sequential
    \n+
    24#include <dune/istl/solvertype.hh> // provides Dune::IsDirectSolver
    \n+
    25#include <dune/istl/operators.hh> // provides Dune::MatrixAdapter
    \n+
    26#include <dune/istl/istlexception.hh> // provides Dune::ISTLError
    \n+
    27#include <dune/istl/io.hh> // provides Dune::printvector(...)
    \n+
    28#include <dune/istl/solvers.hh> // provides Dune::InverseOperatorResult
    \n+
    29
    \n+
    30namespace Dune
    \n+
    31{
    \n+
    32
    \n+
    37 namespace Impl {
    \n+
    45 template <class X, class Y = X>
    \n+
    46 class ScalingLinearOperator : public Dune::LinearOperator<X,Y>
    \n+
    47 {
    \n+
    48 public:
    \n+
    49 typedef X domain_type;
    \n+
    50 typedef Y range_type;
    \n+
    51 typedef typename X::field_type field_type;
    \n+
    52
    \n+
    53 ScalingLinearOperator (field_type immutable_scaling,
    \n+
    54 const field_type& mutable_scaling)
    \n+
    55 : immutable_scaling_(immutable_scaling),
    \n+
    56 mutable_scaling_(mutable_scaling)
    \n+
    57 {}
    \n+
    58
    \n+
    59 virtual void apply (const X& x, Y& y) const
    \n+
    60 {
    \n+
    61 y = x;
    \n+
    62 y *= immutable_scaling_*mutable_scaling_;
    \n+
    63 }
    \n+
    64
    \n+
    65 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
    \n+
    66 {
    \n+
    67 X temp(x);
    \n+
    68 temp *= immutable_scaling_*mutable_scaling_;
    \n+
    69 y.axpy(alpha,temp);
    \n+
    70 }
    \n+
    71
    \n+\n+
    74 {
    \n+\n+
    76 }
    \n+
    77
    \n+
    78 protected:
    \n+
    79 const field_type immutable_scaling_;
    \n+
    80 const field_type& mutable_scaling_;
    \n+
    81 };
    \n+
    82
    \n+
    83
    \n+
    92 template <class OP1, class OP2>
    \n+
    93 class LinearOperatorSum
    \n+
    94 : public Dune::LinearOperator<typename OP1::domain_type,
    \n+
    95 typename OP1::range_type>
    \n+
    96 {
    \n+
    97 public:
    \n+
    98 typedef typename OP1::domain_type domain_type;
    \n+
    99 typedef typename OP1::range_type range_type;
    \n+
    100 typedef typename domain_type::field_type field_type;
    \n+
    101
    \n+
    102 LinearOperatorSum (const OP1& op1, const OP2& op2)
    \n+
    103 : op1_(op1), op2_(op2)
    \n+
    104 {
    \n+
    105 static_assert(std::is_same<typename OP2::domain_type,domain_type>::value,
    \n+
    106 "Domain type of both operators doesn't match!");
    \n+
    107 static_assert(std::is_same<typename OP2::range_type,range_type>::value,
    \n+
    108 "Range type of both operators doesn't match!");
    \n+
    109 }
    \n+
    110
    \n+
    111 virtual void apply (const domain_type& x, range_type& y) const
    \n+
    112 {
    \n+
    113 op1_.apply(x,y);
    \n+
    114 op2_.applyscaleadd(1.0,x,y);
    \n+
    115 }
    \n+
    116
    \n+
    117 virtual void applyscaleadd (field_type alpha,
    \n+
    118 const domain_type& x, range_type& y) const
    \n+
    119 {
    \n+
    120 range_type temp(y);
    \n+
    121 op1_.apply(x,temp);
    \n+
    122 op2_.applyscaleadd(1.0,x,temp);
    \n+
    123 y.axpy(alpha,temp);
    \n+
    124 }
    \n+
    125
    \n+
    127 virtual SolverCategory::Category category() const
    \n+
    128 {
    \n+\n+
    130 }
    \n+
    131
    \n+
    132 protected:
    \n+
    133 const OP1& op1_;
    \n+
    134 const OP2& op2_;
    \n+
    135 };
    \n+
    136 } // end namespace Impl
    \n+
    137
    \n+
    174 template <typename BCRSMatrix, typename BlockVector>
    \n+
    \n+\n+
    176 {
    \n+
    177 protected:
    \n+
    178 // Type definitions for type of iteration operator (m_ - mu_*I)
    \n+\n+\n+
    181 typedef Impl::ScalingLinearOperator<BlockVector> ScalingOperator;
    \n+
    182 typedef Impl::LinearOperatorSum<MatrixOperator,ScalingOperator> OperatorSum;
    \n+
    183
    \n+
    184 public:
    \n+\n+
    187
    \n+\n+
    190
    \n+
    191 public:
    \n+
    \n+\n+
    207 const unsigned int nIterationsMax = 1000,
    \n+
    208 const unsigned int verbosity_level = 0)
    \n+
    209 : m_(m), nIterationsMax_(nIterationsMax),
    \n+
    210 verbosity_level_(verbosity_level),
    \n+
    211 mu_(0.0),
    \n+\n+
    213 scalingOperator_(-1.0,mu_),
    \n+\n+
    215 nIterations_(0),
    \n+
    216 title_(" PowerIteration_Algorithms: "),
    \n+
    217 blank_(title_.length(),' ')
    \n+
    218 {
    \n+
    219 // assert that BCRSMatrix type has blocklevel 2
    \n+
    220 static_assert
    \n+
    221 (blockLevel<BCRSMatrix>() == 2,
    \n+
    222 "Only BCRSMatrices with blocklevel 2 are supported.");
    \n+
    223
    \n+
    224 // assert that BCRSMatrix type has square blocks
    \n+
    225 static_assert
    \n+
    226 (BCRSMatrix::block_type::rows == BCRSMatrix::block_type::cols,
    \n+
    227 "Only BCRSMatrices with square blocks are supported.");
    \n+
    228
    \n+
    229 // assert that m_ is square
    \n+
    230 const int nrows = m_.M() * BCRSMatrix::block_type::rows;
    \n+
    231 const int ncols = m_.N() * BCRSMatrix::block_type::cols;
    \n+
    232 if (nrows != ncols)
    \n+
    233 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
    \n+
    234 << nrows << "x" << ncols << ").");
    \n+
    235 }
    \n
    \n-
    39} // end namespace Dune
    \n-
    40#endif
    \n+
    236
    \n+\n+
    241
    \n+\n+\n+
    247
    \n+
    \n+
    260 inline void applyPowerIteration (const Real& epsilon,
    \n+
    261 BlockVector& x, Real& lambda) const
    \n+
    262 {
    \n+
    263 // print verbosity information
    \n+
    264 if (verbosity_level_ > 0)
    \n+
    265 std::cout << title_
    \n+
    266 << "Performing power iteration approximating "
    \n+
    267 << "the dominant eigenvalue." << std::endl;
    \n+
    268
    \n+
    269 // allocate memory for auxiliary variables
    \n+
    270 BlockVector y(x);
    \n+
    271 BlockVector temp(x);
    \n+
    272
    \n+
    273 // perform power iteration
    \n+
    274 x *= (1.0 / x.two_norm());
    \n+
    275 m_.mv(x,y);
    \n+
    276 Real r_norm = std::numeric_limits<Real>::max();
    \n+
    277 nIterations_ = 0;
    \n+
    278 while (r_norm > epsilon)
    \n+
    279 {
    \n+
    280 // update and check number of iterations
    \n+\n+
    282 DUNE_THROW(Dune::ISTLError,"Power iteration did not converge "
    \n+
    283 << "in " << nIterationsMax_ << " iterations "
    \n+
    284 << "(\u2551residual\u2551_2 = " << r_norm << ", epsilon = "
    \n+
    285 << epsilon << ").");
    \n+
    286
    \n+
    287 // do one iteration of the power iteration algorithm
    \n+
    288 // (use that y = m_ * x)
    \n+
    289 x = y;
    \n+
    290 x *= (1.0 / y.two_norm());
    \n+
    291
    \n+
    292 // get approximated eigenvalue lambda via the Rayleigh quotient
    \n+
    293 m_.mv(x,y);
    \n+
    294 lambda = x * y;
    \n+
    295
    \n+
    296 // get norm of residual (use that y = m_ * x)
    \n+
    297 temp = y;
    \n+
    298 temp.axpy(-lambda,x);
    \n+
    299 r_norm = temp.two_norm();
    \n+
    300
    \n+
    301 // print verbosity information
    \n+
    302 if (verbosity_level_ > 1)
    \n+
    303 std::cout << blank_ << std::left
    \n+
    304 << "iteration " << std::setw(3) << nIterations_
    \n+
    305 << " (\u2551residual\u2551_2 = " << std::setw(11) << r_norm
    \n+
    306 << "): \u03bb = " << lambda << std::endl
    \n+
    307 << std::resetiosflags(std::ios::left);
    \n+
    308 }
    \n+
    309
    \n+
    310 // print verbosity information
    \n+
    311 if (verbosity_level_ > 0)
    \n+
    312 {
    \n+
    313 std::cout << blank_ << "Result ("
    \n+
    314 << "#iterations = " << nIterations_ << ", "
    \n+
    315 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n+
    316 << "\u03bb = " << lambda << std::endl;
    \n+
    317 if (verbosity_level_ > 2)
    \n+
    318 {
    \n+
    319 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n+
    320 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n+
    321 }
    \n+
    322 }
    \n+
    323 }
    \n+
    \n+
    324
    \n+
    353 template <typename ISTLLinearSolver,
    \n+
    354 bool avoidLinSolverCrime = false>
    \n+
    \n+
    355 inline void applyInverseIteration (const Real& epsilon,
    \n+
    356 ISTLLinearSolver& solver,
    \n+
    357 BlockVector& x, Real& lambda) const
    \n+
    358 {
    \n+
    359 constexpr Real gamma = 0.0;
    \n+
    360 applyInverseIteration(gamma,epsilon,solver,x,lambda);
    \n+
    361 }
    \n+
    \n+
    362
    \n+
    392 template <typename ISTLLinearSolver,
    \n+
    393 bool avoidLinSolverCrime = false>
    \n+
    \n+
    394 inline void applyInverseIteration (const Real& gamma,
    \n+
    395 const Real& epsilon,
    \n+
    396 ISTLLinearSolver& solver,
    \n+
    397 BlockVector& x, Real& lambda) const
    \n+
    398 {
    \n+
    399 // print verbosity information
    \n+
    400 if (verbosity_level_ > 0)
    \n+
    401 {
    \n+
    402 std::cout << title_;
    \n+
    403 if (gamma == 0.0)
    \n+
    404 std::cout << "Performing inverse iteration approximating "
    \n+
    405 << "the least dominant eigenvalue." << std::endl;
    \n+
    406 else
    \n+
    407 std::cout << "Performing inverse iteration with shift "
    \n+
    408 << "gamma = " << gamma << " approximating the "
    \n+
    409 << "eigenvalue closest to gamma." << std::endl;
    \n+
    410 }
    \n+
    411
    \n+
    412 // initialize iteration operator,
    \n+
    413 // initialize iteration matrix when needed
    \n+
    414 updateShiftMu(gamma,solver);
    \n+
    415
    \n+
    416 // allocate memory for linear solver statistics
    \n+
    417 Dune::InverseOperatorResult solver_statistics;
    \n+
    418
    \n+
    419 // allocate memory for auxiliary variables
    \n+
    420 BlockVector y(x);
    \n+
    421 Real y_norm;
    \n+
    422 BlockVector temp(x);
    \n+
    423
    \n+
    424 // perform inverse iteration with shift
    \n+
    425 x *= (1.0 / x.two_norm());
    \n+
    426 Real r_norm = std::numeric_limits<Real>::max();
    \n+
    427 nIterations_ = 0;
    \n+
    428 while (r_norm > epsilon)
    \n+
    429 {
    \n+
    430 // update and check number of iterations
    \n+\n+
    432 DUNE_THROW(Dune::ISTLError,"Inverse iteration "
    \n+
    433 << (gamma != 0.0 ? "with shift " : "") << "did not "
    \n+
    434 << "converge in " << nIterationsMax_ << " iterations "
    \n+
    435 << "(\u2551residual\u2551_2 = " << r_norm << ", epsilon = "
    \n+
    436 << epsilon << ").");
    \n+
    437
    \n+
    438 // do one iteration of the inverse iteration with shift algorithm,
    \n+
    439 // part 1: solve (m_ - gamma*I) * y = x for y
    \n+
    440 // (protect x from being changed)
    \n+
    441 temp = x;
    \n+
    442 solver.apply(y,temp,solver_statistics);
    \n+
    443
    \n+
    444 // get norm of y
    \n+
    445 y_norm = y.two_norm();
    \n+
    446
    \n+
    447 // compile time switch between accuracy and efficiency
    \n+
    448 if (avoidLinSolverCrime)
    \n+
    449 {
    \n+
    450 // get approximated eigenvalue lambda via the Rayleigh quotient
    \n+
    451 // (use that x_new = y / y_norm)
    \n+
    452 m_.mv(y,temp);
    \n+
    453 lambda = (y * temp) / (y_norm * y_norm);
    \n+
    454
    \n+
    455 // get norm of residual
    \n+
    456 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)
    \n+
    457 temp.axpy(-lambda,y);
    \n+
    458 r_norm = temp.two_norm() / y_norm;
    \n+
    459 }
    \n+
    460 else
    \n+
    461 {
    \n+
    462 // get approximated eigenvalue lambda via the Rayleigh quotient
    \n+
    463 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)
    \n+
    464 lambda = gamma + (y * x) / (y_norm * y_norm);
    \n+
    465
    \n+
    466 // get norm of residual
    \n+
    467 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)
    \n+
    468 temp = x; temp.axpy(gamma-lambda,y);
    \n+
    469 r_norm = temp.two_norm() / y_norm;
    \n+
    470 }
    \n+
    471
    \n+
    472 // do one iteration of the inverse iteration with shift algorithm,
    \n+
    473 // part 2: update x
    \n+
    474 x = y;
    \n+
    475 x *= (1.0 / y_norm);
    \n+
    476
    \n+
    477 // print verbosity information
    \n+
    478 if (verbosity_level_ > 1)
    \n+
    479 std::cout << blank_ << std::left
    \n+
    480 << "iteration " << std::setw(3) << nIterations_
    \n+
    481 << " (\u2551residual\u2551_2 = " << std::setw(11) << r_norm
    \n+
    482 << "): \u03bb = " << lambda << std::endl
    \n+
    483 << std::resetiosflags(std::ios::left);
    \n+
    484 }
    \n+
    485
    \n+
    486 // print verbosity information
    \n+
    487 if (verbosity_level_ > 0)
    \n+
    488 {
    \n+
    489 std::cout << blank_ << "Result ("
    \n+
    490 << "#iterations = " << nIterations_ << ", "
    \n+
    491 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n+
    492 << "\u03bb = " << lambda << std::endl;
    \n+
    493 if (verbosity_level_ > 2)
    \n+
    494 {
    \n+
    495 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n+
    496 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n+
    497 }
    \n+
    498 }
    \n+
    499 }
    \n+
    \n+
    500
    \n+
    531 template <typename ISTLLinearSolver,
    \n+
    532 bool avoidLinSolverCrime = false>
    \n+
    \n+
    533 inline void applyRayleighQuotientIteration (const Real& epsilon,
    \n+
    534 ISTLLinearSolver& solver,
    \n+
    535 BlockVector& x, Real& lambda) const
    \n+
    536 {
    \n+
    537 // print verbosity information
    \n+
    538 if (verbosity_level_ > 0)
    \n+
    539 std::cout << title_
    \n+
    540 << "Performing Rayleigh quotient iteration for "
    \n+
    541 << "estimated eigenvalue " << lambda << "." << std::endl;
    \n+
    542
    \n+
    543 // allocate memory for linear solver statistics
    \n+
    544 Dune::InverseOperatorResult solver_statistics;
    \n+
    545
    \n+
    546 // allocate memory for auxiliary variables
    \n+
    547 BlockVector y(x);
    \n+
    548 Real y_norm;
    \n+
    549 Real lambda_update;
    \n+
    550 BlockVector temp(x);
    \n+
    551
    \n+
    552 // perform Rayleigh quotient iteration
    \n+
    553 x *= (1.0 / x.two_norm());
    \n+
    554 Real r_norm = std::numeric_limits<Real>::max();
    \n+
    555 nIterations_ = 0;
    \n+
    556 while (r_norm > epsilon)
    \n+
    557 {
    \n+
    558 // update and check number of iterations
    \n+\n+
    560 DUNE_THROW(Dune::ISTLError,"Rayleigh quotient iteration did not "
    \n+
    561 << "converge in " << nIterationsMax_ << " iterations "
    \n+
    562 << "(\u2551residual\u2551_2 = " << r_norm << ", epsilon = "
    \n+
    563 << epsilon << ").");
    \n+
    564
    \n+
    565 // update iteration operator,
    \n+
    566 // update iteration matrix when needed
    \n+
    567 updateShiftMu(lambda,solver);
    \n+
    568
    \n+
    569 // do one iteration of the Rayleigh quotient iteration algorithm,
    \n+
    570 // part 1: solve (m_ - lambda*I) * y = x for y
    \n+
    571 // (protect x from being changed)
    \n+
    572 temp = x;
    \n+
    573 solver.apply(y,temp,solver_statistics);
    \n+
    574
    \n+
    575 // get norm of y
    \n+
    576 y_norm = y.two_norm();
    \n+
    577
    \n+
    578 // compile time switch between accuracy and efficiency
    \n+
    579 if (avoidLinSolverCrime)
    \n+
    580 {
    \n+
    581 // get approximated eigenvalue lambda via the Rayleigh quotient
    \n+
    582 // (use that x_new = y / y_norm)
    \n+
    583 m_.mv(y,temp);
    \n+
    584 lambda = (y * temp) / (y_norm * y_norm);
    \n+
    585
    \n+
    586 // get norm of residual
    \n+
    587 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)
    \n+
    588 temp.axpy(-lambda,y);
    \n+
    589 r_norm = temp.two_norm() / y_norm;
    \n+
    590 }
    \n+
    591 else
    \n+
    592 {
    \n+
    593 // get approximated eigenvalue lambda via the Rayleigh quotient
    \n+
    594 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)
    \n+
    595 lambda_update = (y * x) / (y_norm * y_norm);
    \n+
    596 lambda += lambda_update;
    \n+
    597
    \n+
    598 // get norm of residual
    \n+
    599 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)
    \n+
    600 temp = x; temp.axpy(-lambda_update,y);
    \n+
    601 r_norm = temp.two_norm() / y_norm;
    \n+
    602 }
    \n+
    603
    \n+
    604 // do one iteration of the Rayleigh quotient iteration algorithm,
    \n+
    605 // part 2: update x
    \n+
    606 x = y;
    \n+
    607 x *= (1.0 / y_norm);
    \n+
    608
    \n+
    609 // print verbosity information
    \n+
    610 if (verbosity_level_ > 1)
    \n+
    611 std::cout << blank_ << std::left
    \n+
    612 << "iteration " << std::setw(3) << nIterations_
    \n+
    613 << " (\u2551residual\u2551_2 = " << std::setw(11) << r_norm
    \n+
    614 << "): \u03bb = " << lambda << std::endl
    \n+
    615 << std::resetiosflags(std::ios::left);
    \n+
    616 }
    \n+
    617
    \n+
    618 // print verbosity information
    \n+
    619 if (verbosity_level_ > 0)
    \n+
    620 {
    \n+
    621 std::cout << blank_ << "Result ("
    \n+
    622 << "#iterations = " << nIterations_ << ", "
    \n+
    623 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n+
    624 << "\u03bb = " << lambda << std::endl;
    \n+
    625 if (verbosity_level_ > 2)
    \n+
    626 {
    \n+
    627 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n+
    628 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n+
    629 }
    \n+
    630 }
    \n+
    631 }
    \n+
    \n+
    632
    \n+
    689 template <typename ISTLLinearSolver,
    \n+
    690 bool avoidLinSolverCrime = false>
    \n+
    \n+
    691 inline void applyTLIMEIteration (const Real& gamma, const Real& eta,
    \n+
    692 const Real& epsilon,
    \n+
    693 ISTLLinearSolver& solver,
    \n+
    694 const Real& delta, const std::size_t& m,
    \n+
    695 bool& extrnl,
    \n+
    696 BlockVector& x, Real& lambda) const
    \n+
    697 {
    \n+
    698 // use same variable names as in [Szyld, 1988]
    \n+
    699 BlockVector& x_s = x;
    \n+
    700 Real& mu_s = lambda;
    \n+
    701
    \n+
    702 // print verbosity information
    \n+
    703 if (verbosity_level_ > 0)
    \n+
    704 std::cout << title_
    \n+
    705 << "Performing TLIME iteration for "
    \n+
    706 << "estimated eigenvalue in the "
    \n+
    707 << "interval (" << gamma - eta << ","
    \n+
    708 << gamma + eta << ")." << std::endl;
    \n+
    709
    \n+
    710 // allocate memory for linear solver statistics
    \n+
    711 Dune::InverseOperatorResult solver_statistics;
    \n+
    712
    \n+
    713 // allocate memory for auxiliary variables
    \n+
    714 bool doRQI;
    \n+
    715 Real mu;
    \n+
    716 BlockVector y(x_s);
    \n+
    717 Real omega;
    \n+
    718 Real mu_s_old;
    \n+
    719 Real mu_s_update;
    \n+
    720 BlockVector temp(x_s);
    \n+
    721 Real q_norm, r_norm;
    \n+
    722
    \n+
    723 // perform TLIME iteration
    \n+
    724 x_s *= (1.0 / x_s.two_norm());
    \n+
    725 extrnl = true;
    \n+
    726 doRQI = false;
    \n+
    727 r_norm = std::numeric_limits<Real>::max();
    \n+
    728 nIterations_ = 0;
    \n+
    729 while (r_norm > epsilon)
    \n+
    730 {
    \n+
    731 // update and check number of iterations
    \n+\n+
    733 DUNE_THROW(Dune::ISTLError,"TLIME iteration did not "
    \n+
    734 << "converge in " << nIterationsMax_
    \n+
    735 << " iterations (\u2551residual\u2551_2 = " << r_norm
    \n+
    736 << ", epsilon = " << epsilon << ").");
    \n+
    737
    \n+
    738 // set shift for next iteration according to inverse iteration
    \n+
    739 // with shift (II) resp. Rayleigh quotient iteration (RQI)
    \n+
    740 if (doRQI)
    \n+
    741 mu = mu_s;
    \n+
    742 else
    \n+
    743 mu = gamma;
    \n+
    744
    \n+
    745 // update II/RQI iteration operator,
    \n+
    746 // update II/RQI iteration matrix when needed
    \n+
    747 updateShiftMu(mu,solver);
    \n+
    748
    \n+
    749 // do one iteration of the II/RQI algorithm,
    \n+
    750 // part 1: solve (m_ - mu*I) * y = x for y
    \n+
    751 temp = x_s;
    \n+
    752 solver.apply(y,temp,solver_statistics);
    \n+
    753
    \n+
    754 // do one iteration of the II/RQI algorithm,
    \n+
    755 // part 2: compute omega
    \n+
    756 omega = (1.0 / y.two_norm());
    \n+
    757
    \n+
    758 // backup the old Rayleigh quotient
    \n+
    759 mu_s_old = mu_s;
    \n+
    760
    \n+
    761 // compile time switch between accuracy and efficiency
    \n+
    762 if (avoidLinSolverCrime)
    \n+
    763 {
    \n+
    764 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue
    \n+
    765 // (use that x_new = y * omega)
    \n+
    766 m_.mv(y,temp);
    \n+
    767 mu_s = (y * temp) * (omega * omega);
    \n+
    768
    \n+
    769 // get norm of "the residual with respect to the shift used by II",
    \n+
    770 // use normal representation of q
    \n+
    771 // (use that x_new = y * omega, use that temp = m_ * y)
    \n+
    772 temp.axpy(-gamma,y);
    \n+
    773 q_norm = temp.two_norm() * omega;
    \n+
    774
    \n+
    775 // get norm of "the residual with respect to the Rayleigh quotient"
    \n+
    776 r_norm = q_norm*q_norm - (gamma-mu_s)*(gamma-mu_s);
    \n+
    777 // prevent that truncation errors invalidate the norm
    \n+
    778 // (we don't want to calculate sqrt of a negative number)
    \n+
    779 if (r_norm >= 0)
    \n+
    780 {
    \n+
    781 // use relation between the norms of r and q for efficiency
    \n+
    782 r_norm = std::sqrt(r_norm);
    \n+
    783 }
    \n+
    784 else
    \n+
    785 {
    \n+
    786 // use relation between r and q
    \n+
    787 // (use that x_new = y * omega, use that temp = (m_ - gamma*I) * y = q / omega)
    \n+
    788 temp.axpy(gamma-mu_s,y);
    \n+
    789 r_norm = temp.two_norm() * omega;
    \n+
    790 }
    \n+
    791 }
    \n+
    792 else
    \n+
    793 {
    \n+
    794 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue
    \n+
    795 if (!doRQI)
    \n+
    796 {
    \n+
    797 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = x_s)
    \n+
    798 mu_s = gamma + (y * x_s) * (omega * omega);
    \n+
    799 }
    \n+
    800 else
    \n+
    801 {
    \n+
    802 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y = x_s)
    \n+
    803 mu_s_update = (y * x_s) * (omega * omega);
    \n+
    804 mu_s += mu_s_update;
    \n+
    805 }
    \n+
    806
    \n+
    807 // get norm of "the residual with respect to the shift used by II"
    \n+
    808 if (!doRQI)
    \n+
    809 {
    \n+
    810 // use special representation of q in the II case
    \n+
    811 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = x_s)
    \n+
    812 q_norm = omega;
    \n+
    813 }
    \n+
    814 else
    \n+
    815 {
    \n+
    816 // use special representation of q in the RQI case
    \n+
    817 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y = x_s)
    \n+
    818 temp = x_s; temp.axpy(mu_s-gamma,y);
    \n+
    819 q_norm = temp.two_norm() * omega;
    \n+
    820 }
    \n+
    821
    \n+
    822 // get norm of "the residual with respect to the Rayleigh quotient"
    \n+
    823 // don't use efficient relation between the norms of r and q, as
    \n+
    824 // this relation seems to yield a less accurate r_norm in the case
    \n+
    825 // where linear solver crime is admitted
    \n+
    826 if (!doRQI)
    \n+
    827 {
    \n+
    828 // (use that x_new = y * omega and use that (m_ - gamma*I) * y = x_s)
    \n+
    829 temp = x_s; temp.axpy(gamma-lambda,y);
    \n+
    830 r_norm = temp.two_norm() * omega;
    \n+
    831 }
    \n+
    832 else
    \n+
    833 {
    \n+
    834 // (use that x_new = y * omega and use that (m_ - mu_s_old*I) * y = x_s)
    \n+
    835 temp = x_s; temp.axpy(-mu_s_update,y);
    \n+
    836 r_norm = temp.two_norm() * omega;
    \n+
    837 }
    \n+
    838 }
    \n+
    839
    \n+
    840 // do one iteration of the II/RQI algorithm,
    \n+
    841 // part 3: update x
    \n+
    842 x_s = y; x_s *= omega;
    \n+
    843
    \n+
    844 // // for relative residual norm mode, scale with mu_s^{-1}
    \n+
    845 // r_norm /= std::abs(mu_s);
    \n+
    846
    \n+
    847 // print verbosity information
    \n+
    848 if (verbosity_level_ > 1)
    \n+
    849 std::cout << blank_ << "iteration "
    \n+
    850 << std::left << std::setw(3) << nIterations_
    \n+
    851 << " (" << (doRQI ? "RQI," : "II, ")
    \n+
    852 << " " << (doRQI ? "\u2014>" : " ") << " "
    \n+
    853 << "\u2551r\u2551_2 = " << std::setw(11) << r_norm
    \n+
    854 << ", " << (doRQI ? " " : "\u2014>") << " "
    \n+
    855 << "\u2551q\u2551_2 = " << std::setw(11) << q_norm
    \n+
    856 << "): \u03bb = " << lambda << std::endl
    \n+
    857 << std::resetiosflags(std::ios::left);
    \n+
    858
    \n+
    859 // check if the eigenvalue closest to gamma lies in J
    \n+
    860 if (!doRQI && q_norm < eta)
    \n+
    861 {
    \n+
    862 // J is not free of eigenvalues
    \n+
    863 extrnl = false;
    \n+
    864
    \n+
    865 // by theory we know now that mu_s also lies in J
    \n+
    866 assert(std::abs(mu_s-gamma) < eta);
    \n+
    867
    \n+
    868 // switch to RQI
    \n+
    869 doRQI = true;
    \n+
    870 }
    \n+
    871
    \n+
    872 // revert to II if J is not free of eigenvalues but
    \n+
    873 // at some point mu_s falls back again outside J
    \n+
    874 if (!extrnl && doRQI && std::abs(mu_s-gamma) >= eta)
    \n+
    875 doRQI = false;
    \n+
    876
    \n+
    877 // if eigenvalue closest to gamma does not lie in J use RQI
    \n+
    878 // solely to accelerate the convergence to this eigenvalue
    \n+
    879 // when II has become stationary
    \n+
    880 if (extrnl && !doRQI)
    \n+
    881 {
    \n+
    882 // switch to RQI if the relative change of the Rayleigh
    \n+
    883 // quotient indicates that II has become stationary
    \n+
    884 if (nIterations_ >= m &&
    \n+
    885 std::abs(mu_s - mu_s_old) / std::abs(mu_s) < delta)
    \n+
    886 doRQI = true;
    \n+
    887 }
    \n+
    888 }
    \n+
    889
    \n+
    890 // // compute final residual and lambda again (paranoia....)
    \n+
    891 // m_.mv(x_s,temp);
    \n+
    892 // mu_s = x_s * temp;
    \n+
    893 // temp.axpy(-mu_s,x_s);
    \n+
    894 // r_norm = temp.two_norm();
    \n+
    895 // // r_norm /= std::abs(mu_s);
    \n+
    896
    \n+
    897 // print verbosity information
    \n+
    898 if (verbosity_level_ > 0)
    \n+
    899 {
    \n+
    900 if (extrnl)
    \n+
    901 std::cout << blank_ << "Interval "
    \n+
    902 << "(" << gamma - eta << "," << gamma + eta
    \n+
    903 << ") is free of eigenvalues, approximating "
    \n+
    904 << "the closest eigenvalue." << std::endl;
    \n+
    905 std::cout << blank_ << "Result ("
    \n+
    906 << "#iterations = " << nIterations_ << ", "
    \n+
    907 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n+
    908 << "\u03bb = " << lambda << std::endl;
    \n+
    909 if (verbosity_level_ > 2)
    \n+
    910 {
    \n+
    911 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n+
    912 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n+
    913 }
    \n+
    914 }
    \n+
    915 }
    \n+
    \n+
    916
    \n+
    \n+\n+
    926 {
    \n+
    927 // return iteration operator
    \n+
    928 return itOperator_;
    \n+
    929 }
    \n+
    \n+
    930
    \n+
    \n+
    945 inline const BCRSMatrix& getIterationMatrix () const
    \n+
    946 {
    \n+
    947 // create iteration matrix on demand
    \n+
    948 if (!itMatrix_)
    \n+
    949 itMatrix_ = std::make_unique<BCRSMatrix>(m_);
    \n+
    950
    \n+
    951 // return iteration matrix
    \n+
    952 return *itMatrix_;
    \n+
    953 }
    \n+
    \n+
    954
    \n+
    \n+
    959 inline unsigned int getIterationCount () const
    \n+
    960 {
    \n+
    961 if (nIterations_ == 0)
    \n+
    962 DUNE_THROW(Dune::ISTLError,"No algorithm applied, yet.");
    \n+
    963
    \n+
    964 return nIterations_;
    \n+
    965 }
    \n+
    \n+
    966
    \n+
    967 protected:
    \n+
    982 template <typename ISTLLinearSolver>
    \n+
    \n+
    983 inline void updateShiftMu (const Real& mu,
    \n+
    984 ISTLLinearSolver& solver) const
    \n+
    985 {
    \n+
    986 // do nothing if new shift equals the old one
    \n+
    987 if (mu == mu_) return;
    \n+
    988
    \n+
    989 // update shift mu_, i.e. update iteration operator
    \n+
    990 mu_ = mu;
    \n+
    991
    \n+
    992 // update iteration matrix when needed
    \n+
    993 if (itMatrix_)
    \n+
    994 {
    \n+
    995 // iterate over entries in iteration matrix diagonal
    \n+
    996 constexpr int rowBlockSize = BCRSMatrix::block_type::rows;
    \n+
    997 constexpr int colBlockSize = BCRSMatrix::block_type::cols;
    \n+
    998 for (typename BCRSMatrix::size_type i = 0;
    \n+
    999 i < itMatrix_->M()*rowBlockSize; ++i)
    \n+
    1000 {
    \n+
    1001 // access m_[i,i] where i is the flat index of a row/column
    \n+
    1002 const Real& m_entry = m_
    \n+
    1003 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];
    \n+
    1004 // access *itMatrix[i,i] where i is the flat index of a row/column
    \n+
    1005 Real& entry = (*itMatrix_)
    \n+
    1006 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];
    \n+
    1007 // change current entry in iteration matrix diagonal
    \n+
    1008 entry = m_entry - mu_;
    \n+
    1009 }
    \n+
    1010 // notify linear solver about change of the iteration matrix object
    \n+\n+
    1012 (solver,*itMatrix_);
    \n+
    1013 }
    \n+
    1014 }
    \n+
    \n+
    1015
    \n+
    1016 protected:
    \n+
    1017 // parameters related to iterative eigenvalue algorithms
    \n+\n+
    1019 const unsigned int nIterationsMax_;
    \n+
    1020
    \n+
    1021 // verbosity setting
    \n+
    1022 const unsigned int verbosity_level_;
    \n+
    1023
    \n+
    1024 // shift mu_ used by iteration operator/matrix (m_ - mu_*I)
    \n+
    1025 mutable Real mu_;
    \n+
    1026
    \n+
    1027 // iteration operator (m_ - mu_*I), passing shift mu_ by reference
    \n+\n+\n+\n+
    1031
    \n+
    1032 // iteration matrix (m_ - mu_*I), provided on demand when needed
    \n+
    1033 // (e.g. for preconditioning)
    \n+
    1034 mutable std::unique_ptr<BCRSMatrix> itMatrix_;
    \n+
    1035
    \n+
    1036 // memory for storing temporary variables (mutable as they shall
    \n+
    1037 // just be effectless auxiliary variables of the const apply*(...)
    \n+
    1038 // methods)
    \n+
    1039 mutable unsigned int nIterations_;
    \n+
    1040
    \n+
    1041 // constants for printing verbosity information
    \n+
    1042 const std::string title_;
    \n+
    1043 const std::string blank_;
    \n+
    1044 };
    \n+
    \n+
    1045
    \n+
    1048} // namespace Dune
    \n+
    1049
    \n+
    1050#endif // DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
    \n+
    Some generic functions for pretty printing vectors and matrices.
    \n+\n+
    Implementations of the inverse operator interface.
    \n+
    Helper functions for determining the vector/matrix block level.
    \n+\n+
    Templates characterizing the type of a solver.
    \n+
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n+
    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
    \n
    Definition allocator.hh:11
    \n-
    Definition solvertype.hh:16
    \n-
    @ value
    Whether this is a direct solver.
    Definition solvertype.hh:24
    \n-
    Definition solvertype.hh:30
    \n-
    @ value
    whether the solver internally uses column compressed storage
    Definition solvertype.hh:36
    \n+
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n+
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n+
    size_type M() const
    number of columns (counted in blocks)
    Definition bcrsmatrix.hh:2007
    \n+
    void mv(const X &x, Y &y) const
    y = A x
    Definition bcrsmatrix.hh:1641
    \n+
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n+
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n+
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bvector.hh:398
    \n+
    Iterative eigenvalue algorithms based on power iteration.
    Definition poweriteration.hh:176
    \n+
    std::unique_ptr< BCRSMatrix > itMatrix_
    Definition poweriteration.hh:1034
    \n+
    PowerIteration_Algorithms(const PowerIteration_Algorithms &)=delete
    \n+
    Impl::ScalingLinearOperator< BlockVector > ScalingOperator
    Definition poweriteration.hh:181
    \n+
    const std::string blank_
    Definition poweriteration.hh:1043
    \n+
    Impl::LinearOperatorSum< MatrixOperator, ScalingOperator > OperatorSum
    Definition poweriteration.hh:182
    \n+
    Dune::MatrixAdapter< BCRSMatrix, BlockVector, BlockVector > MatrixOperator
    Definition poweriteration.hh:180
    \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....
    Definition poweriteration.hh:355
    \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...
    Definition poweriteration.hh:691
    \n+
    IterationOperator & getIterationOperator()
    Return the iteration operator (m_ - mu_*I).
    Definition poweriteration.hh:925
    \n+
    OperatorSum itOperator_
    Definition poweriteration.hh:1030
    \n+
    const BCRSMatrix & m_
    Definition poweriteration.hh:1018
    \n+
    PowerIteration_Algorithms(const BCRSMatrix &m, const unsigned int nIterationsMax=1000, const unsigned int verbosity_level=0)
    Construct from required parameters.
    Definition poweriteration.hh:206
    \n+
    const unsigned int nIterationsMax_
    Definition poweriteration.hh:1019
    \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....
    Definition poweriteration.hh:260
    \n+
    OperatorSum IterationOperator
    Type of iteration operator (m_ - mu_*I)
    Definition poweriteration.hh:189
    \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...
    Definition poweriteration.hh:533
    \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...
    Definition poweriteration.hh:394
    \n+
    const ScalingOperator scalingOperator_
    Definition poweriteration.hh:1029
    \n+
    void updateShiftMu(const Real &mu, ISTLLinearSolver &solver) const
    Update shift mu_, i.e. update iteration operator/matrix (m_ - mu_*I).
    Definition poweriteration.hh:983
    \n+
    PowerIteration_Algorithms & operator=(const PowerIteration_Algorithms &)=delete
    \n+
    unsigned int getIterationCount() const
    Return the number of iterations in last application of an algorithm.
    Definition poweriteration.hh:959
    \n+
    const MatrixOperator matrixOperator_
    Definition poweriteration.hh:1028
    \n+
    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
    \n+
    unsigned int nIterations_
    Definition poweriteration.hh:1039
    \n+
    const unsigned int verbosity_level_
    Definition poweriteration.hh:1022
    \n+
    const std::string title_
    Definition poweriteration.hh:1042
    \n+
    BlockVector::field_type Real
    Type of underlying field.
    Definition poweriteration.hh:186
    \n+
    Real mu_
    Definition poweriteration.hh:1025
    \n+
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    A linear operator.
    Definition operators.hh:69
    \n+
    X::field_type field_type
    The field type of the operator.
    Definition operators.hh:76
    \n+
    virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0
    apply operator to x, scale and add:
    \n+
    virtual SolverCategory::Category category() const =0
    Category of the linear operator (see SolverCategory::Category)
    \n+
    Y range_type
    The type of the range of the operator.
    Definition operators.hh:74
    \n+
    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...
    \n+
    X domain_type
    The type of the domain of the operator.
    Definition operators.hh:72
    \n+
    Adapter to turn a matrix into a linear operator.
    Definition operators.hh:136
    \n+
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n+
    static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
    Definition solver.hh:526
    \n+
    Category
    Definition solvercategory.hh:23
    \n+
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,53 +1,993 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-solvertype.hh\n+ * _\be_\bi_\bg_\be_\bn_\bv_\ba_\bl_\bu_\be\n+poweriteration.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_SOLVERTYPE_HH\n-6#define DUNE_ISTL_SOLVERTYPE_HH\n+5#ifndef DUNE_ISTL_EIGENVALUE_POWERITERATION_HH\n+6#define DUNE_ISTL_EIGENVALUE_POWERITERATION_HH\n 7\n-12namespace _\bD_\bu_\bn_\be\n-13{\n-14 template\n-_\b1_\b5 struct _\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n-16 {\n-17 enum\n-18 {\n-24 _\bv_\ba_\bl_\bu_\be =false\n-_\b2_\b5 };\n-26 };\n-27\n-28 template\n-_\b2_\b9 struct _\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n-30 {\n-31 enum\n-32 {\n-36 _\bv_\ba_\bl_\bu_\be = false\n-_\b3_\b7 };\n-38 };\n-39} // end namespace Dune\n-40#endif\n+8#include // provides std::size_t\n+9#include // provides std::sqrt, std::abs\n+10\n+11#include // provides std::is_same\n+12#include // provides std::cout, std::endl\n+13#include // provides std::numeric_limits\n+14#include // provides std::left, std::ios::left\n+15#include // provides std::setw, std::resetiosflags\n+16#include // provides std::unique_ptr\n+17#include // provides std::string\n+18\n+19#include // provides DUNE_THROW(...)\n+20\n+21#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh> // provides Dune::blockLevel\n+22#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh> // provides Dune::LinearOperator\n+23#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh> // provides Dune::SolverCategory::\n+sequential\n+24#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh> // provides Dune::IsDirectSolver\n+25#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh> // provides Dune::MatrixAdapter\n+26#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh> // provides Dune::ISTLError\n+27#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bo_\b._\bh_\bh> // provides Dune::printvector(...)\n+28#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh> // provides Dune::InverseOperatorResult\n+29\n+30namespace _\bD_\bu_\bn_\be\n+31{\n+32\n+37 namespace Impl {\n+45 template \n+46 class ScalingLinearOperator : public _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+47 {\n+48 public:\n+49 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n+50 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n+51 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n+52\n+53 ScalingLinearOperator (field_type immutable_scaling,\n+54 const field_type& mutable_scaling)\n+55 : immutable_scaling_(immutable_scaling),\n+56 mutable_scaling_(mutable_scaling)\n+57 {}\n+58\n+59 virtual void _\ba_\bp_\bp_\bl_\by (const X& x, Y& y) const\n+60 {\n+61 y = x;\n+62 y *= immutable_scaling_*mutable_scaling_;\n+63 }\n+64\n+65 virtual void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (field_type alpha, const X& x, Y& y) const\n+66 {\n+67 X temp(x);\n+68 temp *= immutable_scaling_*mutable_scaling_;\n+69 y.axpy(alpha,temp);\n+70 }\n+71\n+73 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+74 {\n+75 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+76 }\n+77\n+78 protected:\n+79 const field_type immutable_scaling_;\n+80 const field_type& mutable_scaling_;\n+81 };\n+82\n+83\n+92 template \n+93 class LinearOperatorSum\n+94 : public _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+96 {\n+97 public:\n+98 typedef typename OP1::domain_type domain_type;\n+99 typedef typename OP1::range_type range_type;\n+100 typedef typename domain_type::field_type field_type;\n+101\n+102 LinearOperatorSum (const OP1& op1, const OP2& op2)\n+103 : op1_(op1), op2_(op2)\n+104 {\n+105 static_assert(std::is_same::value,\n+106 \"Domain type of both operators doesn't match!\");\n+107 static_assert(std::is_same::value,\n+108 \"Range type of both operators doesn't match!\");\n+109 }\n+110\n+111 virtual void _\ba_\bp_\bp_\bl_\by (const domain_type& x, range_type& y) const\n+112 {\n+113 op1_.apply(x,y);\n+114 op2_.applyscaleadd(1.0,x,y);\n+115 }\n+116\n+117 virtual void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (field_type alpha,\n+118 const domain_type& x, range_type& y) const\n+119 {\n+120 range_type temp(y);\n+121 op1_.apply(x,temp);\n+122 op2_.applyscaleadd(1.0,x,temp);\n+123 y.axpy(alpha,temp);\n+124 }\n+125\n+127 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n+128 {\n+129 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n+130 }\n+131\n+132 protected:\n+133 const OP1& op1_;\n+134 const OP2& op2_;\n+135 };\n+136 } // end namespace Impl\n+137\n+174 template \n+_\b1_\b7_\b5 class _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n+176 {\n+177 protected:\n+178 // Type definitions for type of iteration operator (m_ - mu_*I)\n+179 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b>\n+_\b1_\b8_\b0 _\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b8_\b1 typedef Impl::ScalingLinearOperator _\bS_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n+_\b1_\b8_\b2 typedef Impl::LinearOperatorSum\n+_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bS_\bu_\bm;\n+183\n+184 public:\n+_\b1_\b8_\b6 typedef typename _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bR_\be_\ba_\bl;\n+187\n+_\b1_\b8_\b9 typedef _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bS_\bu_\bm _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n+190\n+191 public:\n+_\b2_\b0_\b6 _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& m,\n+207 const unsigned int nIterationsMax = 1000,\n+208 const unsigned int verbosity_level = 0)\n+209 : _\bm_\b_(m), _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_(nIterationsMax),\n+210 _\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_(verbosity_level),\n+211 _\bm_\bu_\b_(0.0),\n+212 _\bm_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_(_\bm_\b_),\n+213 _\bs_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_(-1.0,_\bm_\bu_\b_),\n+214 _\bi_\bt_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_(_\bm_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_,_\bs_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_),\n+215 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_(0),\n+216 _\bt_\bi_\bt_\bl_\be_\b_(\" PowerIteration_Algorithms: \"),\n+217 _\bb_\bl_\ba_\bn_\bk_\b_(_\bt_\bi_\bt_\bl_\be_\b_.length(),' ')\n+218 {\n+219 // assert that BCRSMatrix type has blocklevel 2\n+220 static_assert\n+221 (blockLevel() == 2,\n+222 \"Only BCRSMatrices with blocklevel 2 are supported.\");\n+223\n+224 // assert that BCRSMatrix type has square blocks\n+225 static_assert\n+226 (BCRSMatrix::block_type::rows == BCRSMatrix::block_type::cols,\n+227 \"Only BCRSMatrices with square blocks are supported.\");\n+228\n+229 // assert that m_ is square\n+230 const int nrows = _\bm_\b_._\bM() * BCRSMatrix::block_type::rows;\n+231 const int ncols = _\bm_\b_._\bN() * BCRSMatrix::block_type::cols;\n+232 if (nrows != ncols)\n+233 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix is not square (\"\n+234 << nrows << \"x\" << ncols << \").\");\n+235 }\n+236\n+_\b2_\b4_\b0 _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs (const _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs&) = delete;\n+241\n+245 _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs&\n+_\b2_\b4_\b6 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs&) = delete;\n+247\n+_\b2_\b6_\b0 inline void _\ba_\bp_\bp_\bl_\by_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn (const _\bR_\be_\ba_\bl& epsilon,\n+261 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n+262 {\n+263 // print verbosity information\n+264 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+265 std::cout << _\bt_\bi_\bt_\bl_\be_\b_\n+266 << \"Performing power iteration approximating \"\n+267 << \"the dominant eigenvalue.\" << std::endl;\n+268\n+269 // allocate memory for auxiliary variables\n+270 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br y(x);\n+271 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br temp(x);\n+272\n+273 // perform power iteration\n+274 x *= (1.0 / x.two_norm());\n+275 _\bm_\b_._\bm_\bv(x,y);\n+276 _\bR_\be_\ba_\bl r_norm = std::numeric_limits::max();\n+277 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = 0;\n+278 while (r_norm > epsilon)\n+279 {\n+280 // update and check number of iterations\n+281 if (++_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ > _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_)\n+282 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Power iteration did not converge \"\n+283 << \"in \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_ << \" iterations \"\n+284 << \"(\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \", epsilon = \"\n+285 << epsilon << \").\");\n+286\n+287 // do one iteration of the power iteration algorithm\n+288 // (use that y = m_ * x)\n+289 x = y;\n+290 x *= (1.0 / y.two_norm());\n+291\n+292 // get approximated eigenvalue lambda via the Rayleigh quotient\n+293 _\bm_\b_._\bm_\bv(x,y);\n+294 lambda = x * y;\n+295\n+296 // get norm of residual (use that y = m_ * x)\n+297 temp = y;\n+298 temp.axpy(-lambda,x);\n+299 r_norm = temp.two_norm();\n+300\n+301 // print verbosity information\n+302 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n+303 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << std::left\n+304 << \"iteration \" << std::setw(3) << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n+305 << \" (\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << std::setw(11) << r_norm\n+306 << \"): \u00ce\u00bb = \" << lambda << std::endl\n+307 << std::resetiosflags(std::ios::left);\n+308 }\n+309\n+310 // print verbosity information\n+311 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+312 {\n+313 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n+314 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n+315 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n+316 << \"\u00ce\u00bb = \" << lambda << std::endl;\n+317 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n+318 {\n+319 // print approximated eigenvector via DUNE-ISTL I/O methods\n+320 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n+321 }\n+322 }\n+323 }\n+324\n+353 template \n+_\b3_\b5_\b5 inline void _\ba_\bp_\bp_\bl_\by_\bI_\bn_\bv_\be_\br_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn (const _\bR_\be_\ba_\bl& epsilon,\n+356 ISTLLinearSolver& solver,\n+357 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n+358 {\n+359 constexpr _\bR_\be_\ba_\bl gamma = 0.0;\n+360 _\ba_\bp_\bp_\bl_\by_\bI_\bn_\bv_\be_\br_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn(gamma,epsilon,solver,x,lambda);\n+361 }\n+362\n+392 template \n+_\b3_\b9_\b4 inline void _\ba_\bp_\bp_\bl_\by_\bI_\bn_\bv_\be_\br_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn (const _\bR_\be_\ba_\bl& gamma,\n+395 const _\bR_\be_\ba_\bl& epsilon,\n+396 ISTLLinearSolver& solver,\n+397 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n+398 {\n+399 // print verbosity information\n+400 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+401 {\n+402 std::cout << _\bt_\bi_\bt_\bl_\be_\b_;\n+403 if (gamma == 0.0)\n+404 std::cout << \"Performing inverse iteration approximating \"\n+405 << \"the least dominant eigenvalue.\" << std::endl;\n+406 else\n+407 std::cout << \"Performing inverse iteration with shift \"\n+408 << \"gamma = \" << gamma << \" approximating the \"\n+409 << \"eigenvalue closest to gamma.\" << std::endl;\n+410 }\n+411\n+412 // initialize iteration operator,\n+413 // initialize iteration matrix when needed\n+414 _\bu_\bp_\bd_\ba_\bt_\be_\bS_\bh_\bi_\bf_\bt_\bM_\bu(gamma,solver);\n+415\n+416 // allocate memory for linear solver statistics\n+417 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt solver_statistics;\n+418\n+419 // allocate memory for auxiliary variables\n+420 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br y(x);\n+421 _\bR_\be_\ba_\bl y_norm;\n+422 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br temp(x);\n+423\n+424 // perform inverse iteration with shift\n+425 x *= (1.0 / x.two_norm());\n+426 _\bR_\be_\ba_\bl r_norm = std::numeric_limits::max();\n+427 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = 0;\n+428 while (r_norm > epsilon)\n+429 {\n+430 // update and check number of iterations\n+431 if (++_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ > _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_)\n+432 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Inverse iteration \"\n+433 << (gamma != 0.0 ? \"with shift \" : \"\") << \"did not \"\n+434 << \"converge in \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_ << \" iterations \"\n+435 << \"(\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \", epsilon = \"\n+436 << epsilon << \").\");\n+437\n+438 // do one iteration of the inverse iteration with shift algorithm,\n+439 // part 1: solve (m_ - gamma*I) * y = x for y\n+440 // (protect x from being changed)\n+441 temp = x;\n+442 solver.apply(y,temp,solver_statistics);\n+443\n+444 // get norm of y\n+445 y_norm = y.two_norm();\n+446\n+447 // compile time switch between accuracy and efficiency\n+448 if (avoidLinSolverCrime)\n+449 {\n+450 // get approximated eigenvalue lambda via the Rayleigh quotient\n+451 // (use that x_new = y / y_norm)\n+452 _\bm_\b_._\bm_\bv(y,temp);\n+453 lambda = (y * temp) / (y_norm * y_norm);\n+454\n+455 // get norm of residual\n+456 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)\n+457 temp.axpy(-lambda,y);\n+458 r_norm = temp.two_norm() / y_norm;\n+459 }\n+460 else\n+461 {\n+462 // get approximated eigenvalue lambda via the Rayleigh quotient\n+463 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)\n+464 lambda = gamma + (y * x) / (y_norm * y_norm);\n+465\n+466 // get norm of residual\n+467 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)\n+468 temp = x; temp.axpy(gamma-lambda,y);\n+469 r_norm = temp.two_norm() / y_norm;\n+470 }\n+471\n+472 // do one iteration of the inverse iteration with shift algorithm,\n+473 // part 2: update x\n+474 x = y;\n+475 x *= (1.0 / y_norm);\n+476\n+477 // print verbosity information\n+478 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n+479 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << std::left\n+480 << \"iteration \" << std::setw(3) << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n+481 << \" (\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << std::setw(11) << r_norm\n+482 << \"): \u00ce\u00bb = \" << lambda << std::endl\n+483 << std::resetiosflags(std::ios::left);\n+484 }\n+485\n+486 // print verbosity information\n+487 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+488 {\n+489 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n+490 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n+491 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n+492 << \"\u00ce\u00bb = \" << lambda << std::endl;\n+493 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n+494 {\n+495 // print approximated eigenvector via DUNE-ISTL I/O methods\n+496 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n+497 }\n+498 }\n+499 }\n+500\n+531 template \n+_\b5_\b3_\b3 inline void _\ba_\bp_\bp_\bl_\by_\bR_\ba_\by_\bl_\be_\bi_\bg_\bh_\bQ_\bu_\bo_\bt_\bi_\be_\bn_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn (const _\bR_\be_\ba_\bl& epsilon,\n+534 ISTLLinearSolver& solver,\n+535 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n+536 {\n+537 // print verbosity information\n+538 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+539 std::cout << _\bt_\bi_\bt_\bl_\be_\b_\n+540 << \"Performing Rayleigh quotient iteration for \"\n+541 << \"estimated eigenvalue \" << lambda << \".\" << std::endl;\n+542\n+543 // allocate memory for linear solver statistics\n+544 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt solver_statistics;\n+545\n+546 // allocate memory for auxiliary variables\n+547 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br y(x);\n+548 _\bR_\be_\ba_\bl y_norm;\n+549 _\bR_\be_\ba_\bl lambda_update;\n+550 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br temp(x);\n+551\n+552 // perform Rayleigh quotient iteration\n+553 x *= (1.0 / x.two_norm());\n+554 _\bR_\be_\ba_\bl r_norm = std::numeric_limits::max();\n+555 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = 0;\n+556 while (r_norm > epsilon)\n+557 {\n+558 // update and check number of iterations\n+559 if (++_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ > _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_)\n+560 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Rayleigh quotient iteration did not \"\n+561 << \"converge in \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_ << \" iterations \"\n+562 << \"(\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \", epsilon = \"\n+563 << epsilon << \").\");\n+564\n+565 // update iteration operator,\n+566 // update iteration matrix when needed\n+567 _\bu_\bp_\bd_\ba_\bt_\be_\bS_\bh_\bi_\bf_\bt_\bM_\bu(lambda,solver);\n+568\n+569 // do one iteration of the Rayleigh quotient iteration algorithm,\n+570 // part 1: solve (m_ - lambda*I) * y = x for y\n+571 // (protect x from being changed)\n+572 temp = x;\n+573 solver.apply(y,temp,solver_statistics);\n+574\n+575 // get norm of y\n+576 y_norm = y.two_norm();\n+577\n+578 // compile time switch between accuracy and efficiency\n+579 if (avoidLinSolverCrime)\n+580 {\n+581 // get approximated eigenvalue lambda via the Rayleigh quotient\n+582 // (use that x_new = y / y_norm)\n+583 _\bm_\b_._\bm_\bv(y,temp);\n+584 lambda = (y * temp) / (y_norm * y_norm);\n+585\n+586 // get norm of residual\n+587 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)\n+588 temp.axpy(-lambda,y);\n+589 r_norm = temp.two_norm() / y_norm;\n+590 }\n+591 else\n+592 {\n+593 // get approximated eigenvalue lambda via the Rayleigh quotient\n+594 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)\n+595 lambda_update = (y * x) / (y_norm * y_norm);\n+596 lambda += lambda_update;\n+597\n+598 // get norm of residual\n+599 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)\n+600 temp = x; temp.axpy(-lambda_update,y);\n+601 r_norm = temp.two_norm() / y_norm;\n+602 }\n+603\n+604 // do one iteration of the Rayleigh quotient iteration algorithm,\n+605 // part 2: update x\n+606 x = y;\n+607 x *= (1.0 / y_norm);\n+608\n+609 // print verbosity information\n+610 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n+611 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << std::left\n+612 << \"iteration \" << std::setw(3) << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n+613 << \" (\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << std::setw(11) << r_norm\n+614 << \"): \u00ce\u00bb = \" << lambda << std::endl\n+615 << std::resetiosflags(std::ios::left);\n+616 }\n+617\n+618 // print verbosity information\n+619 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+620 {\n+621 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n+622 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n+623 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n+624 << \"\u00ce\u00bb = \" << lambda << std::endl;\n+625 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n+626 {\n+627 // print approximated eigenvector via DUNE-ISTL I/O methods\n+628 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n+629 }\n+630 }\n+631 }\n+632\n+689 template \n+_\b6_\b9_\b1 inline void _\ba_\bp_\bp_\bl_\by_\bT_\bL_\bI_\bM_\bE_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn (const _\bR_\be_\ba_\bl& gamma, const _\bR_\be_\ba_\bl& eta,\n+692 const _\bR_\be_\ba_\bl& epsilon,\n+693 ISTLLinearSolver& solver,\n+694 const _\bR_\be_\ba_\bl& delta, const std::size_t& m,\n+695 bool& extrnl,\n+696 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n+697 {\n+698 // use same variable names as in [Szyld, 1988]\n+699 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x_s = x;\n+700 _\bR_\be_\ba_\bl& mu_s = lambda;\n+701\n+702 // print verbosity information\n+703 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+704 std::cout << _\bt_\bi_\bt_\bl_\be_\b_\n+705 << \"Performing TLIME iteration for \"\n+706 << \"estimated eigenvalue in the \"\n+707 << \"interval (\" << gamma - eta << \",\"\n+708 << gamma + eta << \").\" << std::endl;\n+709\n+710 // allocate memory for linear solver statistics\n+711 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt solver_statistics;\n+712\n+713 // allocate memory for auxiliary variables\n+714 bool doRQI;\n+715 _\bR_\be_\ba_\bl mu;\n+716 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br y(x_s);\n+717 _\bR_\be_\ba_\bl omega;\n+718 _\bR_\be_\ba_\bl mu_s_old;\n+719 _\bR_\be_\ba_\bl mu_s_update;\n+720 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br temp(x_s);\n+721 _\bR_\be_\ba_\bl q_norm, r_norm;\n+722\n+723 // perform TLIME iteration\n+724 x_s *= (1.0 / x_s.two_norm());\n+725 extrnl = true;\n+726 doRQI = false;\n+727 r_norm = std::numeric_limits::max();\n+728 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = 0;\n+729 while (r_norm > epsilon)\n+730 {\n+731 // update and check number of iterations\n+732 if (++_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ > _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_)\n+733 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"TLIME iteration did not \"\n+734 << \"converge in \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_\n+735 << \" iterations (\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm\n+736 << \", epsilon = \" << epsilon << \").\");\n+737\n+738 // set shift for next iteration according to inverse iteration\n+739 // with shift (II) resp. Rayleigh quotient iteration (RQI)\n+740 if (doRQI)\n+741 mu = mu_s;\n+742 else\n+743 mu = gamma;\n+744\n+745 // update II/RQI iteration operator,\n+746 // update II/RQI iteration matrix when needed\n+747 _\bu_\bp_\bd_\ba_\bt_\be_\bS_\bh_\bi_\bf_\bt_\bM_\bu(mu,solver);\n+748\n+749 // do one iteration of the II/RQI algorithm,\n+750 // part 1: solve (m_ - mu*I) * y = x for y\n+751 temp = x_s;\n+752 solver.apply(y,temp,solver_statistics);\n+753\n+754 // do one iteration of the II/RQI algorithm,\n+755 // part 2: compute omega\n+756 omega = (1.0 / y.two_norm());\n+757\n+758 // backup the old Rayleigh quotient\n+759 mu_s_old = mu_s;\n+760\n+761 // compile time switch between accuracy and efficiency\n+762 if (avoidLinSolverCrime)\n+763 {\n+764 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue\n+765 // (use that x_new = y * omega)\n+766 _\bm_\b_._\bm_\bv(y,temp);\n+767 mu_s = (y * temp) * (omega * omega);\n+768\n+769 // get norm of \"the residual with respect to the shift used by II\",\n+770 // use normal representation of q\n+771 // (use that x_new = y * omega, use that temp = m_ * y)\n+772 temp.axpy(-gamma,y);\n+773 q_norm = temp.two_norm() * omega;\n+774\n+775 // get norm of \"the residual with respect to the Rayleigh quotient\"\n+776 r_norm = q_norm*q_norm - (gamma-mu_s)*(gamma-mu_s);\n+777 // prevent that truncation errors invalidate the norm\n+778 // (we don't want to calculate sqrt of a negative number)\n+779 if (r_norm >= 0)\n+780 {\n+781 // use relation between the norms of r and q for efficiency\n+782 r_norm = std::sqrt(r_norm);\n+783 }\n+784 else\n+785 {\n+786 // use relation between r and q\n+787 // (use that x_new = y * omega, use that temp = (m_ - gamma*I) * y = q /\n+omega)\n+788 temp.axpy(gamma-mu_s,y);\n+789 r_norm = temp.two_norm() * omega;\n+790 }\n+791 }\n+792 else\n+793 {\n+794 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue\n+795 if (!doRQI)\n+796 {\n+797 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y =\n+x_s)\n+798 mu_s = gamma + (y * x_s) * (omega * omega);\n+799 }\n+800 else\n+801 {\n+802 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y\n+= x_s)\n+803 mu_s_update = (y * x_s) * (omega * omega);\n+804 mu_s += mu_s_update;\n+805 }\n+806\n+807 // get norm of \"the residual with respect to the shift used by II\"\n+808 if (!doRQI)\n+809 {\n+810 // use special representation of q in the II case\n+811 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y =\n+x_s)\n+812 q_norm = omega;\n+813 }\n+814 else\n+815 {\n+816 // use special representation of q in the RQI case\n+817 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y\n+= x_s)\n+818 temp = x_s; temp.axpy(mu_s-gamma,y);\n+819 q_norm = temp.two_norm() * omega;\n+820 }\n+821\n+822 // get norm of \"the residual with respect to the Rayleigh quotient\"\n+823 // don't use efficient relation between the norms of r and q, as\n+824 // this relation seems to yield a less accurate r_norm in the case\n+825 // where linear solver crime is admitted\n+826 if (!doRQI)\n+827 {\n+828 // (use that x_new = y * omega and use that (m_ - gamma*I) * y = x_s)\n+829 temp = x_s; temp.axpy(gamma-lambda,y);\n+830 r_norm = temp.two_norm() * omega;\n+831 }\n+832 else\n+833 {\n+834 // (use that x_new = y * omega and use that (m_ - mu_s_old*I) * y = x_s)\n+835 temp = x_s; temp.axpy(-mu_s_update,y);\n+836 r_norm = temp.two_norm() * omega;\n+837 }\n+838 }\n+839\n+840 // do one iteration of the II/RQI algorithm,\n+841 // part 3: update x\n+842 x_s = y; x_s *= omega;\n+843\n+844 // // for relative residual norm mode, scale with mu_s^{-1}\n+845 // r_norm /= std::abs(mu_s);\n+846\n+847 // print verbosity information\n+848 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n+849 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"iteration \"\n+850 << std::left << std::setw(3) << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n+851 << \" (\" << (doRQI ? \"RQI,\" : \"II, \")\n+852 << \" \" << (doRQI ? \"\u00e2\u0080\u0094>\" : \" \") << \" \"\n+853 << \"\u00e2\u0095\u0091r\u00e2\u0095\u0091_2 = \" << std::setw(11) << r_norm\n+854 << \", \" << (doRQI ? \" \" : \"\u00e2\u0080\u0094>\") << \" \"\n+855 << \"\u00e2\u0095\u0091q\u00e2\u0095\u0091_2 = \" << std::setw(11) << q_norm\n+856 << \"): \u00ce\u00bb = \" << lambda << std::endl\n+857 << std::resetiosflags(std::ios::left);\n+858\n+859 // check if the eigenvalue closest to gamma lies in J\n+860 if (!doRQI && q_norm < eta)\n+861 {\n+862 // J is not free of eigenvalues\n+863 extrnl = false;\n+864\n+865 // by theory we know now that mu_s also lies in J\n+866 assert(std::abs(mu_s-gamma) < eta);\n+867\n+868 // switch to RQI\n+869 doRQI = true;\n+870 }\n+871\n+872 // revert to II if J is not free of eigenvalues but\n+873 // at some point mu_s falls back again outside J\n+874 if (!extrnl && doRQI && std::abs(mu_s-gamma) >= eta)\n+875 doRQI = false;\n+876\n+877 // if eigenvalue closest to gamma does not lie in J use RQI\n+878 // solely to accelerate the convergence to this eigenvalue\n+879 // when II has become stationary\n+880 if (extrnl && !doRQI)\n+881 {\n+882 // switch to RQI if the relative change of the Rayleigh\n+883 // quotient indicates that II has become stationary\n+884 if (_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ >= m &&\n+885 std::abs(mu_s - mu_s_old) / std::abs(mu_s) < delta)\n+886 doRQI = true;\n+887 }\n+888 }\n+889\n+890 // // compute final residual and lambda again (paranoia....)\n+891 // m_.mv(x_s,temp);\n+892 // mu_s = x_s * temp;\n+893 // temp.axpy(-mu_s,x_s);\n+894 // r_norm = temp.two_norm();\n+895 // // r_norm /= std::abs(mu_s);\n+896\n+897 // print verbosity information\n+898 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+899 {\n+900 if (extrnl)\n+901 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Interval \"\n+902 << \"(\" << gamma - eta << \",\" << gamma + eta\n+903 << \") is free of eigenvalues, approximating \"\n+904 << \"the closest eigenvalue.\" << std::endl;\n+905 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n+906 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n+907 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n+908 << \"\u00ce\u00bb = \" << lambda << std::endl;\n+909 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n+910 {\n+911 // print approximated eigenvector via DUNE-ISTL I/O methods\n+912 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n+913 }\n+914 }\n+915 }\n+916\n+_\b9_\b2_\b5 inline _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bO_\bp_\be_\br_\ba_\bt_\bo_\br& _\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bO_\bp_\be_\br_\ba_\bt_\bo_\br ()\n+926 {\n+927 // return iteration operator\n+928 return _\bi_\bt_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n+929 }\n+930\n+_\b9_\b4_\b5 inline const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bM_\ba_\bt_\br_\bi_\bx () const\n+946 {\n+947 // create iteration matrix on demand\n+948 if (!_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_)\n+949 _\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_ = std::make_unique(_\bm_\b_);\n+950\n+951 // return iteration matrix\n+952 return *_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_;\n+953 }\n+954\n+_\b9_\b5_\b9 inline unsigned int _\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bC_\bo_\bu_\bn_\bt () const\n+960 {\n+961 if (_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ == 0)\n+962 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"No algorithm applied, yet.\");\n+963\n+964 return _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_;\n+965 }\n+966\n+967 protected:\n+982 template \n+_\b9_\b8_\b3 inline void _\bu_\bp_\bd_\ba_\bt_\be_\bS_\bh_\bi_\bf_\bt_\bM_\bu (const _\bR_\be_\ba_\bl& mu,\n+984 ISTLLinearSolver& solver) const\n+985 {\n+986 // do nothing if new shift equals the old one\n+987 if (mu == _\bm_\bu_\b_) return;\n+988\n+989 // update shift mu_, i.e. update iteration operator\n+990 _\bm_\bu_\b_ = mu;\n+991\n+992 // update iteration matrix when needed\n+993 if (_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_)\n+994 {\n+995 // iterate over entries in iteration matrix diagonal\n+996 constexpr int rowBlockSize = BCRSMatrix::block_type::rows;\n+997 constexpr int colBlockSize = BCRSMatrix::block_type::cols;\n+998 for (typename _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0;\n+999 i < _\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_->M()*rowBlockSize; ++i)\n+1000 {\n+1001 // access m_[i,i] where i is the flat index of a row/column\n+1002 const _\bR_\be_\ba_\bl& m_entry = _\bm_\b_\n+1003 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];\n+1004 // access *itMatrix[i,i] where i is the flat index of a row/column\n+1005 _\bR_\be_\ba_\bl& entry = (*itMatrix_)\n+1006 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];\n+1007 // change current entry in iteration matrix diagonal\n+1008 entry = m_entry - _\bm_\bu_\b_;\n+1009 }\n+1010 // notify linear solver about change of the iteration matrix object\n+1011 _\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b,_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+1012 (solver,*_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_);\n+1013 }\n+1014 }\n+1015\n+1016 protected:\n+1017 // parameters related to iterative eigenvalue algorithms\n+_\b1_\b0_\b1_\b8 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bm_\b_;\n+_\b1_\b0_\b1_\b9 const unsigned int _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_;\n+1020\n+1021 // verbosity setting\n+_\b1_\b0_\b2_\b2 const unsigned int _\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_;\n+1023\n+1024 // shift mu_ used by iteration operator/matrix (m_ - mu_*I)\n+_\b1_\b0_\b2_\b5 mutable _\bR_\be_\ba_\bl _\bm_\bu_\b_;\n+1026\n+1027 // iteration operator (m_ - mu_*I), passing shift mu_ by reference\n+_\b1_\b0_\b2_\b8 const _\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br _\bm_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n+_\b1_\b0_\b2_\b9 const _\bS_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br _\bs_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n+_\b1_\b0_\b3_\b0 _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bS_\bu_\bm _\bi_\bt_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n+1031\n+1032 // iteration matrix (m_ - mu_*I), provided on demand when needed\n+1033 // (e.g. for preconditioning)\n+_\b1_\b0_\b3_\b4 mutable std::unique_ptr _\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_;\n+1035\n+1036 // memory for storing temporary variables (mutable as they shall\n+1037 // just be effectless auxiliary variables of the const apply*(...)\n+1038 // methods)\n+_\b1_\b0_\b3_\b9 mutable unsigned int _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_;\n+1040\n+1041 // constants for printing verbosity information\n+_\b1_\b0_\b4_\b2 const std::string _\bt_\bi_\bt_\bl_\be_\b_;\n+_\b1_\b0_\b4_\b3 const std::string _\bb_\bl_\ba_\bn_\bk_\b_;\n+1044 };\n+1045\n+1048} // namespace Dune\n+1049\n+1050#endif // DUNE_ISTL_EIGENVALUE_POWERITERATION_HH\n+_\bi_\bo_\b._\bh_\bh\n+Some generic functions for pretty printing vectors and matrices.\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n+Implementations of the inverse operator interface.\n+_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n+Helper functions for determining the vector/matrix block level.\n+_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n+_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n+Templates characterizing the type of a solver.\n+_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n+Define general, extensible interface for operators. The available\n+implementation wraps a matrix.\n+_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br\n+void printvector(std::ostream &s, const V &v, std::string title, std::string\n+rowtext, int columns=1, int width=10, int precision=2)\n+Print an ISTL vector.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:89\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:16\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bD_\bi_\br_\be_\bc_\bt_\bS_\bo_\bl_\bv_\be_\br_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-@ value\n-Whether this is a direct solver.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:24\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:30\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bt_\bo_\br_\be_\bs_\bC_\bo_\bl_\bu_\bm_\bn_\bC_\bo_\bm_\bp_\br_\be_\bs_\bs_\be_\bd_\b:_\b:_\bv_\ba_\bl_\bu_\be\n-@ value\n-whether the solver internally uses column compressed storage\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvertype.hh:36\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n+A sparse block matrix with compressed row storage.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+The type for the index access and the size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+size_type M() const\n+number of columns (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2007\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n+void mv(const X &x, Y &y) const\n+y = A x\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1641\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+size_type N() const\n+number of rows (counted in blocks)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n+A vector of blocks with memory management.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< B >::field_type field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:398\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n+Iterative eigenvalue algorithms based on power iteration.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:176\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_\n+std::unique_ptr< BCRSMatrix > itMatrix_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1034\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n+PowerIteration_Algorithms(const PowerIteration_Algorithms &)=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Impl::ScalingLinearOperator< BlockVector > ScalingOperator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:181\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bb_\bl_\ba_\bn_\bk_\b_\n+const std::string blank_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1043\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bS_\bu_\bm\n+Impl::LinearOperatorSum< MatrixOperator, ScalingOperator > OperatorSum\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:182\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+Dune::MatrixAdapter< BCRSMatrix, BlockVector, BlockVector > MatrixOperator\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:180\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bI_\bn_\bv_\be_\br_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+void applyInverseIteration(const Real &epsilon, ISTLLinearSolver &solver,\n+BlockVector &x, Real &lambda) const\n+Perform the inverse iteration algorithm to compute an approximation lambda of\n+the least dominant (i....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:355\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bL_\bI_\bM_\bE_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+void applyTLIMEIteration(const Real &gamma, const Real &eta, const Real\n+&epsilon, ISTLLinearSolver &solver, const Real &delta, const std::size_t &m,\n+bool &extrnl, BlockVector &x, Real &lambda) const\n+Perform the \"two-level iterative method for eigenvalue calculations (TLIME)\"\n+iteration algorit...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:691\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+IterationOperator & getIterationOperator()\n+Return the iteration operator (m_ - mu_*I).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:925\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bi_\bt_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_\n+OperatorSum itOperator_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1030\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bm_\b_\n+const BCRSMatrix & m_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1018\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n+PowerIteration_Algorithms(const BCRSMatrix &m, const unsigned int\n+nIterationsMax=1000, const unsigned int verbosity_level=0)\n+Construct from required parameters.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:206\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_\n+const unsigned int nIterationsMax_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1019\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+void applyPowerIteration(const Real &epsilon, BlockVector &x, Real &lambda)\n+const\n+Perform the power iteration algorithm to compute an approximation lambda of the\n+dominant (i....\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:260\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+OperatorSum IterationOperator\n+Type of iteration operator (m_ - mu_*I)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:189\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bR_\ba_\by_\bl_\be_\bi_\bg_\bh_\bQ_\bu_\bo_\bt_\bi_\be_\bn_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+void applyRayleighQuotientIteration(const Real &epsilon, ISTLLinearSolver\n+&solver, BlockVector &x, Real &lambda) const\n+Perform the Rayleigh quotient iteration algorithm to compute an approximation\n+lambda of an eigenvalue...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:533\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bI_\bn_\bv_\be_\br_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n+void applyInverseIteration(const Real &gamma, const Real &epsilon,\n+ISTLLinearSolver &solver, BlockVector &x, Real &lambda) const\n+Perform the inverse iteration with shift algorithm to compute an approximation\n+lambda of the eigenval...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:394\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bs_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_\n+const ScalingOperator scalingOperator_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1029\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bu_\bp_\bd_\ba_\bt_\be_\bS_\bh_\bi_\bf_\bt_\bM_\bu\n+void updateShiftMu(const Real &mu, ISTLLinearSolver &solver) const\n+Update shift mu_, i.e. update iteration operator/matrix (m_ - mu_*I).\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:983\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n+PowerIteration_Algorithms & operator=(const PowerIteration_Algorithms &)=delete\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bC_\bo_\bu_\bn_\bt\n+unsigned int getIterationCount() const\n+Return the number of iterations in last application of an algorithm.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:959\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_\n+const MatrixOperator matrixOperator_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1028\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bM_\ba_\bt_\br_\bi_\bx\n+const BCRSMatrix & getIterationMatrix() const\n+Return the iteration matrix (m_ - mu_*I), provided on demand when needed (e.g.\n+for direct solvers or ...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:945\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n+unsigned int nIterations_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1039\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_\n+const unsigned int verbosity_level_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1022\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bt_\bi_\bt_\bl_\be_\b_\n+const std::string title_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1042\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bR_\be_\ba_\bl\n+BlockVector::field_type Real\n+Type of underlying field.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:186\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bm_\bu_\b_\n+Real mu_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1025\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n+derive error class from the base class in common\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n+A linear operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+X::field_type field_type\n+The field type of the operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:76\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd\n+virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0\n+apply operator to x, scale and add:\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n+virtual SolverCategory::Category category() const =0\n+Category of the linear operator (see SolverCategory::Category)\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n+Y range_type\n+The type of the range of the operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:74\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n+virtual void apply(const X &x, Y &y) const =0\n+apply operator to x: The input vector is consistent and the output must also be\n+consistent on the in...\n+_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n+X domain_type\n+The type of the domain of the operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n+Adapter to turn a matrix into a linear operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:136\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n+Statistics about the application of an inverse operator.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n+static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:526\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n+Category\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n+@ sequential\n+Category for sequential solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00224.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00224.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: poweriteration.hh File Reference\n+dune-istl: arpackpp.hh File Reference\n \n \n \n \n \n \n \n@@ -72,41 +72,34 @@\n
  • dune
  • istl
  • eigenvalue
  • \n
    \n \n
    \n \n-
    poweriteration.hh File Reference
    \n+
    arpackpp.hh File Reference
    \n
    \n
    \n-
    #include <cstddef>
    \n-#include <cmath>
    \n-#include <type_traits>
    \n+
    #include <cmath>
    \n #include <iostream>
    \n-#include <limits>
    \n-#include <ios>
    \n-#include <iomanip>
    \n-#include <memory>
    \n #include <string>
    \n+#include <dune/common/fvector.hh>
    \n #include <dune/common/exceptions.hh>
    \n-#include <dune/istl/blocklevel.hh>
    \n-#include <dune/istl/operators.hh>
    \n-#include <dune/istl/solvercategory.hh>
    \n-#include <dune/istl/solvertype.hh>
    \n-#include <dune/istl/istlexception.hh>
    \n-#include <dune/istl/io.hh>
    \n-#include <dune/istl/solvers.hh>
    \n+#include <dune/istl/blocklevel.hh>
    \n+#include <dune/istl/bvector.hh>
    \n+#include <dune/istl/istlexception.hh>
    \n+#include <dune/istl/io.hh>
    \n+#include "arssym.h"
    \n
    \n

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n \n

    \n Classes

    class  Dune::PowerIteration_Algorithms< BCRSMatrix, BlockVector >
     Iterative eigenvalue algorithms based on power iteration. More...
    class  Dune::ArPackPlusPlus_Algorithms< BCRSMatrix, BlockVector >
     Wrapper to use a range of ARPACK++ eigenvalue solvers. More...
     
    \n \n \n \n

    \n Namespaces

    namespace  Dune
     
    \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -2,35 +2,28 @@\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n * _\be_\bi_\bg_\be_\bn_\bv_\ba_\bl_\bu_\be\n _\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-poweriteration.hh File Reference\n-#include \n+arpackpp.hh File Reference\n #include \n-#include \n #include \n-#include \n-#include \n-#include \n-#include \n #include \n+#include \n #include \n #include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n #include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bo_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh>\n+#include \"arssym.h\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b _\b>\n-\u00a0 Iterative eigenvalue algorithms based on power iteration. _\bM_\bo_\br_\be_\b._\b._\b.\n+class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b _\b>\n+\u00a0 Wrapper to use a range of ARPACK++ eigenvalue solvers. _\bM_\bo_\br_\be_\b._\b._\b.\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00224_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00224_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: poweriteration.hh Source File\n+dune-istl: arpackpp.hh Source File\n \n \n \n \n \n \n \n@@ -74,871 +74,877 @@\n \n \n
    \n
    \n-
    poweriteration.hh
    \n+
    arpackpp.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
    \n-
    6#define DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
    \n+
    5#ifndef DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
    \n+
    6#define DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
    \n
    7
    \n-
    8#include <cstddef> // provides std::size_t
    \n-
    9#include <cmath> // provides std::sqrt, std::abs
    \n-
    10
    \n-
    11#include <type_traits> // provides std::is_same
    \n-
    12#include <iostream> // provides std::cout, std::endl
    \n-
    13#include <limits> // provides std::numeric_limits
    \n-
    14#include <ios> // provides std::left, std::ios::left
    \n-
    15#include <iomanip> // provides std::setw, std::resetiosflags
    \n-
    16#include <memory> // provides std::unique_ptr
    \n-
    17#include <string> // provides std::string
    \n-
    18
    \n-
    19#include <dune/common/exceptions.hh> // provides DUNE_THROW(...)
    \n-
    20
    \n-
    21#include <dune/istl/blocklevel.hh> // provides Dune::blockLevel
    \n-
    22#include <dune/istl/operators.hh> // provides Dune::LinearOperator
    \n-
    23#include <dune/istl/solvercategory.hh> // provides Dune::SolverCategory::sequential
    \n-
    24#include <dune/istl/solvertype.hh> // provides Dune::IsDirectSolver
    \n-
    25#include <dune/istl/operators.hh> // provides Dune::MatrixAdapter
    \n-
    26#include <dune/istl/istlexception.hh> // provides Dune::ISTLError
    \n-
    27#include <dune/istl/io.hh> // provides Dune::printvector(...)
    \n-
    28#include <dune/istl/solvers.hh> // provides Dune::InverseOperatorResult
    \n-
    29
    \n-
    30namespace Dune
    \n-
    31{
    \n-
    32
    \n-
    37 namespace Impl {
    \n-
    45 template <class X, class Y = X>
    \n-
    46 class ScalingLinearOperator : public Dune::LinearOperator<X,Y>
    \n-
    47 {
    \n-
    48 public:
    \n-
    49 typedef X domain_type;
    \n-
    50 typedef Y range_type;
    \n-
    51 typedef typename X::field_type field_type;
    \n-
    52
    \n-
    53 ScalingLinearOperator (field_type immutable_scaling,
    \n-
    54 const field_type& mutable_scaling)
    \n-
    55 : immutable_scaling_(immutable_scaling),
    \n-
    56 mutable_scaling_(mutable_scaling)
    \n-
    57 {}
    \n-
    58
    \n-
    59 virtual void apply (const X& x, Y& y) const
    \n-
    60 {
    \n-
    61 y = x;
    \n-
    62 y *= immutable_scaling_*mutable_scaling_;
    \n-
    63 }
    \n-
    64
    \n-
    65 virtual void applyscaleadd (field_type alpha, const X& x, Y& y) const
    \n-
    66 {
    \n-
    67 X temp(x);
    \n-
    68 temp *= immutable_scaling_*mutable_scaling_;
    \n-
    69 y.axpy(alpha,temp);
    \n-
    70 }
    \n-
    71
    \n-\n-
    74 {
    \n-\n-
    76 }
    \n-
    77
    \n-
    78 protected:
    \n-
    79 const field_type immutable_scaling_;
    \n-
    80 const field_type& mutable_scaling_;
    \n-
    81 };
    \n-
    82
    \n-
    83
    \n-
    92 template <class OP1, class OP2>
    \n-
    93 class LinearOperatorSum
    \n-
    94 : public Dune::LinearOperator<typename OP1::domain_type,
    \n-
    95 typename OP1::range_type>
    \n-
    96 {
    \n-
    97 public:
    \n-
    98 typedef typename OP1::domain_type domain_type;
    \n-
    99 typedef typename OP1::range_type range_type;
    \n-
    100 typedef typename domain_type::field_type field_type;
    \n+
    8#if HAVE_ARPACKPP || defined DOXYGEN
    \n+
    9
    \n+
    10#include <cmath> // provides std::abs, std::pow, std::sqrt
    \n+
    11
    \n+
    12#include <iostream> // provides std::cout, std::endl
    \n+
    13#include <string> // provides std::string
    \n+
    14
    \n+
    15#include <dune/common/fvector.hh> // provides Dune::FieldVector
    \n+
    16#include <dune/common/exceptions.hh> // provides DUNE_THROW(...)
    \n+
    17
    \n+
    18#include <dune/istl/blocklevel.hh> // provides Dune::blockLevel
    \n+
    19#include <dune/istl/bvector.hh> // provides Dune::BlockVector
    \n+
    20#include <dune/istl/istlexception.hh> // provides Dune::ISTLError
    \n+
    21#include <dune/istl/io.hh> // provides Dune::printvector(...)
    \n+
    22
    \n+
    23#ifdef Status
    \n+
    24#undef Status // prevent preprocessor from damaging the ARPACK++
    \n+
    25 // code when "X11/Xlib.h" is included (the latter
    \n+
    26 // defines Status as "#define Status int" and
    \n+
    27 // ARPACK++ provides a class with a method called
    \n+
    28 // Status)
    \n+
    29#endif
    \n+
    30#include "arssym.h" // provides ARSymStdEig
    \n+
    31
    \n+
    32namespace Dune
    \n+
    33{
    \n+
    34
    \n+
    39 namespace Impl {
    \n+
    55 template <class BCRSMatrix>
    \n+
    56 class ArPackPlusPlus_BCRSMatrixWrapper
    \n+
    57 {
    \n+
    58 public:
    \n+
    60 typedef typename BCRSMatrix::field_type Real;
    \n+
    61
    \n+
    62 public:
    \n+
    64 ArPackPlusPlus_BCRSMatrixWrapper (const BCRSMatrix& A)
    \n+
    65 : A_(A),
    \n+
    66 m_(A_.M() * mBlock), n_(A_.N() * nBlock)
    \n+
    67 {
    \n+
    68 // assert that BCRSMatrix type has blocklevel 2
    \n+
    69 static_assert
    \n+
    70 (blockLevel<BCRSMatrix>() == 2,
    \n+
    71 "Only BCRSMatrices with blocklevel 2 are supported.");
    \n+
    72
    \n+
    73 // allocate memory for auxiliary block vector objects
    \n+
    74 // which are compatible to matrix rows / columns
    \n+
    75 domainBlockVector.resize(A_.N());
    \n+
    76 rangeBlockVector.resize(A_.M());
    \n+
    77 }
    \n+
    78
    \n+
    80 inline void multMv (Real* v, Real* w)
    \n+
    81 {
    \n+
    82 // get vector v as an object of appropriate type
    \n+
    83 arrayToDomainBlockVector(v,domainBlockVector);
    \n+
    84
    \n+
    85 // perform matrix-vector product
    \n+
    86 A_.mv(domainBlockVector,rangeBlockVector);
    \n+
    87
    \n+
    88 // get vector w from object of appropriate type
    \n+
    89 rangeBlockVectorToArray(rangeBlockVector,w);
    \n+
    90 };
    \n+
    91
    \n+
    93 inline void multMtMv (Real* v, Real* w)
    \n+
    94 {
    \n+
    95 // get vector v as an object of appropriate type
    \n+
    96 arrayToDomainBlockVector(v,domainBlockVector);
    \n+
    97
    \n+
    98 // perform matrix-vector product
    \n+
    99 A_.mv(domainBlockVector,rangeBlockVector);
    \n+
    100 A_.mtv(rangeBlockVector,domainBlockVector);
    \n
    101
    \n-
    102 LinearOperatorSum (const OP1& op1, const OP2& op2)
    \n-
    103 : op1_(op1), op2_(op2)
    \n-
    104 {
    \n-
    105 static_assert(std::is_same<typename OP2::domain_type,domain_type>::value,
    \n-
    106 "Domain type of both operators doesn't match!");
    \n-
    107 static_assert(std::is_same<typename OP2::range_type,range_type>::value,
    \n-
    108 "Range type of both operators doesn't match!");
    \n-
    109 }
    \n-
    110
    \n-
    111 virtual void apply (const domain_type& x, range_type& y) const
    \n-
    112 {
    \n-
    113 op1_.apply(x,y);
    \n-
    114 op2_.applyscaleadd(1.0,x,y);
    \n-
    115 }
    \n-
    116
    \n-
    117 virtual void applyscaleadd (field_type alpha,
    \n-
    118 const domain_type& x, range_type& y) const
    \n-
    119 {
    \n-
    120 range_type temp(y);
    \n-
    121 op1_.apply(x,temp);
    \n-
    122 op2_.applyscaleadd(1.0,x,temp);
    \n-
    123 y.axpy(alpha,temp);
    \n-
    124 }
    \n+
    102 // get vector w from object of appropriate type
    \n+
    103 domainBlockVectorToArray(domainBlockVector,w);
    \n+
    104 };
    \n+
    105
    \n+
    107 inline void multMMtv (Real* v, Real* w)
    \n+
    108 {
    \n+
    109 // get vector v as an object of appropriate type
    \n+
    110 arrayToRangeBlockVector(v,rangeBlockVector);
    \n+
    111
    \n+
    112 // perform matrix-vector product
    \n+
    113 A_.mtv(rangeBlockVector,domainBlockVector);
    \n+
    114 A_.mv(domainBlockVector,rangeBlockVector);
    \n+
    115
    \n+
    116 // get vector w from object of appropriate type
    \n+
    117 rangeBlockVectorToArray(rangeBlockVector,w);
    \n+
    118 };
    \n+
    119
    \n+
    121 inline int nrows () const { return m_; }
    \n+
    122
    \n+
    124 inline int ncols () const { return n_; }
    \n
    125
    \n-
    127 virtual SolverCategory::Category category() const
    \n-
    128 {
    \n-\n-
    130 }
    \n-
    131
    \n-
    132 protected:
    \n-
    133 const OP1& op1_;
    \n-
    134 const OP2& op2_;
    \n-
    135 };
    \n-
    136 } // end namespace Impl
    \n-
    137
    \n-
    174 template <typename BCRSMatrix, typename BlockVector>
    \n-
    \n-\n-
    176 {
    \n-
    177 protected:
    \n-
    178 // Type definitions for type of iteration operator (m_ - mu_*I)
    \n-\n-\n-
    181 typedef Impl::ScalingLinearOperator<BlockVector> ScalingOperator;
    \n-
    182 typedef Impl::LinearOperatorSum<MatrixOperator,ScalingOperator> OperatorSum;
    \n-
    183
    \n-
    184 public:
    \n-\n-
    187
    \n-\n-
    190
    \n-
    191 public:
    \n-
    \n-\n-
    207 const unsigned int nIterationsMax = 1000,
    \n-
    208 const unsigned int verbosity_level = 0)
    \n-
    209 : m_(m), nIterationsMax_(nIterationsMax),
    \n-
    210 verbosity_level_(verbosity_level),
    \n-
    211 mu_(0.0),
    \n-\n-
    213 scalingOperator_(-1.0,mu_),
    \n-\n-
    215 nIterations_(0),
    \n-
    216 title_(" PowerIteration_Algorithms: "),
    \n-
    217 blank_(title_.length(),' ')
    \n-
    218 {
    \n-
    219 // assert that BCRSMatrix type has blocklevel 2
    \n-
    220 static_assert
    \n-
    221 (blockLevel<BCRSMatrix>() == 2,
    \n-
    222 "Only BCRSMatrices with blocklevel 2 are supported.");
    \n-
    223
    \n-
    224 // assert that BCRSMatrix type has square blocks
    \n-
    225 static_assert
    \n-
    226 (BCRSMatrix::block_type::rows == BCRSMatrix::block_type::cols,
    \n-
    227 "Only BCRSMatrices with square blocks are supported.");
    \n-
    228
    \n-
    229 // assert that m_ is square
    \n-
    230 const int nrows = m_.M() * BCRSMatrix::block_type::rows;
    \n-
    231 const int ncols = m_.N() * BCRSMatrix::block_type::cols;
    \n-
    232 if (nrows != ncols)
    \n-
    233 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
    \n-
    234 << nrows << "x" << ncols << ").");
    \n-
    235 }
    \n-
    \n-
    236
    \n-\n-
    241
    \n-\n-\n-
    247
    \n-
    \n-
    260 inline void applyPowerIteration (const Real& epsilon,
    \n-
    261 BlockVector& x, Real& lambda) const
    \n-
    262 {
    \n-
    263 // print verbosity information
    \n-
    264 if (verbosity_level_ > 0)
    \n-
    265 std::cout << title_
    \n-
    266 << "Performing power iteration approximating "
    \n-
    267 << "the dominant eigenvalue." << std::endl;
    \n-
    268
    \n-
    269 // allocate memory for auxiliary variables
    \n-
    270 BlockVector y(x);
    \n-
    271 BlockVector temp(x);
    \n-
    272
    \n-
    273 // perform power iteration
    \n-
    274 x *= (1.0 / x.two_norm());
    \n-
    275 m_.mv(x,y);
    \n-
    276 Real r_norm = std::numeric_limits<Real>::max();
    \n-
    277 nIterations_ = 0;
    \n-
    278 while (r_norm > epsilon)
    \n-
    279 {
    \n-
    280 // update and check number of iterations
    \n-\n-
    282 DUNE_THROW(Dune::ISTLError,"Power iteration did not converge "
    \n-
    283 << "in " << nIterationsMax_ << " iterations "
    \n-
    284 << "(\u2551residual\u2551_2 = " << r_norm << ", epsilon = "
    \n-
    285 << epsilon << ").");
    \n-
    286
    \n-
    287 // do one iteration of the power iteration algorithm
    \n-
    288 // (use that y = m_ * x)
    \n-
    289 x = y;
    \n-
    290 x *= (1.0 / y.two_norm());
    \n-
    291
    \n-
    292 // get approximated eigenvalue lambda via the Rayleigh quotient
    \n-
    293 m_.mv(x,y);
    \n-
    294 lambda = x * y;
    \n-
    295
    \n-
    296 // get norm of residual (use that y = m_ * x)
    \n-
    297 temp = y;
    \n-
    298 temp.axpy(-lambda,x);
    \n-
    299 r_norm = temp.two_norm();
    \n-
    300
    \n-
    301 // print verbosity information
    \n-
    302 if (verbosity_level_ > 1)
    \n-
    303 std::cout << blank_ << std::left
    \n-
    304 << "iteration " << std::setw(3) << nIterations_
    \n-
    305 << " (\u2551residual\u2551_2 = " << std::setw(11) << r_norm
    \n-
    306 << "): \u03bb = " << lambda << std::endl
    \n-
    307 << std::resetiosflags(std::ios::left);
    \n-
    308 }
    \n-
    309
    \n-
    310 // print verbosity information
    \n-
    311 if (verbosity_level_ > 0)
    \n-
    312 {
    \n-
    313 std::cout << blank_ << "Result ("
    \n-
    314 << "#iterations = " << nIterations_ << ", "
    \n-
    315 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n-
    316 << "\u03bb = " << lambda << std::endl;
    \n-
    317 if (verbosity_level_ > 2)
    \n-
    318 {
    \n-
    319 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n-
    320 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n-
    321 }
    \n-
    322 }
    \n-
    323 }
    \n-
    \n-
    324
    \n-
    353 template <typename ISTLLinearSolver,
    \n-
    354 bool avoidLinSolverCrime = false>
    \n-
    \n-
    355 inline void applyInverseIteration (const Real& epsilon,
    \n-
    356 ISTLLinearSolver& solver,
    \n-
    357 BlockVector& x, Real& lambda) const
    \n-
    358 {
    \n-
    359 constexpr Real gamma = 0.0;
    \n-
    360 applyInverseIteration(gamma,epsilon,solver,x,lambda);
    \n-
    361 }
    \n-
    \n-
    362
    \n-
    392 template <typename ISTLLinearSolver,
    \n-
    393 bool avoidLinSolverCrime = false>
    \n-
    \n-
    394 inline void applyInverseIteration (const Real& gamma,
    \n-
    395 const Real& epsilon,
    \n-
    396 ISTLLinearSolver& solver,
    \n-
    397 BlockVector& x, Real& lambda) const
    \n-
    398 {
    \n-
    399 // print verbosity information
    \n-
    400 if (verbosity_level_ > 0)
    \n-
    401 {
    \n-
    402 std::cout << title_;
    \n-
    403 if (gamma == 0.0)
    \n-
    404 std::cout << "Performing inverse iteration approximating "
    \n-
    405 << "the least dominant eigenvalue." << std::endl;
    \n-
    406 else
    \n-
    407 std::cout << "Performing inverse iteration with shift "
    \n-
    408 << "gamma = " << gamma << " approximating the "
    \n-
    409 << "eigenvalue closest to gamma." << std::endl;
    \n-
    410 }
    \n-
    411
    \n-
    412 // initialize iteration operator,
    \n-
    413 // initialize iteration matrix when needed
    \n-
    414 updateShiftMu(gamma,solver);
    \n-
    415
    \n-
    416 // allocate memory for linear solver statistics
    \n-
    417 Dune::InverseOperatorResult solver_statistics;
    \n-
    418
    \n-
    419 // allocate memory for auxiliary variables
    \n-
    420 BlockVector y(x);
    \n-
    421 Real y_norm;
    \n-
    422 BlockVector temp(x);
    \n-
    423
    \n-
    424 // perform inverse iteration with shift
    \n-
    425 x *= (1.0 / x.two_norm());
    \n-
    426 Real r_norm = std::numeric_limits<Real>::max();
    \n-
    427 nIterations_ = 0;
    \n-
    428 while (r_norm > epsilon)
    \n-
    429 {
    \n-
    430 // update and check number of iterations
    \n-\n-
    432 DUNE_THROW(Dune::ISTLError,"Inverse iteration "
    \n-
    433 << (gamma != 0.0 ? "with shift " : "") << "did not "
    \n-
    434 << "converge in " << nIterationsMax_ << " iterations "
    \n-
    435 << "(\u2551residual\u2551_2 = " << r_norm << ", epsilon = "
    \n-
    436 << epsilon << ").");
    \n-
    437
    \n-
    438 // do one iteration of the inverse iteration with shift algorithm,
    \n-
    439 // part 1: solve (m_ - gamma*I) * y = x for y
    \n-
    440 // (protect x from being changed)
    \n-
    441 temp = x;
    \n-
    442 solver.apply(y,temp,solver_statistics);
    \n+
    126 protected:
    \n+
    127 // Number of rows and columns in each block of the matrix
    \n+
    128 constexpr static int mBlock = BCRSMatrix::block_type::rows;
    \n+
    129 constexpr static int nBlock = BCRSMatrix::block_type::cols;
    \n+
    130
    \n+
    131 // Type of vectors in the domain of the linear map associated with
    \n+
    132 // the matrix, i.e. block vectors compatible to matrix rows
    \n+
    133 constexpr static int dbvBlockSize = nBlock;
    \n+
    134 typedef Dune::FieldVector<Real,dbvBlockSize> DomainBlockVectorBlock;
    \n+
    135 typedef Dune::BlockVector<DomainBlockVectorBlock> DomainBlockVector;
    \n+
    136
    \n+
    137 // Type of vectors in the range of the linear map associated with
    \n+
    138 // the matrix, i.e. block vectors compatible to matrix columns
    \n+
    139 constexpr static int rbvBlockSize = mBlock;
    \n+
    140 typedef Dune::FieldVector<Real,rbvBlockSize> RangeBlockVectorBlock;
    \n+
    141 typedef Dune::BlockVector<RangeBlockVectorBlock> RangeBlockVector;
    \n+
    142
    \n+
    143 // Types for vector index access
    \n+
    144 typedef typename DomainBlockVector::size_type dbv_size_type;
    \n+
    145 typedef typename RangeBlockVector::size_type rbv_size_type;
    \n+
    146 typedef typename DomainBlockVectorBlock::size_type dbvb_size_type;
    \n+
    147 typedef typename RangeBlockVectorBlock::size_type rbvb_size_type;
    \n+
    148
    \n+
    149 // Get vector v from a block vector object which is compatible to
    \n+
    150 // matrix rows
    \n+
    151 static inline void
    \n+
    152 domainBlockVectorToArray (const DomainBlockVector& dbv, Real* v)
    \n+
    153 {
    \n+
    154 for (dbv_size_type block = 0; block < dbv.N(); ++block)
    \n+
    155 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)
    \n+
    156 v[block*dbvBlockSize + iBlock] = dbv[block][iBlock];
    \n+
    157 }
    \n+
    158
    \n+
    159 // Get vector v from a block vector object which is compatible to
    \n+
    160 // matrix columns
    \n+
    161 static inline void
    \n+
    162 rangeBlockVectorToArray (const RangeBlockVector& rbv, Real* v)
    \n+
    163 {
    \n+
    164 for (rbv_size_type block = 0; block < rbv.N(); ++block)
    \n+
    165 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)
    \n+
    166 v[block*rbvBlockSize + iBlock] = rbv[block][iBlock];
    \n+
    167 }
    \n+
    168
    \n+
    169 public:
    \n+
    172 static inline void arrayToDomainBlockVector (const Real* v,
    \n+
    173 DomainBlockVector& dbv)
    \n+
    174 {
    \n+
    175 for (dbv_size_type block = 0; block < dbv.N(); ++block)
    \n+
    176 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)
    \n+
    177 dbv[block][iBlock] = v[block*dbvBlockSize + iBlock];
    \n+
    178 }
    \n+
    179
    \n+
    182 static inline void arrayToRangeBlockVector (const Real* v,
    \n+
    183 RangeBlockVector& rbv)
    \n+
    184 {
    \n+
    185 for (rbv_size_type block = 0; block < rbv.N(); ++block)
    \n+
    186 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)
    \n+
    187 rbv[block][iBlock] = v[block*rbvBlockSize + iBlock];
    \n+
    188 }
    \n+
    189
    \n+
    190 protected:
    \n+
    191 // The DUNE-ISTL BCRSMatrix
    \n+
    192 const BCRSMatrix& A_;
    \n+
    193
    \n+
    194 // Number of rows and columns in the matrix
    \n+
    195 const int m_, n_;
    \n+
    196
    \n+
    197 // Auxiliary block vector objects which are
    \n+
    198 // compatible to matrix rows / columns
    \n+
    199 mutable DomainBlockVector domainBlockVector;
    \n+
    200 mutable RangeBlockVector rangeBlockVector;
    \n+
    201 };
    \n+
    202 } // end namespace Impl
    \n+
    203
    \n+
    243 template <typename BCRSMatrix, typename BlockVector>
    \n+
    \n+\n+
    245 {
    \n+
    246 public:
    \n+\n+
    248
    \n+
    249 public:
    \n+
    \n+\n+
    269 const unsigned int nIterationsMax = 100000,
    \n+
    270 const unsigned int verbosity_level = 0)
    \n+
    271 : m_(m), nIterationsMax_(nIterationsMax),
    \n+
    272 verbosity_level_(verbosity_level),
    \n+
    273 nIterations_(0),
    \n+
    274 title_(" ArPackPlusPlus_Algorithms: "),
    \n+
    275 blank_(title_.length(),' ')
    \n+
    276 {}
    \n+
    \n+
    277
    \n+
    \n+
    289 inline void computeSymMaxMagnitude (const Real& epsilon,
    \n+
    290 BlockVector& x, Real& lambda) const
    \n+
    291 {
    \n+
    292 // print verbosity information
    \n+
    293 if (verbosity_level_ > 0)
    \n+
    294 std::cout << title_ << "Computing an approximation of "
    \n+
    295 << "the dominant eigenvalue of a matrix which "
    \n+
    296 << "is assumed to be symmetric." << std::endl;
    \n+
    297
    \n+
    298 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n+
    299 // and to perform the product A*v (LU decomposition is not used)
    \n+
    300 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n+
    301 WrappedMatrix A(m_);
    \n+
    302
    \n+
    303 // get number of rows and columns in A
    \n+
    304 const int nrows = A.nrows();
    \n+
    305 const int ncols = A.ncols();
    \n+
    306
    \n+
    307 // assert that A is square
    \n+
    308 if (nrows != ncols)
    \n+
    309 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
    \n+
    310 << nrows << "x" << ncols << ").");
    \n+
    311
    \n+
    312 // allocate memory for variables, set parameters
    \n+
    313 const int nev = 1; // Number of eigenvalues to compute
    \n+
    314 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n+
    315 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n+
    316 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n+
    317 Real* ev = new Real[nev]; // Computed eigenvalues of A
    \n+
    318 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n+
    319 int nconv; // Number of converged eigenvalues
    \n+
    320
    \n+
    321 // define what we need: eigenvalues with largest magnitude
    \n+
    322 char which[] = "LM";
    \n+
    323 ARSymStdEig<Real,WrappedMatrix>
    \n+
    324 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
    \n+
    325
    \n+
    326 // set ARPACK verbosity mode if requested
    \n+
    327 if (verbosity_level_ > 3) dprob.Trace();
    \n+
    328
    \n+
    329 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
    \n+
    330 nconv = dprob.Eigenvalues(ev,ivec);
    \n+
    331
    \n+
    332 // obtain approximated dominant eigenvalue of A
    \n+
    333 lambda = ev[nev-1];
    \n+
    334
    \n+
    335 // obtain associated approximated eigenvector of A
    \n+
    336 Real* x_raw = dprob.RawEigenvector(nev-1);
    \n+
    337 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
    \n+
    338
    \n+
    339 // obtain number of Arnoldi update iterations actually taken
    \n+
    340 nIterations_ = dprob.GetIter();
    \n+
    341
    \n+
    342 // compute residual norm
    \n+
    343 BlockVector r(x);
    \n+
    344 Real* Ax_raw = new Real[nrows];
    \n+
    345 A.multMv(x_raw,Ax_raw);
    \n+
    346 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);
    \n+
    347 r.axpy(-lambda,x);
    \n+
    348 const Real r_norm = r.two_norm();
    \n+
    349
    \n+
    350 // print verbosity information
    \n+
    351 if (verbosity_level_ > 0)
    \n+
    352 {
    \n+
    353 if (verbosity_level_ > 1)
    \n+
    354 {
    \n+
    355 // print some information about the problem
    \n+
    356 std::cout << blank_ << "Obtained eigenvalues of A by solving "
    \n+
    357 << "A*x = \u03bb*x using the ARPACK++ class ARSym"
    \n+
    358 << "StdEig:" << std::endl;
    \n+
    359 std::cout << blank_ << " converged eigenvalues of A: "
    \n+
    360 << nconv << " / " << nev << std::endl;
    \n+
    361 std::cout << blank_ << " dominant eigenvalue of A: "
    \n+
    362 << lambda << std::endl;
    \n+
    363 }
    \n+
    364 std::cout << blank_ << "Result ("
    \n+
    365 << "#iterations = " << nIterations_ << ", "
    \n+
    366 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n+
    367 << "\u03bb = " << lambda << std::endl;
    \n+
    368 if (verbosity_level_ > 2)
    \n+
    369 {
    \n+
    370 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n+
    371 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n+
    372 }
    \n+
    373 }
    \n+
    374
    \n+
    375 // free dynamically allocated memory
    \n+
    376 delete[] Ax_raw;
    \n+
    377 delete[] ev;
    \n+
    378 }
    \n+
    \n+
    379
    \n+
    \n+
    391 inline void computeSymMinMagnitude (const Real& epsilon,
    \n+
    392 BlockVector& x, Real& lambda) const
    \n+
    393 {
    \n+
    394 // print verbosity information
    \n+
    395 if (verbosity_level_ > 0)
    \n+
    396 std::cout << title_ << "Computing an approximation of the "
    \n+
    397 << "least dominant eigenvalue of a matrix which "
    \n+
    398 << "is assumed to be symmetric." << std::endl;
    \n+
    399
    \n+
    400 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n+
    401 // and to perform the product A*v (LU decomposition is not used)
    \n+
    402 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n+
    403 WrappedMatrix A(m_);
    \n+
    404
    \n+
    405 // get number of rows and columns in A
    \n+
    406 const int nrows = A.nrows();
    \n+
    407 const int ncols = A.ncols();
    \n+
    408
    \n+
    409 // assert that A is square
    \n+
    410 if (nrows != ncols)
    \n+
    411 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
    \n+
    412 << nrows << "x" << ncols << ").");
    \n+
    413
    \n+
    414 // allocate memory for variables, set parameters
    \n+
    415 const int nev = 1; // Number of eigenvalues to compute
    \n+
    416 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n+
    417 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n+
    418 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n+
    419 Real* ev = new Real[nev]; // Computed eigenvalues of A
    \n+
    420 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n+
    421 int nconv; // Number of converged eigenvalues
    \n+
    422
    \n+
    423 // define what we need: eigenvalues with smallest magnitude
    \n+
    424 char which[] = "SM";
    \n+
    425 ARSymStdEig<Real,WrappedMatrix>
    \n+
    426 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
    \n+
    427
    \n+
    428 // set ARPACK verbosity mode if requested
    \n+
    429 if (verbosity_level_ > 3) dprob.Trace();
    \n+
    430
    \n+
    431 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
    \n+
    432 nconv = dprob.Eigenvalues(ev,ivec);
    \n+
    433
    \n+
    434 // obtain approximated least dominant eigenvalue of A
    \n+
    435 lambda = ev[nev-1];
    \n+
    436
    \n+
    437 // obtain associated approximated eigenvector of A
    \n+
    438 Real* x_raw = dprob.RawEigenvector(nev-1);
    \n+
    439 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
    \n+
    440
    \n+
    441 // obtain number of Arnoldi update iterations actually taken
    \n+
    442 nIterations_ = dprob.GetIter();
    \n
    443
    \n-
    444 // get norm of y
    \n-
    445 y_norm = y.two_norm();
    \n-
    446
    \n-
    447 // compile time switch between accuracy and efficiency
    \n-
    448 if (avoidLinSolverCrime)
    \n-
    449 {
    \n-
    450 // get approximated eigenvalue lambda via the Rayleigh quotient
    \n-
    451 // (use that x_new = y / y_norm)
    \n-
    452 m_.mv(y,temp);
    \n-
    453 lambda = (y * temp) / (y_norm * y_norm);
    \n-
    454
    \n-
    455 // get norm of residual
    \n-
    456 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)
    \n-
    457 temp.axpy(-lambda,y);
    \n-
    458 r_norm = temp.two_norm() / y_norm;
    \n-
    459 }
    \n-
    460 else
    \n-
    461 {
    \n-
    462 // get approximated eigenvalue lambda via the Rayleigh quotient
    \n-
    463 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)
    \n-
    464 lambda = gamma + (y * x) / (y_norm * y_norm);
    \n-
    465
    \n-
    466 // get norm of residual
    \n-
    467 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)
    \n-
    468 temp = x; temp.axpy(gamma-lambda,y);
    \n-
    469 r_norm = temp.two_norm() / y_norm;
    \n-
    470 }
    \n-
    471
    \n-
    472 // do one iteration of the inverse iteration with shift algorithm,
    \n-
    473 // part 2: update x
    \n-
    474 x = y;
    \n-
    475 x *= (1.0 / y_norm);
    \n+
    444 // compute residual norm
    \n+
    445 BlockVector r(x);
    \n+
    446 Real* Ax_raw = new Real[nrows];
    \n+
    447 A.multMv(x_raw,Ax_raw);
    \n+
    448 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);
    \n+
    449 r.axpy(-lambda,x);
    \n+
    450 const Real r_norm = r.two_norm();
    \n+
    451
    \n+
    452 // print verbosity information
    \n+
    453 if (verbosity_level_ > 0)
    \n+
    454 {
    \n+
    455 if (verbosity_level_ > 1)
    \n+
    456 {
    \n+
    457 // print some information about the problem
    \n+
    458 std::cout << blank_ << "Obtained eigenvalues of A by solving "
    \n+
    459 << "A*x = \u03bb*x using the ARPACK++ class ARSym"
    \n+
    460 << "StdEig:" << std::endl;
    \n+
    461 std::cout << blank_ << " converged eigenvalues of A: "
    \n+
    462 << nconv << " / " << nev << std::endl;
    \n+
    463 std::cout << blank_ << " least dominant eigenvalue of A: "
    \n+
    464 << lambda << std::endl;
    \n+
    465 }
    \n+
    466 std::cout << blank_ << "Result ("
    \n+
    467 << "#iterations = " << nIterations_ << ", "
    \n+
    468 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n+
    469 << "\u03bb = " << lambda << std::endl;
    \n+
    470 if (verbosity_level_ > 2)
    \n+
    471 {
    \n+
    472 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n+
    473 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n+
    474 }
    \n+
    475 }
    \n
    476
    \n-
    477 // print verbosity information
    \n-
    478 if (verbosity_level_ > 1)
    \n-
    479 std::cout << blank_ << std::left
    \n-
    480 << "iteration " << std::setw(3) << nIterations_
    \n-
    481 << " (\u2551residual\u2551_2 = " << std::setw(11) << r_norm
    \n-
    482 << "): \u03bb = " << lambda << std::endl
    \n-
    483 << std::resetiosflags(std::ios::left);
    \n-
    484 }
    \n-
    485
    \n-
    486 // print verbosity information
    \n-
    487 if (verbosity_level_ > 0)
    \n-
    488 {
    \n-
    489 std::cout << blank_ << "Result ("
    \n-
    490 << "#iterations = " << nIterations_ << ", "
    \n-
    491 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n-
    492 << "\u03bb = " << lambda << std::endl;
    \n-
    493 if (verbosity_level_ > 2)
    \n-
    494 {
    \n-
    495 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n-
    496 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n-
    497 }
    \n-
    498 }
    \n-
    499 }
    \n-
    \n+
    477 // free dynamically allocated memory
    \n+
    478 delete[] Ax_raw;
    \n+
    479 delete[] ev;
    \n+
    480 }
    \n+
    \n+
    481
    \n+
    \n+
    493 inline void computeSymCond2 (const Real& epsilon, Real& cond_2) const
    \n+
    494 {
    \n+
    495 // print verbosity information
    \n+
    496 if (verbosity_level_ > 0)
    \n+
    497 std::cout << title_ << "Computing an approximation of the "
    \n+
    498 << "spectral condition number of a matrix which "
    \n+
    499 << "is assumed to be symmetric." << std::endl;
    \n
    500
    \n-
    531 template <typename ISTLLinearSolver,
    \n-
    532 bool avoidLinSolverCrime = false>
    \n-
    \n-
    533 inline void applyRayleighQuotientIteration (const Real& epsilon,
    \n-
    534 ISTLLinearSolver& solver,
    \n-
    535 BlockVector& x, Real& lambda) const
    \n-
    536 {
    \n-
    537 // print verbosity information
    \n-
    538 if (verbosity_level_ > 0)
    \n-
    539 std::cout << title_
    \n-
    540 << "Performing Rayleigh quotient iteration for "
    \n-
    541 << "estimated eigenvalue " << lambda << "." << std::endl;
    \n+
    501 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n+
    502 // and to perform the product A*v (LU decomposition is not used)
    \n+
    503 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n+
    504 WrappedMatrix A(m_);
    \n+
    505
    \n+
    506 // get number of rows and columns in A
    \n+
    507 const int nrows = A.nrows();
    \n+
    508 const int ncols = A.ncols();
    \n+
    509
    \n+
    510 // assert that A is square
    \n+
    511 if (nrows != ncols)
    \n+
    512 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
    \n+
    513 << nrows << "x" << ncols << ").");
    \n+
    514
    \n+
    515 // allocate memory for variables, set parameters
    \n+
    516 const int nev = 2; // Number of eigenvalues to compute
    \n+
    517 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n+
    518 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n+
    519 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n+
    520 Real* ev = new Real[nev]; // Computed eigenvalues of A
    \n+
    521 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n+
    522 int nconv; // Number of converged eigenvalues
    \n+
    523
    \n+
    524 // define what we need: eigenvalues from both ends of the spectrum
    \n+
    525 char which[] = "BE";
    \n+
    526 ARSymStdEig<Real,WrappedMatrix>
    \n+
    527 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
    \n+
    528
    \n+
    529 // set ARPACK verbosity mode if requested
    \n+
    530 if (verbosity_level_ > 3) dprob.Trace();
    \n+
    531
    \n+
    532 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
    \n+
    533 nconv = dprob.Eigenvalues(ev,ivec);
    \n+
    534
    \n+
    535 // obtain approximated dominant and least dominant eigenvalue of A
    \n+
    536 const Real& lambda_max = ev[nev-1];
    \n+
    537 const Real& lambda_min = ev[0];
    \n+
    538
    \n+
    539 // obtain associated approximated eigenvectors of A
    \n+
    540 Real* x_max_raw = dprob.RawEigenvector(nev-1);
    \n+
    541 Real* x_min_raw = dprob.RawEigenvector(0);
    \n
    542
    \n-
    543 // allocate memory for linear solver statistics
    \n-
    544 Dune::InverseOperatorResult solver_statistics;
    \n+
    543 // obtain approximated spectral condition number of A
    \n+
    544 cond_2 = std::abs(lambda_max / lambda_min);
    \n
    545
    \n-
    546 // allocate memory for auxiliary variables
    \n-
    547 BlockVector y(x);
    \n-
    548 Real y_norm;
    \n-
    549 Real lambda_update;
    \n-
    550 BlockVector temp(x);
    \n-
    551
    \n-
    552 // perform Rayleigh quotient iteration
    \n-
    553 x *= (1.0 / x.two_norm());
    \n-
    554 Real r_norm = std::numeric_limits<Real>::max();
    \n-
    555 nIterations_ = 0;
    \n-
    556 while (r_norm > epsilon)
    \n+
    546 // obtain number of Arnoldi update iterations actually taken
    \n+
    547 nIterations_ = dprob.GetIter();
    \n+
    548
    \n+
    549 // compute each residual norm
    \n+
    550 Real* Ax_max_raw = new Real[nrows];
    \n+
    551 Real* Ax_min_raw = new Real[nrows];
    \n+
    552 A.multMv(x_max_raw,Ax_max_raw);
    \n+
    553 A.multMv(x_min_raw,Ax_min_raw);
    \n+
    554 Real r_max_norm = 0.0;
    \n+
    555 Real r_min_norm = 0.0;
    \n+
    556 for (int i = 0; i < nrows; ++i)
    \n
    557 {
    \n-
    558 // update and check number of iterations
    \n-\n-
    560 DUNE_THROW(Dune::ISTLError,"Rayleigh quotient iteration did not "
    \n-
    561 << "converge in " << nIterationsMax_ << " iterations "
    \n-
    562 << "(\u2551residual\u2551_2 = " << r_norm << ", epsilon = "
    \n-
    563 << epsilon << ").");
    \n-
    564
    \n-
    565 // update iteration operator,
    \n-
    566 // update iteration matrix when needed
    \n-
    567 updateShiftMu(lambda,solver);
    \n-
    568
    \n-
    569 // do one iteration of the Rayleigh quotient iteration algorithm,
    \n-
    570 // part 1: solve (m_ - lambda*I) * y = x for y
    \n-
    571 // (protect x from being changed)
    \n-
    572 temp = x;
    \n-
    573 solver.apply(y,temp,solver_statistics);
    \n-
    574
    \n-
    575 // get norm of y
    \n-
    576 y_norm = y.two_norm();
    \n-
    577
    \n-
    578 // compile time switch between accuracy and efficiency
    \n-
    579 if (avoidLinSolverCrime)
    \n-
    580 {
    \n-
    581 // get approximated eigenvalue lambda via the Rayleigh quotient
    \n-
    582 // (use that x_new = y / y_norm)
    \n-
    583 m_.mv(y,temp);
    \n-
    584 lambda = (y * temp) / (y_norm * y_norm);
    \n-
    585
    \n-
    586 // get norm of residual
    \n-
    587 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)
    \n-
    588 temp.axpy(-lambda,y);
    \n-
    589 r_norm = temp.two_norm() / y_norm;
    \n-
    590 }
    \n-
    591 else
    \n-
    592 {
    \n-
    593 // get approximated eigenvalue lambda via the Rayleigh quotient
    \n-
    594 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)
    \n-
    595 lambda_update = (y * x) / (y_norm * y_norm);
    \n-
    596 lambda += lambda_update;
    \n-
    597
    \n-
    598 // get norm of residual
    \n-
    599 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)
    \n-
    600 temp = x; temp.axpy(-lambda_update,y);
    \n-
    601 r_norm = temp.two_norm() / y_norm;
    \n-
    602 }
    \n-
    603
    \n-
    604 // do one iteration of the Rayleigh quotient iteration algorithm,
    \n-
    605 // part 2: update x
    \n-
    606 x = y;
    \n-
    607 x *= (1.0 / y_norm);
    \n-
    608
    \n-
    609 // print verbosity information
    \n-
    610 if (verbosity_level_ > 1)
    \n-
    611 std::cout << blank_ << std::left
    \n-
    612 << "iteration " << std::setw(3) << nIterations_
    \n-
    613 << " (\u2551residual\u2551_2 = " << std::setw(11) << r_norm
    \n-
    614 << "): \u03bb = " << lambda << std::endl
    \n-
    615 << std::resetiosflags(std::ios::left);
    \n-
    616 }
    \n+
    558 r_max_norm += std::pow(Ax_max_raw[i] - lambda_max * x_max_raw[i],2);
    \n+
    559 r_min_norm += std::pow(Ax_min_raw[i] - lambda_min * x_min_raw[i],2);
    \n+
    560 }
    \n+
    561 r_max_norm = std::sqrt(r_max_norm);
    \n+
    562 r_min_norm = std::sqrt(r_min_norm);
    \n+
    563
    \n+
    564 // print verbosity information
    \n+
    565 if (verbosity_level_ > 0)
    \n+
    566 {
    \n+
    567 if (verbosity_level_ > 1)
    \n+
    568 {
    \n+
    569 // print some information about the problem
    \n+
    570 std::cout << blank_ << "Obtained eigenvalues of A by solving "
    \n+
    571 << "A*x = \u03bb*x using the ARPACK++ class ARSym"
    \n+
    572 << "StdEig:" << std::endl;
    \n+
    573 std::cout << blank_ << " converged eigenvalues of A: "
    \n+
    574 << nconv << " / " << nev << std::endl;
    \n+
    575 std::cout << blank_ << " dominant eigenvalue of A: "
    \n+
    576 << lambda_max << std::endl;
    \n+
    577 std::cout << blank_ << " least dominant eigenvalue of A: "
    \n+
    578 << lambda_min << std::endl;
    \n+
    579 std::cout << blank_ << " spectral condition number of A: "
    \n+
    580 << cond_2 << std::endl;
    \n+
    581 }
    \n+
    582 std::cout << blank_ << "Result ("
    \n+
    583 << "#iterations = " << nIterations_ << ", "
    \n+
    584 << "\u2551residual\u2551_2 = {" << r_max_norm << ","
    \n+
    585 << r_min_norm << "}, " << "\u03bb = {"
    \n+
    586 << lambda_max << "," << lambda_min
    \n+
    587 << "}): cond_2 = " << cond_2 << std::endl;
    \n+
    588 }
    \n+
    589
    \n+
    590 // free dynamically allocated memory
    \n+
    591 delete[] Ax_min_raw;
    \n+
    592 delete[] Ax_max_raw;
    \n+
    593 delete[] ev;
    \n+
    594 }
    \n+
    \n+
    595
    \n+
    \n+
    609 inline void computeNonSymMax (const Real& epsilon,
    \n+
    610 BlockVector& x, Real& sigma) const
    \n+
    611 {
    \n+
    612 // print verbosity information
    \n+
    613 if (verbosity_level_ > 0)
    \n+
    614 std::cout << title_ << "Computing an approximation of the "
    \n+
    615 << "largest singular value of a matrix which "
    \n+
    616 << "is assumed to be nonsymmetric." << std::endl;
    \n
    617
    \n-
    618 // print verbosity information
    \n-
    619 if (verbosity_level_ > 0)
    \n-
    620 {
    \n-
    621 std::cout << blank_ << "Result ("
    \n-
    622 << "#iterations = " << nIterations_ << ", "
    \n-
    623 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n-
    624 << "\u03bb = " << lambda << std::endl;
    \n-
    625 if (verbosity_level_ > 2)
    \n-
    626 {
    \n-
    627 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n-
    628 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n-
    629 }
    \n-
    630 }
    \n-
    631 }
    \n-
    \n+
    618 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n+
    619 // and to perform the product A^T*A*v (LU decomposition is not used)
    \n+
    620 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n+
    621 WrappedMatrix A(m_);
    \n+
    622
    \n+
    623 // get number of rows and columns in A
    \n+
    624 const int nrows = A.nrows();
    \n+
    625 const int ncols = A.ncols();
    \n+
    626
    \n+
    627 // assert that A has more rows than columns (extend code later to the opposite case!)
    \n+
    628 if (nrows < ncols)
    \n+
    629 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
    \n+
    630 << "columns (" << nrows << "x" << ncols << ")."
    \n+
    631 << " This case is not implemented, yet.");
    \n
    632
    \n-
    689 template <typename ISTLLinearSolver,
    \n-
    690 bool avoidLinSolverCrime = false>
    \n-
    \n-
    691 inline void applyTLIMEIteration (const Real& gamma, const Real& eta,
    \n-
    692 const Real& epsilon,
    \n-
    693 ISTLLinearSolver& solver,
    \n-
    694 const Real& delta, const std::size_t& m,
    \n-
    695 bool& extrnl,
    \n-
    696 BlockVector& x, Real& lambda) const
    \n-
    697 {
    \n-
    698 // use same variable names as in [Szyld, 1988]
    \n-
    699 BlockVector& x_s = x;
    \n-
    700 Real& mu_s = lambda;
    \n-
    701
    \n-
    702 // print verbosity information
    \n-
    703 if (verbosity_level_ > 0)
    \n-
    704 std::cout << title_
    \n-
    705 << "Performing TLIME iteration for "
    \n-
    706 << "estimated eigenvalue in the "
    \n-
    707 << "interval (" << gamma - eta << ","
    \n-
    708 << gamma + eta << ")." << std::endl;
    \n-
    709
    \n-
    710 // allocate memory for linear solver statistics
    \n-
    711 Dune::InverseOperatorResult solver_statistics;
    \n-
    712
    \n-
    713 // allocate memory for auxiliary variables
    \n-
    714 bool doRQI;
    \n-
    715 Real mu;
    \n-
    716 BlockVector y(x_s);
    \n-
    717 Real omega;
    \n-
    718 Real mu_s_old;
    \n-
    719 Real mu_s_update;
    \n-
    720 BlockVector temp(x_s);
    \n-
    721 Real q_norm, r_norm;
    \n-
    722
    \n-
    723 // perform TLIME iteration
    \n-
    724 x_s *= (1.0 / x_s.two_norm());
    \n-
    725 extrnl = true;
    \n-
    726 doRQI = false;
    \n-
    727 r_norm = std::numeric_limits<Real>::max();
    \n-
    728 nIterations_ = 0;
    \n-
    729 while (r_norm > epsilon)
    \n-
    730 {
    \n-
    731 // update and check number of iterations
    \n-\n-
    733 DUNE_THROW(Dune::ISTLError,"TLIME iteration did not "
    \n-
    734 << "converge in " << nIterationsMax_
    \n-
    735 << " iterations (\u2551residual\u2551_2 = " << r_norm
    \n-
    736 << ", epsilon = " << epsilon << ").");
    \n-
    737
    \n-
    738 // set shift for next iteration according to inverse iteration
    \n-
    739 // with shift (II) resp. Rayleigh quotient iteration (RQI)
    \n-
    740 if (doRQI)
    \n-
    741 mu = mu_s;
    \n-
    742 else
    \n-
    743 mu = gamma;
    \n+
    633 // allocate memory for variables, set parameters
    \n+
    634 const int nev = 1; // Number of eigenvalues to compute
    \n+
    635 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n+
    636 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n+
    637 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n+
    638 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
    \n+
    639 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n+
    640 int nconv; // Number of converged eigenvalues
    \n+
    641
    \n+
    642 // define what we need: eigenvalues with largest algebraic value
    \n+
    643 char which[] = "LA";
    \n+
    644 ARSymStdEig<Real,WrappedMatrix>
    \n+
    645 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
    \n+
    646
    \n+
    647 // set ARPACK verbosity mode if requested
    \n+
    648 if (verbosity_level_ > 3) dprob.Trace();
    \n+
    649
    \n+
    650 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
    \n+
    651 nconv = dprob.Eigenvalues(ev,ivec);
    \n+
    652
    \n+
    653 // obtain approximated largest eigenvalue of A^T*A
    \n+
    654 const Real& lambda = ev[nev-1];
    \n+
    655
    \n+
    656 // obtain associated approximated eigenvector of A^T*A
    \n+
    657 Real* x_raw = dprob.RawEigenvector(nev-1);
    \n+
    658 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
    \n+
    659
    \n+
    660 // obtain number of Arnoldi update iterations actually taken
    \n+
    661 nIterations_ = dprob.GetIter();
    \n+
    662
    \n+
    663 // compute residual norm
    \n+
    664 BlockVector r(x);
    \n+
    665 Real* AtAx_raw = new Real[ncols];
    \n+
    666 A.multMtMv(x_raw,AtAx_raw);
    \n+
    667 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);
    \n+
    668 r.axpy(-lambda,x);
    \n+
    669 const Real r_norm = r.two_norm();
    \n+
    670
    \n+
    671 // calculate largest singular value of A (note that
    \n+
    672 // x is right-singular / left-singular vector of A)
    \n+
    673 sigma = std::sqrt(lambda);
    \n+
    674
    \n+
    675 // print verbosity information
    \n+
    676 if (verbosity_level_ > 0)
    \n+
    677 {
    \n+
    678 if (verbosity_level_ > 1)
    \n+
    679 {
    \n+
    680 // print some information about the problem
    \n+
    681 std::cout << blank_ << "Obtained singular values of A by sol"
    \n+
    682 << "ving (A^T*A)*x = \u03c3\u00b2*x using the ARPACK++ "
    \n+
    683 << "class ARSymStdEig:" << std::endl;
    \n+
    684 std::cout << blank_ << " converged eigenvalues of A^T*A: "
    \n+
    685 << nconv << " / " << nev << std::endl;
    \n+
    686 std::cout << blank_ << " largest eigenvalue of A^T*A: "
    \n+
    687 << lambda << std::endl;
    \n+
    688 std::cout << blank_ << " => largest singular value of A: "
    \n+
    689 << sigma << std::endl;
    \n+
    690 }
    \n+
    691 std::cout << blank_ << "Result ("
    \n+
    692 << "#iterations = " << nIterations_ << ", "
    \n+
    693 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n+
    694 << "\u03c3 = " << sigma << std::endl;
    \n+
    695 if (verbosity_level_ > 2)
    \n+
    696 {
    \n+
    697 // print approximated right-singular / left-singular vector
    \n+
    698 // via DUNE-ISTL I/O methods
    \n+
    699 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n+
    700 }
    \n+
    701 }
    \n+
    702
    \n+
    703 // free dynamically allocated memory
    \n+
    704 delete[] AtAx_raw;
    \n+
    705 delete[] ev;
    \n+
    706 }
    \n+
    \n+
    707
    \n+
    \n+
    721 inline void computeNonSymMin (const Real& epsilon,
    \n+
    722 BlockVector& x, Real& sigma) const
    \n+
    723 {
    \n+
    724 // print verbosity information
    \n+
    725 if (verbosity_level_ > 0)
    \n+
    726 std::cout << title_ << "Computing an approximation of the "
    \n+
    727 << "smallest singular value of a matrix which "
    \n+
    728 << "is assumed to be nonsymmetric." << std::endl;
    \n+
    729
    \n+
    730 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n+
    731 // and to perform the product A^T*A*v (LU decomposition is not used)
    \n+
    732 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n+
    733 WrappedMatrix A(m_);
    \n+
    734
    \n+
    735 // get number of rows and columns in A
    \n+
    736 const int nrows = A.nrows();
    \n+
    737 const int ncols = A.ncols();
    \n+
    738
    \n+
    739 // assert that A has more rows than columns (extend code later to the opposite case!)
    \n+
    740 if (nrows < ncols)
    \n+
    741 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
    \n+
    742 << "columns (" << nrows << "x" << ncols << ")."
    \n+
    743 << " This case is not implemented, yet.");
    \n
    744
    \n-
    745 // update II/RQI iteration operator,
    \n-
    746 // update II/RQI iteration matrix when needed
    \n-
    747 updateShiftMu(mu,solver);
    \n-
    748
    \n-
    749 // do one iteration of the II/RQI algorithm,
    \n-
    750 // part 1: solve (m_ - mu*I) * y = x for y
    \n-
    751 temp = x_s;
    \n-
    752 solver.apply(y,temp,solver_statistics);
    \n+
    745 // allocate memory for variables, set parameters
    \n+
    746 const int nev = 1; // Number of eigenvalues to compute
    \n+
    747 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n+
    748 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n+
    749 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n+
    750 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
    \n+
    751 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n+
    752 int nconv; // Number of converged eigenvalues
    \n
    753
    \n-
    754 // do one iteration of the II/RQI algorithm,
    \n-
    755 // part 2: compute omega
    \n-
    756 omega = (1.0 / y.two_norm());
    \n-
    757
    \n-
    758 // backup the old Rayleigh quotient
    \n-
    759 mu_s_old = mu_s;
    \n-
    760
    \n-
    761 // compile time switch between accuracy and efficiency
    \n-
    762 if (avoidLinSolverCrime)
    \n-
    763 {
    \n-
    764 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue
    \n-
    765 // (use that x_new = y * omega)
    \n-
    766 m_.mv(y,temp);
    \n-
    767 mu_s = (y * temp) * (omega * omega);
    \n-
    768
    \n-
    769 // get norm of "the residual with respect to the shift used by II",
    \n-
    770 // use normal representation of q
    \n-
    771 // (use that x_new = y * omega, use that temp = m_ * y)
    \n-
    772 temp.axpy(-gamma,y);
    \n-
    773 q_norm = temp.two_norm() * omega;
    \n+
    754 // define what we need: eigenvalues with smallest algebraic value
    \n+
    755 char which[] = "SA";
    \n+
    756 ARSymStdEig<Real,WrappedMatrix>
    \n+
    757 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
    \n+
    758
    \n+
    759 // set ARPACK verbosity mode if requested
    \n+
    760 if (verbosity_level_ > 3) dprob.Trace();
    \n+
    761
    \n+
    762 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
    \n+
    763 nconv = dprob.Eigenvalues(ev,ivec);
    \n+
    764
    \n+
    765 // obtain approximated smallest eigenvalue of A^T*A
    \n+
    766 const Real& lambda = ev[nev-1];
    \n+
    767
    \n+
    768 // obtain associated approximated eigenvector of A^T*A
    \n+
    769 Real* x_raw = dprob.RawEigenvector(nev-1);
    \n+
    770 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
    \n+
    771
    \n+
    772 // obtain number of Arnoldi update iterations actually taken
    \n+
    773 nIterations_ = dprob.GetIter();
    \n
    774
    \n-
    775 // get norm of "the residual with respect to the Rayleigh quotient"
    \n-
    776 r_norm = q_norm*q_norm - (gamma-mu_s)*(gamma-mu_s);
    \n-
    777 // prevent that truncation errors invalidate the norm
    \n-
    778 // (we don't want to calculate sqrt of a negative number)
    \n-
    779 if (r_norm >= 0)
    \n-
    780 {
    \n-
    781 // use relation between the norms of r and q for efficiency
    \n-
    782 r_norm = std::sqrt(r_norm);
    \n-
    783 }
    \n-
    784 else
    \n-
    785 {
    \n-
    786 // use relation between r and q
    \n-
    787 // (use that x_new = y * omega, use that temp = (m_ - gamma*I) * y = q / omega)
    \n-
    788 temp.axpy(gamma-mu_s,y);
    \n-
    789 r_norm = temp.two_norm() * omega;
    \n-
    790 }
    \n-
    791 }
    \n-
    792 else
    \n-
    793 {
    \n-
    794 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue
    \n-
    795 if (!doRQI)
    \n-
    796 {
    \n-
    797 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = x_s)
    \n-
    798 mu_s = gamma + (y * x_s) * (omega * omega);
    \n-
    799 }
    \n-
    800 else
    \n-
    801 {
    \n-
    802 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y = x_s)
    \n-
    803 mu_s_update = (y * x_s) * (omega * omega);
    \n-
    804 mu_s += mu_s_update;
    \n-
    805 }
    \n-
    806
    \n-
    807 // get norm of "the residual with respect to the shift used by II"
    \n-
    808 if (!doRQI)
    \n-
    809 {
    \n-
    810 // use special representation of q in the II case
    \n-
    811 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y = x_s)
    \n-
    812 q_norm = omega;
    \n-
    813 }
    \n-
    814 else
    \n-
    815 {
    \n-
    816 // use special representation of q in the RQI case
    \n-
    817 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y = x_s)
    \n-
    818 temp = x_s; temp.axpy(mu_s-gamma,y);
    \n-
    819 q_norm = temp.two_norm() * omega;
    \n-
    820 }
    \n-
    821
    \n-
    822 // get norm of "the residual with respect to the Rayleigh quotient"
    \n-
    823 // don't use efficient relation between the norms of r and q, as
    \n-
    824 // this relation seems to yield a less accurate r_norm in the case
    \n-
    825 // where linear solver crime is admitted
    \n-
    826 if (!doRQI)
    \n-
    827 {
    \n-
    828 // (use that x_new = y * omega and use that (m_ - gamma*I) * y = x_s)
    \n-
    829 temp = x_s; temp.axpy(gamma-lambda,y);
    \n-
    830 r_norm = temp.two_norm() * omega;
    \n-
    831 }
    \n-
    832 else
    \n-
    833 {
    \n-
    834 // (use that x_new = y * omega and use that (m_ - mu_s_old*I) * y = x_s)
    \n-
    835 temp = x_s; temp.axpy(-mu_s_update,y);
    \n-
    836 r_norm = temp.two_norm() * omega;
    \n-
    837 }
    \n-
    838 }
    \n-
    839
    \n-
    840 // do one iteration of the II/RQI algorithm,
    \n-
    841 // part 3: update x
    \n-
    842 x_s = y; x_s *= omega;
    \n-
    843
    \n-
    844 // // for relative residual norm mode, scale with mu_s^{-1}
    \n-
    845 // r_norm /= std::abs(mu_s);
    \n+
    775 // compute residual norm
    \n+
    776 BlockVector r(x);
    \n+
    777 Real* AtAx_raw = new Real[ncols];
    \n+
    778 A.multMtMv(x_raw,AtAx_raw);
    \n+
    779 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);
    \n+
    780 r.axpy(-lambda,x);
    \n+
    781 const Real r_norm = r.two_norm();
    \n+
    782
    \n+
    783 // calculate smallest singular value of A (note that
    \n+
    784 // x is right-singular / left-singular vector of A)
    \n+
    785 sigma = std::sqrt(lambda);
    \n+
    786
    \n+
    787 // print verbosity information
    \n+
    788 if (verbosity_level_ > 0)
    \n+
    789 {
    \n+
    790 if (verbosity_level_ > 1)
    \n+
    791 {
    \n+
    792 // print some information about the problem
    \n+
    793 std::cout << blank_ << "Obtained singular values of A by sol"
    \n+
    794 << "ving (A^T*A)*x = \u03c3\u00b2*x using the ARPACK++ "
    \n+
    795 << "class ARSymStdEig:" << std::endl;
    \n+
    796 std::cout << blank_ << " converged eigenvalues of A^T*A: "
    \n+
    797 << nconv << " / " << nev << std::endl;
    \n+
    798 std::cout << blank_ << " smallest eigenvalue of A^T*A: "
    \n+
    799 << lambda << std::endl;
    \n+
    800 std::cout << blank_ << " => smallest singular value of A: "
    \n+
    801 << sigma << std::endl;
    \n+
    802 }
    \n+
    803 std::cout << blank_ << "Result ("
    \n+
    804 << "#iterations = " << nIterations_ << ", "
    \n+
    805 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n+
    806 << "\u03c3 = " << sigma << std::endl;
    \n+
    807 if (verbosity_level_ > 2)
    \n+
    808 {
    \n+
    809 // print approximated right-singular / left-singular vector
    \n+
    810 // via DUNE-ISTL I/O methods
    \n+
    811 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n+
    812 }
    \n+
    813 }
    \n+
    814
    \n+
    815 // free dynamically allocated memory
    \n+
    816 delete[] AtAx_raw;
    \n+
    817 delete[] ev;
    \n+
    818 }
    \n+
    \n+
    819
    \n+
    \n+
    830 inline void computeNonSymCond2 (const Real& epsilon, Real& cond_2) const
    \n+
    831 {
    \n+
    832 // print verbosity information
    \n+
    833 if (verbosity_level_ > 0)
    \n+
    834 std::cout << title_ << "Computing an approximation of the "
    \n+
    835 << "spectral condition number of a matrix which "
    \n+
    836 << "is assumed to be nonsymmetric." << std::endl;
    \n+
    837
    \n+
    838 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n+
    839 // and to perform the product A^T*A*v (LU decomposition is not used)
    \n+
    840 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n+
    841 WrappedMatrix A(m_);
    \n+
    842
    \n+
    843 // get number of rows and columns in A
    \n+
    844 const int nrows = A.nrows();
    \n+
    845 const int ncols = A.ncols();
    \n
    846
    \n-
    847 // print verbosity information
    \n-
    848 if (verbosity_level_ > 1)
    \n-
    849 std::cout << blank_ << "iteration "
    \n-
    850 << std::left << std::setw(3) << nIterations_
    \n-
    851 << " (" << (doRQI ? "RQI," : "II, ")
    \n-
    852 << " " << (doRQI ? "\u2014>" : " ") << " "
    \n-
    853 << "\u2551r\u2551_2 = " << std::setw(11) << r_norm
    \n-
    854 << ", " << (doRQI ? " " : "\u2014>") << " "
    \n-
    855 << "\u2551q\u2551_2 = " << std::setw(11) << q_norm
    \n-
    856 << "): \u03bb = " << lambda << std::endl
    \n-
    857 << std::resetiosflags(std::ios::left);
    \n-
    858
    \n-
    859 // check if the eigenvalue closest to gamma lies in J
    \n-
    860 if (!doRQI && q_norm < eta)
    \n-
    861 {
    \n-
    862 // J is not free of eigenvalues
    \n-
    863 extrnl = false;
    \n-
    864
    \n-
    865 // by theory we know now that mu_s also lies in J
    \n-
    866 assert(std::abs(mu_s-gamma) < eta);
    \n-
    867
    \n-
    868 // switch to RQI
    \n-
    869 doRQI = true;
    \n-
    870 }
    \n-
    871
    \n-
    872 // revert to II if J is not free of eigenvalues but
    \n-
    873 // at some point mu_s falls back again outside J
    \n-
    874 if (!extrnl && doRQI && std::abs(mu_s-gamma) >= eta)
    \n-
    875 doRQI = false;
    \n+
    847 // assert that A has more rows than columns (extend code later to the opposite case!)
    \n+
    848 if (nrows < ncols)
    \n+
    849 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
    \n+
    850 << "columns (" << nrows << "x" << ncols << ")."
    \n+
    851 << " This case is not implemented, yet.");
    \n+
    852
    \n+
    853 // allocate memory for variables, set parameters
    \n+
    854 const int nev = 2; // Number of eigenvalues to compute
    \n+
    855 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n+
    856 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n+
    857 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n+
    858 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
    \n+
    859 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n+
    860 int nconv; // Number of converged eigenvalues
    \n+
    861
    \n+
    862 // define what we need: eigenvalues from both ends of the spectrum
    \n+
    863 char which[] = "BE";
    \n+
    864 ARSymStdEig<Real,WrappedMatrix>
    \n+
    865 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
    \n+
    866
    \n+
    867 // set ARPACK verbosity mode if requested
    \n+
    868 if (verbosity_level_ > 3) dprob.Trace();
    \n+
    869
    \n+
    870 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
    \n+
    871 nconv = dprob.Eigenvalues(ev,ivec);
    \n+
    872
    \n+
    873 // obtain approximated largest and smallest eigenvalue of A^T*A
    \n+
    874 const Real& lambda_max = ev[nev-1];
    \n+
    875 const Real& lambda_min = ev[0];
    \n
    876
    \n-
    877 // if eigenvalue closest to gamma does not lie in J use RQI
    \n-
    878 // solely to accelerate the convergence to this eigenvalue
    \n-
    879 // when II has become stationary
    \n-
    880 if (extrnl && !doRQI)
    \n-
    881 {
    \n-
    882 // switch to RQI if the relative change of the Rayleigh
    \n-
    883 // quotient indicates that II has become stationary
    \n-
    884 if (nIterations_ >= m &&
    \n-
    885 std::abs(mu_s - mu_s_old) / std::abs(mu_s) < delta)
    \n-
    886 doRQI = true;
    \n-
    887 }
    \n-
    888 }
    \n-
    889
    \n-
    890 // // compute final residual and lambda again (paranoia....)
    \n-
    891 // m_.mv(x_s,temp);
    \n-
    892 // mu_s = x_s * temp;
    \n-
    893 // temp.axpy(-mu_s,x_s);
    \n-
    894 // r_norm = temp.two_norm();
    \n-
    895 // // r_norm /= std::abs(mu_s);
    \n-
    896
    \n-
    897 // print verbosity information
    \n-
    898 if (verbosity_level_ > 0)
    \n-
    899 {
    \n-
    900 if (extrnl)
    \n-
    901 std::cout << blank_ << "Interval "
    \n-
    902 << "(" << gamma - eta << "," << gamma + eta
    \n-
    903 << ") is free of eigenvalues, approximating "
    \n-
    904 << "the closest eigenvalue." << std::endl;
    \n-
    905 std::cout << blank_ << "Result ("
    \n-
    906 << "#iterations = " << nIterations_ << ", "
    \n-
    907 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n-
    908 << "\u03bb = " << lambda << std::endl;
    \n-
    909 if (verbosity_level_ > 2)
    \n+
    877 // obtain associated approximated eigenvectors of A^T*A
    \n+
    878 Real* x_max_raw = dprob.RawEigenvector(nev-1);
    \n+
    879 Real* x_min_raw = dprob.RawEigenvector(0);
    \n+
    880
    \n+
    881 // obtain number of Arnoldi update iterations actually taken
    \n+
    882 nIterations_ = dprob.GetIter();
    \n+
    883
    \n+
    884 // compute each residual norm
    \n+
    885 Real* AtAx_max_raw = new Real[ncols];
    \n+
    886 Real* AtAx_min_raw = new Real[ncols];
    \n+
    887 A.multMtMv(x_max_raw,AtAx_max_raw);
    \n+
    888 A.multMtMv(x_min_raw,AtAx_min_raw);
    \n+
    889 Real r_max_norm = 0.0;
    \n+
    890 Real r_min_norm = 0.0;
    \n+
    891 for (int i = 0; i < ncols; ++i)
    \n+
    892 {
    \n+
    893 r_max_norm += std::pow(AtAx_max_raw[i] - lambda_max * x_max_raw[i],2);
    \n+
    894 r_min_norm += std::pow(AtAx_min_raw[i] - lambda_min * x_min_raw[i],2);
    \n+
    895 }
    \n+
    896 r_max_norm = std::sqrt(r_max_norm);
    \n+
    897 r_min_norm = std::sqrt(r_min_norm);
    \n+
    898
    \n+
    899 // calculate largest and smallest singular value of A
    \n+
    900 const Real sigma_max = std::sqrt(lambda_max);
    \n+
    901 const Real sigma_min = std::sqrt(lambda_min);
    \n+
    902
    \n+
    903 // obtain approximated spectral condition number of A
    \n+
    904 cond_2 = sigma_max / sigma_min;
    \n+
    905
    \n+
    906 // print verbosity information
    \n+
    907 if (verbosity_level_ > 0)
    \n+
    908 {
    \n+
    909 if (verbosity_level_ > 1)
    \n
    910 {
    \n-
    911 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n-
    912 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n-
    913 }
    \n-
    914 }
    \n-
    915 }
    \n-
    \n-
    916
    \n-
    \n-\n-
    926 {
    \n-
    927 // return iteration operator
    \n-
    928 return itOperator_;
    \n-
    929 }
    \n-
    \n-
    930
    \n-
    \n-
    945 inline const BCRSMatrix& getIterationMatrix () const
    \n-
    946 {
    \n-
    947 // create iteration matrix on demand
    \n-
    948 if (!itMatrix_)
    \n-
    949 itMatrix_ = std::make_unique<BCRSMatrix>(m_);
    \n-
    950
    \n-
    951 // return iteration matrix
    \n-
    952 return *itMatrix_;
    \n-
    953 }
    \n-
    \n-
    954
    \n-
    \n-
    959 inline unsigned int getIterationCount () const
    \n-
    960 {
    \n-
    961 if (nIterations_ == 0)
    \n-
    962 DUNE_THROW(Dune::ISTLError,"No algorithm applied, yet.");
    \n-
    963
    \n-
    964 return nIterations_;
    \n-
    965 }
    \n-
    \n-
    966
    \n-
    967 protected:
    \n-
    982 template <typename ISTLLinearSolver>
    \n-
    \n-
    983 inline void updateShiftMu (const Real& mu,
    \n-
    984 ISTLLinearSolver& solver) const
    \n-
    985 {
    \n-
    986 // do nothing if new shift equals the old one
    \n-
    987 if (mu == mu_) return;
    \n-
    988
    \n-
    989 // update shift mu_, i.e. update iteration operator
    \n-
    990 mu_ = mu;
    \n-
    991
    \n-
    992 // update iteration matrix when needed
    \n-
    993 if (itMatrix_)
    \n-
    994 {
    \n-
    995 // iterate over entries in iteration matrix diagonal
    \n-
    996 constexpr int rowBlockSize = BCRSMatrix::block_type::rows;
    \n-
    997 constexpr int colBlockSize = BCRSMatrix::block_type::cols;
    \n-
    998 for (typename BCRSMatrix::size_type i = 0;
    \n-
    999 i < itMatrix_->M()*rowBlockSize; ++i)
    \n-
    1000 {
    \n-
    1001 // access m_[i,i] where i is the flat index of a row/column
    \n-
    1002 const Real& m_entry = m_
    \n-
    1003 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];
    \n-
    1004 // access *itMatrix[i,i] where i is the flat index of a row/column
    \n-
    1005 Real& entry = (*itMatrix_)
    \n-
    1006 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];
    \n-
    1007 // change current entry in iteration matrix diagonal
    \n-
    1008 entry = m_entry - mu_;
    \n-
    1009 }
    \n-
    1010 // notify linear solver about change of the iteration matrix object
    \n-\n-
    1012 (solver,*itMatrix_);
    \n-
    1013 }
    \n-
    1014 }
    \n-
    \n-
    1015
    \n-
    1016 protected:
    \n-
    1017 // parameters related to iterative eigenvalue algorithms
    \n-\n-
    1019 const unsigned int nIterationsMax_;
    \n-
    1020
    \n-
    1021 // verbosity setting
    \n-
    1022 const unsigned int verbosity_level_;
    \n-
    1023
    \n-
    1024 // shift mu_ used by iteration operator/matrix (m_ - mu_*I)
    \n-
    1025 mutable Real mu_;
    \n-
    1026
    \n-
    1027 // iteration operator (m_ - mu_*I), passing shift mu_ by reference
    \n-\n-\n-\n-
    1031
    \n-
    1032 // iteration matrix (m_ - mu_*I), provided on demand when needed
    \n-
    1033 // (e.g. for preconditioning)
    \n-
    1034 mutable std::unique_ptr<BCRSMatrix> itMatrix_;
    \n-
    1035
    \n-
    1036 // memory for storing temporary variables (mutable as they shall
    \n-
    1037 // just be effectless auxiliary variables of the const apply*(...)
    \n-
    1038 // methods)
    \n-
    1039 mutable unsigned int nIterations_;
    \n-
    1040
    \n-
    1041 // constants for printing verbosity information
    \n-
    1042 const std::string title_;
    \n-
    1043 const std::string blank_;
    \n-
    1044 };
    \n-
    \n-
    1045
    \n-
    1048} // namespace Dune
    \n-
    1049
    \n-
    1050#endif // DUNE_ISTL_EIGENVALUE_POWERITERATION_HH
    \n-
    Some generic functions for pretty printing vectors and matrices.
    \n-
    Helper functions for determining the vector/matrix block level.
    \n-\n-\n-
    Implementations of the inverse operator interface.
    \n-
    Define general, extensible interface for operators. The available implementation wraps a matrix.
    \n-
    Templates characterizing the type of a solver.
    \n+
    911 // print some information about the problem
    \n+
    912 std::cout << blank_ << "Obtained singular values of A by sol"
    \n+
    913 << "ving (A^T*A)*x = \u03c3\u00b2*x using the ARPACK++ "
    \n+
    914 << "class ARSymStdEig:" << std::endl;
    \n+
    915 std::cout << blank_ << " converged eigenvalues of A^T*A: "
    \n+
    916 << nconv << " / " << nev << std::endl;
    \n+
    917 std::cout << blank_ << " largest eigenvalue of A^T*A: "
    \n+
    918 << lambda_max << std::endl;
    \n+
    919 std::cout << blank_ << " smallest eigenvalue of A^T*A: "
    \n+
    920 << lambda_min << std::endl;
    \n+
    921 std::cout << blank_ << " => largest singular value of A: "
    \n+
    922 << sigma_max << std::endl;
    \n+
    923 std::cout << blank_ << " => smallest singular value of A: "
    \n+
    924 << sigma_min << std::endl;
    \n+
    925 }
    \n+
    926 std::cout << blank_ << "Result ("
    \n+
    927 << "#iterations = " << nIterations_ << ", "
    \n+
    928 << "\u2551residual\u2551_2 = {" << r_max_norm << ","
    \n+
    929 << r_min_norm << "}, " << "\u03c3 = {"
    \n+
    930 << sigma_max << "," << sigma_min
    \n+
    931 << "}): cond_2 = " << cond_2 << std::endl;
    \n+
    932 }
    \n+
    933
    \n+
    934 // free dynamically allocated memory
    \n+
    935 delete[] AtAx_min_raw;
    \n+
    936 delete[] AtAx_max_raw;
    \n+
    937 delete[] ev;
    \n+
    938 }
    \n+
    \n+
    939
    \n+
    \n+
    944 inline unsigned int getIterationCount () const
    \n+
    945 {
    \n+
    946 if (nIterations_ == 0)
    \n+
    947 DUNE_THROW(Dune::ISTLError,"No algorithm applied, yet.");
    \n+
    948
    \n+
    949 return nIterations_;
    \n+
    950 }
    \n+
    \n+
    951
    \n+
    952 protected:
    \n+
    953 // parameters related to iterative eigenvalue algorithms
    \n+\n+
    955 const unsigned int nIterationsMax_;
    \n+
    956
    \n+
    957 // verbosity setting
    \n+
    958 const unsigned int verbosity_level_;
    \n+
    959
    \n+
    960 // memory for storing temporary variables (mutable as they shall
    \n+
    961 // just be effectless auxiliary variables of the const apply*(...)
    \n+
    962 // methods)
    \n+
    963 mutable unsigned int nIterations_;
    \n+
    964
    \n+
    965 // constants for printing verbosity information
    \n+
    966 const std::string title_;
    \n+
    967 const std::string blank_;
    \n+
    968 };
    \n+
    \n+
    969
    \n+
    972} // namespace Dune
    \n+
    973
    \n+
    974#endif // HAVE_ARPACKPP
    \n+
    975
    \n+
    976#endif // DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
    \n+
    Some generic functions for pretty printing vectors and matrices.
    \n+\n+
    Helper functions for determining the vector/matrix block level.
    \n+
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n
    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
    \n
    Definition allocator.hh:11
    \n
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n-
    size_type M() const
    number of columns (counted in blocks)
    Definition bcrsmatrix.hh:2007
    \n-
    void mv(const X &x, Y &y) const
    y = A x
    Definition bcrsmatrix.hh:1641
    \n-
    size_type N() const
    number of rows (counted in blocks)
    Definition bcrsmatrix.hh:2001
    \n+
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bcrsmatrix.hh:488
    \n
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bvector.hh:398
    \n-
    Iterative eigenvalue algorithms based on power iteration.
    Definition poweriteration.hh:176
    \n-
    std::unique_ptr< BCRSMatrix > itMatrix_
    Definition poweriteration.hh:1034
    \n-
    PowerIteration_Algorithms(const PowerIteration_Algorithms &)=delete
    \n-
    Impl::ScalingLinearOperator< BlockVector > ScalingOperator
    Definition poweriteration.hh:181
    \n-
    const std::string blank_
    Definition poweriteration.hh:1043
    \n-
    Impl::LinearOperatorSum< MatrixOperator, ScalingOperator > OperatorSum
    Definition poweriteration.hh:182
    \n-
    Dune::MatrixAdapter< BCRSMatrix, BlockVector, BlockVector > MatrixOperator
    Definition poweriteration.hh:180
    \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....
    Definition poweriteration.hh:355
    \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...
    Definition poweriteration.hh:691
    \n-
    IterationOperator & getIterationOperator()
    Return the iteration operator (m_ - mu_*I).
    Definition poweriteration.hh:925
    \n-
    OperatorSum itOperator_
    Definition poweriteration.hh:1030
    \n-
    const BCRSMatrix & m_
    Definition poweriteration.hh:1018
    \n-
    PowerIteration_Algorithms(const BCRSMatrix &m, const unsigned int nIterationsMax=1000, const unsigned int verbosity_level=0)
    Construct from required parameters.
    Definition poweriteration.hh:206
    \n-
    const unsigned int nIterationsMax_
    Definition poweriteration.hh:1019
    \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....
    Definition poweriteration.hh:260
    \n-
    OperatorSum IterationOperator
    Type of iteration operator (m_ - mu_*I)
    Definition poweriteration.hh:189
    \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...
    Definition poweriteration.hh:533
    \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...
    Definition poweriteration.hh:394
    \n-
    const ScalingOperator scalingOperator_
    Definition poweriteration.hh:1029
    \n-
    void updateShiftMu(const Real &mu, ISTLLinearSolver &solver) const
    Update shift mu_, i.e. update iteration operator/matrix (m_ - mu_*I).
    Definition poweriteration.hh:983
    \n-
    PowerIteration_Algorithms & operator=(const PowerIteration_Algorithms &)=delete
    \n-
    unsigned int getIterationCount() const
    Return the number of iterations in last application of an algorithm.
    Definition poweriteration.hh:959
    \n-
    const MatrixOperator matrixOperator_
    Definition poweriteration.hh:1028
    \n-
    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
    \n-
    unsigned int nIterations_
    Definition poweriteration.hh:1039
    \n-
    const unsigned int verbosity_level_
    Definition poweriteration.hh:1022
    \n-
    const std::string title_
    Definition poweriteration.hh:1042
    \n-
    BlockVector::field_type Real
    Type of underlying field.
    Definition poweriteration.hh:186
    \n-
    Real mu_
    Definition poweriteration.hh:1025
    \n+
    A::size_type size_type
    The type for the index access.
    Definition bvector.hh:407
    \n+
    Wrapper to use a range of ARPACK++ eigenvalue solvers.
    Definition arpackpp.hh:245
    \n+
    const unsigned int verbosity_level_
    Definition arpackpp.hh:958
    \n+
    unsigned int getIterationCount() const
    Return the number of iterations in last application of an algorithm.
    Definition arpackpp.hh:944
    \n+
    const std::string title_
    Definition arpackpp.hh:966
    \n+
    BlockVector::field_type Real
    Definition arpackpp.hh:247
    \n+
    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
    \n+
    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
    \n+
    const BCRSMatrix & m_
    Definition arpackpp.hh:954
    \n+
    const unsigned int nIterationsMax_
    Definition arpackpp.hh:955
    \n+
    const std::string blank_
    Definition arpackpp.hh:967
    \n+
    ArPackPlusPlus_Algorithms(const BCRSMatrix &m, const unsigned int nIterationsMax=100000, const unsigned int verbosity_level=0)
    Construct from required parameters.
    Definition arpackpp.hh:268
    \n+
    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
    \n+
    unsigned int nIterations_
    Definition arpackpp.hh:963
    \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...
    Definition arpackpp.hh:721
    \n+
    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
    \n+
    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
    \n
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    A linear operator.
    Definition operators.hh:69
    \n-
    X::field_type field_type
    The field type of the operator.
    Definition operators.hh:76
    \n-
    virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0
    apply operator to x, scale and add:
    \n-
    virtual SolverCategory::Category category() const =0
    Category of the linear operator (see SolverCategory::Category)
    \n-
    Y range_type
    The type of the range of the operator.
    Definition operators.hh:74
    \n-
    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...
    \n-
    X domain_type
    The type of the domain of the operator.
    Definition operators.hh:72
    \n-
    Adapter to turn a matrix into a linear operator.
    Definition operators.hh:136
    \n-
    Statistics about the application of an inverse operator.
    Definition solver.hh:50
    \n-
    static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)
    Definition solver.hh:526
    \n-
    Category
    Definition solvercategory.hh:23
    \n-
    @ sequential
    Category for sequential solvers.
    Definition solvercategory.hh:25
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,993 +1,954 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n * _\be_\bi_\bg_\be_\bn_\bv_\ba_\bl_\bu_\be\n-poweriteration.hh\n+arpackpp.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_EIGENVALUE_POWERITERATION_HH\n-6#define DUNE_ISTL_EIGENVALUE_POWERITERATION_HH\n+5#ifndef DUNE_ISTL_EIGENVALUE_ARPACKPP_HH\n+6#define DUNE_ISTL_EIGENVALUE_ARPACKPP_HH\n 7\n-8#include // provides std::size_t\n-9#include // provides std::sqrt, std::abs\n-10\n-11#include // provides std::is_same\n+8#if HAVE_ARPACKPP || defined DOXYGEN\n+9\n+10#include // provides std::abs, std::pow, std::sqrt\n+11\n 12#include // provides std::cout, std::endl\n-13#include // provides std::numeric_limits\n-14#include // provides std::left, std::ios::left\n-15#include // provides std::setw, std::resetiosflags\n-16#include // provides std::unique_ptr\n-17#include // provides std::string\n-18\n-19#include // provides DUNE_THROW(...)\n-20\n-21#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh> // provides Dune::blockLevel\n-22#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh> // provides Dune::LinearOperator\n-23#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh> // provides Dune::SolverCategory::\n-sequential\n-24#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh> // provides Dune::IsDirectSolver\n-25#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh> // provides Dune::MatrixAdapter\n-26#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh> // provides Dune::ISTLError\n-27#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bo_\b._\bh_\bh> // provides Dune::printvector(...)\n-28#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh> // provides Dune::InverseOperatorResult\n-29\n-30namespace _\bD_\bu_\bn_\be\n-31{\n-32\n-37 namespace Impl {\n-45 template \n-46 class ScalingLinearOperator : public _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-47 {\n-48 public:\n-49 typedef X _\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be;\n-50 typedef Y _\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be;\n-51 typedef typename X::field_type _\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be;\n-52\n-53 ScalingLinearOperator (field_type immutable_scaling,\n-54 const field_type& mutable_scaling)\n-55 : immutable_scaling_(immutable_scaling),\n-56 mutable_scaling_(mutable_scaling)\n-57 {}\n-58\n-59 virtual void _\ba_\bp_\bp_\bl_\by (const X& x, Y& y) const\n-60 {\n-61 y = x;\n-62 y *= immutable_scaling_*mutable_scaling_;\n-63 }\n-64\n-65 virtual void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (field_type alpha, const X& x, Y& y) const\n-66 {\n-67 X temp(x);\n-68 temp *= immutable_scaling_*mutable_scaling_;\n-69 y.axpy(alpha,temp);\n-70 }\n-71\n-73 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-74 {\n-75 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-76 }\n-77\n-78 protected:\n-79 const field_type immutable_scaling_;\n-80 const field_type& mutable_scaling_;\n-81 };\n-82\n-83\n-92 template \n-93 class LinearOperatorSum\n-94 : public _\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-96 {\n-97 public:\n-98 typedef typename OP1::domain_type domain_type;\n-99 typedef typename OP1::range_type range_type;\n-100 typedef typename domain_type::field_type field_type;\n+13#include // provides std::string\n+14\n+15#include // provides Dune::FieldVector\n+16#include // provides DUNE_THROW(...)\n+17\n+18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh> // provides Dune::blockLevel\n+19#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh> // provides Dune::BlockVector\n+20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh> // provides Dune::ISTLError\n+21#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bo_\b._\bh_\bh> // provides Dune::printvector(...)\n+22\n+23#ifdef Status\n+24#undef Status // prevent preprocessor from damaging the ARPACK++\n+25 // code when \"X11/Xlib.h\" is included (the latter\n+26 // defines Status as \"#define Status int\" and\n+27 // ARPACK++ provides a class with a method called\n+28 // Status)\n+29#endif\n+30#include \"arssym.h\" // provides ARSymStdEig\n+31\n+32namespace _\bD_\bu_\bn_\be\n+33{\n+34\n+39 namespace Impl {\n+55 template \n+56 class ArPackPlusPlus_BCRSMatrixWrapper\n+57 {\n+58 public:\n+60 typedef typename _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be Real;\n+61\n+62 public:\n+64 ArPackPlusPlus_BCRSMatrixWrapper (const BCRSMatrix& A)\n+65 : A_(A),\n+66 m_(A_.M() * mBlock), n_(A_.N() * nBlock)\n+67 {\n+68 // assert that BCRSMatrix type has blocklevel 2\n+69 static_assert\n+70 (blockLevel() == 2,\n+71 \"Only BCRSMatrices with blocklevel 2 are supported.\");\n+72\n+73 // allocate memory for auxiliary block vector objects\n+74 // which are compatible to matrix rows / columns\n+75 domainBlockVector.resize(A_.N());\n+76 rangeBlockVector.resize(A_.M());\n+77 }\n+78\n+80 inline void multMv (Real* v, Real* w)\n+81 {\n+82 // get vector v as an object of appropriate type\n+83 arrayToDomainBlockVector(v,domainBlockVector);\n+84\n+85 // perform matrix-vector product\n+86 A_.mv(domainBlockVector,rangeBlockVector);\n+87\n+88 // get vector w from object of appropriate type\n+89 rangeBlockVectorToArray(rangeBlockVector,w);\n+90 };\n+91\n+93 inline void multMtMv (Real* v, Real* w)\n+94 {\n+95 // get vector v as an object of appropriate type\n+96 arrayToDomainBlockVector(v,domainBlockVector);\n+97\n+98 // perform matrix-vector product\n+99 A_.mv(domainBlockVector,rangeBlockVector);\n+100 A_.mtv(rangeBlockVector,domainBlockVector);\n 101\n-102 LinearOperatorSum (const OP1& op1, const OP2& op2)\n-103 : op1_(op1), op2_(op2)\n-104 {\n-105 static_assert(std::is_same::value,\n-106 \"Domain type of both operators doesn't match!\");\n-107 static_assert(std::is_same::value,\n-108 \"Range type of both operators doesn't match!\");\n-109 }\n-110\n-111 virtual void _\ba_\bp_\bp_\bl_\by (const domain_type& x, range_type& y) const\n-112 {\n-113 op1_.apply(x,y);\n-114 op2_.applyscaleadd(1.0,x,y);\n-115 }\n-116\n-117 virtual void _\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd (field_type alpha,\n-118 const domain_type& x, range_type& y) const\n-119 {\n-120 range_type temp(y);\n-121 op1_.apply(x,temp);\n-122 op2_.applyscaleadd(1.0,x,temp);\n-123 y.axpy(alpha,temp);\n-124 }\n+102 // get vector w from object of appropriate type\n+103 domainBlockVectorToArray(domainBlockVector,w);\n+104 };\n+105\n+107 inline void multMMtv (Real* v, Real* w)\n+108 {\n+109 // get vector v as an object of appropriate type\n+110 arrayToRangeBlockVector(v,rangeBlockVector);\n+111\n+112 // perform matrix-vector product\n+113 A_.mtv(rangeBlockVector,domainBlockVector);\n+114 A_.mv(domainBlockVector,rangeBlockVector);\n+115\n+116 // get vector w from object of appropriate type\n+117 rangeBlockVectorToArray(rangeBlockVector,w);\n+118 };\n+119\n+121 inline int nrows () const { return m_; }\n+122\n+124 inline int ncols () const { return n_; }\n 125\n-127 virtual _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by _\bc_\ba_\bt_\be_\bg_\bo_\br_\by() const\n-128 {\n-129 return _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl;\n-130 }\n-131\n-132 protected:\n-133 const OP1& op1_;\n-134 const OP2& op2_;\n-135 };\n-136 } // end namespace Impl\n-137\n-174 template \n-_\b1_\b7_\b5 class _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n-176 {\n-177 protected:\n-178 // Type definitions for type of iteration operator (m_ - mu_*I)\n-179 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br_\b<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b,_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b>\n-_\b1_\b8_\b0 _\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n-_\b1_\b8_\b1 typedef Impl::ScalingLinearOperator _\bS_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n-_\b1_\b8_\b2 typedef Impl::LinearOperatorSum\n-_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bS_\bu_\bm;\n-183\n-184 public:\n-_\b1_\b8_\b6 typedef typename _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bR_\be_\ba_\bl;\n-187\n-_\b1_\b8_\b9 typedef _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bS_\bu_\bm _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bO_\bp_\be_\br_\ba_\bt_\bo_\br;\n-190\n-191 public:\n-_\b2_\b0_\b6 _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& m,\n-207 const unsigned int nIterationsMax = 1000,\n-208 const unsigned int verbosity_level = 0)\n-209 : _\bm_\b_(m), _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_(nIterationsMax),\n-210 _\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_(verbosity_level),\n-211 _\bm_\bu_\b_(0.0),\n-212 _\bm_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_(_\bm_\b_),\n-213 _\bs_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_(-1.0,_\bm_\bu_\b_),\n-214 _\bi_\bt_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_(_\bm_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_,_\bs_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_),\n-215 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_(0),\n-216 _\bt_\bi_\bt_\bl_\be_\b_(\" PowerIteration_Algorithms: \"),\n-217 _\bb_\bl_\ba_\bn_\bk_\b_(_\bt_\bi_\bt_\bl_\be_\b_.length(),' ')\n-218 {\n-219 // assert that BCRSMatrix type has blocklevel 2\n-220 static_assert\n-221 (blockLevel() == 2,\n-222 \"Only BCRSMatrices with blocklevel 2 are supported.\");\n-223\n-224 // assert that BCRSMatrix type has square blocks\n-225 static_assert\n-226 (BCRSMatrix::block_type::rows == BCRSMatrix::block_type::cols,\n-227 \"Only BCRSMatrices with square blocks are supported.\");\n-228\n-229 // assert that m_ is square\n-230 const int nrows = _\bm_\b_._\bM() * BCRSMatrix::block_type::rows;\n-231 const int ncols = _\bm_\b_._\bN() * BCRSMatrix::block_type::cols;\n-232 if (nrows != ncols)\n-233 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix is not square (\"\n-234 << nrows << \"x\" << ncols << \").\");\n-235 }\n-236\n-_\b2_\b4_\b0 _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs (const _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs&) = delete;\n-241\n-245 _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs&\n-_\b2_\b4_\b6 _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=_\b (const _\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs&) = delete;\n-247\n-_\b2_\b6_\b0 inline void _\ba_\bp_\bp_\bl_\by_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn (const _\bR_\be_\ba_\bl& epsilon,\n-261 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n-262 {\n-263 // print verbosity information\n-264 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-265 std::cout << _\bt_\bi_\bt_\bl_\be_\b_\n-266 << \"Performing power iteration approximating \"\n-267 << \"the dominant eigenvalue.\" << std::endl;\n-268\n-269 // allocate memory for auxiliary variables\n-270 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br y(x);\n-271 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br temp(x);\n-272\n-273 // perform power iteration\n-274 x *= (1.0 / x.two_norm());\n-275 _\bm_\b_._\bm_\bv(x,y);\n-276 _\bR_\be_\ba_\bl r_norm = std::numeric_limits::max();\n-277 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = 0;\n-278 while (r_norm > epsilon)\n-279 {\n-280 // update and check number of iterations\n-281 if (++_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ > _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_)\n-282 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Power iteration did not converge \"\n-283 << \"in \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_ << \" iterations \"\n-284 << \"(\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \", epsilon = \"\n-285 << epsilon << \").\");\n-286\n-287 // do one iteration of the power iteration algorithm\n-288 // (use that y = m_ * x)\n-289 x = y;\n-290 x *= (1.0 / y.two_norm());\n-291\n-292 // get approximated eigenvalue lambda via the Rayleigh quotient\n-293 _\bm_\b_._\bm_\bv(x,y);\n-294 lambda = x * y;\n-295\n-296 // get norm of residual (use that y = m_ * x)\n-297 temp = y;\n-298 temp.axpy(-lambda,x);\n-299 r_norm = temp.two_norm();\n-300\n-301 // print verbosity information\n-302 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n-303 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << std::left\n-304 << \"iteration \" << std::setw(3) << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n-305 << \" (\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << std::setw(11) << r_norm\n-306 << \"): \u00ce\u00bb = \" << lambda << std::endl\n-307 << std::resetiosflags(std::ios::left);\n-308 }\n-309\n-310 // print verbosity information\n-311 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-312 {\n-313 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n-314 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n-315 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n-316 << \"\u00ce\u00bb = \" << lambda << std::endl;\n-317 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n-318 {\n-319 // print approximated eigenvector via DUNE-ISTL I/O methods\n-320 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n-321 }\n-322 }\n-323 }\n-324\n-353 template \n-_\b3_\b5_\b5 inline void _\ba_\bp_\bp_\bl_\by_\bI_\bn_\bv_\be_\br_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn (const _\bR_\be_\ba_\bl& epsilon,\n-356 ISTLLinearSolver& solver,\n-357 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n-358 {\n-359 constexpr _\bR_\be_\ba_\bl gamma = 0.0;\n-360 _\ba_\bp_\bp_\bl_\by_\bI_\bn_\bv_\be_\br_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn(gamma,epsilon,solver,x,lambda);\n-361 }\n-362\n-392 template \n-_\b3_\b9_\b4 inline void _\ba_\bp_\bp_\bl_\by_\bI_\bn_\bv_\be_\br_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn (const _\bR_\be_\ba_\bl& gamma,\n-395 const _\bR_\be_\ba_\bl& epsilon,\n-396 ISTLLinearSolver& solver,\n-397 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n-398 {\n-399 // print verbosity information\n-400 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-401 {\n-402 std::cout << _\bt_\bi_\bt_\bl_\be_\b_;\n-403 if (gamma == 0.0)\n-404 std::cout << \"Performing inverse iteration approximating \"\n-405 << \"the least dominant eigenvalue.\" << std::endl;\n-406 else\n-407 std::cout << \"Performing inverse iteration with shift \"\n-408 << \"gamma = \" << gamma << \" approximating the \"\n-409 << \"eigenvalue closest to gamma.\" << std::endl;\n-410 }\n-411\n-412 // initialize iteration operator,\n-413 // initialize iteration matrix when needed\n-414 _\bu_\bp_\bd_\ba_\bt_\be_\bS_\bh_\bi_\bf_\bt_\bM_\bu(gamma,solver);\n-415\n-416 // allocate memory for linear solver statistics\n-417 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt solver_statistics;\n-418\n-419 // allocate memory for auxiliary variables\n-420 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br y(x);\n-421 _\bR_\be_\ba_\bl y_norm;\n-422 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br temp(x);\n-423\n-424 // perform inverse iteration with shift\n-425 x *= (1.0 / x.two_norm());\n-426 _\bR_\be_\ba_\bl r_norm = std::numeric_limits::max();\n-427 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = 0;\n-428 while (r_norm > epsilon)\n-429 {\n-430 // update and check number of iterations\n-431 if (++_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ > _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_)\n-432 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Inverse iteration \"\n-433 << (gamma != 0.0 ? \"with shift \" : \"\") << \"did not \"\n-434 << \"converge in \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_ << \" iterations \"\n-435 << \"(\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \", epsilon = \"\n-436 << epsilon << \").\");\n-437\n-438 // do one iteration of the inverse iteration with shift algorithm,\n-439 // part 1: solve (m_ - gamma*I) * y = x for y\n-440 // (protect x from being changed)\n-441 temp = x;\n-442 solver.apply(y,temp,solver_statistics);\n+126 protected:\n+127 // Number of rows and columns in each block of the matrix\n+128 constexpr static int mBlock = BCRSMatrix::block_type::rows;\n+129 constexpr static int nBlock = BCRSMatrix::block_type::cols;\n+130\n+131 // Type of vectors in the domain of the linear map associated with\n+132 // the matrix, i.e. block vectors compatible to matrix rows\n+133 constexpr static int dbvBlockSize = nBlock;\n+134 typedef Dune::FieldVector DomainBlockVectorBlock;\n+135 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\bB_\bl_\bo_\bc_\bk_\b> DomainBlockVector;\n+136\n+137 // Type of vectors in the range of the linear map associated with\n+138 // the matrix, i.e. block vectors compatible to matrix columns\n+139 constexpr static int rbvBlockSize = mBlock;\n+140 typedef Dune::FieldVector RangeBlockVectorBlock;\n+141 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bR_\ba_\bn_\bg_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\bB_\bl_\bo_\bc_\bk_\b> RangeBlockVector;\n+142\n+143 // Types for vector index access\n+144 typedef typename _\bD_\bo_\bm_\ba_\bi_\bn_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be dbv_size_type;\n+145 typedef typename _\bR_\ba_\bn_\bg_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rbv_size_type;\n+146 typedef typename DomainBlockVectorBlock::size_type dbvb_size_type;\n+147 typedef typename RangeBlockVectorBlock::size_type rbvb_size_type;\n+148\n+149 // Get vector v from a block vector object which is compatible to\n+150 // matrix rows\n+151 static inline void\n+152 domainBlockVectorToArray (const DomainBlockVector& dbv, Real* v)\n+153 {\n+154 for (dbv_size_type block = 0; block < dbv.N(); ++block)\n+155 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)\n+156 v[block*dbvBlockSize + iBlock] = dbv[block][iBlock];\n+157 }\n+158\n+159 // Get vector v from a block vector object which is compatible to\n+160 // matrix columns\n+161 static inline void\n+162 rangeBlockVectorToArray (const RangeBlockVector& rbv, Real* v)\n+163 {\n+164 for (rbv_size_type block = 0; block < rbv.N(); ++block)\n+165 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)\n+166 v[block*rbvBlockSize + iBlock] = rbv[block][iBlock];\n+167 }\n+168\n+169 public:\n+172 static inline void arrayToDomainBlockVector (const Real* v,\n+173 DomainBlockVector& dbv)\n+174 {\n+175 for (dbv_size_type block = 0; block < dbv.N(); ++block)\n+176 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)\n+177 dbv[block][iBlock] = v[block*dbvBlockSize + iBlock];\n+178 }\n+179\n+182 static inline void arrayToRangeBlockVector (const Real* v,\n+183 RangeBlockVector& rbv)\n+184 {\n+185 for (rbv_size_type block = 0; block < rbv.N(); ++block)\n+186 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)\n+187 rbv[block][iBlock] = v[block*rbvBlockSize + iBlock];\n+188 }\n+189\n+190 protected:\n+191 // The DUNE-ISTL BCRSMatrix\n+192 const BCRSMatrix& A_;\n+193\n+194 // Number of rows and columns in the matrix\n+195 const int m_, n_;\n+196\n+197 // Auxiliary block vector objects which are\n+198 // compatible to matrix rows / columns\n+199 mutable DomainBlockVector domainBlockVector;\n+200 mutable RangeBlockVector rangeBlockVector;\n+201 };\n+202 } // end namespace Impl\n+203\n+243 template \n+_\b2_\b4_\b4 class _\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n+245 {\n+246 public:\n+_\b2_\b4_\b7 typedef typename _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bR_\be_\ba_\bl;\n+248\n+249 public:\n+_\b2_\b6_\b8 _\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& m,\n+269 const unsigned int nIterationsMax = 100000,\n+270 const unsigned int verbosity_level = 0)\n+271 : _\bm_\b_(m), _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_(nIterationsMax),\n+272 _\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_(verbosity_level),\n+273 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_(0),\n+274 _\bt_\bi_\bt_\bl_\be_\b_(\" ArPackPlusPlus_Algorithms: \"),\n+275 _\bb_\bl_\ba_\bn_\bk_\b_(_\bt_\bi_\bt_\bl_\be_\b_.length(),' ')\n+276 {}\n+277\n+_\b2_\b8_\b9 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\ba_\bx_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be (const _\bR_\be_\ba_\bl& epsilon,\n+290 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n+291 {\n+292 // print verbosity information\n+293 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+294 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of \"\n+295 << \"the dominant eigenvalue of a matrix which \"\n+296 << \"is assumed to be symmetric.\" << std::endl;\n+297\n+298 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n+299 // and to perform the product A*v (LU decomposition is not used)\n+300 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n+301 WrappedMatrix A(_\bm_\b_);\n+302\n+303 // get number of rows and columns in A\n+304 const int nrows = A.nrows();\n+305 const int ncols = A.ncols();\n+306\n+307 // assert that A is square\n+308 if (nrows != ncols)\n+309 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix is not square (\"\n+310 << nrows << \"x\" << ncols << \").\");\n+311\n+312 // allocate memory for variables, set parameters\n+313 const int nev = 1; // Number of eigenvalues to compute\n+314 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n+each iteration (0 == auto)\n+315 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n+values) (0 == machine precision)\n+316 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n+iterations allowed (0 == 100*nev)\n+317 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A\n+318 const bool ivec = true; // Flag deciding if eigenvectors shall be\n+determined\n+319 int nconv; // Number of converged eigenvalues\n+320\n+321 // define what we need: eigenvalues with largest magnitude\n+322 char which[] = \"LM\";\n+323 ARSymStdEig\n+324 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);\n+325\n+326 // set ARPACK verbosity mode if requested\n+327 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n+328\n+329 // find eigenvalues and eigenvectors of A, obtain the eigenvalues\n+330 nconv = dprob.Eigenvalues(ev,ivec);\n+331\n+332 // obtain approximated dominant eigenvalue of A\n+333 lambda = ev[nev-1];\n+334\n+335 // obtain associated approximated eigenvector of A\n+336 _\bR_\be_\ba_\bl* x_raw = dprob.RawEigenvector(nev-1);\n+337 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);\n+338\n+339 // obtain number of Arnoldi update iterations actually taken\n+340 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n+341\n+342 // compute residual norm\n+343 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br r(x);\n+344 _\bR_\be_\ba_\bl* Ax_raw = new _\bR_\be_\ba_\bl[nrows];\n+345 A.multMv(x_raw,Ax_raw);\n+346 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);\n+347 r.axpy(-lambda,x);\n+348 const _\bR_\be_\ba_\bl r_norm = r.two_norm();\n+349\n+350 // print verbosity information\n+351 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+352 {\n+353 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n+354 {\n+355 // print some information about the problem\n+356 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained eigenvalues of A by solving \"\n+357 << \"A*x = \u00ce\u00bb*x using the ARPACK++ class ARSym\"\n+358 << \"StdEig:\" << std::endl;\n+359 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A: \"\n+360 << nconv << \" / \" << nev << std::endl;\n+361 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" dominant eigenvalue of A: \"\n+362 << lambda << std::endl;\n+363 }\n+364 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n+365 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n+366 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n+367 << \"\u00ce\u00bb = \" << lambda << std::endl;\n+368 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n+369 {\n+370 // print approximated eigenvector via DUNE-ISTL I/O methods\n+371 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n+372 }\n+373 }\n+374\n+375 // free dynamically allocated memory\n+376 delete[] Ax_raw;\n+377 delete[] ev;\n+378 }\n+379\n+_\b3_\b9_\b1 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\bi_\bn_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be (const _\bR_\be_\ba_\bl& epsilon,\n+392 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n+393 {\n+394 // print verbosity information\n+395 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+396 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of the \"\n+397 << \"least dominant eigenvalue of a matrix which \"\n+398 << \"is assumed to be symmetric.\" << std::endl;\n+399\n+400 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n+401 // and to perform the product A*v (LU decomposition is not used)\n+402 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n+403 WrappedMatrix A(_\bm_\b_);\n+404\n+405 // get number of rows and columns in A\n+406 const int nrows = A.nrows();\n+407 const int ncols = A.ncols();\n+408\n+409 // assert that A is square\n+410 if (nrows != ncols)\n+411 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix is not square (\"\n+412 << nrows << \"x\" << ncols << \").\");\n+413\n+414 // allocate memory for variables, set parameters\n+415 const int nev = 1; // Number of eigenvalues to compute\n+416 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n+each iteration (0 == auto)\n+417 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n+values) (0 == machine precision)\n+418 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n+iterations allowed (0 == 100*nev)\n+419 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A\n+420 const bool ivec = true; // Flag deciding if eigenvectors shall be\n+determined\n+421 int nconv; // Number of converged eigenvalues\n+422\n+423 // define what we need: eigenvalues with smallest magnitude\n+424 char which[] = \"SM\";\n+425 ARSymStdEig\n+426 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);\n+427\n+428 // set ARPACK verbosity mode if requested\n+429 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n+430\n+431 // find eigenvalues and eigenvectors of A, obtain the eigenvalues\n+432 nconv = dprob.Eigenvalues(ev,ivec);\n+433\n+434 // obtain approximated least dominant eigenvalue of A\n+435 lambda = ev[nev-1];\n+436\n+437 // obtain associated approximated eigenvector of A\n+438 _\bR_\be_\ba_\bl* x_raw = dprob.RawEigenvector(nev-1);\n+439 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);\n+440\n+441 // obtain number of Arnoldi update iterations actually taken\n+442 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n 443\n-444 // get norm of y\n-445 y_norm = y.two_norm();\n-446\n-447 // compile time switch between accuracy and efficiency\n-448 if (avoidLinSolverCrime)\n-449 {\n-450 // get approximated eigenvalue lambda via the Rayleigh quotient\n-451 // (use that x_new = y / y_norm)\n-452 _\bm_\b_._\bm_\bv(y,temp);\n-453 lambda = (y * temp) / (y_norm * y_norm);\n-454\n-455 // get norm of residual\n-456 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)\n-457 temp.axpy(-lambda,y);\n-458 r_norm = temp.two_norm() / y_norm;\n-459 }\n-460 else\n-461 {\n-462 // get approximated eigenvalue lambda via the Rayleigh quotient\n-463 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)\n-464 lambda = gamma + (y * x) / (y_norm * y_norm);\n-465\n-466 // get norm of residual\n-467 // (use that x_new = y / y_norm and use that (m_ - gamma*I) * y = x)\n-468 temp = x; temp.axpy(gamma-lambda,y);\n-469 r_norm = temp.two_norm() / y_norm;\n-470 }\n-471\n-472 // do one iteration of the inverse iteration with shift algorithm,\n-473 // part 2: update x\n-474 x = y;\n-475 x *= (1.0 / y_norm);\n+444 // compute residual norm\n+445 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br r(x);\n+446 _\bR_\be_\ba_\bl* Ax_raw = new _\bR_\be_\ba_\bl[nrows];\n+447 A.multMv(x_raw,Ax_raw);\n+448 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);\n+449 r.axpy(-lambda,x);\n+450 const _\bR_\be_\ba_\bl r_norm = r.two_norm();\n+451\n+452 // print verbosity information\n+453 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+454 {\n+455 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n+456 {\n+457 // print some information about the problem\n+458 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained eigenvalues of A by solving \"\n+459 << \"A*x = \u00ce\u00bb*x using the ARPACK++ class ARSym\"\n+460 << \"StdEig:\" << std::endl;\n+461 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A: \"\n+462 << nconv << \" / \" << nev << std::endl;\n+463 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" least dominant eigenvalue of A: \"\n+464 << lambda << std::endl;\n+465 }\n+466 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n+467 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n+468 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n+469 << \"\u00ce\u00bb = \" << lambda << std::endl;\n+470 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n+471 {\n+472 // print approximated eigenvector via DUNE-ISTL I/O methods\n+473 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n+474 }\n+475 }\n 476\n-477 // print verbosity information\n-478 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n-479 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << std::left\n-480 << \"iteration \" << std::setw(3) << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n-481 << \" (\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << std::setw(11) << r_norm\n-482 << \"): \u00ce\u00bb = \" << lambda << std::endl\n-483 << std::resetiosflags(std::ios::left);\n-484 }\n-485\n-486 // print verbosity information\n-487 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-488 {\n-489 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n-490 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n-491 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n-492 << \"\u00ce\u00bb = \" << lambda << std::endl;\n-493 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n+477 // free dynamically allocated memory\n+478 delete[] Ax_raw;\n+479 delete[] ev;\n+480 }\n+481\n+_\b4_\b9_\b3 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bC_\bo_\bn_\bd_\b2 (const _\bR_\be_\ba_\bl& epsilon, _\bR_\be_\ba_\bl& cond_2) const\n 494 {\n-495 // print approximated eigenvector via DUNE-ISTL I/O methods\n-496 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n-497 }\n-498 }\n-499 }\n+495 // print verbosity information\n+496 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+497 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of the \"\n+498 << \"spectral condition number of a matrix which \"\n+499 << \"is assumed to be symmetric.\" << std::endl;\n 500\n-531 template \n-_\b5_\b3_\b3 inline void _\ba_\bp_\bp_\bl_\by_\bR_\ba_\by_\bl_\be_\bi_\bg_\bh_\bQ_\bu_\bo_\bt_\bi_\be_\bn_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn (const _\bR_\be_\ba_\bl& epsilon,\n-534 ISTLLinearSolver& solver,\n-535 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n-536 {\n-537 // print verbosity information\n-538 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-539 std::cout << _\bt_\bi_\bt_\bl_\be_\b_\n-540 << \"Performing Rayleigh quotient iteration for \"\n-541 << \"estimated eigenvalue \" << lambda << \".\" << std::endl;\n+501 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n+502 // and to perform the product A*v (LU decomposition is not used)\n+503 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n+504 WrappedMatrix A(_\bm_\b_);\n+505\n+506 // get number of rows and columns in A\n+507 const int nrows = A.nrows();\n+508 const int ncols = A.ncols();\n+509\n+510 // assert that A is square\n+511 if (nrows != ncols)\n+512 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix is not square (\"\n+513 << nrows << \"x\" << ncols << \").\");\n+514\n+515 // allocate memory for variables, set parameters\n+516 const int nev = 2; // Number of eigenvalues to compute\n+517 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n+each iteration (0 == auto)\n+518 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n+values) (0 == machine precision)\n+519 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n+iterations allowed (0 == 100*nev)\n+520 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A\n+521 const bool ivec = true; // Flag deciding if eigenvectors shall be\n+determined\n+522 int nconv; // Number of converged eigenvalues\n+523\n+524 // define what we need: eigenvalues from both ends of the spectrum\n+525 char which[] = \"BE\";\n+526 ARSymStdEig\n+527 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);\n+528\n+529 // set ARPACK verbosity mode if requested\n+530 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n+531\n+532 // find eigenvalues and eigenvectors of A, obtain the eigenvalues\n+533 nconv = dprob.Eigenvalues(ev,ivec);\n+534\n+535 // obtain approximated dominant and least dominant eigenvalue of A\n+536 const _\bR_\be_\ba_\bl& lambda_max = ev[nev-1];\n+537 const _\bR_\be_\ba_\bl& lambda_min = ev[0];\n+538\n+539 // obtain associated approximated eigenvectors of A\n+540 _\bR_\be_\ba_\bl* x_max_raw = dprob.RawEigenvector(nev-1);\n+541 _\bR_\be_\ba_\bl* x_min_raw = dprob.RawEigenvector(0);\n 542\n-543 // allocate memory for linear solver statistics\n-544 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt solver_statistics;\n+543 // obtain approximated spectral condition number of A\n+544 cond_2 = std::abs(lambda_max / lambda_min);\n 545\n-546 // allocate memory for auxiliary variables\n-547 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br y(x);\n-548 _\bR_\be_\ba_\bl y_norm;\n-549 _\bR_\be_\ba_\bl lambda_update;\n-550 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br temp(x);\n-551\n-552 // perform Rayleigh quotient iteration\n-553 x *= (1.0 / x.two_norm());\n-554 _\bR_\be_\ba_\bl r_norm = std::numeric_limits::max();\n-555 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = 0;\n-556 while (r_norm > epsilon)\n+546 // obtain number of Arnoldi update iterations actually taken\n+547 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n+548\n+549 // compute each residual norm\n+550 _\bR_\be_\ba_\bl* Ax_max_raw = new _\bR_\be_\ba_\bl[nrows];\n+551 _\bR_\be_\ba_\bl* Ax_min_raw = new _\bR_\be_\ba_\bl[nrows];\n+552 A.multMv(x_max_raw,Ax_max_raw);\n+553 A.multMv(x_min_raw,Ax_min_raw);\n+554 _\bR_\be_\ba_\bl r_max_norm = 0.0;\n+555 _\bR_\be_\ba_\bl r_min_norm = 0.0;\n+556 for (int i = 0; i < nrows; ++i)\n 557 {\n-558 // update and check number of iterations\n-559 if (++_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ > _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_)\n-560 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Rayleigh quotient iteration did not \"\n-561 << \"converge in \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_ << \" iterations \"\n-562 << \"(\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \", epsilon = \"\n-563 << epsilon << \").\");\n-564\n-565 // update iteration operator,\n-566 // update iteration matrix when needed\n-567 _\bu_\bp_\bd_\ba_\bt_\be_\bS_\bh_\bi_\bf_\bt_\bM_\bu(lambda,solver);\n-568\n-569 // do one iteration of the Rayleigh quotient iteration algorithm,\n-570 // part 1: solve (m_ - lambda*I) * y = x for y\n-571 // (protect x from being changed)\n-572 temp = x;\n-573 solver.apply(y,temp,solver_statistics);\n-574\n-575 // get norm of y\n-576 y_norm = y.two_norm();\n-577\n-578 // compile time switch between accuracy and efficiency\n-579 if (avoidLinSolverCrime)\n-580 {\n-581 // get approximated eigenvalue lambda via the Rayleigh quotient\n-582 // (use that x_new = y / y_norm)\n-583 _\bm_\b_._\bm_\bv(y,temp);\n-584 lambda = (y * temp) / (y_norm * y_norm);\n-585\n-586 // get norm of residual\n-587 // (use that x_new = y / y_norm, additionally use that temp = m_ * y)\n-588 temp.axpy(-lambda,y);\n-589 r_norm = temp.two_norm() / y_norm;\n-590 }\n-591 else\n-592 {\n-593 // get approximated eigenvalue lambda via the Rayleigh quotient\n-594 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)\n-595 lambda_update = (y * x) / (y_norm * y_norm);\n-596 lambda += lambda_update;\n-597\n-598 // get norm of residual\n-599 // (use that x_new = y / y_norm and use that (m_ - lambda_old*I) * y = x)\n-600 temp = x; temp.axpy(-lambda_update,y);\n-601 r_norm = temp.two_norm() / y_norm;\n-602 }\n-603\n-604 // do one iteration of the Rayleigh quotient iteration algorithm,\n-605 // part 2: update x\n-606 x = y;\n-607 x *= (1.0 / y_norm);\n-608\n-609 // print verbosity information\n-610 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n-611 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << std::left\n-612 << \"iteration \" << std::setw(3) << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n-613 << \" (\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << std::setw(11) << r_norm\n-614 << \"): \u00ce\u00bb = \" << lambda << std::endl\n-615 << std::resetiosflags(std::ios::left);\n-616 }\n+558 r_max_norm += std::pow(Ax_max_raw[i] - lambda_max * x_max_raw[i],2);\n+559 r_min_norm += std::pow(Ax_min_raw[i] - lambda_min * x_min_raw[i],2);\n+560 }\n+561 r_max_norm = std::sqrt(r_max_norm);\n+562 r_min_norm = std::sqrt(r_min_norm);\n+563\n+564 // print verbosity information\n+565 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+566 {\n+567 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n+568 {\n+569 // print some information about the problem\n+570 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained eigenvalues of A by solving \"\n+571 << \"A*x = \u00ce\u00bb*x using the ARPACK++ class ARSym\"\n+572 << \"StdEig:\" << std::endl;\n+573 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A: \"\n+574 << nconv << \" / \" << nev << std::endl;\n+575 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" dominant eigenvalue of A: \"\n+576 << lambda_max << std::endl;\n+577 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" least dominant eigenvalue of A: \"\n+578 << lambda_min << std::endl;\n+579 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" spectral condition number of A: \"\n+580 << cond_2 << std::endl;\n+581 }\n+582 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n+583 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n+584 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = {\" << r_max_norm << \",\"\n+585 << r_min_norm << \"}, \" << \"\u00ce\u00bb = {\"\n+586 << lambda_max << \",\" << lambda_min\n+587 << \"}): cond_2 = \" << cond_2 << std::endl;\n+588 }\n+589\n+590 // free dynamically allocated memory\n+591 delete[] Ax_min_raw;\n+592 delete[] Ax_max_raw;\n+593 delete[] ev;\n+594 }\n+595\n+_\b6_\b0_\b9 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bM_\ba_\bx (const _\bR_\be_\ba_\bl& epsilon,\n+610 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& sigma) const\n+611 {\n+612 // print verbosity information\n+613 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+614 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of the \"\n+615 << \"largest singular value of a matrix which \"\n+616 << \"is assumed to be nonsymmetric.\" << std::endl;\n 617\n-618 // print verbosity information\n-619 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-620 {\n-621 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n-622 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n-623 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n-624 << \"\u00ce\u00bb = \" << lambda << std::endl;\n-625 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n-626 {\n-627 // print approximated eigenvector via DUNE-ISTL I/O methods\n-628 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n-629 }\n-630 }\n-631 }\n+618 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n+619 // and to perform the product A^T*A*v (LU decomposition is not used)\n+620 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n+621 WrappedMatrix A(_\bm_\b_);\n+622\n+623 // get number of rows and columns in A\n+624 const int nrows = A.nrows();\n+625 const int ncols = A.ncols();\n+626\n+627 // assert that A has more rows than columns (extend code later to the\n+opposite case!)\n+628 if (nrows < ncols)\n+629 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix has less rows than \"\n+630 << \"columns (\" << nrows << \"x\" << ncols << \").\"\n+631 << \" This case is not implemented, yet.\");\n 632\n-689 template \n-_\b6_\b9_\b1 inline void _\ba_\bp_\bp_\bl_\by_\bT_\bL_\bI_\bM_\bE_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn (const _\bR_\be_\ba_\bl& gamma, const _\bR_\be_\ba_\bl& eta,\n-692 const _\bR_\be_\ba_\bl& epsilon,\n-693 ISTLLinearSolver& solver,\n-694 const _\bR_\be_\ba_\bl& delta, const std::size_t& m,\n-695 bool& extrnl,\n-696 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n-697 {\n-698 // use same variable names as in [Szyld, 1988]\n-699 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x_s = x;\n-700 _\bR_\be_\ba_\bl& mu_s = lambda;\n-701\n-702 // print verbosity information\n-703 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-704 std::cout << _\bt_\bi_\bt_\bl_\be_\b_\n-705 << \"Performing TLIME iteration for \"\n-706 << \"estimated eigenvalue in the \"\n-707 << \"interval (\" << gamma - eta << \",\"\n-708 << gamma + eta << \").\" << std::endl;\n-709\n-710 // allocate memory for linear solver statistics\n-711 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt solver_statistics;\n-712\n-713 // allocate memory for auxiliary variables\n-714 bool doRQI;\n-715 _\bR_\be_\ba_\bl mu;\n-716 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br y(x_s);\n-717 _\bR_\be_\ba_\bl omega;\n-718 _\bR_\be_\ba_\bl mu_s_old;\n-719 _\bR_\be_\ba_\bl mu_s_update;\n-720 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br temp(x_s);\n-721 _\bR_\be_\ba_\bl q_norm, r_norm;\n-722\n-723 // perform TLIME iteration\n-724 x_s *= (1.0 / x_s.two_norm());\n-725 extrnl = true;\n-726 doRQI = false;\n-727 r_norm = std::numeric_limits::max();\n-728 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = 0;\n-729 while (r_norm > epsilon)\n-730 {\n-731 // update and check number of iterations\n-732 if (++_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ > _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_)\n-733 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"TLIME iteration did not \"\n-734 << \"converge in \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_\n-735 << \" iterations (\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm\n-736 << \", epsilon = \" << epsilon << \").\");\n-737\n-738 // set shift for next iteration according to inverse iteration\n-739 // with shift (II) resp. Rayleigh quotient iteration (RQI)\n-740 if (doRQI)\n-741 mu = mu_s;\n-742 else\n-743 mu = gamma;\n+633 // allocate memory for variables, set parameters\n+634 const int nev = 1; // Number of eigenvalues to compute\n+635 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n+each iteration (0 == auto)\n+636 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n+values) (0 == machine precision)\n+637 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n+iterations allowed (0 == 100*nev)\n+638 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A^T*A\n+639 const bool ivec = true; // Flag deciding if eigenvectors shall be\n+determined\n+640 int nconv; // Number of converged eigenvalues\n+641\n+642 // define what we need: eigenvalues with largest algebraic value\n+643 char which[] = \"LA\";\n+644 ARSymStdEig\n+645 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);\n+646\n+647 // set ARPACK verbosity mode if requested\n+648 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n+649\n+650 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues\n+651 nconv = dprob.Eigenvalues(ev,ivec);\n+652\n+653 // obtain approximated largest eigenvalue of A^T*A\n+654 const _\bR_\be_\ba_\bl& lambda = ev[nev-1];\n+655\n+656 // obtain associated approximated eigenvector of A^T*A\n+657 _\bR_\be_\ba_\bl* x_raw = dprob.RawEigenvector(nev-1);\n+658 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);\n+659\n+660 // obtain number of Arnoldi update iterations actually taken\n+661 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n+662\n+663 // compute residual norm\n+664 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br r(x);\n+665 _\bR_\be_\ba_\bl* AtAx_raw = new _\bR_\be_\ba_\bl[ncols];\n+666 A.multMtMv(x_raw,AtAx_raw);\n+667 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);\n+668 r.axpy(-lambda,x);\n+669 const _\bR_\be_\ba_\bl r_norm = r.two_norm();\n+670\n+671 // calculate largest singular value of A (note that\n+672 // x is right-singular / left-singular vector of A)\n+673 sigma = std::sqrt(lambda);\n+674\n+675 // print verbosity information\n+676 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+677 {\n+678 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n+679 {\n+680 // print some information about the problem\n+681 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained singular values of A by sol\"\n+682 << \"ving (A^T*A)*x = \u00cf\u0083\u00c2\u00b2*x using the ARPACK++ \"\n+683 << \"class ARSymStdEig:\" << std::endl;\n+684 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A^T*A: \"\n+685 << nconv << \" / \" << nev << std::endl;\n+686 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" largest eigenvalue of A^T*A: \"\n+687 << lambda << std::endl;\n+688 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" => largest singular value of A: \"\n+689 << sigma << std::endl;\n+690 }\n+691 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n+692 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n+693 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n+694 << \"\u00cf\u0083 = \" << sigma << std::endl;\n+695 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n+696 {\n+697 // print approximated right-singular / left-singular vector\n+698 // via DUNE-ISTL I/O methods\n+699 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n+700 }\n+701 }\n+702\n+703 // free dynamically allocated memory\n+704 delete[] AtAx_raw;\n+705 delete[] ev;\n+706 }\n+707\n+_\b7_\b2_\b1 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bM_\bi_\bn (const _\bR_\be_\ba_\bl& epsilon,\n+722 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& sigma) const\n+723 {\n+724 // print verbosity information\n+725 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+726 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of the \"\n+727 << \"smallest singular value of a matrix which \"\n+728 << \"is assumed to be nonsymmetric.\" << std::endl;\n+729\n+730 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n+731 // and to perform the product A^T*A*v (LU decomposition is not used)\n+732 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n+733 WrappedMatrix A(_\bm_\b_);\n+734\n+735 // get number of rows and columns in A\n+736 const int nrows = A.nrows();\n+737 const int ncols = A.ncols();\n+738\n+739 // assert that A has more rows than columns (extend code later to the\n+opposite case!)\n+740 if (nrows < ncols)\n+741 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix has less rows than \"\n+742 << \"columns (\" << nrows << \"x\" << ncols << \").\"\n+743 << \" This case is not implemented, yet.\");\n 744\n-745 // update II/RQI iteration operator,\n-746 // update II/RQI iteration matrix when needed\n-747 _\bu_\bp_\bd_\ba_\bt_\be_\bS_\bh_\bi_\bf_\bt_\bM_\bu(mu,solver);\n-748\n-749 // do one iteration of the II/RQI algorithm,\n-750 // part 1: solve (m_ - mu*I) * y = x for y\n-751 temp = x_s;\n-752 solver.apply(y,temp,solver_statistics);\n+745 // allocate memory for variables, set parameters\n+746 const int nev = 1; // Number of eigenvalues to compute\n+747 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n+each iteration (0 == auto)\n+748 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n+values) (0 == machine precision)\n+749 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n+iterations allowed (0 == 100*nev)\n+750 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A^T*A\n+751 const bool ivec = true; // Flag deciding if eigenvectors shall be\n+determined\n+752 int nconv; // Number of converged eigenvalues\n 753\n-754 // do one iteration of the II/RQI algorithm,\n-755 // part 2: compute omega\n-756 omega = (1.0 / y.two_norm());\n-757\n-758 // backup the old Rayleigh quotient\n-759 mu_s_old = mu_s;\n-760\n-761 // compile time switch between accuracy and efficiency\n-762 if (avoidLinSolverCrime)\n-763 {\n-764 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue\n-765 // (use that x_new = y * omega)\n-766 _\bm_\b_._\bm_\bv(y,temp);\n-767 mu_s = (y * temp) * (omega * omega);\n-768\n-769 // get norm of \"the residual with respect to the shift used by II\",\n-770 // use normal representation of q\n-771 // (use that x_new = y * omega, use that temp = m_ * y)\n-772 temp.axpy(-gamma,y);\n-773 q_norm = temp.two_norm() * omega;\n+754 // define what we need: eigenvalues with smallest algebraic value\n+755 char which[] = \"SA\";\n+756 ARSymStdEig\n+757 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);\n+758\n+759 // set ARPACK verbosity mode if requested\n+760 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n+761\n+762 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues\n+763 nconv = dprob.Eigenvalues(ev,ivec);\n+764\n+765 // obtain approximated smallest eigenvalue of A^T*A\n+766 const _\bR_\be_\ba_\bl& lambda = ev[nev-1];\n+767\n+768 // obtain associated approximated eigenvector of A^T*A\n+769 _\bR_\be_\ba_\bl* x_raw = dprob.RawEigenvector(nev-1);\n+770 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);\n+771\n+772 // obtain number of Arnoldi update iterations actually taken\n+773 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n 774\n-775 // get norm of \"the residual with respect to the Rayleigh quotient\"\n-776 r_norm = q_norm*q_norm - (gamma-mu_s)*(gamma-mu_s);\n-777 // prevent that truncation errors invalidate the norm\n-778 // (we don't want to calculate sqrt of a negative number)\n-779 if (r_norm >= 0)\n-780 {\n-781 // use relation between the norms of r and q for efficiency\n-782 r_norm = std::sqrt(r_norm);\n-783 }\n-784 else\n-785 {\n-786 // use relation between r and q\n-787 // (use that x_new = y * omega, use that temp = (m_ - gamma*I) * y = q /\n-omega)\n-788 temp.axpy(gamma-mu_s,y);\n-789 r_norm = temp.two_norm() * omega;\n-790 }\n-791 }\n-792 else\n-793 {\n-794 // update the Rayleigh quotient mu_s, i.e. the approximated eigenvalue\n-795 if (!doRQI)\n-796 {\n-797 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y =\n-x_s)\n-798 mu_s = gamma + (y * x_s) * (omega * omega);\n-799 }\n-800 else\n-801 {\n-802 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y\n-= x_s)\n-803 mu_s_update = (y * x_s) * (omega * omega);\n-804 mu_s += mu_s_update;\n-805 }\n-806\n-807 // get norm of \"the residual with respect to the shift used by II\"\n-808 if (!doRQI)\n-809 {\n-810 // use special representation of q in the II case\n-811 // (use that x_new = y * omega, additionally use that (m_ - gamma*I) * y =\n-x_s)\n-812 q_norm = omega;\n+775 // compute residual norm\n+776 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br r(x);\n+777 _\bR_\be_\ba_\bl* AtAx_raw = new _\bR_\be_\ba_\bl[ncols];\n+778 A.multMtMv(x_raw,AtAx_raw);\n+779 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);\n+780 r.axpy(-lambda,x);\n+781 const _\bR_\be_\ba_\bl r_norm = r.two_norm();\n+782\n+783 // calculate smallest singular value of A (note that\n+784 // x is right-singular / left-singular vector of A)\n+785 sigma = std::sqrt(lambda);\n+786\n+787 // print verbosity information\n+788 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+789 {\n+790 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n+791 {\n+792 // print some information about the problem\n+793 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained singular values of A by sol\"\n+794 << \"ving (A^T*A)*x = \u00cf\u0083\u00c2\u00b2*x using the ARPACK++ \"\n+795 << \"class ARSymStdEig:\" << std::endl;\n+796 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A^T*A: \"\n+797 << nconv << \" / \" << nev << std::endl;\n+798 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" smallest eigenvalue of A^T*A: \"\n+799 << lambda << std::endl;\n+800 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" => smallest singular value of A: \"\n+801 << sigma << std::endl;\n+802 }\n+803 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n+804 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n+805 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n+806 << \"\u00cf\u0083 = \" << sigma << std::endl;\n+807 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n+808 {\n+809 // print approximated right-singular / left-singular vector\n+810 // via DUNE-ISTL I/O methods\n+811 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n+812 }\n 813 }\n-814 else\n-815 {\n-816 // use special representation of q in the RQI case\n-817 // (use that x_new = y * omega, additionally use that (m_ - mu_s_old*I) * y\n-= x_s)\n-818 temp = x_s; temp.axpy(mu_s-gamma,y);\n-819 q_norm = temp.two_norm() * omega;\n-820 }\n-821\n-822 // get norm of \"the residual with respect to the Rayleigh quotient\"\n-823 // don't use efficient relation between the norms of r and q, as\n-824 // this relation seems to yield a less accurate r_norm in the case\n-825 // where linear solver crime is admitted\n-826 if (!doRQI)\n-827 {\n-828 // (use that x_new = y * omega and use that (m_ - gamma*I) * y = x_s)\n-829 temp = x_s; temp.axpy(gamma-lambda,y);\n-830 r_norm = temp.two_norm() * omega;\n-831 }\n-832 else\n-833 {\n-834 // (use that x_new = y * omega and use that (m_ - mu_s_old*I) * y = x_s)\n-835 temp = x_s; temp.axpy(-mu_s_update,y);\n-836 r_norm = temp.two_norm() * omega;\n-837 }\n-838 }\n-839\n-840 // do one iteration of the II/RQI algorithm,\n-841 // part 3: update x\n-842 x_s = y; x_s *= omega;\n-843\n-844 // // for relative residual norm mode, scale with mu_s^{-1}\n-845 // r_norm /= std::abs(mu_s);\n+814\n+815 // free dynamically allocated memory\n+816 delete[] AtAx_raw;\n+817 delete[] ev;\n+818 }\n+819\n+_\b8_\b3_\b0 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bC_\bo_\bn_\bd_\b2 (const _\bR_\be_\ba_\bl& epsilon, _\bR_\be_\ba_\bl& cond_2) const\n+831 {\n+832 // print verbosity information\n+833 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+834 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of the \"\n+835 << \"spectral condition number of a matrix which \"\n+836 << \"is assumed to be nonsymmetric.\" << std::endl;\n+837\n+838 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n+839 // and to perform the product A^T*A*v (LU decomposition is not used)\n+840 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n+841 WrappedMatrix A(_\bm_\b_);\n+842\n+843 // get number of rows and columns in A\n+844 const int nrows = A.nrows();\n+845 const int ncols = A.ncols();\n 846\n-847 // print verbosity information\n-848 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n-849 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"iteration \"\n-850 << std::left << std::setw(3) << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n-851 << \" (\" << (doRQI ? \"RQI,\" : \"II, \")\n-852 << \" \" << (doRQI ? \"\u00e2\u0080\u0094>\" : \" \") << \" \"\n-853 << \"\u00e2\u0095\u0091r\u00e2\u0095\u0091_2 = \" << std::setw(11) << r_norm\n-854 << \", \" << (doRQI ? \" \" : \"\u00e2\u0080\u0094>\") << \" \"\n-855 << \"\u00e2\u0095\u0091q\u00e2\u0095\u0091_2 = \" << std::setw(11) << q_norm\n-856 << \"): \u00ce\u00bb = \" << lambda << std::endl\n-857 << std::resetiosflags(std::ios::left);\n-858\n-859 // check if the eigenvalue closest to gamma lies in J\n-860 if (!doRQI && q_norm < eta)\n-861 {\n-862 // J is not free of eigenvalues\n-863 extrnl = false;\n-864\n-865 // by theory we know now that mu_s also lies in J\n-866 assert(std::abs(mu_s-gamma) < eta);\n-867\n-868 // switch to RQI\n-869 doRQI = true;\n-870 }\n-871\n-872 // revert to II if J is not free of eigenvalues but\n-873 // at some point mu_s falls back again outside J\n-874 if (!extrnl && doRQI && std::abs(mu_s-gamma) >= eta)\n-875 doRQI = false;\n+847 // assert that A has more rows than columns (extend code later to the\n+opposite case!)\n+848 if (nrows < ncols)\n+849 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix has less rows than \"\n+850 << \"columns (\" << nrows << \"x\" << ncols << \").\"\n+851 << \" This case is not implemented, yet.\");\n+852\n+853 // allocate memory for variables, set parameters\n+854 const int nev = 2; // Number of eigenvalues to compute\n+855 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n+each iteration (0 == auto)\n+856 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n+values) (0 == machine precision)\n+857 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n+iterations allowed (0 == 100*nev)\n+858 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A^T*A\n+859 const bool ivec = true; // Flag deciding if eigenvectors shall be\n+determined\n+860 int nconv; // Number of converged eigenvalues\n+861\n+862 // define what we need: eigenvalues from both ends of the spectrum\n+863 char which[] = \"BE\";\n+864 ARSymStdEig\n+865 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);\n+866\n+867 // set ARPACK verbosity mode if requested\n+868 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n+869\n+870 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues\n+871 nconv = dprob.Eigenvalues(ev,ivec);\n+872\n+873 // obtain approximated largest and smallest eigenvalue of A^T*A\n+874 const _\bR_\be_\ba_\bl& lambda_max = ev[nev-1];\n+875 const _\bR_\be_\ba_\bl& lambda_min = ev[0];\n 876\n-877 // if eigenvalue closest to gamma does not lie in J use RQI\n-878 // solely to accelerate the convergence to this eigenvalue\n-879 // when II has become stationary\n-880 if (extrnl && !doRQI)\n-881 {\n-882 // switch to RQI if the relative change of the Rayleigh\n-883 // quotient indicates that II has become stationary\n-884 if (_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ >= m &&\n-885 std::abs(mu_s - mu_s_old) / std::abs(mu_s) < delta)\n-886 doRQI = true;\n-887 }\n-888 }\n-889\n-890 // // compute final residual and lambda again (paranoia....)\n-891 // m_.mv(x_s,temp);\n-892 // mu_s = x_s * temp;\n-893 // temp.axpy(-mu_s,x_s);\n-894 // r_norm = temp.two_norm();\n-895 // // r_norm /= std::abs(mu_s);\n-896\n-897 // print verbosity information\n-898 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-899 {\n-900 if (extrnl)\n-901 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Interval \"\n-902 << \"(\" << gamma - eta << \",\" << gamma + eta\n-903 << \") is free of eigenvalues, approximating \"\n-904 << \"the closest eigenvalue.\" << std::endl;\n-905 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n-906 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n-907 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n-908 << \"\u00ce\u00bb = \" << lambda << std::endl;\n-909 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n+877 // obtain associated approximated eigenvectors of A^T*A\n+878 _\bR_\be_\ba_\bl* x_max_raw = dprob.RawEigenvector(nev-1);\n+879 _\bR_\be_\ba_\bl* x_min_raw = dprob.RawEigenvector(0);\n+880\n+881 // obtain number of Arnoldi update iterations actually taken\n+882 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n+883\n+884 // compute each residual norm\n+885 _\bR_\be_\ba_\bl* AtAx_max_raw = new _\bR_\be_\ba_\bl[ncols];\n+886 _\bR_\be_\ba_\bl* AtAx_min_raw = new _\bR_\be_\ba_\bl[ncols];\n+887 A.multMtMv(x_max_raw,AtAx_max_raw);\n+888 A.multMtMv(x_min_raw,AtAx_min_raw);\n+889 _\bR_\be_\ba_\bl r_max_norm = 0.0;\n+890 _\bR_\be_\ba_\bl r_min_norm = 0.0;\n+891 for (int i = 0; i < ncols; ++i)\n+892 {\n+893 r_max_norm += std::pow(AtAx_max_raw[i] - lambda_max * x_max_raw[i],2);\n+894 r_min_norm += std::pow(AtAx_min_raw[i] - lambda_min * x_min_raw[i],2);\n+895 }\n+896 r_max_norm = std::sqrt(r_max_norm);\n+897 r_min_norm = std::sqrt(r_min_norm);\n+898\n+899 // calculate largest and smallest singular value of A\n+900 const _\bR_\be_\ba_\bl sigma_max = std::sqrt(lambda_max);\n+901 const _\bR_\be_\ba_\bl sigma_min = std::sqrt(lambda_min);\n+902\n+903 // obtain approximated spectral condition number of A\n+904 cond_2 = sigma_max / sigma_min;\n+905\n+906 // print verbosity information\n+907 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n+908 {\n+909 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n 910 {\n-911 // print approximated eigenvector via DUNE-ISTL I/O methods\n-912 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n-913 }\n-914 }\n-915 }\n-916\n-_\b9_\b2_\b5 inline _\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bO_\bp_\be_\br_\ba_\bt_\bo_\br& _\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bO_\bp_\be_\br_\ba_\bt_\bo_\br ()\n-926 {\n-927 // return iteration operator\n-928 return _\bi_\bt_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n-929 }\n-930\n-_\b9_\b4_\b5 inline const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bM_\ba_\bt_\br_\bi_\bx () const\n-946 {\n-947 // create iteration matrix on demand\n-948 if (!_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_)\n-949 _\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_ = std::make_unique(_\bm_\b_);\n-950\n-951 // return iteration matrix\n-952 return *_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_;\n-953 }\n-954\n-_\b9_\b5_\b9 inline unsigned int _\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bC_\bo_\bu_\bn_\bt () const\n-960 {\n-961 if (_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ == 0)\n-962 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"No algorithm applied, yet.\");\n-963\n-964 return _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_;\n-965 }\n-966\n-967 protected:\n-982 template \n-_\b9_\b8_\b3 inline void _\bu_\bp_\bd_\ba_\bt_\be_\bS_\bh_\bi_\bf_\bt_\bM_\bu (const _\bR_\be_\ba_\bl& mu,\n-984 ISTLLinearSolver& solver) const\n-985 {\n-986 // do nothing if new shift equals the old one\n-987 if (mu == _\bm_\bu_\b_) return;\n-988\n-989 // update shift mu_, i.e. update iteration operator\n-990 _\bm_\bu_\b_ = mu;\n-991\n-992 // update iteration matrix when needed\n-993 if (_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_)\n-994 {\n-995 // iterate over entries in iteration matrix diagonal\n-996 constexpr int rowBlockSize = BCRSMatrix::block_type::rows;\n-997 constexpr int colBlockSize = BCRSMatrix::block_type::cols;\n-998 for (typename _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i = 0;\n-999 i < _\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_->M()*rowBlockSize; ++i)\n-1000 {\n-1001 // access m_[i,i] where i is the flat index of a row/column\n-1002 const _\bR_\be_\ba_\bl& m_entry = _\bm_\b_\n-1003 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];\n-1004 // access *itMatrix[i,i] where i is the flat index of a row/column\n-1005 _\bR_\be_\ba_\bl& entry = (*itMatrix_)\n-1006 [i/rowBlockSize][i/colBlockSize][i%rowBlockSize][i%colBlockSize];\n-1007 // change current entry in iteration matrix diagonal\n-1008 entry = m_entry - _\bm_\bu_\b_;\n-1009 }\n-1010 // notify linear solver about change of the iteration matrix object\n-1011 _\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b<_\bI_\bS_\bT_\bL_\bL_\bi_\bn_\be_\ba_\br_\bS_\bo_\bl_\bv_\be_\br_\b,_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b>_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-1012 (solver,*_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_);\n-1013 }\n-1014 }\n-1015\n-1016 protected:\n-1017 // parameters related to iterative eigenvalue algorithms\n-_\b1_\b0_\b1_\b8 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bm_\b_;\n-_\b1_\b0_\b1_\b9 const unsigned int _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_;\n-1020\n-1021 // verbosity setting\n-_\b1_\b0_\b2_\b2 const unsigned int _\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_;\n-1023\n-1024 // shift mu_ used by iteration operator/matrix (m_ - mu_*I)\n-_\b1_\b0_\b2_\b5 mutable _\bR_\be_\ba_\bl _\bm_\bu_\b_;\n-1026\n-1027 // iteration operator (m_ - mu_*I), passing shift mu_ by reference\n-_\b1_\b0_\b2_\b8 const _\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br _\bm_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n-_\b1_\b0_\b2_\b9 const _\bS_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br _\bs_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n-_\b1_\b0_\b3_\b0 _\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bS_\bu_\bm _\bi_\bt_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_;\n-1031\n-1032 // iteration matrix (m_ - mu_*I), provided on demand when needed\n-1033 // (e.g. for preconditioning)\n-_\b1_\b0_\b3_\b4 mutable std::unique_ptr _\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_;\n-1035\n-1036 // memory for storing temporary variables (mutable as they shall\n-1037 // just be effectless auxiliary variables of the const apply*(...)\n-1038 // methods)\n-_\b1_\b0_\b3_\b9 mutable unsigned int _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_;\n-1040\n-1041 // constants for printing verbosity information\n-_\b1_\b0_\b4_\b2 const std::string _\bt_\bi_\bt_\bl_\be_\b_;\n-_\b1_\b0_\b4_\b3 const std::string _\bb_\bl_\ba_\bn_\bk_\b_;\n-1044 };\n-1045\n-1048} // namespace Dune\n-1049\n-1050#endif // DUNE_ISTL_EIGENVALUE_POWERITERATION_HH\n+911 // print some information about the problem\n+912 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained singular values of A by sol\"\n+913 << \"ving (A^T*A)*x = \u00cf\u0083\u00c2\u00b2*x using the ARPACK++ \"\n+914 << \"class ARSymStdEig:\" << std::endl;\n+915 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A^T*A: \"\n+916 << nconv << \" / \" << nev << std::endl;\n+917 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" largest eigenvalue of A^T*A: \"\n+918 << lambda_max << std::endl;\n+919 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" smallest eigenvalue of A^T*A: \"\n+920 << lambda_min << std::endl;\n+921 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" => largest singular value of A: \"\n+922 << sigma_max << std::endl;\n+923 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" => smallest singular value of A: \"\n+924 << sigma_min << std::endl;\n+925 }\n+926 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n+927 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n+928 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = {\" << r_max_norm << \",\"\n+929 << r_min_norm << \"}, \" << \"\u00cf\u0083 = {\"\n+930 << sigma_max << \",\" << sigma_min\n+931 << \"}): cond_2 = \" << cond_2 << std::endl;\n+932 }\n+933\n+934 // free dynamically allocated memory\n+935 delete[] AtAx_min_raw;\n+936 delete[] AtAx_max_raw;\n+937 delete[] ev;\n+938 }\n+939\n+_\b9_\b4_\b4 inline unsigned int _\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bC_\bo_\bu_\bn_\bt () const\n+945 {\n+946 if (_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ == 0)\n+947 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"No algorithm applied, yet.\");\n+948\n+949 return _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_;\n+950 }\n+951\n+952 protected:\n+953 // parameters related to iterative eigenvalue algorithms\n+_\b9_\b5_\b4 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bm_\b_;\n+_\b9_\b5_\b5 const unsigned int _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_;\n+956\n+957 // verbosity setting\n+_\b9_\b5_\b8 const unsigned int _\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_;\n+959\n+960 // memory for storing temporary variables (mutable as they shall\n+961 // just be effectless auxiliary variables of the const apply*(...)\n+962 // methods)\n+_\b9_\b6_\b3 mutable unsigned int _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_;\n+964\n+965 // constants for printing verbosity information\n+_\b9_\b6_\b6 const std::string _\bt_\bi_\bt_\bl_\be_\b_;\n+_\b9_\b6_\b7 const std::string _\bb_\bl_\ba_\bn_\bk_\b_;\n+968 };\n+969\n+972} // namespace Dune\n+973\n+974#endif // HAVE_ARPACKPP\n+975\n+976#endif // DUNE_ISTL_EIGENVALUE_ARPACKPP_HH\n _\bi_\bo_\b._\bh_\bh\n Some generic functions for pretty printing vectors and matrices.\n+_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n Helper functions for determining the vector/matrix block level.\n-_\bs_\bo_\bl_\bv_\be_\br_\bc_\ba_\bt_\be_\bg_\bo_\br_\by_\b._\bh_\bh\n-_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bs_\bo_\bl_\bv_\be_\br_\bs_\b._\bh_\bh\n-Implementations of the inverse operator interface.\n-_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\bs_\b._\bh_\bh\n-Define general, extensible interface for operators. The available\n-implementation wraps a matrix.\n-_\bs_\bo_\bl_\bv_\be_\br_\bt_\by_\bp_\be_\b._\bh_\bh\n-Templates characterizing the type of a solver.\n+_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n+This file implements a vector space as a tensor product of a given vector\n+space. The number of compon...\n _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br\n void printvector(std::ostream &s, const V &v, std::string title, std::string\n rowtext, int columns=1, int width=10, int precision=2)\n Print an ISTL vector.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:89\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n A sparse block matrix with compressed row storage.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-A::size_type size_type\n-The type for the index access and the size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n-size_type M() const\n-number of columns (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2007\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bm_\bv\n-void mv(const X &x, Y &y) const\n-y = A x\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:1641\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n-size_type N() const\n-number of rows (counted in blocks)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:2001\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n+typename Imp::BlockTraits< B >::field_type field_type\n+export the type representing the field\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:488\n _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n A vector of blocks with memory management.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n typename Imp::BlockTraits< B >::field_type field_type\n export the type representing the field\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:398\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n-Iterative eigenvalue algorithms based on power iteration.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:176\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bi_\bt_\bM_\ba_\bt_\br_\bi_\bx_\b_\n-std::unique_ptr< BCRSMatrix > itMatrix_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1034\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n-PowerIteration_Algorithms(const PowerIteration_Algorithms &)=delete\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bS_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Impl::ScalingLinearOperator< BlockVector > ScalingOperator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:181\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bb_\bl_\ba_\bn_\bk_\b_\n-const std::string blank_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1043\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bS_\bu_\bm\n-Impl::LinearOperatorSum< MatrixOperator, ScalingOperator > OperatorSum\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:182\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-Dune::MatrixAdapter< BCRSMatrix, BlockVector, BlockVector > MatrixOperator\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:180\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bI_\bn_\bv_\be_\br_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n-void applyInverseIteration(const Real &epsilon, ISTLLinearSolver &solver,\n-BlockVector &x, Real &lambda) const\n-Perform the inverse iteration algorithm to compute an approximation lambda of\n-the least dominant (i....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:355\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bT_\bL_\bI_\bM_\bE_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n-void applyTLIMEIteration(const Real &gamma, const Real &eta, const Real\n-&epsilon, ISTLLinearSolver &solver, const Real &delta, const std::size_t &m,\n-bool &extrnl, BlockVector &x, Real &lambda) const\n-Perform the \"two-level iterative method for eigenvalue calculations (TLIME)\"\n-iteration algorit...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:691\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-IterationOperator & getIterationOperator()\n-Return the iteration operator (m_ - mu_*I).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:925\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bi_\bt_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_\n-OperatorSum itOperator_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1030\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bm_\b_\n-const BCRSMatrix & m_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1018\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n-PowerIteration_Algorithms(const BCRSMatrix &m, const unsigned int\n-nIterationsMax=1000, const unsigned int verbosity_level=0)\n-Construct from required parameters.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:206\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_\n-const unsigned int nIterationsMax_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1019\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n-void applyPowerIteration(const Real &epsilon, BlockVector &x, Real &lambda)\n-const\n-Perform the power iteration algorithm to compute an approximation lambda of the\n-dominant (i....\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:260\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-OperatorSum IterationOperator\n-Type of iteration operator (m_ - mu_*I)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:189\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bR_\ba_\by_\bl_\be_\bi_\bg_\bh_\bQ_\bu_\bo_\bt_\bi_\be_\bn_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n-void applyRayleighQuotientIteration(const Real &epsilon, ISTLLinearSolver\n-&solver, BlockVector &x, Real &lambda) const\n-Perform the Rayleigh quotient iteration algorithm to compute an approximation\n-lambda of an eigenvalue...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:533\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bI_\bn_\bv_\be_\br_\bs_\be_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn\n-void applyInverseIteration(const Real &gamma, const Real &epsilon,\n-ISTLLinearSolver &solver, BlockVector &x, Real &lambda) const\n-Perform the inverse iteration with shift algorithm to compute an approximation\n-lambda of the eigenval...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:394\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bs_\bc_\ba_\bl_\bi_\bn_\bg_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_\n-const ScalingOperator scalingOperator_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1029\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bu_\bp_\bd_\ba_\bt_\be_\bS_\bh_\bi_\bf_\bt_\bM_\bu\n-void updateShiftMu(const Real &mu, ISTLLinearSolver &solver) const\n-Update shift mu_, i.e. update iteration operator/matrix (m_ - mu_*I).\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:983\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b=\n-PowerIteration_Algorithms & operator=(const PowerIteration_Algorithms &)=delete\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bC_\bo_\bu_\bn_\bt\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+The type for the index access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:407\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n+Wrapper to use a range of ARPACK++ eigenvalue solvers.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:245\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_\n+const unsigned int verbosity_level_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:958\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bC_\bo_\bu_\bn_\bt\n unsigned int getIterationCount() const\n Return the number of iterations in last application of an algorithm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:959\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b_\n-const MatrixOperator matrixOperator_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1028\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bM_\ba_\bt_\br_\bi_\bx\n-const BCRSMatrix & getIterationMatrix() const\n-Return the iteration matrix (m_ - mu_*I), provided on demand when needed (e.g.\n-for direct solvers or ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:945\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n-unsigned int nIterations_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1039\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_\n-const unsigned int verbosity_level_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1022\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bt_\bi_\bt_\bl_\be_\b_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:944\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bt_\bi_\bt_\bl_\be_\b_\n const std::string title_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1042\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bR_\be_\ba_\bl\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:966\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bR_\be_\ba_\bl\n BlockVector::field_type Real\n-Type of underlying field.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:186\n-_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bw_\be_\br_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bm_\bu_\b_\n-Real mu_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn poweriteration.hh:1025\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:247\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\ba_\bx_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be\n+void computeSymMaxMagnitude(const Real &epsilon, BlockVector &x, Real &lambda)\n+const\n+Assume the matrix to be square, symmetric and perform IRLM to compute an\n+approximation lambda of its ...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:289\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\bi_\bn_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be\n+void computeSymMinMagnitude(const Real &epsilon, BlockVector &x, Real &lambda)\n+const\n+Assume the matrix to be square, symmetric and perform IRLM to compute an\n+approximation lambda of its ...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:391\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bm_\b_\n+const BCRSMatrix & m_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:954\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_\n+const unsigned int nIterationsMax_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:955\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bb_\bl_\ba_\bn_\bk_\b_\n+const std::string blank_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:967\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n+ArPackPlusPlus_Algorithms(const BCRSMatrix &m, const unsigned int\n+nIterationsMax=100000, const unsigned int verbosity_level=0)\n+Construct from required parameters.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:268\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bC_\bo_\bn_\bd_\b2\n+void computeSymCond2(const Real &epsilon, Real &cond_2) const\n+Assume the matrix to be square, symmetric and perform IRLM to compute an\n+approximation of its spectra...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:493\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n+unsigned int nIterations_\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:963\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bM_\bi_\bn\n+void computeNonSymMin(const Real &epsilon, BlockVector &x, Real &sigma) const\n+Assume the matrix to be nonsymmetric and perform IRLM to compute an\n+approximation sigma of its smalle...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:721\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bC_\bo_\bn_\bd_\b2\n+void computeNonSymCond2(const Real &epsilon, Real &cond_2) const\n+Assume the matrix to be nonsymmetric and perform IRLM to compute an\n+approximation of its spectral con...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:830\n+_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bM_\ba_\bx\n+void computeNonSymMax(const Real &epsilon, BlockVector &x, Real &sigma) const\n+Assume the matrix to be nonsymmetric and perform IRLM to compute an\n+approximation sigma of its larges...\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:609\n _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n derive error class from the base class in common\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br\n-A linear operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-X::field_type field_type\n-The field type of the operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:76\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by_\bs_\bc_\ba_\bl_\be_\ba_\bd_\bd\n-virtual void applyscaleadd(field_type alpha, const X &x, Y &y) const =0\n-apply operator to x, scale and add:\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-virtual SolverCategory::Category category() const =0\n-Category of the linear operator (see SolverCategory::Category)\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\br_\ba_\bn_\bg_\be_\b__\bt_\by_\bp_\be\n-Y range_type\n-The type of the range of the operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:74\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\ba_\bp_\bp_\bl_\by\n-virtual void apply(const X &x, Y &y) const =0\n-apply operator to x: The input vector is consistent and the output must also be\n-consistent on the in...\n-_\bD_\bu_\bn_\be_\b:_\b:_\bL_\bi_\bn_\be_\ba_\br_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\b:_\b:_\bd_\bo_\bm_\ba_\bi_\bn_\b__\bt_\by_\bp_\be\n-X domain_type\n-The type of the domain of the operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:72\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bA_\bd_\ba_\bp_\bt_\be_\br\n-Adapter to turn a matrix into a linear operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn operators.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bn_\bv_\be_\br_\bs_\be_\bO_\bp_\be_\br_\ba_\bt_\bo_\br_\bR_\be_\bs_\bu_\bl_\bt\n-Statistics about the application of an inverse operator.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:50\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bH_\be_\bl_\bp_\be_\br_\b:_\b:_\bs_\be_\bt_\bM_\ba_\bt_\br_\bi_\bx\n-static void setMatrix(ISTLLinearSolver &solver, const BCRSMatrix &matrix)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solver.hh:526\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bC_\ba_\bt_\be_\bg_\bo_\br_\by\n-Category\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bs_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl\n-@ sequential\n-Category for sequential solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:25\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00227.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00227.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: arpackpp.hh File Reference\n+dune-istl: matrixutils.hh File Reference\n \n \n \n \n \n \n \n@@ -65,48 +65,99 @@\n
    \n \n \n \n \n \n \n
    \n \n-
    arpackpp.hh File Reference
    \n+Namespaces |\n+Functions
    \n+ \n \n
    \n-
    #include <cmath>
    \n-#include <iostream>
    \n-#include <string>
    \n-#include <dune/common/fvector.hh>
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/istl/blocklevel.hh>
    \n-#include <dune/istl/bvector.hh>
    \n-#include <dune/istl/istlexception.hh>
    \n-#include <dune/istl/io.hh>
    \n-#include "arssym.h"
    \n+\n+

    Some handy generic functions for ISTL matrices. \n+More...

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

    Go to the source code of this file.

    \n \n \n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n \n

    \n Classes

    class  Dune::ArPackPlusPlus_Algorithms< BCRSMatrix, BlockVector >
     Wrapper to use a range of ARPACK++ eigenvalue solvers. More...
    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::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 >
     
    \n \n \n \n+

    \n Namespaces

    namespace  Dune
     
    \n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n+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)
     
    \n-
    \n+

    Detailed Description

    \n+

    Some handy generic functions for ISTL matrices.

    \n+
    Author
    Markus Blatt
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,29 +1,80 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\be_\bi_\bg_\be_\bn_\bv_\ba_\bl_\bu_\be\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs\n-arpackpp.hh File Reference\n-#include \n-#include \n-#include \n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bo_\b._\bh_\bh>\n-#include \"arssym.h\"\n+_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+matrixutils.hh File Reference\n+_\bI_\bt_\be_\br_\ba_\bt_\bi_\bv_\be_\b _\bS_\bo_\bl_\bv_\be_\br_\bs_\b _\bT_\be_\bm_\bp_\bl_\ba_\bt_\be_\b _\bL_\bi_\bb_\br_\ba_\br_\by_\b _\b(_\bI_\bS_\bT_\bL_\b) \u00bb _\bS_\bp_\ba_\br_\bs_\be_\b _\bM_\ba_\bt_\br_\bi_\bx_\b _\ba_\bn_\bd_\b _\bV_\be_\bc_\bt_\bo_\br_\b _\bc_\bl_\ba_\bs_\bs_\be_\bs\n+Some handy generic functions for ISTL matrices. _\bM_\bo_\br_\be_\b._\b._\b.\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n C\bCl\bla\bas\bss\bse\bes\bs\n-class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b _\b>\n-\u00a0 Wrapper to use a range of ARPACK++ eigenvalue solvers. _\bM_\bo_\br_\be_\b._\b._\b.\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b,_\b _\bl_\b _\b>\n+\u00a0 Check whether the a matrix has diagonal values on blocklevel recursion\n+ levels. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\b0_\b,_\b _\bl_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b,\n+ _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b,_\b _\bl_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>\n+\u00a0 Test whether a type is an _\bI_\bS_\bT_\bL _\bM_\ba_\bt_\br_\bi_\bx. _\bM_\bo_\br_\be_\b._\b._\b.\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b,_\b _\bA_\b _\b>_\b _\b>\n+\u00a0\n+struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be_\b<_\b _\bT_\b _\b>\n \u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n+template\n+auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs (const M &, typename std::enable_if_t< Dune::\n+ IsNumber< M >::value > *sfinae=nullptr)\n+\u00a0 Get the number of nonzero fields in the matrix.\n+\u00a0\n+template\n+auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs (const M &matrix, typename std::enable_if_t::value > *sfinae=nullptr)\n+\u00a0\n+template\n+void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bG_\bl_\bo_\bb_\ba_\bl_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx (const M &_\bm_\ba_\bt, C &ooc, std::ostream &os)\n+\u00a0\n+*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n+Some handy generic functions for ISTL matrices.\n+ Author\n+ Markus Blatt\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00227_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00227_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: arpackpp.hh Source File\n+dune-istl: matrixutils.hh Source File\n \n \n \n \n \n \n \n@@ -70,881 +70,721 @@\n \n \n \n \n \n \n \n
    \n-
    arpackpp.hh
    \n+
    matrixutils.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
    \n-
    6#define DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
    \n+
    5#ifndef DUNE_ISTL_MATRIXUTILS_HH
    \n+
    6#define DUNE_ISTL_MATRIXUTILS_HH
    \n
    7
    \n-
    8#if HAVE_ARPACKPP || defined DOXYGEN
    \n-
    9
    \n-
    10#include <cmath> // provides std::abs, std::pow, std::sqrt
    \n-
    11
    \n-
    12#include <iostream> // provides std::cout, std::endl
    \n-
    13#include <string> // provides std::string
    \n-
    14
    \n-
    15#include <dune/common/fvector.hh> // provides Dune::FieldVector
    \n-
    16#include <dune/common/exceptions.hh> // provides DUNE_THROW(...)
    \n-
    17
    \n-
    18#include <dune/istl/blocklevel.hh> // provides Dune::blockLevel
    \n-
    19#include <dune/istl/bvector.hh> // provides Dune::BlockVector
    \n-
    20#include <dune/istl/istlexception.hh> // provides Dune::ISTLError
    \n-
    21#include <dune/istl/io.hh> // provides Dune::printvector(...)
    \n-
    22
    \n-
    23#ifdef Status
    \n-
    24#undef Status // prevent preprocessor from damaging the ARPACK++
    \n-
    25 // code when "X11/Xlib.h" is included (the latter
    \n-
    26 // defines Status as "#define Status int" and
    \n-
    27 // ARPACK++ provides a class with a method called
    \n-
    28 // Status)
    \n-
    29#endif
    \n-
    30#include "arssym.h" // provides ARSymStdEig
    \n-
    31
    \n-
    32namespace Dune
    \n-
    33{
    \n-
    34
    \n-
    39 namespace Impl {
    \n-
    55 template <class BCRSMatrix>
    \n-
    56 class ArPackPlusPlus_BCRSMatrixWrapper
    \n-
    57 {
    \n-
    58 public:
    \n-
    60 typedef typename BCRSMatrix::field_type Real;
    \n-
    61
    \n-
    62 public:
    \n-
    64 ArPackPlusPlus_BCRSMatrixWrapper (const BCRSMatrix& A)
    \n-
    65 : A_(A),
    \n-
    66 m_(A_.M() * mBlock), n_(A_.N() * nBlock)
    \n-
    67 {
    \n-
    68 // assert that BCRSMatrix type has blocklevel 2
    \n-
    69 static_assert
    \n-
    70 (blockLevel<BCRSMatrix>() == 2,
    \n-
    71 "Only BCRSMatrices with blocklevel 2 are supported.");
    \n-
    72
    \n-
    73 // allocate memory for auxiliary block vector objects
    \n-
    74 // which are compatible to matrix rows / columns
    \n-
    75 domainBlockVector.resize(A_.N());
    \n-
    76 rangeBlockVector.resize(A_.M());
    \n-
    77 }
    \n-
    78
    \n-
    80 inline void multMv (Real* v, Real* w)
    \n-
    81 {
    \n-
    82 // get vector v as an object of appropriate type
    \n-
    83 arrayToDomainBlockVector(v,domainBlockVector);
    \n-
    84
    \n-
    85 // perform matrix-vector product
    \n-
    86 A_.mv(domainBlockVector,rangeBlockVector);
    \n-
    87
    \n-
    88 // get vector w from object of appropriate type
    \n-
    89 rangeBlockVectorToArray(rangeBlockVector,w);
    \n-
    90 };
    \n-
    91
    \n-
    93 inline void multMtMv (Real* v, Real* w)
    \n-
    94 {
    \n-
    95 // get vector v as an object of appropriate type
    \n-
    96 arrayToDomainBlockVector(v,domainBlockVector);
    \n-
    97
    \n-
    98 // perform matrix-vector product
    \n-
    99 A_.mv(domainBlockVector,rangeBlockVector);
    \n-
    100 A_.mtv(rangeBlockVector,domainBlockVector);
    \n-
    101
    \n-
    102 // get vector w from object of appropriate type
    \n-
    103 domainBlockVectorToArray(domainBlockVector,w);
    \n-
    104 };
    \n-
    105
    \n-
    107 inline void multMMtv (Real* v, Real* w)
    \n-
    108 {
    \n-
    109 // get vector v as an object of appropriate type
    \n-
    110 arrayToRangeBlockVector(v,rangeBlockVector);
    \n-
    111
    \n-
    112 // perform matrix-vector product
    \n-
    113 A_.mtv(rangeBlockVector,domainBlockVector);
    \n-
    114 A_.mv(domainBlockVector,rangeBlockVector);
    \n-
    115
    \n-
    116 // get vector w from object of appropriate type
    \n-
    117 rangeBlockVectorToArray(rangeBlockVector,w);
    \n-
    118 };
    \n-
    119
    \n-
    121 inline int nrows () const { return m_; }
    \n-
    122
    \n-
    124 inline int ncols () const { return n_; }
    \n-
    125
    \n-
    126 protected:
    \n-
    127 // Number of rows and columns in each block of the matrix
    \n-
    128 constexpr static int mBlock = BCRSMatrix::block_type::rows;
    \n-
    129 constexpr static int nBlock = BCRSMatrix::block_type::cols;
    \n-
    130
    \n-
    131 // Type of vectors in the domain of the linear map associated with
    \n-
    132 // the matrix, i.e. block vectors compatible to matrix rows
    \n-
    133 constexpr static int dbvBlockSize = nBlock;
    \n-
    134 typedef Dune::FieldVector<Real,dbvBlockSize> DomainBlockVectorBlock;
    \n-
    135 typedef Dune::BlockVector<DomainBlockVectorBlock> DomainBlockVector;
    \n-
    136
    \n-
    137 // Type of vectors in the range of the linear map associated with
    \n-
    138 // the matrix, i.e. block vectors compatible to matrix columns
    \n-
    139 constexpr static int rbvBlockSize = mBlock;
    \n-
    140 typedef Dune::FieldVector<Real,rbvBlockSize> RangeBlockVectorBlock;
    \n-
    141 typedef Dune::BlockVector<RangeBlockVectorBlock> RangeBlockVector;
    \n-
    142
    \n-
    143 // Types for vector index access
    \n-
    144 typedef typename DomainBlockVector::size_type dbv_size_type;
    \n-
    145 typedef typename RangeBlockVector::size_type rbv_size_type;
    \n-
    146 typedef typename DomainBlockVectorBlock::size_type dbvb_size_type;
    \n-
    147 typedef typename RangeBlockVectorBlock::size_type rbvb_size_type;
    \n-
    148
    \n-
    149 // Get vector v from a block vector object which is compatible to
    \n-
    150 // matrix rows
    \n-
    151 static inline void
    \n-
    152 domainBlockVectorToArray (const DomainBlockVector& dbv, Real* v)
    \n-
    153 {
    \n-
    154 for (dbv_size_type block = 0; block < dbv.N(); ++block)
    \n-
    155 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)
    \n-
    156 v[block*dbvBlockSize + iBlock] = dbv[block][iBlock];
    \n-
    157 }
    \n-
    158
    \n-
    159 // Get vector v from a block vector object which is compatible to
    \n-
    160 // matrix columns
    \n-
    161 static inline void
    \n-
    162 rangeBlockVectorToArray (const RangeBlockVector& rbv, Real* v)
    \n-
    163 {
    \n-
    164 for (rbv_size_type block = 0; block < rbv.N(); ++block)
    \n-
    165 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)
    \n-
    166 v[block*rbvBlockSize + iBlock] = rbv[block][iBlock];
    \n-
    167 }
    \n+
    8#include <set>
    \n+
    9#include <vector>
    \n+
    10#include <limits>
    \n+
    11#include <dune/common/typetraits.hh>
    \n+
    12#include <dune/common/fmatrix.hh>
    \n+
    13#include <dune/common/dynmatrix.hh>
    \n+
    14#include <dune/common/diagonalmatrix.hh>
    \n+
    15#include <dune/common/scalarmatrixview.hh>
    \n+\n+
    17#include "istlexception.hh"
    \n+
    18
    \n+
    19namespace Dune
    \n+
    20{
    \n+
    21
    \n+
    22#ifndef DOYXGEN
    \n+
    23 template<typename B, typename A>
    \n+
    24 class BCRSMatrix;
    \n+
    25
    \n+
    26 template<typename K, int n, int m>
    \n+\n+
    28
    \n+
    29 template<class T, class A>
    \n+
    30 class Matrix;
    \n+
    31#endif
    \n+
    32
    \n+
    46 template<class Matrix, std::size_t blocklevel, std::size_t l=blocklevel>
    \n+
    \n+\n+
    48 {
    \n+
    \n+
    53 static void check([[maybe_unused]] const Matrix& mat)
    \n+
    54 {
    \n+
    55#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    56 typedef typename Matrix::ConstRowIterator Row;
    \n+
    57 typedef typename Matrix::ConstColIterator Entry;
    \n+
    58 for(Row row = mat.begin(); row!=mat.end(); ++row) {
    \n+
    59 Entry diagonal = row->find(row.index());
    \n+
    60 if(diagonal==row->end())
    \n+
    61 DUNE_THROW(ISTLError, "Missing diagonal value in row "<<row.index()
    \n+
    62 <<" at block recursion level "<<l-blocklevel);
    \n+
    63 else{
    \n+
    64 auto m = Impl::asMatrix(*diagonal);
    \n+
    65 CheckIfDiagonalPresent<decltype(m),blocklevel-1,l>::check(m);
    \n+
    66 }
    \n+
    67 }
    \n+
    68#endif
    \n+
    69 }
    \n+
    \n+
    70 };
    \n+
    \n+
    71
    \n+
    72 template<class Matrix, std::size_t l>
    \n+
    \n+\n+
    74 {
    \n+
    \n+
    75 static void check(const Matrix& mat)
    \n+
    76 {
    \n+
    77 typedef typename Matrix::ConstRowIterator Row;
    \n+
    78 for(Row row = mat.begin(); row!=mat.end(); ++row) {
    \n+
    79 if(row->find(row.index())==row->end())
    \n+
    80 DUNE_THROW(ISTLError, "Missing diagonal value in row "<<row.index()
    \n+
    81 <<" at block recursion level "<<l);
    \n+
    82 }
    \n+
    83 }
    \n+
    \n+
    84 };
    \n+
    \n+
    85
    \n+
    86 template<typename FirstRow, typename... Args>
    \n+
    87 class MultiTypeBlockMatrix;
    \n+
    88
    \n+
    89 template<std::size_t blocklevel, std::size_t l, typename T1, typename... Args>
    \n+
    \n+\n+
    91 blocklevel,l>
    \n+
    92 {
    \n+
    93 typedef MultiTypeBlockMatrix<T1,Args...> Matrix;
    \n+
    94
    \n+
    \n+
    99 static void check(const Matrix& /* mat */)
    \n+
    100 {
    \n+
    101#ifdef DUNE_ISTL_WITH_CHECKING
    \n+
    102 // TODO Implement check
    \n+
    103#endif
    \n+
    104 }
    \n+
    \n+
    105 };
    \n+
    \n+
    106
    \n+
    118 template<class M>
    \n+
    \n+
    119 inline auto countNonZeros(const M&,
    \n+
    120 [[maybe_unused]] typename std::enable_if_t<Dune::IsNumber<M>::value>* sfinae = nullptr)
    \n+
    121 {
    \n+
    122 return 1;
    \n+
    123 }
    \n+
    \n+
    124
    \n+
    125 template<class M>
    \n+
    \n+
    126 inline auto countNonZeros(const M& matrix,
    \n+
    127 [[maybe_unused]] typename std::enable_if_t<!Dune::IsNumber<M>::value>* sfinae = nullptr)
    \n+
    128 {
    \n+
    129 typename M::size_type nonZeros = 0;
    \n+
    130 for(auto&& row : matrix)
    \n+
    131 for(auto&& entry : row)
    \n+
    132 nonZeros += countNonZeros(entry);
    \n+
    133 return nonZeros;
    \n+
    134 }
    \n+
    \n+
    135
    \n+
    136 /*
    \n+
    137 template<class M>
    \n+
    138 struct ProcessOnFieldsOfMatrix
    \n+
    139 */
    \n+
    140
    \n+
    142 namespace
    \n+
    143 {
    \n+
    144 struct CompPair {
    \n+
    145 template<class G,class M>
    \n+
    146 bool operator()(const std::pair<G,M>& p1, const std::pair<G,M>& p2) const
    \n+
    147 {
    \n+
    148 return p1.first<p2.first;
    \n+
    149 }
    \n+
    150 };
    \n+
    151
    \n+
    152 }
    \n+
    153 template<class M, class C>
    \n+
    \n+
    154 void printGlobalSparseMatrix(const M& mat, C& ooc, std::ostream& os)
    \n+
    155 {
    \n+
    156 typedef typename C::ParallelIndexSet::const_iterator IIter;
    \n+
    157 typedef typename C::OwnerSet OwnerSet;
    \n+
    158 typedef typename C::ParallelIndexSet::GlobalIndex GlobalIndex;
    \n+
    159
    \n+
    160 GlobalIndex gmax=0;
    \n+
    161
    \n+
    162 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
    \n+
    163 idx!=eidx; ++idx)
    \n+
    164 gmax=std::max(gmax,idx->global());
    \n+
    165
    \n+
    166 gmax=ooc.communicator().max(gmax);
    \n+
    167 ooc.buildGlobalLookup();
    \n
    168
    \n-
    169 public:
    \n-
    172 static inline void arrayToDomainBlockVector (const Real* v,
    \n-
    173 DomainBlockVector& dbv)
    \n-
    174 {
    \n-
    175 for (dbv_size_type block = 0; block < dbv.N(); ++block)
    \n-
    176 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)
    \n-
    177 dbv[block][iBlock] = v[block*dbvBlockSize + iBlock];
    \n-
    178 }
    \n-
    179
    \n-
    182 static inline void arrayToRangeBlockVector (const Real* v,
    \n-
    183 RangeBlockVector& rbv)
    \n-
    184 {
    \n-
    185 for (rbv_size_type block = 0; block < rbv.N(); ++block)
    \n-
    186 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)
    \n-
    187 rbv[block][iBlock] = v[block*rbvBlockSize + iBlock];
    \n-
    188 }
    \n-
    189
    \n-
    190 protected:
    \n-
    191 // The DUNE-ISTL BCRSMatrix
    \n-
    192 const BCRSMatrix& A_;
    \n-
    193
    \n-
    194 // Number of rows and columns in the matrix
    \n-
    195 const int m_, n_;
    \n-
    196
    \n-
    197 // Auxiliary block vector objects which are
    \n-
    198 // compatible to matrix rows / columns
    \n-
    199 mutable DomainBlockVector domainBlockVector;
    \n-
    200 mutable RangeBlockVector rangeBlockVector;
    \n-
    201 };
    \n-
    202 } // end namespace Impl
    \n-
    203
    \n-
    243 template <typename BCRSMatrix, typename BlockVector>
    \n-
    \n-\n-
    245 {
    \n-
    246 public:
    \n-\n-
    248
    \n-
    249 public:
    \n-
    \n-\n-
    269 const unsigned int nIterationsMax = 100000,
    \n-
    270 const unsigned int verbosity_level = 0)
    \n-
    271 : m_(m), nIterationsMax_(nIterationsMax),
    \n-
    272 verbosity_level_(verbosity_level),
    \n-
    273 nIterations_(0),
    \n-
    274 title_(" ArPackPlusPlus_Algorithms: "),
    \n-
    275 blank_(title_.length(),' ')
    \n-
    276 {}
    \n-
    \n-
    277
    \n-
    \n-
    289 inline void computeSymMaxMagnitude (const Real& epsilon,
    \n-
    290 BlockVector& x, Real& lambda) const
    \n-
    291 {
    \n-
    292 // print verbosity information
    \n-
    293 if (verbosity_level_ > 0)
    \n-
    294 std::cout << title_ << "Computing an approximation of "
    \n-
    295 << "the dominant eigenvalue of a matrix which "
    \n-
    296 << "is assumed to be symmetric." << std::endl;
    \n-
    297
    \n-
    298 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n-
    299 // and to perform the product A*v (LU decomposition is not used)
    \n-
    300 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n-
    301 WrappedMatrix A(m_);
    \n-
    302
    \n-
    303 // get number of rows and columns in A
    \n-
    304 const int nrows = A.nrows();
    \n-
    305 const int ncols = A.ncols();
    \n-
    306
    \n-
    307 // assert that A is square
    \n-
    308 if (nrows != ncols)
    \n-
    309 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
    \n-
    310 << nrows << "x" << ncols << ").");
    \n-
    311
    \n-
    312 // allocate memory for variables, set parameters
    \n-
    313 const int nev = 1; // Number of eigenvalues to compute
    \n-
    314 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n-
    315 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n-
    316 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n-
    317 Real* ev = new Real[nev]; // Computed eigenvalues of A
    \n-
    318 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n-
    319 int nconv; // Number of converged eigenvalues
    \n+
    169 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
    \n+
    170 idx!=eidx; ++idx) {
    \n+
    171 if(OwnerSet::contains(idx->local().attribute()))
    \n+
    172 {
    \n+
    173 typedef typename M::block_type Block;
    \n+
    174
    \n+
    175 std::set<std::pair<GlobalIndex,Block>,CompPair> entries;
    \n+
    176
    \n+
    177 // sort rows
    \n+
    178 typedef typename M::ConstColIterator CIter;
    \n+
    179 for(CIter c=mat[idx->local()].begin(), cend=mat[idx->local()].end();
    \n+
    180 c!=cend; ++c) {
    \n+
    181 const typename C::ParallelIndexSet::IndexPair* pair
    \n+
    182 =ooc.globalLookup().pair(c.index());
    \n+
    183 assert(pair);
    \n+
    184 entries.insert(std::make_pair(pair->global(), *c));
    \n+
    185 }
    \n+
    186
    \n+
    187 //wait until its the rows turn.
    \n+
    188 GlobalIndex rowidx = idx->global();
    \n+
    189 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
    \n+
    190 while(cur!=rowidx)
    \n+
    191 cur=ooc.communicator().min(rowidx);
    \n+
    192
    \n+
    193 // print rows
    \n+
    194 typedef typename std::set<std::pair<GlobalIndex,Block>,CompPair>::iterator SIter;
    \n+
    195 for(SIter s=entries.begin(), send=entries.end(); s!=send; ++s)
    \n+
    196 os<<idx->global()<<" "<<s->first<<" "<<s->second<<std::endl;
    \n+
    197
    \n+
    198
    \n+
    199 }
    \n+
    200 }
    \n+
    201
    \n+
    202 ooc.freeGlobalLookup();
    \n+
    203 // Wait until everybody is finished
    \n+
    204 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
    \n+
    205 while(cur!=ooc.communicator().min(cur)) ;
    \n+
    206 }
    \n+
    \n+
    207
    \n+
    208 // Default implementation for scalar types
    \n+
    209 template<typename M>
    \n+
    \n+\n+
    211 {
    \n+
    212 static_assert(IsNumber<M>::value, "MatrixDimension is not implemented for this type!");
    \n+
    213
    \n+
    \n+
    214 static auto rowdim(const M& A)
    \n+
    215 {
    \n+
    216 return 1;
    \n+
    217 }
    \n+
    \n+
    218
    \n+
    \n+
    219 static auto coldim(const M& A)
    \n+
    220 {
    \n+
    221 return 1;
    \n+
    222 }
    \n+
    \n+
    223 };
    \n+
    \n+
    224
    \n+
    225 // Default implementation for scalar types
    \n+
    226 template<typename B, typename TA>
    \n+
    \n+
    227 struct MatrixDimension<Matrix<B,TA> >
    \n+
    228 {
    \n+\n+\n+
    231
    \n+
    \n+\n+
    233 {
    \n+\n+
    235 }
    \n+
    \n+
    236
    \n+
    \n+\n+
    238 {
    \n+\n+
    240 }
    \n+
    \n+
    241
    \n+
    \n+
    242 static size_type rowdim (const Matrix<B,TA>& A)
    \n+
    243 {
    \n+
    244 size_type nn=0;
    \n+
    245 for (size_type i=0; i<A.N(); i++)
    \n+
    246 nn += rowdim(A,i);
    \n+
    247 return nn;
    \n+
    248 }
    \n+
    \n+
    249
    \n+
    \n+
    250 static size_type coldim (const Matrix<B,TA>& A)
    \n+
    251 {
    \n+
    252 size_type nn=0;
    \n+
    253 for (size_type i=0; i<A.M(); i++)
    \n+
    254 nn += coldim(A,i);
    \n+
    255 return nn;
    \n+
    256 }
    \n+
    \n+
    257 };
    \n+
    \n+
    258
    \n+
    259
    \n+
    260 template<typename B, typename TA>
    \n+
    \n+\n+
    262 {
    \n+\n+\n+
    265 typedef typename Matrix::size_type size_type;
    \n+
    266
    \n+
    \n+
    267 static size_type rowdim (const Matrix& A, size_type i)
    \n+
    268 {
    \n+
    269 const B* row = A.r[i].getptr();
    \n+
    270 if(row)
    \n+\n+
    272 else
    \n+
    273 return 0;
    \n+
    274 }
    \n+
    \n+
    275
    \n+
    \n+
    276 static size_type coldim (const Matrix& A, size_type c)
    \n+
    277 {
    \n+
    278 // find an entry in column c
    \n+
    279 if (A.nnz_ > 0)
    \n+
    280 {
    \n+
    281 for (size_type k=0; k<A.nnz_; k++) {
    \n+
    282 if (A.j_.get()[k] == c) {
    \n+\n+
    284 }
    \n+
    285 }
    \n+
    286 }
    \n+
    287 else
    \n+
    288 {
    \n+
    289 for (size_type i=0; i<A.N(); i++)
    \n+
    290 {
    \n+
    291 size_type* j = A.r[i].getindexptr();
    \n+
    292 B* a = A.r[i].getptr();
    \n+
    293 for (size_type k=0; k<A.r[i].getsize(); k++)
    \n+
    294 if (j[k]==c) {
    \n+\n+
    296 }
    \n+
    297 }
    \n+
    298 }
    \n+
    299
    \n+
    300 // not found
    \n+
    301 return 0;
    \n+
    302 }
    \n+
    \n+
    303
    \n+
    \n+
    304 static size_type rowdim (const Matrix& A){
    \n+
    305 size_type nn=0;
    \n+
    306 for (size_type i=0; i<A.N(); i++)
    \n+
    307 nn += rowdim(A,i);
    \n+
    308 return nn;
    \n+
    309 }
    \n+
    \n+
    310
    \n+
    \n+
    311 static size_type coldim (const Matrix& A){
    \n+
    312 typedef typename Matrix::ConstRowIterator ConstRowIterator;
    \n+
    313 typedef typename Matrix::ConstColIterator ConstColIterator;
    \n+
    314
    \n+
    315 // The following code has a complexity of nnz, and
    \n+
    316 // typically a very small constant.
    \n+
    317 //
    \n+
    318 std::vector<size_type> coldims(A.M(),
    \n+
    319 std::numeric_limits<size_type>::max());
    \n
    320
    \n-
    321 // define what we need: eigenvalues with largest magnitude
    \n-
    322 char which[] = "LM";
    \n-
    323 ARSymStdEig<Real,WrappedMatrix>
    \n-
    324 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
    \n-
    325
    \n-
    326 // set ARPACK verbosity mode if requested
    \n-
    327 if (verbosity_level_ > 3) dprob.Trace();
    \n-
    328
    \n-
    329 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
    \n-
    330 nconv = dprob.Eigenvalues(ev,ivec);
    \n-
    331
    \n-
    332 // obtain approximated dominant eigenvalue of A
    \n-
    333 lambda = ev[nev-1];
    \n-
    334
    \n-
    335 // obtain associated approximated eigenvector of A
    \n-
    336 Real* x_raw = dprob.RawEigenvector(nev-1);
    \n-
    337 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
    \n+
    321 for (ConstRowIterator row=A.begin(); row!=A.end(); ++row)
    \n+
    322 for (ConstColIterator col=row->begin(); col!=row->end(); ++col)
    \n+
    323 // only compute blocksizes we don't already have
    \n+
    324 if (coldims[col.index()]==std::numeric_limits<size_type>::max())
    \n+
    325 coldims[col.index()] = MatrixDimension<block_type>::coldim(*col);
    \n+
    326
    \n+
    327 size_type sum = 0;
    \n+
    328 for (typename std::vector<size_type>::iterator it=coldims.begin();
    \n+
    329 it!=coldims.end(); ++it)
    \n+
    330 // skip rows for which no coldim could be determined
    \n+
    331 if ((*it)>=0)
    \n+
    332 sum += *it;
    \n+
    333
    \n+
    334 return sum;
    \n+
    335 }
    \n+
    \n+
    336 };
    \n+
    \n+
    337
    \n
    338
    \n-
    339 // obtain number of Arnoldi update iterations actually taken
    \n-
    340 nIterations_ = dprob.GetIter();
    \n-
    341
    \n-
    342 // compute residual norm
    \n-
    343 BlockVector r(x);
    \n-
    344 Real* Ax_raw = new Real[nrows];
    \n-
    345 A.multMv(x_raw,Ax_raw);
    \n-
    346 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);
    \n-
    347 r.axpy(-lambda,x);
    \n-
    348 const Real r_norm = r.two_norm();
    \n+
    339 template<typename B, int n, int m, typename TA>
    \n+
    \n+\n+
    341 {
    \n+\n+
    343 typedef typename Matrix::size_type size_type;
    \n+
    344
    \n+
    \n+
    345 static size_type rowdim (const Matrix& /*A*/, size_type /*i*/)
    \n+
    346 {
    \n+
    347 return n;
    \n+
    348 }
    \n+
    \n
    349
    \n-
    350 // print verbosity information
    \n-
    351 if (verbosity_level_ > 0)
    \n-
    352 {
    \n-
    353 if (verbosity_level_ > 1)
    \n-
    354 {
    \n-
    355 // print some information about the problem
    \n-
    356 std::cout << blank_ << "Obtained eigenvalues of A by solving "
    \n-
    357 << "A*x = \u03bb*x using the ARPACK++ class ARSym"
    \n-
    358 << "StdEig:" << std::endl;
    \n-
    359 std::cout << blank_ << " converged eigenvalues of A: "
    \n-
    360 << nconv << " / " << nev << std::endl;
    \n-
    361 std::cout << blank_ << " dominant eigenvalue of A: "
    \n-
    362 << lambda << std::endl;
    \n-
    363 }
    \n-
    364 std::cout << blank_ << "Result ("
    \n-
    365 << "#iterations = " << nIterations_ << ", "
    \n-
    366 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n-
    367 << "\u03bb = " << lambda << std::endl;
    \n-
    368 if (verbosity_level_ > 2)
    \n-
    369 {
    \n-
    370 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n-
    371 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n-
    372 }
    \n-
    373 }
    \n+
    \n+
    350 static size_type coldim (const Matrix& /*A*/, size_type /*c*/)
    \n+
    351 {
    \n+
    352 return m;
    \n+
    353 }
    \n+
    \n+
    354
    \n+
    \n+
    355 static size_type rowdim (const Matrix& A) {
    \n+
    356 return A.N()*n;
    \n+
    357 }
    \n+
    \n+
    358
    \n+
    \n+
    359 static size_type coldim (const Matrix& A) {
    \n+
    360 return A.M()*m;
    \n+
    361 }
    \n+
    \n+
    362 };
    \n+
    \n+
    363
    \n+
    364 template<typename K, int n, int m>
    \n+
    \n+\n+
    366 {
    \n+\n+
    368 typedef typename Matrix::size_type size_type;
    \n+
    369
    \n+
    \n+
    370 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
    \n+
    371 {
    \n+
    372 return 1;
    \n+
    373 }
    \n+
    \n
    374
    \n-
    375 // free dynamically allocated memory
    \n-
    376 delete[] Ax_raw;
    \n-
    377 delete[] ev;
    \n+
    \n+
    375 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
    \n+
    376 {
    \n+
    377 return 1;
    \n
    378 }
    \n
    \n
    379
    \n-
    \n-
    391 inline void computeSymMinMagnitude (const Real& epsilon,
    \n-
    392 BlockVector& x, Real& lambda) const
    \n-
    393 {
    \n-
    394 // print verbosity information
    \n-
    395 if (verbosity_level_ > 0)
    \n-
    396 std::cout << title_ << "Computing an approximation of the "
    \n-
    397 << "least dominant eigenvalue of a matrix which "
    \n-
    398 << "is assumed to be symmetric." << std::endl;
    \n-
    399
    \n-
    400 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n-
    401 // and to perform the product A*v (LU decomposition is not used)
    \n-
    402 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n-
    403 WrappedMatrix A(m_);
    \n-
    404
    \n-
    405 // get number of rows and columns in A
    \n-
    406 const int nrows = A.nrows();
    \n-
    407 const int ncols = A.ncols();
    \n-
    408
    \n-
    409 // assert that A is square
    \n-
    410 if (nrows != ncols)
    \n-
    411 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
    \n-
    412 << nrows << "x" << ncols << ").");
    \n-
    413
    \n-
    414 // allocate memory for variables, set parameters
    \n-
    415 const int nev = 1; // Number of eigenvalues to compute
    \n-
    416 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n-
    417 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n-
    418 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n-
    419 Real* ev = new Real[nev]; // Computed eigenvalues of A
    \n-
    420 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n-
    421 int nconv; // Number of converged eigenvalues
    \n-
    422
    \n-
    423 // define what we need: eigenvalues with smallest magnitude
    \n-
    424 char which[] = "SM";
    \n-
    425 ARSymStdEig<Real,WrappedMatrix>
    \n-
    426 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
    \n-
    427
    \n-
    428 // set ARPACK verbosity mode if requested
    \n-
    429 if (verbosity_level_ > 3) dprob.Trace();
    \n-
    430
    \n-
    431 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
    \n-
    432 nconv = dprob.Eigenvalues(ev,ivec);
    \n+
    \n+
    380 static size_type rowdim(const Matrix& /*A*/)
    \n+
    381 {
    \n+
    382 return n;
    \n+
    383 }
    \n+
    \n+
    384
    \n+
    \n+
    385 static size_type coldim(const Matrix& /*A*/)
    \n+
    386 {
    \n+
    387 return m;
    \n+
    388 }
    \n+
    \n+
    389 };
    \n+
    \n+
    390
    \n+
    391 template <class T>
    \n+
    \n+
    392 struct MatrixDimension<Dune::DynamicMatrix<T> >
    \n+
    393 {
    \n+
    394 typedef Dune::DynamicMatrix<T> MatrixType;
    \n+
    395 typedef typename MatrixType::size_type size_type;
    \n+
    396
    \n+
    \n+
    397 static size_type rowdim(const MatrixType& /*A*/, size_type /*r*/)
    \n+
    398 {
    \n+
    399 return 1;
    \n+
    400 }
    \n+
    \n+
    401
    \n+
    \n+
    402 static size_type coldim(const MatrixType& /*A*/, size_type /*r*/)
    \n+
    403 {
    \n+
    404 return 1;
    \n+
    405 }
    \n+
    \n+
    406
    \n+
    \n+
    407 static size_type rowdim(const MatrixType& A)
    \n+
    408 {
    \n+
    409 return A.N();
    \n+
    410 }
    \n+
    \n+
    411
    \n+
    \n+
    412 static size_type coldim(const MatrixType& A)
    \n+
    413 {
    \n+
    414 return A.M();
    \n+
    415 }
    \n+
    \n+
    416 };
    \n+
    \n+
    417
    \n+
    418 template<typename K, int n, int m, typename TA>
    \n+
    \n+
    419 struct MatrixDimension<Matrix<FieldMatrix<K,n,m>, TA> >
    \n+
    420 {
    \n+\n+\n+
    423
    \n+
    \n+
    424 static size_type rowdim(const ThisMatrix& /*A*/, size_type /*r*/)
    \n+
    425 {
    \n+
    426 return n;
    \n+
    427 }
    \n+
    \n+
    428
    \n+
    \n+
    429 static size_type coldim(const ThisMatrix& /*A*/, size_type /*r*/)
    \n+
    430 {
    \n+
    431 return m;
    \n+
    432 }
    \n+
    \n
    433
    \n-
    434 // obtain approximated least dominant eigenvalue of A
    \n-
    435 lambda = ev[nev-1];
    \n-
    436
    \n-
    437 // obtain associated approximated eigenvector of A
    \n-
    438 Real* x_raw = dprob.RawEigenvector(nev-1);
    \n-
    439 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
    \n-
    440
    \n-
    441 // obtain number of Arnoldi update iterations actually taken
    \n-
    442 nIterations_ = dprob.GetIter();
    \n-
    443
    \n-
    444 // compute residual norm
    \n-
    445 BlockVector r(x);
    \n-
    446 Real* Ax_raw = new Real[nrows];
    \n-
    447 A.multMv(x_raw,Ax_raw);
    \n-
    448 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);
    \n-
    449 r.axpy(-lambda,x);
    \n-
    450 const Real r_norm = r.two_norm();
    \n-
    451
    \n-
    452 // print verbosity information
    \n-
    453 if (verbosity_level_ > 0)
    \n-
    454 {
    \n-
    455 if (verbosity_level_ > 1)
    \n-
    456 {
    \n-
    457 // print some information about the problem
    \n-
    458 std::cout << blank_ << "Obtained eigenvalues of A by solving "
    \n-
    459 << "A*x = \u03bb*x using the ARPACK++ class ARSym"
    \n-
    460 << "StdEig:" << std::endl;
    \n-
    461 std::cout << blank_ << " converged eigenvalues of A: "
    \n-
    462 << nconv << " / " << nev << std::endl;
    \n-
    463 std::cout << blank_ << " least dominant eigenvalue of A: "
    \n-
    464 << lambda << std::endl;
    \n-
    465 }
    \n-
    466 std::cout << blank_ << "Result ("
    \n-
    467 << "#iterations = " << nIterations_ << ", "
    \n-
    468 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n-
    469 << "\u03bb = " << lambda << std::endl;
    \n-
    470 if (verbosity_level_ > 2)
    \n-
    471 {
    \n-
    472 // print approximated eigenvector via DUNE-ISTL I/O methods
    \n-
    473 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n-
    474 }
    \n-
    475 }
    \n-
    476
    \n-
    477 // free dynamically allocated memory
    \n-
    478 delete[] Ax_raw;
    \n-
    479 delete[] ev;
    \n-
    480 }
    \n+
    \n+
    434 static size_type rowdim(const ThisMatrix& A)
    \n+
    435 {
    \n+
    436 return A.N()*n;
    \n+
    437 }
    \n+
    \n+
    438
    \n+
    \n+
    439 static size_type coldim(const ThisMatrix& A)
    \n+
    440 {
    \n+
    441 return A.M()*m;
    \n+
    442 }
    \n+
    \n+
    443 };
    \n+
    \n+
    444
    \n+
    445 template<typename K, int n>
    \n+
    \n+
    446 struct MatrixDimension<DiagonalMatrix<K,n> >
    \n+
    447 {
    \n+
    448 typedef DiagonalMatrix<K,n> Matrix;
    \n+
    449 typedef typename Matrix::size_type size_type;
    \n+
    450
    \n+
    \n+
    451 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
    \n+
    452 {
    \n+
    453 return 1;
    \n+
    454 }
    \n+
    \n+
    455
    \n+
    \n+
    456 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
    \n+
    457 {
    \n+
    458 return 1;
    \n+
    459 }
    \n+
    \n+
    460
    \n+
    \n+
    461 static size_type rowdim(const Matrix& /*A*/)
    \n+
    462 {
    \n+
    463 return n;
    \n+
    464 }
    \n+
    \n+
    465
    \n+
    \n+
    466 static size_type coldim(const Matrix& /*A*/)
    \n+
    467 {
    \n+
    468 return n;
    \n+
    469 }
    \n+
    \n+
    470 };
    \n+
    \n+
    471
    \n+
    472 template<typename K, int n>
    \n+
    \n+\n+
    474 {
    \n+\n+
    476 typedef typename Matrix::size_type size_type;
    \n+
    477
    \n+
    \n+
    478 static size_type rowdim(const Matrix& /*A*/, size_type /*r*/)
    \n+
    479 {
    \n+
    480 return 1;
    \n+
    481 }
    \n+
    \n+
    482
    \n+
    \n+
    483 static size_type coldim(const Matrix& /*A*/, size_type /*r*/)
    \n+
    484 {
    \n+
    485 return 1;
    \n+
    486 }
    \n+
    \n+
    487
    \n+
    \n+
    488 static size_type rowdim(const Matrix& /*A*/)
    \n+
    489 {
    \n+
    490 return n;
    \n+
    491 }
    \n
    \n-
    481
    \n+
    492
    \n
    \n-
    493 inline void computeSymCond2 (const Real& epsilon, Real& cond_2) const
    \n-
    494 {
    \n-
    495 // print verbosity information
    \n-
    496 if (verbosity_level_ > 0)
    \n-
    497 std::cout << title_ << "Computing an approximation of the "
    \n-
    498 << "spectral condition number of a matrix which "
    \n-
    499 << "is assumed to be symmetric." << std::endl;
    \n-
    500
    \n-
    501 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n-
    502 // and to perform the product A*v (LU decomposition is not used)
    \n-
    503 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n-
    504 WrappedMatrix A(m_);
    \n-
    505
    \n-
    506 // get number of rows and columns in A
    \n-
    507 const int nrows = A.nrows();
    \n-
    508 const int ncols = A.ncols();
    \n-
    509
    \n-
    510 // assert that A is square
    \n-
    511 if (nrows != ncols)
    \n-
    512 DUNE_THROW(Dune::ISTLError,"Matrix is not square ("
    \n-
    513 << nrows << "x" << ncols << ").");
    \n-
    514
    \n-
    515 // allocate memory for variables, set parameters
    \n-
    516 const int nev = 2; // Number of eigenvalues to compute
    \n-
    517 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n-
    518 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n-
    519 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n-
    520 Real* ev = new Real[nev]; // Computed eigenvalues of A
    \n-
    521 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n-
    522 int nconv; // Number of converged eigenvalues
    \n+
    493 static size_type coldim(const Matrix& /*A*/)
    \n+
    494 {
    \n+
    495 return n;
    \n+
    496 }
    \n+
    \n+
    497 };
    \n+
    \n+
    498
    \n+
    502 template<typename T>
    \n+
    \n+
    503 struct IsMatrix
    \n+
    504 {
    \n+
    505 enum {
    \n+
    509 value = false
    \n+
    510 };
    \n+
    511 };
    \n+
    \n+
    512
    \n+
    513 template<typename T>
    \n+
    \n+
    514 struct IsMatrix<DenseMatrix<T> >
    \n+
    515 {
    \n+
    516 enum {
    \n+
    520 value = true
    \n+
    521 };
    \n+
    522 };
    \n+
    \n
    523
    \n-
    524 // define what we need: eigenvalues from both ends of the spectrum
    \n-
    525 char which[] = "BE";
    \n-
    526 ARSymStdEig<Real,WrappedMatrix>
    \n-
    527 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);
    \n-
    528
    \n-
    529 // set ARPACK verbosity mode if requested
    \n-
    530 if (verbosity_level_ > 3) dprob.Trace();
    \n-
    531
    \n-
    532 // find eigenvalues and eigenvectors of A, obtain the eigenvalues
    \n-
    533 nconv = dprob.Eigenvalues(ev,ivec);
    \n-
    534
    \n-
    535 // obtain approximated dominant and least dominant eigenvalue of A
    \n-
    536 const Real& lambda_max = ev[nev-1];
    \n-
    537 const Real& lambda_min = ev[0];
    \n-
    538
    \n-
    539 // obtain associated approximated eigenvectors of A
    \n-
    540 Real* x_max_raw = dprob.RawEigenvector(nev-1);
    \n-
    541 Real* x_min_raw = dprob.RawEigenvector(0);
    \n-
    542
    \n-
    543 // obtain approximated spectral condition number of A
    \n-
    544 cond_2 = std::abs(lambda_max / lambda_min);
    \n-
    545
    \n-
    546 // obtain number of Arnoldi update iterations actually taken
    \n-
    547 nIterations_ = dprob.GetIter();
    \n-
    548
    \n-
    549 // compute each residual norm
    \n-
    550 Real* Ax_max_raw = new Real[nrows];
    \n-
    551 Real* Ax_min_raw = new Real[nrows];
    \n-
    552 A.multMv(x_max_raw,Ax_max_raw);
    \n-
    553 A.multMv(x_min_raw,Ax_min_raw);
    \n-
    554 Real r_max_norm = 0.0;
    \n-
    555 Real r_min_norm = 0.0;
    \n-
    556 for (int i = 0; i < nrows; ++i)
    \n-
    557 {
    \n-
    558 r_max_norm += std::pow(Ax_max_raw[i] - lambda_max * x_max_raw[i],2);
    \n-
    559 r_min_norm += std::pow(Ax_min_raw[i] - lambda_min * x_min_raw[i],2);
    \n-
    560 }
    \n-
    561 r_max_norm = std::sqrt(r_max_norm);
    \n-
    562 r_min_norm = std::sqrt(r_min_norm);
    \n-
    563
    \n-
    564 // print verbosity information
    \n-
    565 if (verbosity_level_ > 0)
    \n-
    566 {
    \n-
    567 if (verbosity_level_ > 1)
    \n-
    568 {
    \n-
    569 // print some information about the problem
    \n-
    570 std::cout << blank_ << "Obtained eigenvalues of A by solving "
    \n-
    571 << "A*x = \u03bb*x using the ARPACK++ class ARSym"
    \n-
    572 << "StdEig:" << std::endl;
    \n-
    573 std::cout << blank_ << " converged eigenvalues of A: "
    \n-
    574 << nconv << " / " << nev << std::endl;
    \n-
    575 std::cout << blank_ << " dominant eigenvalue of A: "
    \n-
    576 << lambda_max << std::endl;
    \n-
    577 std::cout << blank_ << " least dominant eigenvalue of A: "
    \n-
    578 << lambda_min << std::endl;
    \n-
    579 std::cout << blank_ << " spectral condition number of A: "
    \n-
    580 << cond_2 << std::endl;
    \n-
    581 }
    \n-
    582 std::cout << blank_ << "Result ("
    \n-
    583 << "#iterations = " << nIterations_ << ", "
    \n-
    584 << "\u2551residual\u2551_2 = {" << r_max_norm << ","
    \n-
    585 << r_min_norm << "}, " << "\u03bb = {"
    \n-
    586 << lambda_max << "," << lambda_min
    \n-
    587 << "}): cond_2 = " << cond_2 << std::endl;
    \n-
    588 }
    \n-
    589
    \n-
    590 // free dynamically allocated memory
    \n-
    591 delete[] Ax_min_raw;
    \n-
    592 delete[] Ax_max_raw;
    \n-
    593 delete[] ev;
    \n-
    594 }
    \n-
    \n-
    595
    \n-
    \n-
    609 inline void computeNonSymMax (const Real& epsilon,
    \n-
    610 BlockVector& x, Real& sigma) const
    \n-
    611 {
    \n-
    612 // print verbosity information
    \n-
    613 if (verbosity_level_ > 0)
    \n-
    614 std::cout << title_ << "Computing an approximation of the "
    \n-
    615 << "largest singular value of a matrix which "
    \n-
    616 << "is assumed to be nonsymmetric." << std::endl;
    \n-
    617
    \n-
    618 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n-
    619 // and to perform the product A^T*A*v (LU decomposition is not used)
    \n-
    620 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n-
    621 WrappedMatrix A(m_);
    \n-
    622
    \n-
    623 // get number of rows and columns in A
    \n-
    624 const int nrows = A.nrows();
    \n-
    625 const int ncols = A.ncols();
    \n-
    626
    \n-
    627 // assert that A has more rows than columns (extend code later to the opposite case!)
    \n-
    628 if (nrows < ncols)
    \n-
    629 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
    \n-
    630 << "columns (" << nrows << "x" << ncols << ")."
    \n-
    631 << " This case is not implemented, yet.");
    \n-
    632
    \n-
    633 // allocate memory for variables, set parameters
    \n-
    634 const int nev = 1; // Number of eigenvalues to compute
    \n-
    635 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n-
    636 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n-
    637 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n-
    638 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
    \n-
    639 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n-
    640 int nconv; // Number of converged eigenvalues
    \n-
    641
    \n-
    642 // define what we need: eigenvalues with largest algebraic value
    \n-
    643 char which[] = "LA";
    \n-
    644 ARSymStdEig<Real,WrappedMatrix>
    \n-
    645 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
    \n-
    646
    \n-
    647 // set ARPACK verbosity mode if requested
    \n-
    648 if (verbosity_level_ > 3) dprob.Trace();
    \n-
    649
    \n-
    650 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
    \n-
    651 nconv = dprob.Eigenvalues(ev,ivec);
    \n-
    652
    \n-
    653 // obtain approximated largest eigenvalue of A^T*A
    \n-
    654 const Real& lambda = ev[nev-1];
    \n-
    655
    \n-
    656 // obtain associated approximated eigenvector of A^T*A
    \n-
    657 Real* x_raw = dprob.RawEigenvector(nev-1);
    \n-
    658 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
    \n-
    659
    \n-
    660 // obtain number of Arnoldi update iterations actually taken
    \n-
    661 nIterations_ = dprob.GetIter();
    \n-
    662
    \n-
    663 // compute residual norm
    \n-
    664 BlockVector r(x);
    \n-
    665 Real* AtAx_raw = new Real[ncols];
    \n-
    666 A.multMtMv(x_raw,AtAx_raw);
    \n-
    667 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);
    \n-
    668 r.axpy(-lambda,x);
    \n-
    669 const Real r_norm = r.two_norm();
    \n-
    670
    \n-
    671 // calculate largest singular value of A (note that
    \n-
    672 // x is right-singular / left-singular vector of A)
    \n-
    673 sigma = std::sqrt(lambda);
    \n-
    674
    \n-
    675 // print verbosity information
    \n-
    676 if (verbosity_level_ > 0)
    \n-
    677 {
    \n-
    678 if (verbosity_level_ > 1)
    \n-
    679 {
    \n-
    680 // print some information about the problem
    \n-
    681 std::cout << blank_ << "Obtained singular values of A by sol"
    \n-
    682 << "ving (A^T*A)*x = \u03c3\u00b2*x using the ARPACK++ "
    \n-
    683 << "class ARSymStdEig:" << std::endl;
    \n-
    684 std::cout << blank_ << " converged eigenvalues of A^T*A: "
    \n-
    685 << nconv << " / " << nev << std::endl;
    \n-
    686 std::cout << blank_ << " largest eigenvalue of A^T*A: "
    \n-
    687 << lambda << std::endl;
    \n-
    688 std::cout << blank_ << " => largest singular value of A: "
    \n-
    689 << sigma << std::endl;
    \n-
    690 }
    \n-
    691 std::cout << blank_ << "Result ("
    \n-
    692 << "#iterations = " << nIterations_ << ", "
    \n-
    693 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n-
    694 << "\u03c3 = " << sigma << std::endl;
    \n-
    695 if (verbosity_level_ > 2)
    \n-
    696 {
    \n-
    697 // print approximated right-singular / left-singular vector
    \n-
    698 // via DUNE-ISTL I/O methods
    \n-
    699 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n-
    700 }
    \n-
    701 }
    \n-
    702
    \n-
    703 // free dynamically allocated memory
    \n-
    704 delete[] AtAx_raw;
    \n-
    705 delete[] ev;
    \n-
    706 }
    \n-
    \n-
    707
    \n-
    \n-
    721 inline void computeNonSymMin (const Real& epsilon,
    \n-
    722 BlockVector& x, Real& sigma) const
    \n-
    723 {
    \n-
    724 // print verbosity information
    \n-
    725 if (verbosity_level_ > 0)
    \n-
    726 std::cout << title_ << "Computing an approximation of the "
    \n-
    727 << "smallest singular value of a matrix which "
    \n-
    728 << "is assumed to be nonsymmetric." << std::endl;
    \n-
    729
    \n-
    730 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n-
    731 // and to perform the product A^T*A*v (LU decomposition is not used)
    \n-
    732 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n-
    733 WrappedMatrix A(m_);
    \n-
    734
    \n-
    735 // get number of rows and columns in A
    \n-
    736 const int nrows = A.nrows();
    \n-
    737 const int ncols = A.ncols();
    \n-
    738
    \n-
    739 // assert that A has more rows than columns (extend code later to the opposite case!)
    \n-
    740 if (nrows < ncols)
    \n-
    741 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
    \n-
    742 << "columns (" << nrows << "x" << ncols << ")."
    \n-
    743 << " This case is not implemented, yet.");
    \n-
    744
    \n-
    745 // allocate memory for variables, set parameters
    \n-
    746 const int nev = 1; // Number of eigenvalues to compute
    \n-
    747 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n-
    748 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n-
    749 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n-
    750 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
    \n-
    751 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n-
    752 int nconv; // Number of converged eigenvalues
    \n-
    753
    \n-
    754 // define what we need: eigenvalues with smallest algebraic value
    \n-
    755 char which[] = "SA";
    \n-
    756 ARSymStdEig<Real,WrappedMatrix>
    \n-
    757 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
    \n-
    758
    \n-
    759 // set ARPACK verbosity mode if requested
    \n-
    760 if (verbosity_level_ > 3) dprob.Trace();
    \n-
    761
    \n-
    762 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
    \n-
    763 nconv = dprob.Eigenvalues(ev,ivec);
    \n-
    764
    \n-
    765 // obtain approximated smallest eigenvalue of A^T*A
    \n-
    766 const Real& lambda = ev[nev-1];
    \n-
    767
    \n-
    768 // obtain associated approximated eigenvector of A^T*A
    \n-
    769 Real* x_raw = dprob.RawEigenvector(nev-1);
    \n-
    770 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);
    \n-
    771
    \n-
    772 // obtain number of Arnoldi update iterations actually taken
    \n-
    773 nIterations_ = dprob.GetIter();
    \n-
    774
    \n-
    775 // compute residual norm
    \n-
    776 BlockVector r(x);
    \n-
    777 Real* AtAx_raw = new Real[ncols];
    \n-
    778 A.multMtMv(x_raw,AtAx_raw);
    \n-
    779 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);
    \n-
    780 r.axpy(-lambda,x);
    \n-
    781 const Real r_norm = r.two_norm();
    \n-
    782
    \n-
    783 // calculate smallest singular value of A (note that
    \n-
    784 // x is right-singular / left-singular vector of A)
    \n-
    785 sigma = std::sqrt(lambda);
    \n-
    786
    \n-
    787 // print verbosity information
    \n-
    788 if (verbosity_level_ > 0)
    \n-
    789 {
    \n-
    790 if (verbosity_level_ > 1)
    \n-
    791 {
    \n-
    792 // print some information about the problem
    \n-
    793 std::cout << blank_ << "Obtained singular values of A by sol"
    \n-
    794 << "ving (A^T*A)*x = \u03c3\u00b2*x using the ARPACK++ "
    \n-
    795 << "class ARSymStdEig:" << std::endl;
    \n-
    796 std::cout << blank_ << " converged eigenvalues of A^T*A: "
    \n-
    797 << nconv << " / " << nev << std::endl;
    \n-
    798 std::cout << blank_ << " smallest eigenvalue of A^T*A: "
    \n-
    799 << lambda << std::endl;
    \n-
    800 std::cout << blank_ << " => smallest singular value of A: "
    \n-
    801 << sigma << std::endl;
    \n-
    802 }
    \n-
    803 std::cout << blank_ << "Result ("
    \n-
    804 << "#iterations = " << nIterations_ << ", "
    \n-
    805 << "\u2551residual\u2551_2 = " << r_norm << "): "
    \n-
    806 << "\u03c3 = " << sigma << std::endl;
    \n-
    807 if (verbosity_level_ > 2)
    \n-
    808 {
    \n-
    809 // print approximated right-singular / left-singular vector
    \n-
    810 // via DUNE-ISTL I/O methods
    \n-
    811 Dune::printvector(std::cout,x,blank_+"x",blank_+"row");
    \n-
    812 }
    \n-
    813 }
    \n-
    814
    \n-
    815 // free dynamically allocated memory
    \n-
    816 delete[] AtAx_raw;
    \n-
    817 delete[] ev;
    \n-
    818 }
    \n-
    \n-
    819
    \n-
    \n-
    830 inline void computeNonSymCond2 (const Real& epsilon, Real& cond_2) const
    \n-
    831 {
    \n-
    832 // print verbosity information
    \n-
    833 if (verbosity_level_ > 0)
    \n-
    834 std::cout << title_ << "Computing an approximation of the "
    \n-
    835 << "spectral condition number of a matrix which "
    \n-
    836 << "is assumed to be nonsymmetric." << std::endl;
    \n-
    837
    \n-
    838 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information
    \n-
    839 // and to perform the product A^T*A*v (LU decomposition is not used)
    \n-
    840 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper<BCRSMatrix> WrappedMatrix;
    \n-
    841 WrappedMatrix A(m_);
    \n-
    842
    \n-
    843 // get number of rows and columns in A
    \n-
    844 const int nrows = A.nrows();
    \n-
    845 const int ncols = A.ncols();
    \n-
    846
    \n-
    847 // assert that A has more rows than columns (extend code later to the opposite case!)
    \n-
    848 if (nrows < ncols)
    \n-
    849 DUNE_THROW(Dune::ISTLError,"Matrix has less rows than "
    \n-
    850 << "columns (" << nrows << "x" << ncols << ")."
    \n-
    851 << " This case is not implemented, yet.");
    \n-
    852
    \n-
    853 // allocate memory for variables, set parameters
    \n-
    854 const int nev = 2; // Number of eigenvalues to compute
    \n-
    855 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at each iteration (0 == auto)
    \n-
    856 const Real tol = epsilon; // Stopping tolerance (relative accuracy of Ritz values) (0 == machine precision)
    \n-
    857 const int maxit = nIterationsMax_*nev; // Maximum number of Arnoldi update iterations allowed (0 == 100*nev)
    \n-
    858 Real* ev = new Real[nev]; // Computed eigenvalues of A^T*A
    \n-
    859 const bool ivec = true; // Flag deciding if eigenvectors shall be determined
    \n-
    860 int nconv; // Number of converged eigenvalues
    \n-
    861
    \n-
    862 // define what we need: eigenvalues from both ends of the spectrum
    \n-
    863 char which[] = "BE";
    \n-
    864 ARSymStdEig<Real,WrappedMatrix>
    \n-
    865 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);
    \n-
    866
    \n-
    867 // set ARPACK verbosity mode if requested
    \n-
    868 if (verbosity_level_ > 3) dprob.Trace();
    \n-
    869
    \n-
    870 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues
    \n-
    871 nconv = dprob.Eigenvalues(ev,ivec);
    \n-
    872
    \n-
    873 // obtain approximated largest and smallest eigenvalue of A^T*A
    \n-
    874 const Real& lambda_max = ev[nev-1];
    \n-
    875 const Real& lambda_min = ev[0];
    \n-
    876
    \n-
    877 // obtain associated approximated eigenvectors of A^T*A
    \n-
    878 Real* x_max_raw = dprob.RawEigenvector(nev-1);
    \n-
    879 Real* x_min_raw = dprob.RawEigenvector(0);
    \n-
    880
    \n-
    881 // obtain number of Arnoldi update iterations actually taken
    \n-
    882 nIterations_ = dprob.GetIter();
    \n-
    883
    \n-
    884 // compute each residual norm
    \n-
    885 Real* AtAx_max_raw = new Real[ncols];
    \n-
    886 Real* AtAx_min_raw = new Real[ncols];
    \n-
    887 A.multMtMv(x_max_raw,AtAx_max_raw);
    \n-
    888 A.multMtMv(x_min_raw,AtAx_min_raw);
    \n-
    889 Real r_max_norm = 0.0;
    \n-
    890 Real r_min_norm = 0.0;
    \n-
    891 for (int i = 0; i < ncols; ++i)
    \n-
    892 {
    \n-
    893 r_max_norm += std::pow(AtAx_max_raw[i] - lambda_max * x_max_raw[i],2);
    \n-
    894 r_min_norm += std::pow(AtAx_min_raw[i] - lambda_min * x_min_raw[i],2);
    \n-
    895 }
    \n-
    896 r_max_norm = std::sqrt(r_max_norm);
    \n-
    897 r_min_norm = std::sqrt(r_min_norm);
    \n-
    898
    \n-
    899 // calculate largest and smallest singular value of A
    \n-
    900 const Real sigma_max = std::sqrt(lambda_max);
    \n-
    901 const Real sigma_min = std::sqrt(lambda_min);
    \n-
    902
    \n-
    903 // obtain approximated spectral condition number of A
    \n-
    904 cond_2 = sigma_max / sigma_min;
    \n-
    905
    \n-
    906 // print verbosity information
    \n-
    907 if (verbosity_level_ > 0)
    \n-
    908 {
    \n-
    909 if (verbosity_level_ > 1)
    \n-
    910 {
    \n-
    911 // print some information about the problem
    \n-
    912 std::cout << blank_ << "Obtained singular values of A by sol"
    \n-
    913 << "ving (A^T*A)*x = \u03c3\u00b2*x using the ARPACK++ "
    \n-
    914 << "class ARSymStdEig:" << std::endl;
    \n-
    915 std::cout << blank_ << " converged eigenvalues of A^T*A: "
    \n-
    916 << nconv << " / " << nev << std::endl;
    \n-
    917 std::cout << blank_ << " largest eigenvalue of A^T*A: "
    \n-
    918 << lambda_max << std::endl;
    \n-
    919 std::cout << blank_ << " smallest eigenvalue of A^T*A: "
    \n-
    920 << lambda_min << std::endl;
    \n-
    921 std::cout << blank_ << " => largest singular value of A: "
    \n-
    922 << sigma_max << std::endl;
    \n-
    923 std::cout << blank_ << " => smallest singular value of A: "
    \n-
    924 << sigma_min << std::endl;
    \n-
    925 }
    \n-
    926 std::cout << blank_ << "Result ("
    \n-
    927 << "#iterations = " << nIterations_ << ", "
    \n-
    928 << "\u2551residual\u2551_2 = {" << r_max_norm << ","
    \n-
    929 << r_min_norm << "}, " << "\u03c3 = {"
    \n-
    930 << sigma_max << "," << sigma_min
    \n-
    931 << "}): cond_2 = " << cond_2 << std::endl;
    \n-
    932 }
    \n-
    933
    \n-
    934 // free dynamically allocated memory
    \n-
    935 delete[] AtAx_min_raw;
    \n-
    936 delete[] AtAx_max_raw;
    \n-
    937 delete[] ev;
    \n-
    938 }
    \n-
    \n-
    939
    \n-
    \n-
    944 inline unsigned int getIterationCount () const
    \n-
    945 {
    \n-
    946 if (nIterations_ == 0)
    \n-
    947 DUNE_THROW(Dune::ISTLError,"No algorithm applied, yet.");
    \n-
    948
    \n-
    949 return nIterations_;
    \n-
    950 }
    \n-
    \n-
    951
    \n-
    952 protected:
    \n-
    953 // parameters related to iterative eigenvalue algorithms
    \n-\n-
    955 const unsigned int nIterationsMax_;
    \n-
    956
    \n-
    957 // verbosity setting
    \n-
    958 const unsigned int verbosity_level_;
    \n-
    959
    \n-
    960 // memory for storing temporary variables (mutable as they shall
    \n-
    961 // just be effectless auxiliary variables of the const apply*(...)
    \n-
    962 // methods)
    \n-
    963 mutable unsigned int nIterations_;
    \n-
    964
    \n-
    965 // constants for printing verbosity information
    \n-
    966 const std::string title_;
    \n-
    967 const std::string blank_;
    \n-
    968 };
    \n-
    \n-
    969
    \n-
    972} // namespace Dune
    \n-
    973
    \n-
    974#endif // HAVE_ARPACKPP
    \n-
    975
    \n-
    976#endif // DUNE_ISTL_EIGENVALUE_ARPACKPP_HH
    \n-
    Some generic functions for pretty printing vectors and matrices.
    \n-
    Helper functions for determining the vector/matrix block level.
    \n-\n-
    This file implements a vector space as a tensor product of a given vector space. The number of compon...
    \n-
    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
    \n+
    524
    \n+
    525 template<typename T, typename A>
    \n+
    \n+
    526 struct IsMatrix<BCRSMatrix<T,A> >
    \n+
    527 {
    \n+
    528 enum {
    \n+
    532 value = true
    \n+
    533 };
    \n+
    534 };
    \n+
    \n+
    535
    \n+
    536 template<typename T>
    \n+
    \n+\n+
    538 {
    \n+
    \n+
    539 bool operator()(const T* l, const T* r)
    \n+
    540 {
    \n+
    541 return *l < *r;
    \n+
    542 }
    \n+
    \n+
    543 };
    \n+
    \n+
    544
    \n+
    545}
    \n+
    546#endif
    \n+\n+
    This file implements a quadratic matrix of fixed size which is a multiple of the identity.
    \n+
    Col col
    Definition matrixmatrix.hh:351
    \n+
    Matrix & mat
    Definition matrixmatrix.hh:347
    \n+
    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
    \n
    Definition allocator.hh:11
    \n+
    void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)
    Definition matrixutils.hh:154
    \n+
    Definition matrixutils.hh:211
    \n+
    static auto coldim(const M &A)
    Definition matrixutils.hh:219
    \n+
    static auto rowdim(const M &A)
    Definition matrixutils.hh:214
    \n
    A sparse block matrix with compressed row storage.
    Definition bcrsmatrix.hh:466
    \n-
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bcrsmatrix.hh:488
    \n-
    A vector of blocks with memory management.
    Definition bvector.hh:392
    \n-
    typename Imp::BlockTraits< B >::field_type field_type
    export the type representing the field
    Definition bvector.hh:398
    \n-
    A::size_type size_type
    The type for the index access.
    Definition bvector.hh:407
    \n-
    Wrapper to use a range of ARPACK++ eigenvalue solvers.
    Definition arpackpp.hh:245
    \n-
    const unsigned int verbosity_level_
    Definition arpackpp.hh:958
    \n-
    unsigned int getIterationCount() const
    Return the number of iterations in last application of an algorithm.
    Definition arpackpp.hh:944
    \n-
    const std::string title_
    Definition arpackpp.hh:966
    \n-
    BlockVector::field_type Real
    Definition arpackpp.hh:247
    \n-
    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
    \n-
    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
    \n-
    const BCRSMatrix & m_
    Definition arpackpp.hh:954
    \n-
    const unsigned int nIterationsMax_
    Definition arpackpp.hh:955
    \n-
    const std::string blank_
    Definition arpackpp.hh:967
    \n-
    ArPackPlusPlus_Algorithms(const BCRSMatrix &m, const unsigned int nIterationsMax=100000, const unsigned int verbosity_level=0)
    Construct from required parameters.
    Definition arpackpp.hh:268
    \n-
    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
    \n-
    unsigned int nIterations_
    Definition arpackpp.hh:963
    \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...
    Definition arpackpp.hh:721
    \n-
    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
    \n-
    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
    \n+
    A::size_type size_type
    The type for the index access and the size.
    Definition bcrsmatrix.hh:497
    \n+
    row_type::ConstIterator ConstColIterator
    Const iterator to the entries of a row.
    Definition bcrsmatrix.hh:737
    \n+
    B block_type
    export the type representing the components
    Definition bcrsmatrix.hh:491
    \n+
    Iterator access to matrix rows
    Definition bcrsmatrix.hh:575
    \n+
    A Matrix class to support different block types.
    Definition multitypeblockmatrix.hh:46
    \n
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n+
    ConstIterator class for sequential access.
    Definition matrix.hh:404
    \n+
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    A::size_type size_type
    Type for indices and sizes.
    Definition matrix.hh:577
    \n+
    RowIterator end()
    Get iterator to one beyond last row.
    Definition matrix.hh:616
    \n+
    RowIterator begin()
    Get iterator to first row.
    Definition matrix.hh:610
    \n+
    row_type::const_iterator ConstColIterator
    Const iterator for the entries of each row.
    Definition matrix.hh:589
    \n+
    T block_type
    Export the type representing the components.
    Definition matrix.hh:568
    \n+
    Definition matrixutils.hh:27
    \n+
    Check whether the a matrix has diagonal values on blocklevel recursion levels.
    Definition matrixutils.hh:48
    \n+
    static void check(const Matrix &mat)
    Check whether the a matrix has diagonal values on blocklevel recursion levels.
    Definition matrixutils.hh:53
    \n+
    static void check(const Matrix &mat)
    Definition matrixutils.hh:75
    \n+
    static void check(const Matrix &)
    Check whether the a matrix has diagonal values on blocklevel recursion levels.
    Definition matrixutils.hh:99
    \n+
    MultiTypeBlockMatrix< T1, Args... > Matrix
    Definition matrixutils.hh:93
    \n+
    static size_type rowdim(const Matrix< B, TA > &A, size_type i)
    Definition matrixutils.hh:232
    \n+
    static size_type coldim(const Matrix< B, TA > &A)
    Definition matrixutils.hh:250
    \n+
    static size_type rowdim(const Matrix< B, TA > &A)
    Definition matrixutils.hh:242
    \n+
    typename Matrix< B, TA >::size_type size_type
    Definition matrixutils.hh:230
    \n+
    static size_type coldim(const Matrix< B, TA > &A, size_type c)
    Definition matrixutils.hh:237
    \n+
    typename Matrix< B, TA >::block_type block_type
    Definition matrixutils.hh:229
    \n+
    BCRSMatrix< B, TA > Matrix
    Definition matrixutils.hh:263
    \n+
    static size_type coldim(const Matrix &A)
    Definition matrixutils.hh:311
    \n+
    Matrix::block_type block_type
    Definition matrixutils.hh:264
    \n+
    static size_type coldim(const Matrix &A, size_type c)
    Definition matrixutils.hh:276
    \n+
    Matrix::size_type size_type
    Definition matrixutils.hh:265
    \n+
    static size_type rowdim(const Matrix &A, size_type i)
    Definition matrixutils.hh:267
    \n+
    static size_type rowdim(const Matrix &A)
    Definition matrixutils.hh:304
    \n+
    static size_type coldim(const Matrix &A)
    Definition matrixutils.hh:359
    \n+
    static size_type rowdim(const Matrix &, size_type)
    Definition matrixutils.hh:345
    \n+
    static size_type rowdim(const Matrix &A)
    Definition matrixutils.hh:355
    \n+
    Matrix::size_type size_type
    Definition matrixutils.hh:343
    \n+
    BCRSMatrix< FieldMatrix< B, n, m >,TA > Matrix
    Definition matrixutils.hh:342
    \n+
    static size_type coldim(const Matrix &, size_type)
    Definition matrixutils.hh:350
    \n+
    static size_type rowdim(const Matrix &, size_type)
    Definition matrixutils.hh:370
    \n+
    static size_type coldim(const Matrix &)
    Definition matrixutils.hh:385
    \n+
    Matrix::size_type size_type
    Definition matrixutils.hh:368
    \n+
    FieldMatrix< K, n, m > Matrix
    Definition matrixutils.hh:367
    \n+
    static size_type coldim(const Matrix &, size_type)
    Definition matrixutils.hh:375
    \n+
    static size_type rowdim(const Matrix &)
    Definition matrixutils.hh:380
    \n+
    static size_type coldim(const MatrixType &A)
    Definition matrixutils.hh:412
    \n+
    static size_type rowdim(const MatrixType &A)
    Definition matrixutils.hh:407
    \n+
    static size_type rowdim(const MatrixType &, size_type)
    Definition matrixutils.hh:397
    \n+
    MatrixType::size_type size_type
    Definition matrixutils.hh:395
    \n+
    static size_type coldim(const MatrixType &, size_type)
    Definition matrixutils.hh:402
    \n+
    Dune::DynamicMatrix< T > MatrixType
    Definition matrixutils.hh:394
    \n+
    static size_type coldim(const ThisMatrix &A)
    Definition matrixutils.hh:439
    \n+
    static size_type rowdim(const ThisMatrix &A)
    Definition matrixutils.hh:434
    \n+
    Matrix< FieldMatrix< K, n, m >, TA > ThisMatrix
    Definition matrixutils.hh:421
    \n+
    static size_type coldim(const ThisMatrix &, size_type)
    Definition matrixutils.hh:429
    \n+
    static size_type rowdim(const ThisMatrix &, size_type)
    Definition matrixutils.hh:424
    \n+
    ThisMatrix::size_type size_type
    Definition matrixutils.hh:422
    \n+
    static size_type coldim(const Matrix &, size_type)
    Definition matrixutils.hh:456
    \n+
    Matrix::size_type size_type
    Definition matrixutils.hh:449
    \n+
    static size_type coldim(const Matrix &)
    Definition matrixutils.hh:466
    \n+
    static size_type rowdim(const Matrix &)
    Definition matrixutils.hh:461
    \n+
    DiagonalMatrix< K, n > Matrix
    Definition matrixutils.hh:448
    \n+
    static size_type rowdim(const Matrix &, size_type)
    Definition matrixutils.hh:451
    \n+
    static size_type coldim(const Matrix &)
    Definition matrixutils.hh:493
    \n+
    static size_type rowdim(const Matrix &, size_type)
    Definition matrixutils.hh:478
    \n+
    static size_type coldim(const Matrix &, size_type)
    Definition matrixutils.hh:483
    \n+
    Matrix::size_type size_type
    Definition matrixutils.hh:476
    \n+
    ScaledIdentityMatrix< K, n > Matrix
    Definition matrixutils.hh:475
    \n+
    static size_type rowdim(const Matrix &)
    Definition matrixutils.hh:488
    \n+
    Test whether a type is an ISTL Matrix.
    Definition matrixutils.hh:504
    \n+
    @ value
    True if T is an ISTL matrix.
    Definition matrixutils.hh:509
    \n+
    Definition matrixutils.hh:538
    \n+
    bool operator()(const T *l, const T *r)
    Definition matrixutils.hh:539
    \n+
    A multiple of the identity matrix of static size.
    Definition scaledidmatrix.hh:30
    \n+
    std::size_t size_type
    The type used for the index access and size operations.
    Definition scaledidmatrix.hh:43
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,954 +1,782 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n- * _\be_\bi_\bg_\be_\bn_\bv_\ba_\bl_\bu_\be\n-arpackpp.hh\n+matrixutils.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n 3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n 4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_EIGENVALUE_ARPACKPP_HH\n-6#define DUNE_ISTL_EIGENVALUE_ARPACKPP_HH\n+5#ifndef DUNE_ISTL_MATRIXUTILS_HH\n+6#define DUNE_ISTL_MATRIXUTILS_HH\n 7\n-8#if HAVE_ARPACKPP || defined DOXYGEN\n-9\n-10#include // provides std::abs, std::pow, std::sqrt\n-11\n-12#include // provides std::cout, std::endl\n-13#include // provides std::string\n-14\n-15#include // provides Dune::FieldVector\n-16#include // provides DUNE_THROW(...)\n-17\n-18#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh> // provides Dune::blockLevel\n-19#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh> // provides Dune::BlockVector\n-20#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh> // provides Dune::ISTLError\n-21#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bi_\bo_\b._\bh_\bh> // provides Dune::printvector(...)\n-22\n-23#ifdef Status\n-24#undef Status // prevent preprocessor from damaging the ARPACK++\n-25 // code when \"X11/Xlib.h\" is included (the latter\n-26 // defines Status as \"#define Status int\" and\n-27 // ARPACK++ provides a class with a method called\n-28 // Status)\n-29#endif\n-30#include \"arssym.h\" // provides ARSymStdEig\n-31\n-32namespace _\bD_\bu_\bn_\be\n-33{\n-34\n-39 namespace Impl {\n-55 template \n-56 class ArPackPlusPlus_BCRSMatrixWrapper\n-57 {\n-58 public:\n-60 typedef typename _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be Real;\n-61\n-62 public:\n-64 ArPackPlusPlus_BCRSMatrixWrapper (const BCRSMatrix& A)\n-65 : A_(A),\n-66 m_(A_.M() * mBlock), n_(A_.N() * nBlock)\n-67 {\n-68 // assert that BCRSMatrix type has blocklevel 2\n-69 static_assert\n-70 (blockLevel() == 2,\n-71 \"Only BCRSMatrices with blocklevel 2 are supported.\");\n-72\n-73 // allocate memory for auxiliary block vector objects\n-74 // which are compatible to matrix rows / columns\n-75 domainBlockVector.resize(A_.N());\n-76 rangeBlockVector.resize(A_.M());\n-77 }\n-78\n-80 inline void multMv (Real* v, Real* w)\n-81 {\n-82 // get vector v as an object of appropriate type\n-83 arrayToDomainBlockVector(v,domainBlockVector);\n-84\n-85 // perform matrix-vector product\n-86 A_.mv(domainBlockVector,rangeBlockVector);\n-87\n-88 // get vector w from object of appropriate type\n-89 rangeBlockVectorToArray(rangeBlockVector,w);\n-90 };\n-91\n-93 inline void multMtMv (Real* v, Real* w)\n-94 {\n-95 // get vector v as an object of appropriate type\n-96 arrayToDomainBlockVector(v,domainBlockVector);\n-97\n-98 // perform matrix-vector product\n-99 A_.mv(domainBlockVector,rangeBlockVector);\n-100 A_.mtv(rangeBlockVector,domainBlockVector);\n-101\n-102 // get vector w from object of appropriate type\n-103 domainBlockVectorToArray(domainBlockVector,w);\n-104 };\n-105\n-107 inline void multMMtv (Real* v, Real* w)\n-108 {\n-109 // get vector v as an object of appropriate type\n-110 arrayToRangeBlockVector(v,rangeBlockVector);\n-111\n-112 // perform matrix-vector product\n-113 A_.mtv(rangeBlockVector,domainBlockVector);\n-114 A_.mv(domainBlockVector,rangeBlockVector);\n-115\n-116 // get vector w from object of appropriate type\n-117 rangeBlockVectorToArray(rangeBlockVector,w);\n-118 };\n-119\n-121 inline int nrows () const { return m_; }\n-122\n-124 inline int ncols () const { return n_; }\n-125\n-126 protected:\n-127 // Number of rows and columns in each block of the matrix\n-128 constexpr static int mBlock = BCRSMatrix::block_type::rows;\n-129 constexpr static int nBlock = BCRSMatrix::block_type::cols;\n-130\n-131 // Type of vectors in the domain of the linear map associated with\n-132 // the matrix, i.e. block vectors compatible to matrix rows\n-133 constexpr static int dbvBlockSize = nBlock;\n-134 typedef Dune::FieldVector DomainBlockVectorBlock;\n-135 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bD_\bo_\bm_\ba_\bi_\bn_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\bB_\bl_\bo_\bc_\bk_\b> DomainBlockVector;\n-136\n-137 // Type of vectors in the range of the linear map associated with\n-138 // the matrix, i.e. block vectors compatible to matrix columns\n-139 constexpr static int rbvBlockSize = mBlock;\n-140 typedef Dune::FieldVector RangeBlockVectorBlock;\n-141 typedef _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b<_\bR_\ba_\bn_\bg_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\bB_\bl_\bo_\bc_\bk_\b> RangeBlockVector;\n-142\n-143 // Types for vector index access\n-144 typedef typename _\bD_\bo_\bm_\ba_\bi_\bn_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be dbv_size_type;\n-145 typedef typename _\bR_\ba_\bn_\bg_\be_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be rbv_size_type;\n-146 typedef typename DomainBlockVectorBlock::size_type dbvb_size_type;\n-147 typedef typename RangeBlockVectorBlock::size_type rbvb_size_type;\n-148\n-149 // Get vector v from a block vector object which is compatible to\n-150 // matrix rows\n-151 static inline void\n-152 domainBlockVectorToArray (const DomainBlockVector& dbv, Real* v)\n-153 {\n-154 for (dbv_size_type block = 0; block < dbv.N(); ++block)\n-155 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)\n-156 v[block*dbvBlockSize + iBlock] = dbv[block][iBlock];\n-157 }\n-158\n-159 // Get vector v from a block vector object which is compatible to\n-160 // matrix columns\n-161 static inline void\n-162 rangeBlockVectorToArray (const RangeBlockVector& rbv, Real* v)\n-163 {\n-164 for (rbv_size_type block = 0; block < rbv.N(); ++block)\n-165 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)\n-166 v[block*rbvBlockSize + iBlock] = rbv[block][iBlock];\n-167 }\n+8#include \n+9#include \n+10#include \n+11#include \n+12#include \n+13#include \n+14#include \n+15#include \n+16#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+17#include \"_\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n+18\n+19namespace _\bD_\bu_\bn_\be\n+20{\n+21\n+22#ifndef DOYXGEN\n+23 template\n+24 class BCRSMatrix;\n+25\n+26 template\n+_\b2_\b7 class _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx;\n+28\n+29 template\n+30 class _\bM_\ba_\bt_\br_\bi_\bx;\n+31#endif\n+32\n+46 template\n+_\b4_\b7 struct _\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt\n+48 {\n+_\b5_\b3 static void _\bc_\bh_\be_\bc_\bk([[maybe_unused]] const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt)\n+54 {\n+55#ifdef DUNE_ISTL_WITH_CHECKING\n+56 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Row;\n+57 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Entry;\n+58 for(Row row = _\bm_\ba_\bt.begin(); row!=_\bm_\ba_\bt.end(); ++row) {\n+59 Entry diagonal = row->find(row.index());\n+60 if(diagonal==row->end())\n+61 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Missing diagonal value in row \"<_\b:_\b:_\bc_\bh_\be_\bc_\bk(m);\n+66 }\n+67 }\n+68#endif\n+69 }\n+70 };\n+71\n+72 template\n+_\b7_\b3 struct _\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt<_\bM_\ba_\bt_\br_\bi_\bx,0,l>\n+74 {\n+_\b7_\b5 static void _\bc_\bh_\be_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& _\bm_\ba_\bt)\n+76 {\n+77 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br Row;\n+78 for(Row row = _\bm_\ba_\bt.begin(); row!=_\bm_\ba_\bt.end(); ++row) {\n+79 if(row->find(row.index())==row->end())\n+80 DUNE_THROW(_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br, \"Missing diagonal value in row \"<\n+87 class MultiTypeBlockMatrix;\n+88\n+89 template\n+_\b9_\b0 struct _\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt<_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx,\n+91 blocklevel,l>\n+92 {\n+_\b9_\b3 typedef _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx _\bM_\ba_\bt_\br_\bi_\bx;\n+94\n+_\b9_\b9 static void _\bc_\bh_\be_\bc_\bk(const _\bM_\ba_\bt_\br_\bi_\bx& /* mat */)\n+100 {\n+101#ifdef DUNE_ISTL_WITH_CHECKING\n+102 // TODO Implement check\n+103#endif\n+104 }\n+105 };\n+106\n+118 template\n+_\b1_\b1_\b9 inline auto _\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs(const M&,\n+120 [[maybe_unused]] typename std::enable_if_t::value>*\n+sfinae = nullptr)\n+121 {\n+122 return 1;\n+123 }\n+124\n+125 template\n+_\b1_\b2_\b6 inline auto _\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs(const M& matrix,\n+127 [[maybe_unused]] typename std::enable_if_t::value>*\n+sfinae = nullptr)\n+128 {\n+129 typename M::size_type nonZeros = 0;\n+130 for(auto&& row : matrix)\n+131 for(auto&& entry : row)\n+132 nonZeros += _\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs(entry);\n+133 return nonZeros;\n+134 }\n+135\n+136 /*\n+137 template\n+138 struct ProcessOnFieldsOfMatrix\n+139 */\n+140\n+142 namespace\n+143 {\n+144 struct CompPair {\n+145 template\n+146 bool operator()(const std::pair& p1, const std::pair& p2) const\n+147 {\n+148 return p1.first\n+_\b1_\b5_\b4 void _\bp_\br_\bi_\bn_\bt_\bG_\bl_\bo_\bb_\ba_\bl_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx(const M& _\bm_\ba_\bt, C& ooc, std::ostream& os)\n+155 {\n+156 typedef typename C::ParallelIndexSet::const_iterator IIter;\n+157 typedef typename C::OwnerSet OwnerSet;\n+158 typedef typename C::ParallelIndexSet::GlobalIndex GlobalIndex;\n+159\n+160 GlobalIndex gmax=0;\n+161\n+162 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();\n+163 idx!=eidx; ++idx)\n+164 gmax=std::max(gmax,idx->global());\n+165\n+166 gmax=ooc.communicator().max(gmax);\n+167 ooc.buildGlobalLookup();\n 168\n-169 public:\n-172 static inline void arrayToDomainBlockVector (const Real* v,\n-173 DomainBlockVector& dbv)\n-174 {\n-175 for (dbv_size_type block = 0; block < dbv.N(); ++block)\n-176 for (dbvb_size_type iBlock = 0; iBlock < dbvBlockSize; ++iBlock)\n-177 dbv[block][iBlock] = v[block*dbvBlockSize + iBlock];\n-178 }\n-179\n-182 static inline void arrayToRangeBlockVector (const Real* v,\n-183 RangeBlockVector& rbv)\n-184 {\n-185 for (rbv_size_type block = 0; block < rbv.N(); ++block)\n-186 for (rbvb_size_type iBlock = 0; iBlock < rbvBlockSize; ++iBlock)\n-187 rbv[block][iBlock] = v[block*rbvBlockSize + iBlock];\n-188 }\n-189\n-190 protected:\n-191 // The DUNE-ISTL BCRSMatrix\n-192 const BCRSMatrix& A_;\n-193\n-194 // Number of rows and columns in the matrix\n-195 const int m_, n_;\n-196\n-197 // Auxiliary block vector objects which are\n-198 // compatible to matrix rows / columns\n-199 mutable DomainBlockVector domainBlockVector;\n-200 mutable RangeBlockVector rangeBlockVector;\n-201 };\n-202 } // end namespace Impl\n-203\n-243 template \n-_\b2_\b4_\b4 class _\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n-245 {\n-246 public:\n-_\b2_\b4_\b7 typedef typename _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be _\bR_\be_\ba_\bl;\n-248\n-249 public:\n-_\b2_\b6_\b8 _\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs (const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& m,\n-269 const unsigned int nIterationsMax = 100000,\n-270 const unsigned int verbosity_level = 0)\n-271 : _\bm_\b_(m), _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_(nIterationsMax),\n-272 _\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_(verbosity_level),\n-273 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_(0),\n-274 _\bt_\bi_\bt_\bl_\be_\b_(\" ArPackPlusPlus_Algorithms: \"),\n-275 _\bb_\bl_\ba_\bn_\bk_\b_(_\bt_\bi_\bt_\bl_\be_\b_.length(),' ')\n-276 {}\n-277\n-_\b2_\b8_\b9 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\ba_\bx_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be (const _\bR_\be_\ba_\bl& epsilon,\n-290 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n-291 {\n-292 // print verbosity information\n-293 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-294 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of \"\n-295 << \"the dominant eigenvalue of a matrix which \"\n-296 << \"is assumed to be symmetric.\" << std::endl;\n-297\n-298 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n-299 // and to perform the product A*v (LU decomposition is not used)\n-300 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n-301 WrappedMatrix A(_\bm_\b_);\n-302\n-303 // get number of rows and columns in A\n-304 const int nrows = A.nrows();\n-305 const int ncols = A.ncols();\n-306\n-307 // assert that A is square\n-308 if (nrows != ncols)\n-309 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix is not square (\"\n-310 << nrows << \"x\" << ncols << \").\");\n-311\n-312 // allocate memory for variables, set parameters\n-313 const int nev = 1; // Number of eigenvalues to compute\n-314 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n-each iteration (0 == auto)\n-315 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n-values) (0 == machine precision)\n-316 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n-iterations allowed (0 == 100*nev)\n-317 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A\n-318 const bool ivec = true; // Flag deciding if eigenvectors shall be\n-determined\n-319 int nconv; // Number of converged eigenvalues\n+169 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();\n+170 idx!=eidx; ++idx) {\n+171 if(OwnerSet::contains(idx->local().attribute()))\n+172 {\n+173 typedef typename M::block_type Block;\n+174\n+175 std::set,CompPair> entries;\n+176\n+177 // sort rows\n+178 typedef typename M::ConstColIterator CIter;\n+179 for(CIter c=_\bm_\ba_\bt[idx->local()]._\bb_\be_\bg_\bi_\bn(), cend=_\bm_\ba_\bt[idx->local()]._\be_\bn_\bd();\n+180 c!=cend; ++c) {\n+181 const typename C::ParallelIndexSet::IndexPair* pair\n+182 =ooc.globalLookup().pair(c.index());\n+183 assert(pair);\n+184 entries.insert(std::make_pair(pair->global(), *c));\n+185 }\n+186\n+187 //wait until its the rows turn.\n+188 GlobalIndex rowidx = idx->global();\n+189 GlobalIndex cur=std::numeric_limits::max();\n+190 while(cur!=rowidx)\n+191 cur=ooc.communicator().min(rowidx);\n+192\n+193 // print rows\n+194 typedef typename std::set,CompPair>::iterator\n+SIter;\n+195 for(SIter s=entries.begin(), send=entries.end(); s!=send; ++s)\n+196 os<global()<<\" \"<first<<\" \"<second<::max();\n+205 while(cur!=ooc.communicator().min(cur)) ;\n+206 }\n+207\n+208 // Default implementation for scalar types\n+209 template\n+_\b2_\b1_\b0 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n+211 {\n+212 static_assert(IsNumber::value, \"MatrixDimension is not implemented for\n+this type!\");\n+213\n+_\b2_\b1_\b4 static auto _\br_\bo_\bw_\bd_\bi_\bm(const M& A)\n+215 {\n+216 return 1;\n+217 }\n+218\n+_\b2_\b1_\b9 static auto _\bc_\bo_\bl_\bd_\bi_\bm(const M& A)\n+220 {\n+221 return 1;\n+222 }\n+223 };\n+224\n+225 // Default implementation for scalar types\n+226 template\n+_\b2_\b2_\b7 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bM_\ba_\bt_\br_\bi_\bx >\n+228 {\n+_\b2_\b2_\b9 using _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be = typename _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+_\b2_\b3_\b0 using _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be = typename _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+231\n+_\b2_\b3_\b2 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>& A, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+233 {\n+234 return _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(A[i][0]);\n+235 }\n+236\n+_\b2_\b3_\b7 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>& A, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be c)\n+238 {\n+239 return _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(A[0][c]);\n+240 }\n+241\n+_\b2_\b4_\b2 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b>& A)\n+243 {\n+244 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nn=0;\n+245 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i& A)\n+251 {\n+252 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nn=0;\n+253 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i\n+_\b2_\b6_\b1 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n+262 {\n+_\b2_\b6_\b3 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bT_\bA_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b2_\b6_\b4 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be _\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be;\n+_\b2_\b6_\b5 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+266\n+_\b2_\b6_\b7 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& A, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i)\n+268 {\n+269 const B* row = A.r[i].getptr();\n+270 if(row)\n+271 return _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm(*row);\n+272 else\n+273 return 0;\n+274 }\n+275\n+_\b2_\b7_\b6 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& A, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be c)\n+277 {\n+278 // find an entry in column c\n+279 if (A.nnz_ > 0)\n+280 {\n+281 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be k=0; k_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(A.a[k]);\n+284 }\n+285 }\n+286 }\n+287 else\n+288 {\n+289 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(a[k]);\n+296 }\n+297 }\n+298 }\n+299\n+300 // not found\n+301 return 0;\n+302 }\n+303\n+_\b3_\b0_\b4 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& A){\n+305 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be nn=0;\n+306 for (_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be i=0; i coldims(A.M(),\n+319 std::numeric_limits::max());\n 320\n-321 // define what we need: eigenvalues with largest magnitude\n-322 char which[] = \"LM\";\n-323 ARSymStdEig\n-324 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);\n-325\n-326 // set ARPACK verbosity mode if requested\n-327 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n-328\n-329 // find eigenvalues and eigenvectors of A, obtain the eigenvalues\n-330 nconv = dprob.Eigenvalues(ev,ivec);\n-331\n-332 // obtain approximated dominant eigenvalue of A\n-333 lambda = ev[nev-1];\n-334\n-335 // obtain associated approximated eigenvector of A\n-336 _\bR_\be_\ba_\bl* x_raw = dprob.RawEigenvector(nev-1);\n-337 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);\n+321 for (ConstRowIterator row=A.begin(); row!=A.end(); ++row)\n+322 for (ConstColIterator _\bc_\bo_\bl=row->begin(); _\bc_\bo_\bl!=row->end(); ++_\bc_\bo_\bl)\n+323 // only compute blocksizes we don't already have\n+324 if (coldims[_\bc_\bo_\bl.index()]==std::numeric_limits::max())\n+325 coldims[_\bc_\bo_\bl.index()] = _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be_\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm(*_\bc_\bo_\bl);\n+326\n+327 _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be sum = 0;\n+328 for (typename std::vector::iterator it=coldims.begin();\n+329 it!=coldims.end(); ++it)\n+330 // skip rows for which no coldim could be determined\n+331 if ((*it)>=0)\n+332 sum += *it;\n+333\n+334 return sum;\n+335 }\n+336 };\n+337\n 338\n-339 // obtain number of Arnoldi update iterations actually taken\n-340 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n-341\n-342 // compute residual norm\n-343 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br r(x);\n-344 _\bR_\be_\ba_\bl* Ax_raw = new _\bR_\be_\ba_\bl[nrows];\n-345 A.multMv(x_raw,Ax_raw);\n-346 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);\n-347 r.axpy(-lambda,x);\n-348 const _\bR_\be_\ba_\bl r_norm = r.two_norm();\n+339 template\n+_\b3_\b4_\b0 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx ,TA> >\n+341 {\n+_\b3_\b4_\b2 typedef _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bB_\b,_\bn_\b,_\bm_\b> ,TA> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b3_\b4_\b3 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+344\n+_\b3_\b4_\b5 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*i*/)\n+346 {\n+347 return n;\n+348 }\n 349\n-350 // print verbosity information\n-351 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-352 {\n-353 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n-354 {\n-355 // print some information about the problem\n-356 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained eigenvalues of A by solving \"\n-357 << \"A*x = \u00ce\u00bb*x using the ARPACK++ class ARSym\"\n-358 << \"StdEig:\" << std::endl;\n-359 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A: \"\n-360 << nconv << \" / \" << nev << std::endl;\n-361 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" dominant eigenvalue of A: \"\n-362 << lambda << std::endl;\n-363 }\n-364 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n-365 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n-366 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n-367 << \"\u00ce\u00bb = \" << lambda << std::endl;\n-368 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n-369 {\n-370 // print approximated eigenvector via DUNE-ISTL I/O methods\n-371 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n-372 }\n+_\b3_\b5_\b0 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*c*/)\n+351 {\n+352 return m;\n+353 }\n+354\n+_\b3_\b5_\b5 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& A) {\n+356 return A.N()*n;\n+357 }\n+358\n+_\b3_\b5_\b9 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm (const _\bM_\ba_\bt_\br_\bi_\bx& A) {\n+360 return A.M()*m;\n+361 }\n+362 };\n+363\n+364 template\n+_\b3_\b6_\b5 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx >\n+366 {\n+_\b3_\b6_\b7 typedef _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b,_\bm_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b3_\b6_\b8 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+369\n+_\b3_\b7_\b0 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n+371 {\n+372 return 1;\n 373 }\n 374\n-375 // free dynamically allocated memory\n-376 delete[] Ax_raw;\n-377 delete[] ev;\n+_\b3_\b7_\b5 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n+376 {\n+377 return 1;\n 378 }\n 379\n-_\b3_\b9_\b1 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\bi_\bn_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be (const _\bR_\be_\ba_\bl& epsilon,\n-392 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& lambda) const\n+_\b3_\b8_\b0 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n+381 {\n+382 return n;\n+383 }\n+384\n+_\b3_\b8_\b5 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n+386 {\n+387 return m;\n+388 }\n+389 };\n+390\n+391 template \n+_\b3_\b9_\b2 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bD_\bu_\bn_\be::DynamicMatrix >\n 393 {\n-394 // print verbosity information\n-395 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-396 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of the \"\n-397 << \"least dominant eigenvalue of a matrix which \"\n-398 << \"is assumed to be symmetric.\" << std::endl;\n-399\n-400 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n-401 // and to perform the product A*v (LU decomposition is not used)\n-402 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n-403 WrappedMatrix A(_\bm_\b_);\n-404\n-405 // get number of rows and columns in A\n-406 const int nrows = A.nrows();\n-407 const int ncols = A.ncols();\n-408\n-409 // assert that A is square\n-410 if (nrows != ncols)\n-411 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix is not square (\"\n-412 << nrows << \"x\" << ncols << \").\");\n-413\n-414 // allocate memory for variables, set parameters\n-415 const int nev = 1; // Number of eigenvalues to compute\n-416 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n-each iteration (0 == auto)\n-417 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n-values) (0 == machine precision)\n-418 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n-iterations allowed (0 == 100*nev)\n-419 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A\n-420 const bool ivec = true; // Flag deciding if eigenvectors shall be\n-determined\n-421 int nconv; // Number of converged eigenvalues\n-422\n-423 // define what we need: eigenvalues with smallest magnitude\n-424 char which[] = \"SM\";\n-425 ARSymStdEig\n-426 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);\n-427\n-428 // set ARPACK verbosity mode if requested\n-429 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n-430\n-431 // find eigenvalues and eigenvectors of A, obtain the eigenvalues\n-432 nconv = dprob.Eigenvalues(ev,ivec);\n+_\b3_\b9_\b4 typedef Dune::DynamicMatrix _\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be;\n+_\b3_\b9_\b5 typedef typename MatrixType::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+396\n+_\b3_\b9_\b7 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n+398 {\n+399 return 1;\n+400 }\n+401\n+_\b4_\b0_\b2 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n+403 {\n+404 return 1;\n+405 }\n+406\n+_\b4_\b0_\b7 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be& A)\n+408 {\n+409 return A.N();\n+410 }\n+411\n+_\b4_\b1_\b2 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be& A)\n+413 {\n+414 return A.M();\n+415 }\n+416 };\n+417\n+418 template\n+_\b4_\b1_\b9 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bM_\ba_\bt_\br_\bi_\bx<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx, TA> >\n+420 {\n+_\b4_\b2_\b1 typedef _\bM_\ba_\bt_\br_\bi_\bx_\b<_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b,_\bm_\b>, TA> _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx;\n+_\b4_\b2_\b2 typedef typename _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+423\n+_\b4_\b2_\b4 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n+425 {\n+426 return n;\n+427 }\n+428\n+_\b4_\b2_\b9 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n+430 {\n+431 return m;\n+432 }\n 433\n-434 // obtain approximated least dominant eigenvalue of A\n-435 lambda = ev[nev-1];\n-436\n-437 // obtain associated approximated eigenvector of A\n-438 _\bR_\be_\ba_\bl* x_raw = dprob.RawEigenvector(nev-1);\n-439 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);\n-440\n-441 // obtain number of Arnoldi update iterations actually taken\n-442 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n-443\n-444 // compute residual norm\n-445 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br r(x);\n-446 _\bR_\be_\ba_\bl* Ax_raw = new _\bR_\be_\ba_\bl[nrows];\n-447 A.multMv(x_raw,Ax_raw);\n-448 WrappedMatrix::arrayToDomainBlockVector(Ax_raw,r);\n-449 r.axpy(-lambda,x);\n-450 const _\bR_\be_\ba_\bl r_norm = r.two_norm();\n-451\n-452 // print verbosity information\n-453 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-454 {\n-455 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n-456 {\n-457 // print some information about the problem\n-458 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained eigenvalues of A by solving \"\n-459 << \"A*x = \u00ce\u00bb*x using the ARPACK++ class ARSym\"\n-460 << \"StdEig:\" << std::endl;\n-461 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A: \"\n-462 << nconv << \" / \" << nev << std::endl;\n-463 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" least dominant eigenvalue of A: \"\n-464 << lambda << std::endl;\n-465 }\n-466 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n-467 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n-468 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n-469 << \"\u00ce\u00bb = \" << lambda << std::endl;\n-470 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n-471 {\n-472 // print approximated eigenvector via DUNE-ISTL I/O methods\n-473 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n-474 }\n-475 }\n-476\n-477 // free dynamically allocated memory\n-478 delete[] Ax_raw;\n-479 delete[] ev;\n-480 }\n-481\n-_\b4_\b9_\b3 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bC_\bo_\bn_\bd_\b2 (const _\bR_\be_\ba_\bl& epsilon, _\bR_\be_\ba_\bl& cond_2) const\n+_\b4_\b3_\b4 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx& A)\n+435 {\n+436 return A.N()*n;\n+437 }\n+438\n+_\b4_\b3_\b9 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx& A)\n+440 {\n+441 return A.M()*m;\n+442 }\n+443 };\n+444\n+445 template\n+_\b4_\b4_\b6 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn >\n+447 {\n+_\b4_\b4_\b8 typedef DiagonalMatrix _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b4_\b4_\b9 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+450\n+_\b4_\b5_\b1 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n+452 {\n+453 return 1;\n+454 }\n+455\n+_\b4_\b5_\b6 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n+457 {\n+458 return 1;\n+459 }\n+460\n+_\b4_\b6_\b1 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n+462 {\n+463 return n;\n+464 }\n+465\n+_\b4_\b6_\b6 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n+467 {\n+468 return n;\n+469 }\n+470 };\n+471\n+472 template\n+_\b4_\b7_\b3 struct _\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn<_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx >\n+474 {\n+_\b4_\b7_\b5 typedef _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\bK_\b,_\bn_\b> _\bM_\ba_\bt_\br_\bi_\bx;\n+_\b4_\b7_\b6 typedef typename _\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n+477\n+_\b4_\b7_\b8 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n+479 {\n+480 return 1;\n+481 }\n+482\n+_\b4_\b8_\b3 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/, _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be /*r*/)\n+484 {\n+485 return 1;\n+486 }\n+487\n+_\b4_\b8_\b8 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\br_\bo_\bw_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n+489 {\n+490 return n;\n+491 }\n+492\n+_\b4_\b9_\b3 static _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be _\bc_\bo_\bl_\bd_\bi_\bm(const _\bM_\ba_\bt_\br_\bi_\bx& /*A*/)\n 494 {\n-495 // print verbosity information\n-496 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-497 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of the \"\n-498 << \"spectral condition number of a matrix which \"\n-499 << \"is assumed to be symmetric.\" << std::endl;\n-500\n-501 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n-502 // and to perform the product A*v (LU decomposition is not used)\n-503 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n-504 WrappedMatrix A(_\bm_\b_);\n-505\n-506 // get number of rows and columns in A\n-507 const int nrows = A.nrows();\n-508 const int ncols = A.ncols();\n-509\n-510 // assert that A is square\n-511 if (nrows != ncols)\n-512 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix is not square (\"\n-513 << nrows << \"x\" << ncols << \").\");\n-514\n-515 // allocate memory for variables, set parameters\n-516 const int nev = 2; // Number of eigenvalues to compute\n-517 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n-each iteration (0 == auto)\n-518 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n-values) (0 == machine precision)\n-519 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n-iterations allowed (0 == 100*nev)\n-520 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A\n-521 const bool ivec = true; // Flag deciding if eigenvectors shall be\n-determined\n-522 int nconv; // Number of converged eigenvalues\n+495 return n;\n+496 }\n+497 };\n+498\n+502 template\n+_\b5_\b0_\b3 struct _\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx\n+504 {\n+505 enum {\n+509 _\bv_\ba_\bl_\bu_\be = false\n+_\b5_\b1_\b0 };\n+511 };\n+512\n+513 template\n+_\b5_\b1_\b4 struct _\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx >\n+515 {\n+516 enum {\n+520 _\bv_\ba_\bl_\bu_\be = true\n+_\b5_\b2_\b1 };\n+522 };\n 523\n-524 // define what we need: eigenvalues from both ends of the spectrum\n-525 char which[] = \"BE\";\n-526 ARSymStdEig\n-527 dprob(nrows, nev, &A, &WrappedMatrix::multMv, which, ncv, tol, maxit);\n-528\n-529 // set ARPACK verbosity mode if requested\n-530 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n-531\n-532 // find eigenvalues and eigenvectors of A, obtain the eigenvalues\n-533 nconv = dprob.Eigenvalues(ev,ivec);\n-534\n-535 // obtain approximated dominant and least dominant eigenvalue of A\n-536 const _\bR_\be_\ba_\bl& lambda_max = ev[nev-1];\n-537 const _\bR_\be_\ba_\bl& lambda_min = ev[0];\n-538\n-539 // obtain associated approximated eigenvectors of A\n-540 _\bR_\be_\ba_\bl* x_max_raw = dprob.RawEigenvector(nev-1);\n-541 _\bR_\be_\ba_\bl* x_min_raw = dprob.RawEigenvector(0);\n-542\n-543 // obtain approximated spectral condition number of A\n-544 cond_2 = std::abs(lambda_max / lambda_min);\n-545\n-546 // obtain number of Arnoldi update iterations actually taken\n-547 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n-548\n-549 // compute each residual norm\n-550 _\bR_\be_\ba_\bl* Ax_max_raw = new _\bR_\be_\ba_\bl[nrows];\n-551 _\bR_\be_\ba_\bl* Ax_min_raw = new _\bR_\be_\ba_\bl[nrows];\n-552 A.multMv(x_max_raw,Ax_max_raw);\n-553 A.multMv(x_min_raw,Ax_min_raw);\n-554 _\bR_\be_\ba_\bl r_max_norm = 0.0;\n-555 _\bR_\be_\ba_\bl r_min_norm = 0.0;\n-556 for (int i = 0; i < nrows; ++i)\n-557 {\n-558 r_max_norm += std::pow(Ax_max_raw[i] - lambda_max * x_max_raw[i],2);\n-559 r_min_norm += std::pow(Ax_min_raw[i] - lambda_min * x_min_raw[i],2);\n-560 }\n-561 r_max_norm = std::sqrt(r_max_norm);\n-562 r_min_norm = std::sqrt(r_min_norm);\n-563\n-564 // print verbosity information\n-565 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-566 {\n-567 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n-568 {\n-569 // print some information about the problem\n-570 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained eigenvalues of A by solving \"\n-571 << \"A*x = \u00ce\u00bb*x using the ARPACK++ class ARSym\"\n-572 << \"StdEig:\" << std::endl;\n-573 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A: \"\n-574 << nconv << \" / \" << nev << std::endl;\n-575 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" dominant eigenvalue of A: \"\n-576 << lambda_max << std::endl;\n-577 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" least dominant eigenvalue of A: \"\n-578 << lambda_min << std::endl;\n-579 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" spectral condition number of A: \"\n-580 << cond_2 << std::endl;\n-581 }\n-582 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n-583 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n-584 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = {\" << r_max_norm << \",\"\n-585 << r_min_norm << \"}, \" << \"\u00ce\u00bb = {\"\n-586 << lambda_max << \",\" << lambda_min\n-587 << \"}): cond_2 = \" << cond_2 << std::endl;\n-588 }\n-589\n-590 // free dynamically allocated memory\n-591 delete[] Ax_min_raw;\n-592 delete[] Ax_max_raw;\n-593 delete[] ev;\n-594 }\n-595\n-_\b6_\b0_\b9 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bM_\ba_\bx (const _\bR_\be_\ba_\bl& epsilon,\n-610 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& sigma) const\n-611 {\n-612 // print verbosity information\n-613 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-614 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of the \"\n-615 << \"largest singular value of a matrix which \"\n-616 << \"is assumed to be nonsymmetric.\" << std::endl;\n-617\n-618 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n-619 // and to perform the product A^T*A*v (LU decomposition is not used)\n-620 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n-621 WrappedMatrix A(_\bm_\b_);\n-622\n-623 // get number of rows and columns in A\n-624 const int nrows = A.nrows();\n-625 const int ncols = A.ncols();\n-626\n-627 // assert that A has more rows than columns (extend code later to the\n-opposite case!)\n-628 if (nrows < ncols)\n-629 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix has less rows than \"\n-630 << \"columns (\" << nrows << \"x\" << ncols << \").\"\n-631 << \" This case is not implemented, yet.\");\n-632\n-633 // allocate memory for variables, set parameters\n-634 const int nev = 1; // Number of eigenvalues to compute\n-635 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n-each iteration (0 == auto)\n-636 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n-values) (0 == machine precision)\n-637 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n-iterations allowed (0 == 100*nev)\n-638 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A^T*A\n-639 const bool ivec = true; // Flag deciding if eigenvectors shall be\n-determined\n-640 int nconv; // Number of converged eigenvalues\n-641\n-642 // define what we need: eigenvalues with largest algebraic value\n-643 char which[] = \"LA\";\n-644 ARSymStdEig\n-645 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);\n-646\n-647 // set ARPACK verbosity mode if requested\n-648 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n-649\n-650 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues\n-651 nconv = dprob.Eigenvalues(ev,ivec);\n-652\n-653 // obtain approximated largest eigenvalue of A^T*A\n-654 const _\bR_\be_\ba_\bl& lambda = ev[nev-1];\n-655\n-656 // obtain associated approximated eigenvector of A^T*A\n-657 _\bR_\be_\ba_\bl* x_raw = dprob.RawEigenvector(nev-1);\n-658 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);\n-659\n-660 // obtain number of Arnoldi update iterations actually taken\n-661 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n-662\n-663 // compute residual norm\n-664 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br r(x);\n-665 _\bR_\be_\ba_\bl* AtAx_raw = new _\bR_\be_\ba_\bl[ncols];\n-666 A.multMtMv(x_raw,AtAx_raw);\n-667 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);\n-668 r.axpy(-lambda,x);\n-669 const _\bR_\be_\ba_\bl r_norm = r.two_norm();\n-670\n-671 // calculate largest singular value of A (note that\n-672 // x is right-singular / left-singular vector of A)\n-673 sigma = std::sqrt(lambda);\n-674\n-675 // print verbosity information\n-676 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-677 {\n-678 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n-679 {\n-680 // print some information about the problem\n-681 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained singular values of A by sol\"\n-682 << \"ving (A^T*A)*x = \u00cf\u0083\u00c2\u00b2*x using the ARPACK++ \"\n-683 << \"class ARSymStdEig:\" << std::endl;\n-684 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A^T*A: \"\n-685 << nconv << \" / \" << nev << std::endl;\n-686 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" largest eigenvalue of A^T*A: \"\n-687 << lambda << std::endl;\n-688 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" => largest singular value of A: \"\n-689 << sigma << std::endl;\n-690 }\n-691 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n-692 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n-693 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n-694 << \"\u00cf\u0083 = \" << sigma << std::endl;\n-695 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n-696 {\n-697 // print approximated right-singular / left-singular vector\n-698 // via DUNE-ISTL I/O methods\n-699 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n-700 }\n-701 }\n-702\n-703 // free dynamically allocated memory\n-704 delete[] AtAx_raw;\n-705 delete[] ev;\n-706 }\n-707\n-_\b7_\b2_\b1 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bM_\bi_\bn (const _\bR_\be_\ba_\bl& epsilon,\n-722 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br& x, _\bR_\be_\ba_\bl& sigma) const\n-723 {\n-724 // print verbosity information\n-725 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-726 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of the \"\n-727 << \"smallest singular value of a matrix which \"\n-728 << \"is assumed to be nonsymmetric.\" << std::endl;\n-729\n-730 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n-731 // and to perform the product A^T*A*v (LU decomposition is not used)\n-732 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n-733 WrappedMatrix A(_\bm_\b_);\n-734\n-735 // get number of rows and columns in A\n-736 const int nrows = A.nrows();\n-737 const int ncols = A.ncols();\n-738\n-739 // assert that A has more rows than columns (extend code later to the\n-opposite case!)\n-740 if (nrows < ncols)\n-741 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix has less rows than \"\n-742 << \"columns (\" << nrows << \"x\" << ncols << \").\"\n-743 << \" This case is not implemented, yet.\");\n-744\n-745 // allocate memory for variables, set parameters\n-746 const int nev = 1; // Number of eigenvalues to compute\n-747 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n-each iteration (0 == auto)\n-748 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n-values) (0 == machine precision)\n-749 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n-iterations allowed (0 == 100*nev)\n-750 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A^T*A\n-751 const bool ivec = true; // Flag deciding if eigenvectors shall be\n-determined\n-752 int nconv; // Number of converged eigenvalues\n-753\n-754 // define what we need: eigenvalues with smallest algebraic value\n-755 char which[] = \"SA\";\n-756 ARSymStdEig\n-757 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);\n-758\n-759 // set ARPACK verbosity mode if requested\n-760 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n-761\n-762 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues\n-763 nconv = dprob.Eigenvalues(ev,ivec);\n-764\n-765 // obtain approximated smallest eigenvalue of A^T*A\n-766 const _\bR_\be_\ba_\bl& lambda = ev[nev-1];\n-767\n-768 // obtain associated approximated eigenvector of A^T*A\n-769 _\bR_\be_\ba_\bl* x_raw = dprob.RawEigenvector(nev-1);\n-770 WrappedMatrix::arrayToDomainBlockVector(x_raw,x);\n-771\n-772 // obtain number of Arnoldi update iterations actually taken\n-773 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n-774\n-775 // compute residual norm\n-776 _\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br r(x);\n-777 _\bR_\be_\ba_\bl* AtAx_raw = new _\bR_\be_\ba_\bl[ncols];\n-778 A.multMtMv(x_raw,AtAx_raw);\n-779 WrappedMatrix::arrayToDomainBlockVector(AtAx_raw,r);\n-780 r.axpy(-lambda,x);\n-781 const _\bR_\be_\ba_\bl r_norm = r.two_norm();\n-782\n-783 // calculate smallest singular value of A (note that\n-784 // x is right-singular / left-singular vector of A)\n-785 sigma = std::sqrt(lambda);\n-786\n-787 // print verbosity information\n-788 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-789 {\n-790 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n-791 {\n-792 // print some information about the problem\n-793 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained singular values of A by sol\"\n-794 << \"ving (A^T*A)*x = \u00cf\u0083\u00c2\u00b2*x using the ARPACK++ \"\n-795 << \"class ARSymStdEig:\" << std::endl;\n-796 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A^T*A: \"\n-797 << nconv << \" / \" << nev << std::endl;\n-798 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" smallest eigenvalue of A^T*A: \"\n-799 << lambda << std::endl;\n-800 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" => smallest singular value of A: \"\n-801 << sigma << std::endl;\n-802 }\n-803 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n-804 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n-805 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = \" << r_norm << \"): \"\n-806 << \"\u00cf\u0083 = \" << sigma << std::endl;\n-807 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 2)\n-808 {\n-809 // print approximated right-singular / left-singular vector\n-810 // via DUNE-ISTL I/O methods\n-811 _\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br(std::cout,x,_\bb_\bl_\ba_\bn_\bk_\b_+\"x\",_\bb_\bl_\ba_\bn_\bk_\b_+\"row\");\n-812 }\n-813 }\n-814\n-815 // free dynamically allocated memory\n-816 delete[] AtAx_raw;\n-817 delete[] ev;\n-818 }\n-819\n-_\b8_\b3_\b0 inline void _\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bC_\bo_\bn_\bd_\b2 (const _\bR_\be_\ba_\bl& epsilon, _\bR_\be_\ba_\bl& cond_2) const\n-831 {\n-832 // print verbosity information\n-833 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-834 std::cout << _\bt_\bi_\bt_\bl_\be_\b_ << \"Computing an approximation of the \"\n-835 << \"spectral condition number of a matrix which \"\n-836 << \"is assumed to be nonsymmetric.\" << std::endl;\n-837\n-838 // use type ArPackPlusPlus_BCRSMatrixWrapper to store matrix information\n-839 // and to perform the product A^T*A*v (LU decomposition is not used)\n-840 typedef Impl::ArPackPlusPlus_BCRSMatrixWrapper WrappedMatrix;\n-841 WrappedMatrix A(_\bm_\b_);\n-842\n-843 // get number of rows and columns in A\n-844 const int nrows = A.nrows();\n-845 const int ncols = A.ncols();\n-846\n-847 // assert that A has more rows than columns (extend code later to the\n-opposite case!)\n-848 if (nrows < ncols)\n-849 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"Matrix has less rows than \"\n-850 << \"columns (\" << nrows << \"x\" << ncols << \").\"\n-851 << \" This case is not implemented, yet.\");\n-852\n-853 // allocate memory for variables, set parameters\n-854 const int nev = 2; // Number of eigenvalues to compute\n-855 int ncv = std::min(20, nrows); // Number of Arnoldi vectors generated at\n-each iteration (0 == auto)\n-856 const _\bR_\be_\ba_\bl tol = epsilon; // Stopping tolerance (relative accuracy of Ritz\n-values) (0 == machine precision)\n-857 const int maxit = _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_*nev; // Maximum number of Arnoldi update\n-iterations allowed (0 == 100*nev)\n-858 _\bR_\be_\ba_\bl* ev = new _\bR_\be_\ba_\bl[nev]; // Computed eigenvalues of A^T*A\n-859 const bool ivec = true; // Flag deciding if eigenvectors shall be\n-determined\n-860 int nconv; // Number of converged eigenvalues\n-861\n-862 // define what we need: eigenvalues from both ends of the spectrum\n-863 char which[] = \"BE\";\n-864 ARSymStdEig\n-865 dprob(ncols, nev, &A, &WrappedMatrix::multMtMv, which, ncv, tol, maxit);\n-866\n-867 // set ARPACK verbosity mode if requested\n-868 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 3) dprob.Trace();\n-869\n-870 // find eigenvalues and eigenvectors of A^T*A, obtain the eigenvalues\n-871 nconv = dprob.Eigenvalues(ev,ivec);\n-872\n-873 // obtain approximated largest and smallest eigenvalue of A^T*A\n-874 const _\bR_\be_\ba_\bl& lambda_max = ev[nev-1];\n-875 const _\bR_\be_\ba_\bl& lambda_min = ev[0];\n-876\n-877 // obtain associated approximated eigenvectors of A^T*A\n-878 _\bR_\be_\ba_\bl* x_max_raw = dprob.RawEigenvector(nev-1);\n-879 _\bR_\be_\ba_\bl* x_min_raw = dprob.RawEigenvector(0);\n-880\n-881 // obtain number of Arnoldi update iterations actually taken\n-882 _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ = dprob.GetIter();\n-883\n-884 // compute each residual norm\n-885 _\bR_\be_\ba_\bl* AtAx_max_raw = new _\bR_\be_\ba_\bl[ncols];\n-886 _\bR_\be_\ba_\bl* AtAx_min_raw = new _\bR_\be_\ba_\bl[ncols];\n-887 A.multMtMv(x_max_raw,AtAx_max_raw);\n-888 A.multMtMv(x_min_raw,AtAx_min_raw);\n-889 _\bR_\be_\ba_\bl r_max_norm = 0.0;\n-890 _\bR_\be_\ba_\bl r_min_norm = 0.0;\n-891 for (int i = 0; i < ncols; ++i)\n-892 {\n-893 r_max_norm += std::pow(AtAx_max_raw[i] - lambda_max * x_max_raw[i],2);\n-894 r_min_norm += std::pow(AtAx_min_raw[i] - lambda_min * x_min_raw[i],2);\n-895 }\n-896 r_max_norm = std::sqrt(r_max_norm);\n-897 r_min_norm = std::sqrt(r_min_norm);\n-898\n-899 // calculate largest and smallest singular value of A\n-900 const _\bR_\be_\ba_\bl sigma_max = std::sqrt(lambda_max);\n-901 const _\bR_\be_\ba_\bl sigma_min = std::sqrt(lambda_min);\n-902\n-903 // obtain approximated spectral condition number of A\n-904 cond_2 = sigma_max / sigma_min;\n-905\n-906 // print verbosity information\n-907 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 0)\n-908 {\n-909 if (_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_ > 1)\n-910 {\n-911 // print some information about the problem\n-912 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Obtained singular values of A by sol\"\n-913 << \"ving (A^T*A)*x = \u00cf\u0083\u00c2\u00b2*x using the ARPACK++ \"\n-914 << \"class ARSymStdEig:\" << std::endl;\n-915 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" converged eigenvalues of A^T*A: \"\n-916 << nconv << \" / \" << nev << std::endl;\n-917 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" largest eigenvalue of A^T*A: \"\n-918 << lambda_max << std::endl;\n-919 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" smallest eigenvalue of A^T*A: \"\n-920 << lambda_min << std::endl;\n-921 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" => largest singular value of A: \"\n-922 << sigma_max << std::endl;\n-923 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \" => smallest singular value of A: \"\n-924 << sigma_min << std::endl;\n-925 }\n-926 std::cout << _\bb_\bl_\ba_\bn_\bk_\b_ << \"Result (\"\n-927 << \"#iterations = \" << _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ << \", \"\n-928 << \"\u00e2\u0095\u0091residual\u00e2\u0095\u0091_2 = {\" << r_max_norm << \",\"\n-929 << r_min_norm << \"}, \" << \"\u00cf\u0083 = {\"\n-930 << sigma_max << \",\" << sigma_min\n-931 << \"}): cond_2 = \" << cond_2 << std::endl;\n-932 }\n-933\n-934 // free dynamically allocated memory\n-935 delete[] AtAx_min_raw;\n-936 delete[] AtAx_max_raw;\n-937 delete[] ev;\n-938 }\n-939\n-_\b9_\b4_\b4 inline unsigned int _\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bC_\bo_\bu_\bn_\bt () const\n-945 {\n-946 if (_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_ == 0)\n-947 DUNE_THROW(_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br,\"No algorithm applied, yet.\");\n-948\n-949 return _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_;\n-950 }\n-951\n-952 protected:\n-953 // parameters related to iterative eigenvalue algorithms\n-_\b9_\b5_\b4 const _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx& _\bm_\b_;\n-_\b9_\b5_\b5 const unsigned int _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_;\n-956\n-957 // verbosity setting\n-_\b9_\b5_\b8 const unsigned int _\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_;\n-959\n-960 // memory for storing temporary variables (mutable as they shall\n-961 // just be effectless auxiliary variables of the const apply*(...)\n-962 // methods)\n-_\b9_\b6_\b3 mutable unsigned int _\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_;\n-964\n-965 // constants for printing verbosity information\n-_\b9_\b6_\b6 const std::string _\bt_\bi_\bt_\bl_\be_\b_;\n-_\b9_\b6_\b7 const std::string _\bb_\bl_\ba_\bn_\bk_\b_;\n-968 };\n-969\n-972} // namespace Dune\n-973\n-974#endif // HAVE_ARPACKPP\n-975\n-976#endif // DUNE_ISTL_EIGENVALUE_ARPACKPP_HH\n-_\bi_\bo_\b._\bh_\bh\n-Some generic functions for pretty printing vectors and matrices.\n-_\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b._\bh_\bh\n-Helper functions for determining the vector/matrix block level.\n+524\n+525 template\n+_\b5_\b2_\b6 struct _\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx<_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx >\n+527 {\n+528 enum {\n+532 _\bv_\ba_\bl_\bu_\be = true\n+_\b5_\b3_\b3 };\n+534 };\n+535\n+536 template\n+_\b5_\b3_\b7 struct _\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be\n+538 {\n+_\b5_\b3_\b9 bool _\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)(const T* l, const T* r)\n+540 {\n+541 return *l < *r;\n+542 }\n+543 };\n+544\n+545}\n+546#endif\n _\bi_\bs_\bt_\bl_\be_\bx_\bc_\be_\bp_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-_\bb_\bv_\be_\bc_\bt_\bo_\br_\b._\bh_\bh\n-This file implements a vector space as a tensor product of a given vector\n-space. The number of compon...\n-_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bv_\be_\bc_\bt_\bo_\br\n-void printvector(std::ostream &s, const V &v, std::string title, std::string\n-rowtext, int columns=1, int width=10, int precision=2)\n-Print an ISTL vector.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn io.hh:89\n+_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+This file implements a quadratic matrix of fixed size which is a multiple of\n+the identity.\n+_\bc_\bo_\bl\n+Col col\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+_\bm_\ba_\bt\n+Matrix & mat\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:347\n+_\bD_\bu_\bn_\be_\b:_\b:_\bc_\bo_\bu_\bn_\bt_\bN_\bo_\bn_\bZ_\be_\br_\bo_\bs\n+auto countNonZeros(const M &, typename std::enable_if_t< Dune::IsNumber< M >::\n+value > *sfinae=nullptr)\n+Get the number of nonzero fields in the matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:119\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n+_\bD_\bu_\bn_\be_\b:_\b:_\bp_\br_\bi_\bn_\bt_\bG_\bl_\bo_\bb_\ba_\bl_\bS_\bp_\ba_\br_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx\n+void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:154\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:211\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static auto coldim(const M &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:219\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static auto rowdim(const M &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:214\n _\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx\n A sparse block matrix with compressed row storage.\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:466\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< B >::field_type field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:488\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br\n-A vector of blocks with memory management.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:392\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bf_\bi_\be_\bl_\bd_\b__\bt_\by_\bp_\be\n-typename Imp::BlockTraits< B >::field_type field_type\n-export the type representing the field\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:398\n-_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bl_\bo_\bc_\bk_\bV_\be_\bc_\bt_\bo_\br_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n A::size_type size_type\n-The type for the index access.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bvector.hh:407\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n-Wrapper to use a range of ARPACK++ eigenvalue solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:245\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bv_\be_\br_\bb_\bo_\bs_\bi_\bt_\by_\b__\bl_\be_\bv_\be_\bl_\b_\n-const unsigned int verbosity_level_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:958\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bg_\be_\bt_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bC_\bo_\bu_\bn_\bt\n-unsigned int getIterationCount() const\n-Return the number of iterations in last application of an algorithm.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:944\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bt_\bi_\bt_\bl_\be_\b_\n-const std::string title_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:966\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bR_\be_\ba_\bl\n-BlockVector::field_type Real\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:247\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\ba_\bx_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be\n-void computeSymMaxMagnitude(const Real &epsilon, BlockVector &x, Real &lambda)\n-const\n-Assume the matrix to be square, symmetric and perform IRLM to compute an\n-approximation lambda of its ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:289\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bM_\bi_\bn_\bM_\ba_\bg_\bn_\bi_\bt_\bu_\bd_\be\n-void computeSymMinMagnitude(const Real &epsilon, BlockVector &x, Real &lambda)\n-const\n-Assume the matrix to be square, symmetric and perform IRLM to compute an\n-approximation lambda of its ...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:391\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bm_\b_\n-const BCRSMatrix & m_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:954\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\bM_\ba_\bx_\b_\n-const unsigned int nIterationsMax_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:955\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bb_\bl_\ba_\bn_\bk_\b_\n-const std::string blank_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:967\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs\n-ArPackPlusPlus_Algorithms(const BCRSMatrix &m, const unsigned int\n-nIterationsMax=100000, const unsigned int verbosity_level=0)\n-Construct from required parameters.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:268\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bS_\by_\bm_\bC_\bo_\bn_\bd_\b2\n-void computeSymCond2(const Real &epsilon, Real &cond_2) const\n-Assume the matrix to be square, symmetric and perform IRLM to compute an\n-approximation of its spectra...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:493\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bn_\bI_\bt_\be_\br_\ba_\bt_\bi_\bo_\bn_\bs_\b_\n-unsigned int nIterations_\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:963\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bM_\bi_\bn\n-void computeNonSymMin(const Real &epsilon, BlockVector &x, Real &sigma) const\n-Assume the matrix to be nonsymmetric and perform IRLM to compute an\n-approximation sigma of its smalle...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:721\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bC_\bo_\bn_\bd_\b2\n-void computeNonSymCond2(const Real &epsilon, Real &cond_2) const\n-Assume the matrix to be nonsymmetric and perform IRLM to compute an\n-approximation of its spectral con...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:830\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\br_\bP_\ba_\bc_\bk_\bP_\bl_\bu_\bs_\bP_\bl_\bu_\bs_\b__\bA_\bl_\bg_\bo_\br_\bi_\bt_\bh_\bm_\bs_\b:_\b:_\bc_\bo_\bm_\bp_\bu_\bt_\be_\bN_\bo_\bn_\bS_\by_\bm_\bM_\ba_\bx\n-void computeNonSymMax(const Real &epsilon, BlockVector &x, Real &sigma) const\n-Assume the matrix to be nonsymmetric and perform IRLM to compute an\n-approximation sigma of its larges...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn arpackpp.hh:609\n+The type for the index access and the size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:497\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::ConstIterator ConstColIterator\n+Const iterator to the entries of a row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:737\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+B block_type\n+export the type representing the components\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:491\n+_\bD_\bu_\bn_\be_\b:_\b:_\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bR_\be_\ba_\bl_\bR_\bo_\bw_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+Iterator access to matrix rows\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn bcrsmatrix.hh:575\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx\n+A Matrix class to support different block types.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn multitypeblockmatrix.hh:46\n _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n derive error class from the base class in common\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bI_\bm_\bp_\b:_\b:_\bD_\be_\bn_\bs_\be_\bM_\ba_\bt_\br_\bi_\bx_\bB_\ba_\bs_\be_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+ConstIterator class for sequential access.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:404\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+A generic dynamic dense matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+A::size_type size_type\n+Type for indices and sizes.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:577\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\be_\bn_\bd\n+RowIterator end()\n+Get iterator to one beyond last row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:616\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\be_\bg_\bi_\bn\n+RowIterator begin()\n+Get iterator to first row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:610\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bC_\bo_\bn_\bs_\bt_\bC_\bo_\bl_\bI_\bt_\be_\br_\ba_\bt_\bo_\br\n+row_type::const_iterator ConstColIterator\n+Const iterator for the entries of each row.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:589\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+T block_type\n+Export the type representing the components.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:568\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:27\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt\n+Check whether the a matrix has diagonal values on blocklevel recursion levels.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:48\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b:_\b:_\bc_\bh_\be_\bc_\bk\n+static void check(const Matrix &mat)\n+Check whether the a matrix has diagonal values on blocklevel recursion levels.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:53\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b,_\b _\b0_\b,_\b _\bl_\b _\b>_\b:_\b:_\bc_\bh_\be_\bc_\bk\n+static void check(const Matrix &mat)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b,_\b _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b,\n+_\bl_\b _\b>_\b:_\b:_\bc_\bh_\be_\bc_\bk\n+static void check(const Matrix &)\n+Check whether the a matrix has diagonal values on blocklevel recursion levels.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:99\n+_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bh_\be_\bc_\bk_\bI_\bf_\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bP_\br_\be_\bs_\be_\bn_\bt_\b<_\b _\bM_\bu_\bl_\bt_\bi_\bT_\by_\bp_\be_\bB_\bl_\bo_\bc_\bk_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b1_\b,_\b _\bA_\br_\bg_\bs_\b._\b._\b._\b _\b>_\b,_\b _\bb_\bl_\bo_\bc_\bk_\bl_\be_\bv_\be_\bl_\b,\n+_\bl_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+MultiTypeBlockMatrix< T1, Args... > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:93\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix< B, TA > &A, size_type i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:232\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix< B, TA > &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:250\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix< B, TA > &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:242\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+typename Matrix< B, TA >::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:230\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix< B, TA > &A, size_type c)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:237\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+typename Matrix< B, TA >::block_type block_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:229\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix< B, TA > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:263\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:311\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bb_\bl_\bo_\bc_\bk_\b__\bt_\by_\bp_\be\n+Matrix::block_type block_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:264\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix &A, size_type c)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:276\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:265\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix &A, size_type i)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:267\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:304\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:359\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:345\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:355\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:343\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+BCRSMatrix< FieldMatrix< B, n, m >,TA > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:342\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bB_\bC_\bR_\bS_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bB_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:350\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:370\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:385\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:368\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+FieldMatrix< K, n, m > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:367\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:375\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:380\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const MatrixType &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:412\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const MatrixType &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:407\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const MatrixType &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:397\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+MatrixType::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:395\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const MatrixType &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:402\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bu_\bn_\be_\b:_\b:_\bD_\by_\bn_\ba_\bm_\bi_\bc_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bT_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bT_\by_\bp_\be\n+Dune::DynamicMatrix< T > MatrixType\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:394\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const ThisMatrix &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:439\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const ThisMatrix &A)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:434\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bT_\bh_\bi_\bs_\bM_\ba_\bt_\br_\bi_\bx\n+Matrix< FieldMatrix< K, n, m >, TA > ThisMatrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:421\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const ThisMatrix &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:429\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const ThisMatrix &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:424\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bF_\bi_\be_\bl_\bd_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b,_\b _\bm_\b _\b>_\b,_\b _\bT_\bA_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+ThisMatrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:422\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:456\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:449\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:466\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:461\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+DiagonalMatrix< K, n > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:448\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bD_\bi_\ba_\bg_\bo_\bn_\ba_\bl_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:451\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:493\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:478\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bc_\bo_\bl_\bd_\bi_\bm\n+static size_type coldim(const Matrix &, size_type)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:483\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+Matrix::size_type size_type\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:476\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+ScaledIdentityMatrix< K, n > Matrix\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:475\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bD_\bi_\bm_\be_\bn_\bs_\bi_\bo_\bn_\b<_\b _\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b<_\b _\bK_\b,_\b _\bn_\b _\b>_\b _\b>_\b:_\b:_\br_\bo_\bw_\bd_\bi_\bm\n+static size_type rowdim(const Matrix &)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:488\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx\n+Test whether a type is an ISTL Matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:504\n+_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bs_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bv_\ba_\bl_\bu_\be\n+@ value\n+True if T is an ISTL matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:509\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:538\n+_\bD_\bu_\bn_\be_\b:_\b:_\bP_\bo_\bi_\bn_\bt_\be_\br_\bC_\bo_\bm_\bp_\ba_\br_\be_\b:_\b:_\bo_\bp_\be_\br_\ba_\bt_\bo_\br_\b(_\b)\n+bool operator()(const T *l, const T *r)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixutils.hh:539\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx\n+A multiple of the identity matrix of static size.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:30\n+_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bc_\ba_\bl_\be_\bd_\bI_\bd_\be_\bn_\bt_\bi_\bt_\by_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n+std::size_t size_type\n+The type used for the index access and size operations.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn scaledidmatrix.hh:43\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00230.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00230.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixredistribute.hh File Reference\n+dune-istl: foreach.hh File Reference\n \n \n \n \n \n \n \n@@ -70,87 +70,58 @@\n
    \n \n
    \n
    \n
    \n \n-
    matrixredistribute.hh File Reference
    \n+
    foreach.hh File Reference
    \n
    \n
    \n-\n-

    Functionality for redistributing a sparse matrix. \n-More...

    \n-
    #include <memory>
    \n-#include "repartition.hh"
    \n-#include <dune/common/exceptions.hh>
    \n-#include <dune/common/parallel/indexset.hh>
    \n-#include <dune/istl/owneroverlapcopy.hh>
    \n-#include <dune/istl/paamg/pinfo.hh>
    \n+
    #include <type_traits>
    \n+#include <utility>
    \n+#include <cassert>
    \n+#include <dune/common/std/type_traits.hh>
    \n+#include <dune/common/diagonalmatrix.hh>
    \n+#include <dune/common/hybridutilities.hh>
    \n+#include <dune/common/indices.hh>
    \n+#include <dune/istl/bcrsmatrix.hh>
    \n+#include <dune/istl/scaledidmatrix.hh>
    \n
    \n

    Go to the source code of this file.

    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-

    \n-Classes

    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...
     
    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 >
     
    \n \n \n \n+\n+\n

    \n Namespaces

    namespace  Dune
     
    namespace  Dune::ForEach
     
    \n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n

    \n 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)
     
    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.
     
    \n-

    Detailed Description

    \n-

    Functionality for redistributing a sparse matrix.

    \n-
    Author
    Markus Blatt
    \n-
    \n+
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,80 +1,51 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-_\bC_\bl_\ba_\bs_\bs_\be_\bs | _\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n-matrixredistribute.hh File Reference\n-Functionality for redistributing a sparse matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n-#include \n-#include \"_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-#include \n-#include \n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n-#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh>\n+_\bN_\ba_\bm_\be_\bs_\bp_\ba_\bc_\be_\bs | _\bF_\bu_\bn_\bc_\bt_\bi_\bo_\bn_\bs\n+foreach.hh File Reference\n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include \n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bs_\bo_\bu_\br_\bc_\be_\b _\bc_\bo_\bd_\be_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n-C\bCl\bla\bas\bss\bse\bes\bs\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b _\b>\n-\u00a0\n- class \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>\n- _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b<_\b _\bM_\b,_\b _\bR_\bI_\b _\b>\n-\u00a0 Utility class to communicate and set the row sizes of a redistributed\n- matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>\n-\u00a0 Utility class to communicate and build the sparsity pattern of a\n- redistributed matrix. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>\n-\u00a0 Utility class for comunicating the matrix entries. _\bM_\bo_\br_\be_\b._\b._\b.\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bI_\b,_\b _\bR_\bI_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bI_\b,_\b _\bR_\bI_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bI_\b _\b>\n-\u00a0\n-struct \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\b _\bM_\b,_\b _\bI_\b _\b>\n-\u00a0\n N\bNa\bam\bme\bes\bsp\bpa\bac\bce\bes\bs\n namespace \u00a0 _\bD_\bu_\bn_\be\n \u00a0\n+namespace \u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh\n+\u00a0\n F\bFu\bun\bnc\bct\bti\bio\bon\bns\bs\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn (M &origMatrix, M &newMatrix, C\n- &origComm, C &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< C > &ri)\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs (M &origMatrix, M &newMatrix, C\n- &origComm, C &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< C > &ri)\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx (M &origMatrix, M &newMatrix, C &origComm, C\n- &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< C > &ri)\n-\u00a0 Redistribute a matrix according to given domain decompositions.\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs (M &origMatrix, M &newMatrix, _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:\n- _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn &origComm, _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n- &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn >\n- &ri)\n-\u00a0\n-template\n-void\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx (M &origMatrix, M &newMatrix, _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:\n- _\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn &origComm, _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n- &newComm, _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn< _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn >\n- &ri)\n-\u00a0\n-*\b**\b**\b**\b**\b* D\bDe\bet\bta\bai\bil\ble\bed\bd D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn *\b**\b**\b**\b**\b*\n-Functionality for redistributing a sparse matrix.\n- Author\n- Markus Blatt\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\br_\bo_\bw_\bs (_\bM_\ba_\bt_\br_\bi_\bx const\n+ &matrix)\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bc_\bo_\bl_\bs (_\bM_\ba_\bt_\br_\bi_\bx const\n+ &matrix)\n+\u00a0\n+template\n+ auto\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bs_\bi_\bz_\be (Vector const\n+ &vector)\n+\u00a0\n+template\n+ std::size_t\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh (Vector\n+ &&vector, F &&f, std::size_t offset=0)\n+\u00a0 Traverse a blocked vector and call a\n+ functor at each scalar entry.\n+\u00a0\n+template\n+std::pair< std::size_t, std::size_t >\u00a0 _\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh (_\bM_\ba_\bt_\br_\bi_\bx\n+ &&matrix, F &&f, std::size_t\n+ rowOffset=0, std::size_t colOffset=0)\n+\u00a0 Traverse a blocked matrix and call a\n+ functor at each scalar entry.\n+\u00a0\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00230_source.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00230_source.html", "unified_diff": "@@ -1,15 +1,15 @@\n \n \n \n \n \n \n \n-dune-istl: matrixredistribute.hh Source File\n+dune-istl: foreach.hh Source File\n \n \n \n \n \n \n \n@@ -74,996 +74,205 @@\n \n
    \n \n
    \n \n
    \n-
    matrixredistribute.hh
    \n+
    foreach.hh
    \n
    \n
    \n Go to the documentation of this file.
    1// SPDX-FileCopyrightText: Copyright \u00a9 DUNE Project contributors, see file LICENSE.md in module root
    \n
    2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
    \n-
    3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
    \n-
    4// vi: set et ts=4 sw=2 sts=2:
    \n-
    5#ifndef DUNE_ISTL_MATRIXREDISTRIBUTE_HH
    \n-
    6#define DUNE_ISTL_MATRIXREDISTRIBUTE_HH
    \n-
    7#include <memory>
    \n-
    8#include "repartition.hh"
    \n-
    9#include <dune/common/exceptions.hh>
    \n-
    10#include <dune/common/parallel/indexset.hh>
    \n-\n-\n-
    18namespace Dune
    \n-
    19{
    \n-
    20 template<typename T>
    \n-
    \n-\n-
    22 {
    \n-
    \n-
    23 bool isSetup() const
    \n-
    24 {
    \n-
    25 return false;
    \n-
    26 }
    \n-
    \n-
    27 template<class D>
    \n-
    \n-
    28 void redistribute([[maybe_unused]] const D& from, [[maybe_unused]] D& to) const
    \n-
    29 {}
    \n-
    \n-
    30
    \n-
    31 template<class D>
    \n-
    \n-
    32 void redistributeBackward([[maybe_unused]] D& from, [[maybe_unused]]const D& to) const
    \n-
    33 {}
    \n-
    \n-
    34
    \n-
    \n-\n-
    36 {}
    \n-
    \n+
    3#pragma once
    \n+
    4
    \n+
    5#include<type_traits>
    \n+
    6#include<utility>
    \n+
    7#include<cassert>
    \n+
    8
    \n+
    9#include<dune/common/std/type_traits.hh>
    \n+
    10#include<dune/common/diagonalmatrix.hh>
    \n+
    11#include<dune/common/hybridutilities.hh>
    \n+
    12#include<dune/common/indices.hh>
    \n+
    13
    \n+\n+\n+
    16
    \n+
    17namespace Dune{
    \n+
    18
    \n+
    19 namespace Impl {
    \n+
    20
    \n+
    21 // stolen from dune-functions: we call a type "scalar" if it does not support index accessing
    \n+
    22 template<class C>
    \n+
    23 using StaticIndexAccessConcept = decltype(std::declval<C>()[Dune::Indices::_0]);
    \n+
    24
    \n+
    25 template<class C>
    \n+
    26 using IsScalar = std::negation<Dune::Std::is_detected<StaticIndexAccessConcept, std::remove_reference_t<C>>>;
    \n+
    27
    \n+
    28 // Type trait for matrix types that supports
    \n+
    29 // - iteration done row-wise
    \n+
    30 // - sparse iteration over nonzero entries
    \n+
    31 template <class T>
    \n+
    32 struct IsRowMajorSparse : std::false_type {};
    \n+
    33
    \n+
    34 // This is supported by the following matrix types:
    \n+
    35 template <class B, class A>
    \n+
    36 struct IsRowMajorSparse<BCRSMatrix<B,A>> : std::true_type {};
    \n
    37
    \n-
    \n-
    38 void setNoRows([[maybe_unused]] std::size_t size)
    \n-
    39 {}
    \n-
    \n+
    38 template <class K, int n>
    \n+
    39 struct IsRowMajorSparse<DiagonalMatrix<K,n>> : std::true_type {};
    \n
    40
    \n-
    \n-
    41 void setNoCopyRows([[maybe_unused]] std::size_t size)
    \n-
    42 {}
    \n-
    \n+
    41 template <class K, int n>
    \n+
    42 struct IsRowMajorSparse<ScaledIdentityMatrix<K,n>> : std::true_type {};
    \n
    43
    \n-
    \n-
    44 void setNoBackwardsCopyRows([[maybe_unused]] std::size_t size)
    \n-
    45 {}
    \n-
    \n-
    46
    \n-
    \n-
    47 std::size_t getRowSize([[maybe_unused]] std::size_t index) const
    \n-
    48 {
    \n-
    49 return -1;
    \n-
    50 }
    \n-
    \n-
    51
    \n-
    \n-
    52 std::size_t getCopyRowSize([[maybe_unused]] std::size_t index) const
    \n-
    53 {
    \n-
    54 return -1;
    \n-
    55 }
    \n-
    \n+
    44
    \n+
    45 template <class Matrix>
    \n+
    46 auto rows(Matrix const& /*matrix*/, PriorityTag<2>) -> std::integral_constant<std::size_t, Matrix::N()> { return {}; }
    \n+
    47
    \n+
    48 template <class Matrix>
    \n+
    49 auto cols(Matrix const& /*matrix*/, PriorityTag<2>) -> std::integral_constant<std::size_t, Matrix::M()> { return {}; }
    \n+
    50
    \n+
    51 template <class Matrix>
    \n+
    52 auto rows(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.N()) { return matrix.N(); }
    \n+
    53
    \n+
    54 template <class Matrix>
    \n+
    55 auto cols(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.M()) { return matrix.M(); }
    \n
    56
    \n-
    \n-
    57 std::size_t getBackwardsCopyRowSize([[maybe_unused]] std::size_t index) const
    \n-
    58 {
    \n-
    59 return -1;
    \n-
    60 }
    \n-
    \n-
    61
    \n-
    62 };
    \n-
    \n+
    57 template <class Vector>
    \n+
    58 auto size(Vector const& /*vector*/, PriorityTag<2>) -> std::integral_constant<std::size_t, Vector::size()> { return {}; }
    \n+
    59
    \n+
    60 template <class Vector>
    \n+
    61 auto size(Vector const& vector, PriorityTag<1>) -> decltype(vector.size()) { return vector.size(); }
    \n+
    62
    \n
    63
    \n-
    64#if HAVE_MPI
    \n-
    65 template<typename T, typename T1>
    \n-
    \n-\n-
    67 {
    \n-
    68 public:
    \n-\n+
    64 } // end namespace Impl
    \n+
    65
    \n+
    \n+
    66namespace ForEach{
    \n+
    67
    \n+
    68 template <class Matrix>
    \n+
    69 auto rows(Matrix const& matrix) { return Impl::rows(matrix, PriorityTag<5>{}); }
    \n
    70
    \n-
    \n-\n-
    72 : interface(), setup_(false)
    \n-
    73 {}
    \n-
    \n-
    74
    \n-
    \n-\n-
    76 {
    \n-
    77 return interface;
    \n-
    78 }
    \n-
    \n-
    79 template<typename IS>
    \n-
    \n-
    80 void checkInterface(const IS& source,
    \n-
    81 const IS& target, MPI_Comm comm)
    \n-
    82 {
    \n-
    83 auto ri = std::make_unique<RemoteIndices<IS> >(source, target, comm);
    \n-
    84 ri->template rebuild<true>();
    \n-
    85 Interface inf;
    \n-\n-
    87 int rank;
    \n-
    88 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    \n-
    89 inf.free();
    \n-
    90 inf.build(*ri, flags, flags);
    \n-
    91
    \n-
    92
    \n-
    93#ifdef DEBUG_REPART
    \n-
    94 if(inf!=interface) {
    \n-
    95
    \n-
    96 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    \n-
    97 if(rank==0)
    \n-
    98 std::cout<<"Interfaces do not match!"<<std::endl;
    \n-
    99 std::cout<<rank<<": redist interface new :"<<inf<<std::endl;
    \n-
    100 std::cout<<rank<<": redist interface :"<<interface<<std::endl;
    \n-
    101
    \n-
    102 throw "autsch!";
    \n-
    103 }
    \n-
    104#endif
    \n-
    105 }
    \n-
    \n-
    \n-
    106 void setSetup()
    \n-
    107 {
    \n-
    108 setup_=true;
    \n-
    109 interface.strip();
    \n-
    110 }
    \n-
    \n-
    111
    \n-
    \n-\n-
    113 {
    \n-
    114 setup_=false;
    \n-
    115 }
    \n-
    \n-
    116
    \n-
    117 template<class GatherScatter, class D>
    \n-
    \n-
    118 void redistribute(const D& from, D& to) const
    \n-
    119 {
    \n-
    120 BufferedCommunicator communicator;
    \n-
    121 communicator.template build<D>(from,to, interface);
    \n-
    122 communicator.template forward<GatherScatter>(from, to);
    \n-
    123 communicator.free();
    \n-
    124 }
    \n-
    \n-
    125 template<class GatherScatter, class D>
    \n-
    \n-
    126 void redistributeBackward(D& from, const D& to) const
    \n-
    127 {
    \n-
    128
    \n-
    129 BufferedCommunicator communicator;
    \n-
    130 communicator.template build<D>(from,to, interface);
    \n-
    131 communicator.template backward<GatherScatter>(from, to);
    \n-
    132 communicator.free();
    \n-
    133 }
    \n-
    \n-
    134
    \n-
    135 template<class D>
    \n-
    \n-
    136 void redistribute(const D& from, D& to) const
    \n-
    137 {
    \n-
    138 redistribute<CopyGatherScatter<D> >(from,to);
    \n-
    139 }
    \n-
    \n-
    140 template<class D>
    \n-
    \n-
    141 void redistributeBackward(D& from, const D& to) const
    \n-
    142 {
    \n-
    143 redistributeBackward<CopyGatherScatter<D> >(from,to);
    \n-
    144 }
    \n-
    \n-
    \n-
    145 bool isSetup() const
    \n-
    146 {
    \n-
    147 return setup_;
    \n-
    148 }
    \n-
    \n-
    149
    \n-
    \n-
    150 void reserve(std::size_t size)
    \n-
    151 {}
    \n-
    \n-
    152
    \n-
    \n-
    153 std::size_t& getRowSize(std::size_t index)
    \n-
    154 {
    \n-
    155 return rowSize[index];
    \n-
    156 }
    \n-
    \n-
    157
    \n-
    \n-
    158 std::size_t getRowSize(std::size_t index) const
    \n-
    159 {
    \n-
    160 return rowSize[index];
    \n-
    161 }
    \n-
    \n-
    162
    \n-
    \n-
    163 std::size_t& getCopyRowSize(std::size_t index)
    \n-
    164 {
    \n-
    165 return copyrowSize[index];
    \n-
    166 }
    \n-
    \n-
    167
    \n-
    \n-
    168 std::size_t getCopyRowSize(std::size_t index) const
    \n-
    169 {
    \n-
    170 return copyrowSize[index];
    \n-
    171 }
    \n-
    \n-
    172
    \n-
    \n-
    173 std::size_t& getBackwardsCopyRowSize(std::size_t index)
    \n-
    174 {
    \n-
    175 return backwardscopyrowSize[index];
    \n-
    176 }
    \n-
    \n-
    177
    \n-
    \n-
    178 std::size_t getBackwardsCopyRowSize(std::size_t index) const
    \n-
    179 {
    \n-
    180 return backwardscopyrowSize[index];
    \n-
    181 }
    \n-
    \n-
    182
    \n-
    \n-
    183 void setNoRows(std::size_t rows)
    \n-
    184 {
    \n-
    185 rowSize.resize(rows, 0);
    \n-
    186 }
    \n-
    \n-
    187
    \n-
    \n-
    188 void setNoCopyRows(std::size_t rows)
    \n-
    189 {
    \n-
    190 copyrowSize.resize(rows, 0);
    \n-
    191 }
    \n-
    \n-
    192
    \n-
    \n-
    193 void setNoBackwardsCopyRows(std::size_t rows)
    \n-
    194 {
    \n-
    195 backwardscopyrowSize.resize(rows, 0);
    \n+
    71 template <class Matrix>
    \n+
    72 auto cols(Matrix const& matrix) { return Impl::cols(matrix, PriorityTag<5>{}); }
    \n+
    73
    \n+
    74 template <class Vector>
    \n+
    75 auto size(Vector const& vector) { return Impl::size(vector, PriorityTag<5>{}); }
    \n+
    76
    \n+
    77} // namespace ForEach
    \n+
    \n+
    78
    \n+
    79
    \n+
    80
    \n+
    81
    \n+
    94template <class Vector, class F>
    \n+
    \n+
    95std::size_t flatVectorForEach(Vector&& vector, F&& f, std::size_t offset = 0)
    \n+
    96{
    \n+
    97 using V = std::decay_t<Vector>;
    \n+
    98 if constexpr( Impl::IsScalar<V>::value )
    \n+
    99 {
    \n+
    100 f(vector, offset);
    \n+
    101 return 1;
    \n+
    102 }
    \n+
    103 else
    \n+
    104 {
    \n+
    105 std::size_t idx = 0;
    \n+
    106 Hybrid::forEach(Dune::range(ForEach::size(vector)), [&](auto i) {
    \n+
    107 idx += flatVectorForEach(vector[i], f, offset + idx);
    \n+
    108 });
    \n+
    109 return idx;
    \n+
    110 }
    \n+
    111}
    \n+
    \n+
    112
    \n+
    113
    \n+
    131template <class Matrix, class F>
    \n+
    \n+
    132std::pair<std::size_t,std::size_t> flatMatrixForEach(Matrix&& matrix, F&& f, std::size_t rowOffset = 0, std::size_t colOffset = 0)
    \n+
    133{
    \n+
    134 using M = std::decay_t<Matrix>;
    \n+
    135 if constexpr ( Impl::IsScalar<M>::value )
    \n+
    136 {
    \n+
    137 f(matrix,rowOffset,colOffset);
    \n+
    138 return {1,1};
    \n+
    139 }
    \n+
    140 else
    \n+
    141 {
    \n+
    142 // if M supports the IsRowMajorSparse type trait: iterate just over the nonzero entries and
    \n+
    143 // and compute the flat row/col size directly
    \n+
    144 if constexpr ( Impl::IsRowMajorSparse<M>::value )
    \n+
    145 {
    \n+
    146 using Block = std::decay_t<decltype(matrix[0][0])>;
    \n+
    147
    \n+
    148 // find an existing block or at least try to create one
    \n+
    149 auto block = [&]{
    \n+
    150 for (auto const& row : matrix)
    \n+
    151 for (auto const& entry : row)
    \n+
    152 return entry;
    \n+
    153 return Block{};
    \n+
    154 }();
    \n+
    155
    \n+
    156 // compute the scalar size of the block
    \n+
    157 auto [blockRows, blockCols] = flatMatrixForEach(block, [](...){});
    \n+
    158
    \n+
    159 // check whether we have valid sized blocks
    \n+
    160 assert( ( blockRows!=0 or blockCols!=0 ) and "the block size can't be zero");
    \n+
    161
    \n+
    162 for (auto rowIt = matrix.begin(); rowIt != matrix.end(); ++rowIt)
    \n+
    163 {
    \n+
    164 auto&& row = *rowIt;
    \n+
    165 auto rowIdx = rowIt.index();
    \n+
    166 for (auto colIt = row.begin(); colIt != row.end(); colIt++)
    \n+
    167 {
    \n+
    168 auto&& entry = *colIt;
    \n+
    169 auto colIdx = colIt.index();
    \n+
    170#ifndef NDEBUG
    \n+
    171 // only instantiate return value in debug mode (for the assert)
    \n+
    172 auto [ numRows, numCols ] =
    \n+
    173#endif
    \n+
    174 flatMatrixForEach(entry, f, rowOffset + rowIdx*blockRows, colOffset + colIdx*blockCols);
    \n+
    175 assert( numRows == blockRows and numCols == blockCols and "we need the same size of each block in this matrix type");
    \n+
    176 }
    \n+
    177 }
    \n+
    178
    \n+
    179 return { matrix.N()*blockRows, matrix.M()*blockCols };
    \n+
    180 }
    \n+
    181 // all other matrix types are accessed index-wise with dynamic flat row/col counting
    \n+
    182 else
    \n+
    183 {
    \n+
    184 std::size_t r = 0, c = 0;
    \n+
    185 std::size_t nRows, nCols;
    \n+
    186
    \n+
    187 Hybrid::forEach(Dune::range(ForEach::rows(matrix)), [&](auto i) {
    \n+
    188 c = 0;
    \n+
    189 Hybrid::forEach(Dune::range(ForEach::cols(matrix)), [&](auto j) {
    \n+
    190 std::tie(nRows,nCols) = flatMatrixForEach(matrix[i][j], f, rowOffset + r, colOffset + c);
    \n+
    191 c += nCols;
    \n+
    192 });
    \n+
    193 r += nRows;
    \n+
    194 });
    \n+
    195 return {r,c};
    \n
    196 }
    \n+
    197 }
    \n+
    198}
    \n
    \n-
    197
    \n-
    198 private:
    \n-
    199 std::vector<std::size_t> rowSize;
    \n-
    200 std::vector<std::size_t> copyrowSize;
    \n-
    201 std::vector<std::size_t> backwardscopyrowSize;
    \n-
    202 RedistributeInterface interface;
    \n-
    203 bool setup_;
    \n-
    204 };
    \n-
    \n-
    205
    \n-
    214 template<class M, class RI>
    \n-
    \n-\n-
    216 {
    \n-
    217 // Make the default communication policy work.
    \n-
    218 typedef typename M::size_type value_type;
    \n-
    219 typedef typename M::size_type size_type;
    \n-
    220
    \n-
    \n-
    226 CommMatrixRowSize(const M& m_, RI& rowsize_)
    \n-
    227 : matrix(m_), rowsize(rowsize_)
    \n-
    228 {}
    \n-
    \n-
    229 const M& matrix;
    \n-\n-
    231
    \n-
    232 };
    \n-
    \n-
    233
    \n-
    234
    \n-
    243 template<class M, class I>
    \n-
    \n-\n-
    245 {
    \n-
    246 typedef typename M::size_type size_type;
    \n-
    247
    \n-
    \n-
    254 CommMatrixSparsityPattern(const M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_)
    \n-
    255 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize()
    \n-
    256 {}
    \n-
    \n-
    257
    \n-
    \n-
    265 CommMatrixSparsityPattern(const M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_,
    \n-
    266 const std::vector<typename M::size_type>& rowsize_)
    \n-
    267 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), sparsity(aggidxset_.size()), rowsize(&rowsize_)
    \n-
    268 {}
    \n-
    \n-
    269
    \n-
    \n-\n-
    277 {
    \n-
    278 // insert diagonal to overlap rows
    \n-
    279 typedef typename Dune::GlobalLookupIndexSet<I>::const_iterator IIter;
    \n-\n-
    281 std::size_t nnz=0;
    \n-
    282#ifdef DEBUG_REPART
    \n-
    283 int rank;
    \n-
    284
    \n-
    285 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    \n-
    286#endif
    \n-
    287 for(IIter i= aggidxset.begin(), end=aggidxset.end(); i!=end; ++i) {
    \n-
    288 if(!OwnerSet::contains(i->local().attribute())) {
    \n-
    289#ifdef DEBUG_REPART
    \n-
    290 std::cout<<rank<<" Inserting diagonal for"<<i->local()<<std::endl;
    \n-
    291#endif
    \n-
    292 sparsity[i->local()].insert(i->local());
    \n-
    293 }
    \n-
    294
    \n-
    295 nnz+=sparsity[i->local()].size();
    \n-
    296 }
    \n-
    297 assert( aggidxset.size()==sparsity.size());
    \n-
    298
    \n-
    299 if(nnz>0) {
    \n-
    300 m.setSize(aggidxset.size(), aggidxset.size(), nnz);
    \n-
    301 m.setBuildMode(M::row_wise);
    \n-
    302 typename M::CreateIterator citer=m.createbegin();
    \n-
    303#ifdef DEBUG_REPART
    \n-
    304 std::size_t idx=0;
    \n-
    305 bool correct=true;
    \n-
    306 Dune::GlobalLookupIndexSet<I> global(aggidxset);
    \n-
    307#endif
    \n-
    308 typedef typename std::vector<std::set<size_type> >::const_iterator Iter;
    \n-
    309 for(Iter i=sparsity.begin(), end=sparsity.end(); i!=end; ++i, ++citer)
    \n-
    310 {
    \n-
    311 typedef typename std::set<size_type>::const_iterator SIter;
    \n-
    312 for(SIter si=i->begin(), send=i->end(); si!=send; ++si)
    \n-
    313 citer.insert(*si);
    \n-
    314#ifdef DEBUG_REPART
    \n-
    315 if(i->find(idx)==i->end()) {
    \n-
    316 const typename I::IndexPair* gi=global.pair(idx);
    \n-
    317 assert(gi);
    \n-
    318 std::cout<<rank<<": row "<<idx<<" is missing a diagonal entry! global="<<gi->global()<<" attr="<<gi->local().attribute()<<" "<<
    \n-
    319 OwnerSet::contains(gi->local().attribute())<<
    \n-
    320 " row size="<<i->size()<<std::endl;
    \n-
    321 correct=false;
    \n-
    322 }
    \n-
    323 ++idx;
    \n-
    324#endif
    \n-
    325 }
    \n-
    326#ifdef DEBUG_REPART
    \n-
    327 if(!correct)
    \n-
    328 throw "bla";
    \n-
    329#endif
    \n-
    330 }
    \n-
    331 }
    \n-
    \n-
    332
    \n-
    \n-
    340 void completeSparsityPattern(std::vector<std::set<size_type> > add_sparsity)
    \n-
    341 {
    \n-
    342 for (unsigned int i = 0; i != sparsity.size(); ++i) {
    \n-
    343 if (add_sparsity[i].size() != 0) {
    \n-
    344 typedef std::set<size_type> Set;
    \n-
    345 Set tmp_set;
    \n-
    346 std::insert_iterator<Set> tmp_insert (tmp_set, tmp_set.begin());
    \n-
    347 std::set_union(add_sparsity[i].begin(), add_sparsity[i].end(),
    \n-
    348 sparsity[i].begin(), sparsity[i].end(), tmp_insert);
    \n-
    349 sparsity[i].swap(tmp_set);
    \n-
    350 }
    \n-
    351 }
    \n-
    352 }
    \n-
    \n-
    353
    \n-
    354 const M& matrix;
    \n-
    355 typedef Dune::GlobalLookupIndexSet<I> LookupIndexSet;
    \n-
    356 const Dune::GlobalLookupIndexSet<I>& idxset;
    \n-
    357 const I& aggidxset;
    \n-
    358 std::vector<std::set<size_type> > sparsity;
    \n-
    359 const std::vector<size_type>* rowsize;
    \n-
    360 };
    \n-
    \n-
    361
    \n-
    362 template<class M, class I>
    \n-
    \n-
    363 struct CommPolicy<CommMatrixSparsityPattern<M,I> >
    \n-
    364 {
    \n-\n-
    366
    \n-
    371 typedef typename I::GlobalIndex IndexedType;
    \n-
    372
    \n-
    374 typedef VariableSize IndexedTypeFlag;
    \n-
    375
    \n-
    \n-
    376 static typename M::size_type getSize(const Type& t, std::size_t i)
    \n-
    377 {
    \n-
    378 if(!t.rowsize)
    \n-
    379 return t.matrix[i].size();
    \n-
    380 else
    \n-
    381 {
    \n-
    382 assert((*t.rowsize)[i]>0);
    \n-
    383 return (*t.rowsize)[i];
    \n-
    384 }
    \n-
    385 }
    \n-
    \n-
    386 };
    \n-
    \n-
    387
    \n-
    394 template<class M, class I>
    \n-
    \n-\n-
    396 {
    \n-
    \n-
    405 CommMatrixRow(M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_)
    \n-
    406 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize()
    \n-
    407 {}
    \n-
    \n-
    408
    \n-
    \n-
    412 CommMatrixRow(M& m_, const Dune::GlobalLookupIndexSet<I>& idxset_, const I& aggidxset_,
    \n-
    413 std::vector<size_t>& rowsize_)
    \n-
    414 : matrix(m_), idxset(idxset_), aggidxset(aggidxset_), rowsize(&rowsize_)
    \n-
    415 {}
    \n-
    \n-
    \n-\n-
    422 {
    \n-
    423 typedef typename Dune::GlobalLookupIndexSet<I>::const_iterator Iter;
    \n-\n-
    425
    \n-
    426 for(Iter i= aggidxset.begin(), end=aggidxset.end(); i!=end; ++i)
    \n-
    427 if(!OwnerSet::contains(i->local().attribute())) {
    \n-
    428 // Set to Dirchlet
    \n-
    429 typedef typename M::ColIterator CIter;
    \n-
    430 for(CIter c=matrix[i->local()].begin(), cend= matrix[i->local()].end();
    \n-
    431 c!= cend; ++c)
    \n-
    432 {
    \n-
    433 *c=0;
    \n-
    434 if(c.index()==i->local()) {
    \n-
    435 auto setDiagonal = [](auto&& scalarOrMatrix, const auto& value) {
    \n-
    436 auto&& matrixView = Dune::Impl::asMatrix(scalarOrMatrix);
    \n-
    437 for (auto rowIt = matrixView.begin(); rowIt != matrixView.end(); ++rowIt)
    \n-
    438 (*rowIt)[rowIt.index()] = value;
    \n-
    439 };
    \n-
    440 setDiagonal(*c, 1);
    \n-
    441 }
    \n-
    442 }
    \n-
    443 }
    \n-
    444 }
    \n-
    \n-\n-
    448 const Dune::GlobalLookupIndexSet<I>& idxset;
    \n-
    450 const I& aggidxset;
    \n-
    452 std::vector<size_t>* rowsize; // row sizes differ from sender side in overlap!
    \n-
    453 };
    \n-
    \n-
    454
    \n-
    455 template<class M, class I>
    \n-
    \n-
    456 struct CommPolicy<CommMatrixRow<M,I> >
    \n-
    457 {
    \n-\n-
    459
    \n-
    464 typedef std::pair<typename I::GlobalIndex,typename M::block_type> IndexedType;
    \n-
    465
    \n-
    467 typedef VariableSize IndexedTypeFlag;
    \n-
    468
    \n-
    \n-
    469 static std::size_t getSize(const Type& t, std::size_t i)
    \n-
    470 {
    \n-
    471 if(!t.rowsize)
    \n-
    472 return t.matrix[i].size();
    \n-
    473 else
    \n-
    474 {
    \n-
    475 assert((*t.rowsize)[i]>0);
    \n-
    476 return (*t.rowsize)[i];
    \n-
    477 }
    \n-
    478 }
    \n-
    \n-
    479 };
    \n-
    \n-
    480
    \n-
    481 template<class M, class I, class RI>
    \n-
    \n-\n-
    483 {
    \n-\n-
    485
    \n-
    \n-
    486 static const typename M::size_type gather(const Container& cont, std::size_t i)
    \n-
    487 {
    \n-
    488 return cont.matrix[i].size();
    \n-
    489 }
    \n-
    \n-
    \n-
    490 static void scatter(Container& cont, const typename M::size_type& rowsize, std::size_t i)
    \n-
    491 {
    \n-
    492 assert(rowsize);
    \n-
    493 cont.rowsize.getRowSize(i)=rowsize;
    \n-
    494 }
    \n-
    \n-
    495
    \n-
    496 };
    \n-
    \n-
    497
    \n-
    498 template<class M, class I, class RI>
    \n-
    \n-\n-
    500 {
    \n-\n-
    502
    \n-
    \n-
    503 static const typename M::size_type gather(const Container& cont, std::size_t i)
    \n-
    504 {
    \n-
    505 return cont.matrix[i].size();
    \n-
    506 }
    \n-
    \n-
    \n-
    507 static void scatter(Container& cont, const typename M::size_type& rowsize, std::size_t i)
    \n-
    508 {
    \n-
    509 assert(rowsize);
    \n-
    510 if (rowsize > cont.rowsize.getCopyRowSize(i))
    \n-
    511 cont.rowsize.getCopyRowSize(i)=rowsize;
    \n-
    512 }
    \n-
    \n-
    513
    \n-
    514 };
    \n-
    \n-
    515
    \n-
    516 template<class M, class I>
    \n-
    \n-\n-
    518 {
    \n-
    519 typedef typename I::GlobalIndex GlobalIndex;
    \n-\n-
    521 typedef typename M::ConstColIterator ColIter;
    \n-
    522
    \n-
    523 static ColIter col;
    \n-\n-
    525
    \n-
    \n-
    526 static const GlobalIndex& gather(const Container& cont, std::size_t i, std::size_t j)
    \n-
    527 {
    \n-
    528 if(j==0)
    \n-
    529 col=cont.matrix[i].begin();
    \n-
    530 else if (col!=cont.matrix[i].end())
    \n-
    531 ++col;
    \n-
    532
    \n-
    533 //copy communication: different row sizes for copy rows with the same global index
    \n-
    534 //are possible. If all values of current matrix row are sent, send
    \n-
    535 //std::numeric_limits<GlobalIndex>::max()
    \n-
    536 //and receiver will ignore it.
    \n-
    537 if (col==cont.matrix[i].end()) {
    \n-
    538 numlimits = std::numeric_limits<GlobalIndex>::max();
    \n-
    539 return numlimits;
    \n-
    540 }
    \n-
    541 else {
    \n-
    542 const typename I::IndexPair* index=cont.idxset.pair(col.index());
    \n-
    543 assert(index);
    \n-
    544 // Only send index if col is no ghost
    \n-
    545 if ( index->local().attribute() != 2)
    \n-
    546 return index->global();
    \n-
    547 else {
    \n-
    548 numlimits = std::numeric_limits<GlobalIndex>::max();
    \n-
    549 return numlimits;
    \n-
    550 }
    \n-
    551 }
    \n-
    552 }
    \n-
    \n-
    \n-
    553 static void scatter(Container& cont, const GlobalIndex& gi, std::size_t i, [[maybe_unused]] std::size_t j)
    \n-
    554 {
    \n-
    555 try{
    \n-
    556 if (gi != std::numeric_limits<GlobalIndex>::max()) {
    \n-
    557 const typename I::IndexPair& ip=cont.aggidxset.at(gi);
    \n-
    558 assert(ip.global()==gi);
    \n-
    559 std::size_t column = ip.local();
    \n-
    560 cont.sparsity[i].insert(column);
    \n-
    561
    \n-\n-
    563 if(!OwnerSet::contains(ip.local().attribute()))
    \n-
    564 // preserve symmetry for overlap
    \n-
    565 cont.sparsity[column].insert(i);
    \n-
    566 }
    \n-
    567 }
    \n-
    568 catch(const Dune::RangeError&) {
    \n-
    569 // Entry not present in the new index set. Ignore!
    \n-
    570#ifdef DEBUG_REPART
    \n-
    571 typedef typename Container::LookupIndexSet GlobalLookup;
    \n-
    572 typedef typename GlobalLookup::IndexPair IndexPair;
    \n-\n-
    574
    \n-
    575 GlobalLookup lookup(cont.aggidxset);
    \n-
    576 const IndexPair* pi=lookup.pair(i);
    \n-
    577 assert(pi);
    \n-
    578 if(OwnerSet::contains(pi->local().attribute())) {
    \n-
    579 int rank;
    \n-
    580 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    \n-
    581 std::cout<<rank<<cont.aggidxset<<std::endl;
    \n-
    582 std::cout<<rank<<": row "<<i<<" (global="<<gi <<") not in index set for owner index "<<pi->global()<<std::endl;
    \n-
    583 throw;
    \n-
    584 }
    \n-
    585#endif
    \n-
    586 }
    \n-
    587 }
    \n-
    \n-
    588
    \n-
    589 };
    \n-
    \n-
    590 template<class M, class I>
    \n-\n-
    592
    \n-
    593 template<class M, class I>
    \n-\n-
    595
    \n-
    596
    \n-
    597 template<class M, class I>
    \n-
    \n-\n-
    599 {
    \n-
    600 typedef typename I::GlobalIndex GlobalIndex;
    \n-\n-
    602 typedef typename M::ConstColIterator ColIter;
    \n-
    603 typedef typename std::pair<GlobalIndex,typename M::block_type> Data;
    \n-
    604 static ColIter col;
    \n-\n-\n-
    607
    \n-
    \n-
    608 static const Data& gather(const Container& cont, std::size_t i, std::size_t j)
    \n-
    609 {
    \n-
    610 if(j==0)
    \n-
    611 col=cont.matrix[i].begin();
    \n-
    612 else if (col!=cont.matrix[i].end())
    \n-
    613 ++col;
    \n-
    614 // copy communication: different row sizes for copy rows with the same global index
    \n-
    615 // are possible. If all values of current matrix row are sent, send
    \n-
    616 // std::numeric_limits<GlobalIndex>::max()
    \n-
    617 // and receiver will ignore it.
    \n-
    618 if (col==cont.matrix[i].end()) {
    \n-
    619 numlimits = std::numeric_limits<GlobalIndex>::max();
    \n-\n-
    621 return datastore;
    \n-
    622 }
    \n-
    623 else {
    \n-
    624 // convert local column index to global index
    \n-
    625 const typename I::IndexPair* index=cont.idxset.pair(col.index());
    \n-
    626 assert(index);
    \n-
    627 // Store the data to prevent reference to temporary
    \n-
    628 // Only send index if col is no ghost
    \n-
    629 if ( index->local().attribute() != 2)
    \n-
    630 datastore = Data(index->global(),*col);
    \n-
    631 else {
    \n-
    632 numlimits = std::numeric_limits<GlobalIndex>::max();
    \n-\n-
    634 }
    \n-
    635 return datastore;
    \n-
    636 }
    \n-
    637 }
    \n-
    \n-
    \n-
    638 static void scatter(Container& cont, const Data& data, std::size_t i, [[maybe_unused]] std::size_t j)
    \n-
    639 {
    \n-
    640 try{
    \n-
    641 if (data.first != std::numeric_limits<GlobalIndex>::max()) {
    \n-
    642 typename M::size_type column=cont.aggidxset.at(data.first).local();
    \n-
    643 cont.matrix[i][column]=data.second;
    \n-
    644 }
    \n-
    645 }
    \n-
    646 catch(const Dune::RangeError&) {
    \n-
    647 // This an overlap row and might therefore lack some entries!
    \n-
    648 }
    \n-
    649
    \n-
    650 }
    \n-
    \n-
    651 };
    \n-
    \n-
    652
    \n-
    653 template<class M, class I>
    \n-\n-
    655
    \n-
    656 template<class M, class I>
    \n-\n-
    658
    \n-
    659 template<class M, class I>
    \n-\n-
    661
    \n-
    662 template<typename M, typename C>
    \n-
    \n-
    663 void redistributeSparsityPattern(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
    \n-\n-
    665 {
    \n-
    666 typename C::CopySet copyflags;
    \n-
    667 typename C::OwnerSet ownerflags;
    \n-
    668 typedef typename C::ParallelIndexSet IndexSet;
    \n-\n-
    670 std::vector<typename M::size_type> rowsize(newComm.indexSet().size(), 0);
    \n-
    671 std::vector<typename M::size_type> copyrowsize(newComm.indexSet().size(), 0);
    \n-
    672 std::vector<typename M::size_type> backwardscopyrowsize(origComm.indexSet().size(), 0);
    \n-
    673
    \n-
    674 // get owner rowsizes
    \n-
    675 CommMatrixRowSize<M,RI> commRowSize(origMatrix, ri);
    \n-
    676 ri.template redistribute<MatrixRowSizeGatherScatter<M,IndexSet,RI> >(commRowSize,commRowSize);
    \n-
    677
    \n-
    678 origComm.buildGlobalLookup();
    \n-
    679
    \n-
    680 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
    \n-
    681 rowsize[i] = ri.getRowSize(i);
    \n-
    682 }
    \n-
    683 // get sparsity pattern from owner rows
    \n-\n-
    685 origsp(origMatrix, origComm.globalLookup(), newComm.indexSet());
    \n-\n-
    687 newsp(origMatrix, origComm.globalLookup(), newComm.indexSet(), rowsize);
    \n-
    688
    \n-
    689 ri.template redistribute<MatrixSparsityPatternGatherScatter<M,IndexSet> >(origsp,newsp);
    \n-
    690
    \n-
    691 // build copy to owner interface to get missing matrix values for novlp case
    \n-\n-
    693 RemoteIndices<IndexSet> *ris = new RemoteIndices<IndexSet>(origComm.indexSet(),
    \n-
    694 newComm.indexSet(),
    \n-
    695 origComm.communicator());
    \n-
    696 ris->template rebuild<true>();
    \n-
    697
    \n-
    698 ri.getInterface().free();
    \n-
    699 ri.getInterface().build(*ris,copyflags,ownerflags);
    \n-
    700
    \n-
    701 // get copy rowsizes
    \n-
    702 CommMatrixRowSize<M,RI> commRowSize_copy(origMatrix, ri);
    \n-
    703 ri.template redistribute<MatrixCopyRowSizeGatherScatter<M,IndexSet,RI> >(commRowSize_copy,
    \n-
    704 commRowSize_copy);
    \n-
    705
    \n-
    706 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
    \n-
    707 copyrowsize[i] = ri.getCopyRowSize(i);
    \n-
    708 }
    \n-
    709 //get copy rowsizes for sender
    \n-
    710 ri.redistributeBackward(backwardscopyrowsize,copyrowsize);
    \n-
    711 for (std::size_t i=0; i < origComm.indexSet().size(); i++) {
    \n-
    712 ri.getBackwardsCopyRowSize(i) = backwardscopyrowsize[i];
    \n-
    713 }
    \n-
    714
    \n-
    715 // get sparsity pattern from copy rows
    \n-
    716 CommMatrixSparsityPattern<M,IndexSet> origsp_copy(origMatrix,
    \n-
    717 origComm.globalLookup(),
    \n-
    718 newComm.indexSet(),
    \n-
    719 backwardscopyrowsize);
    \n-
    720 CommMatrixSparsityPattern<M,IndexSet> newsp_copy(origMatrix, origComm.globalLookup(),
    \n-
    721 newComm.indexSet(), copyrowsize);
    \n-
    722 ri.template redistribute<MatrixSparsityPatternGatherScatter<M,IndexSet> >(origsp_copy,
    \n-
    723 newsp_copy);
    \n-
    724
    \n-
    725 newsp.completeSparsityPattern(newsp_copy.sparsity);
    \n-
    726 newsp.storeSparsityPattern(newMatrix);
    \n-
    727 }
    \n-
    728 else
    \n-
    729 newsp.storeSparsityPattern(newMatrix);
    \n-
    730
    \n-
    731#ifdef DUNE_ISTL_WITH_CHECKING
    \n-
    732 // Check for symmetry
    \n-
    733 int ret=0;
    \n-
    734 typedef typename M::ConstRowIterator RIter;
    \n-
    735 for(RIter row=newMatrix.begin(), rend=newMatrix.end(); row != rend; ++row) {
    \n-
    736 typedef typename M::ConstColIterator CIter;
    \n-
    737 for(CIter col=row->begin(), cend=row->end(); col!=cend; ++col)
    \n-
    738 {
    \n-
    739 try{
    \n-
    740 newMatrix[col.index()][row.index()];
    \n-
    741 }catch(const Dune::ISTLError&) {
    \n-
    742 std::cerr<<newComm.communicator().rank()<<": entry ("
    \n-
    743 <<col.index()<<","<<row.index()<<") missing! for symmetry!"<<std::endl;
    \n-
    744 ret=1;
    \n-
    745
    \n-
    746 }
    \n-
    747
    \n-
    748 }
    \n-
    749 }
    \n-
    750
    \n-
    751 if(ret)
    \n-
    752 DUNE_THROW(ISTLError, "Matrix not symmetric!");
    \n-
    753#endif
    \n-
    754 }
    \n-
    \n-
    755
    \n-
    756 template<typename M, typename C>
    \n-
    \n-
    757 void redistributeMatrixEntries(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
    \n-\n-
    759 {
    \n-
    760 typedef typename C::ParallelIndexSet IndexSet;
    \n-
    761 typename C::OwnerSet ownerflags;
    \n-
    762 std::vector<typename M::size_type> rowsize(newComm.indexSet().size(), 0);
    \n-
    763 std::vector<typename M::size_type> copyrowsize(newComm.indexSet().size(), 0);
    \n-
    764 std::vector<typename M::size_type> backwardscopyrowsize(origComm.indexSet().size(), 0);
    \n-
    765
    \n-
    766 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {
    \n-
    767 rowsize[i] = ri.getRowSize(i);
    \n-\n-
    769 copyrowsize[i] = ri.getCopyRowSize(i);
    \n-
    770 }
    \n-
    771 }
    \n-
    772
    \n-
    773 for (std::size_t i=0; i < origComm.indexSet().size(); i++)
    \n-\n-
    775 backwardscopyrowsize[i] = ri.getBackwardsCopyRowSize(i);
    \n-
    776
    \n-
    777
    \n-\n-
    779 // fill sparsity pattern from copy rows
    \n-
    780 CommMatrixRow<M,IndexSet> origrow_copy(origMatrix, origComm.globalLookup(),
    \n-
    781 newComm.indexSet(), backwardscopyrowsize);
    \n-
    782 CommMatrixRow<M,IndexSet> newrow_copy(newMatrix, origComm.globalLookup(),
    \n-
    783 newComm.indexSet(),copyrowsize);
    \n-
    784 ri.template redistribute<MatrixRowGatherScatter<M,IndexSet> >(origrow_copy,
    \n-
    785 newrow_copy);
    \n-
    786 ri.getInterface().free();
    \n-
    787 RemoteIndices<IndexSet> *ris = new RemoteIndices<IndexSet>(origComm.indexSet(),
    \n-
    788 newComm.indexSet(),
    \n-
    789 origComm.communicator());
    \n-
    790 ris->template rebuild<true>();
    \n-
    791 ri.getInterface().build(*ris,ownerflags,ownerflags);
    \n-
    792 }
    \n-
    793
    \n-\n-
    795 origrow(origMatrix, origComm.globalLookup(), newComm.indexSet());
    \n-\n-
    797 newrow(newMatrix, origComm.globalLookup(), newComm.indexSet(),rowsize);
    \n-
    798 ri.template redistribute<MatrixRowGatherScatter<M,IndexSet> >(origrow,newrow);
    \n-
    799 if (SolverCategory::category(origComm) != static_cast<int>(SolverCategory::nonoverlapping))
    \n-\n-
    801 }
    \n-
    \n-
    802
    \n-
    819 template<typename M, typename C>
    \n-
    \n-
    820 void redistributeMatrix(M& origMatrix, M& newMatrix, C& origComm, C& newComm,
    \n-\n-
    822 {
    \n-
    823 ri.setNoRows(newComm.indexSet().size());
    \n-
    824 ri.setNoCopyRows(newComm.indexSet().size());
    \n-
    825 ri.setNoBackwardsCopyRows(origComm.indexSet().size());
    \n-
    826 redistributeSparsityPattern(origMatrix, newMatrix, origComm, newComm, ri);
    \n-
    827 redistributeMatrixEntries(origMatrix, newMatrix, origComm, newComm, ri);
    \n-
    828 }
    \n-
    \n-
    829#endif
    \n-
    830
    \n-
    831template<typename M>
    \n-
    \n-
    832 void redistributeMatrixEntries(M& origMatrix, M& newMatrix,
    \n-\n-\n-\n-
    836 {
    \n-
    837 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential program!");
    \n-
    838 }
    \n-
    \n-
    839 template<typename M>
    \n-
    \n-
    840 void redistributeMatrix(M& origMatrix, M& newMatrix,
    \n-\n-\n-\n-
    844 {
    \n-
    845 DUNE_THROW(InvalidStateException, "Trying to redistribute in sequential program!");
    \n-
    846 }
    \n-
    \n-
    847}
    \n-
    848#endif
    \n-\n-
    Functionality for redistributing a parallel index set using graph partitioning.
    \n-
    Classes providing communication interfaces for overlapping Schwarz methods.
    \n-
    Col col
    Definition matrixmatrix.hh:351
    \n+
    199
    \n+
    200} // namespace Dune
    \n+
    Implementation of the BCRSMatrix class.
    \n+
    This file implements a quadratic matrix of fixed size which is a multiple of the identity.
    \n
    Definition allocator.hh:11
    \n-
    void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
    Definition matrixredistribute.hh:757
    \n-
    void redistributeSparsityPattern(M &origMatrix, M &newMatrix, C &origComm, C &newComm, RedistributeInformation< C > &ri)
    Definition matrixredistribute.hh:663
    \n-
    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
    \n-
    derive error class from the base class in common
    Definition istlexception.hh:19
    \n-
    Definition matrixredistribute.hh:22
    \n-
    void setNoBackwardsCopyRows(std::size_t size)
    Definition matrixredistribute.hh:44
    \n-
    void redistribute(const D &from, D &to) const
    Definition matrixredistribute.hh:28
    \n-
    void resetSetup()
    Definition matrixredistribute.hh:35
    \n-
    void setNoCopyRows(std::size_t size)
    Definition matrixredistribute.hh:41
    \n-
    bool isSetup() const
    Definition matrixredistribute.hh:23
    \n-
    void setNoRows(std::size_t size)
    Definition matrixredistribute.hh:38
    \n-
    void redistributeBackward(D &from, const D &to) const
    Definition matrixredistribute.hh:32
    \n-
    std::size_t getBackwardsCopyRowSize(std::size_t index) const
    Definition matrixredistribute.hh:57
    \n-
    std::size_t getRowSize(std::size_t index) const
    Definition matrixredistribute.hh:47
    \n-
    std::size_t getCopyRowSize(std::size_t index) const
    Definition matrixredistribute.hh:52
    \n-
    std::size_t getRowSize(std::size_t index) const
    Definition matrixredistribute.hh:158
    \n-
    std::size_t & getBackwardsCopyRowSize(std::size_t index)
    Definition matrixredistribute.hh:173
    \n-
    RedistributeInterface & getInterface()
    Definition matrixredistribute.hh:75
    \n-
    void redistribute(const D &from, D &to) const
    Definition matrixredistribute.hh:136
    \n-
    void setNoBackwardsCopyRows(std::size_t rows)
    Definition matrixredistribute.hh:193
    \n-
    std::size_t & getCopyRowSize(std::size_t index)
    Definition matrixredistribute.hh:163
    \n-\n-
    std::size_t getCopyRowSize(std::size_t index) const
    Definition matrixredistribute.hh:168
    \n-
    void setNoRows(std::size_t rows)
    Definition matrixredistribute.hh:183
    \n-
    void reserve(std::size_t size)
    Definition matrixredistribute.hh:150
    \n-
    OwnerOverlapCopyCommunication< T, T1 > Comm
    Definition matrixredistribute.hh:69
    \n-
    void setNoCopyRows(std::size_t rows)
    Definition matrixredistribute.hh:188
    \n-
    void redistributeBackward(D &from, const D &to) const
    Definition matrixredistribute.hh:141
    \n-\n-
    std::size_t getBackwardsCopyRowSize(std::size_t index) const
    Definition matrixredistribute.hh:178
    \n-
    void redistribute(const D &from, D &to) const
    Definition matrixredistribute.hh:118
    \n-\n-
    void redistributeBackward(D &from, const D &to) const
    Definition matrixredistribute.hh:126
    \n-
    void checkInterface(const IS &source, const IS &target, MPI_Comm comm)
    Definition matrixredistribute.hh:80
    \n-
    bool isSetup() const
    Definition matrixredistribute.hh:145
    \n-
    std::size_t & getRowSize(std::size_t index)
    Definition matrixredistribute.hh:153
    \n-
    Utility class to communicate and set the row sizes of a redistributed matrix.
    Definition matrixredistribute.hh:216
    \n-
    M::size_type size_type
    Definition matrixredistribute.hh:219
    \n-
    M::size_type value_type
    Definition matrixredistribute.hh:218
    \n-
    RI & rowsize
    Definition matrixredistribute.hh:230
    \n-
    const M & matrix
    Definition matrixredistribute.hh:229
    \n-
    CommMatrixRowSize(const M &m_, RI &rowsize_)
    Constructor.
    Definition matrixredistribute.hh:226
    \n-
    Utility class to communicate and build the sparsity pattern of a redistributed matrix.
    Definition matrixredistribute.hh:245
    \n-
    M::size_type size_type
    Definition matrixredistribute.hh:246
    \n-
    const Dune::GlobalLookupIndexSet< I > & idxset
    Definition matrixredistribute.hh:356
    \n-
    void storeSparsityPattern(M &m)
    Creates and stores the sparsity pattern of the redistributed matrix.
    Definition matrixredistribute.hh:276
    \n-
    const I & aggidxset
    Definition matrixredistribute.hh:357
    \n-
    const std::vector< size_type > * rowsize
    Definition matrixredistribute.hh:359
    \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...
    Definition matrixredistribute.hh:340
    \n-
    CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_)
    Constructor for the original side.
    Definition matrixredistribute.hh:254
    \n-
    const M & matrix
    Definition matrixredistribute.hh:354
    \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.
    Definition matrixredistribute.hh:265
    \n-
    std::vector< std::set< size_type > > sparsity
    Definition matrixredistribute.hh:358
    \n-
    Dune::GlobalLookupIndexSet< I > LookupIndexSet
    Definition matrixredistribute.hh:355
    \n-
    static M::size_type getSize(const Type &t, std::size_t i)
    Definition matrixredistribute.hh:376
    \n-
    CommMatrixSparsityPattern< M, I > Type
    Definition matrixredistribute.hh:365
    \n-
    I::GlobalIndex IndexedType
    The indexed type we send. This is the global index indentitfying the column.
    Definition matrixredistribute.hh:371
    \n-
    VariableSize IndexedTypeFlag
    Each row varies in size.
    Definition matrixredistribute.hh:374
    \n-
    Utility class for comunicating the matrix entries.
    Definition matrixredistribute.hh:396
    \n-
    std::vector< size_t > * rowsize
    row size information for the receiving side.
    Definition matrixredistribute.hh:452
    \n-
    M & matrix
    The matrix to communicate the values of.
    Definition matrixredistribute.hh:446
    \n-
    CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_, std::vector< size_t > &rowsize_)
    Constructor.
    Definition matrixredistribute.hh:412
    \n-
    const Dune::GlobalLookupIndexSet< I > & idxset
    Index set for the original matrix.
    Definition matrixredistribute.hh:448
    \n-
    void setOverlapRowsToDirichlet()
    Sets the non-owner rows correctly as Dirichlet boundaries.
    Definition matrixredistribute.hh:421
    \n-
    const I & aggidxset
    Index set for the redistributed matrix.
    Definition matrixredistribute.hh:450
    \n-
    CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I &aggidxset_)
    Constructor.
    Definition matrixredistribute.hh:405
    \n-
    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
    \n-
    CommMatrixRow< M, I > Type
    Definition matrixredistribute.hh:458
    \n-
    static std::size_t getSize(const Type &t, std::size_t i)
    Definition matrixredistribute.hh:469
    \n-
    VariableSize IndexedTypeFlag
    Each row varies in size.
    Definition matrixredistribute.hh:467
    \n-
    Definition matrixredistribute.hh:483
    \n-
    static void scatter(Container &cont, const typename M::size_type &rowsize, std::size_t i)
    Definition matrixredistribute.hh:490
    \n-
    static const M::size_type gather(const Container &cont, std::size_t i)
    Definition matrixredistribute.hh:486
    \n-
    CommMatrixRowSize< M, RI > Container
    Definition matrixredistribute.hh:484
    \n-
    Definition matrixredistribute.hh:500
    \n-
    static const M::size_type gather(const Container &cont, std::size_t i)
    Definition matrixredistribute.hh:503
    \n-
    static void scatter(Container &cont, const typename M::size_type &rowsize, std::size_t i)
    Definition matrixredistribute.hh:507
    \n-
    CommMatrixRowSize< M, RI > Container
    Definition matrixredistribute.hh:501
    \n-
    Definition matrixredistribute.hh:518
    \n-
    M::ConstColIterator ColIter
    Definition matrixredistribute.hh:521
    \n-
    static void scatter(Container &cont, const GlobalIndex &gi, std::size_t i, std::size_t j)
    Definition matrixredistribute.hh:553
    \n-
    CommMatrixSparsityPattern< M, I > Container
    Definition matrixredistribute.hh:520
    \n-
    static GlobalIndex numlimits
    Definition matrixredistribute.hh:524
    \n-
    static ColIter col
    Definition matrixredistribute.hh:523
    \n-
    I::GlobalIndex GlobalIndex
    Definition matrixredistribute.hh:519
    \n-
    static const GlobalIndex & gather(const Container &cont, std::size_t i, std::size_t j)
    Definition matrixredistribute.hh:526
    \n-
    Definition matrixredistribute.hh:599
    \n-
    I::GlobalIndex GlobalIndex
    Definition matrixredistribute.hh:600
    \n-
    static Data datastore
    Definition matrixredistribute.hh:605
    \n-
    static GlobalIndex numlimits
    Definition matrixredistribute.hh:606
    \n-
    M::ConstColIterator ColIter
    Definition matrixredistribute.hh:602
    \n-
    static const Data & gather(const Container &cont, std::size_t i, std::size_t j)
    Definition matrixredistribute.hh:608
    \n-
    std::pair< GlobalIndex, typename M::block_type > Data
    Definition matrixredistribute.hh:603
    \n-
    static void scatter(Container &cont, const Data &data, std::size_t i, std::size_t j)
    Definition matrixredistribute.hh:638
    \n-
    static ColIter col
    Definition matrixredistribute.hh:604
    \n-
    CommMatrixRow< M, I > Container
    Definition matrixredistribute.hh:601
    \n-
    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy sema...
    Definition owneroverlapcopy.hh:174
    \n-
    EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet
    Definition owneroverlapcopy.hh:194
    \n-
    Definition pinfo.hh:28
    \n-
    Definition repartition.hh:260
    \n-
    @ nonoverlapping
    Category for non-overlapping solvers.
    Definition solvercategory.hh:27
    \n-
    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
    \n+
    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
    \n+
    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
    \n+
    auto rows(Matrix const &matrix)
    Definition foreach.hh:69
    \n+
    auto cols(Matrix const &matrix)
    Definition foreach.hh:72
    \n+
    auto size(Vector const &vector)
    Definition foreach.hh:75
    \n+
    A generic dynamic dense matrix.
    Definition matrix.hh:561
    \n+
    size_type M() const
    Return the number of columns.
    Definition matrix.hh:696
    \n+
    size_type N() const
    Return the number of rows.
    Definition matrix.hh:691
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n", "details": [{"source1": "html2text {}", "source2": "html2text {}", "unified_diff": "@@ -1,1173 +1,237 @@\n dune-istl\u00a02.10\n Loading...\n Searching...\n No Matches\n * _\bd_\bu_\bn_\be\n * _\bi_\bs_\bt_\bl\n-matrixredistribute.hh\n+foreach.hh\n _\bG_\bo_\b _\bt_\bo_\b _\bt_\bh_\be_\b _\bd_\bo_\bc_\bu_\bm_\be_\bn_\bt_\ba_\bt_\bi_\bo_\bn_\b _\bo_\bf_\b _\bt_\bh_\bi_\bs_\b _\bf_\bi_\bl_\be_\b.\n 1// SPDX-FileCopyrightText: Copyright \u00c2\u00a9 DUNE Project contributors, see file\n LICENSE.md in module root\n 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception\n-3// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-\n-4// vi: set et ts=4 sw=2 sts=2:\n-5#ifndef DUNE_ISTL_MATRIXREDISTRIBUTE_HH\n-6#define DUNE_ISTL_MATRIXREDISTRIBUTE_HH\n-7#include \n-8#include \"_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\b._\bh_\bh\"\n-9#include \n-10#include \n-11#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh>\n-12#include <_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bp_\ba_\ba_\bm_\bg_\b/_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh>\n-18namespace _\bD_\bu_\bn_\be\n-19{\n-20 template\n-_\b2_\b1 struct _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-22 {\n-_\b2_\b3 bool _\bi_\bs_\bS_\be_\bt_\bu_\bp() const\n-24 {\n-25 return false;\n-26 }\n-27 template\n-_\b2_\b8 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be([[maybe_unused]] const D& from, [[maybe_unused]] D& to)\n-const\n-29 {}\n-30\n-31 template\n-_\b3_\b2 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd([[maybe_unused]] D& from, [[maybe_unused]]const D&\n-to) const\n-33 {}\n-34\n-_\b3_\b5 void _\br_\be_\bs_\be_\bt_\bS_\be_\bt_\bu_\bp()\n-36 {}\n+3#pragma once\n+4\n+5#include\n+6#include\n+7#include\n+8\n+9#include\n+10#include\n+11#include\n+12#include\n+13\n+14#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+15#include<_\bd_\bu_\bn_\be_\b/_\bi_\bs_\bt_\bl_\b/_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh>\n+16\n+17namespace _\bD_\bu_\bn_\be{\n+18\n+19 namespace Impl {\n+20\n+21 // stolen from dune-functions: we call a type \"scalar\" if it does not\n+support index accessing\n+22 template\n+23 using StaticIndexAccessConcept = decltype(std::declval()[Dune::Indices::\n+_0]);\n+24\n+25 template\n+26 using IsScalar = std::negation>>;\n+27\n+28 // Type trait for matrix types that supports\n+29 // - iteration done row-wise\n+30 // - sparse iteration over nonzero entries\n+31 template \n+32 struct IsRowMajorSparse : std::false_type {};\n+33\n+34 // This is supported by the following matrix types:\n+35 template \n+36 struct IsRowMajorSparse> : std::true_type {};\n 37\n-_\b3_\b8 void _\bs_\be_\bt_\bN_\bo_\bR_\bo_\bw_\bs([[maybe_unused]] std::size_t size)\n-39 {}\n+38 template \n+39 struct IsRowMajorSparse> : std::true_type {};\n 40\n-_\b4_\b1 void _\bs_\be_\bt_\bN_\bo_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs([[maybe_unused]] std::size_t size)\n-42 {}\n+41 template \n+42 struct IsRowMajorSparse> : std::true_type {};\n 43\n-_\b4_\b4 void _\bs_\be_\bt_\bN_\bo_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs([[maybe_unused]] std::size_t size)\n-45 {}\n-46\n-_\b4_\b7 std::size_t _\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be([[maybe_unused]] std::size_t index) const\n-48 {\n-49 return -1;\n-50 }\n-51\n-_\b5_\b2 std::size_t _\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be([[maybe_unused]] std::size_t index) const\n-53 {\n-54 return -1;\n-55 }\n+44\n+45 template \n+46 auto rows(Matrix const& /*matrix*/, PriorityTag<2>) -> std::\n+integral_constant { return {}; }\n+47\n+48 template \n+49 auto cols(Matrix const& /*matrix*/, PriorityTag<2>) -> std::\n+integral_constant { return {}; }\n+50\n+51 template \n+52 auto rows(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.N())\n+{ return matrix.N(); }\n+53\n+54 template \n+55 auto cols(Matrix const& matrix, PriorityTag<1>) -> decltype(matrix.M())\n+{ return matrix.M(); }\n 56\n-_\b5_\b7 std::size_t _\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be([[maybe_unused]] std::size_t index)\n-const\n-58 {\n-59 return -1;\n-60 }\n-61\n-62 };\n+57 template \n+58 auto size(Vector const& /*vector*/, PriorityTag<2>) -> std::\n+integral_constant { return {}; }\n+59\n+60 template \n+61 auto size(Vector const& vector, PriorityTag<1>) -> decltype(vector.size())\n+{ return vector.size(); }\n+62\n 63\n-64#if HAVE_MPI\n-65 template\n-_\b6_\b6 class _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn<_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn >\n-67 {\n-68 public:\n-_\b6_\b9 typedef _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bT_\b,_\bT_\b1_\b> _\bC_\bo_\bm_\bm;\n+64 } // end namespace Impl\n+65\n+_\b6_\b6namespace ForEach{\n+67\n+68 template \n+_\b6_\b9 auto _\br_\bo_\bw_\bs(_\bM_\ba_\bt_\br_\bi_\bx const& matrix) { return Impl::rows(matrix, PriorityTag<5>\n+{}); }\n 70\n-_\b7_\b1 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn()\n-72 : interface(), setup_(false)\n-73 {}\n-74\n-_\b7_\b5 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be& _\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be()\n-76 {\n-77 return interface;\n-78 }\n-79 template\n-_\b8_\b0 void _\bc_\bh_\be_\bc_\bk_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be(const IS& source,\n-81 const IS& target, MPI_Comm comm)\n-82 {\n-83 auto ri = std::make_unique >(source, target, comm);\n-84 ri->template rebuild();\n-85 Interface inf;\n-86 typename _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bn_\bt_\b>_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt flags;\n-87 int rank;\n-88 MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n-89 inf.free();\n-90 inf.build(*ri, flags, flags);\n-91\n-92\n-93#ifdef DEBUG_REPART\n-94 if(inf!=interface) {\n-95\n-96 MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n-97 if(rank==0)\n-98 std::cout<<\"Interfaces do not match!\"<\n+_\b7_\b2 auto _\bc_\bo_\bl_\bs(_\bM_\ba_\bt_\br_\bi_\bx const& matrix) { return Impl::cols(matrix, PriorityTag<5>\n+{}); }\n+73\n+74 template \n+_\b7_\b5 auto _\bs_\bi_\bz_\be(Vector const& vector) { return Impl::size(vector, PriorityTag<5>\n+{}); }\n+76\n+77} // namespace ForEach\n+78\n+79\n+80\n+81\n+94template \n+_\b9_\b5std::size_t _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(Vector&& vector, F&& f, std::size_t offset = 0)\n+96{\n+97 using V = std::decay_t;\n+98 if constexpr( Impl::IsScalar::value )\n+99 {\n+100 f(vector, offset);\n+101 return 1;\n+102 }\n+103 else\n+104 {\n+105 std::size_t idx = 0;\n+106 Hybrid::forEach(Dune::range(_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bs_\bi_\bz_\be(vector)), [&](auto i) {\n+107 idx += _\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh(vector[i], f, offset + idx);\n+108 });\n+109 return idx;\n 110 }\n-111\n-_\b1_\b1_\b2 void _\br_\be_\bs_\be_\bt_\bS_\be_\bt_\bu_\bp()\n-113 {\n-114 setup_=false;\n-115 }\n-116\n-117 template\n-_\b1_\b1_\b8 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be(const D& from, D& to) const\n-119 {\n-120 BufferedCommunicator communicator;\n-121 communicator.template build(from,to, interface);\n-122 communicator.template forward(from, to);\n-123 communicator.free();\n-124 }\n-125 template\n-_\b1_\b2_\b6 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd(D& from, const D& to) const\n-127 {\n-128\n-129 BufferedCommunicator communicator;\n-130 communicator.template build(from,to, interface);\n-131 communicator.template backward(from, to);\n-132 communicator.free();\n-133 }\n-134\n-135 template\n-_\b1_\b3_\b6 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be(const D& from, D& to) const\n-137 {\n-138 redistribute >(from,to);\n+111}\n+112\n+113\n+131template \n+_\b1_\b3_\b2std::pair _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(_\bM_\ba_\bt_\br_\bi_\bx&& matrix, F&& f,\n+std::size_t rowOffset = 0, std::size_t colOffset = 0)\n+133{\n+134 using M = std::decay_t;\n+135 if constexpr ( Impl::IsScalar::value )\n+136 {\n+137 f(matrix,rowOffset,colOffset);\n+138 return {1,1};\n 139 }\n-140 template\n-_\b1_\b4_\b1 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd(D& from, const D& to) const\n-142 {\n-143 redistributeBackward >(from,to);\n-144 }\n-_\b1_\b4_\b5 bool _\bi_\bs_\bS_\be_\bt_\bu_\bp() const\n-146 {\n-147 return setup_;\n-148 }\n-149\n-_\b1_\b5_\b0 void _\br_\be_\bs_\be_\br_\bv_\be(std::size_t size)\n-151 {}\n-152\n-_\b1_\b5_\b3 std::size_t& _\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index)\n-154 {\n-155 return rowSize[index];\n-156 }\n-157\n-_\b1_\b5_\b8 std::size_t _\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index) const\n-159 {\n-160 return rowSize[index];\n-161 }\n-162\n-_\b1_\b6_\b3 std::size_t& _\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index)\n-164 {\n-165 return copyrowSize[index];\n-166 }\n-167\n-_\b1_\b6_\b8 std::size_t _\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index) const\n-169 {\n-170 return copyrowSize[index];\n-171 }\n-172\n-_\b1_\b7_\b3 std::size_t& _\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index)\n-174 {\n-175 return backwardscopyrowSize[index];\n+140 else\n+141 {\n+142 // if M supports the IsRowMajorSparse type trait: iterate just over the\n+nonzero entries and\n+143 // and compute the flat row/col size directly\n+144 if constexpr ( Impl::IsRowMajorSparse::value )\n+145 {\n+146 using Block = std::decay_t;\n+147\n+148 // find an existing block or at least try to create one\n+149 auto block = [&]{\n+150 for (auto const& row : matrix)\n+151 for (auto const& entry : row)\n+152 return entry;\n+153 return Block{};\n+154 }();\n+155\n+156 // compute the scalar size of the block\n+157 auto [blockRows, blockCols] = _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(block, [](...){});\n+158\n+159 // check whether we have valid sized blocks\n+160 assert( ( blockRows!=0 or blockCols!=0 ) and \"the block size can't be\n+zero\");\n+161\n+162 for (auto rowIt = matrix.begin(); rowIt != matrix.end(); ++rowIt)\n+163 {\n+164 auto&& row = *rowIt;\n+165 auto rowIdx = rowIt.index();\n+166 for (auto colIt = row.begin(); colIt != row.end(); colIt++)\n+167 {\n+168 auto&& entry = *colIt;\n+169 auto colIdx = colIt.index();\n+170#ifndef NDEBUG\n+171 // only instantiate return value in debug mode (for the assert)\n+172 auto [ numRows, numCols ] =\n+173#endif\n+174 _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(entry, f, rowOffset + rowIdx*blockRows, colOffset +\n+colIdx*blockCols);\n+175 assert( numRows == blockRows and numCols == blockCols and \"we need the same\n+size of each block in this matrix type\");\n 176 }\n-177\n-_\b1_\b7_\b8 std::size_t _\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(std::size_t index) const\n-179 {\n-180 return backwardscopyrowSize[index];\n-181 }\n-182\n-_\b1_\b8_\b3 void _\bs_\be_\bt_\bN_\bo_\bR_\bo_\bw_\bs(std::size_t rows)\n-184 {\n-185 rowSize.resize(rows, 0);\n-186 }\n-187\n-_\b1_\b8_\b8 void _\bs_\be_\bt_\bN_\bo_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs(std::size_t rows)\n-189 {\n-190 copyrowSize.resize(rows, 0);\n-191 }\n-192\n-_\b1_\b9_\b3 void _\bs_\be_\bt_\bN_\bo_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs(std::size_t rows)\n-194 {\n-195 backwardscopyrowSize.resize(rows, 0);\n+177 }\n+178\n+179 return { matrix.N()*blockRows, matrix.M()*blockCols };\n+180 }\n+181 // all other matrix types are accessed index-wise with dynamic flat row/col\n+counting\n+182 else\n+183 {\n+184 std::size_t r = 0, c = 0;\n+185 std::size_t nRows, nCols;\n+186\n+187 Hybrid::forEach(Dune::range(_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\br_\bo_\bw_\bs(matrix)), [&](auto i) {\n+188 c = 0;\n+189 Hybrid::forEach(Dune::range(_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bc_\bo_\bl_\bs(matrix)), [&](auto j) {\n+190 std::tie(nRows,nCols) = _\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh(matrix[i][j], f, rowOffset + r,\n+colOffset + c);\n+191 c += nCols;\n+192 });\n+193 r += nRows;\n+194 });\n+195 return {r,c};\n 196 }\n-197\n-198 private:\n-199 std::vector rowSize;\n-200 std::vector copyrowSize;\n-201 std::vector backwardscopyrowSize;\n-202 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be interface;\n-203 bool setup_;\n-204 };\n-205\n-214 template\n-_\b2_\b1_\b5 struct _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-216 {\n-217 // Make the default communication policy work.\n-_\b2_\b1_\b8 typedef typename M::size_type _\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be;\n-_\b2_\b1_\b9 typedef typename M::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-220\n-_\b2_\b2_\b6 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be(const M& m_, RI& rowsize_)\n-227 : _\bm_\ba_\bt_\br_\bi_\bx(m_), _\br_\bo_\bw_\bs_\bi_\bz_\be(rowsize_)\n-228 {}\n-_\b2_\b2_\b9 const M& _\bm_\ba_\bt_\br_\bi_\bx;\n-_\b2_\b3_\b0 RI& _\br_\bo_\bw_\bs_\bi_\bz_\be;\n-231\n-232 };\n-233\n-234\n-243 template\n-_\b2_\b4_\b4 struct _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n-245 {\n-_\b2_\b4_\b6 typedef typename M::size_type _\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be;\n-247\n-_\b2_\b5_\b4 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(const M& m_, const Dune::GlobalLookupIndexSet&\n-idxset_, const I& aggidxset_)\n-255 : _\bm_\ba_\bt_\br_\bi_\bx(m_), _\bi_\bd_\bx_\bs_\be_\bt(idxset_), _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt(aggidxset_), _\br_\bo_\bw_\bs_\bi_\bz_\be()\n-256 {}\n-257\n-_\b2_\b6_\b5 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(const M& m_, const Dune::GlobalLookupIndexSet&\n-idxset_, const I& aggidxset_,\n-266 const std::vector& rowsize_)\n-267 : _\bm_\ba_\bt_\br_\bi_\bx(m_), _\bi_\bd_\bx_\bs_\be_\bt(idxset_), _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt(aggidxset_), _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by\n-(aggidxset_.size()), _\br_\bo_\bw_\bs_\bi_\bz_\be(&rowsize_)\n-268 {}\n-269\n-_\b2_\b7_\b6 void _\bs_\bt_\bo_\br_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(M& m)\n-277 {\n-278 // insert diagonal to overlap rows\n-279 typedef typename Dune::GlobalLookupIndexSet::const_iterator IIter;\n-280 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bn_\bt_\b>_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n-OwnerSet;\n-281 std::size_t nnz=0;\n-282#ifdef DEBUG_REPART\n-283 int rank;\n-284\n-285 MPI_Comm_rank(MPI_COMM_WORLD, &rank);\n-286#endif\n-287 for(IIter i= _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.begin(), end=_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.end(); i!=end; ++i) {\n-288 if(!OwnerSet::contains(i->local().attribute())) {\n-289#ifdef DEBUG_REPART\n-290 std::cout<local()<local()].insert(i->local());\n-293 }\n-294\n-295 nnz+=_\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[i->local()].size();\n-296 }\n-297 assert( _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.size()==_\bs_\bp_\ba_\br_\bs_\bi_\bt_\by.size());\n-298\n-299 if(nnz>0) {\n-300 m.setSize(_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.size(), _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.size(), nnz);\n-301 m.setBuildMode(M::row_wise);\n-302 typename M::CreateIterator citer=m.createbegin();\n-303#ifdef DEBUG_REPART\n-304 std::size_t idx=0;\n-305 bool correct=true;\n-306 Dune::GlobalLookupIndexSet global(_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt);\n-307#endif\n-308 typedef typename std::vector >::const_iterator Iter;\n-309 for(Iter i=_\bs_\bp_\ba_\br_\bs_\bi_\bt_\by.begin(), end=_\bs_\bp_\ba_\br_\bs_\bi_\bt_\by.end(); i!=end; ++i, ++citer)\n-310 {\n-311 typedef typename std::set::const_iterator SIter;\n-312 for(SIter si=i->begin(), send=i->end(); si!=send; ++si)\n-313 citer.insert(*si);\n-314#ifdef DEBUG_REPART\n-315 if(i->find(idx)==i->end()) {\n-316 const typename I::IndexPair* gi=global.pair(idx);\n-317 assert(gi);\n-318 std::cout<global()<<\" attr=\"<local().attribute()<<\" \"<<\n-319 OwnerSet::contains(gi->local().attribute())<<\n-320 \" row size=\"<size()< >\n-add_sparsity)\n-341 {\n-342 for (unsigned int i = 0; i != _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by.size(); ++i) {\n-343 if (add_sparsity[i].size() != 0) {\n-344 typedef std::set Set;\n-345 Set tmp_set;\n-346 std::insert_iterator tmp_insert (tmp_set, tmp_set.begin());\n-347 std::set_union(add_sparsity[i].begin(), add_sparsity[i].end(),\n-348 _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[i].begin(), _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[i].end(), tmp_insert);\n-349 _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[i].swap(tmp_set);\n-350 }\n-351 }\n-352 }\n-353\n-_\b3_\b5_\b4 const M& _\bm_\ba_\bt_\br_\bi_\bx;\n-_\b3_\b5_\b5 typedef Dune::GlobalLookupIndexSet _\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt;\n-_\b3_\b5_\b6 const Dune::GlobalLookupIndexSet& _\bi_\bd_\bx_\bs_\be_\bt;\n-_\b3_\b5_\b7 const I& _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt;\n-_\b3_\b5_\b8 std::vector > _\bs_\bp_\ba_\br_\bs_\bi_\bt_\by;\n-_\b3_\b5_\b9 const std::vector* _\br_\bo_\bw_\bs_\bi_\bz_\be;\n-360 };\n-361\n-362 template\n-_\b3_\b6_\b3 struct CommPolicy<_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn >\n-364 {\n-_\b3_\b6_\b5 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\b> _\bT_\by_\bp_\be;\n-366\n-_\b3_\b7_\b1 typedef typename I::GlobalIndex _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be;\n-372\n-_\b3_\b7_\b4 typedef VariableSize _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg;\n-375\n-_\b3_\b7_\b6 static typename M::size_type _\bg_\be_\bt_\bS_\bi_\bz_\be(const _\bT_\by_\bp_\be& t, std::size_t i)\n-377 {\n-378 if(!t._\br_\bo_\bw_\bs_\bi_\bz_\be)\n-379 return t._\bm_\ba_\bt_\br_\bi_\bx[i].size();\n-380 else\n-381 {\n-382 assert((*t._\br_\bo_\bw_\bs_\bi_\bz_\be)[i]>0);\n-383 return (*t._\br_\bo_\bw_\bs_\bi_\bz_\be)[i];\n-384 }\n-385 }\n-386 };\n-387\n-394 template\n-_\b3_\b9_\b5 struct _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw\n-396 {\n-_\b4_\b0_\b5 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw(M& m_, const Dune::GlobalLookupIndexSet& idxset_, const I&\n-aggidxset_)\n-406 : _\bm_\ba_\bt_\br_\bi_\bx(m_), _\bi_\bd_\bx_\bs_\be_\bt(idxset_), _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt(aggidxset_), _\br_\bo_\bw_\bs_\bi_\bz_\be()\n-407 {}\n-408\n-_\b4_\b1_\b2 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw(M& m_, const Dune::GlobalLookupIndexSet& idxset_, const I&\n-aggidxset_,\n-413 std::vector& rowsize_)\n-414 : _\bm_\ba_\bt_\br_\bi_\bx(m_), _\bi_\bd_\bx_\bs_\be_\bt(idxset_), _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt(aggidxset_), _\br_\bo_\bw_\bs_\bi_\bz_\be(&rowsize_)\n-415 {}\n-_\b4_\b2_\b1 void _\bs_\be_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bR_\bo_\bw_\bs_\bT_\bo_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt()\n-422 {\n-423 typedef typename Dune::GlobalLookupIndexSet::const_iterator Iter;\n-424 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bn_\bt_\b>_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n-OwnerSet;\n-425\n-426 for(Iter i= _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.begin(), end=_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.end(); i!=end; ++i)\n-427 if(!OwnerSet::contains(i->local().attribute())) {\n-428 // Set to Dirchlet\n-429 typedef typename M::ColIterator CIter;\n-430 for(CIter c=_\bm_\ba_\bt_\br_\bi_\bx[i->local()].begin(), cend= _\bm_\ba_\bt_\br_\bi_\bx[i->local()].end();\n-431 c!= cend; ++c)\n-432 {\n-433 *c=0;\n-434 if(c.index()==i->local()) {\n-435 auto setDiagonal = [](auto&& scalarOrMatrix, const auto& value) {\n-436 auto&& matrixView = Dune::Impl::asMatrix(scalarOrMatrix);\n-437 for (auto rowIt = matrixView.begin(); rowIt != matrixView.end(); ++rowIt)\n-438 (*rowIt)[rowIt.index()] = value;\n-439 };\n-440 setDiagonal(*c, 1);\n-441 }\n-442 }\n-443 }\n-444 }\n-_\b4_\b4_\b6 M& _\bm_\ba_\bt_\br_\bi_\bx;\n-_\b4_\b4_\b8 const Dune::GlobalLookupIndexSet& _\bi_\bd_\bx_\bs_\be_\bt;\n-_\b4_\b5_\b0 const I& _\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt;\n-_\b4_\b5_\b2 std::vector* _\br_\bo_\bw_\bs_\bi_\bz_\be; // row sizes differ from sender side in\n-overlap!\n-453 };\n-454\n-455 template\n-_\b4_\b5_\b6 struct CommPolicy<_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw >\n-457 {\n-_\b4_\b5_\b8 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\b> _\bT_\by_\bp_\be;\n-459\n-_\b4_\b6_\b4 typedef std::pair\n-_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be;\n-465\n-_\b4_\b6_\b7 typedef VariableSize _\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg;\n-468\n-_\b4_\b6_\b9 static std::size_t _\bg_\be_\bt_\bS_\bi_\bz_\be(const _\bT_\by_\bp_\be& t, std::size_t i)\n-470 {\n-471 if(!t._\br_\bo_\bw_\bs_\bi_\bz_\be)\n-472 return t._\bm_\ba_\bt_\br_\bi_\bx[i].size();\n-473 else\n-474 {\n-475 assert((*t._\br_\bo_\bw_\bs_\bi_\bz_\be)[i]>0);\n-476 return (*t._\br_\bo_\bw_\bs_\bi_\bz_\be)[i];\n-477 }\n-478 }\n-479 };\n-480\n-481 template\n-_\b4_\b8_\b2 struct _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-483 {\n-_\b4_\b8_\b4 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b<_\bM_\b,_\bR_\bI_\b> _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n-485\n-_\b4_\b8_\b6 static const typename M::size_type _\bg_\ba_\bt_\bh_\be_\br(const _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, std::\n-size_t i)\n-487 {\n-488 return cont._\bm_\ba_\bt_\br_\bi_\bx[i].size();\n-489 }\n-_\b4_\b9_\b0 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, const typename M::size_type& rowsize,\n-std::size_t i)\n-491 {\n-492 assert(rowsize);\n-493 cont._\br_\bo_\bw_\bs_\bi_\bz_\be.getRowSize(i)=rowsize;\n-494 }\n-495\n-496 };\n-497\n-498 template\n-_\b4_\b9_\b9 struct _\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-500 {\n-_\b5_\b0_\b1 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b<_\bM_\b,_\bR_\bI_\b> _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n-502\n-_\b5_\b0_\b3 static const typename M::size_type _\bg_\ba_\bt_\bh_\be_\br(const _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, std::\n-size_t i)\n-504 {\n-505 return cont._\bm_\ba_\bt_\br_\bi_\bx[i].size();\n-506 }\n-_\b5_\b0_\b7 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, const typename M::size_type& rowsize,\n-std::size_t i)\n-508 {\n-509 assert(rowsize);\n-510 if (rowsize > cont._\br_\bo_\bw_\bs_\bi_\bz_\be.getCopyRowSize(i))\n-511 cont._\br_\bo_\bw_\bs_\bi_\bz_\be.getCopyRowSize(i)=rowsize;\n-512 }\n-513\n-514 };\n-515\n-516 template\n-_\b5_\b1_\b7 struct _\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-518 {\n-_\b5_\b1_\b9 typedef typename I::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-_\b5_\b2_\b0 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\b> _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n-_\b5_\b2_\b1 typedef typename M::ConstColIterator _\bC_\bo_\bl_\bI_\bt_\be_\br;\n-522\n-_\b5_\b2_\b3 static _\bC_\bo_\bl_\bI_\bt_\be_\br _\bc_\bo_\bl;\n-_\b5_\b2_\b4 static _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n-525\n-_\b5_\b2_\b6 static const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& _\bg_\ba_\bt_\bh_\be_\br(const _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, std::size_t i,\n-std::size_t j)\n-527 {\n-528 if(j==0)\n-529 _\bc_\bo_\bl=cont._\bm_\ba_\bt_\br_\bi_\bx[i].begin();\n-530 else if (_\bc_\bo_\bl!=cont._\bm_\ba_\bt_\br_\bi_\bx[i].end())\n-531 ++_\bc_\bo_\bl;\n-532\n-533 //copy communication: different row sizes for copy rows with the same\n-global index\n-534 //are possible. If all values of current matrix row are sent, send\n-535 //std::numeric_limits::max()\n-536 //and receiver will ignore it.\n-537 if (_\bc_\bo_\bl==cont._\bm_\ba_\bt_\br_\bi_\bx[i].end()) {\n-538 _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs = std::numeric_limits::max();\n-539 return _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n-540 }\n-541 else {\n-542 const typename I::IndexPair* index=cont._\bi_\bd_\bx_\bs_\be_\bt.pair(_\bc_\bo_\bl.index());\n-543 assert(index);\n-544 // Only send index if col is no ghost\n-545 if ( index->local().attribute() != 2)\n-546 return index->global();\n-547 else {\n-548 _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs = std::numeric_limits::max();\n-549 return _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n-550 }\n-551 }\n-552 }\n-_\b5_\b5_\b3 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, const _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx& gi, std::size_t i,\n-[[maybe_unused]] std::size_t j)\n-554 {\n-555 try{\n-556 if (gi != std::numeric_limits::max()) {\n-557 const typename I::IndexPair& ip=cont._\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.at(gi);\n-558 assert(ip.global()==gi);\n-559 std::size_t column = ip.local();\n-560 cont._\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[i].insert(column);\n-561\n-562 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bn_\bt_\b>_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n-OwnerSet;\n-563 if(!OwnerSet::contains(ip.local().attribute()))\n-564 // preserve symmetry for overlap\n-565 cont._\bs_\bp_\ba_\br_\bs_\bi_\bt_\by[column].insert(i);\n-566 }\n-567 }\n-568 catch(const Dune::RangeError&) {\n-569 // Entry not present in the new index set. Ignore!\n-570#ifdef DEBUG_REPART\n-571 typedef typename _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br_\b:_\b:_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt GlobalLookup;\n-572 typedef typename GlobalLookup::IndexPair IndexPair;\n-573 typedef typename _\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\bi_\bn_\bt_\b>_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n-OwnerSet;\n-574\n-575 GlobalLookup lookup(cont._\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt);\n-576 const IndexPair* pi=lookup.pair(i);\n-577 assert(pi);\n-578 if(OwnerSet::contains(pi->local().attribute())) {\n-579 int rank;\n-580 MPI_Comm_rank(MPI_COMM_WORLD,&rank);\n-581 std::cout<global()<\n-591 typename _\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br\n-_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bc_\bo_\bl;\n-592\n-593 template\n-594 typename _\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n-595\n-596\n-597 template\n-_\b5_\b9_\b8 struct _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-599 {\n-_\b6_\b0_\b0 typedef typename I::GlobalIndex _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx;\n-_\b6_\b0_\b1 typedef _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\b> _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br;\n-_\b6_\b0_\b2 typedef typename M::ConstColIterator _\bC_\bo_\bl_\bI_\bt_\be_\br;\n-_\b6_\b0_\b3 typedef typename std::pair _\bD_\ba_\bt_\ba;\n-_\b6_\b0_\b4 static _\bC_\bo_\bl_\bI_\bt_\be_\br _\bc_\bo_\bl;\n-_\b6_\b0_\b5 static _\bD_\ba_\bt_\ba _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be;\n-_\b6_\b0_\b6 static _\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n-607\n-_\b6_\b0_\b8 static const _\bD_\ba_\bt_\ba& _\bg_\ba_\bt_\bh_\be_\br(const _\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, std::size_t i, std::size_t\n-j)\n-609 {\n-610 if(j==0)\n-611 _\bc_\bo_\bl=cont._\bm_\ba_\bt_\br_\bi_\bx[i].begin();\n-612 else if (_\bc_\bo_\bl!=cont._\bm_\ba_\bt_\br_\bi_\bx[i].end())\n-613 ++_\bc_\bo_\bl;\n-614 // copy communication: different row sizes for copy rows with the same\n-global index\n-615 // are possible. If all values of current matrix row are sent, send\n-616 // std::numeric_limits::max()\n-617 // and receiver will ignore it.\n-618 if (_\bc_\bo_\bl==cont._\bm_\ba_\bt_\br_\bi_\bx[i].end()) {\n-619 _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs = std::numeric_limits::max();\n-620 _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be = _\bD_\ba_\bt_\ba(_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs,*_\bc_\bo_\bl);\n-621 return _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be;\n-622 }\n-623 else {\n-624 // convert local column index to global index\n-625 const typename I::IndexPair* index=cont._\bi_\bd_\bx_\bs_\be_\bt.pair(_\bc_\bo_\bl.index());\n-626 assert(index);\n-627 // Store the data to prevent reference to temporary\n-628 // Only send index if col is no ghost\n-629 if ( index->local().attribute() != 2)\n-630 _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be = _\bD_\ba_\bt_\ba(index->global(),*_\bc_\bo_\bl);\n-631 else {\n-632 _\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs = std::numeric_limits::max();\n-633 _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be = _\bD_\ba_\bt_\ba(_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs,*_\bc_\bo_\bl);\n-634 }\n-635 return _\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be;\n-636 }\n-637 }\n-_\b6_\b3_\b8 static void _\bs_\bc_\ba_\bt_\bt_\be_\br(_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br& cont, const _\bD_\ba_\bt_\ba& data, std::size_t i, [\n-[maybe_unused]] std::size_t j)\n-639 {\n-640 try{\n-641 if (data.first != std::numeric_limits::max()) {\n-642 typename M::size_type column=cont._\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt.at(data.first).local();\n-643 cont._\bm_\ba_\bt_\br_\bi_\bx[i][column]=data.second;\n-644 }\n-645 }\n-646 catch(const Dune::RangeError&) {\n-647 // This an overlap row and might therefore lack some entries!\n-648 }\n-649\n-650 }\n-651 };\n-652\n-653 template\n-654 typename _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:\n-_\bc_\bo_\bl;\n-655\n-656 template\n-657 typename _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bD_\ba_\bt_\ba _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:\n-_\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be;\n-658\n-659 template\n-660 typename _\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b<_\bM_\b,_\bI_\b>_\b:_\b:_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs;\n-661\n-662 template\n-_\b6_\b6_\b3 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(M& origMatrix, M& newMatrix, C& origComm,\n-C& newComm,\n-664 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bC_\b>& ri)\n-665 {\n-666 typename C::CopySet copyflags;\n-667 typename C::OwnerSet ownerflags;\n-668 typedef typename C::ParallelIndexSet IndexSet;\n-669 typedef _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bC_\b> RI;\n-670 std::vector rowsize(newComm.indexSet().size(), 0);\n-671 std::vector copyrowsize(newComm.indexSet().size(),\n-0);\n-672 std::vector backwardscopyrowsize(origComm.indexSet\n-().size(), 0);\n-673\n-674 // get owner rowsizes\n-675 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b<_\bM_\b,_\bR_\bI_\b> commRowSize(origMatrix, ri);\n-676 ri.template redistribute >\n-(commRowSize,commRowSize);\n-677\n-678 origComm.buildGlobalLookup();\n-679\n-680 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {\n-681 rowsize[i] = ri._\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be(i);\n-682 }\n-683 // get sparsity pattern from owner rows\n-684 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b>\n-685 origsp(origMatrix, origComm.globalLookup(), newComm.indexSet());\n-686 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b>\n-687 newsp(origMatrix, origComm.globalLookup(), newComm.indexSet(), rowsize);\n-688\n-689 ri.template redistribute >\n-(origsp,newsp);\n-690\n-691 // build copy to owner interface to get missing matrix values for novlp\n-case\n-692 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(origComm) == _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg) {\n-693 RemoteIndices *ris = new RemoteIndices\n-(origComm.indexSet(),\n-694 newComm.indexSet(),\n-695 origComm.communicator());\n-696 ris->template rebuild();\n-697\n-698 ri.getInterface().free();\n-699 ri.getInterface().build(*ris,copyflags,ownerflags);\n-700\n-701 // get copy rowsizes\n-702 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b<_\bM_\b,_\bR_\bI_\b> commRowSize_copy(origMatrix, ri);\n-703 ri.template redistribute >\n-(commRowSize_copy,\n-704 commRowSize_copy);\n-705\n-706 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {\n-707 copyrowsize[i] = ri._\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(i);\n-708 }\n-709 //get copy rowsizes for sender\n-710 ri._\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd(backwardscopyrowsize,copyrowsize);\n-711 for (std::size_t i=0; i < origComm.indexSet().size(); i++) {\n-712 ri._\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(i) = backwardscopyrowsize[i];\n-713 }\n-714\n-715 // get sparsity pattern from copy rows\n-716 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> origsp_copy(origMatrix,\n-717 origComm.globalLookup(),\n-718 newComm.indexSet(),\n-719 backwardscopyrowsize);\n-720 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> newsp_copy(origMatrix,\n-origComm.globalLookup(),\n-721 newComm.indexSet(), copyrowsize);\n-722 ri.template redistribute >\n-(origsp_copy,\n-723 newsp_copy);\n-724\n-725 newsp._\bc_\bo_\bm_\bp_\bl_\be_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(newsp_copy._\bs_\bp_\ba_\br_\bs_\bi_\bt_\by);\n-726 newsp._\bs_\bt_\bo_\br_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(newMatrix);\n-727 }\n-728 else\n-729 newsp._\bs_\bt_\bo_\br_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(newMatrix);\n-730\n-731#ifdef DUNE_ISTL_WITH_CHECKING\n-732 // Check for symmetry\n-733 int ret=0;\n-734 typedef typename M::ConstRowIterator RIter;\n-735 for(RIter row=newMatrix.begin(), rend=newMatrix.end(); row != rend; ++row)\n-{\n-736 typedef typename M::ConstColIterator CIter;\n-737 for(CIter _\bc_\bo_\bl=row->begin(), cend=row->end(); _\bc_\bo_\bl!=cend; ++_\bc_\bo_\bl)\n-738 {\n-739 try{\n-740 newMatrix[_\bc_\bo_\bl.index()][row.index()];\n-741 }catch(const _\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br&) {\n-742 std::cerr<\n-_\b7_\b5_\b7 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs(M& origMatrix, M& newMatrix, C& origComm, C&\n-newComm,\n-758 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bC_\b>& ri)\n-759 {\n-760 typedef typename C::ParallelIndexSet IndexSet;\n-761 typename C::OwnerSet ownerflags;\n-762 std::vector rowsize(newComm.indexSet().size(), 0);\n-763 std::vector copyrowsize(newComm.indexSet().size(),\n-0);\n-764 std::vector backwardscopyrowsize(origComm.indexSet\n-().size(), 0);\n-765\n-766 for (std::size_t i=0; i < newComm.indexSet().size(); i++) {\n-767 rowsize[i] = ri._\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be(i);\n-768 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(origComm) == _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg) {\n-769 copyrowsize[i] = ri._\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(i);\n-770 }\n-771 }\n-772\n-773 for (std::size_t i=0; i < origComm.indexSet().size(); i++)\n-774 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(origComm) == _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg)\n-775 backwardscopyrowsize[i] = ri._\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be(i);\n-776\n-777\n-778 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(origComm) == _\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg) {\n-779 // fill sparsity pattern from copy rows\n-780 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> origrow_copy(origMatrix, origComm.globalLookup(),\n-781 newComm.indexSet(), backwardscopyrowsize);\n-782 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b> newrow_copy(newMatrix, origComm.globalLookup(),\n-783 newComm.indexSet(),copyrowsize);\n-784 ri.template redistribute >(origrow_copy,\n-785 newrow_copy);\n-786 ri.getInterface().free();\n-787 RemoteIndices *ris = new RemoteIndices\n-(origComm.indexSet(),\n-788 newComm.indexSet(),\n-789 origComm.communicator());\n-790 ris->template rebuild();\n-791 ri.getInterface().build(*ris,ownerflags,ownerflags);\n-792 }\n-793\n-794 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b>\n-795 origrow(origMatrix, origComm.globalLookup(), newComm.indexSet());\n-796 _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\bM_\b,_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt_\b>\n-797 newrow(newMatrix, origComm.globalLookup(), newComm.indexSet(),rowsize);\n-798 ri.template redistribute >\n-(origrow,newrow);\n-799 if (_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by(origComm) != static_cast(_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:\n-_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg))\n-800 newrow._\bs_\be_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bR_\bo_\bw_\bs_\bT_\bo_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt();\n-801 }\n-802\n-819 template\n-_\b8_\b2_\b0 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(M& origMatrix, M& newMatrix, C& origComm, C&\n-newComm,\n-821 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bC_\b>& ri)\n-822 {\n-823 ri._\bs_\be_\bt_\bN_\bo_\bR_\bo_\bw_\bs(newComm.indexSet().size());\n-824 ri._\bs_\be_\bt_\bN_\bo_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs(newComm.indexSet().size());\n-825 ri._\bs_\be_\bt_\bN_\bo_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs(origComm.indexSet().size());\n-826 _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn(origMatrix, newMatrix, origComm, newComm, ri);\n-827 _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs(origMatrix, newMatrix, origComm, newComm, ri);\n-828 }\n-829#endif\n-830\n-831template\n-_\b8_\b3_\b2 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs(M& origMatrix, M& newMatrix,\n-833 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& origComm,\n-834 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& newComm,\n-835 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>& ri)\n-836 {\n-837 DUNE_THROW(InvalidStateException, \"Trying to redistribute in sequential\n-program!\");\n-838 }\n-839 template\n-_\b8_\b4_\b0 void _\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx(M& origMatrix, M& newMatrix,\n-841 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& origComm,\n-842 _\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn& newComm,\n-843 _\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b>& ri)\n-844 {\n-845 DUNE_THROW(InvalidStateException, \"Trying to redistribute in sequential\n-program!\");\n-846 }\n-847}\n-848#endif\n-_\bp_\bi_\bn_\bf_\bo_\b._\bh_\bh\n-_\br_\be_\bp_\ba_\br_\bt_\bi_\bt_\bi_\bo_\bn_\b._\bh_\bh\n-Functionality for redistributing a parallel index set using graph partitioning.\n-_\bo_\bw_\bn_\be_\br_\bo_\bv_\be_\br_\bl_\ba_\bp_\bc_\bo_\bp_\by_\b._\bh_\bh\n-Classes providing communication interfaces for overlapping Schwarz methods.\n-_\bc_\bo_\bl\n-Col col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixmatrix.hh:351\n+197 }\n+198}\n+199\n+200} // namespace Dune\n+_\bb_\bc_\br_\bs_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+Implementation of the BCRSMatrix class.\n+_\bs_\bc_\ba_\bl_\be_\bd_\bi_\bd_\bm_\ba_\bt_\br_\bi_\bx_\b._\bh_\bh\n+This file implements a quadratic matrix of fixed size which is a multiple of\n+the identity.\n _\bD_\bu_\bn_\be\n D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn allocator.hh:11\n-_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx_\bE_\bn_\bt_\br_\bi_\be_\bs\n-void redistributeMatrixEntries(M &origMatrix, M &newMatrix, C &origComm, C\n-&newComm, RedistributeInformation< C > &ri)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:757\n-_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n-void redistributeSparsityPattern(M &origMatrix, M &newMatrix, C &origComm, C\n-&newComm, RedistributeInformation< C > &ri)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:663\n-_\bD_\bu_\bn_\be_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bM_\ba_\bt_\br_\bi_\bx\n-void redistributeMatrix(M &origMatrix, M &newMatrix, C &origComm, C &newComm,\n-RedistributeInformation< C > &ri)\n-Redistribute a matrix according to given domain decompositions.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:820\n-_\bD_\bu_\bn_\be_\b:_\b:_\bI_\bS_\bT_\bL_\bE_\br_\br_\bo_\br\n-derive error class from the base class in common\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn istlexception.hh:19\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:22\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bN_\bo_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs\n-void setNoBackwardsCopyRows(std::size_t size)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:44\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be\n-void redistribute(const D &from, D &to) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bs_\be_\bt_\bS_\be_\bt_\bu_\bp\n-void resetSetup()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:35\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bN_\bo_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs\n-void setNoCopyRows(std::size_t size)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:41\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bi_\bs_\bS_\be_\bt_\bu_\bp\n-bool isSetup() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:23\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bs_\be_\bt_\bN_\bo_\bR_\bo_\bw_\bs\n-void setNoRows(std::size_t size)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:38\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd\n-void redistributeBackward(D &from, const D &to) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:32\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t getBackwardsCopyRowSize(std::size_t index) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:57\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t getRowSize(std::size_t index) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:47\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t getCopyRowSize(std::size_t index) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:52\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t getRowSize(std::size_t index) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:158\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t & getBackwardsCopyRowSize(std::size_t index)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:173\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bg_\be_\bt_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-RedistributeInterface & getInterface()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:75\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be\n-void redistribute(const D &from, D &to) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:136\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bs_\be_\bt_\bN_\bo_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs\n-void setNoBackwardsCopyRows(std::size_t rows)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:193\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t & getCopyRowSize(std::size_t index)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:163\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-RedistributeInformation()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:71\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bg_\be_\bt_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t getCopyRowSize(std::size_t index) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:168\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bs_\be_\bt_\bN_\bo_\bR_\bo_\bw_\bs\n-void setNoRows(std::size_t rows)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:183\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\br_\be_\bs_\be_\br_\bv_\be\n-void reserve(std::size_t size)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:150\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:_\bC_\bo_\bm_\bm\n-OwnerOverlapCopyCommunication< T, T1 > Comm\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:69\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bs_\be_\bt_\bN_\bo_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bs\n-void setNoCopyRows(std::size_t rows)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:188\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd\n-void redistributeBackward(D &from, const D &to) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:141\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bs_\be_\bt_\bS_\be_\bt_\bu_\bp\n-void setSetup()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:106\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bg_\be_\bt_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd_\bs_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t getBackwardsCopyRowSize(std::size_t index) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:178\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be\n-void redistribute(const D &from, D &to) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:118\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\br_\be_\bs_\be_\bt_\bS_\be_\bt_\bu_\bp\n-void resetSetup()\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:112\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\br_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bB_\ba_\bc_\bk_\bw_\ba_\br_\bd\n-void redistributeBackward(D &from, const D &to) const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:126\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bc_\bh_\be_\bc_\bk_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-void checkInterface(const IS &source, const IS &target, MPI_Comm comm)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:80\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bi_\bs_\bS_\be_\bt_\bu_\bp\n-bool isSetup() const\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:145\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b<_\b _\bT_\b,_\b _\bT_\b1_\b _\b>_\b _\b>_\b:_\b:\n-_\bg_\be_\bt_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-std::size_t & getRowSize(std::size_t index)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:153\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-Utility class to communicate and set the row sizes of a redistributed matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:216\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-M::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:219\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b:_\b:_\bv_\ba_\bl_\bu_\be_\b__\bt_\by_\bp_\be\n-M::size_type value_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:218\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b:_\b:_\br_\bo_\bw_\bs_\bi_\bz_\be\n-RI & rowsize\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:230\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n-const M & matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:229\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be\n-CommMatrixRowSize(const M &m_, RI &rowsize_)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:226\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n-Utility class to communicate and build the sparsity pattern of a redistributed\n-matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:245\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bs_\bi_\bz_\be_\b__\bt_\by_\bp_\be\n-M::size_type size_type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:246\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bi_\bd_\bx_\bs_\be_\bt\n-const Dune::GlobalLookupIndexSet< I > & idxset\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:356\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bs_\bt_\bo_\br_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n-void storeSparsityPattern(M &m)\n-Creates and stores the sparsity pattern of the redistributed matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:276\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt\n-const I & aggidxset\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:357\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\br_\bo_\bw_\bs_\bi_\bz_\be\n-const std::vector< size_type > * rowsize\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:359\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bc_\bo_\bm_\bp_\bl_\be_\bt_\be_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n-void completeSparsityPattern(std::vector< std::set< size_type > > add_sparsity)\n-Completes the sparsity pattern of the redistributed matrix with data from copy\n-rows for the novlp cas...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:340\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n-CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I >\n-&idxset_, const I &aggidxset_)\n-Constructor for the original side.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:254\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n-const M & matrix\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:354\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn\n-CommMatrixSparsityPattern(const M &m_, const Dune::GlobalLookupIndexSet< I >\n-&idxset_, const I &aggidxset_, const std::vector< typename M::size_type >\n-&rowsize_)\n-Constructor for the redistruted side.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:265\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bs_\bp_\ba_\br_\bs_\bi_\bt_\by\n-std::vector< std::set< size_type > > sparsity\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:358\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b:_\b:_\bL_\bo_\bo_\bk_\bu_\bp_\bI_\bn_\bd_\be_\bx_\bS_\be_\bt\n-Dune::GlobalLookupIndexSet< I > LookupIndexSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:355\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bS_\bi_\bz_\be\n-static M::size_type getSize(const Type &t, std::size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:376\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n-CommMatrixSparsityPattern< M, I > Type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:365\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be\n-I::GlobalIndex IndexedType\n-The indexed type we send. This is the global index indentitfying the column.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:371\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg\n-VariableSize IndexedTypeFlag\n-Each row varies in size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:374\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw\n-Utility class for comunicating the matrix entries.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:396\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\br_\bo_\bw_\bs_\bi_\bz_\be\n-std::vector< size_t > * rowsize\n-row size information for the receiving side.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:452\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\bm_\ba_\bt_\br_\bi_\bx\n-M & matrix\n-The matrix to communicate the values of.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:446\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw\n-CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I\n-&aggidxset_, std::vector< size_t > &rowsize_)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:412\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\bi_\bd_\bx_\bs_\be_\bt\n-const Dune::GlobalLookupIndexSet< I > & idxset\n-Index set for the original matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:448\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\bs_\be_\bt_\bO_\bv_\be_\br_\bl_\ba_\bp_\bR_\bo_\bw_\bs_\bT_\bo_\bD_\bi_\br_\bi_\bc_\bh_\bl_\be_\bt\n-void setOverlapRowsToDirichlet()\n-Sets the non-owner rows correctly as Dirichlet boundaries.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:421\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\ba_\bg_\bg_\bi_\bd_\bx_\bs_\be_\bt\n-const I & aggidxset\n-Index set for the redistributed matrix.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:450\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b:_\b:_\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw\n-CommMatrixRow(M &m_, const Dune::GlobalLookupIndexSet< I > &idxset_, const I\n-&aggidxset_)\n-Constructor.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:405\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be\n-std::pair< typename I::GlobalIndex, typename M::block_type > IndexedType\n-The indexed type we send. This is the pair of global index indentitfying the\n-column and the value its...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:464\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bT_\by_\bp_\be\n-CommMatrixRow< M, I > Type\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:458\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bg_\be_\bt_\bS_\bi_\bz_\be\n-static std::size_t getSize(const Type &t, std::size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:469\n-_\bD_\bu_\bn_\be_\b:_\b:_\bC_\bo_\bm_\bm_\bP_\bo_\bl_\bi_\bc_\by_\b<_\b _\bC_\bo_\bm_\bm_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\b<_\b _\bM_\b,_\b _\bI_\b _\b>_\b _\b>_\b:_\b:_\bI_\bn_\bd_\be_\bx_\be_\bd_\bT_\by_\bp_\be_\bF_\bl_\ba_\bg\n-VariableSize IndexedTypeFlag\n-Each row varies in size.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:467\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:483\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n-static void scatter(Container &cont, const typename M::size_type &rowsize,\n-std::size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:490\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n-static const M::size_type gather(const Container &cont, std::size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:486\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-CommMatrixRowSize< M, RI > Container\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:484\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:500\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n-static const M::size_type gather(const Container &cont, std::size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:503\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n-static void scatter(Container &cont, const typename M::size_type &rowsize,\n-std::size_t i)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:507\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bC_\bo_\bp_\by_\bR_\bo_\bw_\bS_\bi_\bz_\be_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-CommMatrixRowSize< M, RI > Container\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:501\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:518\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br\n-M::ConstColIterator ColIter\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:521\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n-static void scatter(Container &cont, const GlobalIndex &gi, std::size_t i,\n-std::size_t j)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:553\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-CommMatrixSparsityPattern< M, I > Container\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:520\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs\n-static GlobalIndex numlimits\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:524\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bc_\bo_\bl\n-static ColIter col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:523\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-I::GlobalIndex GlobalIndex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:519\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bS_\bp_\ba_\br_\bs_\bi_\bt_\by_\bP_\ba_\bt_\bt_\be_\br_\bn_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n-static const GlobalIndex & gather(const Container &cont, std::size_t i, std::\n-size_t j)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:526\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:599\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bG_\bl_\bo_\bb_\ba_\bl_\bI_\bn_\bd_\be_\bx\n-I::GlobalIndex GlobalIndex\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:600\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bd_\ba_\bt_\ba_\bs_\bt_\bo_\br_\be\n-static Data datastore\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:605\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bn_\bu_\bm_\bl_\bi_\bm_\bi_\bt_\bs\n-static GlobalIndex numlimits\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:606\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bl_\bI_\bt_\be_\br\n-M::ConstColIterator ColIter\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:602\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bg_\ba_\bt_\bh_\be_\br\n-static const Data & gather(const Container &cont, std::size_t i, std::size_t j)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:608\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bD_\ba_\bt_\ba\n-std::pair< GlobalIndex, typename M::block_type > Data\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:603\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bs_\bc_\ba_\bt_\bt_\be_\br\n-static void scatter(Container &cont, const Data &data, std::size_t i, std::\n-size_t j)\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:638\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bc_\bo_\bl\n-static ColIter col\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:604\n-_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\bR_\bo_\bw_\bG_\ba_\bt_\bh_\be_\br_\bS_\bc_\ba_\bt_\bt_\be_\br_\b:_\b:_\bC_\bo_\bn_\bt_\ba_\bi_\bn_\be_\br\n-CommMatrixRow< M, I > Container\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrixredistribute.hh:601\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn\n-A class setting up standard communication for a two-valued attribute set with\n-owner/overlap/copy sema...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:174\n-_\bD_\bu_\bn_\be_\b:_\b:_\bO_\bw_\bn_\be_\br_\bO_\bv_\be_\br_\bl_\ba_\bp_\bC_\bo_\bp_\by_\bC_\bo_\bm_\bm_\bu_\bn_\bi_\bc_\ba_\bt_\bi_\bo_\bn_\b:_\b:_\bO_\bw_\bn_\be_\br_\bS_\be_\bt\n-EnumItem< AttributeSet, OwnerOverlapCopyAttributeSet::owner > OwnerSet\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn owneroverlapcopy.hh:194\n-_\bD_\bu_\bn_\be_\b:_\b:_\bA_\bm_\bg_\b:_\b:_\bS_\be_\bq_\bu_\be_\bn_\bt_\bi_\ba_\bl_\bI_\bn_\bf_\bo_\br_\bm_\ba_\bt_\bi_\bo_\bn\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn pinfo.hh:28\n-_\bD_\bu_\bn_\be_\b:_\b:_\bR_\be_\bd_\bi_\bs_\bt_\br_\bi_\bb_\bu_\bt_\be_\bI_\bn_\bt_\be_\br_\bf_\ba_\bc_\be\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn repartition.hh:260\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bn_\bo_\bn_\bo_\bv_\be_\br_\bl_\ba_\bp_\bp_\bi_\bn_\bg\n-@ nonoverlapping\n-Category for non-overlapping solvers.\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:27\n-_\bD_\bu_\bn_\be_\b:_\b:_\bS_\bo_\bl_\bv_\be_\br_\bC_\ba_\bt_\be_\bg_\bo_\br_\by_\b:_\b:_\bc_\ba_\bt_\be_\bg_\bo_\br_\by\n-static Category category(const OP &op, decltype(op.category()) *=nullptr)\n-Helperfunction to extract the solver category either from an enum, or from the\n-newly introduced virtu...\n-D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn solvercategory.hh:34\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bM_\ba_\bt_\br_\bi_\bx_\bF_\bo_\br_\bE_\ba_\bc_\bh\n+std::pair< std::size_t, std::size_t > flatMatrixForEach(Matrix &&matrix, F &&f,\n+std::size_t rowOffset=0, std::size_t colOffset=0)\n+Traverse a blocked matrix and call a functor at each scalar entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:132\n+_\bD_\bu_\bn_\be_\b:_\b:_\bf_\bl_\ba_\bt_\bV_\be_\bc_\bt_\bo_\br_\bF_\bo_\br_\bE_\ba_\bc_\bh\n+std::size_t flatVectorForEach(Vector &&vector, F &&f, std::size_t offset=0)\n+Traverse a blocked vector and call a functor at each scalar entry.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:95\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\br_\bo_\bw_\bs\n+auto rows(Matrix const &matrix)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:69\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bc_\bo_\bl_\bs\n+auto cols(Matrix const &matrix)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:72\n+_\bD_\bu_\bn_\be_\b:_\b:_\bF_\bo_\br_\bE_\ba_\bc_\bh_\b:_\b:_\bs_\bi_\bz_\be\n+auto size(Vector const &vector)\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn foreach.hh:75\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx\n+A generic dynamic dense matrix.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:561\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bM\n+size_type M() const\n+Return the number of columns.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:696\n+_\bD_\bu_\bn_\be_\b:_\b:_\bM_\ba_\bt_\br_\bi_\bx_\b:_\b:_\bN\n+size_type N() const\n+Return the number of rows.\n+D\bDe\bef\bfi\bin\bni\bit\bti\bio\bon\bn matrix.hh:691\n ===============================================================================\n Generated by\u00a0_\b[_\bd_\bo_\bx_\by_\bg_\be_\bn_\b] 1.9.8\n"}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00236.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00236.html", "unified_diff": "@@ -105,25 +105,25 @@\n  \n  Sparse Matrix and Vector classes\n  Matrix and Vector classes that support a block recursive structure capable of representing the natural structure from Finite Element discretisations.
    \n  \n \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n

    \n 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.
     
    \n \n \n \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00237.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00237.html", "unified_diff": "@@ -104,19 +104,19 @@\n \n \n \n \n

    \n 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.
     
    \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n

    \n 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.
     
    \n \n \n \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00239.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00239.html", "unified_diff": "@@ -83,16 +83,16 @@\n \"\"\n \"\"\n \n \n

    \n Classes

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

    \n Files

    file  owneroverlapcopy.hh
     Classes providing communication interfaces for overlapping Schwarz methods.
    file  owneroverlapcopy.hh
     Classes providing communication interfaces for overlapping Schwarz methods.
     
    \n \n \n \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00240.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00240.html", "unified_diff": "@@ -105,19 +105,19 @@\n \n \n \n \n

    \n Classes

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

    \n 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.
     
    \n \n \n \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00242.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00242.html", "unified_diff": "@@ -83,16 +83,16 @@\n \"\"\n \"\"\n \n \n

    \n Classes

    struct  Dune::MatrixDimension< M >
     
    struct  Dune::CompressionStatistics< size_type >
    \n \n-\n-\n+\n+\n \n

    \n 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.
     
    \n \n \n \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00243.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00243.html", "unified_diff": "@@ -92,61 +92,61 @@\n \"\"\n \"\"\n \n \n

    \n Classes

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

    \n 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.
     
    \n \n \n \n

    \n Namespaces

    namespace  Dune
     
    \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00245.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00245.html", "unified_diff": "@@ -99,19 +99,19 @@\n \n \n \n \n
     
     Fast (sequential) Algebraic Multigrid
     An Algebraic Multigrid based on Agglomeration that saves memory bandwidth.
     
    \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n

    \n 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.
     
    \n \n \n \n

    \n Namespaces

    namespace  Dune::Amg
     
    \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00246.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00246.html", "unified_diff": "@@ -86,16 +86,16 @@\n \"\"\n \"\"\n \n \n
    \n \n-\n-\n+\n+\n \n

    \n Files

    file  scalarproducts.hh
     Define base class for scalar product and norm.
    file  scalarproducts.hh
     Define base class for scalar product and norm.
     
    \n \n \n \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a00249.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a00249.html", "unified_diff": "@@ -89,19 +89,19 @@\n \"\"\n \"\"\n \n \n

    \n Classes

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

    \n 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.
     
    \n \n \n \n

    \n Namespaces

    namespace  Dune::MatrixMarketImpl
     
    \n@@ -319,16 +319,16 @@\n \n \n
    \n inline
    \n
    \n \n

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

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

    ◆ loadMatrixMarket() [1/2]

    \n \n
    \n@@ -741,15 +741,15 @@\n )\n \n \n \n
    \n \n

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

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

    ◆ print_row() [2/2]

    \n \n
    \n@@ -804,15 +804,15 @@\n )\n \n \n \n
    \n \n

    Print one row of a matrix.

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

    ◆ printmatrix()

    \n \n
    \n@@ -861,15 +861,15 @@\n )\n \n \n \n
    \n \n

    Print a generic block matrix.

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

    ◆ printSparseMatrix()

    \n \n@@ -919,15 +919,15 @@\n )\n \n \n \n
    \n \n

    Prints a BCRSMatrix with fixed sized blocks.

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

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

    \n

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

    \n
    Parameters
    \n \n \n \n \n@@ -995,15 +995,15 @@\n \n \n \n
    sThe ostream to print to.
    matThe matrix to print.
    titleThe title for the matrix.
    )
    \n
    \n \n

    Print an ISTL vector.

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

    ◆ readMatrixMarket() [1/2]

    \n \n
    \n@@ -1132,15 +1132,15 @@\n )\n \n \n \n
    \n \n

    Recursively print a vector.

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

    ◆ storeMatrixMarket() [1/2]

    \n \n
    \n@@ -1383,15 +1383,15 @@\n )\n \n \n \n
    \n \n

    Writes sparse matrix in a Matlab-readable format.

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

    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'));
    \n
    Parameters
    \n \n \n \n \n
    matrixreference to matrix
    filename
    outputPrecision(number of digits) which is used to write the output file
    \n@@ -1437,15 +1437,15 @@\n )\n \n \n \n
    \n \n

    Helper method for the writeMatrixToMatlab routine.

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

    This specialization for numbers ends the recursion

    \n \n
    \n
    \n \n

    ◆ writeMatrixToMatlabHelper() [2/2]

    \n \n@@ -1483,15 +1483,15 @@\n )\n \n \n \n
    \n \n

    Helper method for the writeMatrixToMatlab routine.

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

    ◆ writeSVGMatrix() [1/2]

    \n \n
    \n@@ -1631,15 +1631,15 @@\n )\n \n \n \n
    \n \n

    Writes vectors in a Matlab-readable format.

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

    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');
    \n
    Parameters
    \n \n \n \n \n
    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
    \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01088.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01088.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::exists< T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/allocator.hh>

    \n+

    #include <dune/istl/allocator.hh>

    \n \n \n \n \n

    \n Static Public Attributes

    static const bool value = true
     
    \n

    Member Data Documentation

    \n@@ -109,15 +109,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01092.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01092.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::DefaultAllocatorTraits< T, typename > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/allocator.hh>

    \n+

    #include <dune/istl/allocator.hh>

    \n
    \n Inheritance diagram for Dune::DefaultAllocatorTraits< T, typename >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -111,15 +111,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01096.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01096.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::DefaultAllocatorTraits< T, std::void_t< typename T::allocator_type > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/allocator.hh>

    \n+

    #include <dune/istl/allocator.hh>

    \n \n \n \n \n

    \n Public Types

    using type = typename T::allocator_type
     
    \n

    Member Typedef Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01100.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01100.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::AllocatorTraits< T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/allocator.hh>

    \n+

    #include <dune/istl/allocator.hh>

    \n
    \n Inheritance diagram for Dune::AllocatorTraits< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -119,15 +119,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01124.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01124.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::OverlappingSchwarzInitializer< I, S, D > Class Template Reference
    \n \n
    \n \n

    Initializer for SuperLU Matrices representing the subdomains. \n More...

    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n \n \n@@ -255,16 +255,16 @@\n
    \n \n

    The vector type containing the subdomain to row index mapping.

    \n \n
    \n \n
    The documentation for this class was generated from the following files:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01140.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01140.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::MatrixDimension< M > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n

    \n Public Types

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

    \n Static Public Member Functions

    static auto rowdim (const M &A)
     
    static auto coldim (const M &A)
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following files:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01144.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01144.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::CompressionStatistics< size_type > Struct Template Reference
    \n \n
    \n \n

    Statistics about compression achieved in implicit mode. \n More...

    \n \n-

    #include <dune/istl/bcrsmatrix.hh>

    \n+

    #include <dune/istl/bcrsmatrix.hh>

    \n \n \n \n \n \n \n@@ -175,15 +175,15 @@\n
    \n \n

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

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01148.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01148.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::ImplicitMatrixBuilder< M_ > Class Template Reference
    \n \n
    \n \n

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

    \n \n-

    #include <dune/istl/bcrsmatrix.hh>

    \n+

    #include <dune/istl/bcrsmatrix.hh>

    \n

    \n Public Attributes

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

    \n Classes

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

    Returns a proxy for entries in row i.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01152.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01152.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::ImplicitMatrixBuilder< M_ >::row_object Class Reference
    \n \n
    \n \n

    Proxy row object for entry access. \n More...

    \n \n-

    #include <dune/istl/bcrsmatrix.hh>

    \n+

    #include <dune/istl/bcrsmatrix.hh>

    \n
    \n \n \n \n \n

    \n Public Member Functions

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

    Returns entry in column j.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01156.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01156.html", "unified_diff": "@@ -84,15 +84,15 @@\n
    Dune::BCRSMatrix< B, A > Class Template Reference
    \n \n
    \n \n

    A sparse block matrix with compressed row storage. \n More...

    \n \n-

    #include <dune/istl/bcrsmatrix.hh>

    \n+

    #include <dune/istl/bcrsmatrix.hh>

    \n
    \n Inheritance diagram for Dune::BCRSMatrix< B, A >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -448,15 +448,15 @@\n

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

    \n

    Details:

    \n
      \n
    1. Row-wise scheme
    2. \n
    \n

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

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

    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.

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

    \n

    for all \"$i$\", where \"$ is the total size of the compression buffer determined by the parameters explained above.

    \n

    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.

    \n

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

    \n

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

    \n-

    The following sample code constructs a \"$ 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.

    \n+

    The following sample code constructs a \"$ 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.

    \n
    \n \n
    M m(10, 10, 2, 0.4, M::implicit);
    \n
    \n
    // Fill in some arbitrary entries; the order is irrelevant.
    \n
    // Even operations on these would be possible, you get a reference to the entry!
    \n
    m.entry(0,0) = 0.;
    \n@@ -3784,15 +3784,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01160.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01160.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::BCRSMatrix< B, A >::RealRowIterator< T > Class Template Reference
    \n
    \n
    \n \n

    Iterator access to matrix rows \n More...

    \n \n-

    #include <dune/istl/bcrsmatrix.hh>

    \n+

    #include <dune/istl/bcrsmatrix.hh>

    \n
    \n Inheritance diagram for Dune::BCRSMatrix< B, A >::RealRowIterator< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -408,15 +408,15 @@\n
    \n \n

    return index

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01164.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01164.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::BCRSMatrix< B, A >::CreateIterator Class Reference
    \n \n
    \n \n

    Iterator class for sequential creation of blocks \n More...

    \n \n-

    #include <dune/istl/bcrsmatrix.hh>

    \n+

    #include <dune/istl/bcrsmatrix.hh>

    \n \n \n \n \n \n \n@@ -362,15 +362,15 @@\n \n

    Get the current row size.

    \n
    Returns
    The number of indices already inserted for the current row.
    \n \n \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01168.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01168.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::FieldTraits< BCRSMatrix< B, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/bcrsmatrix.hh>

    \n+

    #include <dune/istl/bcrsmatrix.hh>

    \n

    \n Public Member Functions

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

    \n Public Types

    using field_type = typename BCRSMatrix< B, A >::field_type
     
    using real_type = typename FieldTraits< field_type >::real_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01172.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01172.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::BDMatrix< B, A > Class Template Reference
    \n \n
    \n \n

    A block-diagonal matrix. \n More...

    \n \n-

    #include <dune/istl/bdmatrix.hh>

    \n+

    #include <dune/istl/bdmatrix.hh>

    \n
    \n Inheritance diagram for Dune::BDMatrix< B, A >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -3507,15 +3507,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01176.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01176.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::FieldTraits< BDMatrix< B, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/bdmatrix.hh>

    \n+

    #include <dune/istl/bdmatrix.hh>

    \n \n \n \n \n \n \n@@ -119,15 +119,15 @@\n \n

    \n Public Types

    using field_type = typename BDMatrix< B, A >::field_type
     
    using real_type = typename FieldTraits< field_type >::real_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01180.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01180.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::MultiTypeBlockVector< Args > Class Template Reference
    \n \n
    \n \n

    A Vector class to support different block types. \n More...

    \n \n-

    #include <dune/istl/multitypeblockvector.hh>

    \n+

    #include <dune/istl/multitypeblockvector.hh>

    \n
    \n Inheritance diagram for Dune::MultiTypeBlockVector< Args >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -177,16 +177,16 @@\n  \n \n

    Detailed Description

    \n
    template<typename... Args>
    \n class Dune::MultiTypeBlockVector< Args >

    A Vector class to support different block types.

    \n

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

    \n

    The documentation for this class was generated from the following files:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01184.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01184.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::MultiTypeBlockMatrix< FirstRow, Args > Class Template Reference
    \n
    \n
    \n \n

    A Matrix class to support different block types. \n More...

    \n \n-

    #include <dune/istl/multitypeblockmatrix.hh>

    \n+

    #include <dune/istl/multitypeblockmatrix.hh>

    \n
    \n Inheritance diagram for Dune::MultiTypeBlockMatrix< FirstRow, Args >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -203,16 +203,16 @@\n  \n \n

    Detailed Description

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

    A Matrix class to support different block types.

    \n

    This matrix class combines MultiTypeBlockVector elements as rows.

    \n

    The documentation for this class was generated from the following files:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01220.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01220.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::BTDMatrix< B, A > Class Template Reference
    \n
    \n
    \n \n

    A block-tridiagonal matrix. \n More...

    \n \n-

    #include <dune/istl/btdmatrix.hh>

    \n+

    #include <dune/istl/btdmatrix.hh>

    \n
    \n Inheritance diagram for Dune::BTDMatrix< B, A >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -3442,15 +3442,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01224.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01224.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::FieldTraits< BTDMatrix< B, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/btdmatrix.hh>

    \n+

    #include <dune/istl/btdmatrix.hh>

    \n \n \n \n \n \n \n@@ -119,15 +119,15 @@\n \n

    \n Public Types

    using field_type = typename BTDMatrix< B, A >::field_type
     
    using real_type = typename FieldTraits< field_type >::real_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01248.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01248.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::BlockVector< B, A > Class Template Reference
    \n \n
    \n \n

    A vector of blocks with memory management. \n More...

    \n \n-

    #include <dune/istl/bvector.hh>

    \n+

    #include <dune/istl/bvector.hh>

    \n
    \n Inheritance diagram for Dune::BlockVector< B, A >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -700,15 +700,15 @@\n
    \n \n

    swap operation

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01252.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01252.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::FieldTraits< BlockVector< B, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/bvector.hh>

    \n+

    #include <dune/istl/bvector.hh>

    \n \n \n \n \n \n \n@@ -119,15 +119,15 @@\n \n

    \n Public Types

    typedef FieldTraits< B >::field_type field_type
     
    typedef FieldTraits< B >::real_type real_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01288.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01288.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::Cholmod< Vector, Index > Class Template Reference
    \n \n
    \n \n

    Dune wrapper for SuiteSparse/CHOLMOD solver. \n More...

    \n \n-

    #include <dune/istl/cholmod.hh>

    \n+

    #include <dune/istl/cholmod.hh>

    \n
    \n Inheritance diagram for Dune::Cholmod< Vector, Index >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -874,15 +874,15 @@\n \n \n \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01292.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01292.html", "unified_diff": "@@ -77,15 +77,15 @@\n Classes |\n Public Member Functions |\n List of all members \n
    Dune::CholmodCreator Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/cholmod.hh>

    \n+

    #include <dune/istl/cholmod.hh>

    \n \n \n \n \n \n \n@@ -199,15 +199,15 @@\n \n

    \n Classes

    struct  isValidBlock
     
    struct  isValidBlock< FieldVector< double, k > >
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01296.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01296.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::CholmodCreator::isValidBlock< F > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/cholmod.hh>

    \n+

    #include <dune/istl/cholmod.hh>

    \n
    \n Inheritance diagram for Dune::CholmodCreator::isValidBlock< F >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01300.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01300.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::CholmodCreator::isValidBlock< FieldVector< double, k > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/cholmod.hh>

    \n+

    #include <dune/istl/cholmod.hh>

    \n
    \n Inheritance diagram for Dune::CholmodCreator::isValidBlock< FieldVector< double, k > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01304.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01304.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::CholmodCreator::isValidBlock< FieldVector< float, k > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/cholmod.hh>

    \n+

    #include <dune/istl/cholmod.hh>

    \n
    \n Inheritance diagram for Dune::CholmodCreator::isValidBlock< FieldVector< float, k > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01320.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01320.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::ArPackPlusPlus_Algorithms< BCRSMatrix, BlockVector > Class Template Reference
    \n \n
    \n \n

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

    \n \n-

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

    \n+

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

    \n \n \n \n \n

    \n Public Types

    typedef BlockVector::field_type Real
     
    \n \n

    \n@@ -709,15 +709,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01332.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01332.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::PowerIteration_Algorithms< BCRSMatrix, BlockVector > Class Template Reference
    \n \n
    \n \n

    Iterative eigenvalue algorithms based on power iteration. \n More...

    \n \n-

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

    \n+

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

    \n \n \n \n \n \n \n@@ -1203,15 +1203,15 @@\n \n

    \n Public Types

    typedef BlockVector::field_type Real
     Type of underlying field.
     
    typedef OperatorSum IterationOperator
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01352.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01352.html", "unified_diff": "@@ -79,15 +79,15 @@\n \n \n
    \n \n

    compile-time parameter for block recursion depth \n More...

    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { recursion_level = l\n }
     
    \n@@ -111,15 +111,15 @@\n \n \n
    Enumerator
    recursion_level 
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01356.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01356.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::algmeta_btsolve< I, diag, relax > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n \n \n@@ -193,15 +193,15 @@\n \n

    \n 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 >
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01360.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01360.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::algmeta_btsolve< 0, withdiag, withrelax > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n \n \n@@ -189,15 +189,15 @@\n \n

    \n 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 >
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01364.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01364.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n \n \n
    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n \n \n@@ -189,15 +189,15 @@\n \n

    \n 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 >
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01368.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01368.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n \n \n
    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n \n \n@@ -189,15 +189,15 @@\n \n

    \n 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 >
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01372.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01372.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n \n \n
    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n \n \n@@ -189,15 +189,15 @@\n \n

    \n 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 >
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01376.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01376.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n \n \n
    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n \n

    \n 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)
     
    \n@@ -138,15 +138,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01380.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01380.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n \n \n
    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n \n

    \n 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)
     
    \n@@ -136,15 +136,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01384.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01384.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n \n \n
    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n \n

    \n 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 &)
     
    \n@@ -136,15 +136,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01388.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01388.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n \n \n
    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n \n \n@@ -303,15 +303,15 @@\n \n

    \n 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 >
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01392.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01392.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n \n \n
    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n \n \n@@ -303,15 +303,15 @@\n \n

    \n 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 >
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01396.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01396.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::algmeta_itsteps< I, MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/gsetc.hh>

    \n+

    #include <dune/istl/gsetc.hh>

    \n \n \n \n \n \n \n@@ -303,15 +303,15 @@\n \n

    \n 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 >
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01400.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01400.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::ILU::CRS< B, Alloc > Struct Template Reference
    \n \n
    \n \n

    a simple compressed row storage matrix class \n More...

    \n \n-

    #include <dune/istl/ilu.hh>

    \n+

    #include <dune/istl/ilu.hh>

    \n
    \n Inheritance diagram for Dune::ILU::CRS< B, Alloc >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -405,15 +405,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01404.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01404.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::ILUSubdomainSolver< M, X, Y > Class Template Referenceabstract
    \n \n
    \n \n

    base class encapsulating common algorithms of ILU0SubdomainSolver and ILUNSubdomainSolver. \n More...

    \n \n-

    #include <dune/istl/ilusubdomainsolver.hh>

    \n+

    #include <dune/istl/ilusubdomainsolver.hh>

    \n
    \n Inheritance diagram for Dune::ILUSubdomainSolver< M, X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -295,15 +295,15 @@\n
    \n \n

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

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01408.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01408.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::ILU0SubdomainSolver< M, X, Y > Class Template Reference
    \n \n
    \n \n

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

    \n \n-

    #include <dune/istl/ilusubdomainsolver.hh>

    \n+

    #include <dune/istl/ilusubdomainsolver.hh>

    \n
    \n Inheritance diagram for Dune::ILU0SubdomainSolver< M, X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -286,15 +286,15 @@\n
    \n \n

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

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01412.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01412.html", "unified_diff": "@@ -79,15 +79,15 @@\n Protected Member Functions |\n Protected Attributes |\n List of all members \n
    Dune::ILUNSubdomainSolver< M, X, Y > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/ilusubdomainsolver.hh>

    \n+

    #include <dune/istl/ilusubdomainsolver.hh>

    \n
    \n Inheritance diagram for Dune::ILUNSubdomainSolver< M, X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -272,15 +272,15 @@\n
    \n \n

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

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01428.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01428.html", "unified_diff": "@@ -80,15 +80,15 @@\n \n \n
    \n \n

    Default options class to write SVG matrices. \n More...

    \n \n-

    #include <dune/istl/io.hh>

    \n+

    #include <dune/istl/io.hh>

    \n \n \n \n \n \n \n@@ -447,15 +447,15 @@\n
    \n \n

    Whether to write the SVG header.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01432.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01432.html", "unified_diff": "@@ -76,15 +76,15 @@\n
    Dune::ISTLError Class Reference
    \n \n
    \n \n

    derive error class from the base class in common \n More...

    \n \n-

    #include <dune/istl/istlexception.hh>

    \n+

    #include <dune/istl/istlexception.hh>

    \n
    \n Inheritance diagram for Dune::ISTLError:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -96,15 +96,15 @@\n \"\"\n \"\"\n \n
    \n

    Detailed Description

    \n

    derive error class from the base class in common

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01436.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01436.html", "unified_diff": "@@ -76,15 +76,15 @@\n
    Dune::BCRSMatrixError Class Reference
    \n \n
    \n \n

    Error specific to BCRSMatrix. \n More...

    \n \n-

    #include <dune/istl/istlexception.hh>

    \n+

    #include <dune/istl/istlexception.hh>

    \n
    \n Inheritance diagram for Dune::BCRSMatrixError:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -94,15 +94,15 @@\n \"\"\n \"\"\n \n
    \n

    Detailed Description

    \n

    Error specific to BCRSMatrix.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01440.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01440.html", "unified_diff": "@@ -76,15 +76,15 @@\n
    Dune::ImplicitModeCompressionBufferExhausted Class Reference
    \n \n
    \n \n

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

    \n \n-

    #include <dune/istl/istlexception.hh>

    \n+

    #include <dune/istl/istlexception.hh>

    \n
    \n Inheritance diagram for Dune::ImplicitModeCompressionBufferExhausted:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -96,15 +96,15 @@\n \n
    \n

    Detailed Description

    \n

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

    \n

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

    \n

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

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01444.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01444.html", "unified_diff": "@@ -76,15 +76,15 @@\n
    Dune::SolverAbort Class Reference
    \n \n
    \n \n

    Thrown when a solver aborts due to some problem. \n More...

    \n \n-

    #include <dune/istl/istlexception.hh>

    \n+

    #include <dune/istl/istlexception.hh>

    \n
    \n Inheritance diagram for Dune::SolverAbort:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -93,15 +93,15 @@\n \"\"\n \n
    \n

    Detailed Description

    \n

    Thrown when a solver aborts due to some problem.

    \n

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

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01448.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01448.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::MatrixBlockError Class Reference
    \n \n
    \n \n

    Error when performing an operation on a matrix block. \n More...

    \n \n-

    #include <dune/istl/istlexception.hh>

    \n+

    #include <dune/istl/istlexception.hh>

    \n
    \n Inheritance diagram for Dune::MatrixBlockError:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -131,15 +131,15 @@\n \n

    \n 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.
     
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01452.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01452.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::SeqOverlappingSchwarz< M, X, TM, TD, TA > Class Template Reference
    \n \n
    \n \n

    Sequential overlapping Schwarz preconditioner. \n More...

    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n
    \n Inheritance diagram for Dune::SeqOverlappingSchwarz< M, X, TM, TD, TA >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -543,16 +543,16 @@\n \n \n

    Implements Dune::Preconditioner< X, X >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following files:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01456.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01456.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::SeqOverlappingSchwarzAssemblerHelper< T, tag > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01460.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01460.html", "unified_diff": "@@ -76,26 +76,26 @@\n
    Dune::LDL< Matrix > Class Template Reference
    \n \n
    \n \n

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

    \n \n-

    #include <dune/istl/ldl.hh>

    \n+

    #include <dune/istl/ldl.hh>

    \n

    Detailed Description

    \n
    template<class Matrix>
    \n class Dune::LDL< Matrix >

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

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

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01464.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01464.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > Class Template Referenceabstract
    \n \n
    \n \n

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

    \n \n-

    #include <dune/istl/ldl.hh>

    \n+

    #include <dune/istl/ldl.hh>

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

    helper function for printing solver output

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01468.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01468.html", "unified_diff": "@@ -76,24 +76,24 @@\n \n
    Dune::IsDirectSolver< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/ldl.hh>

    \n+

    #include <dune/istl/ldl.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value = true\n }
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01472.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01472.html", "unified_diff": "@@ -76,24 +76,24 @@\n \n
    Dune::StoresColumnCompressed< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/ldl.hh>

    \n+

    #include <dune/istl/ldl.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value = true\n }
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01476.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01476.html", "unified_diff": "@@ -77,15 +77,15 @@\n Classes |\n Public Member Functions |\n List of all members \n
    Dune::LDLCreator Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/ldl.hh>

    \n+

    #include <dune/istl/ldl.hh>

    \n \n \n \n \n \n \n@@ -96,15 +96,15 @@\n \n \n \n \n \n

    \n 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
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01480.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01480.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::LDLCreator::isValidBlock< F > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/ldl.hh>

    \n+

    #include <dune/istl/ldl.hh>

    \n
    \n Inheritance diagram for Dune::LDLCreator::isValidBlock< F >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01484.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01484.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::LDLCreator::isValidBlock< FieldVector< double, k > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/ldl.hh>

    \n+

    #include <dune/istl/ldl.hh>

    \n
    \n Inheritance diagram for Dune::LDLCreator::isValidBlock< FieldVector< double, k > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01488.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01488.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::MatrixImp::DenseMatrixBase< B, A > Class Template Reference
    \n \n
    \n \n

    A Vector of blocks with different blocksizes. \n More...

    \n \n-

    #include <dune/istl/matrix.hh>

    \n+

    #include <dune/istl/matrix.hh>

    \n
    \n Inheritance diagram for Dune::MatrixImp::DenseMatrixBase< B, A >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -992,15 +992,15 @@\n
    \n \n

    same effect as constructor with same argument

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01492.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01492.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::MatrixImp::DenseMatrixBase< B, A >::Iterator Class Reference
    \n \n
    \n \n

    Iterator class for sequential access. \n More...

    \n \n-

    #include <dune/istl/matrix.hh>

    \n+

    #include <dune/istl/matrix.hh>

    \n \n \n \n \n \n \n@@ -586,15 +586,15 @@\n
    \n \n

    equality

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01496.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01496.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::MatrixImp::DenseMatrixBase< B, A >::ConstIterator Class Reference
    \n \n
    \n \n

    ConstIterator class for sequential access. \n More...

    \n \n-

    #include <dune/istl/matrix.hh>

    \n+

    #include <dune/istl/matrix.hh>

    \n

    \n Public Member Functions

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

    equality

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01500.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01500.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::Matrix< T, A > Class Template Reference
    \n \n
    \n \n

    A generic dynamic dense matrix. \n More...

    \n \n-

    #include <dune/istl/matrix.hh>

    \n+

    #include <dune/istl/matrix.hh>

    \n

    \n Public Member Functions

     ConstIterator ()
     constructor
     
     ConstIterator (const B *data, size_type columns, size_type _i)
    \n \n \n \n \n \n@@ -1825,15 +1825,15 @@\n
    \n \n

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

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01504.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01504.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::FieldTraits< Matrix< T, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrix.hh>

    \n+

    #include <dune/istl/matrix.hh>

    \n

    \n Public Types

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

    \n Public Types

    using field_type = typename Matrix< T, A >::field_type
     
    using real_type = typename FieldTraits< field_type >::real_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01508.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01508.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::MatrixIndexSet Class Reference
    \n \n
    \n \n

    Stores the nonzero entries for creating a sparse matrix. \n More...

    \n \n-

    #include <dune/istl/matrixindexset.hh>

    \n+

    #include <dune/istl/matrixindexset.hh>

    \n \n \n \n \n

    \n Public Types

    using size_type = Index
     
    \n \n

    \n@@ -585,15 +585,15 @@\n \n

    Default value for maxVectorSize.

    \n

    This was selected after benchmarking for the worst case of reverse insertion of column indices. In many applications this works well. There's no need to use a different value unless you have many dense rows with more than defaultMaxVectorSize nonzero entries. Even in this case defaultMaxVectorSize may work well and a finding a better value may require careful benchmarking.

    \n \n \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01516.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01516.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::MatrixMarketImpl::mm_numeric_type< T > Struct Template Reference
    \n \n
    \n \n

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

    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { is_numeric =false\n }
     
    \n@@ -113,15 +113,15 @@\n

    Enumerator
    is_numeric 

    Whether T is a supported numeric type.

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01520.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01520.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixMarketImpl::mm_numeric_type< int > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { is_numeric =true\n }
     
    \n@@ -136,15 +136,15 @@\n \n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01524.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01524.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixMarketImpl::mm_numeric_type< double > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { is_numeric =true\n }
     
    \n@@ -136,15 +136,15 @@\n \n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01528.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01528.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixMarketImpl::mm_numeric_type< float > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { is_numeric =true\n }
     
    \n@@ -136,15 +136,15 @@\n \n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01532.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01532.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixMarketImpl::mm_numeric_type< std::complex< double > > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { is_numeric =true\n }
     
    \n@@ -136,15 +136,15 @@\n \n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01536.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01536.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixMarketImpl::mm_numeric_type< std::complex< float > > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { is_numeric =true\n }
     
    \n@@ -136,15 +136,15 @@\n \n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01540.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01540.html", "unified_diff": "@@ -86,15 +86,15 @@\n
    Template Parameters
    \n \n \n
    MThe matrix type.
    \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01544.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01544.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::MatrixMarketImpl::mm_header_printer< BCRSMatrix< T, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Static Public Member Functions

    static void print (std::ostream &os)
     
    \n

    Member Function Documentation

    \n@@ -113,15 +113,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01548.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01548.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::MatrixMarketImpl::mm_header_printer< BlockVector< B, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Static Public Member Functions

    static void print (std::ostream &os)
     
    \n

    Member Function Documentation

    \n@@ -113,15 +113,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01552.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01552.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::MatrixMarketImpl::mm_header_printer< FieldVector< T, j > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Static Public Member Functions

    static void print (std::ostream &os)
     
    \n

    Member Function Documentation

    \n@@ -113,15 +113,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01556.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01556.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::MatrixMarketImpl::mm_header_printer< FieldMatrix< T, i, j > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Static Public Member Functions

    static void print (std::ostream &os)
     
    \n

    Member Function Documentation

    \n@@ -113,15 +113,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01560.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01560.html", "unified_diff": "@@ -85,15 +85,15 @@\n

    Member function mm_block_structure_header::print(os, mat) writes the corresponding header to the specified ostream.

    Template Parameters
    \n \n \n
    Thetype of the matrix to generate the header for.
    \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01564.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01564.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixMarketImpl::mm_block_structure_header< BlockVector< T, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    typedef BlockVector< T, A > M
     
    \n \n

    \n@@ -146,15 +146,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01568.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01568.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixMarketImpl::mm_block_structure_header< BlockVector< FieldVector< T, i >, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    typedef BlockVector< FieldVector< T, i >, A > M
     
    \n \n

    \n@@ -146,15 +146,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01572.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01572.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixMarketImpl::mm_block_structure_header< BCRSMatrix< T, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    typedef BCRSMatrix< T, A > M
     
    \n \n

    \n@@ -146,15 +146,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01576.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01576.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixMarketImpl::mm_block_structure_header< BCRSMatrix< FieldMatrix< T, i, j >, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    typedef BCRSMatrix< FieldMatrix< T, i, j >, A > M
     
    \n \n

    \n@@ -146,15 +146,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01580.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01580.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixMarketImpl::mm_block_structure_header< FieldMatrix< T, i, j > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    typedef FieldMatrix< T, i, j > M
     
    \n \n

    \n@@ -146,15 +146,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01584.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01584.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixMarketImpl::mm_block_structure_header< FieldVector< T, i > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Types

    typedef FieldVector< T, i > M
     
    \n \n

    \n@@ -146,15 +146,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01588.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01588.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Member Functions |\n Public Attributes |\n List of all members \n
    Dune::MatrixMarketImpl::MMHeader Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Member Functions

     MMHeader ()
     
    \n \n

    \n@@ -163,15 +163,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01592.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01592.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::MatrixMarketImpl::IndexData< T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n
    \n Inheritance diagram for Dune::MatrixMarketImpl::IndexData< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -111,15 +111,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01596.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01596.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::MatrixMarketImpl::NumericWrapper< T > Struct Template Reference
    \n \n
    \n \n

    a wrapper class of numeric values. \n More...

    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n

    \n Public Member Functions

     operator T& ()
     
    \n \n

    \n@@ -148,15 +148,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01600.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01600.html", "unified_diff": "@@ -76,19 +76,19 @@\n
    Dune::MatrixMarketImpl::PatternDummy Struct Reference
    \n \n
    \n \n

    Utility class for marking the pattern type of the MatrixMarket matrices. \n More...

    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n

    Detailed Description

    \n

    Utility class for marking the pattern type of the MatrixMarket matrices.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01604.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01604.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::MatrixMarketImpl::NumericWrapper< PatternDummy > Struct Reference
    \n
    \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01608.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01608.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::MatrixMarketImpl::MatrixValuesSetter< D, brows, bcols > Struct Template Reference
    \n \n
    \n \n

    Functor to the data values of the matrix. \n More...

    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n \n \n@@ -196,15 +196,15 @@\n

    \n Public Member Functions

    template<typename T >
    void operator() (const std::vector< std::set< IndexData< D > > > &rows, BCRSMatrix< T > &matrix)
     Sets the matrix values.
     
    \n \n \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01612.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01612.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::MatrixMarketImpl::MatrixValuesSetter< PatternDummy, brows, bcols > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n \n

    \n Public Member Functions

    template<typename M >
    void operator() (const std::vector< std::set< IndexData< PatternDummy > > > &rows, M &matrix)
     
    \n@@ -126,15 +126,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01616.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01616.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::MatrixMarketImpl::is_complex< T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n
    \n Inheritance diagram for Dune::MatrixMarketImpl::is_complex< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01620.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01620.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::MatrixMarketImpl::is_complex< std::complex< T > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n
    \n Inheritance diagram for Dune::MatrixMarketImpl::is_complex< std::complex< T > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01624.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01624.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::MatrixMarketImpl::mm_multipliers< M > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01628.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01628.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::MatrixMarketImpl::mm_multipliers< BCRSMatrix< B, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n@@ -107,15 +107,15 @@\n \n \n

    \n Public Types

    enum  { rows = 1\n , cols = 1\n }
     
    Enumerator
    rows 
    cols 
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01632.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01632.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::MatrixMarketImpl::mm_multipliers< BCRSMatrix< FieldMatrix< B, i, j >, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n \n \n \n \n@@ -107,15 +107,15 @@\n \n \n

    \n Public Types

    enum  { rows = i\n , cols = j\n }
     
    Enumerator
    rows 
    cols 
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01636.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01636.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n \n
    \n \n-

    #include <dune/istl/matrixmarket.hh>

    \n+

    #include <dune/istl/matrixmarket.hh>

    \n
    \n Inheritance diagram for Dune::MatrixMarketFormatError:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01708.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01708.html", "unified_diff": "@@ -76,27 +76,27 @@\n
    Dune::MatMultMatResult< M1, M2 > Struct Template Reference
    \n \n
    \n \n

    Helper TMP to get the result type of a sparse matrix matrix multiplication ( \"$C=A*B$\") \n More...

    \n \n-

    #include <dune/istl/matrixmatrix.hh>

    \n+

    #include <dune/istl/matrixmatrix.hh>

    \n

    Detailed Description

    \n
    template<typename M1, typename M2>
    \n struct Dune::MatMultMatResult< M1, M2 >

    Helper TMP to get the result type of a sparse matrix matrix multiplication ( \"$C=A*B$\")

    \n

    The type of matrix C will be stored as the associated type MatMultMatResult::type.

    Template Parameters
    \n \n \n \n
    M1The type of matrix A.
    M2The type of matrix B.
    \n
    \n
    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01712.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01712.html", "unified_diff": "@@ -76,23 +76,23 @@\n \n
    Dune::MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmatrix.hh>

    \n+

    #include <dune/istl/matrixmatrix.hh>

    \n \n \n \n \n

    \n Public Types

    typedef FieldMatrix< T, n, m > type
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01716.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01716.html", "unified_diff": "@@ -76,23 +76,23 @@\n \n
    Dune::MatMultMatResult< BCRSMatrix< FieldMatrix< T, n, k >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmatrix.hh>

    \n+

    #include <dune/istl/matrixmatrix.hh>

    \n \n \n \n \n

    \n 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
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01720.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01720.html", "unified_diff": "@@ -76,27 +76,27 @@\n
    Dune::TransposedMatMultMatResult< M1, M2 > Struct Template Reference
    \n \n
    \n \n

    Helper TMP to get the result type of a sparse matrix matrix multiplication ( \"$C=A*B$\") \n More...

    \n \n-

    #include <dune/istl/matrixmatrix.hh>

    \n+

    #include <dune/istl/matrixmatrix.hh>

    \n

    Detailed Description

    \n
    template<typename M1, typename M2>
    \n struct Dune::TransposedMatMultMatResult< M1, M2 >

    Helper TMP to get the result type of a sparse matrix matrix multiplication ( \"$C=A*B$\")

    \n

    The type of matrix C will be stored as the associated type MatMultMatResult::type.

    Template Parameters
    \n \n \n \n
    M1The type of matrix A.
    M2The type of matrix B.
    \n
    \n
    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01724.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01724.html", "unified_diff": "@@ -76,23 +76,23 @@\n \n
    Dune::TransposedMatMultMatResult< FieldMatrix< T, k, n >, FieldMatrix< T, k, m > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmatrix.hh>

    \n+

    #include <dune/istl/matrixmatrix.hh>

    \n \n \n \n \n

    \n Public Types

    typedef FieldMatrix< T, n, m > type
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01728.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01728.html", "unified_diff": "@@ -76,23 +76,23 @@\n \n
    Dune::TransposedMatMultMatResult< BCRSMatrix< FieldMatrix< T, k, n >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixmatrix.hh>

    \n+

    #include <dune/istl/matrixmatrix.hh>

    \n \n \n \n \n

    \n 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
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01732.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01732.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::RedistributeInformation< T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixredistribute.hh>

    \n+

    #include <dune/istl/matrixredistribute.hh>

    \n \n \n \n \n \n \n@@ -407,15 +407,15 @@\n \n

    \n Public Member Functions

    bool isSetup () const
     
    template<class D >
    void redistribute (const D &from, D &to) const
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01736.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01736.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members \n
    Dune::RedistributeInformation< OwnerOverlapCopyCommunication< T, T1 > > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixredistribute.hh>

    \n+

    #include <dune/istl/matrixredistribute.hh>

    \n \n \n \n \n

    \n Public Types

    typedef OwnerOverlapCopyCommunication< T, T1 > Comm
     
    \n \n

    \n@@ -773,15 +773,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01740.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01740.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::CommMatrixRowSize< M, RI > Struct Template Reference
    \n \n
    \n \n

    Utility class to communicate and set the row sizes of a redistributed matrix. \n More...

    \n \n-

    #include <dune/istl/matrixredistribute.hh>

    \n+

    #include <dune/istl/matrixredistribute.hh>

    \n \n \n \n \n \n \n@@ -228,15 +228,15 @@\n \n

    \n Public Types

    typedef M::size_type value_type
     
    typedef M::size_type size_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01744.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01744.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::CommMatrixSparsityPattern< M, I > Struct Template Reference
    \n \n
    \n \n

    Utility class to communicate and build the sparsity pattern of a redistributed matrix. \n More...

    \n \n-

    #include <dune/istl/matrixredistribute.hh>

    \n+

    #include <dune/istl/matrixredistribute.hh>

    \n \n \n \n \n \n \n@@ -432,15 +432,15 @@\n \n

    \n Public Types

    typedef M::size_type size_type
     
    typedef Dune::GlobalLookupIndexSet< I > LookupIndexSet
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01748.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01748.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::CommPolicy< CommMatrixSparsityPattern< M, I > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixredistribute.hh>

    \n+

    #include <dune/istl/matrixredistribute.hh>

    \n \n \n \n \n \n \n@@ -188,15 +188,15 @@\n \n

    \n Public Types

    typedef CommMatrixSparsityPattern< M, I > Type
     
    typedef I::GlobalIndex IndexedType
     The indexed type we send. This is the global index indentitfying the column.
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01752.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01752.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::CommMatrixRow< M, I > Struct Template Reference
    \n \n
    \n \n

    Utility class for comunicating the matrix entries. \n More...

    \n \n-

    #include <dune/istl/matrixredistribute.hh>

    \n+

    #include <dune/istl/matrixredistribute.hh>

    \n \n \n \n \n \n \n@@ -331,15 +331,15 @@\n
    \n \n

    row size information for the receiving side.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01756.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01756.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members\n
    Dune::CommPolicy< CommMatrixRow< M, I > > Struct Template Reference
    \n \n

    \n 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_)
    \n \n \n \n \n \n@@ -188,15 +188,15 @@\n \n

    \n 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.
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01760.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01760.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixRowSizeGatherScatter< M, I, RI > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixredistribute.hh>

    \n+

    #include <dune/istl/matrixredistribute.hh>

    \n \n \n \n \n

    \n Public Types

    typedef CommMatrixRowSize< M, RI > Container
     
    \n \n

    \n@@ -192,15 +192,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01764.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01764.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixCopyRowSizeGatherScatter< M, I, RI > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixredistribute.hh>

    \n+

    #include <dune/istl/matrixredistribute.hh>

    \n \n \n \n \n

    \n Public Types

    typedef CommMatrixRowSize< M, RI > Container
     
    \n \n

    \n@@ -192,15 +192,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01768.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01768.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::MatrixSparsityPatternGatherScatter< M, I > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixredistribute.hh>

    \n+

    #include <dune/istl/matrixredistribute.hh>

    \n \n \n \n \n \n \n@@ -297,15 +297,15 @@\n \n

    \n Public Types

    typedef I::GlobalIndex GlobalIndex
     
    typedef CommMatrixSparsityPattern< M, I > Container
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01772.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01772.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::MatrixRowGatherScatter< M, I > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixredistribute.hh>

    \n+

    #include <dune/istl/matrixredistribute.hh>

    \n \n \n \n \n \n \n@@ -341,15 +341,15 @@\n \n

    \n Public Types

    typedef I::GlobalIndex GlobalIndex
     
    typedef CommMatrixRow< M, I > Container
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01776.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01776.html", "unified_diff": "@@ -73,15 +73,15 @@\n \n \n
    \n
    Dune::FieldMatrix< K, n, m > Class Template Reference
    \n
    \n
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01780.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01780.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::CheckIfDiagonalPresent< Matrix, blocklevel, l > Struct Template Reference
    \n \n
    \n \n

    Check whether the a matrix has diagonal values on blocklevel recursion levels. \n More...

    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n \n

    \n Static Public Member Functions

    static void check (const Matrix &mat)
     Check whether the a matrix has diagonal values on blocklevel recursion levels.
     
    \n@@ -122,15 +122,15 @@\n
    \n \n

    Check whether the a matrix has diagonal values on blocklevel recursion levels.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01784.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01784.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::CheckIfDiagonalPresent< Matrix, 0, l > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n

    \n Static Public Member Functions

    static void check (const Matrix &mat)
     
    \n

    Member Function Documentation

    \n@@ -113,15 +113,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01788.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01788.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::CheckIfDiagonalPresent< MultiTypeBlockMatrix< T1, Args... >, blocklevel, l > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n

    \n Public Types

    typedef MultiTypeBlockMatrix< T1, Args... > Matrix
     
    \n \n

    \n@@ -139,15 +139,15 @@\n
    \n \n

    Check whether the a matrix has diagonal values on blocklevel recursion levels.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01796.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01796.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixDimension< Matrix< B, TA > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n \n \n@@ -264,15 +264,15 @@\n \n

    \n Public Types

    using block_type = typename Matrix< B, TA >::block_type
     
    using size_type = typename Matrix< B, TA >::size_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01800.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01800.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixDimension< BCRSMatrix< B, TA > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n \n \n@@ -282,15 +282,15 @@\n \n

    \n Public Types

    typedef BCRSMatrix< B, TA > Matrix
     
    typedef Matrix::block_type block_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01804.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01804.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixDimension< BCRSMatrix< FieldMatrix< B, n, m >, TA > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n \n \n@@ -264,15 +264,15 @@\n \n

    \n Public Types

    typedef BCRSMatrix< FieldMatrix< B, n, m >,TA > Matrix
     
    typedef Matrix::size_type size_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01808.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01808.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixDimension< FieldMatrix< K, n, m > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n \n \n@@ -264,15 +264,15 @@\n \n

    \n Public Types

    typedef FieldMatrix< K, n, m > Matrix
     
    typedef Matrix::size_type size_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01812.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01812.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixDimension< Dune::DynamicMatrix< T > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n \n \n@@ -264,15 +264,15 @@\n \n

    \n Public Types

    typedef Dune::DynamicMatrix< T > MatrixType
     
    typedef MatrixType::size_type size_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01816.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01816.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixDimension< Matrix< FieldMatrix< K, n, m >, TA > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n \n \n@@ -264,15 +264,15 @@\n \n

    \n Public Types

    typedef Matrix< FieldMatrix< K, n, m >, TA > ThisMatrix
     
    typedef ThisMatrix::size_type size_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01820.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01820.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixDimension< DiagonalMatrix< K, n > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n \n \n@@ -264,15 +264,15 @@\n \n

    \n Public Types

    typedef DiagonalMatrix< K, n > Matrix
     
    typedef Matrix::size_type size_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01824.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01824.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::MatrixDimension< ScaledIdentityMatrix< K, n > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n \n \n@@ -264,15 +264,15 @@\n \n

    \n Public Types

    typedef ScaledIdentityMatrix< K, n > Matrix
     
    typedef Matrix::size_type size_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01828.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01828.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::IsMatrix< T > Struct Template Reference
    \n \n
    \n \n

    Test whether a type is an ISTL Matrix. \n More...

    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value = false\n }
     
    \n@@ -112,15 +112,15 @@\n

    Enumerator
    value 

    True if T is an ISTL matrix.

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01832.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01832.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::IsMatrix< DenseMatrix< T > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value = true\n }
     
    \n@@ -106,15 +106,15 @@\n Enumeratorvalue 

    True if T is an ISTL matrix.

    \n \n \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01836.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01836.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::IsMatrix< BCRSMatrix< T, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value = true\n }
     
    \n@@ -106,15 +106,15 @@\n Enumeratorvalue 

    True if T is an ISTL matrix.

    \n \n \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01840.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01840.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::PointerCompare< T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/matrixutils.hh>

    \n+

    #include <dune/istl/matrixutils.hh>

    \n \n \n \n \n

    \n Public Member Functions

    bool operator() (const T *l, const T *r)
     
    \n

    Member Function Documentation

    \n@@ -123,15 +123,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01844.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01844.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::MultiTypeBlockMatrix_Solver< I, crow, remain_row > Class Template Reference
    \n \n
    \n \n

    solver for MultiTypeBlockVector & MultiTypeBlockMatrix types \n More...

    \n \n-

    #include <dune/istl/multitypeblockmatrix.hh>

    \n+

    #include <dune/istl/multitypeblockmatrix.hh>

    \n \n \n \n \n \n \n@@ -113,15 +113,15 @@\n \n

    \n 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 >
     
    \n

    Detailed Description

    \n
    template<int I, int crow, int remain_row>
    \n class Dune::MultiTypeBlockMatrix_Solver< I, crow, remain_row >

    solver for MultiTypeBlockVector & MultiTypeBlockMatrix types

    \n

    The methods of this class are called by the solver specializations for MultiTypeBlockVector & MultiTypeBlockMatrix types (dbgs, bsorf, bsorb, dbjac).

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01848.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01848.html", "unified_diff": "@@ -76,25 +76,25 @@\n \n
    Dune::FieldTraits< MultiTypeBlockMatrix< Rows... > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/multitypeblockmatrix.hh>

    \n+

    #include <dune/istl/multitypeblockmatrix.hh>

    \n \n \n \n \n \n \n

    \n Public Types

    using field_type = typename MultiTypeBlockMatrix< Rows... >::field_type
     
    using real_type = typename MultiTypeBlockMatrix< Rows... >::real_type
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01852.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01852.html", "unified_diff": "@@ -79,28 +79,28 @@\n
    Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, remain_col > Class Template Reference
    \n \n
    \n \n

    part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types \n More...

    \n \n-

    #include <dune/istl/multitypeblockmatrix.hh>

    \n+

    #include <dune/istl/multitypeblockmatrix.hh>

    \n \n \n \n \n \n

    \n 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)
     
    \n

    Detailed Description

    \n
    template<int I, int crow, int ccol, int remain_col>
    \n class Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, remain_col >

    part of solvers for MultiTypeBlockVector & MultiTypeBlockMatrix types

    \n

    For the given row (index \"crow\") each element is used to calculate the equation's right side.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01856.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01856.html", "unified_diff": "@@ -76,24 +76,24 @@\n \n
    Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, 0 > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/multitypeblockmatrix.hh>

    \n+

    #include <dune/istl/multitypeblockmatrix.hh>

    \n \n \n \n \n \n

    \n Static Public Member Functions

    template<typename Trhs , typename TVector , typename TMatrix , typename K >
    static void calc_rhs (const TMatrix &, TVector &, TVector &, Trhs &, const K &)
     
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01860.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01860.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::MultiTypeBlockMatrix_Solver< I, crow, 0 > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/multitypeblockmatrix.hh>

    \n+

    #include <dune/istl/multitypeblockmatrix.hh>

    \n \n \n \n \n \n \n@@ -94,15 +94,15 @@\n \n \n \n \n \n

    \n 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 &)
     
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01864.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01864.html", "unified_diff": "@@ -79,27 +79,27 @@\n
    std::tuple_element< i, Dune::MultiTypeBlockMatrix< Args... > > Struct Template Reference
    \n \n
    \n \n

    Make std::tuple_element work for MultiTypeBlockMatrix. \n More...

    \n \n-

    #include <dune/istl/multitypeblockmatrix.hh>

    \n+

    #include <dune/istl/multitypeblockmatrix.hh>

    \n \n \n \n \n

    \n Public Types

    using type = typename std::tuple_element< i, std::tuple< Args... > >::type
     
    \n

    Detailed Description

    \n
    template<size_t i, typename... Args>
    \n struct std::tuple_element< i, Dune::MultiTypeBlockMatrix< Args... > >

    Make std::tuple_element work for MultiTypeBlockMatrix.

    \n

    It derives from std::tuple after all.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01868.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01868.html", "unified_diff": "@@ -76,15 +76,15 @@\n
    std::tuple_size< Dune::MultiTypeBlockMatrix< Args... > > Struct Template Reference
    \n \n
    \n \n

    Make std::tuple_size work for MultiTypeBlockMatrix. \n More...

    \n \n-

    #include <dune/istl/multitypeblockmatrix.hh>

    \n+

    #include <dune/istl/multitypeblockmatrix.hh>

    \n
    \n Inheritance diagram for std::tuple_size< Dune::MultiTypeBlockMatrix< Args... > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -92,15 +92,15 @@\n \n
    \n

    Detailed Description

    \n
    template<typename... Args>
    \n struct std::tuple_size< Dune::MultiTypeBlockMatrix< Args... > >

    Make std::tuple_size work for MultiTypeBlockMatrix.

    \n

    It derives from std::tuple after all.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01872.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01872.html", "unified_diff": "@@ -76,25 +76,25 @@\n \n
    Dune::FieldTraits< MultiTypeBlockVector< Args... > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/multitypeblockvector.hh>

    \n+

    #include <dune/istl/multitypeblockvector.hh>

    \n \n \n \n \n \n \n

    \n Public Types

    using field_type = typename MultiTypeBlockVector< Args... >::field_type
     
    using real_type = typename MultiTypeBlockVector< Args... >::real_type
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01876.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01876.html", "unified_diff": "@@ -79,27 +79,27 @@\n
    std::tuple_element< i, Dune::MultiTypeBlockVector< Args... > > Struct Template Reference
    \n \n
    \n \n

    Make std::tuple_element work for MultiTypeBlockVector. \n More...

    \n \n-

    #include <dune/istl/multitypeblockvector.hh>

    \n+

    #include <dune/istl/multitypeblockvector.hh>

    \n \n \n \n \n

    \n Public Types

    using type = typename std::tuple_element< i, std::tuple< Args... > >::type
     
    \n

    Detailed Description

    \n
    template<size_t i, typename... Args>
    \n struct std::tuple_element< i, Dune::MultiTypeBlockVector< Args... > >

    Make std::tuple_element work for MultiTypeBlockVector.

    \n

    It derives from std::tuple after all.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01880.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01880.html", "unified_diff": "@@ -76,15 +76,15 @@\n
    std::tuple_size< Dune::MultiTypeBlockVector< Args... > > Struct Template Reference
    \n \n
    \n \n

    Make std::tuple_size work for MultiTypeBlockVector. \n More...

    \n \n-

    #include <dune/istl/multitypeblockvector.hh>

    \n+

    #include <dune/istl/multitypeblockvector.hh>

    \n
    \n Inheritance diagram for std::tuple_size< Dune::MultiTypeBlockVector< Args... > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -92,15 +92,15 @@\n \n
    \n

    Detailed Description

    \n
    template<typename... Args>
    \n struct std::tuple_size< Dune::MultiTypeBlockVector< Args... > >

    Make std::tuple_size work for MultiTypeBlockVector.

    \n

    It derives from std::tuple after all.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01884.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01884.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::NonoverlappingSchwarzOperator< M, X, Y, C > Class Template Reference
    \n \n
    \n \n

    A nonoverlapping operator with communication object. \n More...

    \n \n-

    #include <dune/istl/novlpschwarz.hh>

    \n+

    #include <dune/istl/novlpschwarz.hh>

    \n
    \n Inheritance diagram for Dune::NonoverlappingSchwarzOperator< M, X, Y, C >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -724,15 +724,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01892.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01892.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::NonoverlappingBlockPreconditioner< C, P > Class Template Reference
    \n \n
    \n \n

    Nonoverlapping parallel preconditioner. \n More...

    \n \n-

    #include <dune/istl/novlpschwarz.hh>

    \n+

    #include <dune/istl/novlpschwarz.hh>

    \n
    \n Inheritance diagram for Dune::NonoverlappingBlockPreconditioner< C, P >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -512,15 +512,15 @@\n

    Prepare the preconditioner.

    \n \n

    Implements Dune::Preconditioner< P::domain_type, P::range_type >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01896.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01896.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::LinearOperator< X, Y > Class Template Referenceabstract
    \n \n
    \n \n

    A linear operator. \n More...

    \n \n-

    #include <dune/istl/operators.hh>

    \n+

    #include <dune/istl/operators.hh>

    \n
    \n Inheritance diagram for Dune::LinearOperator< X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -352,15 +352,15 @@\n

    Category of the linear operator (see SolverCategory::Category)

    \n \n

    Implemented in Dune::NonoverlappingSchwarzOperator< M, X, Y, C >, Dune::OverlappingSchwarzOperator< M, X, Y, C >, and Dune::MatrixAdapter< M, X, Y >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01900.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01900.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::AssembledLinearOperator< M, X, Y > Class Template Referenceabstract
    \n \n
    \n \n

    A linear operator exporting itself in matrix form. \n More...

    \n \n-

    #include <dune/istl/operators.hh>

    \n+

    #include <dune/istl/operators.hh>

    \n
    \n Inheritance diagram for Dune::AssembledLinearOperator< M, X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -350,15 +350,15 @@\n

    get matrix via *

    \n \n

    Implemented in Dune::NonoverlappingSchwarzOperator< M, X, Y, C >, Dune::OverlappingSchwarzOperator< M, X, Y, C >, and Dune::MatrixAdapter< M, X, Y >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01904.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01904.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::MatrixAdapter< M, X, Y > Class Template Reference
    \n \n
    \n \n

    Adapter to turn a matrix into a linear operator. \n More...

    \n \n-

    #include <dune/istl/operators.hh>

    \n+

    #include <dune/istl/operators.hh>

    \n
    \n Inheritance diagram for Dune::MatrixAdapter< M, X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -413,15 +413,15 @@\n

    get matrix via *

    \n \n

    Implements Dune::AssembledLinearOperator< M, X, Y >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01912.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01912.html", "unified_diff": "@@ -76,19 +76,19 @@\n
    Dune::AdditiveSchwarzMode Struct Reference
    \n \n
    \n \n

    Tag that the tells the Schwarz method to be additive. \n More...

    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n

    Detailed Description

    \n

    Tag that the tells the Schwarz method to be additive.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01916.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01916.html", "unified_diff": "@@ -76,19 +76,19 @@\n
    Dune::MultiplicativeSchwarzMode Struct Reference
    \n \n
    \n \n

    Tag that tells the Schwarz method to be multiplicative. \n More...

    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n

    Detailed Description

    \n

    Tag that tells the Schwarz method to be multiplicative.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01920.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01920.html", "unified_diff": "@@ -76,19 +76,19 @@\n
    Dune::SymmetricMultiplicativeSchwarzMode Struct Reference
    \n \n
    \n \n

    Tag that tells the Schwarz method to be multiplicative and symmetric. \n More...

    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n

    Detailed Description

    \n

    Tag that tells the Schwarz method to be multiplicative and symmetric.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01924.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01924.html", "unified_diff": "@@ -85,15 +85,15 @@\n
    Template Parameters
    \n \n \n
    MThe type of the matrix.
    \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01928.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01928.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n \n \n@@ -322,15 +322,15 @@\n \n

    \n Public Types

    typedef std::remove_const< M >::type matrix_type
     The matrix type the preconditioner is for.
     
    typedef X::field_type field_type
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01932.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01932.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::OverlappingAssignerHelper< T, tag > Class Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n
    \n Inheritance diagram for Dune::OverlappingAssignerHelper< T, tag >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01936.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01936.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::OverlappingAssignerHelper< DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >, false > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n \n \n@@ -232,15 +232,15 @@\n \n

    \n Public Types

    typedef BCRSMatrix< K, Al > matrix_type
     
    typedef X::field_type field_type
     
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01940.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01940.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::OverlappingAssignerHelper< S< BCRSMatrix< T, A > >, true > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n \n \n@@ -257,15 +257,15 @@\n \n

    \n Public Types

    typedef BCRSMatrix< T, A > matrix_type
     
    typedef S< BCRSMatrix< T, A > >::range_type range_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01944.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01944.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members \n
    Dune::OverlappingAssignerILUBase< M, X, Y > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n
    \n Inheritance diagram for Dune::OverlappingAssignerILUBase< M, X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -195,15 +195,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01948.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01948.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members \n
    Dune::OverlappingAssignerHelper< ILU0SubdomainSolver< M, X, Y >, false > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n
    \n Inheritance diagram for Dune::OverlappingAssignerHelper< ILU0SubdomainSolver< M, X, Y >, false >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -287,15 +287,15 @@\n \n \n \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01952.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01952.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members \n
    Dune::OverlappingAssignerHelper< ILUNSubdomainSolver< M, X, Y >, false > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n
    \n Inheritance diagram for Dune::OverlappingAssignerHelper< ILUNSubdomainSolver< M, X, Y >, false >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -287,15 +287,15 @@\n \n \n \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01956.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01956.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::AdditiveAdder< S, T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01960.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01960.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::AdditiveAdder< S, BlockVector< T, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n \n \n@@ -160,15 +160,15 @@\n \n

    \n Public Types

    typedef A::size_type size_type
     
    typedef std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01964.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01964.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::MultiplicativeAdder< S, T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01968.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01968.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::MultiplicativeAdder< S, BlockVector< T, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n \n \n@@ -160,15 +160,15 @@\n \n

    \n Public Types

    typedef A::size_type size_type
     
    typedef std::decay_t< decltype(Impl::asVector(std::declval< T >()))>::field_type field_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01972.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01972.html", "unified_diff": "@@ -76,28 +76,28 @@\n
    Dune::AdderSelector< T, X, S > Struct Template Reference
    \n \n
    \n \n

    template meta program for choosing how to add the correction. \n More...

    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n

    Detailed Description

    \n
    template<typename T, class X, class S>
    \n struct Dune::AdderSelector< T, X, S >

    template meta program for choosing how to add the correction.

    \n

    There are specialization for the additive, the multiplicative, and the symmetric multiplicative mode.

    \n
    Template Parameters
    \n \n \n \n
    TThe Schwarz mode (either AdditiveSchwarzMode or MuliplicativeSchwarzMode or SymmetricMultiplicativeSchwarzMode)
    XThe vector field type
    \n
    \n
    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01976.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01976.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::AdderSelector< AdditiveSchwarzMode, X, S > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n

    \n Public Types

    typedef AdditiveAdder< S, X > Adder
     
    \n

    Member Typedef Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01980.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01980.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::AdderSelector< MultiplicativeSchwarzMode, X, S > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n

    \n Public Types

    typedef MultiplicativeAdder< S, X > Adder
     
    \n

    Member Typedef Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01984.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01984.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::AdderSelector< SymmetricMultiplicativeSchwarzMode, X, S > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n

    \n Public Types

    typedef MultiplicativeAdder< S, X > Adder
     
    \n

    Member Typedef Documentation

    \n@@ -101,15 +101,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01988.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01988.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::IteratorDirectionSelector< T1, T2, forward > Struct Template Reference
    \n \n
    \n \n

    Helper template meta program for application of overlapping Schwarz. \n More...

    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n \n \n@@ -295,15 +295,15 @@\n \n

    \n Public Types

    typedef T1 solver_vector
     
    typedef solver_vector::iterator solver_iterator
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01992.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01992.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::IteratorDirectionSelector< T1, T2, false > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n \n \n@@ -280,15 +280,15 @@\n \n

    \n Public Types

    typedef T1 solver_vector
     
    typedef solver_vector::reverse_iterator solver_iterator
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a01996.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a01996.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::SeqOverlappingSchwarzApplier< T > Struct Template Reference
    \n \n
    \n \n

    Helper template meta program for application of overlapping Schwarz. \n More...

    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n \n \n@@ -182,15 +182,15 @@\n \n

    \n Public Types

    typedef T smoother
     
    typedef smoother::range_type range_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02000.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02000.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::SeqOverlappingSchwarzApplier< SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n \n \n@@ -170,15 +170,15 @@\n \n

    \n Public Types

    typedef SeqOverlappingSchwarz< M, X, SymmetricMultiplicativeSchwarzMode, TD, TA > smoother
     
    typedef smoother::range_type range_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02004.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02004.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::SeqOverlappingSchwarzAssemblerHelper< DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >, false > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n

    \n Public Types

    typedef BCRSMatrix< K, Al > matrix_type
     
    \n \n

    \n@@ -139,15 +139,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02008.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02008.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::SeqOverlappingSchwarzAssemblerHelper< S< BCRSMatrix< T, A > >, true > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n

    \n Public Types

    typedef BCRSMatrix< T, A > matrix_type
     
    \n \n

    \n@@ -139,15 +139,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02012.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02012.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::SeqOverlappingSchwarzAssemblerILUBase< M, X, Y > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n
    \n Inheritance diagram for Dune::SeqOverlappingSchwarzAssemblerILUBase< M, X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -120,15 +120,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02016.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02016.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::SeqOverlappingSchwarzAssemblerHelper< ILU0SubdomainSolver< M, X, Y >, false > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n
    \n Inheritance diagram for Dune::SeqOverlappingSchwarzAssemblerHelper< ILU0SubdomainSolver< M, X, Y >, false >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -126,15 +126,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02020.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02020.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::SeqOverlappingSchwarzAssemblerHelper< ILUNSubdomainSolver< M, X, Y >, false > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n
    \n Inheritance diagram for Dune::SeqOverlappingSchwarzAssemblerHelper< ILUNSubdomainSolver< M, X, Y >, false >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -126,15 +126,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02024.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02024.html", "unified_diff": "@@ -73,21 +73,21 @@\n \n \n
    \n
    Dune::SeqOverlappingSchwarzDomainSize< M > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n

    Detailed Description

    \n
    template<class M>
    \n struct Dune::SeqOverlappingSchwarzDomainSize< M >

    template helper struct to determine the size of a domain for the SeqOverlappingSchwarz solver

    \n

    only implemented for BCRSMatrix<T>

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02028.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02028.html", "unified_diff": "@@ -77,15 +77,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::SeqOverlappingSchwarzDomainSize< BCRSMatrix< T, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/overlappingschwarz.hh>

    \n+

    #include <dune/istl/overlappingschwarz.hh>

    \n \n \n \n \n \n

    \n Static Public Member Functions

    template<class Domain >
    static int size (const Domain &d)
     
    \n@@ -173,15 +173,15 @@\n \n
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02032.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02032.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::OwnerOverlapCopyAttributeSet Struct Reference
    \n \n
    \n \n

    Attribute set for overlapping Schwarz. \n More...

    \n \n-

    #include <dune/istl/owneroverlapcopy.hh>

    \n+

    #include <dune/istl/owneroverlapcopy.hh>

    \n \n \n \n@@ -112,15 +112,15 @@\n \n \n

    \n Public Types

    enum  AttributeSet { owner =1\n , overlap =2\n , copy =3\n }
    overlap 
    copy 
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02036.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02036.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::IndexInfoFromGrid< G, L > Class Template Reference
    \n \n
    \n \n

    Information about the index distribution. \n More...

    \n \n-

    #include <dune/istl/owneroverlapcopy.hh>

    \n+

    #include <dune/istl/owneroverlapcopy.hh>

    \n \n \n \n \n \n \n@@ -358,15 +358,15 @@\n \n

    Get the set of remote indices.

    \n
    Returns
    the set of remote indices.
    \n \n \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02040.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02040.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType > Class Template Reference
    \n \n
    \n \n

    A class setting up standard communication for a two-valued attribute set with owner/overlap/copy semantics. \n More...

    \n \n-

    #include <dune/istl/owneroverlapcopy.hh>

    \n+

    #include <dune/istl/owneroverlapcopy.hh>

    \n

    \n Public Types

    typedef G GlobalIdType
     The type of the global index.
     
    typedef L LocalIdType
    \n \n \n \n \n \n@@ -1400,15 +1400,15 @@\n \n

    Get the underlying remote indices.

    \n
    Returns
    The underlying remote indices.
    \n \n \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02044.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02044.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::CopyGatherScatter< T > Struct Template Reference
    \n \n
    \n \n

    gather/scatter callback for communication \n More...

    \n \n-

    #include <dune/istl/owneroverlapcopy.hh>

    \n+

    #include <dune/istl/owneroverlapcopy.hh>

    \n

    \n Classes

    struct  AddGatherScatter
     
    struct  CopyGatherScatter
     gather/scatter callback for communication More...
    \n \n \n \n

    \n Public Types

    typedef CommPolicy< T >::IndexedType V
     
    \n \n

    \n@@ -205,15 +205,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02048.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02048.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::OwnerOverlapCopyCommunication< GlobalIdType, LocalIdType >::AddGatherScatter< T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/owneroverlapcopy.hh>

    \n+

    #include <dune/istl/owneroverlapcopy.hh>

    \n \n \n \n \n

    \n Public Types

    typedef CommPolicy< T >::IndexedType V
     
    \n \n

    \n@@ -198,15 +198,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02052.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02052.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::AggregationCriterion< T > Class Template Reference
    \n \n
    \n \n

    Base class of all aggregation criterions. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n
    \n Inheritance diagram for Dune::Amg::AggregationCriterion< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -124,15 +124,15 @@\n  Sets reasonable default values for an aisotropic problem.
    \n  \n \n

    Detailed Description

    \n
    template<class T>
    \n class Dune::Amg::AggregationCriterion< T >

    Base class of all aggregation criterions.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02056.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02056.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::Amg::SymmetricMatrixDependency< M, N > Class Template Reference
    \n
    \n
    \n \n

    Dependency policy for symmetric matrices. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n
    \n Inheritance diagram for Dune::Amg::SymmetricMatrixDependency< M, N >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -289,15 +289,15 @@\n \n \n \n
    MThe type of the matrix
    NThe type of the metric that turns matrix blocks into field values
    \n \n \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02060.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02060.html", "unified_diff": "@@ -82,15 +82,15 @@\n \n \n
    \n \n

    Dependency policy for symmetric matrices. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n
    \n Inheritance diagram for Dune::Amg::Dependency< M, N >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -283,15 +283,15 @@\n  The norm of the current diagonal.
    \n  \n \n

    Detailed Description

    \n
    template<class M, class N>
    \n class Dune::Amg::Dependency< M, N >

    Dependency policy for symmetric matrices.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02064.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02064.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::Amg::SymmetricDependency< M, N > Class Template Reference
    \n
    \n
    \n \n

    Dependency policy for symmetric matrices. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n
    \n Inheritance diagram for Dune::Amg::SymmetricDependency< M, N >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -283,15 +283,15 @@\n  The norm of the current diagonal.
    \n  \n \n

    Detailed Description

    \n
    template<class M, class N>
    \n class Dune::Amg::SymmetricDependency< M, N >

    Dependency policy for symmetric matrices.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02068.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02068.html", "unified_diff": "@@ -80,15 +80,15 @@\n \n
    \n
    \n \n

    Norm that uses only the [N][N] entry of the block to determine couplings. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n
    \n Inheritance diagram for Dune::Amg::Diagonal< N >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -115,15 +115,15 @@\n  Compute the norm of a scalar.
    \n  \n \n

    Detailed Description

    \n
    template<int N>
    \n class Dune::Amg::Diagonal< N >

    Norm that uses only the [N][N] entry of the block to determine couplings.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02072.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02072.html", "unified_diff": "@@ -80,15 +80,15 @@\n \n
    \n
    \n \n

    Norm that uses only the [0][0] entry of the block to determine couplings. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n
    \n Inheritance diagram for Dune::Amg::FirstDiagonal:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -223,15 +223,15 @@\n \n \n \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02076.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02076.html", "unified_diff": "@@ -80,15 +80,15 @@\n \n \n
    \n \n

    Functor using the row sum (infinity) norm to determine strong couplings. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { is_sign_preserving = false\n }
     
    \n@@ -99,15 +99,15 @@\n \n \n
     compute the norm of a matrix.
     
    \n

    Detailed Description

    \n

    Functor using the row sum (infinity) norm to determine strong couplings.

    \n

    The is proposed by several people for elasticity problems.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02080.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02080.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members \n \n \n
    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { is_sign_preserving = false\n }
     
    \n@@ -93,15 +93,15 @@\n Public Member Functions\n \n \n \n \n
    template<class M >
    FieldTraits< typenameM::field_type >::real_type operator() (const M &m) const
     compute the norm of a matrix.
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02084.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02084.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members \n \n \n
    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { is_sign_preserving = false\n }
     
    \n@@ -93,15 +93,15 @@\n Public Member Functions\n \n \n \n \n
    template<class M >
    FieldTraits< typenameM::field_type >::real_type operator() (const M &m) const
     compute the norm of a matrix.
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02088.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02088.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::Amg::SymmetricCriterion< M, Norm > Class Template Reference
    \n \n
    \n \n

    Criterion taking advantage of symmetric matrices. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n
    \n Inheritance diagram for Dune::Amg::SymmetricCriterion< M, Norm >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -831,15 +831,15 @@\n
    \n \n

    index of the currently evaluated row.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02092.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02092.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::Amg::UnSymmetricCriterion< M, Norm > Class Template Reference
    \n \n
    \n \n

    Criterion suitable for unsymmetric matrices. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n
    \n Inheritance diagram for Dune::Amg::UnSymmetricCriterion< M, Norm >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -832,15 +832,15 @@\n
    \n \n

    index of the currently evaluated row.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02096.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02096.html", "unified_diff": "@@ -81,15 +81,15 @@\n \n \n
    \n \n

    Class for building the aggregates. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n \n \n \n \n \n \n@@ -112,15 +112,15 @@\n \n \n

    \n Public Types

    typedef G MatrixGraph
     The matrix graph type used.
     
    typedef MatrixGraph::VertexDescriptor Vertex
     Build the aggregates.
     
    \n

    Detailed Description

    \n
    template<class G>
    \n class Dune::Amg::Aggregator< G >

    Class for building the aggregates.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02100.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02100.html", "unified_diff": "@@ -82,15 +82,15 @@\n \n \n
    \n \n

    Class providing information about the mapping of the vertices onto aggregates. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n
    \n Inheritance diagram for Dune::Amg::AggregatesMap< V >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -180,15 +180,15 @@\n  \n \n

    Detailed Description

    \n
    template<class V>
    \n class Dune::Amg::AggregatesMap< V >

    Class providing information about the mapping of the vertices onto aggregates.

    \n

    It is assumed that the vertices are consecutively numbered from 0 to the maximum vertex number.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02104.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02104.html", "unified_diff": "@@ -79,27 +79,27 @@\n
    Dune::Amg::AggregatesMap< V >::DummyEdgeVisitor Class Reference
    \n
    \n
    \n \n

    A Dummy visitor that does nothing for each visited edge. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n \n \n \n \n \n

    \n Public Member Functions

    template<class EdgeIterator >
    void operator() (const EdgeIterator &edge) const
     
    \n

    Detailed Description

    \n
    template<class V>
    \n class Dune::Amg::AggregatesMap< V >::DummyEdgeVisitor

    A Dummy visitor that does nothing for each visited edge.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02108.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02108.html", "unified_diff": "@@ -80,15 +80,15 @@\n \n \n
    \n \n

    A class for temporarily storing the vertices of an aggregate in. \n More...

    \n \n-

    #include <dune/istl/paamg/aggregates.hh>

    \n+

    #include <dune/istl/paamg/aggregates.hh>

    \n
    \n Inheritance diagram for Dune::Amg::Aggregate< G, S >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -153,15 +153,15 @@\n  get an iterator over the vertices of the aggregate.
    \n  \n \n

    Detailed Description

    \n
    template<class G, class S>
    \n class Dune::Amg::Aggregate< G, S >

    A class for temporarily storing the vertices of an aggregate in.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02148.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02148.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::KAMG< M, X, S, PI, K, A > Class Template Reference
    \n
    \n
    \n \n

    an algebraic multigrid method using a Krylov-cycle. \n More...

    \n \n-

    #include <dune/istl/paamg/kamg.hh>

    \n+

    #include <dune/istl/paamg/kamg.hh>

    \n
    \n Inheritance diagram for Dune::Amg::KAMG< M, X, S, PI, K, A >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -481,16 +481,16 @@\n

    Category of the preconditioner (see SolverCategory::Category)

    \n \n

    Implements Dune::Preconditioner< X, X >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following files:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02152.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02152.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::KAmgTwoGrid< AMG > Class Template Referenceabstract
    \n \n
    \n \n

    Two grid operator for AMG with Krylov cycle. \n More...

    \n \n-

    #include <dune/istl/paamg/kamg.hh>

    \n+

    #include <dune/istl/paamg/kamg.hh>

    \n
    \n Inheritance diagram for Dune::Amg::KAmgTwoGrid< AMG >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -675,16 +675,16 @@\n \n \n \n \n
    \n
    \n
    The documentation for this class was generated from the following files:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02156.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02156.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::Amg::AMG< M, X, S, PI, A > Class Template Reference
    \n \n
    \n \n

    Parallel algebraic multigrid based on agglomeration. \n More...

    \n \n-

    #include <dune/istl/paamg/amg.hh>

    \n+

    #include <dune/istl/paamg/amg.hh>

    \n
    \n Inheritance diagram for Dune::Amg::AMG< M, X, S, PI, A >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -267,15 +267,15 @@\n
    \n \n

    The range type of the preconditioner.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02168.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02168.html", "unified_diff": "@@ -79,15 +79,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::Amg::DirectSolverSelector< Matrix, Vector > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/amg.hh>

    \n+

    #include <dune/istl/paamg/amg.hh>

    \n \n \n \n \n \n \n@@ -117,15 +117,15 @@\n Static Public Attributes\n \n \n \n \n

    \n Classes

    struct  Solver
     
    struct  Solver< M, superlu >
     
    static constexpr SolverType solver
     
    static constexpr bool isDirectSolver = solver != none
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02172.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02172.html", "unified_diff": "@@ -77,30 +77,30 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::DirectSolverSelector< Matrix, Vector >::Solver< M, SolverType > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/amg.hh>

    \n+

    #include <dune/istl/paamg/amg.hh>

    \n \n \n \n \n

    \n Public Types

    typedef InverseOperator< Vector, Vector > type
     
    \n \n \n \n \n \n

    \n Static Public Member Functions

    static typecreate (const M &mat, bool verbose, bool reusevector)
     
    static std::string name ()
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02176.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02176.html", "unified_diff": "@@ -77,30 +77,30 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::DirectSolverSelector< Matrix, Vector >::Solver< M, superlu > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/amg.hh>

    \n+

    #include <dune/istl/paamg/amg.hh>

    \n \n \n \n \n

    \n Public Types

    typedef SuperLU< M > type
     
    \n \n \n \n \n \n

    \n Static Public Member Functions

    static typecreate (const M &mat, bool verbose, bool reusevector)
     
    static std::string name ()
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02180.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02180.html", "unified_diff": "@@ -77,15 +77,15 @@\n Classes |\n Public Member Functions |\n List of all members \n
    Dune::AMGCreator Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/amg.hh>

    \n+

    #include <dune/istl/paamg/amg.hh>

    \n \n \n \n \n \n \n@@ -108,15 +108,15 @@\n \n \n \n \n \n

    \n 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
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02184.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02184.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::AMGCreator::isValidBlockType< class > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/paamg/amg.hh>

    \n+

    #include <dune/istl/paamg/amg.hh>

    \n
    \n Inheritance diagram for Dune::AMGCreator::isValidBlockType< class >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02188.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02188.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::AMGCreator::isValidBlockType< FieldMatrix< T, n, m > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/paamg/amg.hh>

    \n+

    #include <dune/istl/paamg/amg.hh>

    \n
    \n Inheritance diagram for Dune::AMGCreator::isValidBlockType< FieldMatrix< T, n, m > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02192.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02192.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::Amg::ApplyHelper< i > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/combinedfunctor.hh>

    \n+

    #include <dune/istl/paamg/combinedfunctor.hh>

    \n \n \n \n \n \n

    \n Static Public Member Functions

    template<class TT , class T >
    static void apply (TT tuple, const T &t)
     
    \n@@ -126,15 +126,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02196.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02196.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::Amg::ApplyHelper< 0 > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/combinedfunctor.hh>

    \n+

    #include <dune/istl/paamg/combinedfunctor.hh>

    \n \n \n \n \n \n

    \n Static Public Member Functions

    template<class TT , class T >
    static void apply (TT tuple, const T &t)
     
    \n@@ -124,15 +124,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02200.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02200.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::Amg::CombinedFunctor< T > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/combinedfunctor.hh>

    \n+

    #include <dune/istl/paamg/combinedfunctor.hh>

    \n
    \n Inheritance diagram for Dune::Amg::CombinedFunctor< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -157,15 +157,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02204.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02204.html", "unified_diff": "@@ -77,28 +77,28 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::ConstructionTraits< BlockVector< T, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/construction.hh>

    \n+

    #include <dune/istl/paamg/construction.hh>

    \n \n \n \n \n

    \n Public Types

    typedef const int Arguments
     
    \n \n \n \n

    \n Static Public Member Functions

    static std::shared_ptr< BlockVector< T, A > > construct (Arguments &n)
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02208.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02208.html", "unified_diff": "@@ -77,30 +77,30 @@\n Public Member Functions |\n Public Attributes |\n List of all members \n
    Dune::Amg::ParallelOperatorArgs< M, C > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/construction.hh>

    \n+

    #include <dune/istl/paamg/construction.hh>

    \n \n \n \n \n

    \n Public Member Functions

     ParallelOperatorArgs (std::shared_ptr< M > matrix, const C &comm)
     
    \n \n \n \n \n \n

    \n Public Attributes

    std::shared_ptr< M > matrix_
     
    const C & comm_
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02212.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02212.html", "unified_diff": "@@ -77,30 +77,30 @@\n Public Member Functions |\n Public Attributes |\n List of all members \n
    Dune::Amg::OwnerOverlapCopyCommunicationArgs Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/construction.hh>

    \n+

    #include <dune/istl/paamg/construction.hh>

    \n \n \n \n \n

    \n Public Member Functions

     OwnerOverlapCopyCommunicationArgs (MPI_Comm comm, SolverCategory::Category cat)
     
    \n \n \n \n \n \n

    \n Public Attributes

    MPI_Comm comm_
     
    SolverCategory::Category cat_
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02216.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02216.html", "unified_diff": "@@ -77,28 +77,28 @@\n Public Member Functions |\n Public Attributes |\n List of all members \n \n \n
    \n \n-

    #include <dune/istl/paamg/construction.hh>

    \n+

    #include <dune/istl/paamg/construction.hh>

    \n \n \n \n \n

    \n Public Member Functions

     SequentialCommunicationArgs (Communication< void * > comm, int cat)
     
    \n \n \n \n

    \n Public Attributes

    Communication< void * > comm_
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02220.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02220.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::OverlappingSchwarzOperator< M, X, Y, C > Class Template Reference
    \n \n
    \n \n

    An overlapping Schwarz operator. \n More...

    \n \n-

    #include <dune/istl/schwarz.hh>

    \n+

    #include <dune/istl/schwarz.hh>

    \n
    \n Inheritance diagram for Dune::OverlappingSchwarzOperator< M, X, Y, C >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -511,16 +511,16 @@\n

    get the sequential assembled linear operator.

    \n \n

    Implements Dune::AssembledLinearOperator< M, X, Y >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following files:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02224.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02224.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::ConstructionTraits< OverlappingSchwarzOperator< M, X, Y, C > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/construction.hh>

    \n+

    #include <dune/istl/paamg/construction.hh>

    \n \n \n \n \n

    \n Public Types

    typedef ParallelOperatorArgs< M, C > Arguments
     
    \n \n

    \n@@ -136,15 +136,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02228.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02228.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::ConstructionTraits< NonoverlappingSchwarzOperator< M, X, Y, C > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/construction.hh>

    \n+

    #include <dune/istl/paamg/construction.hh>

    \n \n \n \n \n

    \n Public Types

    typedef ParallelOperatorArgs< M, C > Arguments
     
    \n \n

    \n@@ -136,15 +136,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02232.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02232.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Member Functions |\n Public Attributes |\n List of all members \n
    Dune::Amg::MatrixAdapterArgs< M, X, Y > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/construction.hh>

    \n+

    #include <dune/istl/paamg/construction.hh>

    \n \n \n \n \n

    \n Public Member Functions

     MatrixAdapterArgs (std::shared_ptr< M > matrix, const SequentialInformation)
     
    \n \n

    \n@@ -146,15 +146,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02236.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02236.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::ConstructionTraits< MatrixAdapter< M, X, Y > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/construction.hh>

    \n+

    #include <dune/istl/paamg/construction.hh>

    \n \n \n \n \n

    \n Public Types

    typedef const MatrixAdapterArgs< M, X, Y > Arguments
     
    \n \n

    \n@@ -136,15 +136,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02240.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02240.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::ConstructionTraits< SequentialInformation > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/construction.hh>

    \n+

    #include <dune/istl/paamg/construction.hh>

    \n \n \n \n \n

    \n Public Types

    typedef const SequentialCommunicationArgs Arguments
     
    \n \n

    \n@@ -132,15 +132,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02244.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02244.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::ConstructionTraits< OwnerOverlapCopyCommunication< T1, T2 > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/construction.hh>

    \n+

    #include <dune/istl/paamg/construction.hh>

    \n \n \n \n \n

    \n Public Types

    typedef const OwnerOverlapCopyCommunicationArgs Arguments
     
    \n \n

    \n@@ -136,15 +136,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02248.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02248.html", "unified_diff": "@@ -80,15 +80,15 @@\n \n \n
    \n \n

    Class representing the properties of an edge in the matrix graph. \n More...

    \n \n-

    #include <dune/istl/paamg/dependency.hh>

    \n+

    #include <dune/istl/paamg/dependency.hh>

    \n \n \n \n@@ -140,15 +140,15 @@\n \n \n

    \n Public Types

    enum  { INFLUENCE\n , DEPEND\n , SIZE\n }
     Prints the attributes of the edge for debugging.
     
    \n

    Detailed Description

    \n

    Class representing the properties of an edge in the matrix graph.

    \n

    During the coarsening process the matrix graph needs to hold different properties of its edges. This class contains methods for getting and setting these edge attributes.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02252.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02252.html", "unified_diff": "@@ -80,15 +80,15 @@\n \n \n
    \n \n

    Class representing a node in the matrix graph. \n More...

    \n \n-

    #include <dune/istl/paamg/dependency.hh>

    \n+

    #include <dune/istl/paamg/dependency.hh>

    \n \n \n \n \n

    \n Public Types

    enum  {
    \n   ISOLATED\n , VISITED\n , FRONT\n@@ -150,15 +150,15 @@\n
     Reset all flags.
     
    \n

    Detailed Description

    \n

    Class representing a node in the matrix graph.

    \n

    Contains methods for getting and setting node attributes.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02256.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02256.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members \n
    Dune::Amg::PropertyGraphVertexPropertyMap< G, i > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/dependency.hh>

    \n+

    #include <dune/istl/paamg/dependency.hh>

    \n
    \n Inheritance diagram for Dune::Amg::PropertyGraphVertexPropertyMap< G, i >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -125,15 +125,15 @@\n  Default constructor.
    \n  \n Reference operator[] (const Vertex &vertex) const\n  Get the properties associated to a vertex.
    \n  \n \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02260.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02260.html", "unified_diff": "@@ -76,23 +76,23 @@\n \n
    Dune::PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/paamg/dependency.hh>

    \n+

    #include <dune/istl/paamg/dependency.hh>

    \n \n \n \n \n

    \n Public Types

    typedef Amg::PropertyGraphVertexPropertyMap< Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM >, Amg::VertexProperties::VISITEDType
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02264.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02264.html", "unified_diff": "@@ -81,15 +81,15 @@\n \n \n
    \n \n

    A fast (sequential) algebraic multigrid based on agglomeration that saves memory bandwidth. \n More...

    \n \n-

    #include <dune/istl/paamg/fastamg.hh>

    \n+

    #include <dune/istl/paamg/fastamg.hh>

    \n
    \n Inheritance diagram for Dune::Amg::FastAMG< M, X, PI, A >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -257,15 +257,15 @@\n
    \n \n

    The range type of the preconditioner.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02272.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02272.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::Amg::GaussSeidelPresmoothDefect< level > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/fastamgsmoother.hh>

    \n+

    #include <dune/istl/paamg/fastamgsmoother.hh>

    \n \n \n \n \n \n

    \n Static Public Member Functions

    template<typename M , typename X , typename Y >
    static void apply (const M &A, X &x, Y &d, const Y &b)
     
    \n@@ -138,15 +138,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02276.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02276.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::Amg::GaussSeidelPostsmoothDefect< level > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/fastamgsmoother.hh>

    \n+

    #include <dune/istl/paamg/fastamgsmoother.hh>

    \n \n \n \n \n \n

    \n Static Public Member Functions

    template<typename M , typename X , typename Y >
    static void apply (const M &A, X &x, Y &d, const Y &b)
     
    \n@@ -138,15 +138,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02280.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02280.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Attributes |\n List of all members \n \n \n
    \n \n-

    #include <dune/istl/paamg/galerkin.hh>

    \n+

    #include <dune/istl/paamg/galerkin.hh>

    \n \n \n \n \n \n \n@@ -98,15 +98,15 @@\n \n \n \n \n \n

    \n Public Types

    typedef T Aggregate
     The aggregate descriptor.
     
    typedef T Vertex
     The aggregate the vertex belongs to.
     
    Vertex vertex
     The vertex descriptor.
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02284.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02284.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::Amg::SparsityBuilder< M > Class Template Reference
    \n \n
    \n \n

    Functor for building the sparsity pattern of the matrix using examineConnectivity. \n More...

    \n \n-

    #include <dune/istl/paamg/galerkin.hh>

    \n+

    #include <dune/istl/paamg/galerkin.hh>

    \n \n \n \n \n \n \n@@ -103,15 +103,15 @@\n \n \n

    \n Public Member Functions

     SparsityBuilder (M &matrix)
     Constructor.
     
    void insert (const typename M::size_type &index)
    std::size_t index ()
     
    \n

    Detailed Description

    \n
    template<class M>
    \n class Dune::Amg::SparsityBuilder< M >

    Functor for building the sparsity pattern of the matrix using examineConnectivity.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02288.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02288.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n \n \n
    \n \n-

    #include <dune/istl/paamg/galerkin.hh>

    \n+

    #include <dune/istl/paamg/galerkin.hh>

    \n
    \n Inheritance diagram for Dune::Amg::BaseGalerkinProduct:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -101,15 +101,15 @@\n  Calculate the galerkin product.
    \n  \n template<class M , class V , class P , class O > \n void calculate (const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const P &pinfo, const O &copy)\n  \n \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02292.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02292.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Types |\n Public Member Functions |\n List of all members
    \n
    Dune::Amg::GalerkinProduct< T > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/galerkin.hh>

    \n+

    #include <dune/istl/paamg/galerkin.hh>

    \n
    \n Inheritance diagram for Dune::Amg::GalerkinProduct< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -110,15 +110,15 @@\n  Calculate the galerkin product.
    \n  \n template<class M , class V , class P , class O > \n void calculate (const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const P &pinfo, const O &copy)\n  \n \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02300.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02300.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::Amg::GalerkinProduct< SequentialInformation > Class Reference
    \n
    \n
    \n \n-

    #include <dune/istl/paamg/galerkin.hh>

    \n+

    #include <dune/istl/paamg/galerkin.hh>

    \n
    \n Inheritance diagram for Dune::Amg::GalerkinProduct< SequentialInformation >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -103,15 +103,15 @@\n  Calculate the galerkin product.
    \n  \n template<class M , class V , class P , class O > \n void calculate (const M &fine, const AggregatesMap< V > &aggregates, M &coarse, const P &pinfo, const O &copy)\n  \n \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02304.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02304.html", "unified_diff": "@@ -77,15 +77,15 @@\n Classes |\n Static Public Member Functions |\n List of all members
    \n \n \n
    \n \n-

    #include <dune/istl/paamg/galerkin.hh>

    \n+

    #include <dune/istl/paamg/galerkin.hh>

    \n
    \n Inheritance diagram for Dune::Amg::BaseConnectivityConstructor:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -108,15 +108,15 @@\n  \n template<class R , class G , class V > \n static void constructNonOverlapConnectivity (R &row, G &graph, V &visitedMap, const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::VertexDescriptor &seed)\n  Construct the connectivity of an aggregate in the overlap.
    \n  \n \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02308.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02308.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::BaseConnectivityConstructor::ConnectedBuilder< G, S, V > Class Template Reference
    \n
    \n
    \n \n

    Visitor for identifying connected aggregates during a breadthFirstSearch. \n More...

    \n \n-

    #include <dune/istl/paamg/galerkin.hh>

    \n+

    #include <dune/istl/paamg/galerkin.hh>

    \n \n \n \n \n \n \n@@ -113,15 +113,15 @@\n \n \n

    \n Public Types

    typedef G Graph
     The type of the graph.
     
    typedef Graph::ConstEdgeIterator ConstEdgeIterator
     Process an edge pointing to another aggregate.
     
    \n

    Detailed Description

    \n
    template<class G, class S, class V>
    \n class Dune::Amg::BaseConnectivityConstructor::ConnectedBuilder< G, S, V >

    Visitor for identifying connected aggregates during a breadthFirstSearch.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02312.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02312.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::ConnectivityConstructor< G, T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/galerkin.hh>

    \n+

    #include <dune/istl/paamg/galerkin.hh>

    \n
    \n Inheritance diagram for Dune::Amg::ConnectivityConstructor< G, T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -108,15 +108,15 @@\n  \n template<class R , class G , class V > \n static void constructNonOverlapConnectivity (R &row, G &graph, V &visitedMap, const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::VertexDescriptor &seed)\n  Construct the connectivity of an aggregate in the overlap.
    \n  \n \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02316.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02316.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members
    \n
    Dune::Amg::ConnectivityConstructor< G, SequentialInformation > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/galerkin.hh>

    \n+

    #include <dune/istl/paamg/galerkin.hh>

    \n
    \n Inheritance diagram for Dune::Amg::ConnectivityConstructor< G, SequentialInformation >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -108,15 +108,15 @@\n  \n template<class R , class G , class V > \n static void constructNonOverlapConnectivity (R &row, G &graph, V &visitedMap, const AggregatesMap< typename G::VertexDescriptor > &aggregates, const typename G::VertexDescriptor &seed)\n  Construct the connectivity of an aggregate in the overlap.
    \n  \n \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02320.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02320.html", "unified_diff": "@@ -76,24 +76,24 @@\n \n
    Dune::Amg::DirichletBoundarySetter< T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/paamg/galerkin.hh>

    \n+

    #include <dune/istl/paamg/galerkin.hh>

    \n \n \n \n \n \n

    \n Static Public Member Functions

    template<class M , class O >
    static void set (M &coarse, const T &pinfo, const O &copy)
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02324.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02324.html", "unified_diff": "@@ -76,24 +76,24 @@\n \n
    Dune::Amg::DirichletBoundarySetter< SequentialInformation > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/galerkin.hh>

    \n+

    #include <dune/istl/paamg/galerkin.hh>

    \n \n \n \n \n \n

    \n Static Public Member Functions

    template<class M , class O >
    static void set (M &coarse, const SequentialInformation &pinfo, const O &copy)
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02328.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02328.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Types |\n Public Member Functions |\n List of all members \n
    Dune::Amg::GlobalAggregatesMap< T, TI > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/globalaggregates.hh>

    \n+

    #include <dune/istl/paamg/globalaggregates.hh>

    \n \n \n \n \n

    \n Classes

    class  Proxy
     
    \n \n

    \n@@ -355,15 +355,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02332.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02332.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::Amg::GlobalAggregatesMap< T, TI >::Proxy Class Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/globalaggregates.hh>

    \n+

    #include <dune/istl/paamg/globalaggregates.hh>

    \n \n \n \n \n \n \n@@ -154,15 +154,15 @@\n \n

    \n Public Member Functions

     Proxy (const GlobalLookupIndexSet< ParallelIndexSet > &indexset, Vertex &aggregate)
     
    Proxyoperator= (const GlobalIndex &global)
     
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02336.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02336.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::AggregatesGatherScatter< T, TI > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/globalaggregates.hh>

    \n+

    #include <dune/istl/paamg/globalaggregates.hh>

    \n \n \n \n \n \n \n@@ -210,15 +210,15 @@\n \n

    \n Public Types

    typedef TI ParallelIndexSet
     
    typedef ParallelIndexSet::GlobalIndex GlobalIndex
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02340.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02340.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::Amg::AggregatesPublisher< T, O, I > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/paamg/globalaggregates.hh>

    \n+

    #include <dune/istl/paamg/globalaggregates.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02344.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02344.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::AggregatesPublisher< T, O, OwnerOverlapCopyCommunication< T1, T2 > > Struct Template Reference
    \n \n
    \n \n

    Utility class for publishing the aggregate number of the DOFs in the overlap to other processors and convert them to local indices. \n More...

    \n \n-

    #include <dune/istl/paamg/globalaggregates.hh>

    \n+

    #include <dune/istl/paamg/globalaggregates.hh>

    \n \n \n \n \n \n \n@@ -239,15 +239,15 @@\n \n

    \n Public Types

    typedef T Vertex
     
    typedef O OverlapFlags
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02348.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02348.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::AggregatesPublisher< T, O, SequentialInformation > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/globalaggregates.hh>

    \n+

    #include <dune/istl/paamg/globalaggregates.hh>

    \n \n \n \n \n \n \n@@ -188,15 +188,15 @@\n \n

    \n Public Types

    typedef T Vertex
     
    typedef SequentialInformation ParallelInformation
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02352.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02352.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::CommPolicy< Amg::GlobalAggregatesMap< T, TI > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/globalaggregates.hh>

    \n+

    #include <dune/istl/paamg/globalaggregates.hh>

    \n \n \n \n \n \n \n@@ -182,15 +182,15 @@\n \n

    \n Public Types

    typedef Amg::AggregatesMap< T > Type
     
    typedef Amg::GlobalAggregatesMap< T, TI >::IndexedType IndexedType
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02356.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02356.html", "unified_diff": "@@ -81,15 +81,15 @@\n \n \n
    \n \n

    The (undirected) graph of a matrix. \n More...

    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n
    \n Inheritance diagram for Dune::Amg::MatrixGraph< M >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -780,15 +780,15 @@\n
    \n \n

    Get the number of vertices in the graph.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02360.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02360.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::MatrixGraph< M >::EdgeIteratorT< C > Class Template Reference
    \n \n
    \n \n

    Iterator over all edges starting from a vertex. \n More...

    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n \n \n \n \n \n@@ -625,15 +625,15 @@\n
    \n \n

    Access the edge weight.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02364.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02364.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::MatrixGraph< M >::VertexIteratorT< C > Class Template Reference
    \n \n
    \n \n

    The vertex iterator type of the graph. \n More...

    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n

    \n Public Types

    enum  { isMutable = std::is_same<C, MutableContainer>::value\n }
     
    typedef std::remove_const< C >::type MutableContainer
    \n \n \n \n \n@@ -547,15 +547,15 @@\n
    \n \n

    Access the weight of the vertex.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02368.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02368.html", "unified_diff": "@@ -81,15 +81,15 @@\n \n \n
    \n \n

    A subgraph of a graph. \n More...

    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n
    \n Inheritance diagram for Dune::Amg::SubGraph< G, T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -564,15 +564,15 @@\n
    \n \n

    Get the number of vertices in the graph.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02372.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02372.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::SubGraph< G, T >::EdgeIndexMap Class Reference
    \n \n
    \n \n

    An index map for mapping the edges to indices. \n More...

    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n

    \n Public Types

    enum  { isMutable = std::is_same<C, MutableContainer>::value\n }
     
    typedef std::remove_const< C >::type MutableContainer
    \n \n \n \n

    \n Public Types

    typedef ReadablePropertyMapTag Category
     
    \n \n

    \n@@ -207,15 +207,15 @@\n

    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02376.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02376.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::Amg::SubGraph< G, T >::EdgeIterator Class Reference
    \n \n
    \n \n

    The edge iterator of the graph. \n More...

    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n
    \n Inheritance diagram for Dune::Amg::SubGraph< G, T >::EdgeIterator:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -378,15 +378,15 @@\n
    \n \n

    The index of the target vertex of the current edge.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02380.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02380.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::Amg::SubGraph< G, T >::VertexIterator Class Reference
    \n \n
    \n \n

    The vertex iterator of the graph. \n More...

    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n
    \n Inheritance diagram for Dune::Amg::SubGraph< G, T >::VertexIterator:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -320,15 +320,15 @@\n
    \n \n

    Preincrement operator.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02384.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02384.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::Amg::VertexPropertiesGraph< G, VP, VM > Class Template Reference
    \n \n
    \n \n

    Attaches properties to the vertices of a graph. \n More...

    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n \n \n \n \n

    \n Classes

    class  VertexIteratorT
     
    \n \n \n \n \n \n

    \n@@ -700,15 +700,15 @@\n
    \n \n

    Get the number of vertices in the graph.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02388.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02388.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members \n
    Dune::Amg::VertexPropertiesGraph< G, VP, VM >::VertexIteratorT< C > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n
    \n Inheritance diagram for Dune::Amg::VertexPropertiesGraph< G, VP, VM >::VertexIteratorT< C >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -354,15 +354,15 @@\n
    \n \n

    Get the properties of the current Vertex.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02392.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02392.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM > Class Template Reference
    \n \n
    \n \n

    Attaches properties to the edges and vertices of a graph. \n More...

    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n \n \n \n \n \n \n@@ -954,15 +954,15 @@\n
    \n \n

    Get the number of vertices in the graph.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02396.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02396.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members\n
    Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::EdgeIteratorT< C > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n
    \n Inheritance diagram for Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::EdgeIteratorT< C >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -277,15 +277,15 @@\n
    \n \n

    Get the properties of the current edge.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02400.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02400.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members\n
    Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::VertexIteratorT< C > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n
    \n Inheritance diagram for Dune::Amg::PropertiesGraph< G, VP, EP, VM, EM >::VertexIteratorT< C >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -331,15 +331,15 @@\n
    \n \n

    Get the properties of the current Vertex.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02404.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02404.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::GraphVertexPropertiesSelector< G > Class Template Reference
    \n \n
    \n \n

    Wrapper to access the internal edge properties of a graph via operator[]() \n More...

    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n

    \n Classes

    class  EdgeIteratorT
     
    class  VertexIteratorT
     
    \n \n \n \n \n \n@@ -268,15 +268,15 @@\n

    \n Public Types

    typedef G Graph
     The type of the graph with internal properties.
     
    typedef G::VertexProperties VertexProperties
    \n \n \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02408.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02408.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::GraphEdgePropertiesSelector< G > Class Template Reference
    \n \n
    \n \n

    Wrapper to access the internal vertex properties of a graph via operator[]() \n More...

    \n \n-

    #include <dune/istl/paamg/graph.hh>

    \n+

    #include <dune/istl/paamg/graph.hh>

    \n \n \n \n \n \n \n@@ -268,15 +268,15 @@\n

    \n Public Types

    typedef G Graph
     The type of the graph with internal properties.
     
    typedef G::EdgeProperties EdgeProperties
    \n \n \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02412.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02412.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::PropertiesGraphCreator< M, PI > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/graphcreator.hh>

    \n+

    #include <dune/istl/paamg/graphcreator.hh>

    \n \n \n \n \n \n \n@@ -263,15 +263,15 @@\n \n

    \n Public Types

    typedef M::matrix_type Matrix
     
    typedef Dune::Amg::MatrixGraph< const MatrixMatrixGraph
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02416.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02416.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::PropertiesGraphCreator< M, SequentialInformation > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/graphcreator.hh>

    \n+

    #include <dune/istl/paamg/graphcreator.hh>

    \n \n \n \n \n \n \n@@ -245,15 +245,15 @@\n \n

    \n Public Types

    typedef M::matrix_type Matrix
     
    typedef Dune::Amg::MatrixGraph< const MatrixMatrixGraph
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02420.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02420.html", "unified_diff": "@@ -81,15 +81,15 @@\n \n \n
    \n \n

    A hierarchy of containers (e.g. matrices or vectors) \n More...

    \n \n-

    #include <dune/istl/paamg/hierarchy.hh>

    \n+

    #include <dune/istl/paamg/hierarchy.hh>

    \n
    \n Inheritance diagram for Dune::Amg::Hierarchy< T, A >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -289,15 +289,15 @@\n
    \n \n

    Construct an empty hierarchy.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02424.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02424.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::Amg::Hierarchy< T, A >::LevelIterator< C, T1 > Class Template Reference
    \n \n
    \n \n

    Iterator over the levels in the hierarchy. \n More...

    \n \n-

    #include <dune/istl/paamg/hierarchy.hh>

    \n+

    #include <dune/istl/paamg/hierarchy.hh>

    \n
    \n Inheritance diagram for Dune::Amg::Hierarchy< T, A >::LevelIterator< C, T1 >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -543,15 +543,15 @@\n \n

    Check whether there was a redistribution at the current level.

    \n
    Returns
    True if there is a redistributed version of the container at the current level.
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02432.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02432.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::Amg::IndicesCoarsener< T, E > Class Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/paamg/indicescoarsener.hh>

    \n+

    #include <dune/istl/paamg/indicescoarsener.hh>

    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02436.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02436.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::ParallelIndicesCoarsener< T, E > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/indicescoarsener.hh>

    \n+

    #include <dune/istl/paamg/indicescoarsener.hh>

    \n
    \n Inheritance diagram for Dune::Amg::ParallelIndicesCoarsener< T, E >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -123,15 +123,15 @@\n 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, bool useFixedOrder=false)
     Build the coarse index set after the aggregatio.
     
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02444.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02444.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::IndicesCoarsener< OwnerOverlapCopyCommunication< G, L >, E > Class Template Reference
    \n \n
    \n \n

    Coarsen Indices in the parallel case. \n More...

    \n \n-

    #include <dune/istl/paamg/indicescoarsener.hh>

    \n+

    #include <dune/istl/paamg/indicescoarsener.hh>

    \n
    \n Inheritance diagram for Dune::Amg::IndicesCoarsener< OwnerOverlapCopyCommunication< G, L >, E >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -376,15 +376,15 @@\n \n \n
    Returns
    The number of unknowns on the coarse level.
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02448.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02448.html", "unified_diff": "@@ -79,28 +79,28 @@\n
    Dune::Amg::IndicesCoarsener< SequentialInformation, E > Class Template Reference
    \n \n
    \n \n

    Coarsen Indices in the sequential case. \n More...

    \n \n-

    #include <dune/istl/paamg/indicescoarsener.hh>

    \n+

    #include <dune/istl/paamg/indicescoarsener.hh>

    \n \n \n \n \n \n

    \n 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, bool useFixedOrder=false)
     
    \n

    Detailed Description

    \n
    template<typename E>
    \n class Dune::Amg::IndicesCoarsener< SequentialInformation, E >

    Coarsen Indices in the sequential case.

    \n

    Nothing to be coarsened here. Just renumber the aggregates consecutively

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02452.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02452.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::Amg::MatrixHierarchy< M, PI, A > Class Template Reference
    \n \n
    \n \n

    The hierarchies build by the coarsening process. \n More...

    \n \n-

    #include <dune/istl/paamg/matrixhierarchy.hh>

    \n+

    #include <dune/istl/paamg/matrixhierarchy.hh>

    \n \n \n \n \n \n \n@@ -424,15 +424,15 @@\n \n

    \n Public Types

    typedef M MatrixOperator
     The type of the matrix operator.
     
    typedef MatrixOperator::matrix_type Matrix
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02464.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02464.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Member Functions |\n Public Attributes |\n List of all members \n
    Dune::Amg::MatrixHierarchy< M, PI, A >::MatrixStats< Matrix, true >::calc Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/matrixhierarchy.hh>

    \n+

    #include <dune/istl/paamg/matrixhierarchy.hh>

    \n \n \n \n \n \n \n@@ -257,15 +257,15 @@\n \n

    \n Public Types

    typedef Matrix::size_type size_type
     
    typedef Matrix::row_type matrix_row
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02468.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02468.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::CoarsenCriterion< T > Class Template Reference
    \n \n
    \n \n

    The criterion describing the stop criteria for the coarsening process. \n More...

    \n \n-

    #include <dune/istl/paamg/matrixhierarchy.hh>

    \n+

    #include <dune/istl/paamg/matrixhierarchy.hh>

    \n
    \n Inheritance diagram for Dune::Amg::CoarsenCriterion< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -233,15 +233,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02472.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02472.html", "unified_diff": "@@ -79,15 +79,15 @@\n \n \n
    \n \n

    Parameters needed to check whether a node depends on another. \n More...

    \n \n-

    #include <dune/istl/paamg/parameters.hh>

    \n+

    #include <dune/istl/paamg/parameters.hh>

    \n
    \n Inheritance diagram for Dune::Amg::DependencyParameters:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -136,15 +136,15 @@\n double alpha () const\n  Get the scaling value for marking connections as strong. Default value is 1/3.
    \n  \n \n

    Detailed Description

    \n

    Parameters needed to check whether a node depends on another.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02476.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02476.html", "unified_diff": "@@ -79,15 +79,15 @@\n \n
    \n
    \n \n

    Parameters needed for the aggregation process. \n More...

    \n \n-

    #include <dune/istl/paamg/parameters.hh>

    \n+

    #include <dune/istl/paamg/parameters.hh>

    \n
    \n Inheritance diagram for Dune::Amg::AggregationParameters:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -172,15 +172,15 @@\n double alpha () const\n  Get the scaling value for marking connections as strong. Default value is 1/3.
    \n  \n \n

    Detailed Description

    \n

    Parameters needed for the aggregation process.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02480.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02480.html", "unified_diff": "@@ -79,15 +79,15 @@\n \n
    \n
    \n \n

    Parameters for the complete coarsening process. \n More...

    \n \n-

    #include <dune/istl/paamg/parameters.hh>

    \n+

    #include <dune/istl/paamg/parameters.hh>

    \n
    \n Inheritance diagram for Dune::Amg::CoarseningParameters:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -209,15 +209,15 @@\n double alpha () const\n  Get the scaling value for marking connections as strong. Default value is 1/3.
    \n  \n \n

    Detailed Description

    \n

    Parameters for the complete coarsening process.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02484.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02484.html", "unified_diff": "@@ -79,15 +79,15 @@\n \n
    \n
    \n \n

    All parameters for AMG. \n More...

    \n \n-

    #include <dune/istl/paamg/parameters.hh>

    \n+

    #include <dune/istl/paamg/parameters.hh>

    \n
    \n Inheritance diagram for Dune::Amg::Parameters:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -240,15 +240,15 @@\n  Get the scaling value for marking connections as strong. Default value is 1/3.
    \n  \n \n

    Detailed Description

    \n

    All parameters for AMG.

    \n

    Instances of this class can be provided to CoarsenCriterion via its constructor.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02488.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02488.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members
    \n
    Dune::Amg::SequentialInformation Class Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/pinfo.hh>

    \n+

    #include <dune/istl/paamg/pinfo.hh>

    \n \n \n \n \n \n \n@@ -583,15 +583,15 @@\n \n

    \n Public Types

    typedef Communication< void * > MPICommunicator
     
    typedef EmptySet< int > CopyFlags
     
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02492.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02492.html", "unified_diff": "@@ -76,19 +76,19 @@\n \n \n
    \n \n

    Tag idnetifying the visited property of a vertex. \n More...

    \n \n-

    #include <dune/istl/paamg/properties.hh>

    \n+

    #include <dune/istl/paamg/properties.hh>

    \n

    Detailed Description

    \n

    Tag idnetifying the visited property of a vertex.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02496.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02496.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::RandomAccessBundledPropertyMap< C, K, i, T, R > Class Template Reference
    \n \n
    \n \n

    A property map that extracts one property out of a bundle using operator[]() \n More...

    \n \n-

    #include <dune/istl/paamg/properties.hh>

    \n+

    #include <dune/istl/paamg/properties.hh>

    \n
    \n Inheritance diagram for Dune::Amg::RandomAccessBundledPropertyMap< C, K, i, T, R >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -127,15 +127,15 @@\n  \n \n

    Detailed Description

    \n
    template<typename C, typename K, std::size_t i, typename T = typename C::ValueType, typename R = typename C::Reference>
    \n class Dune::Amg::RandomAccessBundledPropertyMap< C, K, i, T, R >

    A property map that extracts one property out of a bundle using operator[]()

    \n

    Using this access class properties can be stored in std::bitset.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02500.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02500.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Member Functions |\n Protected Attributes |\n List of all members
    \n
    Dune::Amg::AggregateRenumberer< G > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/renumberer.hh>

    \n+

    #include <dune/istl/paamg/renumberer.hh>

    \n \n \n \n \n \n

    \n Public Types

    typedef G::VertexDescriptor Vertex
     The vertex type.
     
    \n@@ -265,15 +265,15 @@\n \n
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02504.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02504.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::Amg::DefaultSmootherArgs< T > Struct Template Reference
    \n \n
    \n \n

    The default class for the smoother arguments. \n More...

    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n
    \n Inheritance diagram for Dune::Amg::DefaultSmootherArgs< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -118,15 +118,15 @@\n  The relaxation factor to use.
    \n  \n \n

    Detailed Description

    \n
    template<class T>
    \n struct Dune::Amg::DefaultSmootherArgs< T >

    The default class for the smoother arguments.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02508.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02508.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::Amg::SmootherTraits< T > Struct Template Reference
    \n
    \n
    \n \n

    Traits class for getting the attribute class of a smoother. \n More...

    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n
    \n Inheritance diagram for Dune::Amg::SmootherTraits< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -106,15 +106,15 @@\n typedef DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments\n  \n \n

    Detailed Description

    \n
    template<class T>
    \n struct Dune::Amg::SmootherTraits< T >

    Traits class for getting the attribute class of a smoother.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02512.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02512.html", "unified_diff": "@@ -76,23 +76,23 @@\n \n
    Dune::Amg::SmootherTraits< Richardson< X, Y > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n

    \n Public Types

    typedef DefaultSmootherArgs< typename X::field_type > Arguments
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02516.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02516.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::Amg::SmootherTraits< BlockPreconditioner< X, Y, C, T > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n
    \n Inheritance diagram for Dune::Amg::SmootherTraits< BlockPreconditioner< X, Y, C, T > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -94,15 +94,15 @@\n \n \n \n \n

    \n Public Types

    typedef DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02520.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02520.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::Amg::SmootherTraits< NonoverlappingBlockPreconditioner< C, T > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n
    \n Inheritance diagram for Dune::Amg::SmootherTraits< NonoverlappingBlockPreconditioner< C, T > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -94,15 +94,15 @@\n \n \n \n \n

    \n Public Types

    typedef DefaultSmootherArgs< typename T::matrix_type::field_type > Arguments
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02524.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02524.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::DefaultConstructionArgs< T > Class Template Reference
    \n
    \n
    \n \n

    Construction Arguments for the default smoothers. \n More...

    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n
    \n Inheritance diagram for Dune::Amg::DefaultConstructionArgs< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -131,15 +131,15 @@\n const Matrix * matrix_\n  \n \n

    Detailed Description

    \n
    template<class T>
    \n class Dune::Amg::DefaultConstructionArgs< T >

    Construction Arguments for the default smoothers.

    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02528.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02528.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Member Functions |\n Protected Attributes |\n List of all members
    \n
    Dune::Amg::ConstructionArgs< T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n
    \n Inheritance diagram for Dune::Amg::ConstructionArgs< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -115,15 +115,15 @@\n \n \n \n \n

    \n Protected Attributes

    const Matrix * matrix_
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02532.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02532.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Member Functions |\n Protected Attributes |\n List of all members
    \n
    Dune::Amg::DefaultParallelConstructionArgs< T, C > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n
    \n Inheritance diagram for Dune::Amg::DefaultParallelConstructionArgs< T, C >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -121,15 +121,15 @@\n \n \n \n \n

    \n Protected Attributes

    const Matrix * matrix_
     
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02536.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02536.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::Amg::DefaultConstructionArgs< Richardson< X, Y > > Class Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n \n \n@@ -96,15 +96,15 @@\n \n \n \n \n \n

    \n Public Member Functions

    virtual ~DefaultConstructionArgs ()
     
    template<class... Args>
    void setMatrix (const Args &...)
     
    const SequentialInformationgetComm ()
     
    const SmootherArgs getArgs () const
     
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02540.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02540.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::ConstructionTraits< SeqSSOR< M, X, Y, l > > Struct Template Reference
    \n \n
    \n \n

    Policy for the construction of the SeqSSOR smoother. \n More...

    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n

    \n Public Types

    typedef DefaultConstructionArgs< SeqSSOR< M, X, Y, l > > Arguments
     
    \n \n \n

    \n@@ -96,15 +96,15 @@\n

    static std::shared_ptr< SeqSSOR< M, X, Y, l > > construct (Arguments &args)
     
    \n

    Detailed Description

    \n
    template<class M, class X, class Y, int l>
    \n struct Dune::Amg::ConstructionTraits< SeqSSOR< M, X, Y, l > >

    Policy for the construction of the SeqSSOR smoother.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02544.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02544.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::ConstructionTraits< SeqSOR< M, X, Y, l > > Struct Template Reference
    \n \n
    \n \n

    Policy for the construction of the SeqSOR smoother. \n More...

    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n

    \n Public Types

    typedef DefaultConstructionArgs< SeqSOR< M, X, Y, l > > Arguments
     
    \n \n \n

    \n@@ -96,15 +96,15 @@\n

    static std::shared_ptr< SeqSOR< M, X, Y, l > > construct (Arguments &args)
     
    \n

    Detailed Description

    \n
    template<class M, class X, class Y, int l>
    \n struct Dune::Amg::ConstructionTraits< SeqSOR< M, X, Y, l > >

    Policy for the construction of the SeqSOR smoother.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02548.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02548.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::ConstructionTraits< SeqJac< M, X, Y, l > > Struct Template Reference
    \n \n
    \n \n

    Policy for the construction of the SeqJac smoother. \n More...

    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n

    \n Public Types

    typedef DefaultConstructionArgs< SeqJac< M, X, Y, l > > Arguments
     
    \n \n \n

    \n@@ -96,15 +96,15 @@\n

    static std::shared_ptr< SeqJac< M, X, Y, l > > construct (Arguments &args)
     
    \n

    Detailed Description

    \n
    template<class M, class X, class Y, int l>
    \n struct Dune::Amg::ConstructionTraits< SeqJac< M, X, Y, l > >

    Policy for the construction of the SeqJac smoother.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02552.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02552.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::ConstructionTraits< Richardson< X, Y > > Struct Template Reference
    \n \n
    \n \n

    Policy for the construction of the Richardson smoother. \n More...

    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n

    \n Public Types

    typedef DefaultConstructionArgs< Richardson< X, Y > > Arguments
     
    \n \n \n

    \n@@ -96,15 +96,15 @@\n

    static std::shared_ptr< Richardson< X, Y > > construct (Arguments &args)
     
    \n

    Detailed Description

    \n
    template<class X, class Y>
    \n struct Dune::Amg::ConstructionTraits< Richardson< X, Y > >

    Policy for the construction of the Richardson smoother.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02556.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02556.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Member Functions |\n Protected Attributes |\n List of all members \n
    Dune::Amg::ConstructionArgs< SeqILU< M, X, Y > > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n
    \n Inheritance diagram for Dune::Amg::ConstructionArgs< SeqILU< M, X, Y > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -333,15 +333,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02560.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02560.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::ConstructionTraits< SeqILU< M, X, Y > > Struct Template Reference
    \n \n
    \n \n

    Policy for the construction of the SeqILU smoother. \n More...

    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n

    \n Public Types

    typedef ConstructionArgs< SeqILU< M, X, Y > > Arguments
     
    \n \n \n

    \n@@ -96,15 +96,15 @@\n

    static std::shared_ptr< SeqILU< M, X, Y > > construct (Arguments &args)
     
    \n

    Detailed Description

    \n
    template<class M, class X, class Y>
    \n struct Dune::Amg::ConstructionTraits< SeqILU< M, X, Y > >

    Policy for the construction of the SeqILU smoother.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02564.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02564.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::ConstructionTraits< ParSSOR< M, X, Y, C > > Struct Template Reference
    \n \n
    \n \n

    Policy for the construction of the ParSSOR smoother. \n More...

    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n

    \n Public Types

    typedef DefaultParallelConstructionArgs< M, C > Arguments
     
    \n \n \n

    \n@@ -96,15 +96,15 @@\n

    static std::shared_ptr< ParSSOR< M, X, Y, C > > construct (Arguments &args)
     
    \n

    Detailed Description

    \n
    template<class M, class X, class Y, class C>
    \n struct Dune::Amg::ConstructionTraits< ParSSOR< M, X, Y, C > >

    Policy for the construction of the ParSSOR smoother.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02568.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02568.html", "unified_diff": "@@ -77,30 +77,30 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::ConstructionTraits< BlockPreconditioner< X, Y, C, T > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n \n \n

    \n Public Types

    typedef DefaultParallelConstructionArgs< T, C > Arguments
     
    typedef ConstructionTraits< T > SeqConstructionTraits
     
    \n \n \n \n

    \n Static Public Member Functions

    static std::shared_ptr< BlockPreconditioner< X, Y, C, T > > construct (Arguments &args)
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02572.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02572.html", "unified_diff": "@@ -77,30 +77,30 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::ConstructionTraits< NonoverlappingBlockPreconditioner< C, T > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n \n \n

    \n Public Types

    typedef DefaultParallelConstructionArgs< T, C > Arguments
     
    typedef ConstructionTraits< T > SeqConstructionTraits
     
    \n \n \n \n

    \n Static Public Member Functions

    static std::shared_ptr< NonoverlappingBlockPreconditioner< C, T > > construct (Arguments &args)
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02576.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02576.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Amg::SmootherApplier< T > Struct Template Reference
    \n \n
    \n \n

    Helper class for applying the smoothers. \n More...

    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n \n \n@@ -106,15 +106,15 @@\n

    \n Public Types

    typedef T Smoother
     
    typedef Smoother::range_type Range
     
    \n

    Detailed Description

    \n
    template<class T>
    \n struct Dune::Amg::SmootherApplier< T >

    Helper class for applying the smoothers.

    \n

    The goal of this class is to get a symmetric AMG method whenever possible.

    \n

    The specializations for SOR and SeqOverlappingSchwarz in MultiplicativeSchwarzMode will apply the smoother forward when pre and backward when post smoothing.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02580.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02580.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::SmootherApplier< SeqSOR< M, X, Y, l > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n \n \n@@ -96,15 +96,15 @@\n Static Public Member Functions\n \n \n \n \n

    \n 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)
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02584.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02584.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::SmootherApplier< BlockPreconditioner< X, Y, C, SeqSOR< M, X, Y, l > > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n \n \n@@ -96,15 +96,15 @@\n Static Public Member Functions\n \n \n \n \n

    \n 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)
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02588.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02588.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::SmootherApplier< NonoverlappingBlockPreconditioner< C, SeqSOR< M, X, Y, l > > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n \n \n@@ -96,15 +96,15 @@\n Static Public Member Functions\n \n \n \n \n

    \n 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)
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02592.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02592.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::SmootherApplier< SeqOverlappingSchwarz< M, X, MultiplicativeSchwarzMode, MS, TA > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n \n \n@@ -96,15 +96,15 @@\n Static Public Member Functions\n \n \n \n \n

    \n 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)
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02596.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02596.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Member Functions |\n Public Attributes |\n List of all members \n
    Dune::Amg::SeqOverlappingSchwarzSmootherArgs< T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n
    \n Inheritance diagram for Dune::Amg::SeqOverlappingSchwarzSmootherArgs< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -121,15 +121,15 @@\n  The number of iterations to perform.
    \n  \n RelaxationFactor relaxationFactor\n  The relaxation factor to use.
    \n  \n \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02600.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02600.html", "unified_diff": "@@ -76,23 +76,23 @@\n \n
    Dune::Amg::SmootherTraits< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n

    \n Public Types

    typedef SeqOverlappingSchwarzSmootherArgs< typename M::field_type > Arguments
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02604.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02604.html", "unified_diff": "@@ -79,15 +79,15 @@\n Public Member Functions |\n Protected Attributes |\n List of all members \n
    Dune::Amg::ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n
    \n Inheritance diagram for Dune::Amg::ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -348,15 +348,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02620.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02620.html", "unified_diff": "@@ -77,28 +77,28 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::ConstructionTraits< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/smoother.hh>

    \n+

    #include <dune/istl/paamg/smoother.hh>

    \n \n \n \n \n

    \n Public Types

    typedef ConstructionArgs< SeqOverlappingSchwarz< M, X, TM, TS, TA > > Arguments
     
    \n \n \n \n

    \n Static Public Member Functions

    static std::shared_ptr< SeqOverlappingSchwarz< M, X, TM, TS, TA > > construct (Arguments &args)
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02624.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02624.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::Transfer< V1, V2, T > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/transfer.hh>

    \n+

    #include <dune/istl/paamg/transfer.hh>

    \n \n \n \n \n \n \n@@ -298,15 +298,15 @@\n \n

    \n Public Types

    typedef V1 Vertex
     
    typedef V2 Vector
     
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02628.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02628.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Member Functions |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::Transfer< V, V1, SequentialInformation > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/transfer.hh>

    \n+

    #include <dune/istl/paamg/transfer.hh>

    \n \n \n \n \n \n \n@@ -288,15 +288,15 @@\n \n

    \n Public Types

    typedef V Vertex
     
    typedef V1 Vector
     
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02632.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02632.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Member Functions |\n List of all members \n
    Dune::Amg::Transfer< V, V1, OwnerOverlapCopyCommunication< T1, T2 > > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/paamg/transfer.hh>

    \n+

    #include <dune/istl/paamg/transfer.hh>

    \n \n \n \n \n \n \n@@ -149,15 +149,15 @@\n \n

    \n Public Types

    typedef V Vertex
     
    typedef V1 Vector
     
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02636.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02636.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::Amg::LevelTransferPolicy< FO, CO > Class Template Referenceabstract
    \n \n
    \n \n

    Abstract base class for transfer between levels and creation of the coarse level system. \n More...

    \n \n-

    #include <dune/istl/paamg/twolevelmethod.hh>

    \n+

    #include <dune/istl/paamg/twolevelmethod.hh>

    \n
    \n Inheritance diagram for Dune::Amg::LevelTransferPolicy< FO, CO >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -620,15 +620,15 @@\n
    \n \n

    The coarse level rhs.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02640.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02640.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::Amg::AggregationLevelTransferPolicy< O, C > Class Template Referenceabstract
    \n \n
    \n \n

    A LeveTransferPolicy that used aggregation to construct the coarse level system. \n More...

    \n \n-

    #include <dune/istl/paamg/twolevelmethod.hh>

    \n+

    #include <dune/istl/paamg/twolevelmethod.hh>

    \n
    \n Inheritance diagram for Dune::Amg::AggregationLevelTransferPolicy< O, C >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -722,15 +722,15 @@\n
    \n \n

    The coarse level rhs.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02644.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02644.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::Amg::OneStepAMGCoarseSolverPolicy< O, S, C > Class Template Reference
    \n \n
    \n \n

    A policy class for solving the coarse level system using one step of AMG. \n More...

    \n \n-

    #include <dune/istl/paamg/twolevelmethod.hh>

    \n+

    #include <dune/istl/paamg/twolevelmethod.hh>

    \n \n \n \n \n \n \n@@ -383,15 +383,15 @@\n

    \n Public Types

    typedef O Operator
     The type of the linear operator used.
     
    typedef O::range_type X
    \n \n \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02652.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02652.html", "unified_diff": "@@ -78,15 +78,15 @@\n Public Types |\n Public Member Functions |\n List of all members \n
    Dune::Amg::TwoLevelMethod< FO, CSP, S > Class Template Referenceabstract
    \n \n
    \n \n-

    #include <dune/istl/paamg/twolevelmethod.hh>

    \n+

    #include <dune/istl/paamg/twolevelmethod.hh>

    \n
    \n Inheritance diagram for Dune::Amg::TwoLevelMethod< FO, CSP, S >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -812,15 +812,15 @@\n \n \n \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02660.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02660.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Preconditioner< X, Y > Class Template Referenceabstract
    \n \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02664.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02664.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::InverseOperator2Preconditioner< O, c > Class Template Reference
    \n \n
    \n \n

    Turns an InverseOperator into a Preconditioner. \n More...

    \n \n-

    #include <dune/istl/preconditioners.hh>

    \n+

    #include <dune/istl/preconditioners.hh>

    \n
    \n Inheritance diagram for Dune::InverseOperator2Preconditioner< O, c >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -467,15 +467,15 @@\n \n \n

    Implements Dune::Preconditioner< O::domain_type, O::range_type >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02668.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02668.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::SeqSSOR< M, X, Y, l > Class Template Reference
    \n \n
    \n \n

    Sequential SSOR preconditioner. \n More...

    \n \n-

    #include <dune/istl/preconditioners.hh>

    \n+

    #include <dune/istl/preconditioners.hh>

    \n
    \n Inheritance diagram for Dune::SeqSSOR< M, X, Y, l >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -608,15 +608,15 @@\n \n \n

    Implements Dune::Preconditioner< X, Y >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02672.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02672.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::SeqSOR< M, X, Y, l > Class Template Reference
    \n \n
    \n \n

    Sequential SOR preconditioner. \n More...

    \n \n-

    #include <dune/istl/preconditioners.hh>

    \n+

    #include <dune/istl/preconditioners.hh>

    \n
    \n Inheritance diagram for Dune::SeqSOR< M, X, Y, l >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -657,15 +657,15 @@\n \n \n

    Implements Dune::Preconditioner< X, Y >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02676.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02676.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::SeqJac< M, X, Y, l > Class Template Reference
    \n \n
    \n \n

    The sequential jacobian preconditioner. \n More...

    \n \n-

    #include <dune/istl/preconditioners.hh>

    \n+

    #include <dune/istl/preconditioners.hh>

    \n
    \n Inheritance diagram for Dune::SeqJac< M, X, Y, l >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -608,15 +608,15 @@\n \n \n

    Implements Dune::Preconditioner< X, Y >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02680.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02680.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::SeqDILU< M, X, Y, l > Class Template Reference
    \n \n
    \n \n

    Sequential DILU preconditioner. \n More...

    \n \n-

    #include <dune/istl/preconditioners.hh>

    \n+

    #include <dune/istl/preconditioners.hh>

    \n
    \n Inheritance diagram for Dune::SeqDILU< M, X, Y, l >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -749,15 +749,15 @@\n
    \n \n

    true if w != 1.0

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02684.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02684.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::SeqILU< M, X, Y, l > Class Template Reference
    \n \n
    \n \n

    Sequential ILU preconditioner. \n More...

    \n \n-

    #include <dune/istl/preconditioners.hh>

    \n+

    #include <dune/istl/preconditioners.hh>

    \n
    \n Inheritance diagram for Dune::SeqILU< M, X, Y, l >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -891,15 +891,15 @@\n
    \n \n

    true if w != 1.0

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02688.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02688.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::Richardson< X, Y > Class Template Reference
    \n \n
    \n \n

    Richardson preconditioner. \n More...

    \n \n-

    #include <dune/istl/preconditioners.hh>

    \n+

    #include <dune/istl/preconditioners.hh>

    \n
    \n Inheritance diagram for Dune::Richardson< X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -495,15 +495,15 @@\n \n \n

    Implements Dune::Preconditioner< X, Y >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02692.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02692.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::SeqILDL< M, X, Y > Class Template Reference
    \n \n
    \n \n

    sequential ILDL preconditioner \n More...

    \n \n-

    #include <dune/istl/preconditioners.hh>

    \n+

    #include <dune/istl/preconditioners.hh>

    \n
    \n Inheritance diagram for Dune::SeqILDL< M, X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -595,15 +595,15 @@\n \n \n

    Implements Dune::Preconditioner< X, Y >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02700.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02700.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::RedistributeInterface Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/repartition.hh>

    \n+

    #include <dune/istl/repartition.hh>

    \n
    \n Inheritance diagram for Dune::RedistributeInterface:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -269,15 +269,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02720.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02720.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::ScalarProduct< X > Class Template Reference
    \n \n
    \n \n

    Base class for scalar product and norm computation. \n More...

    \n \n-

    #include <dune/istl/scalarproducts.hh>

    \n+

    #include <dune/istl/scalarproducts.hh>

    \n
    \n Inheritance diagram for Dune::ScalarProduct< X >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -316,15 +316,15 @@\n

    Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.

    \n \n

    Reimplemented in Dune::ParallelScalarProduct< X, C >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02724.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02724.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::ParallelScalarProduct< X, C > Class Template Reference
    \n \n
    \n \n

    Scalar product for overlapping Schwarz methods. \n More...

    \n \n-

    #include <dune/istl/scalarproducts.hh>

    \n+

    #include <dune/istl/scalarproducts.hh>

    \n
    \n Inheritance diagram for Dune::ParallelScalarProduct< X, C >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -408,15 +408,15 @@\n

    Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.

    \n \n

    Reimplemented from Dune::ScalarProduct< X >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02728.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02728.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::SeqScalarProduct< X > Class Template Reference
    \n \n
    \n \n

    Default implementation for the scalar case. \n More...

    \n \n-

    #include <dune/istl/scalarproducts.hh>

    \n+

    #include <dune/istl/scalarproducts.hh>

    \n
    \n Inheritance diagram for Dune::SeqScalarProduct< X >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -299,15 +299,15 @@\n

    Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.

    \n \n

    Reimplemented in Dune::ParallelScalarProduct< X, C >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02732.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02732.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::NonoverlappingSchwarzScalarProduct< X, C > Class Template Reference
    \n \n
    \n \n

    Nonoverlapping Scalar Product with communication object. \n More...

    \n \n-

    #include <dune/istl/scalarproducts.hh>

    \n+

    #include <dune/istl/scalarproducts.hh>

    \n
    \n Inheritance diagram for Dune::NonoverlappingSchwarzScalarProduct< X, C >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -397,15 +397,15 @@\n

    Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.

    \n \n

    Reimplemented from Dune::ScalarProduct< X >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02736.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02736.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::OverlappingSchwarzScalarProduct< X, C > Class Template Reference
    \n \n
    \n \n

    Scalar product for overlapping Schwarz methods. \n More...

    \n \n-

    #include <dune/istl/scalarproducts.hh>

    \n+

    #include <dune/istl/scalarproducts.hh>

    \n
    \n Inheritance diagram for Dune::OverlappingSchwarzScalarProduct< X, C >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -403,15 +403,15 @@\n

    Norm of a right-hand side vector. The vector must be consistent on the interior+border partition.

    \n \n

    Reimplemented from Dune::ScalarProduct< X >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02740.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02740.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::ScaledIdentityMatrix< K, n > Class Template Reference
    \n \n
    \n \n

    A multiple of the identity matrix of static size. \n More...

    \n \n-

    #include <dune/istl/scaledidmatrix.hh>

    \n+

    #include <dune/istl/scaledidmatrix.hh>

    \n \n \n \n \n@@ -2133,15 +2133,15 @@\n
    \n \n

    y += alpha A x

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02744.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02744.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::DenseMatrixAssigner< DenseMatrix, ScaledIdentityMatrix< field, N > > Struct Template Reference
    \n \n

    \n Public Types

    enum  { rows = n\n , cols = n\n }
     export size More...
    \n \n \n \n

    \n Static Public Member Functions

    static void apply (DenseMatrix &denseMatrix, ScaledIdentityMatrix< field, N > const &rhs)
     
    \n

    Member Function Documentation

    \n@@ -123,15 +123,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02748.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02748.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::FieldTraits< ScaledIdentityMatrix< K, n > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/scaledidmatrix.hh>

    \n+

    #include <dune/istl/scaledidmatrix.hh>

    \n \n \n \n \n \n \n@@ -119,15 +119,15 @@\n \n

    \n Public Types

    using field_type = typename ScaledIdentityMatrix< K, n >::field_type
     
    using real_type = typename FieldTraits< field_type >::real_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02752.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02752.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::ParSSOR< M, X, Y, C > Class Template Reference
    \n \n
    \n \n

    A parallel SSOR preconditioner. \n More...

    \n \n-

    #include <dune/istl/schwarz.hh>

    \n+

    #include <dune/istl/schwarz.hh>

    \n
    \n Inheritance diagram for Dune::ParSSOR< M, X, Y, C >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -475,15 +475,15 @@\n \n \n

    Implements Dune::Preconditioner< X, Y >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02756.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02756.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::BlockPreconditioner< X, Y, C, P > Class Template Reference
    \n \n
    \n \n

    Block parallel preconditioner. \n More...

    \n \n-

    #include <dune/istl/schwarz.hh>

    \n+

    #include <dune/istl/schwarz.hh>

    \n
    \n Inheritance diagram for Dune::BlockPreconditioner< X, Y, C, P >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -549,15 +549,15 @@\n \n \n

    Implements Dune::Preconditioner< X, Y >.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02760.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02760.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::InverseOperatorResult Struct Reference
    \n \n
    \n \n

    Statistics about the application of an inverse operator. \n More...

    \n \n-

    #include <dune/istl/solver.hh>

    \n+

    #include <dune/istl/solver.hh>

    \n \n \n \n \n \n \n@@ -269,15 +269,15 @@\n
    \n \n

    Reduction achieved: \"$.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02764.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02764.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::InverseOperator< X, Y > Class Template Referenceabstract
    \n \n
    \n \n

    Abstract base class for all solvers. \n More...

    \n \n-

    #include <dune/istl/solver.hh>

    \n+

    #include <dune/istl/solver.hh>

    \n
    \n Inheritance diagram for Dune::InverseOperator< X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -648,15 +648,15 @@\n
    \n \n

    helper function for printing solver output

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02768.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02768.html", "unified_diff": "@@ -84,15 +84,15 @@\n
    Dune::IterativeSolver< X, Y > Class Template Referenceabstract
    \n \n
    \n \n

    Base class for all implementations of iterative solvers. \n More...

    \n \n-

    #include <dune/istl/solver.hh>

    \n+

    #include <dune/istl/solver.hh>

    \n
    \n Inheritance diagram for Dune::IterativeSolver< X, Y >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -1324,15 +1324,15 @@\n \n

    \n Public Member Functions

     InverseOperatorResult ()
     Default constructor.
     
    void clear ()
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02772.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02772.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::IterativeSolver< X, Y >::Iteration< CountType > Class Template Reference
    \n \n
    \n \n

    Class for controlling iterative methods. \n More...

    \n \n-

    #include <dune/istl/solver.hh>

    \n+

    #include <dune/istl/solver.hh>

    \n \n \n \n \n \n \n@@ -526,15 +526,15 @@\n \n

    \n Public Member Functions

     Iteration (const IterativeSolver &parent, InverseOperatorResult &res)
     
     Iteration (const Iteration &)=delete
     
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02776.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02776.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix > Class Template Reference
    \n \n
    \n \n

    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). \n More...

    \n \n-

    #include <dune/istl/solver.hh>

    \n+

    #include <dune/istl/solver.hh>

    \n \n \n \n \n \n \n@@ -140,15 +140,15 @@\n \n

    \n Classes

    struct  Implementation
     Implementation that works together with iterative ISTL solvers, e.g. Dune::CGSolver or Dune::BiCGSTABSolver. More...
     
    struct  Implementation< true, Dummy >
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02780.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02780.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix >::Implementation< is_direct_solver, Dummy > Struct Template Reference
    \n \n
    \n \n

    Implementation that works together with iterative ISTL solvers, e.g. Dune::CGSolver or Dune::BiCGSTABSolver. \n More...

    \n \n-

    #include <dune/istl/solver.hh>

    \n+

    #include <dune/istl/solver.hh>

    \n \n \n \n \n

    \n Static Public Member Functions

    static void setMatrix (ISTLLinearSolver &, const BCRSMatrix &)
     
    \n

    Detailed Description

    \n@@ -132,15 +132,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02784.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02784.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::SolverHelper< ISTLLinearSolver, BCRSMatrix >::Implementation< true, Dummy > Struct Template Reference
    \n \n
    \n \n

    Implementation that works together with direct ISTL solvers, e.g. Dune::SuperLU or Dune::UMFPack. \n More...

    \n \n-

    #include <dune/istl/solver.hh>

    \n+

    #include <dune/istl/solver.hh>

    \n \n \n \n \n

    \n Static Public Member Functions

    static void setMatrix (ISTLLinearSolver &solver, const BCRSMatrix &matrix)
     
    \n

    Detailed Description

    \n@@ -132,15 +132,15 @@\n \n \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02788.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02788.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::SolverCategory Struct Reference
    \n \n
    \n \n

    Categories for the solvers. \n More...

    \n \n-

    #include <dune/istl/solvercategory.hh>

    \n+

    #include <dune/istl/solvercategory.hh>

    \n \n \n \n@@ -164,15 +164,15 @@\n
    \n \n

    Helperfunction to extract the solver category either from an enum, or from the newly introduced virtual member function.

    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02792.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02792.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::InvalidSolverCategory Class Reference
    \n
    \n
    \n \n-

    #include <dune/istl/solvercategory.hh>

    \n+

    #include <dune/istl/solvercategory.hh>

    \n
    \n Inheritance diagram for Dune::InvalidSolverCategory:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02796.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02796.html", "unified_diff": "@@ -79,15 +79,15 @@\n
    Dune::SolverFactory< Operator > Class Template Reference
    \n \n
    \n \n

    Factory to assembly solvers configured by a ParameterTree. \n More...

    \n \n-

    #include <dune/istl/solverfactory.hh>

    \n+

    #include <dune/istl/solverfactory.hh>

    \n

    \n Public Types

    enum  Category { sequential\n , nonoverlapping\n , overlapping\n }
    \n \n \n \n \n \n@@ -196,15 +196,15 @@\n
    \n \n

    Construct a Preconditioner for a given Operator.

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02812.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02812.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::UnsupportedType Class Reference
    \n
    \n
    \n \n-

    #include <dune/istl/solverregistry.hh>

    \n+

    #include <dune/istl/solverregistry.hh>

    \n
    \n Inheritance diagram for Dune::UnsupportedType:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02816.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02816.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::InvalidSolverFactoryConfiguration Class Reference
    \n
    \n
    \n \n-

    #include <dune/istl/solverregistry.hh>

    \n+

    #include <dune/istl/solverregistry.hh>

    \n
    \n Inheritance diagram for Dune::InvalidSolverFactoryConfiguration:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02820.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02820.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::LoopSolver< X > Class Template Referenceabstract
    \n \n
    \n \n

    Preconditioned loop solver. \n More...

    \n \n-

    #include <dune/istl/solvers.hh>

    \n+

    #include <dune/istl/solvers.hh>

    \n
    \n Inheritance diagram for Dune::LoopSolver< X >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -971,15 +971,15 @@\n \n

    \n 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)
    \n
    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02824.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02824.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::GradientSolver< X > Class Template Referenceabstract
    \n \n
    \n \n

    gradient method \n More...

    \n \n-

    #include <dune/istl/solvers.hh>

    \n+

    #include <dune/istl/solvers.hh>

    \n
    \n Inheritance diagram for Dune::GradientSolver< X >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -971,15 +971,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02828.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02828.html", "unified_diff": "@@ -84,15 +84,15 @@\n
    Dune::CGSolver< X > Class Template Referenceabstract
    \n \n
    \n \n

    conjugate gradient method \n More...

    \n \n-

    #include <dune/istl/solvers.hh>

    \n+

    #include <dune/istl/solvers.hh>

    \n
    \n Inheritance diagram for Dune::CGSolver< X >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -1234,15 +1234,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02832.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02832.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::BiCGSTABSolver< X > Class Template Referenceabstract
    \n \n
    \n \n

    Bi-conjugate Gradient Stabilized (BiCG-STAB) \n More...

    \n \n-

    #include <dune/istl/solvers.hh>

    \n+

    #include <dune/istl/solvers.hh>

    \n
    \n Inheritance diagram for Dune::BiCGSTABSolver< X >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -975,15 +975,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02836.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02836.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::MINRESSolver< X > Class Template Referenceabstract
    \n \n
    \n \n

    Minimal Residual Method (MINRES) \n More...

    \n \n-

    #include <dune/istl/solvers.hh>

    \n+

    #include <dune/istl/solvers.hh>

    \n
    \n Inheritance diagram for Dune::MINRESSolver< X >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -972,15 +972,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02840.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02840.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::RestartedGMResSolver< X, Y, F > Class Template Reference
    \n \n
    \n \n

    implements the Generalized Minimal Residual (GMRes) method \n More...

    \n \n-

    #include <dune/istl/solvers.hh>

    \n+

    #include <dune/istl/solvers.hh>

    \n
    \n Inheritance diagram for Dune::RestartedGMResSolver< X, Y, F >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -1595,15 +1595,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02844.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02844.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::RestartedFlexibleGMResSolver< X, Y, F > Class Template Reference
    \n \n
    \n \n

    implements the Flexible Generalized Minimal Residual (FGMRes) method (right preconditioned) \n More...

    \n \n-

    #include <dune/istl/solvers.hh>

    \n+

    #include <dune/istl/solvers.hh>

    \n
    \n Inheritance diagram for Dune::RestartedFlexibleGMResSolver< X, Y, F >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -1167,15 +1167,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02848.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02848.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::GeneralizedPCGSolver< X > Class Template Referenceabstract
    \n \n
    \n \n

    Generalized preconditioned conjugate gradient solver. \n More...

    \n \n-

    #include <dune/istl/solvers.hh>

    \n+

    #include <dune/istl/solvers.hh>

    \n
    \n Inheritance diagram for Dune::GeneralizedPCGSolver< X >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -1288,15 +1288,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02852.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02852.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::RestartedFCGSolver< X > Class Template Referenceabstract
    \n \n
    \n \n

    Accelerated flexible conjugate gradient method. \n More...

    \n \n-

    #include <dune/istl/solvers.hh>

    \n+

    #include <dune/istl/solvers.hh>

    \n
    \n Inheritance diagram for Dune::RestartedFCGSolver< X >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -1344,15 +1344,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02856.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02856.html", "unified_diff": "@@ -83,15 +83,15 @@\n
    Dune::CompleteFCGSolver< X > Class Template Referenceabstract
    \n \n
    \n \n

    Complete flexible conjugate gradient method. \n More...

    \n \n-

    #include <dune/istl/solvers.hh>

    \n+

    #include <dune/istl/solvers.hh>

    \n
    \n Inheritance diagram for Dune::CompleteFCGSolver< X >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -1003,15 +1003,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02860.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02860.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::IsDirectSolver< Solver > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/solvertype.hh>

    \n+

    #include <dune/istl/solvertype.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value =false\n }
     
    \n@@ -107,15 +107,15 @@\n

    If Solver is a direct solver, this is true.

    \n \n \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02864.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02864.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::StoresColumnCompressed< Solver > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/solvertype.hh>

    \n+

    #include <dune/istl/solvertype.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value = false\n }
     
    \n@@ -106,15 +106,15 @@\n Enumeratorvalue 

    whether the solver internally uses column compressed storage

    \n \n \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02868.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02868.html", "unified_diff": "@@ -76,26 +76,26 @@\n
    Dune::SPQR< Matrix > Class Template Reference
    \n \n
    \n \n

    Use the SPQR package to directly solve linear systems – empty default class. \n More...

    \n \n-

    #include <dune/istl/spqr.hh>

    \n+

    #include <dune/istl/spqr.hh>

    \n

    Detailed Description

    \n
    template<class Matrix>
    \n class Dune::SPQR< Matrix >

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

    \n
    Template Parameters
    \n \n \n
    Matrixthe matrix type defining the system Details on SPQR can be found on http://www.cise.ufl.edu/research/sparse/spqr/
    \n
    \n
    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02872.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02872.html", "unified_diff": "@@ -82,15 +82,15 @@\n
    Dune::SPQR< BCRSMatrix< FieldMatrix< T, n, m >, A > > Class Template Referenceabstract
    \n \n
    \n \n

    The SPQR direct sparse solver for matrices of type BCRSMatrix. \n More...

    \n \n-

    #include <dune/istl/spqr.hh>

    \n+

    #include <dune/istl/spqr.hh>

    \n
    \n Inheritance diagram for Dune::SPQR< BCRSMatrix< FieldMatrix< T, n, m >, A > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -557,15 +557,15 @@\n
    \n \n

    helper function for printing solver output

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02876.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02876.html", "unified_diff": "@@ -76,24 +76,24 @@\n \n
    Dune::IsDirectSolver< SPQR< BCRSMatrix< T, A > > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/spqr.hh>

    \n+

    #include <dune/istl/spqr.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value = true\n }
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02880.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02880.html", "unified_diff": "@@ -76,24 +76,24 @@\n \n
    Dune::StoresColumnCompressed< SPQR< BCRSMatrix< T, A > > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/spqr.hh>

    \n+

    #include <dune/istl/spqr.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value = true\n }
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02884.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02884.html", "unified_diff": "@@ -77,15 +77,15 @@\n Classes |\n Public Member Functions |\n List of all members \n
    Dune::SPQRCreator Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/spqr.hh>

    \n+

    #include <dune/istl/spqr.hh>

    \n \n \n \n \n \n \n@@ -96,15 +96,15 @@\n \n \n \n \n \n

    \n 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
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02888.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02888.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::SPQRCreator::isValidBlock< class > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/spqr.hh>

    \n+

    #include <dune/istl/spqr.hh>

    \n
    \n Inheritance diagram for Dune::SPQRCreator::isValidBlock< class >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02892.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02892.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::SPQRCreator::isValidBlock< FieldVector< double, 1 > > Struct Reference
    \n
    \n
    \n \n-

    #include <dune/istl/spqr.hh>

    \n+

    #include <dune/istl/spqr.hh>

    \n
    \n Inheritance diagram for Dune::SPQRCreator::isValidBlock< FieldVector< double, 1 > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02896.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02896.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::SuperLUSolveChooser< T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02900.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02900.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::SuperLUDenseMatChooser< T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02904.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02904.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::SuperLUQueryChooser< T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02908.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02908.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::QuerySpaceChooser< T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02924.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02924.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::SuperLU< M > Class Template Reference
    \n \n
    \n \n

    SuperLu Solver. \n More...

    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n
    \n Inheritance diagram for Dune::SuperLU< M >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -476,15 +476,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02928.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02928.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::IsDirectSolver< SuperLU< BCRSMatrix< T, A > > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value =true\n }
     
    \n@@ -105,15 +105,15 @@\n \n \n
    Enumerator
    value 
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02932.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02932.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::StoresColumnCompressed< SuperLU< BCRSMatrix< T, A > > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value = true\n }
     
    \n@@ -105,15 +105,15 @@\n \n \n
    Enumerator
    value 
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02936.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02936.html", "unified_diff": "@@ -77,15 +77,15 @@\n Classes |\n Public Member Functions |\n List of all members \n
    Dune::SuperLUCreator Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n \n \n \n \n \n \n@@ -203,15 +203,15 @@\n \n

    \n Classes

    struct  isValidBlock
     
    struct  isValidBlock< double >
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02940.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02940.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::SuperLUCreator::isValidBlock< class > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n
    \n Inheritance diagram for Dune::SuperLUCreator::isValidBlock< class >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02944.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02944.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< double, k > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n
    \n Inheritance diagram for Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< double, k > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02948.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02948.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< std::complex< double >, k > > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n
    \n Inheritance diagram for Dune::SuperLUCreator::isValidBlock< Dune::FieldVector< std::complex< double >, k > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02952.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02952.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::SuperLUCreator::isValidBlock< double > Struct Reference
    \n
    \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n
    \n Inheritance diagram for Dune::SuperLUCreator::isValidBlock< double >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02956.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02956.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::SuperLUCreator::isValidBlock< std::complex< double > > Struct Reference
    \n
    \n
    \n \n-

    #include <dune/istl/superlu.hh>

    \n+

    #include <dune/istl/superlu.hh>

    \n
    \n Inheritance diagram for Dune::SuperLUCreator::isValidBlock< std::complex< double > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02960.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02960.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::SuperMatrixCreateSparseChooser< T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02964.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02964.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::SuperMatrixPrinter< T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02968.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02968.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::BaseGetSuperLUType< T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    \n Inheritance diagram for Dune::BaseGetSuperLUType< T >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -137,15 +137,15 @@\n
    std::is_same<T,float>::value ? SLU_S :
    \n
    ( std::is_same<T,std::complex<double> >::value ? SLU_Z :
    \n
    ( std::is_same<T,std::complex<float> >::value ? SLU_C : SLU_D ))
    \n
    \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02972.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02972.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::GetSuperLUType< T > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02976.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02976.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Attributes |\n List of all members \n
    Dune::GetSuperLUType< double > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    \n Inheritance diagram for Dune::GetSuperLUType< double >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -140,15 +140,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02980.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02980.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Attributes |\n List of all members \n
    Dune::GetSuperLUType< float > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    \n Inheritance diagram for Dune::GetSuperLUType< float >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -140,15 +140,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02984.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02984.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Attributes |\n List of all members \n
    Dune::GetSuperLUType< std::complex< double > > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    \n Inheritance diagram for Dune::GetSuperLUType< std::complex< double > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -140,15 +140,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02988.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02988.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Static Public Attributes |\n List of all members \n
    Dune::GetSuperLUType< std::complex< float > > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    \n Inheritance diagram for Dune::GetSuperLUType< std::complex< float > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -140,15 +140,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02992.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02992.html", "unified_diff": "@@ -76,30 +76,30 @@\n
    Dune::SuperLUMatrix< M > Struct Template Reference
    \n \n
    \n \n

    Utility class for converting an ISTL Matrix into a SuperLU Matrix. \n More...

    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    \n Inheritance diagram for Dune::SuperLUMatrix< M >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n

    Detailed Description

    \n
    template<class M>
    \n struct Dune::SuperLUMatrix< M >

    Utility class for converting an ISTL Matrix into a SuperLU Matrix.

    \n

    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a02996.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a02996.html", "unified_diff": "@@ -73,17 +73,17 @@\n \n \n
    \n
    Dune::SuperMatrixInitializer< M > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03000.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03000.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::SuperLUMatrix< BCRSMatrix< B, TA > > Class Template Reference
    \n \n
    \n \n

    Converter for BCRSMatrix to SuperLU Matrix. \n More...

    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    \n Inheritance diagram for Dune::SuperLUMatrix< BCRSMatrix< B, TA > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -491,15 +491,15 @@\n \n \n \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03004.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03004.html", "unified_diff": "@@ -77,15 +77,15 @@\n Public Types |\n Public Member Functions |\n List of all members \n
    Dune::SuperMatrixInitializer< BCRSMatrix< B, A > > Class Template Reference
    \n \n
    \n \n-

    #include <dune/istl/supermatrix.hh>

    \n+

    #include <dune/istl/supermatrix.hh>

    \n
    \n Inheritance diagram for Dune::SuperMatrixInitializer< BCRSMatrix< B, A > >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -225,15 +225,15 @@\n \n \n
    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03008.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03008.html", "unified_diff": "@@ -76,23 +76,23 @@\n \n
    Dune::UMFPackMethodChooser< T > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/umfpack.hh>

    \n+

    #include <dune/istl/umfpack.hh>

    \n \n \n \n \n

    \n Static Public Attributes

    static constexpr bool valid = false
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03012.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03012.html", "unified_diff": "@@ -77,15 +77,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::UMFPackMethodChooser< double > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/umfpack.hh>

    \n+

    #include <dune/istl/umfpack.hh>

    \n \n \n \n \n \n \n@@ -118,15 +118,15 @@\n

    \n Static Public Member Functions

    template<typename... A>
    static void defaults (A... args)
     
    template<typename... A>
    \n \n \n \n

    \n Static Public Attributes

    static constexpr bool valid = true
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03016.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03016.html", "unified_diff": "@@ -78,15 +78,15 @@\n Static Public Member Functions |\n Static Public Attributes |\n List of all members \n
    Dune::UMFPackMethodChooser< std::complex< double > > Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/umfpack.hh>

    \n+

    #include <dune/istl/umfpack.hh>

    \n \n \n \n \n

    \n Public Types

    using size_type = SuiteSparse_long
     
    \n

    \n@@ -124,15 +124,15 @@\n

    \n \n \n \n

    \n Static Public Attributes

    static constexpr bool valid = true
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03048.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03048.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::UMFPack< M > Class Template Reference
    \n \n
    \n \n

    The UMFPack direct sparse solver. \n More...

    \n \n-

    #include <dune/istl/umfpack.hh>

    \n+

    #include <dune/istl/umfpack.hh>

    \n
    \n Inheritance diagram for Dune::UMFPack< M >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -191,15 +191,15 @@\n \n \n
    Matrixthe matrix type defining the system
    \n \n \n
    Note
    This will only work if dune-istl has been configured to use UMFPack
    \n

    The documentation for this class was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03052.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03052.html", "unified_diff": "@@ -76,24 +76,24 @@\n \n
    Dune::IsDirectSolver< UMFPack< BCRSMatrix< FieldMatrix< T, n, m >, A > > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/umfpack.hh>

    \n+

    #include <dune/istl/umfpack.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value =true\n }
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03056.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03056.html", "unified_diff": "@@ -76,24 +76,24 @@\n \n
    Dune::StoresColumnCompressed< UMFPack< BCRSMatrix< T, A > > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/umfpack.hh>

    \n+

    #include <dune/istl/umfpack.hh>

    \n \n \n \n \n

    \n Public Types

    enum  { value = true\n }
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03060.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03060.html", "unified_diff": "@@ -77,15 +77,15 @@\n Classes |\n Public Member Functions |\n List of all members \n
    Dune::UMFPackCreator Struct Reference
    \n \n
    \n \n-

    #include <dune/istl/umfpack.hh>

    \n+

    #include <dune/istl/umfpack.hh>

    \n \n \n \n \n \n \n@@ -96,15 +96,15 @@\n \n \n \n \n \n

    \n Classes

    struct  isValidBlock
     
    struct  isValidBlock< TL, M, std::enable_if_t< std::is_same_v< Impl::UMFPackDomainType< M >, typename Dune::TypeListElement< 1, TL >::type > &&std::is_same_v< Impl::UMFPackRangeType< M >, typename Dune::TypeListElement< 2, TL >::type > > >
     
    std::shared_ptr< Dune::InverseOperator< Impl::UMFPackDomainType< M >, Impl::UMFPackRangeType< M > > > operator() (TL, const M &mat, const Dune::ParameterTree &config, std::enable_if_t< isValidBlock< TL, M >::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< TL, M >::value, int >=0) const
     
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03064.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03064.html", "unified_diff": "@@ -73,27 +73,27 @@\n \n \n
    \n
    Dune::UMFPackCreator::isValidBlock< TL, M, class > Struct Template Reference
    \n
    \n
    \n \n-

    #include <dune/istl/umfpack.hh>

    \n+

    #include <dune/istl/umfpack.hh>

    \n
    \n Inheritance diagram for Dune::UMFPackCreator::isValidBlock< TL, M, class >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n \"\"\n \n
    \n
    The documentation for this struct was generated from the following file:\n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03072.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03072.html", "unified_diff": "@@ -81,15 +81,15 @@\n
    Dune::VariableBlockVector< B, A > Class Template Reference
    \n \n
    \n \n

    A Vector of blocks with different blocksizes. \n More...

    \n \n-

    #include <dune/istl/vbvector.hh>

    \n+

    #include <dune/istl/vbvector.hh>

    \n
    \n Inheritance diagram for Dune::VariableBlockVector< B, A >:
    \n
    \n
    \"Inheritance
    \n \n \"\"\n \"\"\n@@ -1281,15 +1281,15 @@\n
    \n \n

    Exchange the storage and internal state with other.

    \n \n
    \n
    \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03076.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03076.html", "unified_diff": "@@ -80,15 +80,15 @@\n
    Dune::VariableBlockVector< B, A >::CreateIterator Class Reference
    \n \n
    \n \n

    Iterator class for sequential creation of blocks. \n More...

    \n \n-

    #include <dune/istl/vbvector.hh>

    \n+

    #include <dune/istl/vbvector.hh>

    \n \n \n \n \n \n \n@@ -507,15 +507,15 @@\n
    \n \n

    set size of current block

    \n \n
    \n \n
    The documentation for this class was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/a03080.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/a03080.html", "unified_diff": "@@ -76,15 +76,15 @@\n \n
    Dune::FieldTraits< VariableBlockVector< B, A > > Struct Template Reference
    \n \n
    \n \n-

    #include <dune/istl/vbvector.hh>

    \n+

    #include <dune/istl/vbvector.hh>

    \n

    \n Public Types

    using iterator_category = std::output_iterator_tag
     iterator category
     
    using value_type = size_type
    \n \n \n \n \n \n@@ -119,15 +119,15 @@\n \n

    \n Public Types

    typedef FieldTraits< B >::field_type field_type
     
    typedef FieldTraits< B >::real_type real_type
     
    \n
    \n \n
    \n \n
    The documentation for this struct was generated from the following file:\n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/dir_000005_000000.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/dir_000005_000000.html", "unified_diff": "@@ -69,14 +69,14 @@\n \n
    \n \n
    \n \n
    \n-

    istl → common Relation

    File in dune/istlIncludes file in dune/istl/common
    solverregistry.hhregistry.hh
    \n+

    istl → common Relation

    File in dune/istlIncludes file in dune/istl/common
    solverregistry.hhregistry.hh
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/dir_000005_000004.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/dir_000005_000004.html", "unified_diff": "@@ -69,14 +69,14 @@\n \n
    \n \n
    \n \n
    \n-

    istl → eigenvalue Relation

    File in dune/istlIncludes file in dune/istl/eigenvalue
    solvers.hharpackpp.hh
    \n+

    istl → eigenvalue Relation

    File in dune/istlIncludes file in dune/istl/eigenvalue
    solvers.hharpackpp.hh
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/dir_000005_000006.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/dir_000005_000006.html", "unified_diff": "@@ -69,14 +69,14 @@\n \n
    \n \n
    \n \n
    \n-

    istl → paamg Relation

    File in dune/istlIncludes file in dune/istl/paamg
    matrixredistribute.hhpinfo.hh
    repartition.hhgraph.hh
    \n+

    istl → paamg Relation

    File in dune/istlIncludes file in dune/istl/paamg
    matrixredistribute.hhpinfo.hh
    repartition.hhgraph.hh
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/dir_30ac00acf892fa1550fd06f6d9d3e856.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/dir_30ac00acf892fa1550fd06f6d9d3e856.html", "unified_diff": "@@ -84,17 +84,17 @@\n \"\"\n \"\"\n
    \n \n \n \n-\n+\n \n-\n+\n \n

    \n Files

     counter.hh
     counter.hh
     
     registry.hh
     registry.hh
     
    \n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/dir_4aff653484460245da749266b1996776.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/dir_4aff653484460245da749266b1996776.html", "unified_diff": "@@ -84,17 +84,17 @@\n \"\"\n \"\"\n
    \n \n \n \n-\n+\n \n-\n+\n \n

    \n Files

     arpackpp.hh
     arpackpp.hh
     
     poweriteration.hh
     poweriteration.hh
     
    \n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/dir_5e12c67a8fe12cf8b78c94f3b4cb9926.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/dir_5e12c67a8fe12cf8b78c94f3b4cb9926.html", "unified_diff": "@@ -102,143 +102,143 @@\n  eigenvalue\n  \n  paamg\n  \n \n \n-\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n

    \n 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
     
     dilu.hh
     The diagonal incomplete LU factorization kernels.
     dilu.hh
     The diagonal incomplete LU factorization kernels.
     
     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
     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
     ???
     
    \n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/dir_667edbdb0a8210232217f5e7df6d52d4.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/dir_667edbdb0a8210232217f5e7df6d52d4.html", "unified_diff": "@@ -84,74 +84,74 @@\n \"\"\n \"\"\n
    \n \n \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n

    \n 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.
     
    \n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/dune-istl.tag.gz", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/dune-istl.tag.gz", "unified_diff": null, "details": [{"source1": "dune-istl.tag", "source2": "dune-istl.tag", "unified_diff": null, "details": [{"source1": "dune-istl.tag", "source2": "dune-istl.tag", "unified_diff": "@@ -9,204 +9,204 @@\n modules.txt\n /build/reproducible-path/dune-istl-2.10.0/doc/doxygen/\n a00005.html\n \n \n allocator.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00077.html\n+ a00074.html\n Dune::exists\n Dune::DefaultAllocatorTraits\n Dune::DefaultAllocatorTraits< T, std::void_t< typename T::allocator_type > >\n Dune::AllocatorTraits\n Dune\n \n \n basearray.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00026.html\n- istlexception.hh\n+ a00044.html\n+ istlexception.hh\n Dune\n \n \n bccsmatrix.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00035.html\n+ a00125.html\n Dune\n Dune::ISTL\n \n \n bccsmatrixinitializer.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00203.html\n- dune/istl/bccsmatrix.hh\n+ a00062.html\n+ dune/istl/bccsmatrix.hh\n Dune\n Dune::ISTL\n \n \n bcrsmatrix.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00071.html\n- istlexception.hh\n- bvector.hh\n- matrixutils.hh\n- dune/istl/blocklevel.hh\n+ a00011.html\n+ istlexception.hh\n+ bvector.hh\n+ matrixutils.hh\n+ dune/istl/blocklevel.hh\n Dune::CompressionStatistics\n Dune::ImplicitMatrixBuilder\n Dune::ImplicitMatrixBuilder::row_object\n Dune::BCRSMatrix\n Dune::BCRSMatrix::RealRowIterator\n Dune::BCRSMatrix::CreateIterator\n Dune::FieldTraits< BCRSMatrix< B, A > >\n Dune\n \n \n bdmatrix.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00164.html\n- dune/istl/bcrsmatrix.hh\n- dune/istl/blocklevel.hh\n+ a00143.html\n+ dune/istl/bcrsmatrix.hh\n+ dune/istl/blocklevel.hh\n Dune::BDMatrix\n Dune::FieldTraits< BDMatrix< B, A > >\n Dune\n \n \n blocklevel.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00032.html\n+ a00080.html\n Dune\n \n \n btdmatrix.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00185.html\n- dune/istl/bcrsmatrix.hh\n- dune/istl/blocklevel.hh\n+ a00131.html\n+ dune/istl/bcrsmatrix.hh\n+ dune/istl/blocklevel.hh\n Dune::BTDMatrix\n Dune::FieldTraits< BTDMatrix< B, A > >\n Dune\n \n \n bvector.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00218.html\n- dune/istl/blocklevel.hh\n- basearray.hh\n- istlexception.hh\n+ a00128.html\n+ dune/istl/blocklevel.hh\n+ basearray.hh\n+ istlexception.hh\n Dune::BlockVector\n Dune::FieldTraits< BlockVector< B, A > >\n Dune\n \n \n cholmod.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00065.html\n- dune/istl/bcrsmatrix.hh\n- dune/istl/bvector.hh\n- dune/istl/solver.hh\n- dune/istl/solverfactory.hh\n- dune/istl/foreach.hh\n+ a00104.html\n+ dune/istl/bcrsmatrix.hh\n+ dune/istl/bvector.hh\n+ dune/istl/solver.hh\n+ dune/istl/solverfactory.hh\n+ dune/istl/foreach.hh\n Dune::Cholmod\n Dune::CholmodCreator\n Dune::CholmodCreator::isValidBlock\n Dune::CholmodCreator::isValidBlock< FieldVector< double, k > >\n Dune::CholmodCreator::isValidBlock< FieldVector< float, k > >\n Dune\n \n \n counter.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/common/\n- a00167.html\n+ a00053.html\n Dune\n Dune::CounterImpl\n \n #define\n DUNE_GET_COUNTER\n- a00167.html\n+ a00053.html\n a52c18e20d25c64cfa14ec5faaa4eb3bd\n (Tag)\n \n \n #define\n DUNE_INC_COUNTER\n- a00167.html\n+ a00053.html\n a5d969c720adf3ae3114e5a51e2cf5d96\n (Tag)\n \n \n constexpr std::size_t\n maxcount\n- a00167.html\n+ a00053.html\n a691e9cc830a63581384caef120bcbef8\n \n \n \n \n registry.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/common/\n- a00170.html\n- counter.hh\n+ a00050.html\n+ counter.hh\n Dune\n \n #define\n DUNE_REGISTRY_PUT\n- a00170.html\n+ a00050.html\n a5aba8ecf7926f3c3dade1b898db68cf7\n (Tag, id,...)\n \n \n \n dilu.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00053.html\n- istlexception.hh\n+ a00113.html\n+ istlexception.hh\n Dune\n Dune::DILU\n \n \n arpackpp.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/eigenvalue/\n- a00227.html\n- dune/istl/blocklevel.hh\n- dune/istl/bvector.hh\n- dune/istl/istlexception.hh\n- dune/istl/io.hh\n+ a00224.html\n+ dune/istl/blocklevel.hh\n+ dune/istl/bvector.hh\n+ dune/istl/istlexception.hh\n+ dune/istl/io.hh\n Dune::ArPackPlusPlus_Algorithms\n Dune\n \n \n poweriteration.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/eigenvalue/\n- a00224.html\n- dune/istl/blocklevel.hh\n- dune/istl/operators.hh\n- dune/istl/solvercategory.hh\n- dune/istl/solvertype.hh\n- dune/istl/istlexception.hh\n- dune/istl/io.hh\n- dune/istl/solvers.hh\n+ a00221.html\n+ dune/istl/blocklevel.hh\n+ dune/istl/operators.hh\n+ dune/istl/solvercategory.hh\n+ dune/istl/solvertype.hh\n+ dune/istl/istlexception.hh\n+ dune/istl/io.hh\n+ dune/istl/solvers.hh\n Dune::PowerIteration_Algorithms\n Dune\n \n \n foreach.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00176.html\n- dune/istl/bcrsmatrix.hh\n- dune/istl/scaledidmatrix.hh\n+ a00230.html\n+ dune/istl/bcrsmatrix.hh\n+ dune/istl/scaledidmatrix.hh\n Dune\n Dune::ForEach\n \n \n gsetc.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00017.html\n- multitypeblockvector.hh\n- multitypeblockmatrix.hh\n- istlexception.hh\n+ a00098.html\n+ multitypeblockvector.hh\n+ multitypeblockmatrix.hh\n+ istlexception.hh\n Dune::BL\n Dune::algmeta_btsolve\n Dune::algmeta_btsolve< 0, withdiag, withrelax >\n Dune::algmeta_btsolve< 0, withdiag, norelax >\n Dune::algmeta_btsolve< 0, nodiag, withrelax >\n Dune::algmeta_btsolve< 0, nodiag, norelax >\n Dune::algmeta_bdsolve\n@@ -216,107 +216,107 @@\n Dune::algmeta_itsteps< 0, M >\n Dune::algmeta_itsteps< I, MultiTypeBlockMatrix< T1, MultiTypeMatrixArgs... > >\n Dune\n \n \n ildl.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00161.html\n- ilu.hh\n+ a00056.html\n+ ilu.hh\n Dune\n \n \n ilu.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00188.html\n- istlexception.hh\n+ a00032.html\n+ istlexception.hh\n Dune::ILU::CRS\n Dune\n Dune::ILU\n \n \n ilusubdomainsolver.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00050.html\n- dune/istl/preconditioners.hh\n- matrix.hh\n+ a00092.html\n+ dune/istl/preconditioners.hh\n+ matrix.hh\n Dune::ILUSubdomainSolver\n Dune::ILU0SubdomainSolver\n Dune::ILUNSubdomainSolver\n Dune\n \n \n io.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00020.html\n- matrixutils.hh\n- istlexception.hh\n- dune/istl/bcrsmatrix.hh\n- dune/istl/blocklevel.hh\n+ a00008.html\n+ matrixutils.hh\n+ istlexception.hh\n+ dune/istl/bcrsmatrix.hh\n+ dune/istl/blocklevel.hh\n Dune::DefaultSVGMatrixOptions\n Dune\n \n \n istlexception.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00059.html\n+ a00014.html\n Dune::ISTLError\n Dune::BCRSMatrixError\n Dune::ImplicitModeCompressionBufferExhausted\n Dune::SolverAbort\n Dune::MatrixBlockError\n Dune\n \n \n ldl.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00194.html\n- dune/istl/bccsmatrixinitializer.hh\n- dune/istl/solvers.hh\n- dune/istl/solvertype.hh\n- dune/istl/solverfactory.hh\n+ a00146.html\n+ dune/istl/bccsmatrixinitializer.hh\n+ dune/istl/solvers.hh\n+ dune/istl/solvertype.hh\n+ dune/istl/solverfactory.hh\n Dune::LDL\n Dune::LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > >\n Dune::IsDirectSolver< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > >\n Dune::StoresColumnCompressed< LDL< BCRSMatrix< FieldMatrix< T, n, m >, A > > >\n Dune::LDLCreator\n Dune::LDLCreator::isValidBlock\n Dune::LDLCreator::isValidBlock< FieldVector< double, k > >\n Dune\n \n \n matrix.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00047.html\n- dune/istl/bvector.hh\n- dune/istl/istlexception.hh\n- dune/istl/blocklevel.hh\n+ a00110.html\n+ dune/istl/bvector.hh\n+ dune/istl/istlexception.hh\n+ dune/istl/blocklevel.hh\n Dune::MatrixImp::DenseMatrixBase\n Dune::MatrixImp::DenseMatrixBase::Iterator\n Dune::MatrixImp::DenseMatrixBase::ConstIterator\n Dune::Matrix\n Dune::FieldTraits< Matrix< T, A > >\n Dune\n Dune::MatrixImp\n \n \n matrixindexset.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00149.html\n+ a00089.html\n Dune::MatrixIndexSet\n Dune\n \n \n matrixmarket.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00179.html\n- dune/istl/bcrsmatrix.hh\n- dune/istl/bvector.hh\n- dune/istl/matrixutils.hh\n- dune/istl/owneroverlapcopy.hh\n+ a00137.html\n+ dune/istl/bcrsmatrix.hh\n+ dune/istl/bvector.hh\n+ dune/istl/matrixutils.hh\n+ dune/istl/owneroverlapcopy.hh\n Dune::MatrixMarketImpl::mm_numeric_type\n Dune::MatrixMarketImpl::mm_numeric_type< int >\n Dune::MatrixMarketImpl::mm_numeric_type< double >\n Dune::MatrixMarketImpl::mm_numeric_type< float >\n Dune::MatrixMarketImpl::mm_numeric_type< std::complex< double > >\n Dune::MatrixMarketImpl::mm_numeric_type< std::complex< float > >\n Dune::MatrixMarketImpl::mm_header_printer< BCRSMatrix< T, A > >\n@@ -344,16 +344,16 @@\n Dune::MatrixMarketFormatError\n Dune\n Dune::MatrixMarketImpl\n \n \n matrixmatrix.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00068.html\n- dune/istl/bcrsmatrix.hh\n+ a00035.html\n+ dune/istl/bcrsmatrix.hh\n Dune::MatMultMatResult\n Dune::MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >\n Dune::MatMultMatResult< BCRSMatrix< FieldMatrix< T, n, k >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > >\n Dune::TransposedMatMultMatResult\n Dune::TransposedMatMultMatResult< FieldMatrix< T, k, n >, FieldMatrix< T, k, m > >\n Dune::TransposedMatMultMatResult< BCRSMatrix< FieldMatrix< T, k, n >, A >, BCRSMatrix< FieldMatrix< T, k, m >, A1 > >\n Dune\n@@ -371,18 +371,18 @@\n ga67ae04c7e7c030370f82da49ab2b98d1\n \n \n \n \n matrixredistribute.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00230.html\n- repartition.hh\n- dune/istl/owneroverlapcopy.hh\n- dune/istl/paamg/pinfo.hh\n+ a00140.html\n+ repartition.hh\n+ dune/istl/owneroverlapcopy.hh\n+ dune/istl/paamg/pinfo.hh\n Dune::RedistributeInformation\n Dune::RedistributeInformation< OwnerOverlapCopyCommunication< T, T1 > >\n Dune::CommMatrixRowSize\n Dune::CommMatrixSparsityPattern\n Dune::CommPolicy< CommMatrixSparsityPattern< M, I > >\n Dune::CommMatrixRow\n Dune::CommPolicy< CommMatrixRow< M, I > >\n@@ -391,17 +391,17 @@\n Dune::MatrixSparsityPatternGatherScatter\n Dune::MatrixRowGatherScatter\n Dune\n \n \n matrixutils.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00062.html\n- dune/istl/scaledidmatrix.hh\n- istlexception.hh\n+ a00227.html\n+ dune/istl/scaledidmatrix.hh\n+ istlexception.hh\n Dune::CheckIfDiagonalPresent\n Dune::CheckIfDiagonalPresent< Matrix, 0, l >\n Dune::CheckIfDiagonalPresent< MultiTypeBlockMatrix< T1, Args... >, blocklevel, l >\n Dune::MatrixDimension\n Dune::MatrixDimension< Matrix< B, TA > >\n Dune::MatrixDimension< BCRSMatrix< B, TA > >\n Dune::MatrixDimension< BCRSMatrix< FieldMatrix< B, n, m >, TA > >\n@@ -415,83 +415,83 @@\n Dune::IsMatrix< BCRSMatrix< T, A > >\n Dune::PointerCompare\n Dune\n \n \n multitypeblockmatrix.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00152.html\n- istlexception.hh\n- gsetc.hh\n+ a00017.html\n+ istlexception.hh\n+ gsetc.hh\n Dune::MultiTypeBlockMatrix\n Dune::FieldTraits< MultiTypeBlockMatrix< Rows... > >\n Dune::MultiTypeBlockMatrix_Solver_Col\n Dune::MultiTypeBlockMatrix_Solver_Col< I, crow, ccol, 0 >\n Dune::MultiTypeBlockMatrix_Solver\n Dune::MultiTypeBlockMatrix_Solver< I, crow, 0 >\n std::tuple_element< i, Dune::MultiTypeBlockMatrix< Args... > >\n std::tuple_size< Dune::MultiTypeBlockMatrix< Args... > >\n Dune\n std\n \n \n multitypeblockvector.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00191.html\n- istlexception.hh\n- gsetc.hh\n+ a00020.html\n+ istlexception.hh\n+ gsetc.hh\n Dune::FieldTraits< MultiTypeBlockVector< Args... > >\n Dune::MultiTypeBlockVector\n std::tuple_element< i, Dune::MultiTypeBlockVector< Args... > >\n std::tuple_size< Dune::MultiTypeBlockVector< Args... > >\n Dune\n std\n \n \n novlpschwarz.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00023.html\n- io.hh\n- bvector.hh\n- vbvector.hh\n- bcrsmatrix.hh\n- gsetc.hh\n- ilu.hh\n- operators.hh\n- solvers.hh\n- preconditioners.hh\n- scalarproducts.hh\n- owneroverlapcopy.hh\n+ a00107.html\n+ io.hh\n+ bvector.hh\n+ vbvector.hh\n+ bcrsmatrix.hh\n+ gsetc.hh\n+ ilu.hh\n+ operators.hh\n+ solvers.hh\n+ preconditioners.hh\n+ scalarproducts.hh\n+ owneroverlapcopy.hh\n Dune::NonoverlappingSchwarzOperator\n Dune::NonoverlappingBlockPreconditioner\n Dune\n Dune::Amg\n \n \n operators.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00197.html\n- solvercategory.hh\n+ a00122.html\n+ solvercategory.hh\n Dune::LinearOperator\n Dune::AssembledLinearOperator\n Dune::MatrixAdapter\n Dune\n \n \n overlappingschwarz.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00158.html\n- dune/istl/bccsmatrixinitializer.hh\n- preconditioners.hh\n- superlu.hh\n- umfpack.hh\n- bvector.hh\n- bcrsmatrix.hh\n- ilusubdomainsolver.hh\n- dune/istl/solvertype.hh\n+ a00059.html\n+ dune/istl/bccsmatrixinitializer.hh\n+ preconditioners.hh\n+ superlu.hh\n+ umfpack.hh\n+ bvector.hh\n+ bcrsmatrix.hh\n+ ilusubdomainsolver.hh\n+ dune/istl/solvertype.hh\n Dune::OverlappingSchwarzInitializer\n Dune::AdditiveSchwarzMode\n Dune::MultiplicativeSchwarzMode\n Dune::SymmetricMultiplicativeSchwarzMode\n Dune::DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >\n Dune::OverlappingAssignerHelper\n Dune::OverlappingAssignerHelper< DynamicMatrixSubdomainSolver< BCRSMatrix< K, Al >, X, Y >, false >\n@@ -521,40 +521,40 @@\n Dune::SeqOverlappingSchwarzDomainSize\n Dune::SeqOverlappingSchwarzDomainSize< BCRSMatrix< T, A > >\n Dune\n \n \n owneroverlapcopy.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00215.html\n- solvercategory.hh\n- istlexception.hh\n- dune/istl/matrixmarket.hh\n+ a00023.html\n+ solvercategory.hh\n+ istlexception.hh\n+ dune/istl/matrixmarket.hh\n Dune::OwnerOverlapCopyAttributeSet\n Dune::IndexInfoFromGrid\n Dune::OwnerOverlapCopyCommunication\n Dune::OwnerOverlapCopyCommunication::CopyGatherScatter\n Dune::OwnerOverlapCopyCommunication::AddGatherScatter\n Dune\n \n void\n testRedistributed\n- a00215.html\n+ a00023.html\n abcfd3b2ed3c4dd837b155879a3247503\n (int s)\n \n \n \n aggregates.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00110.html\n- parameters.hh\n- graph.hh\n- properties.hh\n- combinedfunctor.hh\n+ a00209.html\n+ parameters.hh\n+ graph.hh\n+ properties.hh\n+ combinedfunctor.hh\n Dune::Amg::AggregationCriterion\n Dune::Amg::SymmetricMatrixDependency\n Dune::Amg::Dependency\n Dune::Amg::SymmetricDependency\n Dune::Amg::Diagonal\n Dune::Amg::FirstDiagonal\n Dune::Amg::RowSum\n@@ -568,52 +568,52 @@\n Dune::Amg::Aggregator\n Dune\n Dune::Amg\n \n \n amg.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00146.html\n- dune/istl/paamg/smoother.hh\n- dune/istl/paamg/transfer.hh\n- dune/istl/paamg/matrixhierarchy.hh\n- dune/istl/solvers.hh\n- dune/istl/scalarproducts.hh\n- dune/istl/superlu.hh\n- dune/istl/umfpack.hh\n- dune/istl/solvertype.hh\n+ a00191.html\n+ dune/istl/paamg/smoother.hh\n+ dune/istl/paamg/transfer.hh\n+ dune/istl/paamg/matrixhierarchy.hh\n+ dune/istl/solvers.hh\n+ dune/istl/scalarproducts.hh\n+ dune/istl/superlu.hh\n+ dune/istl/umfpack.hh\n+ dune/istl/solvertype.hh\n Dune::Amg::AMG\n Dune::Amg::DirectSolverSelector\n Dune::Amg::DirectSolverSelector::Solver\n Dune::Amg::DirectSolverSelector::Solver< M, superlu >\n Dune::AMGCreator\n Dune::AMGCreator::isValidBlockType\n Dune::AMGCreator::isValidBlockType< FieldMatrix< T, n, m > >\n Dune\n Dune::Amg\n \n \n combinedfunctor.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00098.html\n+ a00197.html\n Dune::Amg::ApplyHelper\n Dune::Amg::ApplyHelper< 0 >\n Dune::Amg::CombinedFunctor\n Dune\n Dune::Amg\n \n \n construction.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00089.html\n- dune/istl/bvector.hh\n- dune/istl/operators.hh\n- dune/istl/owneroverlapcopy.hh\n- dune/istl/solvercategory.hh\n- pinfo.hh\n+ a00167.html\n+ dune/istl/bvector.hh\n+ dune/istl/operators.hh\n+ dune/istl/owneroverlapcopy.hh\n+ dune/istl/solvercategory.hh\n+ pinfo.hh\n Dune::Amg::ConstructionTraits< BlockVector< T, A > >\n Dune::Amg::ParallelOperatorArgs\n Dune::Amg::OwnerOverlapCopyCommunicationArgs\n Dune::Amg::SequentialCommunicationArgs\n Dune::Amg::ConstructionTraits< OverlappingSchwarzOperator< M, X, Y, C > >\n Dune::Amg::ConstructionTraits< NonoverlappingSchwarzOperator< M, X, Y, C > >\n Dune::Amg::MatrixAdapterArgs\n@@ -622,65 +622,65 @@\n Dune::Amg::ConstructionTraits< OwnerOverlapCopyCommunication< T1, T2 > >\n Dune\n Dune::Amg\n \n \n dependency.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00143.html\n- graph.hh\n- properties.hh\n+ a00173.html\n+ graph.hh\n+ properties.hh\n Dune::Amg::EdgeProperties\n Dune::Amg::VertexProperties\n Dune::Amg::PropertyGraphVertexPropertyMap\n Dune::PropertyMapTypeSelector< Amg::VertexVisitedTag, Amg::PropertiesGraph< G, Amg::VertexProperties, EP, VM, EM > >\n Dune\n Dune::Amg\n \n \n fastamg.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00125.html\n- dune/istl/paamg/smoother.hh\n- dune/istl/paamg/transfer.hh\n- dune/istl/paamg/matrixhierarchy.hh\n- dune/istl/solvers.hh\n- dune/istl/scalarproducts.hh\n- dune/istl/superlu.hh\n- dune/istl/umfpack.hh\n- dune/istl/solvertype.hh\n- dune/istl/io.hh\n- dune/istl/preconditioners.hh\n- fastamgsmoother.hh\n+ a00170.html\n+ dune/istl/paamg/smoother.hh\n+ dune/istl/paamg/transfer.hh\n+ dune/istl/paamg/matrixhierarchy.hh\n+ dune/istl/solvers.hh\n+ dune/istl/scalarproducts.hh\n+ dune/istl/superlu.hh\n+ dune/istl/umfpack.hh\n+ dune/istl/solvertype.hh\n+ dune/istl/io.hh\n+ dune/istl/preconditioners.hh\n+ fastamgsmoother.hh\n Dune::Amg::FastAMG\n Dune\n Dune::Amg\n \n #define\n DIRECTSOLVER\n- a00125.html\n+ a00170.html\n a72c0db94af03bbad6ae55a51224a4a4a\n \n \n \n \n fastamgsmoother.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00107.html\n+ a00200.html\n Dune::Amg::GaussSeidelPresmoothDefect\n Dune::Amg::GaussSeidelPostsmoothDefect\n Dune\n Dune::Amg\n \n \n galerkin.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00116.html\n- aggregates.hh\n- pinfo.hh\n+ a00182.html\n+ aggregates.hh\n+ pinfo.hh\n Dune::Amg::OverlapVertex\n Dune::Amg::SparsityBuilder\n Dune::Amg::BaseGalerkinProduct\n Dune::Amg::GalerkinProduct\n Dune::Amg::GalerkinProduct< SequentialInformation >\n Dune::Amg::BaseConnectivityConstructor\n Dune::Amg::BaseConnectivityConstructor::ConnectedBuilder\n@@ -690,32 +690,32 @@\n Dune::Amg::DirichletBoundarySetter< SequentialInformation >\n Dune\n Dune::Amg\n \n \n globalaggregates.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00137.html\n- aggregates.hh\n- pinfo.hh\n+ a00194.html\n+ aggregates.hh\n+ pinfo.hh\n Dune::Amg::GlobalAggregatesMap\n Dune::Amg::GlobalAggregatesMap::Proxy\n Dune::Amg::AggregatesGatherScatter\n Dune::Amg::AggregatesPublisher\n Dune::Amg::AggregatesPublisher< T, O, OwnerOverlapCopyCommunication< T1, T2 > >\n Dune::Amg::AggregatesPublisher< T, O, SequentialInformation >\n Dune::CommPolicy< Amg::GlobalAggregatesMap< T, TI > >\n Dune\n Dune::Amg\n \n \n graph.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00113.html\n- dune/istl/istlexception.hh\n+ a00155.html\n+ dune/istl/istlexception.hh\n Dune::Amg::MatrixGraph\n Dune::Amg::MatrixGraph::EdgeIteratorT\n Dune::Amg::MatrixGraph::VertexIteratorT\n Dune::Amg::SubGraph\n Dune::Amg::SubGraph::EdgeIndexMap\n Dune::Amg::SubGraph::EdgeIterator\n Dune::Amg::SubGraph::VertexIterator\n@@ -728,132 +728,132 @@\n Dune::Amg::GraphEdgePropertiesSelector\n Dune\n Dune::Amg\n \n \n graphcreator.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00128.html\n- graph.hh\n- dependency.hh\n- pinfo.hh\n- dune/istl/operators.hh\n- dune/istl/bcrsmatrix.hh\n+ a00179.html\n+ graph.hh\n+ dependency.hh\n+ pinfo.hh\n+ dune/istl/operators.hh\n+ dune/istl/bcrsmatrix.hh\n Dune::Amg::PropertiesGraphCreator\n Dune::Amg::PropertiesGraphCreator< M, SequentialInformation >\n Dune\n Dune::Amg\n \n \n hierarchy.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00119.html\n- dune/istl/paamg/construction.hh\n+ a00161.html\n+ dune/istl/paamg/construction.hh\n Dune::Amg::Hierarchy\n Dune::Amg::Hierarchy::LevelIterator\n Dune\n Dune::Amg\n \n \n indicescoarsener.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00092.html\n- renumberer.hh\n- dune/istl/owneroverlapcopy.hh\n- pinfo.hh\n+ a00215.html\n+ renumberer.hh\n+ dune/istl/owneroverlapcopy.hh\n+ pinfo.hh\n Dune::Amg::IndicesCoarsener\n Dune::Amg::ParallelIndicesCoarsener\n Dune::Amg::IndicesCoarsener< OwnerOverlapCopyCommunication< G, L >, E >\n Dune::Amg::IndicesCoarsener< SequentialInformation, E >\n Dune\n Dune::Amg\n \n \n kamg.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00140.html\n- dune/istl/preconditioners.hh\n- amg.hh\n+ a00218.html\n+ dune/istl/preconditioners.hh\n+ amg.hh\n Dune::Amg::KAmgTwoGrid\n Dune::Amg::KAMG\n Dune\n Dune::Amg\n \n \n matrixhierarchy.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00101.html\n- aggregates.hh\n- graph.hh\n- galerkin.hh\n- renumberer.hh\n- graphcreator.hh\n- hierarchy.hh\n- dune/istl/bvector.hh\n- dune/istl/matrixutils.hh\n- dune/istl/matrixredistribute.hh\n- dune/istl/paamg/dependency.hh\n- dune/istl/paamg/indicescoarsener.hh\n- dune/istl/paamg/globalaggregates.hh\n- dune/istl/paamg/construction.hh\n- dune/istl/paamg/smoother.hh\n- dune/istl/paamg/transfer.hh\n+ a00158.html\n+ aggregates.hh\n+ graph.hh\n+ galerkin.hh\n+ renumberer.hh\n+ graphcreator.hh\n+ hierarchy.hh\n+ dune/istl/bvector.hh\n+ dune/istl/matrixutils.hh\n+ dune/istl/matrixredistribute.hh\n+ dune/istl/paamg/dependency.hh\n+ dune/istl/paamg/indicescoarsener.hh\n+ dune/istl/paamg/globalaggregates.hh\n+ dune/istl/paamg/construction.hh\n+ dune/istl/paamg/smoother.hh\n+ dune/istl/paamg/transfer.hh\n Dune::Amg::MatrixHierarchy\n Dune::Amg::MatrixHierarchy::MatrixStats< Matrix, true >::calc\n Dune::Amg::CoarsenCriterion\n Dune\n Dune::Amg\n \n \n parameters.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00083.html\n+ a00188.html\n Dune::Amg::DependencyParameters\n Dune::Amg::AggregationParameters\n Dune::Amg::CoarseningParameters\n Dune::Amg::Parameters\n Dune\n Dune::Amg\n \n \n pinfo.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00122.html\n- dune/istl/solvercategory.hh\n+ a00212.html\n+ dune/istl/solvercategory.hh\n Dune::Amg::SequentialInformation\n Dune\n Dune::Amg\n \n \n properties.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00134.html\n+ a00185.html\n Dune::Amg::VertexVisitedTag\n Dune::Amg::RandomAccessBundledPropertyMap\n Dune\n Dune::Amg\n \n \n renumberer.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00086.html\n- aggregates.hh\n+ a00176.html\n+ aggregates.hh\n Dune::Amg::AggregateRenumberer\n Dune\n Dune::Amg\n \n \n smoother.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00104.html\n- dune/istl/paamg/construction.hh\n- dune/istl/paamg/aggregates.hh\n- dune/istl/preconditioners.hh\n- dune/istl/schwarz.hh\n- dune/istl/novlpschwarz.hh\n+ a00206.html\n+ dune/istl/paamg/construction.hh\n+ dune/istl/paamg/aggregates.hh\n+ dune/istl/preconditioners.hh\n+ dune/istl/schwarz.hh\n+ dune/istl/novlpschwarz.hh\n Dune::Amg::DefaultSmootherArgs\n Dune::Amg::SmootherTraits\n Dune::Amg::SmootherTraits< Richardson< X, Y > >\n Dune::Amg::SmootherTraits< BlockPreconditioner< X, Y, C, T > >\n Dune::Amg::SmootherTraits< NonoverlappingBlockPreconditioner< C, T > >\n Dune::Amg::DefaultConstructionArgs\n Dune::Amg::ConstructionArgs\n@@ -879,214 +879,214 @@\n Dune::Amg::ConstructionTraits< SeqOverlappingSchwarz< M, X, TM, TS, TA > >\n Dune\n Dune::Amg\n \n \n transfer.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00095.html\n- dune/istl/bvector.hh\n- dune/istl/matrixredistribute.hh\n- dune/istl/paamg/pinfo.hh\n- dune/istl/owneroverlapcopy.hh\n- dune/istl/paamg/aggregates.hh\n+ a00164.html\n+ dune/istl/bvector.hh\n+ dune/istl/matrixredistribute.hh\n+ dune/istl/paamg/pinfo.hh\n+ dune/istl/owneroverlapcopy.hh\n+ dune/istl/paamg/aggregates.hh\n Dune::Amg::Transfer\n Dune::Amg::Transfer< V, V1, SequentialInformation >\n Dune::Amg::Transfer< V, V1, OwnerOverlapCopyCommunication< T1, T2 > >\n Dune\n Dune::Amg\n \n \n twolevelmethod.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/paamg/\n- a00131.html\n- dune/istl/operators.hh\n- amg.hh\n- galerkin.hh\n- dune/istl/solver.hh\n+ a00203.html\n+ dune/istl/operators.hh\n+ amg.hh\n+ galerkin.hh\n+ dune/istl/solver.hh\n Dune::Amg::LevelTransferPolicy\n Dune::Amg::AggregationLevelTransferPolicy\n Dune::Amg::OneStepAMGCoarseSolverPolicy\n Dune::Amg::TwoLevelMethod\n Dune\n Dune::Amg\n \n \n preconditioner.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00080.html\n- solvercategory.hh\n+ a00095.html\n+ solvercategory.hh\n Dune::Preconditioner\n Dune\n \n \n preconditioners.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00029.html\n- dune/istl/solverregistry.hh\n- preconditioner.hh\n- solver.hh\n- solvercategory.hh\n- istlexception.hh\n- matrixutils.hh\n- gsetc.hh\n- dilu.hh\n- ildl.hh\n- ilu.hh\n+ a00071.html\n+ dune/istl/solverregistry.hh\n+ preconditioner.hh\n+ solver.hh\n+ solvercategory.hh\n+ istlexception.hh\n+ matrixutils.hh\n+ gsetc.hh\n+ dilu.hh\n+ ildl.hh\n+ ilu.hh\n Dune::InverseOperator2Preconditioner\n Dune::SeqSSOR\n Dune::SeqSOR\n Dune::SeqJac\n Dune::SeqDILU\n Dune::SeqILU\n Dune::Richardson\n Dune::SeqILDL\n Dune\n \n \n repartition.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00212.html\n- dune/istl/owneroverlapcopy.hh\n- dune/istl/paamg/graph.hh\n+ a00029.html\n+ dune/istl/owneroverlapcopy.hh\n+ dune/istl/paamg/graph.hh\n Dune::RedistributeInterface\n Dune\n Dune::Metis\n \n int\n globalOwnerVertices\n- a00212.html\n+ a00029.html\n ae1de746d0ff4ac76e9ddc08c991d0e41\n \n \n \n \n scalarproducts.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00041.html\n- bvector.hh\n- solvercategory.hh\n+ a00065.html\n+ bvector.hh\n+ solvercategory.hh\n Dune::ScalarProduct\n Dune::ParallelScalarProduct\n Dune::SeqScalarProduct\n Dune::NonoverlappingSchwarzScalarProduct\n Dune::OverlappingSchwarzScalarProduct\n Dune\n \n \n scaledidmatrix.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00209.html\n+ a00038.html\n Dune::ScaledIdentityMatrix\n Dune::DenseMatrixAssigner< DenseMatrix, ScaledIdentityMatrix< field, N > >\n Dune::FieldTraits< ScaledIdentityMatrix< K, n > >\n Dune\n \n \n schwarz.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00011.html\n- io.hh\n- bvector.hh\n- vbvector.hh\n- bcrsmatrix.hh\n- gsetc.hh\n- ilu.hh\n- operators.hh\n- solvers.hh\n- preconditioners.hh\n- scalarproducts.hh\n- owneroverlapcopy.hh\n+ a00041.html\n+ io.hh\n+ bvector.hh\n+ vbvector.hh\n+ bcrsmatrix.hh\n+ gsetc.hh\n+ ilu.hh\n+ operators.hh\n+ solvers.hh\n+ preconditioners.hh\n+ scalarproducts.hh\n+ owneroverlapcopy.hh\n Dune::OverlappingSchwarzOperator\n Dune::ParSSOR\n Dune::BlockPreconditioner\n Dune\n Dune::Amg\n \n \n solver.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00173.html\n- solvertype.hh\n- preconditioner.hh\n- operators.hh\n- scalarproducts.hh\n+ a00134.html\n+ solvertype.hh\n+ preconditioner.hh\n+ operators.hh\n+ scalarproducts.hh\n Dune::InverseOperatorResult\n Dune::InverseOperator\n Dune::IterativeSolver\n Dune::IterativeSolver::Iteration\n Dune::SolverHelper\n Dune::SolverHelper::Implementation\n Dune::SolverHelper::Implementation< true, Dummy >\n Dune\n \n \n solvercategory.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00056.html\n+ a00083.html\n Dune::SolverCategory\n Dune::InvalidSolverCategory\n Dune\n \n \n solverfactory.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00182.html\n- solverregistry.hh\n- dune/istl/solver.hh\n- dune/istl/schwarz.hh\n- dune/istl/novlpschwarz.hh\n+ a00086.html\n+ solverregistry.hh\n+ dune/istl/solver.hh\n+ dune/istl/schwarz.hh\n+ dune/istl/novlpschwarz.hh\n Dune::SolverFactory\n Dune\n \n \n solverregistry.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00038.html\n- dune/istl/common/registry.hh\n- dune/istl/preconditioner.hh\n- dune/istl/solver.hh\n+ a00119.html\n+ dune/istl/common/registry.hh\n+ dune/istl/preconditioner.hh\n+ dune/istl/solver.hh\n Dune::UnsupportedType\n Dune::InvalidSolverFactoryConfiguration\n Dune\n \n #define\n DUNE_REGISTER_DIRECT_SOLVER\n- a00038.html\n+ a00119.html\n a3ae3b642fa70a9ad21350f7f90488169\n (name,...)\n \n \n #define\n DUNE_REGISTER_PRECONDITIONER\n- a00038.html\n+ a00119.html\n aabca0a60c41408685e4ef6fa3903dcf0\n (name,...)\n \n \n #define\n DUNE_REGISTER_ITERATIVE_SOLVER\n- a00038.html\n+ a00119.html\n a2e50053eee47875dee3ab97cd6ab4278\n (name,...)\n \n \n \n solvers.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00074.html\n- dune/istl/allocator.hh\n- dune/istl/bcrsmatrix.hh\n- dune/istl/eigenvalue/arpackpp.hh\n- dune/istl/istlexception.hh\n- dune/istl/operators.hh\n- dune/istl/preconditioner.hh\n- dune/istl/scalarproducts.hh\n- dune/istl/solver.hh\n- dune/istl/solverregistry.hh\n+ a00068.html\n+ dune/istl/allocator.hh\n+ dune/istl/bcrsmatrix.hh\n+ dune/istl/eigenvalue/arpackpp.hh\n+ dune/istl/istlexception.hh\n+ dune/istl/operators.hh\n+ dune/istl/preconditioner.hh\n+ dune/istl/scalarproducts.hh\n+ dune/istl/solver.hh\n+ dune/istl/solverregistry.hh\n Dune::LoopSolver\n Dune::GradientSolver\n Dune::CGSolver\n Dune::BiCGSTABSolver\n Dune::MINRESSolver\n Dune::RestartedGMResSolver\n Dune::RestartedFlexibleGMResSolver\n@@ -1094,48 +1094,48 @@\n Dune::RestartedFCGSolver\n Dune::CompleteFCGSolver\n Dune\n \n \n solvertype.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00221.html\n+ a00116.html\n Dune::IsDirectSolver\n Dune::StoresColumnCompressed\n Dune\n \n \n spqr.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00200.html\n- dune/istl/bccsmatrixinitializer.hh\n- dune/istl/solvers.hh\n- dune/istl/solvertype.hh\n- dune/istl/solverfactory.hh\n+ a00077.html\n+ dune/istl/bccsmatrixinitializer.hh\n+ dune/istl/solvers.hh\n+ dune/istl/solvertype.hh\n+ dune/istl/solverfactory.hh\n Dune::SPQR\n Dune::SPQR< BCRSMatrix< FieldMatrix< T, n, m >, A > >\n Dune::IsDirectSolver< SPQR< BCRSMatrix< T, A > > >\n Dune::StoresColumnCompressed< SPQR< BCRSMatrix< T, A > > >\n Dune::SPQRCreator\n Dune::SPQRCreator::isValidBlock\n Dune::SPQRCreator::isValidBlock< FieldVector< double, 1 > >\n Dune\n \n \n superlu.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00008.html\n- superlufunctions.hh\n- solvers.hh\n- supermatrix.hh\n- bcrsmatrix.hh\n- bvector.hh\n- istlexception.hh\n- dune/istl/solvertype.hh\n- dune/istl/solverfactory.hh\n+ a00047.html\n+ superlufunctions.hh\n+ solvers.hh\n+ supermatrix.hh\n+ bcrsmatrix.hh\n+ bvector.hh\n+ istlexception.hh\n+ dune/istl/solvertype.hh\n+ dune/istl/solverfactory.hh\n Dune::SuperLUSolveChooser\n Dune::SuperLUDenseMatChooser\n Dune::SuperLUQueryChooser\n Dune::QuerySpaceChooser\n Dune::SuperLU\n Dune::IsDirectSolver< SuperLU< BCRSMatrix< T, A > > >\n Dune::StoresColumnCompressed< SuperLU< BCRSMatrix< T, A > > >\n@@ -1146,31 +1146,31 @@\n Dune::SuperLUCreator::isValidBlock< double >\n Dune::SuperLUCreator::isValidBlock< std::complex< double > >\n Dune\n \n \n superlufunctions.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00155.html\n+ a00149.html\n \n #define\n int_t\n- a00155.html\n+ a00149.html\n adae0e0955f67a0812302aab3d89a7cb3\n \n \n \n \n supermatrix.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00014.html\n- bcrsmatrix.hh\n- bvector.hh\n- dune/istl/bccsmatrixinitializer.hh\n- superlufunctions.hh\n+ a00152.html\n+ bcrsmatrix.hh\n+ bvector.hh\n+ dune/istl/bccsmatrixinitializer.hh\n+ superlufunctions.hh\n Dune::SuperMatrixCreateSparseChooser\n Dune::SuperMatrixPrinter\n Dune::BaseGetSuperLUType\n Dune::GetSuperLUType\n Dune::GetSuperLUType< double >\n Dune::GetSuperLUType< float >\n Dune::GetSuperLUType< std::complex< double > >\n@@ -1180,40 +1180,40 @@\n Dune::SuperLUMatrix< BCRSMatrix< B, TA > >\n Dune::SuperMatrixInitializer< BCRSMatrix< B, A > >\n Dune\n \n \n umfpack.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00044.html\n- dune/istl/bccsmatrixinitializer.hh\n- dune/istl/bcrsmatrix.hh\n- dune/istl/foreach.hh\n- dune/istl/multitypeblockmatrix.hh\n- dune/istl/multitypeblockvector.hh\n- dune/istl/solvers.hh\n- dune/istl/solvertype.hh\n- dune/istl/solverfactory.hh\n+ a00026.html\n+ dune/istl/bccsmatrixinitializer.hh\n+ dune/istl/bcrsmatrix.hh\n+ dune/istl/foreach.hh\n+ dune/istl/multitypeblockmatrix.hh\n+ dune/istl/multitypeblockvector.hh\n+ dune/istl/solvers.hh\n+ dune/istl/solvertype.hh\n+ dune/istl/solverfactory.hh\n Dune::UMFPackMethodChooser\n Dune::UMFPackMethodChooser< double >\n Dune::UMFPackMethodChooser< std::complex< double > >\n Dune::UMFPack\n Dune::IsDirectSolver< UMFPack< BCRSMatrix< FieldMatrix< T, n, m >, A > > >\n Dune::StoresColumnCompressed< UMFPack< BCRSMatrix< T, A > > >\n Dune::UMFPackCreator\n Dune::UMFPackCreator::isValidBlock\n Dune\n \n \n vbvector.hh\n /build/reproducible-path/dune-istl-2.10.0/dune/istl/\n- a00206.html\n- istlexception.hh\n- bvector.hh\n- dune/istl/blocklevel.hh\n+ a00101.html\n+ istlexception.hh\n+ bvector.hh\n+ dune/istl/blocklevel.hh\n Dune::VariableBlockVector\n Dune::VariableBlockVector::CreateIterator\n Dune::FieldTraits< VariableBlockVector< B, A > >\n Dune\n \n \n Dune::AdderSelector\n"}]}]}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/files.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/files.html", "unified_diff": "@@ -75,91 +75,91 @@\n
    Here is a list of all files with brief descriptions:
    \n
    [detail level 1234]
    \n \n \n \n \n \n-\n-\n+\n+\n \n-\n-\n+\n+\n \n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n-\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n
      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
     dilu.hhThe diagonal incomplete LU factorization kernels
     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???
     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
     dilu.hhThe diagonal incomplete LU factorization kernels
     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???
    \n
    \n \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/globals.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/globals.html", "unified_diff": "@@ -67,26 +67,26 @@\n \n \n \n \n
    \n
    Here is a list of all file members with links to the files they belong to:
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/globals_defs.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/globals_defs.html", "unified_diff": "@@ -66,22 +66,22 @@\n \n \n \n \n \n
    \n
    Here is a list of all macros with links to the files they belong to:
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/globals_func.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/globals_func.html", "unified_diff": "@@ -66,15 +66,15 @@\n \n \n \n \n \n
    \n
    Here is a list of all functions with links to the files they belong to:
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}, {"source1": "./usr/share/doc/libdune-istl-doc/doxygen/globals_vars.html", "source2": "./usr/share/doc/libdune-istl-doc/doxygen/globals_vars.html", "unified_diff": "@@ -67,17 +67,17 @@\n \n \n \n \n
    \n
    Here is a list of all variables with links to the files they belong to:
    \n
    \n \n
    \n Generated by \"doxygen\"/ 1.9.8\n
    \n \n"}]}]}]}]}